/**
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
* 
* ?Copyright 2005 Richard Heyes
*/

    /**
    * Global vars
    */
    __AutoComplete = new Array();
    // Basic UA detection
    isIE = document.all ? true : false;
    isGecko = navigator.userAgent.toLowerCase().indexOf('gecko') != -1;
    isOpera = navigator.userAgent.toLowerCase().indexOf('opera') != -1;


    /**
    * Attachs the autocomplete object to a form element. Sets
    * onkeypress event on the form element.
    * 
    * @param string formElement Name of form element to attach to
    * @param array  data        Array of strings of which to use as the autocomplete data
    */
	function AutoComplete_SetAttribe(id,AttribeName,Value){
		if(__AutoComplete[id]){
			if(__AutoComplete[id][AttribeName]!='undefined'){
			 	__AutoComplete[id][AttribeName]=Value;
			}
		}
	}
	function AutoComplete_ReSetdata(id,data){
		if(__AutoComplete[id]!=null){
			__AutoComplete[id]['data']=data;
			if(AutoComplete_ReSetdata.arguments.length>=3)
				__AutoComplete[id]['Key']=AutoComplete_ReSetdata.arguments[2];
//			if(AutoComplete_ReSetdata.arguments.length>=4)
//				__AutoComplete[id]['SecondKey']=AutoComplete_ReSetdata.arguments[3];
		}
	}
    function AutoComplete_Create (id, data)
    {
        __AutoComplete[id] = {'data':data,
							  'Title':null,
							  'position':'off',
							  'IniCreateDropdown':false,
							  'html':false,
							  'Key':null,
							  'Keyelement':null,
                              'isVisible':false,
                              'element':document.getElementById(id),
                              'dropdown':null,
                              'highlighted':null,
							  'case-insensitive':false,					//分大小写 true 不分 false 
							  'KeydownResetValue':true,
							  'MatchWhole':true,						//true 左边完全 false 模糊
							  'onclickShow':false};						//onlick 是否要显示
				
		
        __AutoComplete[id]['element'].setAttribute('autocomplete', 'off');
		if(__AutoComplete[id]['element'].onkeydown)
			__AutoComplete[id]['element'].onkeydown=__AutoComplete[id]['element'].onkeydown.andThen(function(e,id) {if(!e) e=window.event;return AutoComplete_KeyDown(e,e.srcElement.id);})
		else
        	__AutoComplete[id]['element'].onkeydown  = function(e,id) {
				//debugger;			
				if(!e) 
					e=window.event;
				obj=e.srcElement?e.srcElement:e.target;
				return AutoComplete_KeyDown(e,obj.id);
			};
		if(__AutoComplete[id]['element'].onkeyup)
			__AutoComplete[id]['element'].onkeyup=__AutoComplete[id]['element'].onkeyup.andThen(function(e,id) {if(!e) e=window.event;return AutoComplete_KeyUp(e,e.srcElement.id);})
		else
       		__AutoComplete[id]['element'].onkeyup    = function(e,id) {
				//debugger;
			var e=getEvent();
			obj=e.srcElement?e.srcElement:e.target;
			return AutoComplete_KeyUp(e,obj.id);
			};
		
		if(__AutoComplete[id]['element'].onkeypress)
        	__AutoComplete[id]['element'].onkeypress=__AutoComplete[id]['element'].onkeypress.andThen(function(e) {if (!e) e = window.event; if (e.keyCode == 13 || isOpera) return false;});
		else
			__AutoComplete[id]['element'].onkeypress=function(e) {
				//debugger;
			if (!e) 
				e = window.event;
			/*else
			{
				obj=e.srcElement?e.srcElement:e.target;
			    return AutoComplete_KeyUp(obj.id, e);
			}*/
			//if (e.keyCode == 13 || isOpera) 
				//return false;
			};
		
		if(__AutoComplete[id]['element'].onclick)
			__AutoComplete[id]['element'].onclick=__AutoComplete[id]['element'].onclick.andThen(
				function() {
					var e=getEvent();
					obj=e.srcElement || e.target; 
					AutoComplete_ShowDropdown(obj.id,e);
					}
				);
        else			
			__AutoComplete[id]['element'].onclick=function(e){
				//debugger;
				var e=getEvent();
				obj=e.srcElement?e.srcElement:e.target;
				AutoComplete_ShowDropdown(obj.id,e);
			};
			
		if(__AutoComplete[id]['element'].ondblclick){
			__AutoComplete[id]['element'].ondblclick=__AutoComplete[id]['element'].ondblclick.andThen(function(e) {																											   
					var e=getEvent();
					obj=e.srcElement?e.srcElement:e.target;
					AutoComplete_ShowDropdown(obj.id,e);
				}
			);
		}else{
			__AutoComplete[id]['element'].ondblclick=function(e) {
				var e=getEvent();
				obj=e.srcElement?e.srcElement:e.target;
				AutoComplete_ShowDropdown(obj.id,e);
			};
		}
			
		if(__AutoComplete[id]['element'].onblur)
			__AutoComplete[id]['element'].onblur=__AutoComplete[id]['element'].onblur.andThen(function(e) {if(!e) e=window.event;AutoComplete_HideDropdown(e.srcElement.id);});
        else
			__AutoComplete[id]['element'].onblur=function(e) {
			var e=getEvent();
			obj=e.srcElement?e.srcElement:e.target;
			AutoComplete_HideDropdown(obj.id);
			};
			
		if(AutoComplete_Create.arguments.length>=5){
			__AutoComplete[id]['Keyelement']=AutoComplete_Create.arguments[3];
			__AutoComplete[id]['Key']=AutoComplete_Create.arguments[4];
		}
		//if(AutoComplete_Create.arguments.length>=7){
//			__AutoComplete[id]['SecondKeyelement']=document.getElementById(AutoComplete_Create.arguments[5]);
//			__AutoComplete[id]['SecondKey']=AutoComplete_Create.arguments[6];
//		}
        // Hides the dropdowns when document clicked
       // var docClick = function()
//        {
//			if(!__AutoComplete[id]['onclickShow']){
//				for (id in __AutoComplete) {
//					if(typeof(__AutoComplete[id]['dropdown'])!='undefined')
//						AutoComplete_HideDropdown(id);
//				}
//			}
//        }
//        if (document.addEventListener) {
//            document.addEventListener('click', docClick, false);
//        } else if (document.attachEvent) {
//            document.attachEvent('onclick', docClick, false);
//        }


        // Max number of items shown at once
        if (arguments[2] != null) {
            __AutoComplete[id]['maxitems'] = arguments[2];
            __AutoComplete[id]['firstItemShowing'] = 0;
            __AutoComplete[id]['lastItemShowing']  = arguments[2] - 1;
        }
		//alert(__AutoComplete[id]['element'].style.display);
        //__AutoComplete[id]['element'].style.display='';
        AutoComplete_CreateDropdown(id);
        
        // Prevent select dropdowns showing thru
        if (isIE) {
            __AutoComplete[id]['iframe'] = document.createElement('iframe');
            __AutoComplete[id]['iframe'].id = id +'_iframe';
            __AutoComplete[id]['iframe'].style.position = 'absolute';
            __AutoComplete[id]['iframe'].style.top = '0';
            __AutoComplete[id]['iframe'].style.left = '0';
            __AutoComplete[id]['iframe'].style.width = '0px';
            __AutoComplete[id]['iframe'].style.height = '0px';
            __AutoComplete[id]['iframe'].style.zIndex = '98';
            __AutoComplete[id]['iframe'].style.visibility = 'hidden';
			
            __AutoComplete[id]['element'].parentNode.insertBefore(__AutoComplete[id]['iframe'], __AutoComplete[id]['element']);
			
        }
    }

    /**
    * Creates the dropdown layer
    * 
    * @param string id The form elements id. Used to identify the correct dropdown.
    */
	function getElementPos(elementId) {
		 var ua = navigator.userAgent.toLowerCase();
		 var isOpera = (ua.indexOf('opera') != -1);
		 var isIE = (ua.indexOf('msie') != -1 && !isOpera); // not opera spoof
		 var el = elementId;
		 if(el.parentNode === null || el.style.display == 'none') {
		  return false;
		 }      
		 var parent = null;
		 var pos = [];     
		 var box;     
		 if(el.getBoundingClientRect)    //IE
		 {         
		  box = el.getBoundingClientRect();
		  var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
		  var scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);
		  return {x:box.left + scrollLeft, y:box.top + scrollTop};
		 }else if(document.getBoxObjectFor)    // gecko    
		 {
		  box = document.getBoxObjectFor(el); 
		  var borderLeft = (el.style.borderLeftWidth)?parseInt(el.style.borderLeftWidth):0; 
		  var borderTop = (el.style.borderTopWidth)?parseInt(el.style.borderTopWidth):0; 
		  pos = [box.x - borderLeft, box.y - borderTop];
		 } else    // safari & opera    
		 {
		  pos = [el.offsetLeft, el.offsetTop];  
		  parent = el.offsetParent;     
		  if (parent != el) { 
		   while (parent) {  
			pos[0] += parent.offsetLeft; 
			pos[1] += parent.offsetTop; 
			parent = parent.offsetParent;
		   }  
		  }   
		  if (ua.indexOf('opera') != -1 || ( ua.indexOf('safari') != -1 && el.style.position == 'absolute' )) { 
		   pos[0] -= document.body.offsetLeft;
		   pos[1] -= document.body.offsetTop;         
		  }    
		 }              
		 if (el.parentNode) { 
			parent = el.parentNode;
		   } else {
			parent = null;
		   }
		 while (parent && parent.tagName != 'BODY' && parent.tagName != 'HTML') { // account for any scrolled ancestors
		  pos[0] -= parent.scrollLeft;
		  pos[1] -= parent.scrollTop;
		  if (parent.parentNode) {
		   parent = parent.parentNode;
		  } else {
		   parent = null;
		  }
		 }
		 return {x:pos[0], y:pos[1]};
}

    function AutoComplete_CreateDropdown(id)
    {
        /*var left  = AutoComplete_GetLeft(__AutoComplete[id]['element']);
		if(document.all)
			var top = AutoComplete_GetTop(__AutoComplete[id]['element']) + __AutoComplete[id]['element'].offsetHeight;
		else{
			try{
				if(document.getElementById("flightPlaaner").style.display != 'none'){
					if(__AutoComplete[id]['element'].id == 'orgCity')
						var top   = __AutoComplete[id]['element'].offsetHeight + 80;
					else
						var top = __AutoComplete[id]['element'].offsetHeight + 113;
					left = left - 41;
				}
				else{
					var top   = __AutoComplete[id]['element'].offsetHeight + 41;
					left = left - 41;
				}
		    }catch(ex)
			{
				if(__AutoComplete[id]['element'].id == 'orgCity')
						var top   = __AutoComplete[id]['element'].offsetHeight + 80;
				else if(__AutoComplete[id]['element'].id == 'OrgCity1'){
					    left = left - 251;
						var top   = __AutoComplete[id]['element'].offsetHeight + 325;
				}
				else if(__AutoComplete[id]['element'].id == 'DstCity1')
				{
						left = left -251;
						var top = __AutoComplete[id]['element'].offsetHeight + 379;
				}
				else{
						left = left - 436;
						var top = __AutoComplete[id]['element'].offsetHeight + 287;
				}
			}
		}*/

		var element=__AutoComplete[id]['element'];
		var pos=getElementPos(element);
		var left = pos.x;
		var top = pos.y + __AutoComplete[id]['element'].offsetHeight;
		
		
        var width = __AutoComplete[id]['element'].offsetWidth;	
		__AutoComplete[id]['dropdown'] = document.createElement('div');
		//onblur   
		__AutoComplete[id]['dropdown'].onmouseout = function() {__AutoComplete[id]['position']='off';};
		__AutoComplete[id]['dropdown'].onmouseover = function() {__AutoComplete[id]['position']='on';};
		__AutoComplete[id]['dropdown'].onblur=function(){AutoComplete_HideDropdown(id);};
		__AutoComplete[id]['dropdown'].className = 'autocomplete'; // Don't use setAttribute()
	
		__AutoComplete[id]['element'].parentNode.insertBefore(__AutoComplete[id]['dropdown'], __AutoComplete[id]['element']);
		
		// Position it
		//debugger;
		__AutoComplete[id]['dropdown'].style.left       = left + 'px';
		__AutoComplete[id]['dropdown'].style.top        = top + 'px';
		__AutoComplete[id]['dropdown'].style.width      = width + 'px';
		__AutoComplete[id]['dropdown'].style.zIndex     = '99';
		__AutoComplete[id]['dropdown'].style.visibility = 'hidden';
		if(width!=0)
			__AutoComplete[id]['IniCreateDropdown']=true;
}
    
    
    /**
    * Gets left coord of given element
    * 
    * @param object element The element to get the left coord for
    */
    function AutoComplete_GetLeft(element)
    {
        var curNode = element;
        var left    = 0;

        do {
            left += curNode.offsetLeft;
			if(document.all)
				curNode = curNode.offsetParent;
			else
				curNode = curNode.parentNode;

        } while(curNode != null && curNode.tagName.toLowerCase() != 'body');

        return left ;
		
    }
    
    
    /**
    * Gets top coord of given element
    * 
    * @param object element The element to get the top coord for
    */
    function AutoComplete_GetTop(element)
    {
        var curNode = element;
        var top    = 0;

        do {
            top += curNode.offsetTop;
            if(document.all)
				curNode = curNode.offsetParent;
			else
				curNode = curNode.parentNode;

        } while(curNode != null &&  curNode.tagName.toLowerCase() != 'body' );
        return top;
    }

    
    /**
    * Shows the dropdown layer
    * 
    * @param string id The form elements id. Used to identify the correct dropdown.
    */
    function AutoComplete_ShowDropdown(id)
    {
		//debugger;
		if(arguments.length>=2)
		{
			if(__AutoComplete[id]['onclickShow']){
				if(arguments[1].type=='click'){
					if(__AutoComplete[id]['isVisible']){
						AutoComplete_HideDropdown(id);
						return false;
					}
				}
			}else
				return false;
		}

		if(!__AutoComplete[id]['IniCreateDropdown'])
			AutoComplete_CreateDropdown(id);
        AutoComplete_HideAll();
		
		var value,i;
		__AutoComplete[id]['element'].value ? value=__AutoComplete[id]['element'].value: value=__AutoComplete[id]['element'].textContent;
		if(typeof(value)=='undefined')
			value="";
        var toDisplay = new Array();
		var toHidenKey=new Array();		//第二个Key
		//var toHidenSecondKey=new Array();		//第三个Key
        var newDiv    = null;
        var text      = null;
		var MatchFlag =false;
        var numItems  = __AutoComplete[id]['dropdown'].childNodes.length;
        // Remove all child nodes from dropdown
        while (__AutoComplete[id]['dropdown'].childNodes.length > 0) {
            __AutoComplete[id]['dropdown'].removeChild(__AutoComplete[id]['dropdown'].childNodes[0]);
        }
		//alert(toHidenKey.length);
//		toHidenKey[toHidenKey.length]=new Array(__AutoComplete[id]['Key'].length);
//		alert(toHidenKey.length);
//		toHidenKey[toHidenKey.length-1][0]='abc';
//		toHidenKey[toHidenKey.length-1][1]='def';
//		alert(toHidenKey[toHidenKey.length-1][0]);
        // Go thru data searching for matches
		//toHidenKey[__AutoComplete[id]['Key'].length];
//		alert('toHidenKey.length='+toHidenKey.length);
		//alert(__AutoComplete[id]['Key'].length);
		
        for (i=0; i<__AutoComplete[id]['data'].length; ++i){
			MatchFlag=false;
			if(__AutoComplete[id]['MatchWhole']){
				if (!__AutoComplete[id]['case-insensitive']){
					__AutoComplete[id]['html'] ? MatchFlag=__AutoComplete[id]['data'][i].replace(/<.+?>/g,'').substr(0, value.length) == value:MatchFlag=__AutoComplete[id]['data'][i].substr(0, value.length) == value;
					if (MatchFlag) {
						//toDisplay[toDisplay.length] = __AutoComplete[id]['data'][i].replace('|','');
						var tmpdiv=document.createElement('div');
						if(value.length>0 && !__AutoComplete[id]['html']){
							re = new RegExp(value.replace(')','\\)').replace('(','\\(').replace('+','\\+'),"i");  //创建正则表达式对象						
							tmpdiv.innerHTML=__AutoComplete[id]['data'][i].replace(re,'<U><strong>'+__AutoComplete[id]['data'][i].substr(0, value.length)+'</strong></U>');
							//toDisplay[toDisplay.length]=tmpdiv;
							toDisplay[toDisplay.length]=new Array(tmpdiv,i);
						}else{
							if(__AutoComplete[id]['html'])
								tmpdiv.innerHTML=__AutoComplete[id]['data'][i]
							else
								tmpdiv.innerText=__AutoComplete[id]['data'][i];
							toDisplay[toDisplay.length]=new Array(tmpdiv,i);
						}
						
						if(__AutoComplete[id]['Key']!=null){
							toHidenKey[toHidenKey.length]=new Array(__AutoComplete[id]['Key'].length);
							for(x=0;x<=__AutoComplete[id]['Key'].length-1;x++){
								toHidenKey[toHidenKey.length-1][x]= __AutoComplete[id]['Key'][x][i];
								//alert('__AutoComplete[id][\'Key\'][x][i];='+__AutoComplete[id]['Key'][x][i]);
							}
						}
						
						//if(__AutoComplete[id]['SecondKey']!=null)
//							toHidenSecondKey[toHidenSecondKey.length]= __AutoComplete[id]['SecondKey'][i];
					}
				}
				else{
					try{
						__AutoComplete[id]['html'] ? MatchFlag=__AutoComplete[id]['data'][i].replace(/<.+?>/g,'').substr(0, value.length).toUpperCase() == value.toUpperCase():MatchFlag=__AutoComplete[id]['data'][i].substr(0, value.length).toUpperCase() == value.toUpperCase();
					}catch(ex){
							if(__AutoComplete[id]['data'][i]==value)
								MatchFlag = true;
					}
					if (MatchFlag) {
						//__AutoComplete[id]['data'][i]
						var tmpdiv=document.createElement('div');
						if(value.length>0 && !__AutoComplete[id]['html']){
							re = new RegExp(value.replace(')','\\)').replace('(','\\(').replace('+','\\+'),"i");  //创建正则表达式对象						
							tmpdiv.innerHTML=__AutoComplete[id]['data'][i].replace(re,'<U><strong>'+__AutoComplete[id]['data'][i].substr(0, value.length)+'</strong></U>');
							//toDisplay[toDisplay.length]=tmpdiv;
							toDisplay[toDisplay.length]=new Array(tmpdiv,i);
						}else{
							if(__AutoComplete[id]['html'])
								tmpdiv.innerHTML=__AutoComplete[id]['data'][i]
							else{
								if(document.all)
									tmpdiv.innerText=__AutoComplete[id]['data'][i];
								else
									tmpdiv.textContent=__AutoComplete[id]['data'][i];
								}
							toDisplay[toDisplay.length]=new Array(tmpdiv,i);
						}
						
						if(__AutoComplete[id]['Key']!=null){
							toHidenKey[toHidenKey.length]=new Array(__AutoComplete[id]['Key'].length);
							for(x=0;x<=__AutoComplete[id]['Key'].length-1;x++){
								toHidenKey[toHidenKey.length-1][x]= __AutoComplete[id]['Key'][x][i];
							}
						}
						//if(__AutoComplete[id]['SecondKey']!=null)
//							toHidenSecondKey[toHidenSecondKey.length]= __AutoComplete[id]['SecondKey'][i];
					}
				}
			}else{
				if (!__AutoComplete[id]['case-insensitive']){
					__AutoComplete[id]['html'] ? MatchFlag=__AutoComplete[id]['data'][i].replace(/<.+?>/g,'').indexOf(value)>=0:MatchFlag=__AutoComplete[id]['data'][i].indexOf(value)>=0;
					if (MatchFlag) {
						var tmpdiv=document.createElement('div');
						if(value.length>0 && !__AutoComplete[id]['html']){
							re = new RegExp(value.replace(')','\\)').replace('(','\\(').replace('+','\\+'));  // 创建正则表达式对象						
							tmpdiv.innerHTML=__AutoComplete[id]['data'][i].replace(re,'<U><strong>'+__AutoComplete[id]['data'][i].substr(__AutoComplete[id]['data'][i].indexOf(value), value.length)+'</U></strong>');
							//toDisplay[toDisplay.length]=tmpdiv;
							toDisplay[toDisplay.length]=new Array(tmpdiv,i);
						}else{			
							if(__AutoComplete[id]['html'])
								tmpdiv.innerHTML=__AutoComplete[id]['data'][i]
							else{
								if(document.all)
									tmpdiv.innerText=__AutoComplete[id]['data'][i];
								else
									tmpdiv.textContent=__AutoComplete[id]['data'][i];
								}
							toDisplay[toDisplay.length]=new Array(tmpdiv,i);
						}
						if(__AutoComplete[id]['Key']!=null){
							toHidenKey[toHidenKey.length]=new Array(__AutoComplete[id]['Key'].length);
							for(x=0;x<=__AutoComplete[id]['Key'].length-1;x++){
								toHidenKey[toHidenKey.length-1][x]= __AutoComplete[id]['Key'][x][i];
							}
						}
						//if(__AutoComplete[id]['SecondKey']!=null)
//							toHidenSecondKey[toHidenSecondKey.length]= __AutoComplete[id]['SecondKey'][i];
					}
				}
				else{
					__AutoComplete[id]['html'] ? MatchFlag=__AutoComplete[id]['data'][i].replace(/<.+?>/g,'').toUpperCase().indexOf(value.toUpperCase())>=0:MatchFlag=__AutoComplete[id]['data'][i].toUpperCase().indexOf(value.toUpperCase())>=0;
					if (MatchFlag){
						//alert(__AutoComplete[id]['data'][i].toUpperCase().indexOf(value.toUpperCase()));
						var tmpdiv=document.createElement('div');
						if(value.length>0 && !__AutoComplete[id]['html']){
							re = new RegExp(value.replace(')','\\)').replace('(','\\(').replace('+','\\+'),"i");  //创建正则表达式对象					
							tmpdiv.innerHTML=__AutoComplete[id]['data'][i].replace(re,'<U><strong>'+__AutoComplete[id]['data'][i].substr(__AutoComplete[id]['data'][i].toUpperCase().indexOf(value.toUpperCase()),value.length)+'</U></strong>');
							toDisplay[toDisplay.length]=new Array(tmpdiv,i);
						}else{
							if(__AutoComplete[id]['html'])
								tmpdiv.innerHTML=__AutoComplete[id]['data'][i]
							else
								{
								if(document.all)
									tmpdiv.innerText=__AutoComplete[id]['data'][i];
								else
									tmpdiv.textContent=__AutoComplete[id]['data'][i];
								}
							toDisplay[toDisplay.length]=new Array(tmpdiv,i);
						}
						if(__AutoComplete[id]['Key']!=null){
							toHidenKey[toHidenKey.length]=new Array(__AutoComplete[id]['Key'].length);
							for(x=0;x<=__AutoComplete[id]['Key'].length-1;x++){
								toHidenKey[toHidenKey.length-1][x]= __AutoComplete[id]['Key'][x][i];
							}
						}
					}
				}	
			}
        }
        // No matches?
        if (toDisplay.length == 0) {
            AutoComplete_HideDropdown(id);
            return;
        }
        // Add data to the dropdown layer
		//将符合的字串建立DIV以便显示出来
        for (i=0; i<toDisplay.length; ++i) {
            newDiv = document.createElement('div');
            newDiv.className = 'autocomplete_item'; // Don't use setAttribute()
            newDiv.setAttribute('id', 'autocomplete_item_' + i);
            newDiv.setAttribute('index', i);
			newDiv.setAttribute('dataindex',toDisplay[i][1]);
			if(__AutoComplete[id]['Title']!=null){
				newDiv.setAttribute('title',__AutoComplete[id]['Title'][i]);
			}
			if(__AutoComplete[id]['Key']!=null)
			for(x=0;x<=__AutoComplete[id]['Keyelement'].length-1;x++)
			{
				newDiv.setAttribute(__AutoComplete[id]['Keyelement'][x],toHidenKey[i][x]);
			}
//			if(__AutoComplete[id]['SecondKey']!=null)
//				newDiv.setAttribute('SecondKey', toHidenSecondKey[i]);
            newDiv.style.zIndex = '99';
            
             // Scrollbars are on display ?
            if (toDisplay.length > __AutoComplete[id]['maxitems'] && navigator.userAgent.indexOf('MSIE') == -1) {
                newDiv.style.width = __AutoComplete[id]['element'].offsetWidth - 22 + 'px';
            }
            newDiv.onmouseover= function() {AutoComplete_HighlightItem(__AutoComplete[id]['element'].getAttribute('id'), this.getAttribute('index'));};
			//newDiv.onmouseout = function() {__AutoComplete[id]['element'].setAttribute('position', 'off');};
            newDiv.onclick    = function() {__AutoComplete[id]['position']='off';AutoComplete_SetValue(__AutoComplete[id]['element'].getAttribute('id')); AutoComplete_HideDropdown(__AutoComplete[id]['element'].getAttribute('id'));}
			if(typeof(toDisplay[i][0])=='string'){
	            text= document.createTextNode(toDisplay[i][0]);
			}else{
				text=toDisplay[i][0];
			}
			//text   = document.createTextNode('<b>abc</b>');
			//alert(text.text)appendChild(;
            newDiv.appendChild(text);
            __AutoComplete[id]['dropdown'].appendChild(newDiv);
        }
		//alert(typeof(__AutoComplete[id]['dropdown']));
        // Too many items?
        if (toDisplay.length > __AutoComplete[id]['maxitems']) {
            __AutoComplete[id]['dropdown'].style.height = (__AutoComplete[id]['maxitems'] * 15) + 2 + 'px';
        
        } else {
            __AutoComplete[id]['dropdown'].style.height = '';
        }
       
        /**
        * Set left/top in case of document movement/scroll/window resize etc
        */
        __AutoComplete[id]['dropdown'].style.left = AutoComplete_GetLeft(__AutoComplete[id]['element']);
        __AutoComplete[id]['dropdown'].style.top  = AutoComplete_GetTop(__AutoComplete[id]['element']) + __AutoComplete[id]['element'].offsetHeight;
        // Show the iframe for IE
        if (isIE) {
            __AutoComplete[id]['iframe'].style.top    = __AutoComplete[id]['dropdown'].style.top;
            __AutoComplete[id]['iframe'].style.left   = __AutoComplete[id]['dropdown'].style.left;
            __AutoComplete[id]['iframe'].style.width  = __AutoComplete[id]['dropdown'].offsetWidth;
            __AutoComplete[id]['iframe'].style.height = __AutoComplete[id]['dropdown'].offsetHeight;
            __AutoComplete[id]['iframe'].style.visibility = 'visible';
        }
        // Show dropdown
	
        if (!__AutoComplete[id]['isVisible']) {
            __AutoComplete[id]['dropdown'].style.visibility = 'visible';
            __AutoComplete[id]['isVisible'] = true;
        }     
        // If now showing less items than before, reset the highlighted value
		var k= __AutoComplete[id]['dropdown'].childNodes.length;
        if (__AutoComplete[id]['dropdown'].childNodes.length != numItems) {
            __AutoComplete[id]['highlighted'] = null;
        }
		AutoComplete_relative(id);
    }
    
    
    /**
    * Hides the dropdown layer
    * 
    * @param string id The form elements id. Used to identify the correct dropdown.
    */
    function AutoComplete_HideDropdown(id)
    {	
		if(__AutoComplete[id]['position']=='on'){
			return false;
		}
		//if(AutoComplete_HideDropdown.arguments.length>=2)
			//alert(AutoComplete_HideDropdown.arguments[1].type);
		if (__AutoComplete[id]['iframe']) {
			__AutoComplete[id]['iframe'].style.visibility = 'hidden';
		}
		try{
				__AutoComplete[id]['dropdown'].style.visibility = 'hidden';
				__AutoComplete[id]['highlighted'] = null;
				__AutoComplete[id]['isVisible']   = false;
		} catch(e){
			alert('AutoComplete_HideDropdown Error');
		}
    }
    
    
    /**
    * Hides all dropdowns
    */
    function AutoComplete_HideAll()
    {
	    for (id in __AutoComplete) {
			if(typeof(__AutoComplete[id]['dropdown'])!='undefined'){
            	AutoComplete_HideDropdown(id);
			}
        }
    }
    
    
    /**
    * Highlights a specific item
    * 
    * @param string id    The form elements id. Used to identify the correct dropdown.
    * @param int    index The index of the element in the dropdown to highlight
    */
    function AutoComplete_HighlightItem(id, index)
    {
        if (__AutoComplete[id]['dropdown'].childNodes[index]) {
			
            for (var i=0; i<__AutoComplete[id]['dropdown'].childNodes.length; ++i) {
                if (__AutoComplete[id]['dropdown'].childNodes[i].className == 'autocomplete_item_highlighted') {
                    __AutoComplete[id]['dropdown'].childNodes[i].className = 'autocomplete_item';
                }
            }
            
            __AutoComplete[id]['dropdown'].childNodes[index].className = 'autocomplete_item_highlighted';
            __AutoComplete[id]['highlighted'] = index;
        }
    }


    /**
    * Highlights the menu item with the given index
    * 
    * @param string id    The form elements id. Used to identify the correct dropdown.
    * @param int    index The index of the element in the dropdown to highlight
    */
    function AutoComplete_Highlight(id, index)
    {
        // Out of bounds checking
        if (index == 1 && __AutoComplete[id]['highlighted'] == __AutoComplete[id]['dropdown'].childNodes.length - 1) {
            __AutoComplete[id]['dropdown'].childNodes[__AutoComplete[id]['highlighted']].className = 'autocomplete_item';
            __AutoComplete[id]['highlighted'] = null;
        
        } else if (index == -1 && __AutoComplete[id]['highlighted'] == 0) {
            __AutoComplete[id]['dropdown'].childNodes[0].className = 'autocomplete_item';
            __AutoComplete[id]['highlighted'] = __AutoComplete[id]['dropdown'].childNodes.length;
        }
        // Nothing highlighted at the moment
		//alert('jack');
        if (__AutoComplete[id]['highlighted'] == null) {
			//alert(__AutoComplete[id]['dropdown'].childNodes.length);
            __AutoComplete[id]['dropdown'].childNodes[0].className = 'autocomplete_item_highlighted';
            __AutoComplete[id]['highlighted'] = 0;
					
        } else {
			//alert('ok1');
            if (__AutoComplete[id]['dropdown'].childNodes[__AutoComplete[id]['highlighted']]) {
                __AutoComplete[id]['dropdown'].childNodes[__AutoComplete[id]['highlighted']].className = 'autocomplete_item';
            }

            var newIndex = __AutoComplete[id]['highlighted'] + index;

            if (__AutoComplete[id]['dropdown'].childNodes[newIndex]) {
                __AutoComplete[id]['dropdown'].childNodes[newIndex].className = 'autocomplete_item_highlighted';
                
                __AutoComplete[id]['highlighted'] = newIndex;
            }
        }
    }


    /**
    * Sets the input to a given value
    * 
    * @param string id    The form elements id. Used to identify the correct dropdown.
    */
    function AutoComplete_SetValue(id)
    {	
		//try{
//			__AutoComplete[id]['element'].value= __AutoComplete[id]['dropdown'].childNodes[__AutoComplete[id]['highlighted']].innerHTML;
//			}
//		catch(e){
//			__AutoComplete[id]['element'].innerHTML=__AutoComplete[id]['dropdown'].childNodes[__AutoComplete[id]['highlighted']].innerText;
//			}
		//__AutoComplete[id]['element'].type ? __AutoComplete[id]['element'].value= __AutoComplete[id]['dropdown'].childNodes[__AutoComplete[id]['highlighted']].innerHTML:__AutoComplete[id]['element'].innerHTML=__AutoComplete[id]['dropdown'].childNodes[__AutoComplete[id]['highlighted']].innerText;
		//__AutoComplete[id]['dropdown'].childNodes[__AutoComplete[id]['highlighted']].getAttribute('dataindex')
		//alert(__AutoComplete[id]['data'][__AutoComplete[id]['dropdown'].childNodes[__AutoComplete[id]['highlighted']].getAttribute('dataindex')]);
		__AutoComplete[id]['element'].type ? __AutoComplete[id]['element'].value= __AutoComplete[id]['data'][__AutoComplete[id]['dropdown'].childNodes[__AutoComplete[id]['highlighted']].getAttribute('dataindex')]:__AutoComplete[id]['element'].innerHTML=__AutoComplete[id]['data'][__AutoComplete[id]['dropdown'].childNodes[__AutoComplete[id]['highlighted']].getAttribute('dataindex')];		
		if(__AutoComplete[id]['Keyelement']!=null)
			for(i=0;i<=__AutoComplete[id]['Keyelement'].length-1;i++)
			{
				//alert(__AutoComplete[id]['Keyelement'][i]);
				document.getElementById(__AutoComplete[id]['Keyelement'][i]).type ? document.getElementById(__AutoComplete[id]['Keyelement'][i]).value=__AutoComplete[id]['dropdown'].childNodes[__AutoComplete[id]['highlighted']].getAttribute(__AutoComplete[id]['Keyelement'][i]):document.getElementById(__AutoComplete[id]['Keyelement'][i]).innerHTML=__AutoComplete[id]['dropdown'].childNodes[__AutoComplete[id]['highlighted']].getAttribute(__AutoComplete[id]['Keyelement'][i]);
			}
		//if(__AutoComplete[id]['SecondKeyelement']!=null)
//			__AutoComplete[id]['SecondKeyelement'].type ? __AutoComplete[id]['SecondKeyelement'].value=__AutoComplete[id]['dropdown'].childNodes[__AutoComplete[id]['highlighted']].getAttribute('SecondKey'):__AutoComplete[id]['SecondKeyelement'].innerHTML=__AutoComplete[id]['dropdown'].childNodes[__AutoComplete[id]['highlighted']].getAttribute('SecondKey');
		//if(__AutoComplete[id]['SecondKeyelement']!=null)
			//try{
//				__AutoComplete[id]['SecondKeyelement'].value=__AutoComplete[id]['dropdown'].childNodes[__AutoComplete[id]['highlighted']].getAttribute('SecondKey');}
//			catch(e){
//				__AutoComplete[id]['SecondKeyelement'].innerHTML=__AutoComplete[id]['dropdown'].childNodes[__AutoComplete[id]['highlighted']].getAttribute('SecondKey');}
		//__AutoComplete[id]['element'].value='abc';
		//__AutoComplete[id]['element'].innerHTML= 
       //__AutoComplete[id]['element'].value ? :__AutoComplete[id]['element'].innerHTML= __AutoComplete[id]['dropdown'].childNodes[__AutoComplete[id]['highlighted']].innerText;
    }
    
    
    /**
    * Checks if the dropdown needs scrolling
    * 
    * @param string id    The form elements id. Used to identify the correct dropdown.
    */
    function AutoComplete_ScrollCheck(id)
    {
        // Scroll down, or wrapping around from scroll up
        if (__AutoComplete[id]['highlighted'] > __AutoComplete[id]['lastItemShowing']) {
            __AutoComplete[id]['firstItemShowing'] = __AutoComplete[id]['highlighted'] - (__AutoComplete[id]['maxitems'] - 1);
            __AutoComplete[id]['lastItemShowing']  = __AutoComplete[id]['highlighted'];
        }
        
        // Scroll up, or wrapping around from scroll down
        if (__AutoComplete[id]['highlighted'] < __AutoComplete[id]['firstItemShowing']) {
            __AutoComplete[id]['firstItemShowing'] = __AutoComplete[id]['highlighted'];
            __AutoComplete[id]['lastItemShowing']  = __AutoComplete[id]['highlighted'] + (__AutoComplete[id]['maxitems'] - 1);
        }
        
        __AutoComplete[id]['dropdown'].scrollTop = __AutoComplete[id]['firstItemShowing'] * 15;
    }


    /**
    * Function which handles the keypress event
    * 
    * @param string id    The form elements id. Used to identify the correct dropdown.
    */
    function AutoComplete_KeyDown(e,id)
    {
        // Mozilla
        //if (arguments[1] != null) {
//            event = arguments[1];
//        }
		
        var keyCode = e.keyCode;

        switch (keyCode) {

            // Return/Enter
            case 13:
				//alert('abc');
				//debugger;
                if (__AutoComplete[id]['highlighted'] != null) {
                    AutoComplete_SetValue(id);
                    AutoComplete_HideDropdown(id);
					if(document.all)
						e.returnValue = false
					else
						e.preventDefault();
					
					e.cancelBubble = true;
                }
//                
//               
//                
                break;

            // Escape
            case 27:
                AutoComplete_HideDropdown(id);	//Hiden DropDown
                if(document.all)
	                e.returnValue = false
				else
					e.preventDefault();
                e.cancelBubble = true;
                break;
            
            // Up arrow
            case 38:
				
				if (!__AutoComplete[id]['isVisible']) {
					//AutoComplete_ShowDropdown(id);
					return true;
				}
				if(__AutoComplete[id]['dropdown'].childNodes.length!=0){
					AutoComplete_Highlight(id, -1);
					AutoComplete_ScrollCheck(id, -1);
					return false;
				}else{
					return true;
				}
                break;
            
            // Tab
            case 9:
                if (__AutoComplete[id]['isVisible']) {
                    AutoComplete_HideDropdown(id);
                }
                return;
            
            // Down arrow
            case 40:
				//alert(__AutoComplete[id]['dropdown'].childNodes.length);
				//alert(__AutoComplete[id]['dropdown'].childNodes.length);
				
				if (!__AutoComplete[id]['isVisible']) {
					//AutoComplete_ShowDropdown(id);
					return true;
				}
				if(__AutoComplete[id]['dropdown'].childNodes.length!=0){
					AutoComplete_Highlight(id, 1);
					AutoComplete_ScrollCheck(id, 1);
					return false;
				}else{
					return true;
				}
				
                break;
        }
    }


    /**
    * Function which handles the keyup event
    * 
    * @param string id    The form elements id. Used to identify the correct dropdown.
    */
    function AutoComplete_KeyUp(e,id)
    {
        // Mozilla
		if(!__AutoComplete[id]['IniCreateDropdown'])
			AutoComplete_CreateDropdown(id);
			
        var keyCode = e.keyCode;

        switch (keyCode) {
            case 13:
				//debugger;
				if(document.all)
	                e.returnValue = false
				else
					e.preventDefault();
                e.cancelBubble = true;
                break;

            case 27:	//escape
                AutoComplete_HideDropdown(id);
				if(document.all)
	                e.returnValue = false
				else
					e.preventDefault();
                e.cancelBubble = true;
                break;
            
            case 38:
            case 40:
                return false;
                break;

            default:
                AutoComplete_ShowDropdown(id,e);
				if(__AutoComplete[id]['KeydownResetValue'])
				{
					if(__AutoComplete[id]['Keyelement']!=null){
						for(i=0;i<=__AutoComplete[id]['Keyelement'].length-1;i++)
						{
							if(__AutoComplete[id]['Keyelement'][i]!=null)
								try{
									document.getElementById(__AutoComplete[id]['Keyelement'][i]).value='';}
								catch(e){
									document.getElementById(__AutoComplete[id]['Keyelement'][i]).innerHTML='';}
						}
					}
					//if(__AutoComplete[id]['SecondKeyelement']!=null)
//						try{
//							__AutoComplete[id]['SecondKeyelement'].value='';}
//						catch(e){
//							__AutoComplete[id]['SecondKeyelement'].innerHTML='';}
				}
                break;
        }
    }
    
    /**
    * Returns whether the dropdown is visible
    * 
    * @param string id    The form elements id. Used to identify the correct dropdown.
    */
    function AutoComplete_isVisible(id)
    {
        return __AutoComplete[id]['dropdown'].style.visibility == 'visible';
    }
	function getEvent(){     //同时兼容ie和ff的写法
         if(document.all)    return window.event;        
          func=getEvent.caller;            
         while(func!=null){    
             var arg0=func.arguments[0];
             if(arg0){
                 if((arg0.constructor==Event || arg0.constructor ==MouseEvent)
                     || (typeof(arg0)=="object" && arg0.preventDefault && arg0.stopPropagation)){    
                     return arg0;
                  }
              }
              func=func.caller;
          }
         return null;
   }
   
   var positionelement=null;
   function AutoComplete_relative(id)
   {
	   if(positionelement != null){
		  var  relativeObj=document.getElementById(positionelement);
		  if(relativeObj!=null){
			 if (isIE) {
				var left = __AutoComplete[id]['dropdown'].style.left;
		   		var top =  __AutoComplete[id]['dropdown'].style.top;
				left=left.substr(0,left.indexOf("px"))-AutoComplete_GetLeft(relativeObj);//relative.x;
				top=top.substr(0,top.indexOf("px")) -AutoComplete_GetTop(relativeObj);//relative.y;
				__AutoComplete[id]['dropdown'].style.left       = left + 'px';
				__AutoComplete[id]['dropdown'].style.top        = top + 'px';
				__AutoComplete[id]['iframe'].style.top    = __AutoComplete[id]['dropdown'].style.top;
				__AutoComplete[id]['iframe'].style.left   = __AutoComplete[id]['dropdown'].style.left;
        	}
			else{
			var relativeElement=getElementPos(__AutoComplete[id]['element']);
			var relative=getElementPos(relativeObj);
			left=relativeElement.x-relative.x;//AutoComplete_GetLeft(relativeObj);
		    top=relativeElement.y-relative.y+__AutoComplete[id]['element'].offsetHeight;
		   	__AutoComplete[id]['dropdown'].style.left       = left +"px" ;
			__AutoComplete[id]['dropdown'].style.top        = top  +"px";
			}
		  }
		}
	}
