﻿/**
 *  author:		Timothy Groves - http://www.brandspankingnew.net
 *	version:	1.2 - 2006-11-17
 *              1.3 - 2006-12-04
 *              2.0 - 2007-02-07
 *
 */

var useBSNns;
var g_Num=0;
var par=-1;
var src=null;
var beforeText="";//被追加的
var afterText="";//追加的
var canModify=false;
var inputArray=new Array(); 

if (useBSNns) {
	if (typeof(bsn) == "undefined")
		bsn = {}
	_bsn = bsn;
}
else {
	_bsn = this;
}


if (typeof(_bsn.Autosuggest) == "undefined")
	_bsn.Autosuggest = {}

_bsn.AutoSuggest = function (fldID, param)
{
	// no DOM - give up!
	//
	if (!document.getElementById)
		return false;
	
	// get field via DOM
	//
	this.fld = _bsn.DOM.getElement(fldID);

	if (!this.fld)
		return false;
	
	// init variables
	//
	this.sInput 		= "";
	/*if(this.nInputChars) */this.nInputChars 	= 0;
	this.aSuggestions 	= [];
	this.iHighlighted 	= 0;
	this.over = false;
	
	// parameters object
	//
	this.oP = (param) ? param : {};
	
	// defaults	
	//
	if (!this.oP.minchars)								this.oP.minchars = 1;
	if (!this.oP.method)									this.oP.meth = "get";
	if (!this.oP.varname)									this.oP.varname = "input"; //Name of variable passed to script holding current input.
	if (!this.oP.className)								this.oP.className = "autosuggest";
	if (!this.oP.timeout)									this.oP.timeout =500000;//Number of milliseconds before an AutoSuggest list closes itself.
	if (!this.oP.delay)										this.oP.delay = 500000;   // Number of milliseconds before an AutoSuggest AJAX request is fired
	if (!this.oP.offsety)									this.oP.offsety = 0;
	if (!this.oP.maxheight && this.oP.maxheight !== 0)		this.oP.maxheight = 350;
	if (!this.oP.cache && this.oP.cache != false)			this.oP.cache = true;
	if (!this.oP.shownoresults)						this.oP.shownoresults = true;
	if (!this.oP.noresults)								this.oP.noresults = "对不起,找不到'"+ this.fld.value + "'";
	if (!this.oP.focustime)		            this.oP.focustime=400;//出发城市与目标城市之间的提示时间间隔
	
	// set keyup handler for field
	// and prevent autocomplete from client
	//
	var pointer = this;
	
	// NOTE: not using addEventListener because UpArrow fired twice in Safari
	//_bsn.DOM.addEvent( this.fld, 'keyup', function(ev){ return pointer.onKeyPress(ev); } );
	//  
	this.fld.onkeypress 	= function(ev){ return pointer.onKeyPress(ev); }
	this.fld.onkeyup 		  = function(ev) { return pointer.onkeydown(ev); }
//	this.fld.onkeydown 		= function(ev)	 { return pointer.onKeyUp(ev); }
	this.fld.onfocus 		  = function(){ return pointer.onfocus(); }
	this.fld.onblur 		  = function(){ return pointer.onblur(); }
	this.fld.onclick 		  = function(ev){ return pointer.onclick(ev); }
    
    //新增通过鼠标的，删除和粘贴 0523
    this.fld.oncut= function(ev){return setTimeout(Input,10);}
    this.fld.onpaste= function(ev){return setTimeout(Input,10);}
     
	
	this.fld.setAttribute("autocomplete","off");
}

_bsn.AutoSuggest.prototype.onclick = function(ev)
{
  //  par=getFocusPos(ev);
   // alert(par);
    this.getParSuggestions(ev,false);
}

_bsn.AutoSuggest.prototype.onfocus = function()
{

   var val = this.fld.value;
   if(val && val.length >0) {//目标城市 朱木安注
    var m = /-$/i.exec(val);
	  if(m) {
	    val = "";
	  }
	}
  //if ( this.oP.local  ) { //&& !this.fld.value
   if(val == "")
     this.getSuggestions(val);/////重新输入
  //}
 
}

_bsn.AutoSuggest.prototype.onblur = function()
{
  //this.setHighlightedValue();	//Add part
	//if ( this.oP.local && this.fld.value.length ) {
		this.clearSuggestions();
    //this.fld.value = "";
  	//this.sInput = "";
  	//this.nInputChars = 0;
  //}
}

// 窗体拦截 keyDown的回车转化为 tab 按键后，无法获取回车按键
// 该部分，合并到 keyDown中处理！
//已经恢复回车按键功能
_bsn.AutoSuggest.prototype.onKeyPress = function(ev)
{
	var bubble = true;
	
	var key = (window.event) ? window.event.keyCode : ev.keyCode;

	// set responses to keydown events in the field
	// this allows the user to use the arrow keys to scroll through the results
	// ESCAPE clears the list
	// TAB sets the current highlighted value
	//
	var RETURN = 13;
	var TAB = 9;
	var ESC = 27;
	
	//alert( 'press' + key );
	switch(key) {
		case RETURN:
			this.setHighlightedValue();
			bubble = false;//需要判断光标是否在input中
			break;


		case ESC:
			this.clearSuggestions();
			break;
	}
	
	return bubble;
}

