//
/*
 * Copyright 2009 Kantega AS
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

//
//




var napha = {

    /**
     * Kontrollerer all javascriptstyrt layout.
     */
    Layout : function(){

        var that = this;
        var $tabs = $("#Tabs");

        this.applyTabs = function(selectedIndex){
            if (selectedIndex === undefined) {
                selectedIndex = 0;
            }
            debug.debug("napha.Layout.applyTabs(): Applying tabs. Selected tab index: "+selectedIndex);
            $tabs.tabs({
                ajaxOptions: {cache:false},
                cookie: {expires: 30},
                spinner : '<div class="ajaxload tabcontent">Laster...</div>',
                selected: selectedIndex
            });
        };
        $tabs.ajaxComplete(napha.loggedInCheck);
        /**
         * Laster innholdet i en tab pï¿½ nytt
         * Hvis ikke index er satt lastes valgt tab.
         *
         * @param index - Tabindex til tabben som skal lastes.
         */
        this.reloadTab = function(index) {
            if (!index) {
                index = $tabs.tabs('option', 'selected');
            }
            debug.debug("napha.Layout.reloadTab(): Reloading tab, index: " + index);
            $tabs.tabs("load", index);
        };

        this.openTab = function(index) {
            debug.debug("napha.Layout.openTab(): Opening tab, index: " + index);
            if (!index) {
                debug.debug("napha.Layout.openTab(): Undefined index. Aborting");
                return;
            }
            $tabs.tabs("option", "selected", index);
        };


        this.columnize = function() {
            var columnized = $(".columnized");
            debug.debug("Layout.columnize(): Number of elements found to columnize: " + columnized.size());
            if (columnized.size() > 0) {
                var columncount = 1;
                var classes = columnized.attr("class").split(" ");
                for (var i in classes) {
                    var c = classes[i];
                    if (c.indexOf("columnCount") > -1) {
                        columncount = parseInt(c.substring("columnCount".length, c.length));
                    }
                }
                debug.debug("Layout.columnize(): Column count: " + columncount);
                columnized.makeacolumnlists({cols:columncount,colWidth:0,equalHeight:false,startN:1});
            }
        };

        /**
         * Hï¿½ndterer ï¿½pning og lukking av de ulike innstillingerseksjonene
         */
        this.setInnstillingerAccordionListeners = function() {
            $("#Innstillinger .innstilling h2").live("click", function(){
                var $innstilling = $(this).parent();
                if ($innstilling.find(".innhold").is(":visible")) {
                    $innstilling.find("h2 a").text("Endre");
                    $innstilling.find(".innhold").slideToggle("normal", function(){
                        $innstilling.find(".hjelpetekst-kort").show(0);
                    });
                } else {
                    $innstilling.find("h2 a").text("Skjul");
                    $innstilling.find(".hjelpetekst-kort").hide(0);
                    $innstilling.find(".innhold").slideToggle("normal");
                }
                return false;
            });

        };

        this.setFancyBoxClickListeners = function(elements) {
            addFancyBoxClickListeners(elements, 'auto');
        };


        this.setFancyBoxClickListenersWithHeight = function(elements, height){
            addFancyBoxClickListeners(elements, height);
        };

        var addFancyBoxClickListeners = function(elements, height){

            var $elements = $(elements);

            if ($elements.size() === 0) {
                debug.warn("Layout.setFancyBoxClickListeners(): No dom element matching query: " + elements);
                return;
            }

            var fancyboxOptions = {
                'zoomSpeedIn': 300,
                'zoomSpeedOut': 300,
                'overlayOpacity': 0.5,
                'width': 500,
                'onClosed': function(){
                    $(window).trigger("hashchange");
                }
            };

            if (height === 'auto') {
                fancyboxOptions.autoDimensions = 'true';
                fancyboxOptions.onComplete = function(){
                    $.fancybox.resize();
                };
            } else {
                fancyboxOptions.height = height;
            }

            $elements.live("click", function(){
                return false;
            })
                    .fancybox(fancyboxOptions);
            $("button.fancyclose").live("click", function(){
                debug.debug("Layout.setFancyBoxClickListeners(): Closing fancybox");
                $.fancybox.close();
                return false;
            });
        };
        /**
         * Setter tooltip p? toppmenyen.
         *
         * Self invoking function som kj?res for alle layouts.
         */
        var applyTopmenuToolTip = function(){
            var tooltip = $('<div class="tooltip"><div class="content"></div><div class="bottom"></div></div>');
            var mainmenu = $("#MainMenu");
            var description;
            mainmenu.find(".topmenu a").hover(
                    function(){
                        description = $(this).attr("title");
                        if (description.length > 0 && description!= "") {
                            tooltip.find(".content").html(description);
                            mainmenu.append(tooltip);
                            tooltip.position({ my: 'bottom center', at: 'top center', of: this, offset: "0 -25" });
                        }
                        $(this).attr("title", "");
                    },
                    function(){
                        tooltip.remove();
                        $(this).attr("title", description);
                    }
                    );
        }();


        /**
         * H?ndterer click events for alle knapper av typen actionbutton.
         *
         * Self invoking function som kj?res for alle layouts.
         */
        var bindActionButtons = function() {
            $("span.actionbutton").live('click', function(e){
                var button = $(this);
                var type = button.children().eq(0);
                var relatedElement = type.attr("rel");
                if (relatedElement.length > 0) {
                    e.preventDefault();
                    if (type.hasClass("more")) {
                        debug.debug("Layout.bindActionButtons(): Actionbutton 'more'. Relatert element: " + relatedElement);
                        $(relatedElement).slideDown(300);
                        if (type.hasClass("toggle")) {
                            button.hide();
                            $("span.actionbutton a.less[rel="+relatedElement+"]").show();
                        }
                    } else if (type.hasClass("less")) {
                        debug.debug("Layout.bindActionButtons(): Actionbutton 'less'. Relatert element: " + relatedElement);
                        $(relatedElement).slideUp(300);
                        if (type.hasClass("toggle")) {
                            button.hide();
                            $("span.actionbutton a.more[rel="+relatedElement+"]").show();
                        }
                    }
                }
            })();
        };

        /**
         * Setter fancybox-listener for alle layouts pï¿½ tips oss lenka.
         */
        that.setFancyBoxClickListenersWithHeight("#Footer a.tipsoss", 400);
    },


    /**
     * Spesial-layout for temaforsiden.
     */
    ForsideLayout : function(){

        var $menu = $("#Navigation .drilldownmenu");

        this.setHashChangeContentLoaders = function() {
            new napha.HashChangeContentLoader('#Artikkelliste', '/napha/tema/artikler', napha.loggedInCheck);
            new napha.HashChangeContentLoader('#Diskusjoner', '/napha/tema/diskusjoner', napha.loggedInCheck);
            new napha.HashChangeContentLoader('#Nettverk', '/napha/gruppe/nyeste', napha.loggedInCheck);
            //            new napha.HashChangeContentLoader('#Arrangement', '/napha/gruppe/sistoppdaterte');
        };

        this.setAdditionalSummariesClickListeners = function() {

            // Lytter for ? laste flere artikler enn standard
            $("#AdditionalSummariesButton").live("click", function(e){
                e.preventDefault();
                var increment = 10;
                var currentMax = stateHandler.getParameter('maxArticles') || increment;
                var newMax = parseInt(currentMax) + parseInt(increment);
                stateHandler.addOrReplaceParameter("maxArticles", newMax);
            });

            // Lytter for ? laste flere kommentarer / diskusjoner enn standard
            $("#LoadAdditionalComments").live("click", function(e){
                e.preventDefault();
                var increment = 10;
                var currentMax = stateHandler.getParameter('maxDiscussions') || increment;
                var newMax = parseInt(currentMax) + parseInt(increment);
                stateHandler.addOrReplaceParameter("maxDiscussions", newMax);
            });
        };

        this.handleMenuClicks = function(){
            debug.debug("ForsideLayout.handleMenuClicks(): Binding menu clicks.");
            $menu.find("a").live("click", function(e){
                debug.debug("ForsideLayout.handleMenuClicks(): Menu element click event");
                e.preventDefault();
                stateHandler.setState(napha.getParamsFromHref($(this).attr("href")));
            });
        };

        this.setSortListener = function(){
            $("#Tabs .contentsort select").live("change", function(){
                var sort = $(this).find("option:selected").val();
                debug.debug("ForsideLayout.setSortListener(): Sortering endret. Ny sortering: " + sort);
                stateHandler.addOrReplaceParameter('sortering',sort);
            });
        };

        this.placeHolderListener = function(){
            $("#brukernavn").val($("#brukernavnplaceholdervalue").val());
            $("#passordplaceholder").val($("#passordplaceholdervalue").val());

            $("#brukernavn").focus(function(){
                var brukernavnValue = $("#brukernavn").val();
                $("#brukernavn").removeClass("placeholdertext");
                if(brukernavnValue == $("#brukernavnplaceholdervalue").val()){
                    $("#brukernavn").val("");
                }
            });

            $("#brukernavn").blur(function(){
                var brukernavnLength = $("#brukernavn").val().length;
                if(brukernavnLength == 0){
                    $("#brukernavn").val($("#brukernavnplaceholdervalue").val());
                    $("#brukernavn").addClass("placeholdertext");
                }
            });

            $("#passordplaceholder").focus(function(){
                $("#passord").removeClass("hidden");
                $("#passordplaceholder").addClass("hidden");
                $("#passord").focus();
            });

            $("#passord").blur(function(){
                if($("#passord").val().length == 0){
                    $("#passord").addClass("hidden");
                    $("#passordplaceholder").removeClass("hidden");
                }
            });
        };
    },

    /**
     * Spesial layout for min side
     */
    MinsideLayout : function(){

        this.setHashChangeContentLoaders = function() {
            new napha.HashChangeContentLoader('#Feed div.feedliste', '/napha/feed', napha.loggedInCheck);
        };

        this.setAdditionalArticlesAndCommentsClickListeners = function() {
            $("#loadMoreArticles").live("click", function(){
                $("#comments div.commentsummary").removeClass("hidden");
                $(this).parent().hide();
                return false;
            });
            $("#loadMoreComments").live("click", function(){
                $("#comments div.commentsummary").removeClass("hidden");
                $(this).parent().hide();
                return false;
            })
        };

        this.setAdditionalFeedItemsClickListeners = function() {

            // Lytter for ? laste flere artikler enn standard
            $("#AdditionalFeedItems").live("click", function(e){
                e.preventDefault();
                var increment = 10;
                var currentMax = stateHandler.getParameter('maxFeedItems') || increment;
                var newMax = parseInt(currentMax) + parseInt(increment);
                stateHandler.addOrReplaceParameter("maxFeedItems", newMax);
            });
        };

    },

    /**
     * H?ndterer enmeordsnavigeringen
     */
    TopicHandler : function () {

        var $topicSubscriptionDrilldown = $("#searchSubjectsContainer");
        var that = this;


        /**
         * Funksjon for h?ndtering av en brukers emneordabonnement.
         */
        var setTopicSubscriptionInputListener = function(){
            debug.debug("TopicHandler: setTopicSubscriptionInputListener() init");
            var defaultValue = "";
            var $input = $("#TopicSubscriptionSuggest");
            defaultValue = $input.val();
            $input.focus(function(){
                $(this).val("");
            });

            $topicSubscriptionDrilldown.find("form").submit(function(e){
                debug.debug("TopicSubscription: Form submitted");
                e.preventDefault();
                var topic = this.term.value;
                that.getTopicsByTopicName(topic, function(noOfTopics){
                    debug.debug("TopicSubscription: Antall treff: "+noOfTopics);
                    $input.autocomplete("close");
                    if (noOfTopics == 1) {
                        that.submitTopic(topic);
                        topic = '';
                        $input.val(defaultValue);
                    } else if (noOfTopics > 1) {
                        that.showTopicNotFoundDialog();
                    } else {
                        that.showTopicNotFoundDialog();
                    }
                });
            });

            debug.debug("TopicSubscription: autocomplete");
            $input.autocomplete({
                delay: 50,
                source: "/napha/tema/autocomplete",
                select: function(event, ui) {
                    debug.debug("TopicSubscription: legg til topic: topicid:" + ui.item.id);
                    $input.val("");
                    that.submitTopic(ui.item.id);
                    return false;
                }
            });

        }();

        /**
         * Lytter for n?r et emne fjernes fra en brukers profil
         */
        var setTopicSubscriptionRemoveClickListener = function(){
            $("a.removeTopicSubscription").live("click", function(event){
                event.preventDefault();
                var shouldRemoveTopic = confirm($(this).attr("title") + "?");
                if(shouldRemoveTopic){
                    debug.debug("TopicSubscription: removetopicsubscription click");
                    var $linkClicked = $(this);
                    $.post($linkClicked.attr("href"), function(returned_data) {
                        $linkClicked.parent().remove();
                        $(window).trigger("hashchange");
                    });

                }
                return false;
            });
        }();

        /**
         * Legger til et emne til en brukers profil
         * @param topicid emneid til emne som skla legges til
         */
        this.submitTopic = function(topicid) {
            $.get("/napha/temaabonnement/leggtil", {topicid: topicid}, function(){
                $(window).trigger("hashchange");
            });
        };

        /**
         * Sjekker om emnet finnes.
         * @param topic emneordet det skal s?kes etter
         * @param resultCallback callback funksjon n?r resultatet av s?ket er klart.
         * Metoden tar en int som innparameter med antall emner som ble funnet.
         */
        this.getTopicsByTopicName = function(topic, resultCallback){
            debug.debug("TopicSubscription.getTopicsByTopicName(): topic: "+topic);
            $.getJSON("/napha/tema/autocomplete", {term: topic}, function(data) {
                debug.debug("TopicSubscription.getNumberOfTopicsByTopicName(): TopicId: "+data.id);
                resultCallback(data.length);
            });
        };

        /**
         * Viser en dialogboks med info om at emne som det s?ktes etter ikke finnes.
         */
        this.showTopicNotFoundDialog = function() {
            $('<div>Beklager, men emneordet du søkte etter finnes ikke.</div>').dialog({draggable:false, resizable:false, minHeight: '50', title:'Emneordet finnes ikke'});
        };

        /**
         * Viser en dialogboks med info om at emne som det s?ktes etter ikke finnes.
         */
        this.showMultipleTopicsFoundDialog = function() {
            $('<div>dialog.emneord.flere.funnet</div>').dialog({draggable:false, resizable:false, minHeight: '50', title:'dialog.emneord.tittel.flere.funnet'});
        };
    },

    /**
     * H?ndterer s?king etter personer, legge til ny person og fjerning av eksisterende personer.
     */
    PersonkoblingerHandler : function() {

        var $personsok = $("#searchPersonContainer");
        var that = this;

        /**
         * Autocomplete, s?k etter personer
         */
        var setPersonsokInputListener = function(){
            debug.debug("PersonkoblingerHandler: setPersonsokInputListener() init");
            var defaultValue = "";
            var $input = $("#autocompleteSuggest");
            defaultValue = $input.val();
            $input.focus(function(){
                $(this).val("");
            });

            $personsok.find("form").submit(function(event){
                debug.debug("PersonkoblingerHandler: Submitting form");
                event.preventDefault();
                var querystring = this.term.value;
                that.getPersonsByName(querystring, function(persons){
                    if (persons.length == 1) {
                        that.addPersonToListOfFollowing(persons[0].id);
                        querystring = '';
                        $input.val(defaultValue);
                    } else if (persons.length > 1) {
                        $input.autocomplete("close");
                        that.showPersonNotFoundDialog();
                    } else {
                        $input.autocomplete("close");
                        that.showPersonNotFoundDialog();
                    }
                })
            });

            debug.debug("PersonkoblingerHandler: autocomplete init");
            $input.ajaxComplete(function (data, textStatus, xhr) {
                if(textStatus.responseText.indexOf("<legend>Logg inn</legend>") != -1){
                    window.location='/Login.action?redirect=/napha/minside';
                }
            });
            $input.autocomplete({
                delay: 50,
                source: "/napha/personkoblinger/autocomplete",
                select: function(event, ui) {
                    debug.debug("PersonkoblingerHandler: legg til person: personid:" + ui.item.id);
                    $input.val("");
                    that.addPersonToListOfFollowing(ui.item.id);
                    return false;
                }
            });
        }();

        /**
         * Legger til en person over listen av following
         * @param uid brukeriden til den personen som man ?nsker ? legge til.
         */
        this.addPersonToListOfFollowing = function(uid) {
            $.get("/napha/personkoblinger/ny", {uid: uid}, function(){
                var antallfolgere = $("#antallFolgere").html();
                antallfolgere++;
                $("#antallFolgere").html(antallfolgere);
                $(window).trigger("hashchange");
            });
        };

        /**
         * Sjekker om en person finnes.
         * @param querystring navnet p? personen det skal s?kes etter
         * @param resultCallback callback funksjon n?r resultatet av s?ket er klart.
         * Metoden tar en int som innparameter med antall personer som ble funnet.
         */
        this.getPersonsByName = function(querystring, resultCallback){
            debug.debug("PersonkoblingerHandler.getPersonsByName(): querystring: "+querystring);
            $.getJSON("/napha/personkoblinger/autocomplete", {term: querystring}, function(data) {
                debug.debug("PersonkoblingerHandler.getPersonsByName(): Data: "+data);
                resultCallback(data);
            });
        };

        /**
         * Viser en dialogboks med info om at navnet som det s?ktes etter ikke finnes.
         */
        this.showPersonNotFoundDialog = function() {
            $('<div>Beklager, men vi finner ingen registrert bruker med dette navnet.</div>').dialog({draggable:false,modal:true, resizable:false,buttons: {Ok: function() {$(this).dialog('close');}}, minHeight: '50', title:'Ingen bruker funnet'});
        };


        /**
         *
         */
        var personRemoveClickListener = function() {
            $("#fancyboxSelect a.remove").live("click", function(event){
                event.preventDefault();
                var $currentElement = $(this);
                var url = $currentElement.attr("href");
                $.get(url, function(data, status, xhr){
                    $currentElement.closest("li.item").remove();
                })
            })
        }();


    },

    /**
     * H?ndterer navigasjon (back/forward) n?r innhold lastes med ajax.
     */
    StateHandler : function(){
        var that = this;

        this.initState = function(initialState) {
            if (!that.isStateEmpty()) {
                debug.debug("StateHandler.initState(): Initial state is not empty ("+getStateAsString(initialState)+"). Triggering hashchange");
                $(window).trigger("hashchange");
            } else {
                debug.debug("StateHandler.initState(): Initial state is empty. Setting initial state ("+getStateAsString(initialState)+").");
                that.setState(initialState);
            }
        };

        /**
         * Setter tilstand. Kalles n?r det er ?nskelig ? endre tilstand, dvs. gj?re det mulig ? navigere fram/tilbake,
         * typisk n?r en link klikkes og innholdet lastes med ajax framfor en full request.
         *
         * Hvis ny tilstand er forskjellig fra forrige, trigges en hashchange event.
         *
         * @param state - Vilk?rlig objekt som er tilstrekkelig for ? beskrive den ?nskede tilstanden.
         */
        this.setState = function(state) {

            debug.debug("StateHandler.setState(): state: " + getStateAsString(state));
            $.bbq.pushState(state);
        };

        /**
         * Returnerer et objekt som representerer gjeldende tilstand.
         */
        this.getState = function() {
            var state = $.bbq.getState();
            debug.debug("StateHandler.getState(): " + getStateAsString(state));
            return state;
        };

        /**
         * Returnerer en spesifikk parameter fra staten.
         * @param paramName
         */
        this.getParameter = function(paramName) {
            var state = $.bbq.getState();
            var value = state[paramName];
            debug.debug("StateHandler.getParameter(): param: " + paramName + ", value: " + value);
            return value;
        };
        /**
         * Sjekker om gjeldende state er tom.
         */
        this.isStateEmpty = function() {
            for (var i in that.getState()) {
                debug.debug("StateHandler.isStateEmpty(): State is not empty. Contains " + i);
                return false;
            }
            debug.debug("StateHandler.isStateEmpty(): State is empty.");
            return true;
        };

        var getStateAsString = function(state) {
            if (!state) {
                state = that.getState();
            }
            var stateStr = "{";
            for (var key in state) {
                stateStr += key + "=" + state[key] + ","
            }
            stateStr += "}";
            return stateStr;
        };

        /**
         * Legger til en parameter til staten eller bytter hele parameterens verdi hvis den finnes.
         *
         * @param parameter
         * @param value
         */
        this.addOrReplaceParameter = function(parameter, value) {
            debug.debug("StateHandler.addOrReplaceParameter(): parameter: " + parameter + ", value: " + value);
            var state = this.getState();
            state[parameter] = value;
            this.setState(state);
        };


        /**
         * Legger til en verdi til en eksisternede parameters verdi. Parameterens verdier er kommaseparerte.
         * Eks. 'minparam=verdi1,verdi2'. appendValue('minparam','verdi3')-> 'minparam=verdi1,verdi2,verdi3'
         *
         * Hvis parameteren ikke finnes legges den til.
         *
         * @param parameter
         * @param value
         */
        this.appendValue = function(parameter, value) {
            var state = this.getState();
            var currentValue = state[parameter];
            debug.debug("StateHandler.appendValue(): parameter: " + parameter + ", value: " + value + ", currentValue: " + currentValue);
            var val = value.split(",");
            for (var i in val) {
                if(currentValue) {
                    if (currentValue.indexOf(val[i]) < 0) {
                        if (currentValue.length > 0) {
                            currentValue += ",";
                        }
                        currentValue += val[i];
                    }
                } else {
                    currentValue = val[i];
                }
            }
            state[parameter] = currentValue;
            this.setState(state);
        };



        /**
         * Fjerner en verdi fra en parameter, dvs. motsatt funksjon av appendValue.
         * @param parameter
         * @param value
         */
        this.removeValue = function(parameter, value) {
            var state = this.getState();
            var currentValue = state[parameter];
            debug.debug("StateHandler.removeValue(): parameter: " + parameter + ", value: " + value + ", currentValue: " + currentValue);
            if (currentValue && currentValue.length > 0) {
                var curValArr = currentValue.split(",");
                var newVal = '';
                for (var i=0; i < curValArr.length; i++) {
                    if (curValArr[i] != value) {
                        newVal += curValArr[i];

                        if (i < curValArr.length) {
                            newVal += ',';
                        }
                    }
                }
                state[parameter] = newVal;
                this.setState(state);
            }
        };

    },


    /**
     * Laster innhold fra en url (controller) inn i en container ved n?r det trigges hashchange.
     *
     * @param container - Selector til container som skal f? innholdet, f.eks #MinContainer
     * @param loadUrl - Url til controller som serverer innholdet. M? returnere html.
     * @param callback - Funksjon som kalles n?r innholdet er ferdig lastet.
     */
    HashChangeContentLoader : function(container, loadUrl, callback){

        this.setHashChangeListener = function(container, url){
            debug.debug("ContentLoader.setHashChangeListener(): HashChangeContentLoader created on " + container + ". url: " + url);
            $(window).bind( 'hashchange', function(e) {
                debug.debug("ContentLoader.setHashChangeListener(): "+e.type+" event received for " + container);
                $(container).load(url, stateHandler.getState(), callback);
            });
        }(container, loadUrl);

    },


    /**
     * Tar inn enn vilk?rlig url og returnerer et object med requestparametrene som key og verdien som value.
     * @param href
     */
    getParamsFromHref : function(href){
        return $.deparam(href.substring(href.indexOf("?")+1, href.length));
    },


    /**
     * Gj?r hele contentsummary klikkbart. Setter klasse ved hover.
     */
    handleContentsummaryClick : function(){
        $("#Content .contentsummary")
                .find("h3 a")
                .live("click", function(e){
            e.preventDefault()
        })
                .end()
                .live("hover",function(){
            $(this).toggleClass("hover");
        })
                .live("click", function(){
            var href = $(this).find("h3 a").attr("href");
            var state = stateHandler.getState();
            for (var key in state) {
                if (href.indexOf("?") == -1) {
                    href += "?";
                } else {
                    href += "&";
                }
                href += key + "=";
                if (key != 'informasjonstype' || state[key] != "0") {
                    href += state[key];
                }
            }
            window.location.href = href;
        });
    },


    /**
     * Intercepts submission of the search forms and validates
     * that the search criteria adhere to a minimum of set of rules:
     *  - Search string must be at least 3 characters long.
     */
    setSearchValidationListeners : function () {
        $("#SearchForm").submit(function(e){
            $(this).find("input:text").each(function(){
                var errorMsg = "";
                if ($(this).val().length < 3) {
                    errorMsg += $(this).attr("title") + ' må være minimum 3 tegn\n';
                }
                if (errorMsg.length > 0) {
                    var errorsContainer = $("#ErrorsContainer");
                    if(errorsContainer.size() > 0) {
                        errorsContainer.html(errorMsg.replace('\n', '<br>')).show();
                    } else {
                        alert(errorMsg);
                    }
                    e.preventDefault();
                }
            });
        });
    },

    /**
     * Sjekker om brukeren har caps lock p?sl?tt eller holder nede shift.
     *
     * @param keyPressEvent
     */
    isCapsLockOn : function(keyPressEvent) {
        var capsLockOn = false;

        if(!keyPressEvent) {
            keyPressEvent = window.event;
        }

        if( !keyPressEvent ) {
            return;
        }

        var keyPressed = 0;
        if(keyPressEvent.which) {
            keyPressed = keyPressEvent.which;
        } else if(keyPressEvent.keyCode) {
            keyPressed = keyPressEvent.keyCode;
        } else if(keyPressEvent.charCode) {
            keyPressed = keyPressEvent.charCode
        }

        var shiftPressed = false;
        if(keyPressEvent.shiftKey) {
            shiftPressed = keyPressEvent.shiftKey;
        } else if( keyPressEvent.modifiers ) {
            if(keyPressEvent.modifiers & 4) {
                shiftPressed = true;
            }
        }

        if(keyPressed > 64 && keyPressed < 91 && !shiftPressed) {
            capsLockOn = true;
        } else if(keyPressed > 96 && keyPressed < 123 && shiftPressed) {
            capsLockOn = true;
        }
        return capsLockOn;

    },

    ajaxForm : function($form, successCallback, errorCallback) {
        $form.submit(function(){
            var url = this.action;
            var data = $(this).serialize();
            $.ajax({
                url : url,
                data : data,
                type : 'POST',
                dataType: 'json',
                success : successCallback,
                error : errorCallback
            });
            return false;
        });
    },

    form : {
        formSuccess : function(data, feedbackContainer) {
            debug.debug("napha.form.formSuccess: Form response.");
            if (!data) {
                feedbackContainer.html("Beklager, det har oppstÃ¥tt en feil. Vennligst prÃ¸v igjen senere.").addClass("skjemafeil").show();
                return;
            }

            feedbackContainer.removeClass("skjemafeil").html("Endringene er lagret").show();
        },

        formError : function(xhr, feedbackContainer, printFieldErrors){
            debug.debug("napha.form.formError(): Form errors");
            napha.loggedInCheck(data, status, xhr);
            var errorMsg;
            try {
                var data = $.parseJSON(xhr.responseText);

                if (!data) {
                    errorMsg = "Beklager, det har oppstï¿½tt en feil. Vennligst prï¿½v igjen senere.";
                    return;
                }
                if (data.hasFieldErrors) {
                    errorMsg = "Oops, vi fant noen feil i skjemaet.<br>Vennligst kontroller felter som er merket med rÃ¸dt";
                    if (printFieldErrors) {
                        for (var field in data.fielderrors) {
                            var fieldLabel = $("label[for="+field+"]");
                            if (!fieldLabel.hasClass("feltfeil")) {
                                fieldLabel.append("&nbsp;"+ data.fielderrors[field]).addClass("feltfeil");
                            }
                        }
                        errorMsg += "</ul>";
                    }
                } else if (data.hasGlobalErrors) {

                } else {
                    errorMsg = "Beklager, det har oppstÃ¥tt en teknisk feil. Vennligst prÃ¸v igjen senere.";
                }
            } catch(e) {
                debug.warn("napha.form.formError(): Teknisk feil.");
                errorMsg = "Beklager, det har oppstÃ¥tt en teknisk feil. Vennligst prÃ¸v igjen senere.";
            }
            feedbackContainer.addClass("skjemafeil").html(errorMsg).show();
        }

    },

    loggedInCheck:  function(response, status, xhr) {
        if(xhr.responseText != undefined && xhr.responseText.indexOf("<legend>Logg inn</legend>") != -1){
            window.location='/Login.action?redirect=/napha/minside';
        }
    }
};


