/*
    state should be the initial state like {
        "first": "",
        "second": "",
        "third": ""
    }
*/
var jsNav = function (graphics,startback,menu,menuLinkPrefix,menuLiPrefix,navButtons,imprintback,referenzback,mailBoxLinkClose) {

    var myGraphics = graphics;
    var myStartback = startback;
    var myMenu = menu;
    var myMenuLinkPrefix = menuLinkPrefix;
    var myMenuLiPrefix = menuLiPrefix;
    var myNavButtons = navButtons;
    var state = {};
    var myMailBoxLink;
    var myMailBoxLinkClose;
    var myImprintback = imprintback;
    var myReferenzback = referenzback;

    var thirdNavLeftSignal;
    var thirdNavRightSignal;
    var mailBoxLinkSignal;

    var videoSignals = [];

    /**
        browser's back button functionality
    */
//     var elemnavpoll = function () {
//         if (location.hash == "#"+(checkout+1) && checkout<5) {
//             checkout_forward ();
//         } else if (location.hash == "#"+(checkout-1) && checkout>0
//           && !(location.hash == "#4" && checkout==5)) {
//             checkout_back ();
//         }
//     }

    var getPrevNextThird = function (first,second,third) {
        var tmp = myMenu[first].sub[second].sub;
        var res = {};
        var keys = []; var i=0;
        for (var key in tmp) {
            keys[i] = key;
            i++;
        }
        for (i=0;i<keys.length;i++) {
            if (i>0) {
                res.prev = keys[i-1];
            } else {
                res.prev = keys[keys.length-1];
            }
            if (i<keys.length-1) {
                res.next = keys[i+1];
            } else {
                res.next = keys[0];
            }
            if (keys[i] == third) {
                return res;
            }
        }
        return false;
    }

    var newURI = function (thisNew) {
        getElement("videoOverlayClose").href = thisNew;
        getElement("mailboxLink").href=thisNew;
        getElement("contactClose").href=thisNew;
        getElement("globalContactLink").href=thisNew;
    }

    /**
        this function switches to a specific page
            @PARAM start: boolean //switch to the start page?
            @PARAM firstnav|secondnav: string // first and second navigation level
            @PARAM thirdnav: null|string // third navigation level (if needed)
    */
    var switchToREAL = function (start,specialPage,firstnav,secondnav,thirdnav) {
        var tmp = getFirstElementByTagAndClassName("li","linkHovering");
        if (tmp !== null) {
            removeElementClass(tmp,"linkHovering");
        }
        hideElement("jobs");
//         hideElement("contactRight");
        hideElement("imprint");
        hideElement("thirdNavLeftPicture");
        hideElement("thirdNavLeftLink");
        hideElement("thirdNavRightPicture");
        hideElement("thirdNavRightLink");
        disconnect(thirdNavLeftSignal);
        disconnect(thirdNavRightSignal);
        disconnect(mailBoxLinkSignal);

        for (var i=0;i<videoSignals.length;i++) {
            disconnect(videoSignals[i]);
        }
        videoSignals = [];

        document.title = "Marianetwork";


        if (start) {
            setStyle("content",{"background-image": "url('"+myGraphics+myStartback+"')"});
            hideElement("shadow");
            hideElement("boxcontainer");

            newURI("#//");

            return;
        }

        if (!isEmpty(specialPage)) {
            if (specialPage== "jobs" || specialPage== "impressum") {
                setStyle("content",{"background-image": "url("+myGraphics+myImprintback+")"});
                showElement("imprintKontaktLeft");
                if (specialPage == "jobs") {
                    showElement("jobs");
                } else if (specialPage == "impressum") {
                    showElement("imprint");
                }
            } else if (specialPage == "referenz") {
                setStyle("content",{"background-image": "url("+myGraphics+myReferenzback+")"});
            }
            hideElement("shadow");
            hideElement("boxcontainer");

            newURI("#"+specialPage+"//");

            return;
        }


        if (!isEmpty(firstnav)) {
            document.title = document.title+": "+html_entity_decode(firstnav);
            state.first = firstnav;
            state.second = "";
            state.third = "";
        }
        if (!isEmpty(secondnav)) {
            document.title = document.title+" - "+html_entity_decode(secondnav);
            state.second = secondnav;
        }

        if (myMenu[firstnav].sub[secondnav].sub !== false && isEmpty(thirdnav)) {
            thirdnav = myMenu[firstnav].sub[secondnav].first;
            state.third = thirdnav;
        } else if (myMenu[firstnav].sub[secondnav].sub !== false && !isEmpty(thirdnav)) {
            state.third = thirdnav;
        }

        var hashURI = "#"+urlEncode(state.first)+"/"+urlEncode(state.second)+"/"+urlEncode(state.third);
        newURI(hashURI);


        mailBoxLinkSignal= connect("mailboxLink","onclick",myMailBoxLink);

        var newBack;
        var newBox;
        var appendToLog;

        if (!isEmpty(thirdnav) && !isEmpty(myMenu[firstnav].sub[secondnav].sub[thirdnav].background)) {
            newBack = myGraphics+urlEncode(firstnav)+"/"+urlEncode(secondnav)+"/"+myMenu[firstnav].sub[secondnav].sub[thirdnav].background;
            newBox = myMenu[firstnav].sub[secondnav].sub[thirdnav].box;
            var tmp = getPrevNextThird(firstnav,secondnav,thirdnav);
            getElement("thirdNavLeftLink").href = "#"+urlEncode(firstnav)+"/"+urlEncode(secondnav)+"/"+urlEncode(tmp.prev);
            thirdNavLeftSignal = connect("thirdNavLeftLink","onclick",partial(switchTo,false,"",firstnav,secondnav,tmp.prev));
            getElement("thirdNavRightLink").href = "#"+urlEncode(firstnav)+"/"+urlEncode(secondnav)+"/"+urlEncode(tmp.next);
            thirdNavRightSignal = connect("thirdNavRightLink","onclick",partial(switchTo,false,"",firstnav,secondnav,tmp.next));
            var thirdNavMode = myMenu[firstnav].sub[secondnav].sub[thirdnav].navButtons;
            getElement("thirdNavLeftPicture").src = myGraphics+myNavButtons[thirdNavMode]["left"];
            getElement("thirdNavRightPicture").src = myGraphics+myNavButtons[thirdNavMode]["right"];
            appendToLog = "/"+thirdnav;
        } else {
            newBack = myGraphics+urlEncode(firstnav)+"/"+urlEncode(secondnav)+"/"+myMenu[firstnav].sub[secondnav].background;
            newBox = myMenu[firstnav].sub[secondnav].box;
            appendToLog = "";
        }

        log("switching to: "+firstnav+"/"+secondnav+appendToLog);
        addElementClass(getElement(myMenuLiPrefix+urlEncode(firstnav)+"_"+urlEncode(secondnav)),"linkHovering");
        setStyle("content",{"background-image": "url('"+newBack+"')"});

        forEach(getElementsByTagAndClassName("div","customContentBox"), function (node) {
            removeElement(node);
        });

        forEach(newBox, function (box) {
            if (box.type == "image") {
                var imgSrc = myGraphics+urlEncode(firstnav)+"/"+urlEncode(secondnav)+"/"+box.img;
                insertSiblingNodesBefore("mailbox",DIV({"class":"customContentBox box imagebox"},IMG({"src":imgSrc, "alt": box.alt})));
            } else if (box.type == "imageNoPadding") {
                var imgSrc = myGraphics+urlEncode(firstnav)+"/"+urlEncode(secondnav)+"/"+box.img;
                insertSiblingNodesBefore("mailbox",DIV({"class":"customContentBox box imageboxNoPadding"},IMG({"src":imgSrc, "alt": box.alt})));
            } else if (box.type == "text") {
                insertSiblingNodesBefore("mailbox",DIV({"class":"customContentBox box textbox"},box.text));
            } else if (box.type == "link") {
                insertSiblingNodesBefore("mailbox",DIV({"class":"customContentBox box linkbox"},A({"target":"popup", "title": box.title, "href": box.href},box.text)));
            } else if (box.type == "video") {
                insertSiblingNodesBefore("mailbox",DIV({"class":"customContentBox box linkbox"},A({"title": box.title, "id":"videolink_"+urlEncode(box.hrefVideo), "href":hashURI },box.text)));
                videoSignals[videoSignals.length] = connect("videolink_"+urlEncode(box.hrefVideo),"onclick",partial(myOverlays.startOverlay,'playerOverlay_'+urlEncode(box.hrefVideo)));
            }
        });

        showElement("shadow");
        showElement("boxcontainer");
        if (!isEmpty(thirdnav) && !isEmpty(myMenu[firstnav].sub[secondnav].sub[thirdnav].background)) {
            showElement("thirdNavLeftLink");
            showElement("thirdNavRightLink");
            showElement("thirdNavLeftPicture");
            showElement("thirdNavRightPicture");
        }
    }

    var switchTo = function (start,specialPage,firstnav,secondnav,thirdnav) {
        if (!isEmpty(specialPage) || start) {
            myMailBoxLinkClose();
        }
        if (navigator.userAgent.indexOf("MSIE 6.0") !== -1) {
        hideElement("thirdNavLeftPicture");
        hideElement("thirdNavLeftLink");
        hideElement("thirdNavRightPicture");
        hideElement("thirdNavRightLink");
            hideElement("content");
        } else {
            fade("content");
        }
        callLater(1,function () {
            switchToREAL(start,specialPage,firstnav,secondnav,thirdnav);
            if (navigator.userAgent.indexOf("MSIE 6.0") !== -1) {
                showElement("content");
            } else {
                appear("content");
            }
        });
    }

    this.initJsNav = function (first,second,third,mailBoxLink,mailBoxLinkClose) {
        state = {"first": first, "second": second, "third": third};
        myMailBoxLink = mailBoxLink;
        myMailBoxLinkClose = mailBoxLinkClose;

        for (var firstnav in myMenu) {
            var seconds = myMenu[firstnav].sub;
            for (var secondnav in seconds) {
                var menuElem = getElement(myMenuLinkPrefix+urlEncode(firstnav)+"_"+urlEncode(secondnav));
                menuElem.href = "#"+urlEncode(firstnav)+"/"+urlEncode(secondnav)+"/";
                connect(menuElem,"onclick",partial(switchTo,false,"",firstnav,secondnav,null));
            }
        }

        if (!isEmpty(third) && !isEmpty(myMenu[first].sub[second].sub[third].background)) {
            var tmp = getPrevNextThird(first,second,third);
            getElement("thirdNavLeftLink").href = "#"+urlEncode(first)+"/"+urlEncode(second)+"/"+urlEncode(tmp.prev);
            thirdNavLeftSignal = connect("thirdNavLeftLink","onclick",partial(switchTo,false,"",first,second,tmp.prev));
            getElement("thirdNavRightLink").href = "#"+urlEncode(first)+"/"+urlEncode(second)+"/"+urlEncode(tmp.next);
            thirdNavRightSignal = connect("thirdNavRightLink","onclick",partial(switchTo,false,"",first,second,tmp.next));
        }

        getElement("mailboxLink").href="#"+urlEncode(state.first)+"/"+urlEncode(state.second)+"/"+urlEncode(state.third);
        getElement("contactClose").href="#"+urlEncode(state.first)+"/"+urlEncode(state.second)+"/"+urlEncode(state.third);
        getElement("globalContactLink").href="#"+urlEncode(state.first)+"/"+urlEncode(state.second)+"/"+urlEncode(state.third);
        mailBoxLinkSignal= connect("globalContactLink","onclick",partial(myMailBoxLink,true));

        getElement("globalJobLink").href="#jobs//";
        connect("globalJobLink","onclick",partial(switchTo,false,"jobs","","",null));
        getElement("globalReferenceLink").href="#referenz//";
        connect("globalReferenceLink","onclick",partial(switchTo,false,"referenz","","",null));
        getElement("globalImprintLink").href="#impressum//";
        connect("globalImprintLink","onclick",partial(switchTo,false,"impressum","","",null));

        mailBoxLinkSignal= connect("mailboxLink","onclick",myMailBoxLink);

        getElement("homelink").href = "#//";
        connect("homelink","onclick",partial(switchTo,true,"","","",null));
    }

    this.getState = function () {
        return state;
    }
    
}