//入口点
_bsn.AutoSuggest.prototype.onKeyUp = function(ev)
{
 this.getParSuggestions(ev,true);
	return bubble; //2.0去掉分段查询 2009-01-20　zma 

	var key = (window.event) ? window.event.keyCode : ev.keyCode;
	  par=getFocusPos(ev);
	
	// set responses to keydown events in the field
	// this allows the user to use the arrow keys to scroll through the results
	// ESCAPE clears the list
	// TAB sets the current highlighted value
	//
	
	//////////////////////////////////////////////////////////////////////////////
//	var regu2;
//	var regu4;
//	if(location.href.toLowerCase().indexOf("hotel.aspx")<0)
//	{  
//	   // regu2=/\S+-\S+\s+/i.exec(this.fld.value);//朱木安
//	   // regu4=/\S+-\S+\s+\S+\s+\S+\s+/i.exec(this.fld.value);//朱木安
//	
//	    var regu2=/[a-zA-Z\u4e00-\u9fff]+[\s\-,;－]+[a-zA-Z\u4e00-\u9fff]+[\s\-,;]*[\-\d]+[ \-,;]*/i.exec(this.fld.value);
//		var regu4=/[a-zA-Z\u4e00-\u9fff]+[\s\-,;－]+[a-zA-Z\u4e00-\u9fff]+[\s\-,;]*[\-\d]+[ \-,;]*[a-zA-Z\u4e00-\u9fff]+[\s\-,;]*[\-\d]+/i.exec(this.fld.value);

//	 }
//    else
//    {//酒店     
//       regu2=/\S+\s+/i.exec(this.fld.value);//朱木安
//       regu4=/\S+\s+\S+\s+/i.exec(this.fld.value);//朱木安
//    }
//    //if(regu2==this.fld.value||regu4==this.fld.value)
//    if(regu2||regu4)
//    {//当光标回到日期输入框时，提示日期输入 朱木安
//       this.clearSuggestions();//收起智能提示
//	   setTimeout(function() { showCalendar('txWord',false,'txWord',null) },10);
//	 }         
//     else
//     {
//       ;//hideCalendar();
//     }
     /////////////////////////////////////////////////////////////////////////////
   
    var ENTER=13; 
	var ARRUP = 38;
	var ARRDN = 40;
	var INSERT=45;
	var Back=8;
	
	var bubble = true;
	//alert( 'up' + key );
	switch(key) {
	     case Back:
	     {//朱木安

            //删除内容开始
           
             if(getPosValue(par)==""){
               switch(par){
                 case 4: {  el("flightDate2").value="";} break;
                 case 3: {
                   el("txTo2").value=""; 
                   el("txTo2").title=""; 
                   if(getPosValue(4)=="")
                   { 
                      el("flightDate2").value="";  
                    }
                 
                 } break;
                 case 2: { 
                    if(getPosValue(4)=="")
                    { 
                      el("flightDate2").value="";  
                    }
                   if(getPosValue(3)=="")
                   {
                     el("txTo2").value=""; 
                      el("txTo2").title=""; 
                  }
                  el("flightDate").value="";                  
                  } break;
                 case 1: { 
                   if(getPosValue(4)=="")
                    { 
                      el("flightDate2").value="";  
                    }
                   if(getPosValue(3)=="")
                   {
                     el("txTo2").value=""; 
                      el("txTo2").title=""; 
                   }
                    if(getPosValue(2)=="")
                    {
                       el("flightDate").value="";         
                      
                    } 
                     el("txTo").value=""; 
                     el("txTo").title="";   
                  } break;
                 case 0: { 
                   if(getPosValue(4)=="")
                   { 
                      el("flightDate2").value="";  
                   }
                   if(getPosValue(3)=="")
                   {
                      el("txTo2").value=""; 
                      el("txTo2").title=""; 
                   }
                   if(getPosValue(2)=="")
                   {
                        el("flightDate").value="";         
                      
                   } 
                   if(getPosValue(1)=="")
                  {
                       el("txTo").value=""; 
                       el("txTo").title=""; 
                   }
                   el("txFrom").value=""; 
                   el("txFrom").title="";     
                  
                 } break;
               }
             } 
              //删除内容结束
	         this.getParSuggestions(ev,true);//根据段提示信息
	         Input(par);//检查手工输入
	        //this.getSuggestions(this.fld.value);
	      } break;  
//	    case INSERT:
//	    {
//	        _bsn.AutoSuggest.prototype.onselect(ev,true); //修改光标所在位置 朱木安加
//	        }
//	     break;  
	      
		case ARRUP:
			//this.changeHighlight(key);
			//bubble = false;
			break;


		case ARRDN:
			//this.changeHighlight(key);
			//bubble = false;
			break;
			
		case ENTER:
			break;	
			
		default:  //需要修改
		{ 
		   this.getParSuggestions(ev,true);
		   Input(par);//检查手工输入
		}
			break;
	}

	return bubble;
}

_bsn.AutoSuggest.prototype.onkeydown = function(ev)
{
	var key = (window.event) ? window.event.keyCode : ev.keyCode;
	
	// set responses to keydown events in the field
	// this allows the user to use the arrow keys to scroll through the results
	// ESCAPE clears the list
	// TAB sets the current highlighted value
	//

	var RETURN = 13;
	var TAB = 9;
	var ESC = 27;
	var ARRUP = 38;
	var ARRDN = 40;
	var SPACE = 32;
	var bubble = true;
	//el("testMsg").innerHTML = 'down' + key ;
	switch(key) {
		case RETURN:
			this.setHighlightedValue();
			bubble = false;
			break;


		case ESC:
			this.clearSuggestions();
			break;

		case ARRUP:
			this.changeHighlight(key);
			bubble = false;
			break;


		case ARRDN:
			this.changeHighlight(key);
			bubble = false;
			break;
			
		default:
		   this.getParSuggestions(ev,true);	
//		case SPACE:
//			this.clearSuggestions();
//			alert("showCalender");
//			break;
	}

	return bubble;
	/*
	var ARRUP = 38;
	var ARRDN = 40;
	
	var bubble = true;

	alert( 'down' + key );
	switch(key) {
		case ARRUP:
			this.changeHighlight(key);
			bubble = false;
			break;


		case ARRDN:
			this.changeHighlight(key);
			bubble = false;
			break;
	}

	return bubble;
	*/
}

//////////////////////////////////////////////////////////////////////////////////////
////////**********************修改输入开始********************////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//获取选择的内容
//author:朱木安
//
function getSelectText(ev)
{
		var obj=window.event?window.event.srcElement:ev.srcElement;
		var rngSel = document.selection.createRange();//建立选择域
		var rngTxt = obj.createTextRange();//建立文本域
		var flag = rngSel.getBookmark();//用选择域建立书签
		rngTxt.collapse();//瓦解文本域到开始位,以便使标志位移动
		rngTxt.moveToBookmark(flag);//使文本域移动到书签位
		rngTxt.moveStart('character',-obj.value.length);//获得文本域左侧文本
		//str = rngTxt.text.replace(/\r\n/g,'');//替换回车换行符
		return(rngTxt.text);//返回文本域文本,,,,,.length为长度

}


//中间修改后，将原尾部追加回去
//author:朱木安
//src为当前修改的部分，要等src.value不为空（修改完毕）才追加
function appendTxWord()
{
   if(src.value!="")
   {
      if(canModify==true)
      el("txWord").value=beforeText+afterText;
      canModify=false;
      //beforeText="";clearTimeout(this.apID); //0508加上
      if(this.apID) clearTimeout(this.apID); //0508加上
      clearTimeout(this.apID); //0508加上
   }
   else
   {
      if(this.apID) clearTimeout(this.apID); //0508加上
      this.apID=setTimeout("appendTxWord()",500);//修改未完成，半秒后再执行追加
    }
}

