﻿// JScript File
Type.registerNamespace("Habitat.WebParts.GeoLocSearch.JavaScript");

// Constructor
Habitat.WebParts.GeoLocSearch.JavaScript.LinkedDdl = function() {
    this._urlHandler = "/_layouts/Habitat.WebParts.GeoLocSearchWebPart/Data/GeoLocSearchHandler.ashx";
    this._sources = new Array();
}
Habitat.WebParts.GeoLocSearch.JavaScript.LinkedDdl.prototype = {

    Link: function(ddlFrom, ddlTo, method, dataTextField, dataValueField, childDdlBubbleOnChange, dataLinkId) {

        $addHandler($get(ddlFrom), 'change', Function.createDelegate(this, this.SourceChange));

        var found = false;
        for (var i = 0; i < this._sources.length; i++) {
            if (this._sources[i].From == ddlFrom) {
                found = true;
                this._sources[i].ToElements.push({ To: $get(ddlTo), Method: method, DTF: dataTextField, DVF: dataValueField, Bubble: childDdlBubbleOnChange, DataLinkId: dataLinkId });
            }
        }
        if (!found) {
            this._sources.push({ From: ddlFrom, ToElements: [{ To: $get(ddlTo), Method: method, DTF: dataTextField, DVF: dataValueField, Bubble: childDdlBubbleOnChange, DataLinkId: dataLinkId}] });
        }

    },
    toString: function() {
        return 'Habitat.WebParts.GeoLocSearch.JavaScript.LinkedDdl';
    },
    SourceChange: function(evt) {

        var elem = evt.target;
        if (elem == null) {
            elem = evt;
        }

        if (elem.tagName == "SELECT") {
            var found = false;
            for (var i = 0; i < this._sources.length; i++) {
                if (this._sources[i].From == elem.id) {
                    found = true;
                    for (var j = 0; j < this._sources[i].ToElements.length; j++) {
                        $proxy.Call(this._sources[i].ToElements[j].Method, this._sources[i].ToElements[j].DataLinkId, elem.options[elem.selectedIndex].value, Function.createDelegate(this, this.CallBack), i, j);
                    }
                }
            }
            if (!found) {
                alert('The list has been updated but no match for ' + elem.name);
            }
        }
    },
    CallBack: function(list, i, j) {
        var dest = this._sources[i].ToElements[j].To;
        while (dest.options.length > 0) {
            dest.removeChild(dest.childNodes[0]);
        }
        var dtf = this._sources[i].ToElements[j].DTF;
        var dvf = this._sources[i].ToElements[j].DVF;

        for (var k = 0; k < list.length; k++) {
            var o = new Option(list[k][dtf], list[k][dvf]);
            try {
                dest.add(o);
            } catch (e) {
                dest.add(o, null);
            }
            //dest.childNodes.add(o);

        }

        if (this._sources[i].ToElements[j].Bubble == true) {
            this.SourceChange(dest);
        }

    }
}

Habitat.WebParts.GeoLocSearch.JavaScript.LinkedDdl.registerClass('Habitat.WebParts.GeoLocSearch.JavaScript.LinkedDdl', Sys.Component);

// Since this script is not loaded by System.Web.Handlers.ScriptResourceHandler
// invoke Sys.Application.notifyScriptLoaded to notify ScriptManager 
// that this is the end of the script.
if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
