var CitySelector=Class.create();

CitySelector.selectOptions = new Array("北京市","天津市","上海市","重庆市","广东省","广州市","清远市","佛山市","深圳市","湛江市","肇庆市","中山市","东莞市","韶关市","汕头市","珠海市","揭阳市","潮州市","惠州市","江门市","茂名市","梅州市","河源市","汕尾市","阳江市","云浮市","辽宁省","沈阳市","阜新市","盘锦市","抚顺市","营口市","大连市","葫芦岛市","鞍山市","丹东市","锦州市","朝阳市","辽阳市","本溪市","铁岭市","江苏省","南京市","徐州市","连云港市","盐城市","扬州市","泰州市","镇江市","南通市","常州市","无锡市","苏州市","淮安市","宿迁市","湖北省","武汉市","荆门市","荆州市","十堰市","随州市","襄樊市","宜昌市","孝感市","黄石市","恩施市","咸宁市","四川省","成都市","泸州市","达州市","广安市","广元市","乐山市","内江市","攀枝花市","遂宁市","宜宾市","自贡市","资阳市","眉山市","德阳市","绵阳市","雅安市","南充市","巴中市","陕西省","西安市","咸阳市","渭南市","延安市","宝鸡市","汉中市","铜川市","榆林市","商洛市","安康市","河北省","石家庄市","唐山市","秦皇岛市","承德市","廊坊市","张家口市","保定市","邢台市","邯郸市","沧州市","衡水市","山西省","太原市","长治市","大同市","晋城市","晋中市","临汾市","吕梁市","朔州市","忻州市","阳泉市","运城市","河南省","郑州市","洛阳市","平顶山市","许昌市","南阳市","驻马店市","周口市","商丘市","开封市","新乡市","三门峡市","濮阳市","信阳市","鹤壁市","安阳市","焦作市","漯河市","济源市","吉林省","长春市","吉林市","四平市","松原市","白城市","辽源市","通化市","白山市","黑龙江省","哈尔滨市","齐齐哈尔市","大庆市","牡丹江市","鹤岗市","绥化市","佳木斯市","黑河市","内蒙古自治区","呼和浩特市","锡林郭勒","兴安盟","通辽市","赤峰市","呼伦贝尔市","包头市","乌海市","山东省","济南市","聊城市","烟台市","威海市","青岛市","泰安市","莱芜市","济宁市","菏泽市","临沂市","德州市","淄博市","潍坊市","日照市","东营市","滨州市","枣庄市","安徽省","合肥市","芜湖市","黄山市","安庆市","蚌埠市","亳州市","巢湖市","池州市","滁州市","阜阳市","淮北市","六安市","马鞍山市","宿州市","铜陵市","宣城市","淮南市","浙江省","杭州市","绍兴市","宁波市","湖州市","嘉兴市","金华市","丽水市","温州市","台州市","衢州市","福建省","福州市","莆田市","南平市","厦门市","泉州市","漳州市","三明市","龙岩市","宁德市","湖南省","长沙市","张家界市","岳阳市","株洲市","郴州市","常德市","衡阳市","邵阳市","湘潭市","益阳市","湘西","怀化市","永州市","娄底市","广西壮族自治区","南宁市","桂林市","百色市","玉林市","钦州市","北海市","梧州市","柳州市","河池市","防城港市","贺州市","贵港市","江西省","南昌市","九江市","景德镇市","上饶市","鹰潭市","宜春市","萍乡市","赣州市","吉安市","抚州市","新余市","贵州省","贵阳市","六盘水市","遵义市","安顺市","毕节市","云南省","昆明市","玉溪市","个旧市","曲靖市","楚雄市","德宏市","迪庆","临沧市","怒江","思茅市","丽江市","西藏自治区","拉萨市","海南省","海口市","三亚市","琼海市","甘肃省","兰州市","酒泉市","天水市","宁夏回族自治区","银川市","青海省","西宁市","新疆维吾尔自治区","乌鲁木齐市","昌吉市","喀什市","特别行政区","香港","澳门","台湾省","台湾");