/*
 - 1 url for ? laste nye elementer
 - parametere: offset, max, sortering
 - Optional parameter: selector ? hente fra resultat
 */

/**
 *
 * @param actionButton jquery object
 * @param offset number
 * @param articleListContainer jquery object
 */
function lazyLoadArticles(actionButtonSelector, initialOffset, offset, max, articleListContainerSelector) {
    var $actionButton = $(actionButtonSelector);
    var artikkelOffset = initialOffset;
    $actionButton.click(function(){
        var $lazyLoadedArticlesContainer = $("<div id=\"lazyload\"></div>").insertAfter(articleListContainerSelector);
        $lazyLoadedArticlesContainer.load('/napha/lazyload/artikler',{offset:artikkelOffset, max:max}, function() {
            debug.debug("Lazy loaded articles");
            var numberOfArticlesLoaded = $lazyLoadedArticlesContainer.find("div.contentsummary").length;
            artikkelOffset += numberOfArticlesLoaded;
            if (numberOfArticlesLoaded < offset) {
                $actionButton.text("Ingen flere artikler");
            }
            $lazyLoadedArticlesContainer.find("div.contentsummary").appendTo(articleListContainerSelector);
        });
        return false;
    })
}






var stateHandler = new napha.StateHandler();

$(document).ready(function(){
    debug.debug("$(document).ready()");

    // Disable caching of AJAX responses */
    $.ajaxSetup ({
        cache: false
    });

    napha.setSearchValidationListeners();

    $.datepicker.setDefaults($.datepicker.regional['no']);
    $.datepicker.setDefaults({
        firstDay: 1,
        showOn: 'both',
        buttonImage: '/admin/bitmaps/common/icons/small/calendar.png',
        buttonImageOnly: true,
        dateFormat:'dd.mm.yy',
        autoSize: true
    });
    $("input.selectableDate").datepicker();
});


