jQuery.fn.recognition = function (options) {
    //-----------------------------------------------------------------------------------------------
    // Configuration Defaults and Options
    //-----------------------------------------------------------------------------------------------

    var defaults = {
        arr8: "",
        arr7: "",
        arr6: "",
        arr5: ""
    };

    var d = jQuery.extend(defaults, options)

    var ajaxStatus = null;

    var wrapper = jQuery("#recognition-body-inner");
    var groupWidth = 590;

    var hash = window.location.hash.substr(1);
    if (hash.length > 2) {
        var curGroup = hash;
    } else {
        var curGroup = "platinum";
    };

    var curCountry = "all";
    var curSort = "";
    var curPage = 1;
    var curTotal = 1;
    var totalPages = 1;
    var listPath = "recognition-list.aspx";
    var loading = false;

    populateCountryList(curGroup);

    function resetSort() {
        jQuery("#recognition-head .getSort").val("");
        curCountry = "all";
        curSort = "";
    };

    function addListClass() {
        jQuery("#recognition-body").removeAttr("class");
        jQuery("#recognition-body").addClass(curGroup);
        if (curGroup == "platinum") {
            enableSortOptions(false);
        } else {
            enableSortOptions(true);
        };
    };

    function enableSortOptions(boo) {
        if (boo) {
            jQuery(".getSort")
                .attr('disabled', false)
                .fadeIn("fast");

            jQuery(".getCountry")
                .attr('disabled', false)
                .fadeIn("fast");
        } else {
            curCountry = "all";
            jQuery(".getSort")
                .attr('disabled', true)
                .fadeOut("fast");

            jQuery(".getCountry")
                .attr('disabled', true)
                .fadeOut("fast")
                .find('option:first').attr('selected', 'selected').parent('select');
        };
    };

    jQuery("#recognition")
        .ajaxSend(function () { ajaxStatus = "Send"; showLoading(); })
        .ajaxSuccess(function () { ajaxStatus = "Success"; });

    function loadList() {
        showContent(false);
        jQuery("#load-list")
            .load(getListURL());

        showContent(true);

        window.location.hash = "#" + curGroup;
    };
    loadList();
    resetSort();
    addListClass();
    highlightActiveAnchor();

    jQuery(".recAnchor").click(function () {
        if (ajaxStatus == "Success") {
            resetSort();
            curGroup = jQuery(this).attr("title");
            listPath = jQuery(this).attr("href");
            if (curGroup == "platinum") {
                curCountry = "all";
            };
            curPage = 1;
            loadList();
            addListClass();
            highlightActiveAnchor();
            populateCountryList(curGroup);
        };
        return false;
    });

    function populateCountryList(curGroup) {

        var list = "";

        switch (curGroup) {
            case "gold":
                list = getCountryList(d.arr8);
                break;
            case "international":
                list = getCountryList(d.arr7);
                break;
            case "presidential":
                list = getCountryList(d.arr6);
                break;
            case "diamond":
                list = getCountryList(d.arr5);
                break;
            default:
                list = getCountryList(0);
                break;
        };

        $(".getCountry").html(list);
    };

    function getCountryList(num) {
        var list = "<option value=\"all\">All Countries</option>";

        if (num) {
            for (i = 0; i < num.length; i++) {
                list += "<option value=\"" + num[i] + "\">" + num[i] + "</option>";
            };
        };

        return list;
    };

    function highlightActiveAnchor() {
        jQuery("#recognition-head a.recAnchor").each(function () {
            jQuery(this).removeClass("active");
            if (jQuery(this).attr("title") == curGroup) {
                jQuery(this).addClass("active");
            };
        });
    };

    jQuery("#recognition-head .getCountry").change(function () {
        curCountry = $(this).val();
        curPage = 1;
        loadList();
    });

    var timer = null;
    jQuery("#recognition-head .getSort").bind("keyup", function () {
        input = jQuery(this);
        curSort = input.val();
        function getSort() {
            timer = null;
            curPage = 1;
            input.removeClass("thinking");
            loadList();
        };
        if (timer === null) {
            timer = setTimeout(getSort, 1500);
            input.addClass("thinking");
        };
    });

    jQuery(".overlay-close").click(function () {
        if (ajaxStatus == "Success") {
            hideOverlay();
            hideLoading();
        };
        return false;
    });

    function showOverlay(url) {
        jQuery("#recognition-overlay")
            .fadeIn("slow")
            .find("#load-content")
            .html("<img class=\"loading-bars\" src=\"../../App_Themes/images/loading/bars.gif\" width=\"36\" height=\"38\" alt=\"loading\" />")
            .load(url);
    };

    function hideOverlay() {
        jQuery("#recognition-overlay").fadeOut("slow");
    };
    /*=================================================================================
    Bind and Rebind all Elements
    =================================================================================*/

    function bindGetName() {
        jQuery("a.getName").click(function () {
            hideLoading();
            var url = jQuery(this).attr("href");
            showOverlay(url);
            return false;
        });
        if (curGroup == "platinum") {
            $(".platinum ul").ninjaGallery({
                verticalOffset: -50,
                smallSize: 130,
                largeSize: 165,
                extraContentId: ".additional-content",
                offActiveCss: { top: "45px", display: "none" },
                onActiveCss: { top: "-45px", display: "block" },
                offActiveAnimation: { opacity: 0 },
                onActiveAnimation: { opacity: 1 }
            });
        };
    };

    function bindPagination() {
        jQuery(".pagination a").click(function () {
            if (ajaxStatus == "Success") {
                var rankInfo = getRankInfo(curGroup);
                var rankID = rankInfo[0];
                var rankTotal = rankInfo[1];
                var numPerPage = rankInfo[2];
                var totalPages = Math.ceil(rankTotal / numPerPage);

                if (jQuery(this).hasClass("left")) {
                    if (curPage > 1) {
                        curPage = parseInt(curPage) - 1;
                    };
                }

                if (jQuery(this).hasClass("right")) {
                    if (curPage < totalPages) {
                        curPage = parseInt(curPage) + 1;
                    }
                }

                if (!jQuery(this).hasClass("dir")) {
                    curPage = jQuery(this).html();
                };
                loadList();
            };
            return false;
        });
    };

    function reBind() {
        bindIt = function () {
            if (ajaxStatus == "Success") {
                bindGetName();
                GoGoSuperPaginate();
                bindPagination();
                clearInterval(ID);
            };
        };
        ID = setInterval(bindIt, 100);
    };

    /*=================================================================================
    Transitions Content & Shows Loading Graphic
    =================================================================================*/

    function showContent(boo) {

        if (boo) {
            loading = false;
            hideLoading();
            jQuery("#load-list")
                .css({ display: "block", opacity: 0 })
                .stop()
                .animate({ opacity: 1 }, 100, reBind);
        } else {
            loading = true;
            jQuery("#load-list")
                .stop()
                .animate({ opacity: 0 }, 500)
                .css({ top: 0 });
        };
    };

    function hideLoading() {
        jQuery("#recognition-body .loading-bars")
            .stop()
            .animate({ opacity: 0 })
            .css({ display: "none" });
    };

    function showLoading() {
        jQuery("#recognition-body .loading-bars")
            .css({ display: "block", opacity: 0 })
            .stop()
            .animate({ opacity: 1 });
    };

    /*=================================================================================
    Generate URL Used To Pull List Info
    =================================================================================*/

    function getListURL(obj) {
        var rankInfo = getRankInfo(curGroup);
        var rankID = rankInfo[0];
        var rankTotal = rankInfo[1];
        var numPerPage = rankInfo[2];
        var url = listPath + "?rankID=" + rankID + "&pageNum=" + numPerPage + "&page=" + curPage + "&country=" + escape(curCountry) + "&sort=" + curSort;

        //##################################################################################
        //$.trace(url);
        //##################################################################################

        return url;
    };

    /*=================================================================================
    Update Pagination
    =================================================================================*/

    function GoGoSuperPaginate() {
        var pages = "";

        var startingNum = 1
        var rankInfo = getRankInfo(curGroup);
        var rankTotal = rankInfo[1];
        var numPerPage = rankInfo[2];
        var totalPages = Math.ceil(rankTotal / numPerPage);
        var maxPage = totalPages;

        if (totalPages > 1) {
            if (maxPage > 5) {
                if (curPage <= 2) {
                    startingNum = 1;
                    maxPage = 5;
                } else if (curPage > 2) {
                    startingNum = eval(curPage) - 2;
                    maxPage = eval(curPage) + 2;
                };
                if (curPage > (totalPages - 2)) {
                    startingNum = totalPages - 4;
                    maxPage = totalPages;
                };
            };

            if (curPage == 1) {
                pages = "<a class='dir left inactive' href='#'>&lt;</a> ";
            } else {
                pages = "<a class='dir left' href='#'>&lt;</a> ";
            };

            if (startingNum >= 2) {
                pages += "<a href='#'>1</a> ";
                pages += " ... ";
            };

            for (i = startingNum; i <= maxPage; i++) {
                if (curPage == i) {
                    pages += "<a href='#' class='active'>" + i + "</a> ";
                } else {
                    pages += "<a href='#'>" + i + "</a> ";
                };
            };

            if ((totalPages > 5) && (curPage < (totalPages - 2))) {
                pages += " ... ";
                pages += "<a href='#'>" + totalPages + "</a> ";
            };

            if (curPage == totalPages) {
                pages += "<a class='dir right inactive' href='#'>&gt;</a> ";
            } else {
                pages += "<a class='dir right' href='#'>&gt;</a> ";
            };
        };
        jQuery(".pagination").html(pages);
    };

    /*=================================================================================
    Grab Info On Current Rank
    =================================================================================*/

    function getRankInfo(type) {
        var rank;
        var total;
        var showNum;
        switch (type) {
            case "platinum":
                rank = 9;
                total = jQuery("#qTotal").html();
                showNum = 7;
                break;
            case "gold":
                rank = 8;
                total = jQuery("#qTotal").html();
                showNum = 12;
                break;
            case "international":
                rank = 7;
                total = jQuery("#qTotal").html();
                showNum = 13;
                break;
            case "presidential":
                rank = 6;
                total = jQuery("#qTotal").html();
                showNum = 13;
                break;
            case "diamond":
                rank = 5;
                total = jQuery("#qTotal").html();
                showNum = 13;
                break;
            default:
                rank = 0;
                total = jQuery("#qTotal").html();
                showNum = 0;
                break;
        };

        var rankArray = new Array(rank, total, showNum);

        return rankArray;
    };

};
