
function SmartDropDown( ddName, height, leftOffset, topOffset, gridName, dataBindWebSvc, webSvcDataValueFld, webSvcDataTextFld, webSvcSearchLength )
{

	var objtxt;
	var objdd;
	var objName;
	var isTyping;
	var isClicking; 
	var ddSelectedIndex;
	var ddHeight; 
	var xpos;
	var xoffset;
	var ypos;
	var yoffset;
	var objGrid; 
	var objGridName;
	var httpRequest;
	var webSvc;
	var webSvcValueField;
	var webSvcTextField;
	var webSvcSrchLength;
	var doOpen;
	var webSvcState;

	//*** attach object properties to internal variables 
	this.objtxt = objtxt;
	this.objdd = objdd;
	this.objName = objName;
	this.isTyping = isTyping;
	this.isClicking = isClicking;
	this.ddSelectedIndex = ddSelectedIndex;
	this.ddHeight = ddHeight;
	this.xoffset = xoffset;
	this.yoffset = yoffset;
	this.objGridName = objGridName;
	this.httpRequest = httpRequest;
	this.webSvc = webSvc;
	this.webSvcValueField = webSvcValueField;
	this.webSvcTextField = webSvcTextField;
	this.webSvcSrchLength = webSvcSrchLength;
	this.doOpen = doOpen;
	this.webSvcState;
	
	//*** initialize Object Properties to values passed into the constructor 
	this.objName = ddName;
	this.ddHeight = height;
	if( leftOffset == '' )
		this.xoffset = 0;
	else	
		this.xoffset = eval(leftOffset);
	if( topOffset == '' )
		this.yoffset = 0;
	else		
		this.yoffset = eval(topOffset);			
	this.objGridName = gridName;	
	if( this.objGridName == '' )
		{
			this.objtxt = document.forms[0].item( this.objName + '_txt');
			this.objdd = document.forms[0].item( this.objName + '_sel'); 
			this.objGrid = null;
		}	
	this.webSvc = dataBindWebSvc;
	this.webSvcValueField = webSvcDataValueFld;
	this.webSvcTextField = webSvcDataTextFld;	
	if( webSvcSearchLength == null )
		this.webSvcSrchLength = 2;
	else
		this.webSvcSrchLength = webSvcSearchLength;
	
	//*** setting prototype for class 
	if (typeof(_SmartDropDown_prototype_called) == 'undefined')
		{
			SmartDropDown.prototype.txt = txt;
			SmartDropDown.prototype.dd = dd;
			SmartDropDown.prototype.txtOnFocus = txtOnFocus;
			SmartDropDown.prototype.txtOnBlur = txtOnBlur;
			SmartDropDown.prototype.ddOnClick = ddOnClick;
			SmartDropDown.prototype.ddOnMouseOver = ddOnMouseOver;
			SmartDropDown.prototype.ddOnMouseOut = ddOnMouseOut;
			SmartDropDown.prototype.imgOnClick = imgOnClick;
			SmartDropDown.prototype.find = find;
			SmartDropDown.prototype.keyDown = keyDown;
			SmartDropDown.prototype.Databind = Databind;
			SmartDropDown.prototype.Open = Open;
			SmartDropDown.prototype.setValue = setValue;
			SmartDropDown.prototype.setText = setText;
			SmartDropDown.prototype.setTextFromWebSvc = setTextFromWebSvc;
			SmartDropDown.prototype.setObjects = setObjects;
			SmartDropDown.prototype.doWebSvcDataBind = doWebSvcDataBind;
			SmartDropDown.prototype.WebSvcDataBind_OnReadyStateChange = WebSvcDataBind_OnReadyStateChange;
		}
		
		
	//***** Class Properties  and Methods *************************************************	
	function txt()
		{
			return this.objtxt;
		}	
		
	function dd()
		{
			return this.objdd;
		}	
		
	function setValue( val )
		{
			this.objdd.value = val;
			if( this.objdd.selectedIndex > 0 )
				this.objtxt.value = this.objdd.options[ this.objdd.selectedIndex ].text; 
			else
				this.objtxt.value = '';	
		}	
		
	function setText( val )
	{
		var i;
		var k;
		k = 0    
		this.objtxt.value = val;
		for (i=0;i<this.objdd.options.length;i++)
		{
			if( ( this.objdd.options[i].text.toLowerCase().indexOf( this.objtxt.value.toLowerCase() ) != -1 ) && ( this.objdd.options[i].text.length == this.objtxt.value.length ) )   
				{
					k = i;   
					break;
				}	
		}		
		this.objdd.selectedIndex = k;	
	}	
	
	function setTextFromWebSvc( val )
	{
		this.objtxt.value = val;
		this.doOpen = false;
		this.doWebSvcDataBind( this.httpRequest, this.webSvc, val, this.webSvcValueField, this.webSvcTextField, this.objdd, this.objtxt, this.ddHeight, this.xoffset, this.yoffset, this.doOpen, this.webSvcState );		
	}

    function txtOnFocus()
        {
			if(  this.objGridName != '' )
				{
					this.objtxt = getObject( this.objGridName, this.objName + '_txt' );
					this.objdd = getObject( this.objGridName, this.objName + '_sel' )
					
				}
			if( this.objdd.selectedIndex == -1 )
				{
					this.objdd.selectedIndex = 0
				}	
            this.isTyping = 1;
            this.isClicking = 0;    
            this.objtxt.select();
            try{
					eval( this.objName + '_onFocus()');
			   	}
            catch(e){}
        }
            
    function txtOnBlur()
        {
			if(  this.objGridName != '' )
				{
					this.objtxt = getObject( this.objGridName, this.objName + '_txt' );
					this.objdd = getObject( this.objGridName, this.objName + '_sel' )
					
				}        
            if ( this.isTyping == 1 )
                {
					if( ( this.webSvc != '' ) && ( this.httpRequest != null ) )
					{
							if( this.httpRequest.readyState != 4 )
							{
								this.objtxt.focus();
								this.objtxt.value = this.objtxt.value;
							}	
					}
					if ( ( this.objdd.selectedIndex != -1 ) && ( this.objdd.selectedIndex != 0 ) ) 
						{
							this.objtxt.value = this.objdd.options[ this.objdd.selectedIndex ].text;
							this.ddSelectedIndex = this.objdd.selectedIndex;
						}
					CloseDD( this.objdd );
				}     
			if( this.isClicking == 0 )
				{	
					try{
						  eval( this.objName + '_onBlur()' );
						}
					catch(e){ }				
				}			
         }            
            
    function ddOnClick()
        {
			if ( this.objdd.selectedIndex != -1 )
				{	
					this.objtxt.value = this.objdd.options[ this.objdd.selectedIndex ].text;
					this.ddSelectedIndex = this.objdd.selectedIndex;
				}
            CloseDD( this.objdd );                
            this.objtxt.focus();
            this.objtxt.select();   
            try{
					eval( this.objName + '_onChange()');
				}	
            catch(e){}
        }            
        
       function ddOnMouseOver()
            {
               this.isTyping = 0;
               this.isClicking = 1;
            }    
            
      function ddOnMouseOut()
            {
               this.isTyping = 1;
               this.isClicking = 0;
            }                
            
        function imgOnClick()
            {
				if(  this.objGridName != '' )
					{
						this.objtxt = getObject( this.objGridName, this.objName + '_txt' );
						this.objdd = getObject( this.objGridName, this.objName + '_sel' )
						
					}            
				if( ( !this.objdd.disabled ) && ( !this.objtxt.disabled ) )
				{
					if( this.objdd.style.visibility == 'hidden' ) 
						{
							OpenDD( this.objdd, this.ddHeight, this.objtxt, this.xoffset, this.yoffset );
							this.isTyping = 1;
							this.isClicking = 0;						
							this.objtxt.focus();
							this.objtxt.select();
						}	
					else  
						{
							CloseDD( this.objdd );  
							this.isTyping = 1;
							this.isClicking = 0;						
							this.objtxt.focus();
							this.objtxt.select();
						}	
					return false;      
				}	               
            }    
            
            
        function getkey(e)
            {
                if (window.event)
                    return window.event.keyCode;
                else if (e)
                    return e.which;
                else
                    return null;
            }            
            
           
    	function find()
		{
		    var key;  
		    var done = false;
		    key = getkey( event);  
			if(  this.objGridName != '' )
				{
					this.objtxt = getObject( this.objGridName, this.objName + '_txt' );
					this.objdd = getObject( this.objGridName, this.objName + '_sel' )
					
				}		    
		    if ( !( key==null || key==0 || key==9 || key==16 || key==13 || key==27 || key==38 || key==40 || key==17 || key==18 ) )
		          {
                		          
		            this.isTyping = 1; 
		            this.isClicking = 0;  
			        var i;
			        var k;
			        var strOptionVal = new String();
			        var strSearchVal = new String();
			        var optList;
			        strSearchVal = this.objtxt.value;		            
                    if( ( this.objdd.style.visibility == 'hidden' ) && ( ( this.webSvc == '' ) || ( strSearchVal.length > this.webSvcSrchLength ) ) )
						OpenDD( this.objdd, this.ddHeight, this.objtxt, this.xoffset, this.yoffset );
			         optList = this.objdd 
			         k = 0    
			         i=0;
			         if( optList.length == 0 )
						done = true;
			         while( !done )
						{
							strOptionVal = optList[i].text.toLowerCase().substring(0,strSearchVal.length);
							if ( (strOptionVal.indexOf( strSearchVal.toLowerCase() )) != -1 )   
								{
									k = i;   
									done = true;
								}	
							else if( i >= optList.length - 1 )
								done = true;
							else
								i++;		
						}
					 this.objdd.selectedIndex = k;
					 try{
							eval( this.objName + '_onChange()');
						}	
					 catch(e){}					 
				}          
			try{
					eval( this.objName + '_onKeyUp( key )');
				}
			catch(e){}				
		}					 
		
	function Open()
	{
		OpenDD( this.objdd, this.ddHeight, this.objtxt, this.xoffset, this.yoffset );	
	}	
		
	function keyDown()
	{
		var returnVal = true;  // for canceling event
		var key = getkey( event);  
		if(  this.objGridName != '' )
			{
				this.objtxt = getObject( this.objGridName, this.objName + '_txt' );
				this.objdd = getObject( this.objGridName, this.objName + '_sel' )
				
			}		
		if( ( this.webSvc != '' ) && ( !( key==null || key==0 || key==8 || key==9 || key==16 || key==13 || key==27 || key==38 || key==40 || key==17 || key==18 ) ) )
		{	
			 key = (key >= 96 && key <= 105 ? key - 48 : key);
			 var strSearchVal = this.objtxt.value + String.fromCharCode(key); 
	         if( ( strSearchVal.length == this.webSvcSrchLength ) && ( this.webSvc != '' ) )
	         {
				this.doOpen = true;
				this.webSvcState = 0;
				this.doWebSvcDataBind( this.httpRequest, this.webSvc, strSearchVal, this.webSvcValueField, this.webSvcTextField, this.objdd, this.objtxt, this.ddHeight, this.xoffset, this.yoffset, this.doOpen, this.webSvcState );			
			 }		
		}			
		if( key == 9 )
		{
			this.isTyping = 1;
			this.isClicking = 0;
		}	
		else if( ( key == 17 ) || ( key == 18 ) || ( key == null ) )   // Cancel keydown when Control Key or alt key
		{
			returnVal = false;
		}
		else if( key == 38 )
		{
			if( this.objdd.selectedIndex > 0 )
			{
				this.objdd.selectedIndex = this.objdd.selectedIndex - 1;
				if( this.objdd.selectedIndex > 0 )
					this.objtxt.value = this.objdd.options[ this.objdd.selectedIndex ].text;
				try{
						eval( this.objName + '_onChange()');
					}	
				catch(e){}				
			}	
		}
		else if( key == 40 )
		{
			if( this.objdd.selectedIndex < this.objdd.options.length - 1 )
			{
				this.objdd.selectedIndex = this.objdd.selectedIndex + 1;
				if( this.objdd.selectedIndex > 0 )
					this.objtxt.value = this.objdd.options[ this.objdd.selectedIndex ].text;
				try{
						eval( this.objName + '_onChange()');
					}	
				catch(e){}				
			}	
		}
		try{
				eval( this.objName + '_onKeyDown( key )');
			}
		catch(e){}		
		return returnVal;
	}		
	
	function OpenDD( objdd, height, objtxt, xoffset, yoffset )
	{
		var ddHeight = height + 'px';
		xpos =  0 + xoffset;
		ypos = 18 + yoffset;
		getXY( objtxt );
		objdd.style.height= ddHeight;
		objdd.style.posLeft = xpos;
		objdd.style.posTop = ypos;
		objdd.style.visibility = 'visible';
	}		            		

	function CloseDD( objdd )
	{
		objdd.style.visibility = 'hidden';
		objdd.style.height='0px';
		objdd.style.posLeft = 0;
		objdd.style.posTop = 0;
	}
			
	function getXY(el ) 
	{
		pTagName = "body"
		if (el == null) 
			return null;
		else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) 
			return el;
		else
			{
				if (el.parentNode.smddpos == "1")
				{
					return el;
				}
				if( ( el.tagName.toLowerCase() != 'form' ) && ( el.tagName.toLowerCase() != 'tr' ) && ( el.tagName.toLowerCase() != 'tbody' ) )
					{
						xpos = xpos + el.offsetLeft;
						ypos = ypos + el.offsetTop;
					}	
				getXY(el.parentNode );
			}	
	}		
	 
	function Databind( x, val, text )
		{
			var i;
			var newOption;
			if( this.objdd.selectedIndex > 0 )
			{
				this.objdd.value = "";
			}	
			this.objdd.length = 0;
			newOption = new Option( "", "", false, false );
			this.objdd.options[this.objdd.options.length] = newOption;				
			for(i=0;i<x.length;i++)
				{
					newOption = new Option( x[i].getAttribute( text ), x[i].getAttribute( val ), false, false );
					this.objdd.options[this.objdd.options.length] = newOption;			
				}		
		}
		
		
	function doWebSvcDataBind( httpRequest, webSvc, srchText, webSvcValueField, webSvcTextField, objdd, objtxt, ddHeight, xOffset, yOffset, doOpen, webSvcState )
	{
			var strWebSvc 
			if( webSvc.indexOf("?") != -1 )
				strWebSvc = webSvc + '&srch=' + srchText
			else
				strWebSvc = webSvc + '?srch=' + srchText	
			this.httpRequest = new ActiveXObject("Msxml2.XMLHTTP");	
			// attach properties to the WebSvcDataBind_OnReadyStateChange function
			this.WebSvcDataBind_OnReadyStateChange.httpRequest = this.httpRequest;
			this.WebSvcDataBind_OnReadyStateChange.webSvcState = this.webSvcState;
			this.WebSvcDataBind_OnReadyStateChange.webSvcValueField = this.webSvcValueField;
			this.WebSvcDataBind_OnReadyStateChange.webSvcTextField = this.webSvcTextField;
			this.WebSvcDataBind_OnReadyStateChange.objdd = this.objdd;
			this.WebSvcDataBind_OnReadyStateChange.objtxt = this.objtxt;
			this.WebSvcDataBind_OnReadyStateChange.ddHeight = this.ddHeight;
			this.WebSvcDataBind_OnReadyStateChange.xOffset = this.xoffset;
			this.WebSvcDataBind_OnReadyStateChange.yOffset = this.yoffset;
			this.WebSvcDataBind_OnReadyStateChange.doOpen = this.doOpen;
			this.WebSvcDataBind_OnReadyStateChange.Databind = this.Databind;
			// Set the onreadystatechange and call web service 
			this.httpRequest.onreadystatechange = this.WebSvcDataBind_OnReadyStateChange;
			this.httpRequest.open("GET", strWebSvc , true );
			this.httpRequest.send();
	}		
	
	function WebSvcDataBind_OnReadyStateChange()
	{	
		
		WebSvcDataBind_OnReadyStateChange.webSvcState = WebSvcDataBind_OnReadyStateChange.httpRequest.readyState;
		if( WebSvcDataBind_OnReadyStateChange.httpRequest.readyState == 4 )
		{
			WebSvcDataBind_OnReadyStateChange.Databind( WebSvcDataBind_OnReadyStateChange.httpRequest.responseXML.selectSingleNode("data_list").childNodes, WebSvcDataBind_OnReadyStateChange.webSvcValueField, WebSvcDataBind_OnReadyStateChange.webSvcTextField ); 
			// find test in option list 
			var i=0;
			var k=0;
			var strSearchVal = WebSvcDataBind_OnReadyStateChange.objtxt.value;
			var optList = WebSvcDataBind_OnReadyStateChange.objdd.options;
			var done = false;
			while( !done )
			{
				strOptionVal = optList[i].text.toLowerCase().substring(0,strSearchVal.length);
				if ( (strOptionVal.indexOf( strSearchVal.toLowerCase() )) != -1 )   
					{
						k = i;   
						done = true;
					}	
				else if( i >= optList.length - 1 )
					done = true;
				else
					i++;		
			}
			WebSvcDataBind_OnReadyStateChange.objdd.selectedIndex = k;
			if( WebSvcDataBind_OnReadyStateChange.doOpen )
				OpenDD( WebSvcDataBind_OnReadyStateChange.objdd, WebSvcDataBind_OnReadyStateChange.ddHeight, WebSvcDataBind_OnReadyStateChange.objtxt, WebSvcDataBind_OnReadyStateChange.xOffset, WebSvcDataBind_OnReadyStateChange.yOffset );			
		}
	}
		
	function getObject( objGridName, objName )
	{
		var idx;
		var objGrid = eval( objGridName );
		var rowIndex = window.event.srcElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.rowIndex;
		var rowCount = objGrid.rows.length;
		var footer = objGrid.tFoot;
		var obj;
		if( footer != null )
			rowCount = rowCount - footer.rows.length;
		if( rowCount > 2 )
			{
				idx = rowIndex - 1;
				obj = document.forms[0].item( objName )[idx];
			}	
				
		else
			{
				obj = document.forms[0].item( objName, 0 );
			}			
		return obj; 	
	}
	
	function setObjects( rowIndex )
	{
		var objGrid = eval( this.objGridName );	
		var rowCount = objGrid.rows.length;
		var idx;
		var footer;
		footer = objGrid.tFoot;
		if( footer != null )
		{
			rowCount = rowCount - footer.rows.length;
		}
		if( rowCount > 2 )
			{
				idx = rowIndex - 1;
				this.objtxt = document.forms[0].item( this.objName + '_txt' )[idx];
				this.objdd = document.forms[0].item( this.objName + '_sel' )[idx];
			}	
				
		else
			{
				this.objtxt = document.forms[0].item( this.objName + '_txt', 0 );
				this.objdd = document.forms[0].item( this.objName + '_sel', 0 );
			}					
	}
	 
 
 
}		