var selectorAlreadySummoned = false;
var selectorSuggestNewOption = new Array();
var selectorFacultyOptions = new Array();
var selectorSuggestedOptions = new Array();
var selectorCurrentFilterLink = null;
var selectorPreviousFilter = "A";
var language = "en";

function summonSelector (selectElement, optionType, language) {
    selectElement.blur();

    if (!selectorAlreadySummoned) {
        constructSelector(selectElement, optionType, language);
        filterSelectorOptions(optionType, selectElement.id, "A");
        selectorAlreadySummoned = true;
    }

    toggleSelectorVisibility();

    selectElement.blur();
}

function constructSelector (selectElement, optionType, language) {
    var selectorFacultyOptionsCounter = 0;
    var selectorSuggestedOptionsCounter = 0;
    var i = 0;
    var optionId = 0;
    var optionName = "";
    var regex = new RegExp("(^A)", "i");

    var selectorDiv = document.createElement("div");
    selectorDiv.id = "Selector";
    var filterDiv = document.createElement("div");
    filterDiv.id = "SelectorFilterContainer";
    var filterInput = document.createElement("input");
    filterInput.id = "SelectorFilter";
    filterInput.name = "SelectorFilter";
    filterInput.value = "";
    filterInput.type = "text";
    filterInput.onkeyup = function () {
        updateSelectorFilter(optionType, selectElement.id, this.value);
    };
    var filterImage = document.createElement("img");
    filterImage.src = "/public/Mvl/Controller/Page/images/selectormagnifier.gif";
    var suggestNewDiv = document.createElement("div");
    suggestNewDiv.id = "SelectorSuggestNewContainer";
    var facultyOptionsAlphabetDiv = document.createElement("div");
    facultyOptionsAlphabetDiv.id = "SelectorFacultyOptionsAndAlphabetContainer";
    var alphabetDiv = document.createElement("div");
    alphabetDiv.id = "SelectorAlphabetContainer";
    var facultyOptionsDiv = document.createElement("div");
    facultyOptionsDiv.id = "SelectorFacultyOptionsContainer";
    var suggestedOptionsDiv = document.createElement("div");
    suggestedOptionsDiv.id = "SelectorSuggestedOptionsContainer";

    var facultyOptionDiv = null;
    var suggestedOptionDiv = null;

    if (optionType == "Teacher") {
        if (language == "fr") filterDiv.innerHTML = "<div class='SelectorFilterHeader'>Filtrer par nom</span>";
        else filterDiv.innerHTML = "<div class='SelectorFilterHeader'>Filter By Name</span>";
    } else {
        if (language == "fr") filterDiv.innerHTML = "<div class='SelectorFilterHeader'>Filtrer par sigle/nom</span>";
        else filterDiv.innerHTML = "<div class='SelectorFilterHeader'>Filter By Code/Name</span>";
    }
    filterDiv.appendChild(filterInput);
    filterDiv.appendChild(filterImage);

    suggestedOptionsDiv.innerHTML = "<div class='SelectorSuggestedOptionsHeader'>Suggestions</span>";

    for (i = 0; i < selectElement.length; i++) {
        optionId = selectElement.options[i].value;
        optionName = selectElement.options[i].text;

        if (optionId == -1) {
            suggestNewDiv.innerHTML = "<div class='SelectorSuggestNewHeader'>"+selectElement.options[i].parentNode.label+"</span>";
            suggestNewDiv.innerHTML += "<a href='#' onclick='selectInSelect(\""+optionType+"\", "+i+", \""+selectElement.id+"\"); return false;'>"+optionName+"</a>";
        }

        if (selectElement.options[i].parentNode.label == "Faculty Professors"
         || selectElement.options[i].parentNode.label == "Professeurs de la Faculté"
         || selectElement.options[i].parentNode.label == "Faculty Courses"
         || selectElement.options[i].parentNode.label == "Cours de la Faculté") {
            facultyOptionDiv = document.createElement("div");
            facultyOptionDiv.id = "SelectorFacultyOption"+i;
            facultyOptionDiv.className ="SelectorFacultyOption";

            selectorFacultyOptions[selectorFacultyOptionsCounter] = [facultyOptionDiv, i, optionId, optionName, true];
            selectorFacultyOptionsCounter += 1;
        }

        if (selectElement.options[i].parentNode.label == "Previously rated" || selectElement.options[i].parentNode.label == "Évalué précédemment") {
            suggestedOptionDiv = document.createElement("div");
            suggestedOptionDiv.id = "SelectorSuggestedOption"+i;
            suggestedOptionDiv.className ="SelectorSuggestedOption";

            abbreviation = optionName.substr(0, 35);
            if (abbreviation != optionName) abbreviation += "...";

            suggestedOptionDiv.innerHTML = "<a href='#' title='"+optionName.replace("'", "&quot;")+"' onclick='selectInSelect(\""+optionType+"\", "+i+", \""+selectElement.id+"\"); return false;'>"+abbreviation+"</a>";

            suggestedOptionsDiv.appendChild(suggestedOptionDiv);

            selectorSuggestedOptions[selectorSuggestedOptionsCounter] = [suggestedOptionDiv, i, optionId, optionName];
            selectorSuggestedOptionsCounter += 1;
        }
    }

    if (language == "fr") alphabetDiv.innerHTML = "<a href='#' id='SelectorFilterLink' class='SelectorFilterLink' onclick='updateSelectorFilter(\""+optionType+"\", \""+selectElement.id+"\", \"\"); return false;'>Voir tout ("+selectorFacultyOptions.length+")</a><br />";
    else alphabetDiv.innerHTML = "<a href='#' id='SelectorFilterLink' class='SelectorFilterLink' onclick='updateSelectorFilter(\""+optionType+"\", \""+selectElement.id+"\", \"\"); return false;'>See All ("+selectorFacultyOptions.length+")</a><br />";

    for (i = 0; i < 26; i++) {
        currentLetter = String.fromCharCode("A".charCodeAt(0) + i);
        alphabetDiv.innerHTML += " <a href='#' id='SelectorFilterLink"+currentLetter+"' class='SelectorFilterLink"+(i == 0 ? "Highlighted" : "")+"' onclick='updateSelectorFilter(\""+optionType+"\", \""+selectElement.id+"\", \""+currentLetter+"\"); return false;'>"+currentLetter+"</a>";
    }

    // if there are no suggestions, remove the header
    if (selectorSuggestedOptions.length == 0) suggestedOptionsDiv.innerHTML = "";

    selectorDiv.appendChild(filterDiv);
    selectorDiv.appendChild(suggestNewDiv);
    facultyOptionsAlphabetDiv.appendChild(alphabetDiv);
    facultyOptionsAlphabetDiv.appendChild(facultyOptionsDiv);
    selectorDiv.appendChild(facultyOptionsAlphabetDiv);
    selectorDiv.appendChild(suggestedOptionsDiv);

    $('SelectorContainer').appendChild(selectorDiv);

    selectorCurrentFilterLink = $("SelectorFilterLinkA");
}

