(function() {
    /**
    * Specific PKR.COM methods
    *
    * @author 		Paul Campbell
    * @copyright 	Copyright (c) 2009, PKR.com. All rights reserved.
    */

    // Public namespace
    var pkr = window.pkr = new Object();

    pkr.initialize = function() {
        this.addSearch();
        this.addLoginPanel();
        this.addComponentPanels();
        this.applyNavigationStates();
        //	this.addExpandingPanels();
        this.addTabbedMyPkr();
        this.addStatusPanel();
        this.addExpandingStats();
        this.addSettingsPanel();
        this.addSlideAdverts();
        this.addBackToTop();
        this.starRatingRollOver();
        this.addSocialHistoryIcons();
        this.addThumbChanger();
        this.addDatePickers();
        //this.addImageCarousels();
        this.addRankingsDateFilter();
        this.addPNGClass();
    }

    pkr.addPNGClass = function() {

        $("#primary li ol").addClass('png_bg');
        $("#secondary").addClass('png_bg');

    }

    /*pkr.addImageCarousels = function() {

        $(".image-carousel").jCarouselLite({
            btnNext: ".image-carousel .carousel-next",
            btnPrev: ".image-carousel .carousel-prev",
            speed: 500,
            easing: "easeInQuad"
        });

        $(".carousel-options a").click(function() {
            $(".image-carousel > img").attr("src", $(this).children("img").attr("src").replace("-s.jpg", ".jpg"));
            return (false);
        });

        $(".carousel-options, .carousel-controls").show();

    }*/

    pkr.addDatePickers = function() {
        var DATE_CLASS = "datepicker";
        $("." + DATE_CLASS).datePicker(
		    {
		        startDate: '01/01/1970',
		        endDate: (new Date()).asString(),
		        clickInput: false
		    }
	    );
        var DATE_CLASS_FUTURE = "datepicker-future";
        $("." + DATE_CLASS_FUTURE).datePicker(
	        {
	            startDate: (new Date()).asString(),
	            endDate: getLastDayOfNextMonth().asString(),
	            clickInput: false
	        }
        );
    }

    pkr.addThumbChanger = function() {

        var THUMB_CLASS = "thumbs";
        var TARGET_CLASS = "thumb-target";

        var target = $("." + TARGET_CLASS);

        $("." + THUMB_CLASS + " li a").each(function() {

            var el = $(this);

            el.click(function() {

                if ($.browser.msie.version < 7) {
                    if (el.attr("href")) {
                        el.attr("rel", el.attr("href"));
                        el.removeAttr("href");
                    }
                    target.attr("src", el.attr("rel"));
                } else {
                    target.attr("src", el.attr("href"));
                }

                return (false);
            });

        });

    }

    pkr.applyNavigationStates = function() {
        // var active = $("#primary li.active");
        // 	$("#primary li:not(.active)").hover(function () { 
        // 		active.removeClass(ACTIVE_CLASS);
        // 	}, function () { 
        // 		active.addClass(ACTIVE_CLASS);
        // 	})

        var val, prev;


        function setNavigationTimeout() {
            clearInterval(val);
            val = setInterval(function() {
                clearInterval(val);
                $("#primary li." + HOVER_CLASS).removeClass(HOVER_CLASS);
            }, 1000);
        }

        $("#primary > li > a").mouseover(function() {
            clearInterval(val);
            $(this).parent().addClass(HOVER_CLASS);
            if (prev) {
                prev.parent().removeClass(HOVER_CLASS);
            }
            prev = $(this);
        });

        $("#navigation").mouseout(function(e) {
            if (e.relatedTarget) {
                if (!$(e.relatedTarget).parents("#navigation").length) {
                    // Only trigger when element is formally out of the navigation block
                    // confirm this by checking the related (next) target
                    setNavigationTimeout();
                }
            }
        });



    }

    pkr.starRatingRollOver = function() {
        $(".star-rating a").hover(function() {
            $(this).prevAll("a").addClass(HOVER_CLASS);
        }, function() {
            $(this).prevAll("a").removeClass(HOVER_CLASS);
        });
    }

    pkr.addSocialHistoryIcons = function() {

        var el = $(".social-networks");
        var default_sites = ["Digg", "Facebook"];
        var sites = {
            "Facebook": "http://www.facebook.com/share.php?u=",
            "Digg": "http://digg.com/submit?phase=2&url=",
            "Google Bookmarks": "http://www.google.com/bookmarks/mark?op=edit&bkmk=",
            "Del.icio.us": "http://del.icio.us/post?url=",
            "Newsvine": "http://www.newsvine.com/_tools/seed&save?popoff=0&u=",
            "Reddit": "http://reddit.com/submit?url=",
            "StumbleUpon": "http://www.stumbleupon.com/submit?url=",
            "BlinkList": "http://blinklist.com/index.php?Action=Blink/addblink.php&Url="
        }

        if (el) {

            var user = SocialHistory();
            var ul = el.append('<ul class="clearfix"></ul>').children("ul");

            for (var site_name in sites) {
                if ($.inArray(site_name, default_sites) || user.doesVisit(site_name)) {

                    var url = sites[site_name];
                    ul.append('<li><a rel="external" href="' + url + window.location.href + '" title="' + site_name + '"><img class="sprite-net sx-' + site_name.replace(/\./gi, "").toLowerCase() + '" src="images/common/transparent.png" alt="" height="20" width="20" /></a></li>');

                }
            }
        }
    }

    pkr.addBackToTop = function() {
        $("#glossary dd:gt(1)").append('<a class="scroll-top" href="' + location.href + '#content">Top</a>').css("position", "relative");
    }

    pkr.addSlideAdverts = function() {
        var ADVERT_CLASS = "advert-space";
        var ADVERT_TITLE_CLASS = "advert-title";
        var ADVERT_TEXT_CLASS = "advert-text";
        var TWEEN_DURATION = 500;

        $("." + ADVERT_CLASS).each(function() {
            var el = $(this);
            var text = el.find("." + ADVERT_TEXT_CLASS);
            var title = el.find("." + ADVERT_TITLE_CLASS);
            var img = el.find("img");

            el.css("position", "relative");
            title.css({
                position: "absolute",
                zIndex: 100
            });
            text.css({
                relative: "absolute",
                top: (title.outerHeight() - text.outerHeight())
            })
            img.css({
                position: "relative",
                top: title.outerHeight()
            });
            //text.css( css );

            el.hover(function() {
                text.animate({
                    top: title.outerHeight()
                }, TWEEN_DURATION);
            }, function() {
                text.css("top", 0 - text.outerHeight())
            });
        });
    }

    pkr.isElementVisible = function(el) {
        var css_display = el.css("display");
        return (css_display && css_display != "none");
    }

    pkr.addSearch = function() {
        var ELEMENT_ID = ["site-search", "player-search", "forum-search"];

        $("#" + ELEMENT_ID.join(", #")).each(function() {
            var el = $(this);
            // var button 	= el.find("input.submit");
            var field = el.find("input[@type=text]");

            field.defaultvalue(field.siblings("legend").html());
            field.siblings("label[@for=" + field.attr("id") + "]").hide();
        });

        $("#store-search").each(function() {
            var el = $(this);
            el.find("input").hide();
            el.find("select").change(function() {
                $("form:first").submit();
            });
        });
    }

    pkr.addSettingsPanel = function() {

        var COMP_CLASS = "expand-panel";
        var BUTTON_CLASS = "expand-panel-button";
        var BUTTON_CLASS_CLOSE = "expand-panel-close";
        var OPEN_BY_DEFAULT_CLASS = "open-by-default"
        var TWEEN_DURATION = 600;

        var panel = $("." + COMP_CLASS);
        var button = $("." + BUTTON_CLASS);

        var col = $("#sub-column-left");
        var nav = $("#tertiary");
        if (col.length) {
            col.prepend(panel);
        } else if (nav.length) {
            nav.after(panel);
        } else {
            $("hr:first").after(panel);
        }

        if (panel.hasClass(OPEN_BY_DEFAULT_CLASS)) {
            panel.addClass(ACTIVE_CLASS);
            button.addClass(ACTIVE_CLASS);
        }
        else {
            panel.hide();
        }
        button.click(function() {
            if (panel.hasClass(ACTIVE_CLASS)) {
                panel.removeClass(ACTIVE_CLASS).slideUp();
                button.removeClass(ACTIVE_CLASS);
            } else {
                panel.addClass(ACTIVE_CLASS).slideDown();
                button.addClass(ACTIVE_CLASS);
            }
            return (false);
        });

    }

    pkr.addExpandingPanels = function() {

        var COMP_CLASS = "expanding-panel";
        var BUTTON_CLASS = "expanding-panel-button";
        var BUTTON_CLASS_CLOSE = "expanding-panel-close";
        var BUTTON_TEXT_OPEN = "Open";
        var BUTTON_TEXT_CLOSE = "Close";
        var BUTTON_CLASS_ACTIVE = "expanding-panel-active";
        var TWEEN_DURATION = 600;
        var TWEEN_EASING = "easeInSine";

        $("." + COMP_CLASS).each(function() {

            function togglePanelState() {
                if (pkr.isElementVisible(el)) {
                    el.slideUp();
                    button.html(BUTTON_TEXT_OPEN).removeClass(BUTTON_CLASS_ACTIVE);
                } else {
                    el.slideDown();
                    button.html(BUTTON_TEXT_CLOSE).addClass(BUTTON_CLASS_ACTIVE);
                }
                return (false);
            }

            var el = $(this);
            el.hide();
            var prev = el.prev();
            var wrapper = prev.wrap("<div></div>").parent();
            wrapper.append('<a class="' + BUTTON_CLASS + '" href="">' + BUTTON_TEXT_OPEN + '</a>').css({
                position: "relative"
            });
            var button = wrapper.children("a." + BUTTON_CLASS);
            button.click(togglePanelState);
            el.find("." + BUTTON_CLASS_CLOSE).click(togglePanelState);

        });
    }

    pkr.addTabbedMyPkr = function() {
        this.tabContent(
		$("#my-pkr .tabbed-panel"),
		$("#my-pkr")
	);
    }

    pkr.tabContent = function(elements, target) {

        var TAB_CLASS = "tabbing";
        var TAB_OL_CLASS = "tab-nav";
        var TAB_TITLE_CLASS = "tab-title";

        var ol = target.prepend('<ol class="' + TAB_OL_CLASS + ' clearfix"></ol>').children("ol:first");

        function closeTabs() {
            ol.find("." + ACTIVE_CLASS).removeClass(ACTIVE_CLASS);
            elements.hide();
        }

        elements.each(function() {
            var el = $(this);
            var title = el.find(".tab-title");
            var id = title.children("a").attr("href").substring(1);
            var link = ol.append('<li id="tab-' + id + '"><a>' + title.text() + '</a></li>').find("a:last");

            title.remove();
            link.click(function(e) {
                if (!link.hasClass(ACTIVE_CLASS)) {
                    closeTabs();
                    el.show();
                    link.addClass(ACTIVE_CLASS);
                }
                return (false);
            });
        });

        // Open the first element
        ol.find("a:first").click();
    }

    pkr.addExpandingStats = function() {

        var TITLE_CLASS = "stat-title";
        var TWEEN_DURATION = 300;

        var panes = $("#my-pkr ." + TITLE_CLASS);

        function closeStats() {
            $("#my-stats ." + ACTIVE_CLASS).removeClass(ACTIVE_CLASS).filter("table").slideUp();
        }

        panes.each(function(index) {
            var el = $(this);
            var link = el.children("a")
            var table = el.next("table");

            if (index < 1) {
                table.addClass(ACTIVE_CLASS);
                el.addClass(ACTIVE_CLASS)
            } else {
                table.hide();
            }

            link.click(function() {
                if (!table.hasClass(ACTIVE_CLASS)) {
                    closeStats();
                    table.slideDown(TWEEN_DURATION);
                    table.addClass(ACTIVE_CLASS);
                    el.addClass(ACTIVE_CLASS);
                }
                return (false);
            });
        });
    }

    pkr.addStatusPanel = function() {

        var PANEL_ID = "status-panel";
        var INPUT_DEFAULT = "What are you doing at the moment?";
        var API_URL = "../php/update_status.php";

        var el = $("#" + PANEL_ID);
        var button = el.find("input[@type=image]");
        var field = el.find("input[@type=text]");
        var notification = el.children("p");

        field.defaultvalue(INPUT_DEFAULT).focus(function() {
            button.show();
        }).blur(function() {
            button.hide();
        }).blur();

        notification.wrapInner("<a></a>").children("a").click(function() {
            field.focus();
            return (false);
        });

    }

    pkr.addUpdatingFeedPanel = function(feedURL, elementId) {

        var CACHE = new Object();
        var UPDATE_FREQUENCY = 150000;
        var INTERVAL_ID;

        // Initiate
        if (feedURL) {
            getFeedData();
        }

        function getFeedData() {
            clearUpdate();
            $.get(feedURL, panelCallback, "xml");
        }

        function setUpdate() {
            INTERVAL_ID = setInterval(getFeedData, UPDATE_FREQUENCY);
        }

        function clearUpdate() {
            if (INTERVAL_ID) {
                clearInterval(INTERVAL_ID);
            }
        }

        function panelCallback(data) {
            if (data) {
                var xml = $(data);
                var articles = xml.find("article");
                var n = articles.length;
                for (var i = 0; i < n; i++) {
                    var article = articles.eq(i);
                    if (article) {
                        var id = article.attr("id");
                        if (!CACHE[id]) {
                            CACHE[id] = article.find("message");
                        }
                    }
                }
            }
            setUpdate();
        }
    }

    pkr.addLoginPanel = function() {
        $("#user-login-button").attr("href", "#user-login-panel");
        if ($("#store-login-form"))
            $("#store-login-form").show();
    }

    pkr.addComponentPanels = function() {

        var COMP_CLASS = "component-panel";
        var COMP_CLASS_CONTENT = "component-content";
        var BUTTON_CLASS = "component-button";
        var BUTTON_CLASS_CLOSE = "component-close";

        var panels = $("." + COMP_CLASS);

        panels.each(function() {

            var el = $(this);
            var link = el.find("." + BUTTON_CLASS + " a");
            var panel = $(link.attr("href"));

            // Move panel to header element and hide
            panel.appendTo(el);
            panel.hide();

            function closePanels() {
                panels.find("." + COMP_CLASS_CONTENT).removeClass(ACTIVE_CLASS).hide();
                panels.find("a." + ACTIVE_CLASS).removeClass(ACTIVE_CLASS);
            }

            link.click(function() {
                if (panel.hasClass(ACTIVE_CLASS)) {
                    closePanels();
                } else {
                    closePanels();
                    panel.show();
                    panel.addClass(ACTIVE_CLASS);
                    link.addClass(ACTIVE_CLASS);
                }
                return (false);
            });

            if (panel.hasClass(ACTIVE_CLASS)) {
                panel.removeClass(ACTIVE_CLASS);
                link.click();
            }

        });
    }

    pkr.addRankingsDateFilter = function() {
        if ($("#date-filter-options").length > 0) {
            if ($("#filter select.period-select")[0].selectedIndex == 0)
                $("#date-filter-options").hide();
            $("#filter select.period-select").change(function() {
                if ($("#filter select.period-select")[0].selectedIndex == 0) {
                    $("#date-filter-options").hide();
                } else {
                    $("#date-filter-options").show();
                }
                return (false);
            });
        }
    }

})();

function getLastDayOfNextMonth() {
    var dt = new Date();
    dt.setMonth( dt.getMonth() + 1 );
    return(new Date((new Date(dt.getFullYear(), dt.getMonth()+1,1))-1));
}

