﻿jQuery.fn.cascadingDropDownList = function(options) {
	this.settings = {
		selectorContainer: null,
		valuesField : null,
		loadDataUrl : "",
		initSelectorAmount : 1,
		onlySelectLeaf : false,
		valueSeparator : "\n",
		loadingText : "正在加载，请稍后... ...",
		customPromptText : "-请选择-",
		promptTexts : null
	};
	
	if(options) {
		jQuery.extend(this.settings, options);
	}
	
	
	
	this.ensureSelector = function(index)
	{
		for(var i = this.selectors.length; i <= index; i++)
		{
			var selector = $("<select></select>").bind("change", this, this.changeSelectItem).append("<option value=\"\">" + this.getPromptText(i) + "</option>");
			this.selectorContainer.append(selector);
			this.selectors[i] = selector[0];
		}
		return this.selectors[index];
	}
	
	this.getPromptText = function(index)
	{
		var promptText;
		var promptTexts = this.settings.promptTexts;
		if(promptTexts && promptTexts != null && promptTexts.length > index)
			promptText = promptTexts[index];
		if(!promptText) promptText = this.settings.customPromptText;
		if(promptText) return promptText.replace("{0}", index + 1);
		return "";
	}
	
	this.clearAfterSelector = function(index)
	{
		for(var i = index + 1; i < this.selectors.length; i++)
			this.selectors[i].options.length = 1;
	}
	
	this.getSelectorIndex = function(selector)
	{
		for(var i = 0; i < this.selectors.length; i++)
		{
			if(selector == this.selectors[i]) return i;
		}
		return undefined;
	}
	
	this.changeSelectItem = function(event)
	{
		var d = event.data;
		d.loadSelectorData(this);
		d.setValue();
	}
	
	this.loadSelectorData = function(parentSelector)
	{
		var index = -1;
		var parentValue = "";
		if(parentSelector)
		{
			index = this.getSelectorIndex(parentSelector);
			if(typeof(index) == "undefined") return;
			
			this.clearAfterSelector(index);
			parentValue = parentSelector.value;
			
			var childCount = this.getSelectorChildCount(parentSelector);
			if(!(parentValue && parentValue != "" && childCount > 0))
				return;
		}
		else
			this.clearAfterSelector(index);
		
		index += 1;
	
		var selector = this.ensureSelector(index);
		selector.options[0].text = this.settings.loadingText;
		selector.disabled = true;
		
		var loadDataUrl = this.settings.loadDataUrl.replace("{0}", parentValue);
		var request = $.ajax({url:loadDataUrl,
			async:false});
		var data = eval(request.responseText);
		
		for(var i = 0; i < data.length; i++)
		{
			var option = document.createElement("option");
			option.text = data[i].text;
			option.value = data[i].value;
			option.childCount = data[i].childCount;
			selector.options.add(option);
		}
		
		selector.options[0].text = this.getPromptText(index);
		selector.disabled = false;
	}
	
	this.setSelectorValue = function(selector, value)
	{
		selector.value = value;
		this.loadSelectorData(selector);
		this.setValue();
	}
	
	this.setValue = function()
	{
		var value = "";
		var values = [];
		for(var i = 0; i < this.selectors.length; i++)
		{
			var selector = this.selectors[i];
			var val = selector.value;
			var childCount = this.getSelectorChildCount(selector);
			
			if(val && val != "")
			{
				values[values.length] = val;
				if(this.settings.onlySelectLeaf)
				{
					if(!(childCount > 0)) value = val;
				}
				else
					value = val;
			}
			else
				break;
		}
		
		this.valuesField.val(values.join(this.settings.valueSeparator));
		this.val(value);
	}
	
	this.getSelectorChildCount = function(selector)
	{
		var childCount = selector.options[selector.selectedIndex].childCount;
		if(childCount) childCount = parseInt(childCount);
		if(isNaN(childCount)) return 0;
		return childCount;
	}
	
	this.getValues = function()
	{
		var val = $.trim(this.valuesField.val());
		if(val != "")
			return val.split(this.settings.valueSeparator);
		return [];
	}
	
	
	
	this.selectorContainer = $(this.settings.selectorContainer);
	this.valuesField = $(this.settings.valuesField);
	this.selectors = [];
	this.ensureSelector(this.settings.initSelectorAmount - 1);
	this.loadSelectorData();
	
	var values = this.getValues();
	for(var i = 0; i < values.length; i++)
	{
		var selector = this.ensureSelector(i);
		this.setSelectorValue(selector, values[i]);
	}
}