function toggleSelectorVisibility() {
    var yScroll = getScrollY();
    var selectorFilter = $('SelectorFilter');
    var selector = $('Selector');
    var selectorContainer = $('SelectorContainer');
    var selectorContainerContainer = $('SelectorContainerContainer');

    //if (yScroll > 515) {
        if (yScroll < 480 && selector.getStyle('display') == "none") {
            window.scroll(0, 490);
        }
        selector.setStyle('top', '23px');
        selectorContainerContainer.setStyle('height', '424px');
    //} else {
    //    selector.setStyle('top', '-402px');
    //}

    if (selector.getStyle('display') == "none") {
        selector.setStyle('display', 'block');
        selectorContainerContainer.setStyle('overflow', 'visible');
        setTimeout("$('SelectorFilter').focus();",50);
    } else {
        selector.setStyle('display', 'none');
        selectorContainerContainer.setStyle('height', '22px');
    }
}

function selectInSelect(optionType, index, selectElementId) {
    var selector = $('Selector');
    var selectorContainerContainer = $('SelectorContainerContainer');
    var selectElement = $(selectElementId);
    selectElement.selectedIndex = index;
    selectorContainerContainer.setStyle('height', '22px');
    selector.setStyle('display', 'none');

    if (selectElement.options[index].value == -1) { slideShow('new'+optionType+'Div'); }
    else { slideHide('new'+optionType+'Div');}
    if (selectElement.options[index].value == 0) {slideHide(optionType+'Ratings'); }
    else { slideShow(optionType+'Ratings'); }
}

