/*global jQuery, console, dotLBDetect, checkForm, window, lexiconEntries */
/*jslint browser: true, laxbreak: true, undef: true, eqeqeq: true, bitwise: true, regexp: true, newcap: true, immed: true */

if (typeof dotLBDetect === "undefined") {

    if (typeof String.trim === "undefined") {
        String.prototype.trim = function () {   // missing method trim for all strings
            return this.replace(/^\s+|\s+$/g, "");
        };
    }

    jQuery.noConflict();        // jQuery with no conflict to other js libraries
    var nova = {};              // container of all our javascript functionality

    nova.cookie = {             // cookie handling
        "get" : function (name) {
            for (var cookie = document.cookie.split(";"),
                    i = cookie.length - 1, element; i > -1; i -= 1) {
                element = cookie[i];
                if (name === element.substring(0, element.indexOf("="))) {
                    return element.substring(element.indexOf("=") + 1,
                            element.length);
                }
            }
            return null;
        },
        "remove" : function (name) {
            document.cookie = name +
                    "=; expires=Thu, 01-Jan-70 00:00:01 GMT;";
            return document.cookie;
        },
        "set" : function (name, value, duration, domain, path, secure) {
            document.cookie = [
                    name, "=", value,
                    (duration ? "; expires=" + new Date(new Date().
                            getTime() + duration).toGMTString() : ""),
                    (domain ? "; domain=" + domain : ""),
                    (path ? "; path=" + path : ""),
                    (secure ? "; secure" : "")
                ].join("");
            return document.cookie;
        }
    };

    nova.footer = function () { // resizes fat-footer entries to the maximum fat-footer entry
        var max = 0;
        jQuery("#fat-footer > ul > li").each(function () {
            jQuery(this).removeAttr("style");
            var height = jQuery(this).height();
            max = max < height ? height : max;
        });
        jQuery("#fat-footer > ul > li").css("height", max + "px");
    };

    nova.font = {   // resizes fonts
        "size" : {
            "normal" : "13px",
            "big" : "15px",
            "huge" : "17px"
        },

        "resize" : function (classname) {
            jQuery("#subnav > ul > li > a").addClass("changing");
            jQuery("body").animate({
                "fontSize" : nova.font.size[classname]
            }, 500, function () {
                document.body.className = classname;
                if (classname === "normal") {
                    jQuery("#subnav > ul > li > a").removeClass("changing");
                }
                nova.footer();
            });
            nova.cookie.set("size", classname, false, false, "/");
        }
    };

    nova.form = {
        "isMail" : function (mail) {
            return (/^[^\s()<>@,;:\/]+@\w[\w\.\-]+\.[a-z]{2,}$/i).
                    test(mail);
        }
    };

    nova.lexicon = function () {
        //highlighting only on articles
        if (!jQuery(".article-list").length || jQuery(".article-list .article-list-item").length) {
            return;
        }

        if (typeof lexiconEntries === "object" && lexiconEntries) {
            var novaContent = nova.contentNode;
            delete lexiconEntries.end_____;
            jQuery.each(lexiconEntries, function (key, value) {
                novaContent.wordUp({
                    "case": true,
                    findFirstOnly: true,
                    forbiddenParents: "a, h1, h2, h3, .h1, .h2, .h3, .additionalInformation, .lexicon-entry, .highlight, .article-list-item, .article-summary",
                    needle: key,
                    standAlone: true
                });

                //highlight is the class of the highlighter plugin
                jQuery(".highlight", novaContent).
                        attr("title", value).
                        removeClass("highlight").   //used only for the current iteration
                        addClass("lexicon-entry");
            });
            jQuery(".lexicon-entry", novaContent).tipTip();
        }
    };

    jQuery(document).ready(function () {
        nova.contentNode = jQuery("#nova-content");

        jQuery("a.send-slTopicForm").click(function () {
            if (checkForm()) {
                jQuery(this).addClass("hidden");
                jQuery("a.send-slTopicForm-inactive").removeClass("hidden");
                document.forms.slTopicForm.submit();
            }
        });

        jQuery("a.send-slPostForm").click(function () {
            if (checkForm()) {
                jQuery(this).addClass("hidden");
                jQuery("a.send-slPostForm-inactive").removeClass("hidden");
                document.forms.slPostForm.submit();
            }
        });

        jQuery("#font-size-button-normal").click(function () {
            var oldclassname = nova.cookie.get("size");
            if (oldclassname !== "normal") {
                nova.font.resize("normal", oldclassname);
            }
            return false;
        });

        jQuery("#font-size-button-big").click(function () {
            var oldclassname = nova.cookie.get("size");
            if (oldclassname !== "big") {
                nova.font.resize("big", oldclassname || "normal");
            }
            return false;
        });

        jQuery("#font-size-button-huge").click(function () {
            var oldclassname = nova.cookie.get("size");
            if (oldclassname !== "huge") {
                nova.font.resize("huge", oldclassname || "normal");
            }
            return false;
        });

        jQuery("#newsletter-subscribe").click(function () {
            if (this.form.first_name.value && this.form.last_name.value &&
                    nova.form.isMail(this.form.email.value)) {
                this.form.action.value = "subscribe";
                this.form.submit();
                return true;
            }

            jQuery("#newsletter-error .first, #newsletter-error .last, #newsletter-error .mail").
                    removeClass("hidden").addClass("hidden");

            if (!this.form.first_name.value) {
                jQuery("#newsletter-error .first").removeClass("hidden");
            }
            if (!this.form.last_name.value) {
                jQuery("#newsletter-error .last").removeClass("hidden");
            }
            if (!nova.form.isMail(this.form.email.value)) {
                jQuery("#newsletter-error .mail").removeClass("hidden");
            }

            jQuery("#newsletter-error").css("display", "none").
                    removeClass("hidden").show("fast");
            return false;
        });

        jQuery("#newsletter-unsubscribe").click(function () {
            if (nova.form.isMail(this.form.email.value)) {
                this.form.action.value = "unsubscribe";
                this.form.submit();
                return true;
            }
            jQuery("#newsletter-error .first, #newsletter-error .last, #newsletter-error .mail").
                    removeClass("hidden").addClass("hidden");
            jQuery("#newsletter-error .mail").removeClass("hidden");
            jQuery("#newsletter-error").css("display", "none").
                    removeClass("hidden").show("fast");
            return false;
        });

        jQuery(".picstreet .thumb").click(function () {
            jQuery(".picstreet .full").
                    attr("src", jQuery(this).attr("src"));
        });

        jQuery(".print-button").click(function () {
            print();
            return false;
        });

        jQuery(".video").click(function () {
            var x = open(jQuery(this).attr("href"), "_blank", [
                "dependent = yes", "height = 300", "width = 400",
                "hotkeys = no", "location = no", "menubar = no",
                "resizable = yes", "scrollbars = no", "status = no",
                "toolbar = no"
            ].join(","));
            x.focus();
            return false;
        });

        jQuery("map > [id^=coord]").
            mouseover(function () {
                var activeImage = jQuery("#click-image-description-images ." + jQuery(this).attr("id")),
                    defaultImage = jQuery("#click-image-description-images .default");
                if (activeImage.length) {
                    defaultImage.addClass("hidden");
                    activeImage.removeClass("hidden");
                }
            }).
            mouseout(function () {
                var activeImage = jQuery("#click-image-description-images ." + jQuery(this).attr("id")),
                    defaultImage = jQuery("#click-image-description-images .default");
                if (activeImage.length) {
                    defaultImage.removeClass("hidden");
                    activeImage.addClass("hidden");
                }
            }).
            click(function () {
                var activeNode = jQuery("#text-" + jQuery(this).attr("id")),
                    inactiveNode = jQuery("#click-image-description-texts > div.active");
                jQuery("#click-image-description-texts").slideUp("slow", function () {
                    inactiveNode.removeClass("active").
                        addClass("hidden");
                    activeNode.addClass("active").
                        removeClass("hidden");
                    jQuery(this).slideDown("slow").
                            removeClass("hidden");
                });
                return false;
            });

        jQuery("#orderForm").submit(function () {
            var isComplete = true;
            jQuery(".missing").removeClass("missing");
            jQuery("#orderForm [required]").each(function () {
                if (!jQuery(this).val()) {
                    jQuery(this).addClass("missing");
                    isComplete = false;
                } else {
                    if (jQuery(this).attr("required") === "email") {
                        if (!nova.form.isMail(jQuery(this).val())) {
                            jQuery(this).addClass("missing");
                            isComplete = false;
                        }
                    }
                }
            });
            jQuery("#orderForm .short").each(function () {
                if (!/^(\d+)$/.test(jQuery(this).val())) {
                    jQuery(this).addClass("missing");
                    isComplete = false;
                }
            });

            if (!isComplete) {
                jQuery(".error").css("display", "none").removeClass("hidden").
                        show("fast");
            }

            //jQuery("#autoReplyTo").val(jQuery("#email").val());

            return isComplete;
        });

        jQuery("a[href$=.jpg], a[href$=.jpeg], a[href$=.png]").fancybox({
            titlePosition: "inside",
            autoScale: false
        });

        nova.lexicon();

        //=== ajax based search ========================================================================================

        nova.search = {

            pageSize: 10,
            jContentNode: nova.contentNode,
            page: 0,
            term: "",
            site: "",

            fileTypes: {
                pdf: "PDF"
            },

            /** Called from outside. */
            search: function (term, site) {
                this.page = 0;
                this.term = term;
                this.site = site;
                this._search();
            },

            back: function () {
                nova.search.page--;
                nova.search._search();
            },

            forward: function () {
                nova.search.page++;
                nova.search._search();
            },

            _search: function () {
                // window.alert("searching... term: " + this.term + " | site: " + this.site + " | page: " + this.page);
                var query = 'select title, abstract, url from search.web(' + (this.page * this.pageSize) + ', ' + (this.pageSize + 1) + ') where query = "' + this.term + ' site:' + this.site + '"';
                var yql = "http://query.yahooapis.com/v1/public/yql?q=" + encodeURIComponent(query) + "&format=json&diagnostics=false&env=" + encodeURIComponent("store://datatables.org/alltableswithkeys") + "&callback=?";
                var that = this;
                that.jContentNode.html('<div id="searchresults" class="shadebox"><h1>Suchergebnisse</h1><div class="search-results">Bitte warten, Suche wird gestartet...</div></div>');
                jQuery.getJSON(yql, function(answer) {
                    var html = "";
                    html += '<div id="searchresults" class="shadebox"><h1>Suchergebnisse</h1>';
                    var results = (answer.query.results !== null) ? answer.query.results.result : [];
                    if(results.length > 0) {
                        html += "<dl>";
                        jQuery.each(results, function(i, result) {
                            if(i < that.pageSize) {

                                var title = result.title;
                                title = title.replace(/\<b\>/ig, '').replace(/\<\/b\>/ig, '');

                                var content = result["abstract"];
                                content = content.replace(/\b\>\.\.\.\<\/b\>/ig, "...");
                                content = content.replace(/\<b\>/ig, '<span class="searchresult">').replace(/\<\/b\>/ig, '</span>');

                                var fileExtensionIndex = result.url.lastIndexOf(".");
                                if(fileExtensionIndex >= 0) {
                                    var fileExtension = result.url.substring(result.url.lastIndexOf(".") + 1);
                                    var fileType = that.fileTypes[fileExtension];
                                    if(typeof fileType === "string") {
                                        title = '<span class="file-type">[' + fileType + ']</span> ' + title;
                                    }
                                }

                                html += '<dt><a href="' + result.url + '">' + title + '</a></dt><dd>' + content + '</dd>';

                            }
                        });
                        html += "</dl>";
                        if(that.page > 0) {
                            html += '<a href="#" id="back-button" class="readMore float-left arrow">Zur&uuml;ck</a>';
                        }
                        if(results.length > 10) {
                            html += '<a href="#" id="forward-button" class="readMore float-right arrow">Vorw&auml;rts</a>';
                        }
                    } else {
                        html += '<div class="search-results">Ihre Suche nach &quot;' + that.term + '&quot; ergab keine Ergebnisse.</div>';
                    }
                    html += '<br clear="all"></div>';
                    that.jContentNode.html(html);
                });
            }

        };

        jQuery("#searchForm").submit(function () {
            var jSearchForm = jQuery(this);
            var term = jQuery(":input[name='search_query']", jSearchForm).val();
            var site = jQuery(":input[name='site']", jSearchForm).val();
            nova.search.search(term, site);
            return false;
        });

        jQuery("#back-button", nova.search.jContentNode).live("click", nova.search.back);
        jQuery("#forward-button", nova.search.jContentNode).live("click", nova.search.forward);

        jQuery("#search").click(function () {
            var that = jQuery(this);
            if (that.val() === "Finden Sie Ihr Thema") { that.val(""); }
        });

        jQuery("#search").blur(function () {
            var that = jQuery(this);
            if (that.val() === "") {
                that.val("Finden Sie Ihr Thema");
            }
        });

        jQuery(window).load(function () {
            nova.footer();
        });

    });

}
