/**
 * @author youyeelu
 * 此地址选择器必须在QZFL的支持下运行
 */
if(!QZONE){
	QZONE = {};
}

if(!QZONE.widget){
	QZONE.widget = {};
}

QZONE.widget.addressSelector = {
	IMGCACHE_DOMAIN: "http://imgcache.qq.com/",
	
	/**
	 * 创建一个addressSelector
	 * @param {HTMLElement} c 装载地址选择器的容器
	 * @param {int} mode 所使用的模式
	 * @param {Array} names 各个城市的名字
	 * @return {addressSelectorObject} 实例化后的地址选择器
	 */
	create: function(c, mode, names){
		if(!document.getElementById("countries_data")){
			var s = document.createElement("script");
			s.type = "text/javascript";
			s.charset = "utf-8";
			s.src = "/qzone/address/country.js";
			s.id = "countries_data";
			document.body.appendChild(s);
		}
		var re =  new QZONE.widget.addressSelectorObject(QZONE.widget.addressSelector._instances.length, c, mode, names);
		QZONE.widget.addressSelector._instances.push(re);
		return re;
	},
	
	/**
	 * 设置省份（州）的数据源
	 * @param {Select} slt 需要被设置的select对象
	 * @param {Array} dataProvider 数据源
	 */ 
	setStateDataProvider: function(slt, dataProvider){
		slt.options.length = 0;
		dataProvider[0][0] = QZONE.widget.addressSelector.STATE_DEFAULT;
		for(var i=0; i<dataProvider.length; i++){
			var o = new Option(dataProvider[i][0], dataProvider[i][1]);
			slt.options.add(o);
		}
		
		if(dataProvider.length <= 1){
			slt.disabled = true;
		} else {
			slt.disabled = false;
		}
	},
	
	/**
	 * 设置城市的数据源
	 * @param {HTMLElement} slt 需要被设置的对象
	 * @param {Array} dataProvider 数据源
	 */
	setCityDataProvider: function(slt, dataProvider){
		slt.options.length = 0;
		dataProvider[0][0] = QZONE.widget.addressSelector.CITY_DEFAULT;
		for(var i=0; i<dataProvider.length; i++){
			var o = new Option(dataProvider[i][0], dataProvider[i][1]);
			slt.options.add(o);
		}
		if(dataProvider.length <= 1){
			slt.disabled = true;
		} else {
			slt.disabled = false;
		}
	},
	
	/**
	 * 设置select的值
	 * @param {Select} slt 需要被设置的select
	 * @param {String} value 所对应的值
	 * @return {Boolean} 返回是否设置成功
	 */
	setSelectValue: function(slt, value){
		for(var i=0; i<slt.options.length; i++){
			if(slt.options[i].value.toString() == value.toString()){
				slt.selectedIndex = i;
				return true;
			}
		}
		return false;
	},
	
	/**
	 * 设置select的文本值
	 * @param {Select} slt 需要被设置select
	 * @param {String} text 需要显示的值
	 */
	setSelectText: function(slt, text){
		for(var i=0; i<slt.options.length; i++){
			if(slt.options[i].text.toString() == text.toString()){
				slt.selectedIndex = i;
				return true;
			}
		}
		return false;
	},
	
	//地址缓存器
	_address: {
		country: null,
		state: []
	},
	
	_instances:[]
}

/**
 * 创建一个地址选择器实例
 * @param {String} id 实例的id
 * @param {HTMLElement} c 装载实例的容器
 * @param {int} mode 模式
 * @constructor
 * @see QZONE.widget.addressSelectorObject
 */
QZONE.widget.addressSelectorObject = function(id, c, mode, names){
	this._id = id;
	this._self = c;
	
	var _s = this;
	
	//当选择改变时，会尝试调用此方法
	this.onChange = null;
	
	this._onChange = function(){
		if(typeof(_s.onChange) == "function"){
			_s.onChange();
		}
	}
	
	this.defaultCountry = "中国";
	
	this.country_slt = document.createElement("select");
	this.country_slt.id = "addslt_c_" + id;
	this.country_slt.style.width = "120px";
	
	this.state_slt = document.createElement("select");
	this.state_slt.id = "addslt_s_" + id;
	this.state_slt.style.width = "75px";
	
	this.city_slt = document.createElement("select");
	this.city_slt.id = "addslt_cty_" + id;
	this.city_slt.style.width = "75px";
	
	//如果names参数存在并且个数正确的话，会为每个slt设置name属性
	if(typeof(names) != "undefined" && names.length >= 3){
		this.country_slt.name = names[0];
		this.state_slt.name = names[1];
		this.city_slt.name = names[2];
	}	
	
	c.appendChild(this.country_slt);
	this.cl = document.createElement("label");
	this.cl.appendChild(document.createTextNode("    "));
	//this.cl.htmlFor = "addslt_c_" + id;
	c.appendChild(this.cl);
	
	if (typeof(mode) != "undefined") {
		c.appendChild(document.createElement("br"));
		c.appendChild(document.createElement("br"));
	}
	
	c.appendChild(this.state_slt);
	this.sl = document.createElement("label");
	this.sl.appendChild(document.createTextNode("    "));
	//this.sl.htmlFor = "addslt_s_" + id;
	c.appendChild(this.sl);
	
	c.appendChild(this.city_slt);
	this.ctl = document.createElement("label");
	this.ctl.appendChild(document.createTextNode("    "));
	//this.ctl.htmlFor = "addslt_cty_" + id;
	c.appendChild(this.ctl);
	
	this.initial();
}

