﻿var Site = {
    Init: function() {
        Site.FormInputs();
        Site.SearchButton();
        Site.HoverLists();
        Site.Collapsible();
        Site.RolloverTexts();
        Site.NotifyTexts();
        Site.CustomFormElements();
    },
    FormInputs: function() {
        var inputs = $$("input.labelInside");
        inputs.each(function(input) {
            var label = $$("label[for=" + input.get("name") + "]");
            if (label.length > 0) label = label[0];
            else label = input.getParent().getElement("label");

            if (label != null) {
                input.addEvent("focus", function() {
                    if (input.get("value") == label.get("text")) {
                        input.set("value", "");
                    }
                });
                input.addEvent("blur", function() {
                    if (input.get("value") == "") {
                        input.set("value", label.get("text"));
                    }
                });
                input.set("value", label.get("text"));
            }
        });
    },
    SearchButton: function() {
        var searchbtn = $$(".topbar .search .searchbtn")[0];
        var searchinput = $$(".topbar .search input")[0];
        searchbtn.addEvent("click", function(e) {
            location.href = "search/" + searchinput.get("value");
        });
    },
    HoverLists: function() {
        var hoverlist = $$(".hover-list > li");
        hoverlist.each(function(item) { Site.HoverInit(item, true); });

        var hoverable = $$(".hoverable");
        hoverable.each(function(item) { Site.HoverInit(item, false); });
    },
    HoverInit: function(item, list) {
        var prev, next;
        if (list) {
            prev = item.getPrevious();
            next = item.getNext();
        }
        item.addEvent("mouseenter", function(e) {
            item.addClass("hover");
            if (next != null) next.addClass("hover-next");
            if (prev != null) prev.addClass("hover-prev");
        });
        item.addEvent("mouseleave", function(e) {
            item.removeClass("hover");
            if (next != null) next.removeClass("hover-next");
            if (prev != null) prev.removeClass("hover-prev");
        });
    },
    RolloverTexts: function() {
        var texts = $$(".rolloverText");
        texts.each(Site.RolloverInit);
    },
    RolloverInit: function(item) {
        var target = item.getParent();
        var div = new Element("div", { "class": "rolloverDiv" });
        div.adopt(new Element("div", { "class": "arrow" }));
        div.adopt(item);
        if (target.getStyle("position") == "static") target.setStyle("position", "relative");
        target.addEvent("mouseenter", function(e) {
            target.adopt(div);
        });
        target.addEvent("mouseleave", function(e) {
            div.dispose();
        });
    },
    Collapsible: function() {
        var items = $$(".collapsible");
        items.each(function(item) {
            var targets = item.getElements(".collapsetarget");
            var body = item.getElement(".collapsebody");
            if (targets.length > 0 && body != null) {
                body.set('tween', { duration: 100 + body.getFirst().getSize().y });
                targets.addEvent("click", function(e) {
                    item.toggleClass("uncollapsed");
                    Site.Collapse(item);
                });
                if (item.hasClass("uncollapsed")) Site.Collapse(item);
                var close = item.getElement(".collapseclose");
                if (close) close.addEvent("click", function(e) {
                    item.removeClass("uncollapsed");
                    Site.Collapse(item);
                });
            }
        });
    },
    Collapse: function(item) {
        var body = item.getElement(".collapsebody");
        if (item.hasClass("uncollapsed")) {
            body.get('tween').start('height', body.getFirst().getSize().y).chain(function() { body.setStyle('overflow', 'visible'); });
        } else {
            body.setStyle('overflow', 'hidden');
            body.tween('height', '0px');
        }
    },
    InitCfe: function(target) {
        if (target) {
            $waitUntil('cfe', function() {
                cfe.spacer = "Images/CFE/spacer.gif";
                var myCfe = new cfe.replace();
                myCfe.unregisterModule("text");
                myCfe.unregisterModule("file");
                myCfe.unregisterModule("image");
                myCfe.unregisterModule("password");
                myCfe.unregisterModule("radio");
                myCfe.unregisterModule("textarea");
                myCfe.unregisterModule("button");
                myCfe.unregisterModule("submit");
                myCfe.unregisterModule("cancel");
                myCfe.setModuleOptions("select", {
                    scrolling: true,
                    scollSteps: 5
                });

                // initialize cfe
                myCfe.init({
                    scope: target
                });
            });
        }
    },
    CustomFormElements: function() {
        var targets = $$(".initCFE");
        targets.each(function(target) { Site.InitCfe(target); });
    },
    NotifyTexts: function(item) {
        var notifies = $$(".notify");
        notifies.each(function(notify) {
            var show = notify.getChildren()[0];
            var alt = notify.getChildren()[1];
            show.addEvent("click", function(e) { show.hide(); alt.show(); return false; });
        });
    }
}

window.addEvent('domready', Site.Init);

function $waitUntil(waitUntil, onComplete, delay, timeout) {
    switch ($type(waitUntil)) {
        case "string":
            if (waitUntil.contains(",")) waitUntil = waitUntil.split(",");
            else waitUntil = [waitUntil];
            $waitUntil(waitUntil, onComplete, delay);
            return;
        case "array":
            var variableNames = waitUntil;
            waitUntil = function() {
                // check for all types, if one of them is undefined, return false
                for (var i = 0; i < variableNames.length; i++) {
                    var name = variableNames[i];
                    if (name.contains(".")) {
                        var parts = name.split(".");
                        var temp = window;
                        // if one of the parts of the object is still undefined, return false
                        for (var j = 0; j < parts.length; j++) {
                            temp = temp[parts[j]];
                            if (!temp) return false;
                        }
                    }
                    if (window[name] == undefined) return false;
                }
                return true;
            };
            $waitUntil(waitUntil, onComplete, delay);
            return;
        case "function":
            break;
        default:
            throw new Error("Argument " + waitUntil + " is invalid for $waitUntil");
    }

    if (waitUntil()) {
        onComplete();
        return;
    }

    var timeoutPointer;
    var intervalPointer = function() {
        if (!waitUntil()) return;
        intervalPointer = $clear(intervalPointer);
        if (timeoutPointer) timeoutPointer = $clear(timeoutPointer);
        onComplete();
    } .periodical(delay || 100);
    // if after timeout ms function doesn't return true, abort
    if (timeout) timeoutPointer = function() {
        dbug.log("$waitUntil timed out.", waitUntil);
        intervalPointer = $clear(intervalPointer);
    } .delay(timeout);
}
