var who;
var ESC=27;
var TAB=9;
var ALT=18;
var UP=38;
var DOWN=40;
var LEFT=37;
var RIGHT=39;
var ENTER=13;
var SHIFT=16;
var lastKey=0;

var _lastsent,_timeout,_itemCount,_idletimer,_cursel,_target;
var _prevsel;
var _inputcode=null,_searchtype;
var _targetBG;
var _input=null;
var _numChoices;
//var sbHttp=null;
var _stop;
var _chars=1;
var _sboxwidth;
var _cmwidth;
var _smartUrl;
var _onFlag = false;
var _blankFalg = false;
var _changeModal = false;
var	_needle = '@';
var _nsep = '|';
var intvalue=1;

function keyDown(e){
	var pK=document.all?window.event.keyCode:e.which;
	var pK2=String.fromCharCode(pK).toLowerCase();
	lastKey=pK;
	if(who!=null){
		who(pK,pK2);
	}
}

function keysInit(callback){
	document.onkeydown=keyDown;
	who=callback;
	if(document.layers){
		document.captureEvents(Event.KEYPRESS);
	}
}

function noEnter(){
	return lastKey!=ENTER;
}
	
function sbNoEnter(){
	var v=(_stop==null||_stop!=true);
	_stop=false;
	return(v?true:noEnter());
}

function cancelSmartBox(){
	keysInit(null);
	if(!_changeModal&&_inputcode!=null && _inputcode.value!=null
        && _inputcode.value.length < 1){
		_setValue(0);
	}
	abortSmartBox();
	closeSmartBox();
	_input=null;
	_stop=false;
	if(_idletimer){
		clearInterval(_idletimer);
		_idletimer="";
	}
	_onFlag = false;
}
	
function abortSmartBox(){
//	if(sbHttp!=null){
//		if(sbHttp.inprogress){
//			sbHttp.cancelRequest();
//		}
//	}
}

function closeSmartBox(){
	if(_target!=null){
		_target.style.display="none";
		_target.innerHTML=""
	}
	if(_targetBG!=null){
		_targetBG.style.display="none"
	}
	_stop=true;
}
	
function initSmartBox(where,wherecode,searchtype,timeout,sbwidth,cmwidth){
	_inputcode=_input=null;
	
	cancelSmartBox();
	var body=document.getElementsByTagName("body")[0];
	_target=document.getElementById("smartbox");
	
	if(!_target){
		_target=document.createElement("div");
		_target.id="smartbox";
		_target.style.zIndex=51;
		_target.style.position="absolute";
		_target.style.display="none";
		_target.style.width=sbwidth;
		body.appendChild(_target);
	}
	_target.className= "smartboxResults";
	_targetBG=document.getElementById("smartboxBG");
	if(!_targetBG){
		_targetBG=document.createElement("iframe");
		_targetBG.id="smartboxBG";
		_targetBG.style.zIndex=50;
		_targetBG.setAttribute("scrolling","no");
		_targetBG.setAttribute("frameborder","0");
		_targetBG.style.position="absolute";
		_targetBG.style.display="none";
		body.appendChild(_targetBG);
	}
	if(isNaN(parseInt(sbwidth))){
		_sboxwidth=-1;
	}else{
		_sboxwidth=parseInt(sbwidth);
	}
	if(isNaN(parseInt(cmwidth))){
		_cmwidth=sbwidth;
	}else{
		_cmwidth=cmwidth;
	}

	keysInit(keypressed);
	_input=where;
	_inputcode=wherecode;
	_searchtype=searchtype;
	_lastsent="";
	_timeout=timeout;
	_onFlag = true;
	_blankFalg = false;
	_changeModal = false;
	
	//_input.autocomplete = 'off';
	_input.onblur = cancelSmartBox;
	if(_idletimer){
		clearInterval(_idletimer);
		_idletimer="";
	}
	_idletimer = setInterval( 'idle()', 10);

	var x=findPosX(where);
	var y=findPosY(where)+where.offsetHeight+1;
	_target.style.top=y+"px";
	_target.style.left=x+"px";
	_lastsent="";
	_cursel=-1;
	_prevsel=-1;
	_stop=false;

	
	
}
	