//根据光标用正则式获得当前光标所在的段
//返回值0(第一段，出发城市)
//返回值1(第二段，目的城市)
//返回值2(第三段，时间1)
//返回值3(第四段，目的城市2)
//返回值4(第五段，时间2)
//0，获取失败(或光标在起始位置)；-1光标在最未位置
function getFocusPos(ev)
{
return;// 还原2.0　2009-02-20 zma
   var key = (window.event) ? window.event.keyCode : ev.keyCode;
   if(x("rdHotel").checked)
   {//酒店
        SelectText=getSelectText(ev); // 将中文 － 替换为 西文 -;
       	var regCity=/[a-zA-Z\u4e00-\u9fff]+[\s,;]+/i.exec(SelectText);	
				var regDate1=/[a-zA-Z\u4e00-\u9fff]+[\s,;]+[\-\d]+[ \-,;]*[\s,;]/i.exec(SelectText);
				var regDate2=/[a-zA-Z\u4e00-\u9fff]+[\s,;]+[\-\d]+[ \-,;]*[\s,;]+[\-\d]+[ \-,;]*[\s,;]/i.exec(SelectText);
				var regNote=/[a-zA-Z\u4e00-\u9fff]+[\s,;]+[\-\d]+[ \-,;]*[\s,;]*[\-\d]+[\s,;]*[a-zA-Z\u4e00-\u9fff]+[\s,;]/i.exec(SelectText);

				if(regNote){  
						 beforeText=regNote.toString().replace(/\s+$/i,"");//去掉最后的空格; //日期2前面部	
//						  alert(beforeText);       
						 return 4;
				 }
				if(regDate2){
					 beforeText=regDate2.toString().replace(/\s+$/i,"");//去掉最后的空格;
//					  alert(beforeText);
					 return 3;
					}
				if(regDate1) 
				{ 
				   beforeText=regDate1.toString().replace(/\s+$/i,"");//去掉最后的空格
//				    alert(beforeText);
					   return 2;
					}
				       
				if(regCity)
				{
					 beforeText=regCity;
					 //alert(beforeText);
					 return 1;
				 }
				else{beforeText="";return 0;}
   }
  
   SelectText=getSelectText(ev).replace(/－/g,"-"); // 将中文 － 替换为 西文 -;
  
   if(SelectText=="") 
     return 0;
  	var regu1=/[a-zA-Z\u4e00-\u9fff]+[\s\-,;]+/i.exec(SelectText);	
	var regu2=/[a-zA-Z\u4e00-\u9fff]+[\s\-,;]+[a-zA-Z\u4e00-\u9fff]+[\d\s\-,;]/i.exec(SelectText);
	var regu3=/[a-zA-Z\u4e00-\u9fff]+[\s\-,;]+[a-zA-Z\u4e00-\u9fff]+[\d\s\-,;]+[\-\d]+[ \-,;]*[\s\,;]/i.exec(SelectText);
	var regu4=/[a-zA-Z\u4e00-\u9fff]+[\s\-,;]+[a-zA-Z\u4e00-\u9fff]+[\s\-,;]*[\-\d]+[ \-,;]*[a-zA-Z\u4e00-\u9fff]+[\s\-,;]*[\-\d]+/i.exec(SelectText);

	if(regu4){  
	     beforeText=regu4.toString().replace(/\s+$/i,"");//去掉最后的空格; //日期2前面部	       
	     return 4;
	 }
	if(regu3){
	   beforeText=regu3.toString().replace(/\s+$/i,"");//去掉最后的空格;
	   return 3;
    }
	if(regu2) 
	{
	   return 2;
	   beforeText=regu2.toString().replace(/\s+$/i,"");//去掉最后的空格
    }
	       
	if(regu1)
	{
	   beforeText=regu1;//去掉最后的空格
	   return 1;
	 }
	else{beforeText="";return 0;}
}

////根据修改用正则式获得当前修改的段
////返回值0(第一段，出发城市)
////返回值1(第二段，目的城市)
////返回值2(第三段，时间1)
////返回值3(第四段，目的城市2)
////返回值4(第五段，时间2)
////0，获取失败(或光标在起始位置)；-1光标在最未位置
//function getFocusPos(ev)
//{
//   //var key = (window.event) ? window.event.keyCode : ev.keyCode;
//   beforeText="";
//   if(inputArray=="")
//   {alert("inputArray");
//	   getInputArray();
//	   return 0;
//   }
//   oldInput=inputArray;
//   newInput= getInputArray();
//   
//   for(i=1;i<oldInput.length;i++){
//	   if(oldInput[i]==newInput[i]) {
//	     beforeText+=oldInput[i];
//	      if(i==1) 
//	        beforeText+="-";
//	      else 
//	        beforeText+=" ";
//	     }
//	   else
//	    return i-1;
//	}
//	return 0;
//}


//用正则式将输入分数组保存
function getInputArray()
{
   if(el("rdHotel").checked)
   {//酒店 (城市 日期 日期 要求)
      val=el("txWord").value
			var reg=/([a-zA-Z\u4e00-\u9fff]*)[\s\-,;]*([\-\d]*)[\s,;]*([\-\d]*)[\s\-,;]*([a-zA-Z\u4e00-\u9fff]*)/i.exec(val);
			if(reg)
				 inputArray=reg;
			return reg;
   }
   ///测试 朱木安
   val=el("txWord").value.replace(/－/g,"-"); // 将中文 － 替换为 西文 -
	var reg=/([a-zA-Z\u4e00-\u9fff]*)[\s\-,;]*([a-zA-Z\u4e00-\u9fff]*)[\s\-,;]*([\-\d]*)[ \-,;]*([a-zA-Z\u4e00-\u9fff]*)[\s\-,;]*([\-\d]*)/i.exec(val);
	if(reg)
	  inputArray=reg;
	return reg;
}


//用正则式获得当前光标所在的段
//0(第一段，出发城市)
//1(第二段，目的城市)
//2(第三段，时间1)
//3(第四段，目的城市2)
//4(第五段，时间2)
function getPosValue(pos)
{
   if(el("rdHotel").checked)
   {//酒店
      val=el("txWord").value;
		var reg=/([a-zA-Z\u4e00-\u9fff]*)[\s\-,;]*([\-\d]*)[\s,;]*([\-\d]*)[\s\-,;]*([a-zA-Z\u4e00-\u9fff]*)/i.exec(val);
			if(reg&&reg[pos+1])
		    return reg[pos+1];
		  else
		    return "";
   }
   ///测试 朱木安
    val=el("txWord").value.replace(/－/g,"-"); // 将中文 － 替换为 西文 -
	//var reg=/(\S+)-(\S*)\s*(\S*)\s*(\S*)\s*(\S*)/i.exec(el("txWord").value);
	 var reg=/([a-zA-Z\u4e00-\u9fff]*)[\s\-,;]*([a-zA-Z\u4e00-\u9fff]*)[\s\-,;]*([\-\d]*)[ \-,;]*([a-zA-Z\u4e00-\u9fff]*)[\s\-,;]*([\-\d]*)/i.exec(val);
	 if(reg&&reg[pos+1])
	 return reg[pos+1];
	 else
	 return "";
}