CitySelector.url = "http://suggest.mapbar.com/json/citySuggest.jsp";

CitySelector.processRequest = function (event)
{
	if (typeof(jsondata)=="object")
	{
		if (CitySelector.searchListViewer!=null)
		{
			Element.remove(CitySelector.searchListViewer);
		}
		var searchlist=document.createElement("div");
		Element.addClassName(searchlist,CitySelector.className);
		CitySelector.searchListViewer=searchlist;

		CitySelector.viewer.appendChild(searchlist);
	
		for(var i=0;i<jsondata.results.length;i++)
		{
			var span1=document.createElement("div");
			var text=document.createTextNode(jsondata.results[i].value);
			span1.appendChild(text);
			span1.setAttribute("type","city");
			span1.setAttribute("value",jsondata.results[i].value);
			searchlist.appendChild(span1);
		}
//		var position=Position.realOffset(CitySelector.currentInputer);
		var position=Position.cumulativeOffset(CitySelector.currentInputer);
		CitySelector.currentViewer=searchlist;
		CitySelector.currentViewer.style.left=position[0];
		CitySelector.currentViewer.style.top=position[1]+Element.getHeight(CitySelector.currentInputer);
	}
}

CitySelector.clickItem = function (event)
{
	if (this.currentCityList!=null)
	{
		Element.hide(CitySelector.currentCityList);
	}
	var eventObject=Event.element(event);
	if(eventObject.getAttribute("type")=="city")
	{
		this.currentInputer.value=eventObject.getAttribute("value");
		if (this.currentInputer.onchange)
		{
			this.currentInputer.onchange();
		}
		Element.hide(this.currentViewer);
	}
	if(eventObject.getAttribute("type")=="province")
	{
		var index=eventObject.getAttribute("index");
		this.currentCityList=document.getElementById(this.getListCityId(index));
		Element.show(this.currentCityList);
	}
}
CitySelector.MouseOverItem=function(event)
{
	CitySelector.isShow=true;
	if (CitySelector.currentItem)
	{
		CitySelector.currentItem.style.backgroundColor="#ffffff";
		CitySelector.currentItem.style.fontColor="#000000";
	}
	CitySelector.currentItem=event.srcElement;
	if (!CitySelector.currentItem)
	{
		CitySelector.currentItem=event.target;
	}
	if (CitySelector.currentItem&&(CitySelector.currentItem!=CitySelector.currentViewer))
	{
		CitySelector.currentItem.style.backgroundColor="#AAAAFF";
		CitySelector.currentItem.style.fontColor="#ffffff";
	}

}
CitySelector.MouseOutItem=function(event)
{
	CitySelector.isShow=false;
	if (CitySelector.currentItem)
	{
		CitySelector.currentItem.backgroundColor="#ffffff";
		CitySelector.currentItem.style.fontColor="#000000";
	}
}
CitySelector.init=function(viewer,className)
{
	CitySelector.viewer=viewer;
	CitySelector.className=className;
	CitySelector.listViewer=document.createElement("div");
	CitySelector.listViewer.setAttribute("id" , this.getListViewerId());
	CitySelector.viewer.appendChild(CitySelector.listViewer);
	Element.addClassName(CitySelector.listViewer,CitySelector.className);
	Event.observe(CitySelector.viewer, 'click', CitySelector.clickItem.bindAsEventListener(this), false);
	Event.observe(CitySelector.viewer, 'mouseover', CitySelector.MouseOverItem.bindAsEventListener(this), false);
	Event.observe(CitySelector.viewer, 'mouseout', CitySelector.MouseOutItem.bindAsEventListener(this), false);
	var provinceArray=new Array();
	for(var i=0;i<CitySelector.selectOptions.length;i++)
	{
		var strDisplay=CitySelector.selectOptions[i];
		if(!( strDisplay.indexOf("省") > 0 || strDisplay.indexOf("自治区") > 0 || strDisplay == "特别行政区"))
		{
			if (provinceArray[provinceArray.length-1]==null)
			{
				var span1=document.createElement("div");
				var text=document.createTextNode(strDisplay);
				span1.appendChild(text);
				span1.setAttribute("type","city");
				span1.setAttribute("value",strDisplay);
				this.listViewer.appendChild(span1);
			}
			else
			{
				provinceArray[provinceArray.length-1].citys[provinceArray[provinceArray.length-1].citys.length]=strDisplay;
			}
		}
		else
		{
			var province=new Object();
			province["name"]=strDisplay;
			province["citys"]=new Array();
			provinceArray[provinceArray.length]=province;
		}
	}
	provinceArray.sort(function sortRule(a,b) {	var x = a.name;	var y = b.name;	return x.localeCompare(y);});
	for(var i=0;i<provinceArray.length;i++)
	{
		provinceArray[i].citys.sort(function(x,y){return x.localeCompare(y);});
		var span=document.createElement("div");
		span.setAttribute("type","province");
		span.setAttribute("index",i);
		var text=document.createTextNode(provinceArray[i].name);
		span.appendChild(text);
		var city=document.createElement("div");
		city.setAttribute("id",this.getListCityId(i));
		span.appendChild(city);
		Element.hide(city);
		for(var j=0;j<provinceArray[i].citys.length;j++)
		{
			var span1=document.createElement("div");
			span1.setAttribute("value",provinceArray[i].citys[j]);
			var text=(j!=(provinceArray[i].citys.length-1))?document.createTextNode(" ├"+provinceArray[i].citys[j]):document.createTextNode(" └"+provinceArray[i].citys[j]);
			span1.appendChild(text);
			span1.setAttribute("type","city");
			city.appendChild(span1);
		}
		CitySelector.listViewer.appendChild(span);
	}
	CitySelector.listViewer.style.postion="absolute";
	Element.hide(CitySelector.listViewer);
}