function _runSearch(input){
	if((_lastsent==_input.value)&&(_input.value.length>0)){
		return;
	}
	_inputcode.value="";
	if (_blankFalg && _input.value.length == 0){
		return;
	}
		
	if (_input.value.length == 0) _blankFalg = true;	
	else _blankFalg = false;
		
	_lastsent=_input.value;
	if(_target!=null&&_changeModal){
		_changeModal= false;
		_target.innerHTML=""
	}
    
	if (_searchtype == "cnair") {
    	if (_input.value.length>0) buffer = _getSmartboxResult(_lastsent,1);
    	else{ 
    		buffer = _getSmartboxResult(_lastsent,11);
    	}	
	}else if (_searchtype == "allair") {
    	if (_input.value.length>0) buffer = _getSmartboxResult(_lastsent,2);
    	else{
    		buffer = _getSmartboxResult(_lastsent,21);
    	}
	}else if (_searchtype == "cnhotel") {
    	if (_input.value.length>0) buffer = _getSmartboxResult(_lastsent,3);
    	else{
    		buffer = _getSmartboxResult(_lastsent,31);
    	}
	}else if (_searchtype == "allhotel") {
        buffer += "&s=4";
	}else if (_searchtype == "cntrip") {
    	if (_input.value.length>0) buffer = _getSmartboxResult(_lastsent,5);
    	else{ 
    		_changeModal=true;
            buffer = _getSmartboxResult(_lastsent,51);
    	}	
	}else if (_searchtype == "visa") {
    	if (_input.value.length>0) buffer = _getSmartboxResult(_lastsent,6);
    	else{ 
            buffer = _getSmartboxResult(_lastsent,61);
    	}	
	}else if (_searchtype == "prehotel") {
    	if (_input.value.length>0) buffer = _getSmartboxResult(_lastsent,7);
    	else{
    		_changeModal=true;
    		buffer = _getSmartboxResult(_lastsent,71);
    	}
	}else if (_searchtype == "country") {
    	if (_input.value.length>0) buffer = _getSmartboxResult(_lastsent,8);
    	else{
    		buffer = _getSmartboxResult(_lastsent,81);
    	}
	}else if (_searchtype == "hkhotel") {
    	if (_input.value.length>0) buffer = _getSmartboxResult(_lastsent,9);
    	else{
    		buffer = _getSmartboxResult(_lastsent,91);
    	}
	}
	
	try{
		_Callback(input,buffer);
	}catch(e){
		alert(e);
	}
}

function _Callback(input,rs){
	if(_input==input){
	if(!_changeModal){	
		_target.innerHTML=rs;
		var list=_getSmartboxList();
		if(list&&list.childNodes){
			_itemCount=list.childNodes.length;
		}else{
			_itemCount=0;
		}
		if(_itemCount>0){
			for(var i=0;i<list.childNodes.length;i++){
				li=list.childNodes[i];
				li.onmousedown=_sbMouseDown;
				li.onmouseover=_sbMouseOver;
				li.onmouseout=_sbMouseOut
			}
			_showChoices();
		}else{
			_inputcode.value="";
			_hideChoices();
		}
		_cursel=0;
		_prevsel=_cursel;
		selChoice(_cursel);
		setTimeout(function(){},6000);
	}else{
		_target.innerHTML=rs;
		var list=_getModalList();
		for(var i=0;i<list.childNodes.length;i++){
			var node=list.childNodes[i];
			if(node.nodeName=="A"){
				node.onmousedown=_cmMouseDown;
			}
		}
		_inputcode.value="";
		_showChoices();
	}
	}
}