/////////////////////////////////////////////////////////////////////////
/////************* 根据光标位置获得提示************************/////////
//isShowSuggestions,是否显示提示
_bsn.AutoSuggest.prototype.getParSuggestions=function(ev,isShowSuggestions)
{
   //  par=getFocusPos(ev);//获得光标当前位置
     
	 if(par!=-1)//处于修改状态
     { //alert(getPosValue(par)); 
				 if(el("rdHotel").checked)
				 {//酒店
				// alert(par);
				  	if(par==1||par==2)
						{//提示日期
							this.clearSuggestions();
							var cf=document.getElementById("CalFrame");
							if ( cf != null )
							{
								 if(cf.style.display="none")
									 //showCalendar('txWord',false,'txWord',null);
										 setTimeout(function() { showCalendar('txWord',false,'txWord','flightDate') },10);
							}
						}
						else 
						{ 
							 var oldInput=inputArray.toString(); 
							 var newInput=getInputArray().toString();
		         
							 if((oldInput==newInput||oldInput==""||par==3)&&el("txWord").value!="")
									isShowSuggestions=false; //没有修改或提示完毕，不提示
							 if(isShowSuggestions)
									 this.getSuggestions(getPosValue(par)); 
							 //hideCalendar();         
						 }
				 }
				 else{
						if(par==2||par==4)
						{
							this.clearSuggestions();
							if(el("rdState")&&el("rdState").checked) //航班状态查询不用日期
							   return;
							var cf=document.getElementById("CalFrame");
							if ( cf != null )
							{
								 if(cf.style.display="none")
									 //showCalendar('txWord',false,'txWord',null);
										 setTimeout(function() { showCalendar('txWord',false,'txWord',null) },10);
							}
						}
						else 
						{ //getPosValue(par)
							 var oldInput=inputArray.toString(); 
							 var newInput=getInputArray().toString();
		         
							 if((oldInput==newInput||oldInput=="")&&el("txWord").value!="")
									isShowSuggestions=false; //没有修改，不提示
							 if(isShowSuggestions)
									 this.getSuggestions(getPosValue(par)); 
								//else
								 //  this.getSuggestions(""); 
								 //hideCalendar();         
						 }
					}
     }
     else
     { 
	    if(this.fld.value != "") this.getSuggestions(this.fld.value);
	    else
	    {
		    this.getSuggestions("");
		    
	    }
	}
}

/////////////////////////
//修改
function modify(par)
{
   if(el("rdHotel").checked){
   //酒店
    switch(par)
			 {
				 case 0: //出发城
				 {
						 canModify=true; 
						 src=el("txFrom");
						 afterText="";
						 if(el("flightDate").value!="")
						 {
								 afterText+=el("flightDate").value;//日期1
								 afterText+=" ";
								 afterText+=el("flightDate2").value;//日期2 
								 afterText+=" ";
								 afterText+=el("txTo").value;
							}
						 afterText=afterText.replace(/\s+$/i,"");//去掉空格
						 appendTxWord();
						 this.par=-1;       
				 }break;
				 case 1:
				{//日期1
					 canModify=true;  
					 src=el("flightDate");
					 afterText=""; 
					 afterText+=el("flightDate2").value;//日期2 
					 afterText+=" ";
					 afterText+=el("txTo").value;
					 afterText=afterText.replace(/\s+$/i,"");//去掉空格
					 appendTxWord();
					 //提示输入日期2
	       	 setTimeout(function() { showCalendar('txWord',false,'txWord','flightDate') },12);
					 if(this.apID) clearTimeout(this.apID); 
					 this.apID=setTimeout("appendTxWord()",580);      
				 }break;
				 case 2:
				 {//日期2
					  canModify=true;  
						src=el("flightDate2");
						src.value="";
						afterText=" "+el("txTo").value
		       	afterText=afterText.replace(/\s+$/i,"");//去掉空格
						appendTxWord();
						
				 }break;
				 default:return false;
			 }
   
   }
   else
   {
			 switch(par)
			 {
				 case 0: //出发城
				 {
						canModify=true; 
						 src=el("txFrom");
						// src.value="";
						 afterText="";
						 if(el("txTo").value!="")
						 {
								 afterText+=el("txTo").value;
								 afterText+=" ";
								 afterText+=el("flightDate").value;//日期1
								 afterText+=" ";
								 afterText+=el("txTo2").value;//目标城市2保存在title中
								 afterText+=" ";
								 afterText+=el("flightDate2").value;//日期2 
							}
						 afterText=afterText.replace(/\s+$/i,"");//去掉空格
						 appendTxWord();
						 this.par=-1;       
						// if(this.apID) clearTimeout(this.apID); //0508加上
						// this.apID=setTimeout("appendTxWord()",580);  
				 }break;
				 case 1:
				{
					 canModify=true;  
		           
									 //目标城市1后面部分
									 src=el("txTo");
								 //   src.value="";
									//  src.title="";
										afterText=""; 
									 afterText+=el("flightDate").value;//日期2 
									 afterText+=" ";
									 afterText+=el("txTo2").value;//目标城市2保存在title中
									 afterText+=" ";
									 afterText+=el("txTo2").value!=""?el("flightDate2").value:"";//日期2 
									 afterText=afterText.replace(/\s+$/i,"");//去掉空格
									 appendTxWord();
		                         
								 // if(this.apID) clearTimeout(this.apID); //0508加上
								 //  this.apID=setTimeout("appendTxWord()",580);
		             
				 }break;
				 case 2:
				 {//日期1
					 canModify=true;  
						src=el("flightDate");
						src.value="";
		       
					 //日期1后面部分

						 afterText=" "+el("txTo2").value+" "+el("flightDate2").value;//目标城市2保存在title中
						//日期2 
							 setTimeout(function() { showCalendar('txWord',false,'txWord',null) },10);
						 if(this.apID) clearTimeout(this.apID); //0508加上
						 this.apID=setTimeout("appendTxWord()",580);                

				 }break;
				 case 3:
				 {//目标城市2
						 canModify=true;  
							 //日期目标城市2后面部分 为日期2
					 src=el("txTo2");
					 // src.value="";
					 // src.title="";
					 afterText=" ";
					 //afterText+=el("txTo2").title;//目标城市2保存在title中
					 //afterText+=" ";
					 afterText+=el("flightDate2").value;//日期2 
					 afterText=afterText.replace(/\s+$/i,"");//去掉空格
					 appendTxWord();
					 //if(this.apID) clearTimeout(this.apID); //0508加上
						 // this.apID=setTimeout("appendTxWord()",580);      
				 }
				 case 4:
				 {
						canModify=true;  
						 setTimeout(function() { showCalendar('txWord',false,'txWord',null) },10);
			
				 }
				 default:return false;
			 }
   }
}

