/*		
*使用jquery库，使用命名空间EY_W(也就是EY.widget)。


*调用：


*	var cityFrame1 = new EY_W.cityFrame.cityClass({comCitys : commoncitys, citys : citys, pageCount : 12});
*	cityFrame1.begin(id1, id2);
*	cityFrame1.begin(id3);
*
*
* param： 传入配置信息
*				 comCitys： 公共的城市，即（输入框为空时的值） 
*				 citys：输入中文或拼音搜索时的城市
*        pageCount: 最多可以显示多少个
*				 id1 id3: input的id
*				 id2：要输进数据的id
*				 如果配置信息一样，则不用重复构建对象


*
*	var cityFrame4 = new EY_W.cityFrame.cityClass({comCitys : destcitys, citys : city1, pageCount : 12, vacation : true});
*	cityFrame4.begin("setOut5");
* param： 传入配置信息
*         vacation为true时，则为度假的下拉框
*
*	var cityFrame5 = new EY_W.cityFrame.startCity("setOut6", startCitys);
* param： 度假的开始城市


*         

*/


//命名空间

(function(){
	if(typeof EY_W.cityFrame == 'undefined')
		EY_W.cityFrame = {};
	EY_W.cityFrame.ie6 = (!+"\v1") && /MSIE 6.0/.test(navigator.userAgent);
	var Class = {
			create : function(){
				return function(){
					this.initialize.apply(this, arguments);
				}
			},
			extend : function(destination, source){
				for(var key in source){
					destination[key] = source[key];
				}
				return destination;
			},
			getDom : function(str){
				return typeof str == "string" ? document.getElementById(str) : str;
			},
			bind : function(fun, thisp){
				return function(event){
					fun.call(thisp, event || window.event);
				}
			},
			trim : function(str){
				return str.replace(/^\s+/, "").replace(/\s+$/, "");
			},
			getPosition : function(e){
				var left =  0, top =  0;
				try{
					while(e.offsetParent){
						left += e.offsetLeft;
						top += e.offsetTop;
						e = e.offsetParent;
					}
				}catch(m){}
				left += e.offsetLeft; top += e.offsetTop;
				return {x: left,y: top};
			}
		}
		
	EY_W.cityFrame.cityClass = Class.create();
	EY_W.cityFrame.cityClass.prototype = {
		initialize : function(config){ //参数初始化

			this.obj = null;
			this.val = ""; //input里的值（两边已经去空格）
			this.sort = "拼音" //按什么排序

			this.pageCount = 12; //一页显示的对多个数
			this.disappear = true; //当为true时，标示失去焦点时下拉框不消失

			this.comCitys = null; //默认城市
			this.citys = null; //其余的城市

			this.vacation = null; //标示度假的查询

			this.outobj = null; //要出去的值，即表单要提交的值的对象
			this.defaultVal = "中文/拼音"; //input里默认的值

			this.defaultFunction = function(){}; //默认执行的函数

			Class.extend(this, config);
			this.defaultFunction(); //用于初始化时需要更改参数，此时可以使用此类里的方法
		},
		begin : function(inobj, outobj){ //定义出对象后，程序的出发接口
			if(!this.citys) return;
			function handle(e){ //事件句柄
				this.obj = iobj; this.outobj = tobj;
				this.obj.className = "IptIn";
				(this.obj.value == this.defaultVal) && (this.obj.value = "");
				this.appearFrame(e);
				//return false;
			}
			
			var iobj = Class.getDom(inobj);
				if(!iobj) return;
			var tobj = Class.getDom(outobj) || null;
			iobj.onclick = iobj.onkeyup = Class.bind(handle, this); //增加事件
			iobj.onblur = Class.bind(this.showSearch,this);
		},
		appearFrame : function(e){
			EY_W.cityFrame.frameObject.setWorkArea(this);
			if(!EY_W.cityFrame.$frame) EY_W.cityFrame.frameObject.createFrame();
			this.val = Class.trim(this.obj.value);
			if(this.vacation){
				if(!this.val){
					EY_W.cityFrame.$frame.style.display = "none";
					this.createVacaFrame(); //度假没选择时弹出下拉框
					this.setPosition(1);
					//var istr = EY_W.cityFrame.$frame.show().css("width", "360px").get(0).offsetHeight - 2 + 'px';
					EY_W.cityFrame.$vacaframe.style.display = "block";
					//EY_W.cityFrame.$frame.prepend('<iframe frameborder="0" style="position:absolute;top:0px;left:0px; width:100%; height:' + istr + ';z-index:-1 "></iframe>');
					return;
				}else{
					EY_W.cityFrame.$vacaframe && (EY_W.cityFrame.$vacaframe.style.display = "none");
				}
			}
			var code = e.keyCode || e.which;
			switch(code){
				case 37 :
						return;
						break;						
				case 38 :
						this.codeupWork();
						return;
						break;
				case 39 :
						return;
						break;			
				case 40 :
						this.codedownWork();
						return;
						break;
				case 13 :
						var item = 0,selectItem;
						while((++item) <= this.pageCount){
							obj = Class.getDom("frame_item_tr" + item);
							if(/selected/.test(obj.className)){
								selectItem = item;
								break;
							}
						}
						if(!item){return;break;}
						var obj = Class.getDom("frame_item_tr" + selectItem)
							tdObj = obj.getElementsByTagName("td");
						this.obj.value = tdObj[1].innerHTML;
						var code = tdObj[2].innerHTML;
						if(this.outobj)
							this.outobj.value = code;
						if(this.callback)
							this.callback(code);
						this.hideFrame();
						return;
						break;
			}
			this.prePage = []; this.lastPage = 0; this.currPage = 0; this.firstComPage = false;
			if(this.vacation){
				var str = this.createVacaHtml();		
			}else
				var str = this.createText();
			str = str.substring(0, str.length - 1);
			this.createTable(str.split(";"));
			var istr = EY_W.cityFrame.$frame; istr.style.width = "210px"; istr.style.display = "block";
			//this.setIframe(istr);
			EY_W.cityFrame.iframe && (EY_W.cityFrame.iframe.style.height = istr.offsetHeight - 1 + 'px');
			this.setPosition();
		},
		setIframe : function(){ //ie6 select bug
			if(EY_W.cityFrame.ie6){
				return '<iframe class="iframeFloor" id="iframeID"></iframe>';
			}else{
				return "";
			}
		},
		codeWork : function(){
			var item = 0, obj, selectItem = 0, itemLen = 0;
			while((++item) <= this.pageCount){
				obj = Class.getDom("frame_item_tr" + item);
				if(/selected/.test(obj.className)){
					selectItem = item;
				}
				if(!/mout/.test(obj.className)){
					break;
				}
				itemLen++;
			}
			return [selectItem,itemLen];
		},
		codeupWork : function(){
			var arr = this.codeWork()
				, selectItem = arr[0], itemLen = arr[1];
			Class.getDom("frame_item_tr" + selectItem).className = "mout";
			if(selectItem == 1){
				Class.getDom("frame_item_tr" + itemLen).className = "mout selected";
			}else{
				Class.getDom("frame_item_tr" + (selectItem - 1)).className = "mout selected";
			}
		},
		codedownWork : function(){
			var arr = this.codeWork()
				, selectItem = arr[0], itemLen = arr[1];
			Class.getDom("frame_item_tr" + selectItem).className = "mout";
			if(selectItem == itemLen){
				Class.getDom("frame_item_tr" + 1).className = "mout selected";
			}else{
				Class.getDom("frame_item_tr" + (selectItem + 1)).className = "mout selected";
			}
		},
		createText : function(direct){ //筛选符合条件的数据, direct==1就为上一步

			var val = this.val, str = "", hotspot, count = 0, symbol = false,leng;
			if(!val && (!direct||(direct == 1 && this.prePage.length == 1))){
				leng=this.comCitys.length;
				for(var i=0,len = leng < this.pageCount ? leng : this.pageCount; i<len; i++){
					var n = this.comCitys[i];
					str += n[2] + "," + n[1] + "," + n[0] + ";";
				}
				this.firstComPage = true;
				this.lastPage = 0;
				this.prePage.length = 0;
				return str;
			}else{
				if(val){
					val = val.toUpperCase();
					len = val.length;
				}else{
					hotspot = true;
				}
				var jl = this.currPage;
				for(var j= direct==1 ? this.prePage[this.prePage.length - 1] : this.lastPage,lent=this.citys.length; j < lent; j++){
					var n = this.citys[j];
					if(hotspot || (symbol = this.getLeftValue(n[0], len) == val) || n[1].toUpperCase().indexOf(val) != -1 || this.getLeftValue(n[2], len) == val || this.getLeftValue(n[3], len) == val){
						count++;
						if(count == 1) this.currPage = j;
						if(count == this.pageCount + 1){
							this.lastPage = j;
							break;
						}
						str += (symbol ? n[0] : n[2]) + "," + n[1] + "," + n[0] + ";";
					}
				}
				if(count != this.pageCount + 1)
					this.lastPage = 0;
				if(direct == -1){
					this.prePage.push(jl); //下一步

				}
				if(direct == 1){
					this.prePage.length = this.prePage.length - 1; //上一步

				}
				return str;
			}
		},
		createTable : function(arr){
			var val = this.val;
			var tabhtml = "";
			var mark = 1; //标志当前显示的页数

			var flag = false;
			var num = 0;
			var titleTd = Class.getDom("frame_title_td");
			if(!val){
				titleTd.innerHTML = '输入' + this.defaultVal + '或↑↓选择';
				this.addTable(arr);
			}else if(!arr || arr.length < 1 || !arr[0]){
		 		titleTd.innerHTML = '对不起，找不到：' + val;
				Class.getDom("frame_pre").style.visibility = "hidden";Class.getDom("frame_nex").style.visibility = "hidden";
			}else{	  	
				titleTd.innerHTML = val + '，按'+ this.sort +'排序';
				this.addTable(arr);
			}
		},
		addTable : function(arr){ //增加城市table
				var la="hidden",pr="hidden", item, dom, domTd;
				for(var i=0,len=arr.length; i<len; i++){
					item = arr[i].split(","); dom = Class.getDom("frame_item_tr" + (i + 1));
					if(!i)	dom.className = "mout selected";
					else dom.className = "mout";
					domTd = dom.getElementsByTagName("TD");
					domTd[0].innerHTML = item[0]; domTd[1].innerHTML = item[1]; domTd[2].innerHTML = item[2];
				}
				if(len < this.pageCount){
					for(var j=len; j< this.pageCount; j++)
						Class.getDom("frame_item_tr" + (j+1)).className = "hide";
				}
				if(!this.val){
					if(this.firstComPage){
						la = "visible";pr="hidden"; 
						this.firstComPage = false;
					}else{
						if(this.lastPage != 0) la = "visible"; else la="hidden";
						pr = "visible"; 
						if(this.prePage.length == 0) la="hidden";
					}
				}else {
					if(this.prePage.length != 0)	pr = "visible"; else pr="hidden";
					if(this.lastPage != 0) la = "visible"; else la="hidden"; 
				}
				Class.getDom("frame_pre").style.visibility = pr;
				Class.getDom("frame_nex").style.visibility = la;
		},
		getLeftValue : function(city, len){
			if(len > city.length || len < 0)
				len = city.length;
			return city.substring(0, len).toUpperCase();
		},
		hideFrame : function(e){
			if(EY_W.cityFrame.$frame){
				EY_W.cityFrame.frameObject.setWorkArea(null);
				EY_W.cityFrame.$frame.style.display = "none";
			}
			if(EY_W.cityFrame.$vacaframe)
				EY_W.cityFrame.$vacaframe.style.display = "none";
		},
		showSearch : function(){ //type为1则是blur
			this.obj.className = "Ipno";
			if(this.disappear){
				if(EY_W.cityFrame.$frame.style.display != "none"){
					var obj = this.codeWork();
					if(obj[1]){
						var obj = Class.getDom("frame_item_tr1")
							tdObj = obj.getElementsByTagName("td");
						this.obj.value = tdObj[1].innerHTML;
						var code = tdObj[2].innerHTML;
						if(this.outobj)
							this.outobj.value = code;
						if(this.callback)
							this.callback(code);
						this.hideFrame();
					}else{
						this.obj.value = this.defaultVal;
						this.obj.className = "Ipt";		
					}
				}
				this.hideFrame();
			}
			this.disappear = true;
		},
		setPosition : function(mark){
			var _this = this, obj;
			obj = mark ? EY_W.cityFrame.$vacaframe : EY_W.cityFrame.$frame;
			with(obj.style){
				left = Class.getPosition(_this.obj).x + "px";
				top = Class.getPosition(_this.obj).y + _this.obj.offsetHeight + "px";
			}
		},
		createVacaFrame : function(){
			if(!EY_W.cityFrame.$vacaframe)
				this.createVaca();
			var _this = this, obj = Class.getDom("vacaframeid");
			obj.onclick = function(even){
				even = even || window.event;
				var tar = even.target || even.srcElement;
				if(tar.tagName == "A"){
					_this.obj.value = tar.innerHTML;
					_this.outobj && (_this.outobj.value = tar.getAttrabute("param"));
					_this.obj.className = "IptIn";
					obj.style.display="none";
					_this.appearFrame(even);
					_this.obj.focus();
				} 
			};
			obj.onmousedown = function(even){
				even = even || window.event;
				var tar = even.target || even.srcElement;
				if(tar.tagName == "A"){
					_this.disappear = false;
				} 
			};
		},
		createVaca : function(){
			var str = "";
			str += '<div class="destinner">' +
			'<div class="tips">输入中文/拼音或在下列关键字中选择</div>' +
			'<dl class="inland"><dt>国内度假</dt>';
			$.each(this.comCitys.home,function(i, n){
					str += '<dd><a title="' + n[1] + '" param="' + n[0] + '" href="javascript:void(0);">' + n[1] + '</a></dd>';
			})
			str += '</dl>';
			
			str += '<dl class="brand"><dt>海外度假</dt>';
			$.each(this.comCitys.oversea,function(i, n){
					str += '<dd><a title="' + n[1] + '" param="' + n[0] + '" href="javascript:void(0);">' + n[1] + '</a></dd>';
			})
			/*str += '</dl>';
			
			str += '<dl style="width: 98%;"><dt>您的喜好</dt>';
			$.each(this.comCitys.like,function(i, n){
					str += '<dd><a title="' + n[1] + '" param="' + n[0] + '" href="javascript:void(0);">' + n[1] + '</a></dd>';
			})*/
			str += '</dl></div>';
			var ifa = document.createElement("div");
			ifa.id = "vacaframeid";
			ifa.style.width = "360px";
			document.body.appendChild(ifa);
			ifa.innerHTML = str;
			EY_W.cityFrame.$vacaframe = ifa;
		},
		//度假
		createVacaHtml : function(direct){
			var val = this.val, start = null;
			var str = "", len, hotspot= false, mark = [],_this = this;
			$.each(this.comCitys, function(i, m){
				$.each(m, function(i,n){
					if(n[1].toUpperCase().indexOf(val) != -1 || _this.getLeftValue(n[2], len) == val || _this.getLeftValue(n[3], len) == val){
						if(n[4])
							mark.push(n[4]);
					}
				});
			});
			val = val.toUpperCase();
			len = val.length;
			var count = 0;
			var jl = this.currPage;
			for(var j= direct==1 ? this.prePage[this.prePage.length - 1] : this.lastPage,lent=this.citys.length; j < lent; j++){
				var n = this.citys[j];
				if(n[1].toUpperCase().indexOf(val) != -1 || this.getLeftValue(n[2], len) == val || this.getLeftValue(n[3], len) == val || setArray(mark, n[4])){
					count++;
					if(count == 1) this.currPage = j;
					if(count == this.pageCount + 1){
						this.lastPage = j;
						break;
					}
					str += n[2] + "," + n[1] + "," + n[0] + ";";
				}
			}
			if(count != this.pageCount + 1)
				this.lastPage = 0;
			if(direct == -1){
				this.prePage.push(jl); //下一步

			}
			if(direct == 1) this.prePage.length = this.prePage.length - 1; //上一步


			return str;
			function setArray(arr, str){
				if(arr.length == 0 || !str){
					return false;
				}
				var result = false;
				$.each(arr, function(i,n){
					if(n == str){
						result = true;
						return false;
					}
				});
				return result;
			}		
		}
	}
EY_W.cityFrame.frameObject = {
		setWorkArea : function(_this){
			this.work = _this;
		},
		createFrame : function(){
			var obj = document.createElement("div"), str="", num = 1, preDom, nexDom;
			obj.id = "frameid";
			while(num <= this.work.pageCount){
				str += '<tr id="frame_item_tr'+ num +'"><td class="tdleft"></td><td class="tdright"></td><td class="hide"></td></tr>';
				num++;
			}
			obj.innerHTML = this.work.setIframe() + '<table border="0" cellspacing="0" cellpadding="0" width="100%">'+
							  '<tr height="13"><td colspan="2" class="hint" height="10" id="frame_title_td"></td><td class="hide"></td></tr>'+
							  '<tr height="2"><td colspan="2"></td><td class="hide"></td></tr>'+ str +
							  '<tr>'+
							     '<td height="10" class="tdMid" colspan="2">'+
								   '<a href="javascript:void(0)" id="frame_pre" class="frame_link">上一页</a>&nbsp;&nbsp;&nbsp;&nbsp;'+
								   '<a href="javascript:void(0)" id="frame_nex" class="frame_link">下一页</a>'+
								 '</td><td class="hide"></td>'+
							  '</tr>'+
							'</table>';
			document.body.appendChild(obj);
			EY_W.cityFrame.$frame = obj; preDom = Class.getDom("frame_pre"); nexDom = Class.getDom("frame_nex");
			EY_W.cityFrame.iframe = Class.getDom("iframeId");
			//this.work.setIframe(obj);
			this.addEvent(obj, preDom, nexDom);
		},
		addEvent : function(obj, preDom, nexDom){
			var _this = this, item;
			preDom.onclick = function(e){
				if(_this.work.vacation){
					var str = _this.work.createVacaHtml(1);		
				}else
					var str = _this.work.createText(1);
				str = str.substring(0, str.length - 1);
				_this.work.createTable(str.split(";"));
				var istr = EY_W.cityFrame.$frame; istr.style.width = "210px"; istr.style.display = "block";
				_this.work.setPosition();
				//_this.work.setIframe(istr);
				EY_W.cityFrame.iframe && (EY_W.cityFrame.iframe.style.height = istr.offsetHeight - 1 + 'px');
				_this.work.obj.focus();
			};
			nexDom.onclick = function(e){
				//var str = _this.work.createText(-1);
				if(_this.work.vacation){
					var str = _this.work.createVacaHtml(-1);		
				}else
					var str = _this.work.createText(-1);
				str = str.substring(0, str.length - 1);
				_this.work.createTable(str.split(";"));
				var istr = EY_W.cityFrame.$frame; istr.style.width = "210px"; istr.style.display = "block";
				_this.work.setPosition();
				EY_W.cityFrame.iframe && (EY_W.cityFrame.iframe.style.height = istr.offsetHeight - 1 + 'px');
				//_this.work.setIframe(istr);
				_this.work.obj.focus();
			};
			preDom.onmousedown = function(){_this.work.disappear = false;};
			nexDom.onmousedown = function(){_this.work.disappear = false;};
			//item事件
			for(var i=1; i<=_this.work.pageCount; i++){
				item = Class.getDom("frame_item_tr" + i);
				item.onmouseover = function(e){
					var o = this.getElementsByTagName("td");
					o[0].className = "tdleft mover";o[1].className = "tdright mover";
				};
				item.onmouseout = function(e){
					var o = this.getElementsByTagName("td");
					o[0].className = "tdleft";o[1].className = "tdright";
				};
				item.onclick = function(e){
						var o = this.getElementsByTagName("td");
						_this.work.obj.value = o[1].innerHTML;
						var code = o[2].innerHTML;
						if(_this.work.outobj)
							_this.work.outobj.value = code;
						if(_this.work.callback)
							_this.work.callback(code);
						_this.work.obj.focus();
						_this.work.obj.className = "IptIn";
						_this.work.hideFrame();					
				}
				item.onmousedown = function(){_this.work.disappear = false;};
			}
		}
}
	
EY_W.cityFrame.startCity = function(inobj,outobj, com){
			this.obj = typeof(inobj) == "string" ? document.getElementById(inobj) : inobj;
			this.outobj = typeof(outobj) == "string" ? document.getElementById(outobj) : outobj;
			this.disappear = true;
			this.$outobj = this.outobj || null;
			var _this = this;
			this.obj.onfocus= function(){
					_this.handle();
			};
			this.obj.onblur = function(e){
					_this.showSearch(this);
			}
			this.handle = function(){
				this.obj.className = "IptIn";
				if (this.obj.value == "中文/拼音") {
						this.obj.value = "";
				};
				if(!EY_W.cityFrame.$startFrame)
					this.createFrame();
				var _this = this;
				var str = "", n;
				str +=	'<div class="departures">'
				for(var i=0,len=com.length;i<len;i++){
					n = com[i];
					str += '<a title="' + n[1] + '" param="' + n[0] + '" href="javascript:void(0);">' + n[1] + '</a>';
				}
				str += '</div>';
				var obj = EY_W.cityFrame.$startFrame;
				obj.innerHTML = str;
				this.setPosition();
				//var istr = EY_W.cityFrame.$startFrame.css("width","90px").show().get(0).offsetHeight - 2 + 'px';
				obj.style.width = "90px";
				obj.style.display = "block";
				//EY_W.cityFrame.$startFrame.prepend('<iframe frameborder="0" style="position:absolute;top:0px;left:0px; width:100%; height:' + istr + ';z-index:-1 "></iframe>');
				obj.onclick = function(evn){
					evn = evn || window.event;
					var tag = evn.target || evn.srcElement;
					if(tag.tagName == "A"){
						_this.obj.value = tag.innerHTML;
						if(_this.$outobj)
							_this.$outobj.value = tag.getAttrbute("param");
						EY_W.cityFrame.$startFrame.style.display = "none";
					}
				};
				obj.onmousedown = function(evn){
					evn = evn || window.event;
					var tag = evn.target || evn.srcElement;
					if(tag.tagName == "A"){
						_this.disappear = false;
					}
				};
			};
			this.showSearch = function(obj){
				obj.className = "Ipno";
				if(this.disappear){
					if(this.obj.value == ""){
						obj.className = "Ipt";
						obj.value = "中文/拼音";
					}
					EY_W.cityFrame.$startFrame.style.display = "none";
				}
				this.disappear = true;
		};
		this.createFrame = function(){
			var obj;
			EY_W.cityFrame.$startFrame = obj = document.createElement("div");
			obj.id="startFrameid";
			document.body.appendChild(obj);
		};
		this.setPosition = function(){
			var _this = this, obj;
			obj = EY_W.cityFrame.$startFrame;
			with(obj.style){
				left = Class.getPosition(_this.obj).x + "px";
				top = Class.getPosition(_this.obj).y + _this.obj.offsetHeight + "px";
			}
		};

};
})()

