﻿/// <reference path="../../Scripts/jquery-1.5-vsdoc.js" />

(function () {
    $(function () {
        registerMatchingProfiles();
        setEmbedLink();

        setAjaxJobLoad();
        setPlaceholders();
        setFavorites();
        setSortMenu();
        setPrevNextCookie();

        $("form.remove").submit(function () {
            return window.confirm("This job listing will be expired immediately. Continue?");
        });

        setShareButtons();
        setApplyClick();
        setApplyOutClicks();
        setExtendClicks();
        setBumpClick();
        setAdminToggle();
        setHistoryToggle();

        setFlag();
        Careers.load();
    });

    var hasPushState = !!(window.history && history.pushState);
    var isinitialload = true;
    var initialurl = location.href;

    var setAjaxJobLoad = function () {
        if (hasPushState && location.pathname.indexOf("/jobs") == 0) {
            var joblinks = $("#content a[href^='/jobs']:not(a.fav-toggle):not(a.rss):not(a.subscribe):not(a.flag):not(a.cancel):not(a.admin):not(a.submit)");
            joblinks.live('click', function (e) {
                if (e.metaKey)
                    return true;
                var href = $(this).attr("href");
                window.history.pushState({ href: href }, "", href);
                urlChange(href);
                return false;
            });

            window.onpopstate = function (event) {
                if (event.state && event.state.href) {
                    urlChange(event.state.href);
                } else if (!isinitialload) {
                    urlChange(initialurl);
                }
            };

            setAjaxSearchForm();
        }
    };

    var setAjaxSearchForm = function () {
        var form = $("form.searchform");
        form.not("set").submit(function () {
            var action = form.attr("action");
            var qs = form.serialize();
            var href = action + "?" + qs;

            if ($("#istelecommute", form).is(":checked") && !$("#offersrelocation", form).is(":checked") && $("#searchTerm", form).isEmpty() && $("#location", form).isEmpty()) {
                href = action + "/telecommute";
            }

            $("img.spinner").show();
            window.history.pushState({ href: href }, "", href);
            urlChange(href);
            return false;
        }).addClass("set");
    };

    var urlChange = function (url) {
        isinitialload = false;
        if (typeof pageTracker != "undefined")
            pageTracker._trackPageview(url);

        var parts = url.split('?');
        if (parts.length > 1)
            url += "&ajax=1";
        else
            url += "?ajax=1";

        $.get(url, function (response) {
            var detail = $("#jobs-content");
            $response = $(response);
            var html = $response.is("#jobdetailpage") ? $response :
                       $response.find("#jobdetailpage").length ? $response.find("#jobdetailpage") :
                       response;

            detail.html(html);
            document.title = $("span.page-title").text();
            window.scrollTo(0, 0);
            $("img.spinner").hide();
            setAjaxSearchForm();
            setPrevNextCookie();
            Careers.load();
        });
    };

    var setSidebarScroll = function () {
        $(".sidebar").scrollFix();
    };

    var setShareButtons = function () {
        $("a.twitter").live('click', function () {
            $(this).popupWindow({ centerBrowser: 1, width: 600, height: 360 });
            return false;
        });
        $("a.facebook").live('click', function () {
            $(this).popupWindow({ centerBrowser: 1, width: 600, height: 360 });
            return false;
        });
    };

    var setPlaceholders = function () {
        var fields = $("input[placeholder]").placeholder();
    };

    var setSortMenu = function () {
        var menu = $("select", "#sortmenu");

        menu.live("change", function () {
            var baseurl = $(this).attr("baseurl");
            var addq = baseurl.indexOf('?') == -1;
            var addampersand = baseurl.split('?').length > 1 && baseurl.split('?')[0].length > 0;
            var url = $(this).attr("baseurl") + (addq ? '?' : '') + (addampersand ? '&' : '') + $(this).attr("name") + "=" + $(this).val();
            document.location.href = url;
        });
    };

    var setHistoryToggle = function () {
        var link = $("a.admin.history");
        link.live('click', function () {
            var clicked = $(this);
            var historysidebar = $("#history");
            var url = clicked.attr("href");
            clicked.text("loading...").addClass("disabled");
            historysidebar.load(url);
            return false;
        });
    };

    var setAdminToggle = function () {
        var link = $("a.admin.toggle");
        link.live('click', function () {
            var clicked = $(this);
            var adminsidebar = $("#jobadmin");
            var url = clicked.attr("href");
            clicked.text("loading...").addClass("disabled");
            adminsidebar.load(url, setAdminForm);
            return false;
        });
    };

    var setAdminForm = function () {
        var adminform = $("#jobadminform", ".sidebar");
        var submit = adminform.find("input:submit");
        var originalsubmit = submit.val();
        submit.width(submit.outerWidth());
        var options = {
            beforeSubmit: function () {
                submit.attr("disabled", "disabled").val("saving");
            },
            success: function (response) {
                var saved = adminform.find(".saved, #fivemins");
                submit.removeAttr("disabled").val(originalsubmit);
                saved.fadeIn("normal", function () {
                    setTimeout(function () {
                        saved.fadeOut("normal");
                    }, 8000);
                });
            }
        };

        adminform.ajaxForm(options);

        var fadeHighlighted = function (cb) {
            var adminform = $("#jobadminform", ".sidebar");
            var highlightedmask = $("div#highlightedmask", adminform);
            var highlightedcheckbox = $("input#IsHighlighted", adminform);

            if (cb.is(":checked")) {
                if ($.browser.msie)
                    highlightedmask.show();
                else
                    highlightedmask.fadeIn("fast");
                highlightedmask.attr("title", "All featured jobs are highlighted");
                highlightedcheckbox.attr("checked", "checked");
            } else {
                if ($.browser.msie)
                    highlightedmask.hide();
                else
                    highlightedmask.fadeOut("fast");
                highlightedmask.attr("title", "");
                highlightedcheckbox.removeAttr("checked");
            }
        };

        var setAdminHighlighted = function () {
            var adminform = $("#jobadminform", ".sidebar");

            if (adminform.length) {
                var highlighteddiv = $("div#highlighted", adminform);
                var featuredcheckbox = $("input#IsFeatured", adminform);
                var highlightedcheckbox = $("input#IsHighlighted", adminform);

                var highlightedmask = $("div#highlightedmask", highlighteddiv);
                highlightedmask.width(highlighteddiv.width()).height(highlighteddiv.height());

                featuredcheckbox.change(function () {
                    fadeHighlighted($(this));
                });

                fadeHighlighted(featuredcheckbox);
            }
        };

        setAdminHighlighted();
    };


    var setApplyClick = function () {
        var link = $("div.careers-btn", ".jobdetail");
        link.live('click', trackApply);

        function trackApply() {
            var img = $("img#applyanalytic", ".jobdetail");
            var src = img.data("analyticurl");
            img.attr("src", src);
        }
    };

    var setApplyOutClicks = function () {
        var outlinks = $("a[href^=http], a[href^=mailto]", ".apply");
        outlinks.live('click', function () {
            var outurl = $("span[outurl]", ".jobdetail").attr("outurl");
            var link = $(this);
            var href = link.attr("href");
            var analyticurl = outurl;

            var r = link.attr("r");
            if (r) {
                analyticurl += "?r=" + r;
            }

            if (href.indexOf("mailto:") == 0) {
                $.get(analyticurl);     // record analytic, but don't navigate
                return true;
            } else if (r.length) {
                document.location.href = analyticurl;
                return false;
            }
        });
    };

    var setExtendClicks = function () {
        var links = $("a.extend");
        links.live('click', function () {
            var link = $(this);
            var href = link.attr("href");

            var isother = link.hasClass("other");

            if (isother) {
                var desired = window.prompt("For how many days would you like to extend this job listing?");
                if (desired.length == 0)
                    return false;
                href = href.replace(/0$/g, desired);
            }

            link.addClass("disabled");

            $.get(href, function (response) {
                var div = $("div#extend", ".sidebar");
                div.html(response).find("span.expirationupdate").effect("highlight", { color: "#FFE1CC" }, 2000);
                link.removeClass("disabled");
            });

            return false;
        });
    };

    var setBumpClick = function () {
        var links = $("a.bump");
        links.live('click', function () {
            var link = $(this);
            var href = link.attr("href");
            link.addClass("disabled").html("Bumping...");

            $.get(href, function (response) {
                var p = $("<p>").html(response).addClass("green-check-bg").hide();
                link.parent().hide().after(p);
                p.fadeIn();
            });

            return false;
        });
    };

    var classname = "isfav";

    var setFavorites = function () {
        var toggles = $("a.fav-toggle");

        toggles.live('click', function (event) {
            var link = $(this);
            var href = link.attr("href");

            var sisterlink = $("a[href='" + href + "']", "div.listitem");

            if (link.parents(".fav-job").length) {
                link.parents(".fav-job").slideUp(function () {
                    updateFav(link, sisterlink);
                });
            } else {
                updateFav(link, sisterlink);
            }

            // optimistically switch the graphic and text :)
            link.toggleClass(classname).html(getFavText(link));

            event.preventDefault();

            return false;
        });

        var wrapper = $("#favjobs-wrapper", ".sidebar");

        if (wrapper.length > 0 && wrapper.html().replace(/\s/g) == '')
            wrapper.hide();
    };

    var updateFav = function (link, sisterlink) {
        var url = link.attr("href");
        $.getJSON(url, function (result) {
            link.toggleClass(classname, result.isfav).html(getFavText(link)).attr("title", result.isfav ? "This job listing is now in your favorites. Click if you'd like to remove." : "Click to add this job to your favorites.");
            if (sisterlink) sisterlink.toggleClass(classname, result.isfav).html(getFavText(sisterlink));

            var wrapper = $("#favjobs-wrapper", ".sidebar");
            if (result.isnone)
                wrapper.slideUp();
            else
                wrapper.html(result.sidebar).slideDown();
        });
    };

    var getFavText = function (link) {
        if (!link.is("#fav-share"))
            return "";

        var isfav = link.hasClass(classname);
        if (isfav)
            return "remove from favorites";
        return "add to favorites";
    }

    var setPrevNextCookie = function () {
        var prevnextids = $("input[name=prevnextids]").val();

        if (prevnextids) {
            $.cookie('prevnextids', prevnextids, { path: '/jobs' });
        }
    };

    var setFlag = function () {
        var link = $("a.flag", ".sidebar");
        var cancel = $("a.cancel", ".sidebar");

        link.live('click', function () {
            var form = $("form.flag", ".sidebar");
            form.toggle();
            form.find("textarea").focus();
            setForm();
            return false;
        });

        cancel.live('click', function () {
            var form = $(this).parents("form").first().hide();
            return false;
        });

        var setForm = function () {
            var form = $("form.flag", ".sidebar").not(".ajaxed");
            var options = {
                success: function (response) {
                    form.html(response);
                }
            };
            form.ajaxForm(options).addClass("ajaxed");
        };
    };

    var registerMatchingProfiles = function () {
        Careers.onEachLoad(function () {
            var span = $("span.matching-profiles[data-url]", "div.sidebar");
            if (!span.length) {
                return;
            }
            var href = span.data("url");
            $.get(href, function (html) {
                $html = $(html).hide();
                span.after($html);
                $html.fadeIn();
            });
        });
    };

    $.extend({
        waitFor: function (selector, options) {
            if (!options) return;
            var check = function () {
                var els = $(selector);
                if (els.length && (typeof options.constraint != "function" || options.constraint.call(els))) {
                    if (typeof options.success == "function")
                        options.success.call(els);
                    return true;
                }
                return false;
            };

            var state = { last_delay: 0, elapsed: 0 };

            setTimeout(function loop() {
                if (check())
                    return;

                state.elapsed += state.last_delay;
                if ("max_wait" in options && state.elapsed > options.max_wait) {
                    if (typeof options.failure == "function")
                        options.failure.call();
                    return;
                }

                state.last_delay = Math.min(options.max_interval || 1000, Math.max(1, state.last_delay * 2));
                setTimeout(loop, state.last_delay);
            }, state.last_delay);
        }
    });

    function setEmbedLink() {
        Careers.onEachLoad(function () {
            if ($("#embed").length == 0) return;
            
            var embedHtml = $("#embed-body")[0].innerHTML.replace(/\\u003c/g,"<").replace(/^\s+|\s+$/g, "");
            $("#embed-textarea").focus(function () {
                var txt = this;
                setTimeout(function () { txt.select(); }, 0);
            })
                .val(embedHtml);
            $("#embed a").click(function () {
                $(this).next().slideToggle();
                $('#embed-textarea').select();
            });
        });
    }

})();