////////////////////////////////////////////////////////////////////////////////////////
///手工输入 par:当前输入的部分
//////////
function Input(par)
{
    getInputArray();
   if(el("rdHotel").checked){
   //酒店
			src=el("txFrom");
			src.value=inputArray[1];
			src.title=inputArray[1];

			src=el("flightDate");
			src.value=inputArray[2];
			
			src=el("flightDate2");
			src.value=inputArray[3];  
			   
			src=el("txTo"); //放要求
			 src.value=inputArray[4];
			 src.title=inputArray[4];          			 
   }
   else{
			src=el("txFrom");
			src.value=inputArray[1];
			src.title=inputArray[1];

			src=el("txTo");
			src.value=inputArray[2];
			src.title=inputArray[2];

			src=el("flightDate");
			src.value=inputArray[3];
	              
		  src=el("txTo2");
		  src.value=inputArray[4];
		  src.title=inputArray[4];
	          
			src=el("flightDate2");
			src.value=inputArray[5];
    }
   //以下是为情况输入
//   switch(par)
//   {
//     case 0: //出发城
//     {
//        src=el("txFrom");
//        src.value=inputArray[1];
//        src.title=inputArray[1];
//     }break;
//     case 1:
//     {
//        src=el("txTo");
//        src.value=inputArray[2];
//        src.title=inputArray[2];
//             
//     }break;
//     case 2:
//     {
//        src=el("flightDate");
//        src.value=inputArray[3];
//                 

//     }break;
//     case 3:
//     {//目标城市2
//         
//	     src=el("txTo2");
//	     src.value=inputArray[4];
//         src.title=inputArray[4];
//              
//     }
//     case 4:
//     {
//        src=el("flightDate2");
//        src.value=inputArray[5];
//     }
//   }
}




////////**********************修改输入结束********************////////////////////////
//////////////////////////////////////////////////////////////////////////////////////


_bsn.AutoSuggest.prototype.getSuggestions = function (val)
{
    var myscript=null;
	if(val && val.length >0) {
	  var m0=/([\u4e00-\u9fa5]+)-(\S*\s+)(\d+-\d+-\d+\s*)(\S*)/i.exec(val);//是否是目标城市2 朱木安加
	    if(m0)//朱木安加
	   {//朱木安加
	        //alert(m0);//朱木安加
	       val =m0[4];//提示目标城市2(第4节是目标城市2)
	    }//朱木安加
	    else
	   {
	      var m = /([\u4e00-\u9fa5]+)-(\S*)/i.exec(val);//目标城市1 朱木安注
	      if(m) {
	         val = m[2];
	   }}
	}
	else 
	if(this.fld.value==""&&location.href.toLowerCase().indexOf("hotel.aspx")< 0)
	{//出发城市朱木安
	     var fromCity="";//Get_Cookie("IPCity");
	     if(fromCity)
	    {
	       val=fromCity;
	       this.fillSuggestions(getCityObj(), val);//查找
	        val="";
	   
	        //自定义script，把IP城市加上
	      if(this.aSuggestions.length>0){ 
	         myscript= '{ results: ['        
	+ '{ id: "'+ this.aSuggestions[0].id + '", value: "'+this.aSuggestions[0].value+'", info:"'+this.aSuggestions[0].info+'" },'        
    + '{ id: "PEK", value: "Beijing", info: "北京" },'
    + '{ id: "SHA", value: "Shanghai", info: "上海" },'
    + '{ id: "SZX", value: "Shenzhen", info: "深圳" },'
    + '{ id: "CAN", value: "Guangzhou", info: "广州" },'
    + '{ id: "TAO", value: "Qingdao", info: "青岛" },'
    + '{ id: "CTU", value: "Chengdu", info: "成都" },'
    + '{ id: "HGH", value: "Hangzhou", info: "杭州" },'
    + '{ id: "WUH", value: "Wuhan", info: "武汉" },'
    + '{ id: "TSN", value: "Tianjin", info: "天津" },'
    + '{ id: "DLC", value: "Dalian", info: "大连" },'
    + '{ id: "XMN", value: "Xiamen", info: "厦门" },'
    + '{ id: "CKG", value: "Chongqing", info: "重庆" }] }';
         }
      }
	    //alert(this.aSuggestions.length);	
	}
	
	
	//if(el("debug")) el("debug").innerHTML = "<pre>" + "val=" + val + " " + debug(this.oP) + "</pre>";
	// if input stays the same, do nothing !this.oP.local && 
	//if ( val && val == this.sInput  )
	//	return false;
	
	// input length is less than the min required to trigger a request
	// reset input string
	// do nothing
	if ( !this.oP.local && val.length < this.oP.minchars ){
		this.sInput = "";
		return false; 
	}
	
	//if(this.fld.id!="txSendAddress"||this.fld.id!="txContactName")
	
	if(myscript!=null)
	  this.oP.script =myscript;
	  else
	  {
            if(val.length >= 1) {
              this.oP.script = getCityObj();//加载所有城市
            }
            else {
              this.oP.script = getPopCity();//加载最主要城市
            }
      }
	// if caching enabled, and user is typing (ie. length of input is increasing)
	// filter results out of aSuggestions from last request
	// 达到输入最小字符数时，开始查询，在字符不断被输入时，只需在缓冲中查询过滤，无须再次执行异步请求！
	//if (val.length > this.nInputChars && this.aSuggestions.length && this.oP.cache) {
	
	//朱木安 原为：if (val.length > this.nInputChars && this.aSuggestions.length) {改为:
	if (val.length >= this.nInputChars && this.aSuggestions.length) {
		//el("testMsg").innerHTML = "if : val.length=" + val.length + " nInputChars=" + this.nInputChars + " aSuggestions.length=" + this.aSuggestions.length;
		/*var arr = [];
		//判断val.length的长度(0,1,2,3,4),问题this.aSuggestions.length不是当前this.oP.script对应的城市数目
		for (var i=0;i<this.aSuggestions.length;i++) {
			if (this.aSuggestions[i].value.substr(0,val.length).toLowerCase() == val.toLowerCase())
				arr.push( this.aSuggestions[i] );
		  if (isCn(val) && this.aSuggestions[i].info.substr(0,val.length).toLowerCase() == val.toLowerCase())  //判断是中文
				arr.push( this.aSuggestions[i] );
			//if (this.aSuggestions[i].id.substr(0,val.length).toLowerCase() == val.toLowerCase() && (val.length==2 || val.length==3))
				//arr.push( this.aSuggestions[i] );
		}*/
		this.sInput = val;
		this.nInputChars = val.length;
		//this.aSuggestions = arr;
		//arr = null;//释放内存
		
			var pointer = this;
  		// 避免 中文输入时 重复调用
  		if( this.ajID ) clearTimeout(this.ajID);
  		var res = this.oP.script;
  		this.ajID = setTimeout( function() { pointer.fillSuggestions(res, val) }, this.oP.delay );
		
		/*if ( !this.aSuggestions.length ) 
		  this.over = true;	// 用户继续输入时，超出缓冲中缓存的匹配项！
		else
		  this.createList(this.aSuggestions);*/
		return false;
	}
	// do new request (this.oP.local && !val) ||  
	// local时，获得焦点、字符删减时都弹出
	// 否则，只在 第一次和 字符被删减，前次查询为空且不是输入超出缓冲匹配项时弹出。
	// 字符删减代表查询条件发生变化，如 用户输入错误，重新输入，输入超出缓冲项时，删除重新查询！
	else if ( !this.nInputChars || val.length < this.nInputChars || (!this.aSuggestions.length && !this.over) ) {
	  //el("testMsg").innerHTML = "else : val.length=" + val.length + " nInputChars=" + this.nInputChars + " aSuggestions.length=" + this.aSuggestions.length;
		this.over = false;
		// Get Local var
		if ( this.oP.local ) {
  		this.sInput = val;
  		this.nInputChars = val.length;

  		var pointer = this;
  		// 避免 中文输入时 重复调用
  		if( this.ajID ) clearTimeout(this.ajID);
  		var res = this.oP.script;
  		//if ( val.length <= this.nInputChars ) //删减字符时
    		//this.ajID = setTimeout( function() { pointer.fillSuggestions(res, "") }, this.oP.delay );		  
  		//else
  		if(this.ajID) clearTimeout(this.ajID); //0508加上
  		  this.ajID = setTimeout( function() { pointer.fillSuggestions(res, val) }, this.oP.delay );
		}
		else {	//永不执行
  		this.sInput = val;
  		this.nInputChars = val.length;
  
  
  		var pointer = this;
  		clearTimeout(this.ajID);
  		this.ajID = setTimeout( function() { pointer.doAjaxRequest() }, this.oP.delay );
  	}
	}

	this.nInputChars = val.length;
	
	return false;
}