QZONE.widget.addressSelectorObject.prototype._clear = function(){
	this.state_slt.options.length = 0;
	this.state_slt.options.add(new Option(QZONE.widget.addressSelector.STATE_DEFAULT, "0"));
	this.state_slt.disabled = true;
	this.city_slt.options.length = 0;
	this.city_slt.options.add(new Option(QZONE.widget.addressSelector.CITY_DEFAULT, "0"));
	this.city_slt.disabled = true;
}

/**
 * 初始化
 */
QZONE.widget.addressSelectorObject.prototype.initial = function(){
	var c = QZONE.widget.addressSelector._address.country;
	var _self = this;
	var ns = QZONE.widget.addressSelector;
	
	//对国家进行监听
	QZONE.event.addEvent(this.country_slt, "change", function(evt){
		document.body.focus();
		if(_self.country_slt.value == "0"){
			_self._clear();
		} else {
			//在选择国家后会尝试先去查询
			if (typeof(ns._address.state[_self.country_slt.value]) == "undefined") {
				var url = ns.IMGCACHE_DOMAIN + "qzone/address/" + _self.country_slt.value + ".js";
				var _loader = new QZONE.JSONGetter(url, void (0), null, "utf-8");
				_loader.onSuccess = function(re){
					ns._address.state[_self.country_slt.value] = re;
					_self._handleCountrySelected(ns._address.state[_self.country_slt.value]);
				};
				_loader.send("callback");
			} else {
				_self._handleCountrySelected(ns._address.state[_self.country_slt.value]);
			}
		}
		_self._onChange();
	});
	
	QZONE.event.addEvent(this.state_slt, "change", function(evt){
		document.body.focus();
		if(_self.state_slt.value == "0"){
			_self.city_slt.options.length = 0;
			_self.city_slt.options.add(new Option(QZONE.widget.addressSelector.CITY_DEFAULT, "0"));
			_self.city_slt.disabled = true;
		} else {
			ns.setCityDataProvider(_self.city_slt, ns._address.state[_self.country_slt.value].c[_self.state_slt.options[_self.state_slt.selectedIndex].text]);
		}
		_self._onChange();
	});
	
	QZONE.event.addEvent(this.city_slt, "change", function(evt){
		_self._onChange();
	});
	
	var init = function(){
		//alert(1);
		var c = QZONE.widget.addressSelector._address.country;
		if(!!c){
			_self._isInit = true;
			_self.country_slt.options.length = 0;
			for(var i in c){
				var o;
				if(i == "——"){
					o = new Option(QZONE.widget.addressSelector.COUNTRY_DEFAULT, c[i]);
				} else {
					o = new Option(i, c[i]);
				}
				_self.country_slt.options.add(o);
			}
		} else {
			setTimeout(init, 500);
		}
	}
	init();
}

QZONE.widget.addressSelectorObject.prototype._handleCountrySelected = function(value){
	var s = value.s;
	var c = value.c;
	var _self = this;
	var ns = QZONE.widget.addressSelector;
	
	_self._clear();
	
	if(s.length == 1 && s[0][1] == "0"){
		_self.state_slt.disabled = true;
		if(typeof(c["default"]) != "undefined"){
			ns.setCityDataProvider(this.city_slt, c["default"]);
		} else {
			ns.setCityDataProvider(this.city_slt, c["——"]);
		}
	} else {
		_self.city_slt.options.length = 0;
		_self.city_slt.options.add(new Option(QZONE.widget.addressSelector.CITY_DEFAULT, "0"));
		_self.city_slt.disabled = true;
		ns.setStateDataProvider(this.state_slt, s);
	}
}

/**
 * 获取国家的名称
 * @return String
 */
QZONE.widget.addressSelectorObject.prototype.getCountry = function(){
	var re;
	try{
		re = this.country_slt.options[this.country_slt.selectedIndex].text;
		if(re == QZONE.widget.addressSelector.COUNTRY_DEFAULT){
			re = "——";
		}
	} catch (error){
		re = "——";
	}
	return re;
}

/**
 * 获取国家的代码
 * @return String
 */
