﻿/*!
* jQuery Drop Down Plugins
* http://nerdenerd.com/
*
* Copyright 2011, Adrian Brand
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* Ver 1.0.0
*
* Date: Mon Oct 10 2011
*/

$.fn.clearDropdown = function (options) {
	this.html("");
	return this.each(function () {
		if (this.tagName == 'SELECT') {
			if (options.defaultClass)
				$(this).addClass(options.defaultClass);
			if (options.defaultText) {
				var option = $("<option />");
				option.text(options.defaultText);
				option.attr("value", "");
				if (options.defaultClass)
					option.addClass(options.defaultClass);
				$(this).append(option);
			}
		}
	});
}

$.fn.populateDropdown = function (options) {
    return this.each(function () {
        if (this.tagName == 'SELECT') {
            var dropdown = $(this);
            if (typeof options.data == "string") {
                dropdown.clearDropdown({ defaultText: options.loadingText ? options.loadingText : "loading ..." });
                var ajaxData = new Object();
                if (options.parentValue)
                    ajaxData[options.parentParameter ? options.parentParameter : "parentId"] = options.parentValue;
                $.ajax({
                    url: options.data,
                    data: ajaxData,
                    dataType: options.dataType ? options.dataType : "json",
                    type: options.type ? options.type : "POST",
                    success: function (data) {
                        dropdown.populateDropdown(
                            $.extend(
                                {},
                                options,
                                {
                                    data: options.processData ? options.processData(data, options) : data,
                                    processData: null
                                }
                            )
                        );
                    }
                });
            } else {
                dropdown.clearDropdown({ defaultClass: options.defaultClass, defaultText: options.defaultText });
                $.each(options.processData ? options.processData(options.data, options) : options.data, function (index, optionData) {
                    var option = $("<option />");
                    option.text(optionData[options.textProperty ? options.textProperty : "Text"]);
                    option.attr("value", optionData[options.valueProperty ? options.valueProperty : "Value"]);
                    if (options.selectedValue == option.attr("value"))
                        option.attr("selected", true);
                    dropdown.append(option);
                });
            }
            if (options.defaultClass) {
                if (!dropdown.is(".onDefaultOptionChangeSet")) {
                    dropdown.addClass("onDefaultOptionChangeSet");
                    dropdown.change(function () {
                        if (this.selectedIndex == 0)
                            dropdown.addClass(options.defaultClass);
                        else
                            dropdown.removeClass(options.defaultClass);
                    });
                }
                if (this.selectedIndex == 0)
                    dropdown.addClass(options.defaultClass);
                else
                    dropdown.removeClass(options.defaultClass);
            }
        }
    });
}

$.fn.cascadeDropdown = function (options) {
    return this.each(function () {
        if (this.tagName == 'SELECT') {
            var dropdown = $(this);
            dropdown.populateDropdown(options);
            if (options.child) {
                $(options.child.selector).cascadeDropdown(
                    $.extend(
                        {},
                        options,
                        options.child,
                        {
                            parentValue: options.selectedValue,
                            selectedValue: options.child.selectedValue ? options.child.selectedValue : null,
                            child: options.child.child ? options.child.child : null
                        }
                    )
                );

                var child = $(options.child.selector)

                dropdown.change(function () {
                    if (this.value) {
                        child.populateDropdown(
                            $.extend(
                                {},
                                options,
                                options.child,
                                {
                                    parentValue: this.value,
                                    selectedValue: null
                                }
                            )
                        );
                    } else {
                        child.clearDropdown({
                            defaultText: options.child.emptyText ? options.child.emptyText : options.emptyText,
                            defaultClass: options.child.defaultClass ? options.child.defaultClass : options.defaultClass
                        });
                    }
                    child.change();
                });
            }
        }
    });
}