function keypressed(keycode,keyvalue){
	switch(keycode){
		case LEFT:
		case UP:
			_cursel=_cursel-1;
			if(_cursel<0){
				_cursel=0;
			}
			selChoice(_cursel);
			break;
		case RIGHT:
		case DOWN:
			_cursel++;
			if(_cursel>=_itemCount){
				_cursel=_itemCount-1;
			}
			selChoice(_cursel);
			break;
		case ENTER:
			if(_itemCount>0){
				_setValue(_cursel);
				closeSmartBox();
			}
			break;
		case ESC:
			closeSmartBox();
			break;
		case TAB:
			if(_cursel>=0&&_cursel<_itemCount){
				_setValue(_cursel);
			}
	}
}

function getSbIndex(elem){
	var list=_getSmartboxList();
	var retIndex=0;
	if(list&&list.childNodes){
		for(var i=0;i<list.childNodes.length;i++){
			var item=list.childNodes[i];
			if(elem==item){
				retIndex=i;
				break;
			}
			var itemChildMatch=false;
			for(var j=0;j<item.childNodes.length;j++){
				if(elem==item.childNodes[j]){
					retIndex=i;
					itemChildMatch=true;
					break;
				}
			}
			if(itemChildMatch){
				break;
			}
		}
	}
	return retIndex;
}
	
function _sbMouseOut(event){
	var obj=event?event.target:this;
	_cursel=-1;
	selChoice(-1);
}
	
function _sbMouseDown(event){
	var obj=event?event.target:this;
	_cursel=getSbIndex(obj);
	_setValue(_cursel);
	closeSmartBox();
}
	
function _sbMouseOver(event){
	var obj=event?event.target:this;
	_cursel=getSbIndex(obj);
	selChoice(_cursel);
}

function _showChoices(){
	_target.style.display="inline";
	if(_sbShowBGIframe()){
		_targetBG.style.display="inline"
	}
	if (_changeModal){
		_target.className= "smartboxResultsB";
		_target.style.width=_cmwidth+"px";
	}else{
		_target.className= "smartboxResults";
		_target.style.width=_sboxwidth+"px";
	}
	_targetBG.style.width=_target.offsetWidth+"px";
	_targetBG.style.height=_target.offsetHeight+"px";
	_targetBG.style.top=_target.style.top;
	_targetBG.style.left=_target.style.left;
}

function _hideChoices(){
	_target.style.display="none";
	_targetBG.style.display="none"
}

function _getSmartboxList(){
	var ul;
	if(_target.childNodes){
		for(var i=0;i<_target.childNodes.length;i++){
			var node=_target.childNodes[i];
			if(node.nodeName=="UL"){
				ul=node;
				break;
			}
		}
	}
	return ul;
}
	

function _setValue(newi){
	if(newi<0){
		_lastsent="";
		try{
			_inputcode.value="";
		}catch(e){}
	}else{
		if(_itemCount>0){
			var list=_getSmartboxList();
			if(list==null||list.childNodes==null){
				return;
			}
			var selected=list.childNodes[newi];
			_inputcode.value=selected.id;
			
			var v = selected.innerHTML;
			_input.value = v.replace(/<span>.+?<\/span>/i,'');
			_input.blur();
		}
	}
}

function selChoice(newi){
	var list=_getSmartboxList();
	if(list&&list.childNodes&&list.childNodes.length>0){
		if(_prevsel>=0){
			var prev=list.childNodes[_prevsel];
			if(prev.className){
				prev.className=prev.className.replace(/ *smartboxItemHi/,"");
			}else{
				prev.className="";
			}
		}
		if(newi>=0){
			if(list.childNodes.length>0){
				var cur=list.childNodes[newi];
				cur.className=cur.className+" smartboxItemHi"
			}
			_prevsel=newi;
		}
	}
}

function idle(){
	if (!_onFlag ) return;
	_typer(_input);
}

