﻿//Control Objects
function OptionElement(code, displayName) {
    this.code = code;
    this.displayName = displayName;
}

function CountriesAndLanguages(countriesAndLanguagesCollection, languageTranslationCollection) {
    this.CountryCollectionSelectorObject = $("#" + JSCountryAndLanguageSelector.CountryCollectionSelectorObject);
    this.LanguageCollectionSelectorObject = $("#" + JSCountryAndLanguageSelector.LanguageCollectionSelectorObject);
    this.CountryHiddenObject = $("#" + JSCountryAndLanguageSelector.CountryHiddenObject);
    this.LanguageHiddenObject = $("#" + JSCountryAndLanguageSelector.LanguageHiddenObject);
    this.CountriesAndLanguagesCollection = countriesAndLanguagesCollection;
    this.LanguageTranslationCollection = languageTranslationCollection;
}

CountriesAndLanguages.prototype.GetCountryCollection = function() {
    var countryArray = new Array();
    countryArray.push(new OptionElement('', JSCountryAndLanguageSelector.SelectCountryText));

    $.each(this.CountriesAndLanguagesCollection, function(code, element) {
        countryArray.push(new OptionElement(code, element.DisplayName));
    });
    return countryArray;
}

CountriesAndLanguages.prototype.GetLanguageCollection = function(code) {
    var languagesArray = new Array();
    languagesArray.push(new OptionElement('', JSCountryAndLanguageSelector.SelectLanguageText));

    if (code != '') {
        var languages = this.CountriesAndLanguagesCollection[code].LanguageCollection;
        var languageDictionary = this.LanguageTranslationCollection;
        $.each(languages, function(code, element) {
            languagesArray.push(new OptionElement(element, languageDictionary[element]));
        });
    }
    return languagesArray;
}

CountriesAndLanguages.prototype.FillControl = function(control, container, data, visibleIfEmpty) {
    control.empty();
    control.show();
    var lastOption = '';
    var selectedOption = container.val();

    if (data.length == 2) {
        selectedOption = data[1].code;
    }

    $.each(data, function(index, element) {
        if (selectedOption == element.code) {
            control.append($("<option selected='" + "selected" + "'></option>").val(element.code).html(element.displayName));
        }
        else {
            control.append($('<option></option>').val(element.code).html(element.displayName));
        }
        lastOption = element.code;
    });

    if (data.length > 2) {
        control.removeAttr("disabled");
    }
    else {
        control.attr("disabled", true);
        if (!visibleIfEmpty) {
            control.hide();
        }
    }

    container.val(control.val());
}

//Contol Methods
function FillControl() {
    var countries = new CountriesAndLanguages(JSCountriesAndLanguagesArray, JSLanguageTranslation);
    FillCountriesControl(countries);
    FillLanguageControl(countries, countries.CountryCollectionSelectorObject.val());

    countries.CountryCollectionSelectorObject.bind("change", function() {
        FillLanguageControl(countries, this.value);
        countries.CountryHiddenObject.val(this.value);
    });

    countries.LanguageCollectionSelectorObject.bind("change", function() {
        countries.LanguageHiddenObject.val(this.value);
    });
}

function FillCountriesControl(countries) {
    var countryCollection = countries.GetCountryCollection();
    CountriesAndLanguages.prototype.FillControl(countries.CountryCollectionSelectorObject, countries.CountryHiddenObject, countryCollection, true);
}

function FillLanguageControl(countries, selectedCountry) {
    var languageCollection = countries.GetLanguageCollection(selectedCountry);
    CountriesAndLanguages.prototype.FillControl(countries.LanguageCollectionSelectorObject, countries.LanguageHiddenObject, languageCollection, true);
}