_bsn.AutoSuggest.prototype.doAjaxRequest = function (){
	var pointer = this;
	
	// create ajax request
	var url = this.oP.script+this.oP.varname+"="+escape(this.fld.value);
	var meth = this.oP.meth;
	
	var onSuccessFunc = function (req) { pointer.setSuggestions(req) };
	var onErrorFunc = function (status) { alert("AJAX error: "+status); };

	var myAjax = new _bsn.Ajax();
	myAjax.makeRequest( url, meth, onSuccessFunc, onErrorFunc );
	myAjax = null;
}

_bsn.AutoSuggest.prototype.fillSuggestions = function (res, val){
	this.aSuggestions = [];
	
	if (this.oP.json) {	//恒为真
		var jsondata = res;
		if ( typeof(res) == 'string' )
			jsondata = eval('(' + res + ')');
		
		if ( jsondata.results ) { 
			for (var i=0;i<jsondata.results.length;i++) {
				this.aSuggestions.push(  { 'id':jsondata.results[i].id, 'value':jsondata.results[i].value, 'info':jsondata.results[i].info }  );
			}
		}
	}
	else {	//永不执行
		var xml = res;
	
		// traverse xml
		//
		var results = xml.getElementsByTagName('results')[0].childNodes;

		for (var i=0;i<results.length;i++){
			if (results[i].hasChildNodes())
				this.aSuggestions.push(  { 'id':results[i].getAttribute('id'), 'value':results[i].childNodes[0].nodeValue, 'info':results[i].getAttribute('info') }  );
		}	
	}
	
  this.idAs = "as_"+this.fld.id;
  
	if ( val ) {	//val不为空时,过滤匹配项
  	var arr = [];
  	for (var i=0;i<this.aSuggestions.length;i++) {
  		if (this.aSuggestions[i].value.substr(0,val.length).toLowerCase() == val.toLowerCase())
				arr.push( this.aSuggestions[i] );
		  else if (this.aSuggestions[i].id.substr(0,val.length).toLowerCase() == val.toLowerCase() && (val.length==2 || val.length==3))
				arr.push( this.aSuggestions[i] );
			if (isCn(val) && this.aSuggestions[i].info.substr(0,val.length).toLowerCase() == val.toLowerCase())  //判断是中文
				arr.push( this.aSuggestions[i] );				
  	}
  	
  	this.sInput = val;
  	this.nInputChars = val.length;
  	this.aSuggestions = arr;
  	arr = null;
  	
  	if ( !this.aSuggestions.length ) 
  	  this.over = true;
  	else
  	  this.createList(this.aSuggestions);
	}
	else	
	  this.createList(this.aSuggestions);
}


_bsn.AutoSuggest.prototype.setSuggestions = function (req)
{
	this.aSuggestions = [];
	
	if (this.oP.json){
		var jsondata = eval('(' + req.responseText + ')');
		
		for (var i=0;i<jsondata.results.length;i++) {
			this.aSuggestions.push(  { 'id':jsondata.results[i].id, 'value':jsondata.results[i].value, 'info':jsondata.results[i].info }  );
		}
	}
	else{
		var xml = req.responseXML;
	
		// traverse xml
		//
		var results = xml.getElementsByTagName('results')[0].childNodes;

		for (var i=0;i<results.length;i++) {
			if (results[i].hasChildNodes())
				this.aSuggestions.push(  { 'id':results[i].getAttribute('id'), 'value':results[i].childNodes[0].nodeValue, 'info':results[i].getAttribute('info') }  );
		}	
	}
	
	this.idAs = "as_"+this.fld.id;
	this.createList(this.aSuggestions);
}

