﻿/**
* @author zhuxiaohui
*/
if (!YAHOO.dqccc) {
    YAHOO.namespace("dqccc.widget");
}

if (!YAHOO.dqccc.widget.CascadeSelect) {

    /**
    * @namespace YAHOO.dqccc.widget
    * @requires YAHOO.util.Dom
    * @requires YAHOO.util.Event
    * @requires cityData.js
    * @constructor CascadeSelect
    * @param {Dom} container which dom this select appends to
    * @param {Array} baseData what data select bases on
    * @param {Object} cfg configuration
    */
    YAHOO.dqccc.widget.CascadeSelect = function(container, baseData, cfg) {
        var Dom = YAHOO.util.Dom;
        var Event = YAHOO.util.Event;

        this.container = container;
        this.cfg = cfg;
        this.baseData = baseData;

        var level = cfg.level;
        var nameArray = cfg.name;
        var firstSelect;
        for (var i = 0; i < level; i++) {
            var name = nameArray[i];
            try {
                var oSelect = document.createElement('<select name="' + name + '" id="ID_' + name + '"></select>');
            } catch (e) {
                var oSelect = document.createElement("select");
                oSelect.setAttribute("name", name);
                oSelect.setAttribute("id", "ID_"+name);
            }
            oSelect.kIndex = i;
            oSelect.kObject = this;
            //build options in the first select
            if (i == 0) {
                var query = [null, null, null, 1];
                var result = kFetchData(query, this.baseData); //method from cityData.js
                this._insertOptions(oSelect, result, false);
            } else {
                this._insertOptions(oSelect, []);
            }
            Event.on(oSelect, 'change', function() {
                var kObject = this.kObject;
                kObject._buildChildSelect(this, true);
            });
            this.container.appendChild(oSelect);
        }
    }

    YAHOO.dqccc.widget.CascadeSelect.prototype.setValue = function(pairValue) {
        var selects = this.container.getElementsByTagName('select');
        for (var i = 0; i < selects.length; i++) {
            var select = selects[i];
            var name = select.name;
            if (pairValue[name] != undefined) {
                select.value = pairValue[name];
            }
            else {
                select.value = '';
            }
            this._buildChildSelect(select, false);
        }
    }

    //insert new options according to selected value of its parent select
    YAHOO.dqccc.widget.CascadeSelect.prototype._buildChildSelect = function(parentSelect, recursive) {
        var nextSelect = parentSelect.nextSibling;
        if (nextSelect) {
            var parent = parentSelect.value;
            if (parent == '') {
                this._insertOptions(nextSelect, []);
            } else {
                var query = [null, null, parent, null];
                var result = kFetchData(query, this.baseData); //method from kData.js
                this._insertOptions(nextSelect, result);
            }
            if (recursive)
                this._buildChildSelect(nextSelect, recursive);
        }
    }

    //insert options
    YAHOO.dqccc.widget.CascadeSelect.prototype._insertOptions = function(select, data, selectFirst) {
        var _selectFirst = true;
        if (selectFirst != undefined) _selectFirst = selectFirst;
        select.options.length = 0;
        var option = document.createElement("option");
        option.value = "";
        option.innerHTML = "选择";
        select.appendChild(option);
        for (var i = 0; i < data.length; i++) {
            var option = document.createElement("option");
            option.value = data[i][0];
            option.innerHTML = data[i][1];
            if (_selectFirst && i == 0) {
                option.selected = true;
            }
            select.appendChild(option);
        }
    }

}