QZONE.widget.addressSelectorObject.prototype.getCountryCode = function(){
	var re;
	try{
		re = this.country_slt.value;
	} catch (error){
		re = "0";
	}
	if(re == "" || !re){
		re = "0";
	}
	return re;
}

/**
 * 获取省的名称
 * @return String
 */
QZONE.widget.addressSelectorObject.prototype.getState = function(){
	var re;
	try{
		re = this.state_slt.options[this.state_slt.selectedIndex].text;
		if(re == QZONE.widget.addressSelector.STATE_DEFAULT){
			re = "——";
		}
	} catch (error){
		re = "——";
	}
	return re;
}

/**
 * 获取省的代码
 * @return String
 */
QZONE.widget.addressSelectorObject.prototype.getStateCode = function(){
	var re;
	try{
		re = this.state_slt.value;
	} catch (error){
		re = "0";
	}
	if(re == "" || !re){
		re = "0";
	}
	return re;
}

/**
 * 获取城市的代码
 * @return String
 */
QZONE.widget.addressSelectorObject.prototype.getCityCode = function(){
	var re;
	try {
		re = this.city_slt.value;
	} catch(error){
		re = "0";
	}
	if(re == "" || !re){
		re = "0";
	}
	return re;
}

/**
 * 获取城市的名称
 * @return String
 */
QZONE.widget.addressSelectorObject.prototype.getCity = function(){
	var re;
	try{
		re = this.city_slt.options[this.city_slt.selectedIndex].text;
		if(re == QZONE.widget.addressSelector.CITY_DEFAULT){
			re = "——";
		}
	} catch (error){
		re = "——";
	}
	return re;
}

/**
 * 设置显示的地区
 * @param {String} country 国家
 * @param {String} state 省（州、直辖市）
 * @param {String} city 城市（地区）
 */
QZONE.widget.addressSelectorObject.prototype.setLocation = function(country, state, city){
	var ns = QZONE.widget.addressSelector;
	
	this._clear();
	
	if(typeof(country) != "string"){
		country = "";
	}
	
	//做强制替换兼容
	if(country == "中华人民共和国"){
		country = "中国";
	}
	country = country.toString().replace("--", QZONE.widget.addressSelector.COUNTRY_DEFAULT);
	state = state.toString().replace("--", QZONE.widget.addressSelector.STATE_DEFAULT);
	state = (state == "")? QZONE.widget.addressSelector.STATE_DEFAULT : state;
	city = city.toString().replace("--", QZONE.widget.addressSelector.CITY_DEFAULT);
	city = (city == "")? QZONE.widget.addressSelector.CITY_DEFAULT : city;
	
	var _self = this;
	var init = function(){
		if (_self._isInit) {
			ns.setSelectText(_self.country_slt, country);
			_self._setLocation(country, state, city);
		}
		else {
			setTimeout(init, 500);
		}
	}
	
	init();
}

QZONE.widget.addressSelectorObject.prototype._setLocation = function(country, state, city){
	var ns = QZONE.widget.addressSelector;
	var _s = this;
	
	if(country == QZONE.widget.addressSelector.COUNTRY_DEFAULT){
		ns.setSelectText(_s.country_slt, country)
		_s._clear();
	} else {
		if(ns.setSelectText(_s.country_slt, country)){
			if (typeof(ns._address.state[_s.country_slt.value]) == "undefined") {
				var url = ns.IMGCACHE_DOMAIN + "qzone/address/" + _s.country_slt.value + ".js";
				var _loader = new QZONE.JSONGetter(url, void (0), null, "utf-8");
				_loader.onSuccess = function(re){
					ns._address.state[_s.country_slt.value] = re;
					_s._setStateCity(country, state, city);
				};
				_loader.send("callback");
			} else {
				_s._setStateCity(country, state, city);
			}
		}
	}
}

QZONE.widget.addressSelectorObject.prototype._setStateCity = function(country, state, city){
	var ns = QZONE.widget.addressSelector;
	var _s = this;
	
	_s._handleCountrySelected(ns._address.state[_s.country_slt.value]);
	ns.setSelectText(_s.state_slt, state);
	if(ns._address.state[_s.country_slt.value].s.length == 1 && ns._address.state[_s.country_slt.value].s[0][1] == "0"){
		//nothing will happen!
	} else {
		try {
			ns.setCityDataProvider(_s.city_slt, ns._address.state[_s.country_slt.value].c[state]);
		} catch(error){}
	}
	ns.setSelectText(_s.city_slt, city);
}

QZONE.widget.addressSelector.COUNTRY_DEFAULT = "选择国家";
QZONE.widget.addressSelector.STATE_DEFAULT = "选择省";
QZONE.widget.addressSelector.CITY_DEFAULT = "选择市";/*  |xGv00|626c0a246344477d454a59db4cc5883a */