function filterSelectorOptions(optionType, selectElementId, filter) {
    var regex = new RegExp("(^"+filter+")", "i");
    var facultyOptionsDiv = $("SelectorFacultyOptionsContainer");
    var abbreviation = "";
    facultyOptionsDiv.innerHTML = "";

    for (var i=0; i < selectorFacultyOptions.length; i++) {
        if (filter == "") {
            abbreviation = selectorFacultyOptions[i][3].substr(0, 35);
            if (abbreviation != selectorFacultyOptions[i][3]) abbreviation += "...";
            selectorFacultyOptions[i][0].innerHTML = "<a href='#' title='"+selectorFacultyOptions[i][3].replace("'", "&quot;")+"' onclick='selectInSelect(\""+optionType+"\", "+selectorFacultyOptions[i][1]+", \""+selectElementId+"\"); return false;'>"+abbreviation+"</a>";
            facultyOptionsDiv.appendChild(selectorFacultyOptions[i][0]);
            selectorFacultyOptions[i][5] = true;
        } else if (regex.test(selectorFacultyOptions[i][3])) {
            abbreviation = selectorFacultyOptions[i][3].substr(0, 35);
            if (abbreviation != selectorFacultyOptions[i][3]) abbreviation += "...";
            selectorFacultyOptions[i][0].innerHTML = "<a href='#' title='"+selectorFacultyOptions[i][3].replace(regex, "($1)").replace("'", "&quot;")+"' onclick='selectInSelect(\""+optionType+"\", "+selectorFacultyOptions[i][1]+", \""+selectElementId+"\"); return false;'>"+abbreviation.replace(regex, "<b>$1</b>")+"</a>";
            facultyOptionsDiv.appendChild(selectorFacultyOptions[i][0]);
            selectorFacultyOptions[i][5] = true;
        } else {
            selectorFacultyOptions[i][5] = false;
        }
    }

    if (filter.length == 1) regex = new RegExp("( "+filter+")", "i");
    else regex = new RegExp("("+filter+")", "i");

    for (var i=0; i < selectorFacultyOptions.length; i++) {
        if (selectorFacultyOptions[i][5] == false && regex.test(selectorFacultyOptions[i][3])) {
            abbreviation = selectorFacultyOptions[i][3].substr(0, 35);
            if (abbreviation != selectorFacultyOptions[i][3]) abbreviation += "...";
            selectorFacultyOptions[i][0].innerHTML = "<a href='#' title='"+selectorFacultyOptions[i][3].replace(regex, "($1)").replace("( ", " (").replace("'", "&quot;")+"' onclick='selectInSelect(\""+optionType+"\", "+selectorFacultyOptions[i][1]+", \""+selectElementId+"\"); return false;'>"+abbreviation.replace(regex, "<b>$1</b>")+"</a>";
            facultyOptionsDiv.appendChild(selectorFacultyOptions[i][0]);
            selectorFacultyOptions[i][5] = true;
        }
    }
}

function updateSelectorFilter(optionType, selectElementId, filter) {
    var selectorFilter = $('SelectorFilter');
    if (filter != selectorPreviousFilter) {
        selectorPreviousFilter = filter;
        selectorFilter.value = filter;
        filterSelectorOptions(optionType, selectElementId, filter);
        updateFilterLinks(filter);
    }
}

function updateFilterLinks(filter) {
    if (filter.length < 2) {
        filter = filter.toUpperCase();
        if (selectorCurrentFilterLink) {
            lowlightCurrentFilterLink();
        }
        if ((!selectorCurrentFilterLink) || (selectorCurrentFilterLink.id != "SelectorFilterLink"+filter)) {
            selectorCurrentFilterLink = $("SelectorFilterLink"+filter);
            highlightCurrentFilterLink();
        }
    } else if (selectorCurrentFilterLink) {
        lowlightCurrentFilterLink();
    }
}

function highlightCurrentFilterLink(filter) {
    selectorCurrentFilterLink.set('class', 'SelectorFilterLinkHighlighted');
}

function lowlightCurrentFilterLink() {
    selectorCurrentFilterLink.set('class', 'SelectorFilterLink');
    selectorCurrentFilterLink = null;
}


function getCriteriaValueFromSelection(selection) {
    switch(selection) {
        case 1:
            return 1;
        case 2:
            return 25;
        case 3:
            return 50;
        case 4:
            return 75;
        case 5:
            return 100;
    }
    return 0;
}

function getSelectionFromCriteriaValue(criteriaValue) {
    switch(criteriaValue) {
        case "1":
            return 1;
        case "25":
            return 2;
        case "50":
            return 3;
        case "75":
            return 4;
        case "100":
            return 5;
    }
    return 0;
}

function getLetterFromSelection(selection) {
    switch(selection) {
        case 1:
            return "E";
        case 2:
            return "D";
        case 3:
            return "C";
        case 4:
            return "B";
        case 5:
            return "A";
    }
    return "DarkerGrey";
}


function showCriteriaInfo (criteria) {
    infobox = $('Info_'+criteria);
    infobox.setStyle('display', 'inline');
    infobox.setStyle('z-index', '5000');
    //alert(findPosX(infobox)+" "+findPosY(infobox));
    infobox.setStyle('top', findPosY(infobox));
    infobox.setStyle('left', findPosX(infobox));
    infobox.setStyle('position', 'absolute');
}

function hideCriteriaInfo (criteria) {
    infobox = $('Info_'+criteria);
    infobox.setStyle('display', 'none');
    infobox.setStyle('top', 6);
    infobox.setStyle('left', 4);
    infobox.setStyle('position', 'relative');
}