function _typer(input){
	abortSmartBox();
	_runSearch(input);
}

function _sbShowBGIframe(){
	return(window.opera)?false:true
}

function _getModalList(){
	var div;
	if(_target.childNodes){
		for(var i=0;i<_target.childNodes.length;i++){
			var node=_target.childNodes[i];
			if(node.nodeName=="DIV"){
				div=node;
				break;
			}
		}
	}
	return div;
}

function _cmMouseDown(){
	_inputcode.value=this.id;
	var v = this.innerHTML;
	_input.value = v.replace(/<span>.+?<\/span>/i,'');
	_input.blur();
	closeSmartBox();
}

function _getSmartboxResult(where,s){
	var buffer;
	switch(s){
	case 1:
		return _getAirportResult(define_cn_airport_utf8,where)
		break;
	case 11:
		return _getAirportDefaultResult(define_cn_airport_utf8_default)
		break;
	case 2:
		return _getIntlAirportResult(define_global_airport_utf8,where)
		break;
	case 21:
		return _getIntlAirportDefaultResult(define_global_airport_utf8_default)
		break;
	case 3:
		return _getDmtcHotelResult(define_cn_hotel_utf8,where)
		break;
	case 31:	
		return _getHotelDefaultResult(define_cn_hotel_utf8_default)
		break;
	case 5:
		return _getVacationResult(define_vacation_utf8,where)
		break;
	case 51:	
		return _getVacationDefaultResult(define_vacation_utf8_default)
		break;
	case 6:
		return _getVisaResult(define_visa_utf8,where)
		break;
	case 61:	
		return _getVisaDefaultResult(define_visa_utf8_default)
		break;
	case 7:
		return _getDmtcHotelResult(define_cn_hotelpre_utf8,where);	
		break;
	case 71:
		return _getHotelpreDefaultResult(define_cn_hotelpre_utf8_default);	
		break;
	case 8:
		return _getCountryResult(define_country_utf8,where);	
		break;
	case 81:
		return _getCountryDefaultResult(define_country_utf8_default);	
		break;
	case 9:
		return _getDmtcHotelResult(define_hk_hotel_utf8,where);	
		break;
	case 91:
		return _getHotelDefaultResult(define_hk_hotel_utf8_default);	
		break;
	}
}


function _getHotelDefaultResult(c){
	var rs = c.split(_needle);
	var ret = '<ul>';
	for(var i=0;i<rs.length;i++){
		var r = rs[i].split(_nsep);
		ret += "<li id="+r[0]+">"+r[1]+"<span>("+r[2]+")</span></li>";
	}
	ret += '</ul>'; 
	return ret;
}

function _getHotelpreDefaultResult(c){
	return '<div>'+c+'</div>'; 
}

function _getDmtcHotelResult(c, w){
	var rs = _searchBoxResult(c,w);	
	var ret = '<ul>';
	for(var i=0;i<rs.length;i++){
		var r=rs[i].split(_nsep); 		
		ret += "<li id="+r[0]+">"+r[1]+"<span>("+r[2]+")</span></li>";
	}
	ret += '</ul>';
	return ret;
}

function _getAirportResult(c, w){
	var rs = _searchBoxResult(c,w);	
	var ret = '<ul>';
	for(var i=0;i<rs.length;i++){
		var r=rs[i].split(_nsep); 		
		ret += "<li id="+r[1]+">"+r[2]+"<span>("+r[3]+"),"+r[1]+"</span></li>";
	}
	ret += '</ul>';
	return ret;
}

function _getAirportDefaultResult(c){
	var rs = c.split(_needle);
	var ret = '<ul>';
	for(var i=0;i<rs.length;i++){
		var r = rs[i].split(_nsep);
		ret += "<li id="+r[1]+">"+r[2]+"<span>("+r[3]+"),"+r[1]+"</span></li>";
	}
	ret += '</ul>'; 
	return ret;
}