CitySelector.getListViewerId = function ()
{
	return CitySelector.viewer.id+"_listViewer";
}

CitySelector.getListCityId = function (i)
{
	return CitySelector.viewer.id+"_index"+i;
}

CitySelector.prototype = {
	initialize : function (inputer)
	{
		this.inputer=inputer;
		Event.observe(inputer, 'click', this.showCityList.bindAsEventListener(this), false);
		Event.observe(inputer, 'keyup', this.searchCity.bindAsEventListener(this), false);		
		Event.observe(inputer, 'blur', this.hideViewer.bindAsEventListener(this), false);
	},
	showCityList : function (event)
	{
		if (CitySelector.currentViewer!=null)
		{
			Element.hide(CitySelector.currentViewer);
		}
		CitySelector.currentInputer=this.inputer;
		this.inputer.select();
		var position=Position.cumulativeOffset(this.inputer);
		CitySelector.currentViewer=CitySelector.listViewer;
		Element.show(CitySelector.listViewer);
		CitySelector.currentViewer.style.left=position[0];
		CitySelector.currentViewer.style.top=position[1]+this.inputer.offsetHeight;
	},

	searchCity : function (event)
	{
		CitySelector.currentInputer=this.inputer;
		if (CitySelector.currentCityList!=null)
		{
			Element.hide(CitySelector.currentCityList);
		}
		if (CitySelector.currentViewer!=null)
		{
			Element.hide(CitySelector.currentViewer);
		}
		if (this.inputer.value=="")
		{
			this.showCityList(event);
		}
		else
		{
			if (CitySelector.scriptElement!=null)
			{
				Element.remove(CitySelector.scriptElement);
			}
			delete(jsondata);
			var s = document.createElement("script");
			s.setAttribute("language", "javascript");
			s.setAttribute("type", "text/javascript");
			s.setAttribute("src", CitySelector.url+"?keyword=" + encodeURI(decodeURI(this.inputer.value)) + "&cache=" + Math.random());
			s.onload=s.onreadystatechange=CitySelector.processRequest;
			CitySelector.scriptElement=s;
			CitySelector.viewer.appendChild(s);
		}
	},
	
	hideViewer : function (event)
	{
		if(!CitySelector.isShow)
		{
			Element.hide(CitySelector.currentViewer);
		}
	}
}