_bsn.AutoSuggest.prototype.createList = function(arr)
{
	// no results
	//
	if (arr.length == 0 && !this.oP.shownoresults )
	  return;

	var pointer = this;
	
	
	// get rid of old list
	// and clear the list removal timeout
	//
	_bsn.DOM.removeElement(this.idAs);
	this.killTimeout();
	
	
	// create holding div
	//
	var div = _bsn.DOM.createElement("div", {id:this.idAs, className:this.oP.className});	
	
	var hcorner = _bsn.DOM.createElement("div", {className:"as_corner"});
	var hbar = _bsn.DOM.createElement("div", {className:"as_bar"});
	var header = _bsn.DOM.createElement("div", {className:"as_header"});
	var htitle = _bsn.DOM.createElement("div", {id:"as_title"}, getTitle(arr.length,this.fld));	//加标题
	
	header.appendChild(hcorner);
	header.appendChild(hbar);
	div.appendChild(header);
	div.appendChild(htitle);
	
	// create and populate ul
	//
	var ul = _bsn.DOM.createElement("ul", {id:"as_ul"});
	
	// loop throught arr of suggestions
	// creating an LI element for each suggestion
	//
	var hl = 0;
	for (var i=0;i<arr.length;i++) {
		// format output with the input enclosed in a EM element
		// (as HTML, not DOM)
		//
		var val = arr[i].value;	//英文时; 中文未处理
		var output = val;
		if ( this.sInput ) {
  		var st = val.toLowerCase().indexOf( this.sInput.toLowerCase() );
  		if ( st == 0 ) {
  		  if ( !hl && st == 0 )
  		    hl = i+1;
  		  output = val.substring(0,st) + "<em>" + val.substring(st, st+this.sInput.length) + "</em>" + val.substring(st+this.sInput.length);
  		}
		}
		else
		  hl = 1;
		
		var span 		= _bsn.DOM.createElement("span", {}, output, true);
		if (arr[i].info != ""){
			var br			= _bsn.DOM.createElement("br", {});
			//span.appendChild(br);
			//var small		= _bsn.DOM.createElement("small", {}, arr[i].info); // 	medium
			//span.appendChild(small);
		}
		var small		= _bsn.DOM.createElement("small", {}, arr[i].info); // 	medium
		
		var a 			= _bsn.DOM.createElement("a", { href:"javascript:" });
		
		var tl 		= _bsn.DOM.createElement("span", {className:"tl"}, " ");
		var tr 		= _bsn.DOM.createElement("span", {className:"tr"}, arr[i].id);
		a.appendChild(tl);
		a.appendChild(tr);
		
		a.appendChild(span);
		a.appendChild(small);//Add part
		
		a.name = i+1;
		a.onclick = function () { pointer.setHighlightedValue(); return false; }
		a.onmouseover = function () { pointer.setHighlight(this.name, false); }
		
		var li 			= _bsn.DOM.createElement(  "li", {}, a  );
		
		ul.appendChild( li );
	}
	
	// no results
	//
	if (arr.length == 0 && this.oP.shownoresults ) {
		var li = _bsn.DOM.createElement(  "li", {className:"as_warning"}, this.oP.noresults  );
		
		ul.appendChild( li );
	}
	
	
	div.appendChild( ul );
	
	// append footer
	var fcorner = _bsn.DOM.createElement("div", {className:"as_corner"});
	var fbar = _bsn.DOM.createElement("div", {className:"as_bar"});
	var footer = _bsn.DOM.createElement("div", {className:"as_footer"});
	footer.appendChild(fcorner);
	footer.appendChild(fbar);
	div.appendChild(footer);
	
	// get position of target textfield
	// position holding div below it
	// set width of holding div to width of field
	//
	var pos = _bsn.DOM.getPos(this.fld);
	//div.style.left 		= 0-pos.x + "px";
	div.style.left 		= pos.x + "px";

	div.style.top 		= ( pos.y + this.fld.offsetHeight + this.oP.offsety ) + "px";
	div.style.width 	= this.fld.offsetWidth <120?120: + this.fld.offsetWidth+"px"; //小于１２０px的加宽， zma 2009-02-20
	
	// set mouseover functions for div
	// when mouse pointer leaves div, set a timeout to remove the list after an interval
	// when mouse enters div, kill the timeout so the list won't be removed
	//
	div.onmouseover 	= function(){ pointer.killTimeout() }
	div.onmouseout 		= function(){ pointer.resetTimeout() }


	// add DIV to document
	//
	document.getElementsByTagName("body")[0].appendChild(div);
	
	var eT=0,eL=0,p=this.fld;
	var sT=document.body.scrollTop,sL=document.body.scrollLeft;
	var eH=p.offsetHeight;
	//while(p&&p.tagName!="BODY"){eT+=p.offsetTop;eL+=p.offsetLeft;p=p.offsetParent;}
	eT = pos.y; eL = pos.x;
	var margin = document.body.clientHeight-(eT-sT)-eH - this.oP.offsety;
	
	var ele = _bsn.DOM.getElement(this.idAs);
	
	//已屏蔽自动判断高度
	/*if (margin < ele.offsetHeight) { 
	  ele.style.backgroundImage = "url(images/as_pointer_top.gif)";
	  ele.style.top = eT- ele.offsetHeight-this.oP.offsety + "px";
	  ele.style.padding= "0 0 10px 0";
	  ele.style.backgroundPosition = "bottom";
	}*/
	
	div.style.left 		= pos.x + "px";
	// currently no item is highlighted
	//
	//this.iHighlighted = 0;
	
	// remove list after an interval
	//
	var pointer = this;
	if(this.toID) clearTimeout(this.toID); //0508加上
 	this.toID = setTimeout(function () { pointer.clearSuggestions() }, this.oP.timeout);
//alert("clearSuggestions()");
	if ( hl )
	  this.setHighlight( hl, true );	
	//alert(div.innerHTML);
}

_bsn.AutoSuggest.prototype.changeHighlight = function(key)
{	
	var list = _bsn.DOM.getElement("as_ul");
	if (!list)
		return false;
	
	var n;

	if (key == 40)
		n = this.iHighlighted + 1;
	else if (key == 38)
		n = this.iHighlighted - 1;
	
	
	if (n > list.childNodes.length)
		n = list.childNodes.length;
	if (n < 1)
		n = 1;
	
	this.setHighlight(n, false);
}

_bsn.AutoSuggest.prototype.setHighlight = function(n, tm)
{
	var list = _bsn.DOM.getElement("as_ul");
	if (!list)
		return false;
	
	if (this.iHighlighted > 0)
		this.clearHighlight();
	
	this.iHighlighted = Number(n);
	
	list.childNodes[this.iHighlighted-1].className = "as_highlight";

	if ( !tm )
	  this.killTimeout();
}


_bsn.AutoSuggest.prototype.clearHighlight = function()
{
	var list = _bsn.DOM.getElement("as_ul");
	if (!list)
		return false;
	
	if (this.iHighlighted > 0) {
		if(list.childNodes[this.iHighlighted-1]) list.childNodes[this.iHighlighted-1].className = "";
		this.iHighlighted = 0;
	}
}



//选定Value
_bsn.AutoSuggest.prototype.setHighlightedValue = function ()
{ 	
			//alert(
	    this.fld.value = this.aSuggestions[ this.iHighlighted-1 ].info;
	    this.fld.title = this.aSuggestions[ this.iHighlighted-1 ].id;//保存以备修改 朱木安

	  this.sInput = this.aSuggestions[ this.iHighlighted-1 ].info;
	  
		this.nInputChars = this.sInput.length;
	
}


