
function LanguagePairSelection(srcSelect, tgtSelect, onChange, initLanguagePair)  {
    this._src = srcSelect;
    this._tgt = tgtSelect;
    this._onChange = onChange;
    this._inited = false;
    this._initLanguagePair = initLanguagePair;

    this.getSelectedLp = function() {
        return this._src.value + "_" + this._tgt.value;
    };

    this.getLocalizedUrlSelectedLp = function() {
        return localization.getString("url_" + this._src.value ).toLowerCase() + "-" + localization.getString("url_" + this._tgt.value).toLowerCase();
    };

    this.init = function() {
        this.populateSelect(languagePairs.getSourceLangauges(), this._src);
        var lp;
        if(this._initLanguagePair) {
            languagePairs.recordHistory(this._initLanguagePair);
            lp = this._initLanguagePair;
        }
        else {
            lp = languagePairs.getStartingSelectedPair();
        }
        this.selectLp(lp);
        this._inited = true;
    };

    this.selectLp = function(lp) {
        this.selectSource(languagePairs.getSource(lp));
        this.selectTarget(languagePairs.getTarget(lp));
        this.launchTranslation();
    };

    this.selectSource = function(src) {
        var oldValue = this._src.value;
        this._src.value = src;
        if(this._src.value != src) {
            this._src.value = oldValue;
            src = oldValue;
        }
        this.populateSelect(languagePairs.getTargetLanguages(src), this._tgt);
        this.selectTarget(languagePairs.getSelectedTarget(src));
    };

    this.selectTarget = function(tgt) {
        var oldValue = this._tgt.value;
        this._tgt.value = tgt;
        if(this._tgt.value != tgt) {
            this._tgt.value = oldValue;
        }
    };

    this.swapSourceTarget = function() {
        var lp = this.getSelectedLp();
        this.selectSource(languagePairs.getTarget(lp));
        this.selectTarget(languagePairs.getSource(lp));
        this.launchTranslation();
    };

    this.launchTranslation = function() {
        if(this._onChange) {
            this._onChange(this);
        }
        if(this._inited) {
            languagePairs.recordHistory(this.getSelectedLp());
        }
    };

    this.populateSelect = function(langs, select) {
        while(select.options.length > 0) {
            select.remove(0);
        }
        var localizedLangs = new Array();
        var localizedMap = {};
        for(var i = 0; i < langs.length; i++) {
            localizedLangs[i] = localization.getString("lng_" + langs[i]);
            localizedMap[localizedLangs[i]] = langs[i];
        }
        localizedLangs = localizedLangs.sort();
        for(var i = 0; i < localizedLangs.length; i++) {
            var option = select.ownerDocument.createElement("option");
            select.options.add(option);
            option.value = localizedMap[localizedLangs[i]];
            option.innerHTML = localizedLangs[i];
        }
    };

    this.init();
}