﻿/// <reference path="../jquery-1.5-vsdoc.js" />
/// <reference path="../jquery.validate.js" />
/// <reference path="../jquery.validate.unobtrusive.js" />

function initialiseDropDownLists(name, targetDropDownList, allOptions) {
    if ($("select:first option").length < 2) {
        bindDropDownList(null, targetDropDownList, allOptions);
    }

    var savedValue = $.cookie(name.toLowerCase() + '_' + $("select:last").attr("id"));
    if ((savedValue) && (savedValue.length > 0)) {
        initialiseDropDowns(savedValue);
    }
}

function bindDropDownList(parentDropDown, targetDropDownList, allOptions) {
    var option;
    var ddl = $(targetDropDownList);
    var parentValue = '';
    var optionDisabled;

    if ((parentDropDown) && (parentDropDown.val())) {
        parentValue = parentDropDown.val();
    }
    if (parentValue.indexOf(":")) {
        parentValue = parentValue.split(":")[0];
    }

    $('#cascadingValue').val('');

    ddl.find('option, optgroup').remove().end();

    ddl.append("<option value='-1'>-- Select --</option>");

    for (var i=0; i < allOptions.length; i++) {
        option = allOptions[i];
        if ((parentDropDown === null) || (option.ParentKey === parentValue)) {
            var optionGroup = getOptionGroup(ddl, option);
            option.Value = (parentValue === '') ? option.Value : parentValue + "-" + option.Value;
            optionDisabled = option.Enabled ? "" : "disabled='disabled'";
            optionGroup.append("<option value='" + option.Value + ":" + option.CascadingValue + "' " + optionDisabled + ">" + option.Text + "</option>");
        }
    }

    // Reset the dropdown (and trigger child) 
    // --------------------------------------
    ddl.removeAttr('disabled');
    if (ddl.find('option').length === 2) {
        ddl[0].selectedIndex = 1;
    }
    else {
        ddl[0].selectedIndex = 0;
    }
    ddl.change();
    if (ddl.find('option').length < 2) {
        ddl.attr('disabled', 'disabled');
    }
    $.uniform.update(ddl);
}

function setCascadingValue(parentDropDown) {
    var cascadingValue = '';
    var parentValue = '';

    if ((parentDropDown) && (parentDropDown.val())) {
        parentValue = parentDropDown.val();
    }

    if (parentValue.indexOf(":")) {
        cascadingValue = parentValue.substring(parentValue.indexOf(":") + 1);
    }

    if (!cascadingValue) {
        cascadingValue = '';
    }

    $('#cascadingValue').val(cascadingValue);
}

function getOptionGroup(ddl, options) {
    var section = options.Section;
    if ((!section) || (section === '')) return ddl;

    var lastItem = $('option:last', ddl);
    var lastSection = lastItem.closest('optgroup');

    if ((lastSection.index() > -1) && (lastSection[0].label === section)) {
        return lastSection;
    }
    if ((lastSection.index() < 0) || (lastSection[0].label !== section)) {
        ddl.append("<optgroup label='" + section + "'></optgroup>");
        return $('optgroup:last', ddl);
    }
    return ddl;
}

function initialiseDropDowns(parentedValue) {
    if ((!parentedValue) || (parentedValue === "")) return;

    var parts = parentedValue.split(":");
    if (parts.length < 2) return;

    var parentValues = parts[0].split("-");
    if (parentValues.length < 1) return;

    initialiseDropDown(parentValues[parentValues.length - 1], parentValues.slice(0, parentValues.length - 1));
}

function initialiseDropDown(value, parentValues) {
    var parentSetOk = true;
    var parentIndex = parentValues.length;
    if (parentIndex > 0) {
        parentSetOk = initialiseDropDown(parentValues[parentIndex - 1], parentValues.slice(0, parentIndex - 1));
    }
    if (!parentSetOk) return false;
    
    var ddl = $("select:eq(" + parentIndex + ")");
    if (!ddl) return false;
    
    var parentKey = parentValues.join("-");
    var selectedItem = $("select:eq(" + parentIndex + ") option[value^='" + parentKey + ((parentKey.length > 0) ? "-" : "") + value + ":']");
    if ((!selectedItem) || (selectedItem.val() === undefined)) return false;
    if (ddl.val() == selectedItem.val()) return true;

    ddl.val(selectedItem.val());
    ddl.change();
    return true;
};

