//Den globalen Namensraum nicht verseuchen
if(!nureg) var nureg={};
if(!nureg.nws) nureg.nws={};

nureg.nws.ackermann=function() {
    var isIE=Prototype.Browser.IE;
    var isIE6=Prototype.Browser.IE && typeof window.XMLHttpRequest=="undefined";
    var isIE7=Prototype.Browser.IE && navigator.appVersion.indexOf('7.0')>-1; //vielleicht können wir das noch irgendwie besser machen?
    var isIE8=Prototype.Browser.IE && navigator.appVersion.indexOf('8.0')>-1; //vielleicht können wir das noch irgendwie besser machen?

    var staticPagePopupWinContainer=null;
    var direktBestellungsStdValue=null;

    this.init=function() {
        var body=document.getElementsByTagName("body")[0];
        if(document.getElementById("shops")) {
            initShopNav();
        }

        initDirektBestellungsMehwertBox();

        if($('basketTable')) {
            initBasket();
        }

        if(body.className.indexOf('produkt_detail')>-1) {
            initProduktDetailPage();
        }

        if(body.className.indexOf('produkt_warenkorb')>-1) {
            initProduktWarenkorbPage();
        }
    };

    this.ieToggleFixer=function() {
        //Wenn ein Element per JS eingeblenedet wird, bleiben Elemente mit 'bottom: 0' im IE 6 und 7 auf ihrer alten Position, obwohl sich der Content vergrößert hat und diese dadurch weiter nach unten wandern müssten.

        if(isIE6 || isIE7) {
            var elements2fix=new Array('globalNavigation2Box');
            for(var i=0; i<elements2fix.length; i++) {
                var element2fix=document.getElementById(elements2fix[i]);
                element2fix.style.position='static';   //ja, das stimmt...
                element2fix.style.position='absolute'; // ...schon so.
            }
        }
    }

    /*
        Produkt Warenkorb
    */
    var initProduktWarenkorbPage=function() {
        initAccessoiresBox();
    }

    var initAccessoiresBox=function() {
        var moreLinkBox=$('accessoiresBoxMore');
        if(moreLinkBox) {
            $(moreLinkBox.getElementsByTagName('a')[0]).observe('click', showAllAccessoires);
        }
    }

    var showAllAccessoires=function() {
        var accessoires=$$('#accessoiresbox ul li.hide');
        accessoires.each( function(li) {
            li.removeClassName('hide');
            if(isIE6 || isIE7) {
                li.setStyle({ 'zoom' : 1 });
            }
        });

        $('accessoiresBoxMore').addClassName('reallyhide');
        $('accessoiresbox').removeClassName('withMoreLink');
    }

    /*
        Warenkorb
    */
    var initBasket=function() {
        var basketTable=$('basketTable');

        initBasketTableAccessoireToggler();
    }

    var initBasketTableAccessoireToggler=function() {
        var togglerElements=$$('#basketTable .itemHasAccessoiresMessage');

        for(var i=0; i<togglerElements.length; i++) {
            togglerElements[i].observe('click',function (event) { basketTableAccessoireTogglerClicked(Event.element(event)) } );
        }
    }

    var basketTableAccessoireTogglerClicked=function(togglerObj) {
        //suche parentnode bis du ein <tr> hast
        var parent=togglerObj.parentNode;
        var row=null;
        var looplimit=20;
        while(looplimit>=0) {
            parent=parent.parentNode;
            if(parent.nodeName.toLowerCase()=='tr') {
                row=parent;
                break;
            }
            looplimit--;
        }

        //zubehör zeilen anzeigen
        if(row) {
            while(row.nextSibling) {
                row=row.nextSibling;
                if(row.nodeType==1 && row.nodeName.toLowerCase()=='tr') {
                    if(row.className.indexOf('accessoireRecommendation')>-1) {
                        $(row).removeClassName('reallyhide'); //nur 'hide' reicht leider im FF<3.5 nicht immer aus (seltsames Renderingverhalten)
                    }
                    else { //der erste TR node, der kein .accessoireRecommendation ist, beendet das unhiden...
                        if(!(row.className.indexOf('basketExtraRow')>-1)) { //...Ausnahmen sind die .basketExtraRow TRs
                            break;
                        }
                    }
                }
            }
        }

        ieToggleFixer();
    }

    /*
        Produktdetailseite
    */
    var initProduktDetailPage=function() {
        initProduktDetailTabs();
        initInfoLabelHover();
    }

    var initInfoLabelHover=function() {
        var images=$$('#detail-langtext .infolabelbox img');
        for(var i=0; i<images.length; i++) {
            images[i].observe('mouseover', function(event) { infolabelHovers(Event.element(event)); });
            images[i].observe('focus', function(event) { infolabelHovers(Event.element(event)); });

            images[i].observe('mouseout',  function(event) { infolabelUnhovers(Event.element(event)); });
            images[i].observe('blur',  function(event) { infolabelUnhovers(Event.element(event)); });
        }
    }

    var infolabelHovers=function(element) {
        $(element.parentNode.parentNode).getElementsByClassName('infolabelLangtextBox')[0].removeClassName("hide");
    }

    var infolabelUnhovers=function(element) {
        $(element.parentNode.parentNode).getElementsByClassName('infolabelLangtextBox')[0].addClassName("hide");
    }

    var initProduktDetailTabs=function() {
        var tabsListIDs=new Array('detail-tabsList1', 'detail-tabsList2');
        for(var i=0; i<tabsListIDs.length; i++) {
            var tabsList=$(tabsListIDs[i]);
            if(tabsList) {
                var wrapper=document.createElement('div'); // jo! jo!
                wrapper.className='tabContents';

                //var containers2tabify=$$('.produktDetailBox .tabBox .tabme');
                //for(var i=0; i<containers2tabify.length; i++) {
                var containers2tabify=$(tabsList.parentNode).getElementsByClassName('tabme');
                var max_loop_iterations=50;
                while(containers2tabify.length) {
                    //var tabContainer=containers2tabify[i];
                    var containers2tabifyLength=containers2tabify.length;
                    var tabContainer=containers2tabify[0];
                    tabContainer.remove();
                    if(containers2tabifyLength==containers2tabify.length) { // Es gibt Browser, die bei tabContainer.remove das containers2tabify Array verkleinern. Für alle anderen machen wir das eben selbst.
                        containers2tabify.shift();
                    }

                    var headlines=tabContainer.getElementsByTagName("h2");
                    if(headlines) {
                        $(headlines[0]).addClassName('hide');
                    }
                    wrapper.appendChild(tabContainer);

                    max_loop_iterations--;
                    if(max_loop_iterations<0) { //just an emergency brake
                        break;
                    }
                }

                tabsList.insert ( { 'after': wrapper } );

                var tabs = new Control.Tabs(tabsList, { afterChange: function() { ieToggleFixer(); propagteActiveClassToTab(); } });
                tabsList.removeClassName('reallyhide');
            }
        }
    }

    var propagteActiveClassToTab=function() {
        var tabs=$$('#content .tab'); //momentan alle Tabs im Contenbereich, da Control.Tabs nicht wirklich übergeben kann, zu welchem Tabpanel das geklickte Tab gehört.
        for(var i=0; i<tabs.length; i++) {
            if($(tabs[i].getElementsByTagName("a")[0]).hasClassName('active')) {
                tabs[i].addClassName('active');
            }
            else {
                tabs[i].removeClassName('active');
            }
        }
    }

    this.updateAccessoiresList=function(container, json) {
        container.update(json);

        var adviceNode=$('detail-zubehoer-no-zubehoer');
        if(json.replace(/^\s+|\s+$/g,"").length>0) {
            adviceNode.addClassName("reallyhide");
        }
        else {
            adviceNode.removeClassName("reallyhide");
        }
    }



    /*
        Direktbestellung (Mehrwertbox)
    */
    var initDirektBestellungsMehwertBox=function() {
        var input=$('basket_direkt_kdbst');
        if(input) {
            direktBestellungsStdValue=input.value;
            input.observe('focus',direktBestellungsInputGotFocus);
            input.observe('blur',direktBestellungsInputLostFocus);
        }
    }

    var direktBestellungsInputGotFocus=function() {
        var input=$('basket_direkt_kdbst');
        if(input.value==direktBestellungsStdValue) {
            input.value='';
        }
    }

    var direktBestellungsInputLostFocus=function() {
        var input=$('basket_direkt_kdbst');
        if(input.value=='') {
            input.value=direktBestellungsStdValue;
        }
    }



    /*
        Shopnav
    */
    var initShopNav=function() {
        resizeShopNavMenuPoints();
        ie6ShopNavHover();
        preloadHoverImages();
    }

    var ie6ShopNavHover=function() {
        if(isIE6) {
            var nav=$("shops");
            var lis=nav.getElementsByTagName("li");
            for(var i=0; i<lis.length; i++) {
                if(lis[i].className.indexOf("active")>-1) {
                    setShopNavpointIdByClassesStr(lis[i]);
                }

                $(lis[i]).observe("mouseover",function (event) { setShopNavpointIdByClassesStr(Event.element(event)); });
                $(lis[i].getElementsByTagName("a")[0]).observe("mouseover",function (event) { setShopNavpointIdByClassesStr(Event.element(event).parentNode); });
                lis[i].observe("mouseout",function (event) { removeIe6HoverIdByObj(Event.element(event)) });
                $(lis[i].getElementsByTagName("a")[0]).observe("mouseout",function (event) { removeIe6HoverIdByObj(Event.element(event).parentNode) });
            }
        }
    }

    var setShopNavpointIdByClassesStr=function(obj) {
        var className=obj.className;
        var newId='';
        if(className.indexOf("firstLine")>-1) {
            newId+="firstLine";
        }
        else {
            newId+="secondLine";
        }

        newId+="Active";

        var classes=className.split(" ");
        for(var c=0; c<classes.length; c++) {
            if(classes[c]=="firstLine" || classes[c]=="secondLine" || classes[c]=="active" || classes[c]=="firstInLine" || classes[c]=="lastInLine") {
                continue;
            }
            else {
                newId+=classes[c].substr(0,1).toUpperCase()+classes[c].substr(1);
                break;
            }
        }

        obj.id=newId;
    }

    var removeIe6HoverIdByObj=function(obj) {
        if(obj.className.indexOf("active")==-1) {
            obj.id=null;
        }
    }


    /**
     * Emuliere 'display: table-cell' für alle Browser. (das war zumindest die ursprüngliche Idee)
     *
     * Die Höhe des umschließenden Containers wird gemessen und anschließend die Breite eines jeden direkten Kinds um 1
     * erhöht. Hat sich nun die Höhe des umschließenden Containers erhöht, haben wir das Maximum überschritten und
     * machen den letzten Schritt rückgängig.
     **/
    var resizeShopNavMenuPoints=function() {

        var nav=$("shops");
        var classes=new Array("firstLine","secondLine");

        for(var l=0; l<classes.length; l++) {
            var navPoints=nav.getElementsByClassName(classes[l]);
            var maxLoops=100;
            var loop=0;
            var exit=0;

            // an dieser Stelle schon einmal schauen, ob ein Navigationspunkt zu lang ist und damit zweizeilig und damit der Text vielleicht über die Parent-Box rausfließt
            var links=nav.select("."+classes[l]+" a");
            for(var link_nr=0; link_nr<links.length; link_nr++) {
                var link=$(links[link_nr]);
                var lineHeight=parseInt(link.getStyle("line-height"),10);
                if(isIE && ((classes[l]==="secondLine" && link.scrollHeight>27) || (classes[l]==="firstLine" && link.scrollHeight>51))) {
                    var lineHeight=parseInt(link.getStyle("line-height"),10);
                    link.style.lineHeight=(lineHeight/2)+"px"; // link.setStyle doesn't work; damn prototype...
                }
            }

            var navHeight=parseInt(nav.offsetHeight,10);
            var navWidth=parseInt(nav.offsetWidth,10);


          /*  if(isIE6) {
                for(var i=0; i<navPoints.length; i++) {
                    navPoints[i].setStyle({ 'white-space':'normal' });
                }
            }*/

            var mode=null;
            if(navPoints[0].offsetTop<navPoints[navPoints.length-1].offsetTop) { //Wenn der erste Navigationspunkt eine kleinere y-Koordinate hat, als der Letze (=Umbruch), verkleinern...
                mode='shrink';
            }
            else { //...wenn alles auf selber Höhe, dann LI-Tags vergrößern, damit volle Breite eingenommen wird.
                mode='stretch';
            }

            while(loop<maxLoops) { //prevent endless loop
                for(var i=0; i<navPoints.length; i++) {
                    if(exit===0) {
                        var width=parseInt(navPoints[i].getStyle("width"),10);
                        if(isIE && loop==0) { //beim ersten mal liefert getStyle im IE die Breite plus padding zurück. Muss korrigiert werden.
                            var paddingStr=navPoints[i].getStyle("padding");
                            var paddingArr=paddingStr.split(" ");
                            width-=parseInt(paddingArr[1],10); //padding-right
                            width-=parseInt(paddingArr[3],10); //padding-left
                        }

                        if(mode==="shrink") {
                            //navPoints[i].style.width=(width-1)+'px';
                            navPoints[i].setStyle( { 'width': (width-1)+'px' } );
                            if(navPoints[0].offsetTop>=navPoints[navPoints.length-1].offsetTop) {
                                exit=1;
                            }
                        }

                        if(mode==="stretch") {
                            navPoints[i].setStyle( { 'width': (width+1)+'px' } );
                            if(parseInt(nav.offsetHeight,10)>navHeight) { // || parseInt(nav.offsetWidth,10)>navWidth
                                //alert(parseInt(nav.offsetWidth,10)+'>'+navWidth);
                                navPoints[i].setStyle( { 'width': (width)+'px' } );
                                exit=1;
                            }
                        }
                    }

                    var link=navPoints[i].getElementsByTagName("a")[0];

                    if(isIE) {
                        $(link); //Link durch Prototype jagen
                    }

                    if(
                       (!isIE && link.scrollHeight>navPoints[i].scrollHeight) ||
                       (isIE && ((classes[l]==="secondLine" && link.scrollHeight>27) || (classes[l]==="firstLine" && link.scrollHeight>51)))
                    ) {
                        var lineHeight=parseInt(link.getStyle("line-height"),10);
                        link.style.lineHeight=(lineHeight/2)+"px"; // link.setStyle doesn't work; damn prototype...
                    }
                }

                if(exit) {
                    break;
                }

                loop++;
            }
        }
    }


    //lädt die Hover Bilder der Hauptnavigation schon einmal vor, so dass der Browser sie cachen kann
    var preloadHoverImages=function() {
        var path='/ch/ac2/default/images/';
        var imagesToPreload=new Array();
        var shopnav=$('shops');
        var menupoints=shopnav.getElementsByTagName('li');

        var extension='png';
        if(isIE6) {
            extension='gif';
        }

        // Wir können die Dateinamen der Bilder anhand der vergebenen CSS Klassen generieren, außer bei diesen:
        imagesToPreload.push(path+'bg-shopnav-menupoint-firstline-std-highlight.'+extension);
        imagesToPreload.push(path+'bg-shopnav-menupoint-secondline-std-highlight.'+extension);

        // Beispiel für Dateiname: bg-shopnav-menupoint-firstline-versicherungen
        for(var i=0; i<menupoints.length; i++) {
            var filename='bg-shopnav-menupoint-';

            if(menupoints[i].className.indexOf('firstLine')>-1) {
                filename+='firstline';
            }
            else if(menupoints[i].className.indexOf('secondLine')>-1) {
                filename+='secondline';
            }

            filename+='-';

            var classNames=menupoints[i].className.split(' ');
            var remainingClassNames=classNames.without('active', 'firstInLine', 'lastInLine', 'firstLine', 'secondLine');
            if(remainingClassNames.length==1 && remainingClassNames[0].length>0) {
                if(remainingClassNames[0]=='home' || remainingClassNames[0]=='events') { // die zwei Navigationspunkte haben die Standardfarbe
                    continue;
                }
                filename+=remainingClassNames[0];

                filename+='.'+extension;
                imagesToPreload.push(path+filename);
            }
        }

        for(var i in imagesToPreload) {
            if(!isNaN(i)) {
                var image=new Image();
                image.src=imagesToPreload[i];
            }
        }
    }

    this.initAjaxSearch=function(target) {
        try {
            new Ajax.Autocompleter( 'searchText', 'suche_auto_complete', target, { onSuccess : ie8AutoCompleterFix ,  afterUpdateElement : function() { $('searchText').form.submit();  } } );
        }
        catch(e) {

        }
    }

    var ie8AutoCompleterFix=function() {
        if(isIE8) {
            //im IE8 stimmt die Position der Ergebnisliste vorne und hinten nicht (Prototype berechnet left und top völlig falsch). Deshalb setzen wir nach die Position per Hand neu.
            window.setTimeout( function () {
                    var list=$('suche_auto_complete');
                    list.style.top='auto';
                    list.style.left='61px';
                },
                300
            );
        }
    }

    /*
        Popup
    */
    this.openExternalPopupFromStaticPage=function(target) {
        if(staticPagePopupWinContainer && !staticPagePopupWinContainer.closed) {
            staticPagePopupWinContainer.close();
        }

        staticPagePopupWinContainer=window.open(target, 'International', 'personalbar=no,menubar=no,location=no,status=no,scrollbars=yes,width=875,height=600,resizable');
    }

    return this;
}();

document.observe("dom:loaded",nureg.nws.ackermann.init);