function _getIntlAirportResult(c, w){
	var rs = _searchBoxResult(c,w);	
	var ret = '<ul>';
	for(var i=0;i<rs.length;i++){
		var r=rs[i].split(_nsep); 		
		ret += "<li id="+r[6]+">"+r[1]+"<span>("+r[2]+"),"+r[6]+","+r[7]+"</span></li>";
	}
	ret += '</ul>';
	return ret;
}

function _getIntlAirportDefaultResult(c){
	var rs = c.split(_needle);
	var ret = '<ul>';
	for(var i=0;i<rs.length;i++){
		var r = rs[i].split(_nsep);
		ret += "<li id="+r[6]+">"+r[1]+"<span>("+r[2]+"),"+r[6]+","+r[7]+"</span></li>";
	}
	ret += '</ul>'; 
	return ret;
}

function _getVacationResult(c, w){
	var rs = _searchBoxResult(c,w);	
	var ret = '<ul>';
	for(var i=0;i<rs.length;i++){
		var r=rs[i].split(_nsep); 		
		ret += "<li id="+r[0]+">"+r[1]+"<span>("+r[2]+")</span></li>";
	}
	ret += '</ul>';
	return ret;
}

function _getVacationDefaultResult(c){
	return '<div>'+c+'</div>'; 
}

function _getVisaResult(c, w){
	var rs = _searchBoxResult(c,w);	
	var ret = '<ul>';
	for(var i=0;i<rs.length;i++){
		var r=rs[i].split(_nsep); 		
		ret += "<li id="+r[0]+">"+r[1]+"<span>("+r[2]+")</span></li>";
	}
	ret += '</ul>';
	return ret;
}

function _getVisaDefaultResult(c){
	var rs = c.split(_needle);
	var ret = '<ul>';
	for(var i=0;i<rs.length;i++){
		var r = rs[i].split(_nsep);
		ret += "<li id="+r[0]+">"+r[1]+"<span>("+r[2]+")</span></li>";
	}
	ret += '</ul>'; 
	return ret;
}

function _getCountryResult(c, w){
	var rs = _searchBoxResult(c,w);	
	var ret = '<ul>';
	for(var i=0;i<rs.length;i++){
		var r=rs[i].split(_nsep); 		
		ret += "<li id="+r[0]+">"+r[2]+"<span>("+r[1]+")</span></li>";
	}
	ret += '</ul>';
	return ret;
}
function _getCountryDefaultResult(c){
	var rs = c.split(_needle);
	var ret = '<ul>';
	for(var i=0;i<rs.length;i++){
		var r = rs[i].split(_nsep);
		ret += "<li id="+r[0]+">"+r[2]+"<span>("+r[1]+")</span></li>";
	}
	ret += '</ul>'; 
	return ret;
}


function _searchBoxResult(c,w){
	var ptr=0,n=0;
	var nflag,startpos,endpos,sbak,prestr,strChar,nxtstr,arrinfo;
	var rs=new Array();
	var s=c;
	var ww=w.toUpperCase();
	do {
		if (rs.length>10) break;
		nflag=null;
		startpos=0;
		endpos=0;
		sbak = s.toUpperCase();
		nflag = sbak.indexOf(ww);
		if (nflag>=0){
			prestr = s.substring(0, nflag);
			startpos = prestr.lastIndexOf(_needle);
			if (-1!=startpos){
				strChar = prestr.substr(startpos+1,prestr.length-startpos);   
				nxtstr = s.substr(nflag,s.length-nflag+1);
				endpos = nxtstr.indexOf(_needle);
				if (-1!=endpos){
					strChar += nxtstr.substr(0,endpos);   
					s = nxtstr.substr(endpos,nxtstr.length-endpos);
				}else {
					strChar += nxtstr;   
					s = '';
				}
				rs.push(strChar);
			}		
		}	
	}while(-1!=nflag)
	return rs;
}