/****
 * jQuery DWR form plugin.
 ****/
(function($){
    $.fn.dwrValidate = function(dwrValidator, options){

        // fast fail if nothing is selected
        if (!this.length) {
            debug.debug('dwrValidate: skipping submit process - no element selected');
            return this;
        }

        debug.debug("dwrValidate: field: " + this.attr("name"));
        var that = this;

        var defaults = {
            response: handleResponse,
            dwrFieldId : that.attr("name"),
            validateOn : 'blur',
            error: handleError,
            timeout: 5000,
            fieldErrorClass: 'fielderror',
            formErrorClass: 'formerror',
            targetBehaviour: 'replace' //alternatives: 'append',. 'prepend' or 'replace'
        };

        options = $.extend(defaults, options);


        if (!options.target || options.target.length == 0) {
            options.target = $("<span></span>");
            this.after(options.target);
        }

        this.bind(options.validateOn, function(){

            debug.debug("dwrValidate: " + options.validateOn + " event received. Validating: "+options.dwrFieldId + ". Value: " + that.val());
            var metadata = $(this).metadata();
            var dependentFields = {};
            if (metadata.dependentFields) {
                var fields = metadata.dependentFields.split(",");
                for (var i = 0; i < fields.length; i++) {
                    dependentFields[fields[i]] = $("#"+fields[i]).val();
                }
            }
            dwrValidator.validateField(options.dwrFieldId, that.val(), dependentFields, {
                callback: options.response,
                errorHandler: options.error,
                timeout: options.timeout
            });

        });


        function handleResponse(message) {
            debug.debug("dwrValidate: Validation response from "+options.dwrFieldId +": Response: " + message);
            if (message && message.length > 0) {
                showFieldError(message);
            } else {
                hideFieldError();
            }
        }

        function handleError(message) {
            debug.debug("dwrValidate.handleError(): form error: "+ message);
        }


        function showFieldError(message) {
            hideFieldError();
            debug.debug("dwrValidate.showFieldError(): message: "+message);
            var targetContent = '<span class="dwrValidate_targetContent">' + options.target.html()+ '</span>';
            var wrappedMessage = '<span class="dwrValidate_message">'+message+'</span>';
            if (options.targetBehaviour == 'append') {
                options.target.html(targetContent + " " + wrappedMessage);
            } else if (options.targetBehaviour == 'prepend') {
                options.target.html(wrappedMessage + " " + targetContent);
            } else {
                targetContent.hide();
                options.target.html(targetContent + wrappedMessage);
            }

            options.target.addClass(options.fieldErrorClass).show();
        }

        function hideFieldError() {
            debug.debug("dwrValidate.hideFieldError()");
            options.target.find(".feltfeil").remove();
            var originalContent = options.target.find(".dwrValidate_targetContent").html();
            if (!originalContent || originalContent.length == 0) {
                originalContent = options.target.html();
            }
            options.target.html(originalContent);
            options.target.removeClass(options.fieldErrorClass);
        }

    }
})(jQuery);

jQuery.fn.sortElements = (function(){

    var sort = [].sort;

    return function(comparator, getSortable) {

        getSortable = getSortable || function(){return this;};

        var placements = this.map(function(){

            var sortElement = getSortable.call(this),
                    parentNode = sortElement.parentNode,

                // Since the element itself will change position, we have
                // to have some way of storing its original position in
                // the DOM. The easiest way is to have a 'flag' node:
                    nextSibling = parentNode.insertBefore(
                            document.createTextNode(''),
                            sortElement.nextSibling
                            );

            return function() {

                if (parentNode === this) {
                    throw new Error(
                            "You can't sort elements if any one is a descendant of another."
                            );
                }

                // Insert before flag:
                parentNode.insertBefore(this, nextSibling);
                // Remove flag:
                parentNode.removeChild(nextSibling);

            };

        });

        return sort.call(this, comparator).each(function(i){
            placements[i].call(getSortable.call(this));
        });

    };

})();
