﻿var ListBoxSorter = {
    ascending : { text: "[A-Z]", tip: "View ascending" },
    descending : { text: "[Z-A]", tip: "View descending" },
    relevance : { text: "[*]", tip: "View by relevance" } 
}

$(document).ready(function() {

    $.fn.sortOptions = function(ascending) {
        this.each(
		function() {
		    if (this.nodeName.toLowerCase() != "select") return;
		    var optionsLength = this.options.length;
		    var sortArray = [];
		    for (var i = 0; i < optionsLength; i++) {
		        sortArray[i] =
				{
				    value: this.options[i].value,
				    text: this.options[i].text,
				    selected: this.options[i].selected
				};
		    }
		    ascending = typeof ascending == "undefined" ? true : ascending;
		    sortArray.sort(
				function(option1, option2) {
				    option1text = option1.text.toLowerCase();
				    option2text = option2.text.toLowerCase();
				    if (option1text == option2text) return 0;
				    if (option1text == "") return -1;
				    if (option2text == "") return 1;
				    if (option1text == "other") return 1;
				    if (option2text == "other") return -1;
				    if (ascending) {
				        return option1text < option2text ? -1 : 1;
				    }
				    else {
				        return option1text > option2text ? -1 : 1;
				    }
				}
			);
		    for (var i = 0; i < optionsLength; i++) {
		        this.options[i].text = sortArray[i].text;
		        this.options[i].value = sortArray[i].value;
		        this.options[i].selected = sortArray[i].selected;
		    }
		})
        return this;
    }

    $.fn.unSortOptions = function() {
        this.each(
		function() {
		    if (this.nodeName.toLowerCase() != "select") return;
		    var originalArray = $(this).data("unSortOptionsData");
		    var optionsLength = this.options.length;
		    var sortArray = [];
		    for (var i = 0; i < optionsLength; i++) {
		        var v = this.options[i].value;
		        sortArray[originalArray[v]] =
				{
				    value: v,
				    text: this.options[i].text,
				    selected: this.options[i].selected
				};
		    }

		    for (var i = 0; i < optionsLength; i++) {
		        this.options[i].text = sortArray[i].text;
		        this.options[i].value = sortArray[i].value;
		        this.options[i].selected = sortArray[i].selected;
		    }
		})
        return this;
    }

});

$(document).ready(function() {

    $("span.n2e_property_list select")
    .each(function() {
        if (this.nodeName.toLowerCase() != "select") return;
        var optionsLength = this.options.length;
        var originalArray = [];
        var previousOptionText = "";
        var unordered = false;
        for (var i = 0; i < optionsLength; i++) {
            originalArray[this.options[i].value] = i;
            var optionText = this.options[i].text.toLowerCase();
            if (optionText != "" && optionText != "other" && previousOptionText > optionText) {
                unordered = true;
            }
            previousOptionText = optionText;
        }
//        if (unordered) {
            $(this).data("unSortOptionsData", originalArray);
//        }
    });

    $("span.n2e_property_list a")
    .click(function(event) {
        sortSelect(event.currentTarget);
        toggleText(event.currentTarget);
        return false;
    })
    .text(ListBoxSorter.ascending.text);
});

function toggleText(sorter) {
    var sortingType = sorter.innerText
    if (sortingType == ListBoxSorter.ascending.text) {
        sorter.innerText = ListBoxSorter.descending.text;
        sorter.title = ListBoxSorter.descending.tip;
        return;
    }
    if (sortingType == ListBoxSorter.descending.text) {
        sorter.innerText = ListBoxSorter.relevance.text;
        sorter.title = ListBoxSorter.relevance.tip;
        return;
    }
    if (sortingType == ListBoxSorter.relevance.text) {
        sorter.innerText = ListBoxSorter.ascending.text;
        sorter.title = ListBoxSorter.ascending.tip;
        return;
    }
}

function sortSelect(sorter) {
    var sortingType = sorter.innerText
    if (sortingType == ListBoxSorter.ascending.text) {
        $("~ select", sorter).sortOptions(true);
        return;
    }
    if (sortingType == ListBoxSorter.descending.text) {
        $("~ select", sorter).sortOptions(false);
        return;
    }
    if (sortingType == ListBoxSorter.relevance.text) {
        $("~ select", sorter).unSortOptions();
        return;
    }
}