_bsn.AutoSuggest.prototype.killTimeout = function()
{
	if( this.ajID ) clearTimeout(this.ajID);
	if( this.toID ) clearTimeout(this.toID);
}

_bsn.AutoSuggest.prototype.resetTimeout = function()
{
	clearTimeout(this.toID);
	var pointer = this;
	this.toID = setTimeout(function () { pointer.clearSuggestions() }, 5000);
}

_bsn.AutoSuggest.prototype.clearSuggestions = function ()
{
	this.killTimeout();
	
	var ele = _bsn.DOM.getElement(this.idAs);
	var pointer = this;
	if (ele){
		//var fade = new _bsn.Fader(ele,1,0,0,function () { _bsn.DOM.removeElement(pointer.idAs) });
	  var fade = new _bsn.Fader(ele,1,0,250,function () { _bsn.DOM.removeElement(pointer.idAs) });

	}
}


// AJAX PROTOTYPE _____________________________________________


if (typeof(_bsn.Ajax) == "undefined")
	_bsn.Ajax = {}


_bsn.Ajax = function ()
{
	this.req = {};
	this.isIE = false;
}


_bsn.Ajax.prototype.makeRequest = function (url, meth, onComp, onErr)
{	
	if (meth != "POST")
		meth = "GET";
	
	this.onComplete = onComp;
	this.onError = onErr;
	
	var pointer = this;
	 
	// branch for native XMLHttpRequest object
	if (window.XMLHttpRequest) {
		if(!this.req) this.req = new XMLHttpRequest();
		this.req.onreadystatechange = function () { pointer.processReqChange() };
		this.req.open("GET", url, true); //
		this.req.send(null);
	// branch for IE/Windows ActiveX version
	}
	else if (window.ActiveXObject) {
		if(!this.req) this.req = new ActiveXObject("Microsoft.XMLHTTP");
		if (this.req){
			this.req.onreadystatechange = function () { pointer.processReqChange() };
			this.req.open(meth, url, true);
			this.req.send();
		}
	}
}

_bsn.Ajax.prototype.processReqChange = function()
{
	
	// only if req shows "loaded"
	if (this.req.readyState == 4) {
		// only if "OK"
		if (this.req.status == 200){
			this.onComplete( this.req );
		} else {
			this.onError( this.req.status );
		}
	}
}


// DOM PROTOTYPE _____________________________________________
if (typeof(_bsn.DOM) == "undefined")
	_bsn.DOM = {}

_bsn.DOM.createElement = function ( type, attr, cont, html )
{
	var ne = document.createElement( type );
	if (!ne)
		return false;
		
	for (var a in attr)
		ne[a] = attr[a];
		
	if (typeof(cont) == "string" && !html)
		ne.appendChild( document.createTextNode(cont) );
	else if (typeof(cont) == "string" && html)
		ne.innerHTML = cont;
	else if (typeof(cont) == "object")
		ne.appendChild( cont );

	return ne;
}

_bsn.DOM.clearElement = function ( id )
{
	var ele = this.getElement( id );
	
	if (!ele)
		return false;
	
	while (ele.childNodes.length)
		ele.removeChild( ele.childNodes[0] );
	
	return true;
}


_bsn.DOM.removeElement = function ( ele )
{
	var e = this.getElement(ele);
	
	if (!e)
		return false;
	else if (e.parentNode.removeChild(e))
		return true;
	else
		return false;
}


_bsn.DOM.replaceContent = function ( id, cont, html )
{
	var ele = this.getElement( id );
	
	if (!ele)
		return false;
	
	this.clearElement( ele );
	
	if (typeof(cont) == "string" && !html)
		ele.appendChild( document.createTextNode(cont) );
	else if (typeof(cont) == "string" && html)
		ele.innerHTML = cont;
	else if (typeof(cont) == "object")
		ele.appendChild( cont );
}


_bsn.DOM.getElement = function ( ele )
{
	if (typeof(ele) == "undefined"){
		return false;
	}
	else if (typeof(ele) == "string")
	{
		var re = document.getElementById( ele );
		if (!re)
			return false;
		else if (typeof(re.appendChild) != "undefined" ) {
			return re;
		} else {
			return false;
		}
	}
	else if (typeof(ele.appendChild) != "undefined")
		return ele;
	else
		return false;
}

_bsn.DOM.appendChildren = function ( id, arr )
{
	var ele = this.getElement( id );
	
	if (!ele)
		return false;
	
	
	if (typeof(arr) != "object")
		return false;
		
	for (var i=0;i<arr.length;i++)
	{
		var cont = arr[i];
		if (typeof(cont) == "string")
			ele.appendChild( document.createTextNode(cont) );
		else if (typeof(cont) == "object")
			ele.appendChild( cont );
	}
}

_bsn.DOM.getPos = function ( ele )
{
	var ele = this.getElement(ele);

	var obj = ele;

	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft;
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;


	var obj = ele;
	
	var curtop = 0;
	if (obj.offsetParent) {
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop;
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;

	return {x:curleft, y:curtop}
}


// FADER PROTOTYPE _____________________________________________

if (typeof(_bsn.Fader) == "undefined")
	_bsn.Fader = {}

_bsn.Fader = function (ele, from, to, fadetime, callback)
{	
	if (!ele)
		return false;
	
	this.ele = ele;
	
	this.from = from;
	this.to = to;
	
	this.callback = callback;
	
	this.nDur = fadetime;
		
	this.nInt = 50;
	this.nTime = 0;
	
	var p = this;
	this.nID = setInterval(function() { p._fade() }, this.nInt);
}

_bsn.Fader.prototype._fade = function()
{
	this.nTime += this.nInt;
	
	var ieop = Math.round( this._tween(this.nTime, this.from, this.to, this.nDur) * 100 );
	var op = ieop / 100;
	
	if (this.ele.filters) // internet explorer
	{
		try {
			this.ele.filters.item("DXImageTransform.Microsoft.Alpha").opacity = ieop;
		} catch (e) { 
			// If it is not set initially, the browser will throw an error.  This will set it if it is not set yet.
			this.ele.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity='+ieop+')';
		}
	}
	else // other browsers
	{
		this.ele.style.opacity = op;
	}
	
	
	if (this.nTime == this.nDur){
		clearInterval( this.nID );
		if (this.callback != undefined)
			this.callback();
	}
}

_bsn.Fader.prototype._tween = function(t,b,c,d)
{
	return b + ( (c-b) * (t/d) );
}
function x( id ) {
	var ctl = document.getElementById( id + '_ID' );
	if ( ctl )
	  ctl = document.getElementById( ctl.value );
	else
	  ctl = document.getElementById( id );
	  
	return ctl;	
}
