﻿(function($) {
    var debug = false;

    // Private Methods
    function log(msg) {
        if (window.console && debug) {
            window.console.log(msg);
        }
    }

    // Google Maps
    function initAgentMap(className) {

        // Ist Google Maps geladen?
        if (typeof (GMap2) != "undefined") {

            var geocoder = new GClientGeocoder();

            $(className).each(function() {
                var self = $(this);

                // Hole Vermittlername und Suchabfrage aus dem Div
                var name = self.find(".name").remove().text();
                var query = self.find(".query").remove().text();
                var overlay = self.find(".marker-overlay").remove().html();

                // Aktiviere Karte
                var map = new GMap2(this);
                map.addControl(new GLargeMapControl3D());
                map.addControl(new GMapTypeControl());

                // Löse Adresse auf (Achtung: Auf 2500 Requests Pro Tag beschrenkt. Eventuell Ergebnis Cachen?)
                geocoder.getLatLng(query, function(point) {
                    if (!point) {
                        // TODO: Eventuell Fehler ausgeben? 
                        // TODO: Auf Standardort zentrieren?
                        log(query + " not found");
                    } else {
                        // Auf Adresse Zentrieren
                        map.setCenter(point, 13);
                        // Marker setzen
                        var marker = new GMarker(point);
                        map.addOverlay(marker);
                        marker.openInfoWindowHtml(overlay);
                        GEvent.addListener(marker, "click", function() {
                            marker.openInfoWindowHtml(overlay);
                        });
                    }
                }
                );
            });
        }
    }

    // Schnellzugriff
    function initFastAccess(className) {
        $("select" + className).change(function() {
            var url = this.options[this.selectedIndex].value;
            if (url != "-") {
                window.location = url;
            } else {
                this.selectedIndex = 0;
            }
        });
        log("fastaccess initialisiert");
    }

    // Richtet den Defaulttext bei Suchfeldern ein
    function initSearchfields(className) {
        $(className).each(function() {
            var self = $(this);
            var emptyText = self.val();
            self.addClass('inactive');
            self.focus(function() {
                if (self.val() == emptyText) {
                    self.removeClass('inactive');
                    self.val('');
                }
            });
            self.blur(function() {
                if (self.val() == '') {
                    self.addClass('inactive');
                    self.val(emptyText);
                }
            });
        });
    }

    // Vermittlersuchsnippet
    function initAgentSearch(className) {
        $(className).each(function() {
            var self = $(this);
            var searchField = self.find("input.searchfield");
            var searchUrl = self.find(".targeturl").remove().val();
            if (!searchUrl) {
                searchUrl = "/de/VermittlerSuche.aspx?plz=";
            }
            function submit(event) {
                var url = searchUrl + searchField.val();
                ergoUi.openWin(url, "Vermittlersuche", "");

                return false;
            }

            self.find("input.submit").click(submit);
            searchField.keydown(function(event) {
                if (event.keyCode == '13') {
                    return submit();
                }
            });
        });
    }


    // Suchbox Enter-Taste RN 20100624
    function initCaspardoSearch() {

        function submit(event) {
            var inputField = $('#caspardosubmit');
            var form = document.forms[0];
            form.action = form['caspardo_url'].value;
            form.submit();
            return false;
        }
        var inputField = $('#caspardosearch');
        if (inputField) {
            inputField.keydown(function(event) {
                if (event.keyCode == '13') {
                    return submit();
                }
            });
        }
    }





    // Verschieden Fehlerbehebungen für IE
    function initIEFix() {
        $.each($.browser, function(i, val) {
            if (i == "msie") {
                // Workaround für abgerundete Buttons
                $(".button-red, .button-grey").append("<span></span>");
                // Workaround für first-child Pseudoselektor im IE6
                $("p:first-child, h2:first-child, h1:first-child").addClass("first-child");
            }
        });
    }

    // Checkboxen auf der Vermittler Bearbeitungsseite ("Meine Daten");
    function initAllowChange(cssClass) {
        $(cssClass).each(function() {
            var self = $(this);
            var input = self.parents("tr").find("input[type='text'], select");
            var initialValue = input.val();
            function onChange(event) {
                if (self.is(":checked")) {
                    input.removeAttr("disabled");
                } else {
                    input.attr("disabled", "disabled");
                    input.val(initialValue);
                }
            }
            self.click(onChange);
        });
    }

    // Vermittlerbearbeitungsformular: Felder werden durch Checkbox (de)aktiviert
    function initPreviewAgentTexts() {
        $(".text1 .text1_" + $(".text1 input:checked").val()).show();
        $(".text2 .text2_" + $(".text2 input:checked").val()).show();

        $(".text1 input").change(function() {
            var value = $(".text1 input:checked").val();
            $(".text1 .agentText").slideUp("fast");
            $(".text1_" + value).slideDown("fast");
        });
        $(".text2 input").change(function() {
            var value = $(".text2 input:checked").val();
            $(".text2 .agentText").slideUp("fast");
            $(".text2 .text2_" + value).slideDown("fast");
        });
    }

    // Image Slider
    function initSlider(className, options) {
        // Einstellungen können durch den options Parameter ergänzt oder überschrieben werden
        var defaults = {
            speed: 400,
            easing: 'swing'
        };
        $.extend(defaults, options);

        $(className).each(function() {

            // referenz auf das container div
            var self = $(this);

            // slider div (wird hin und her geschaltet)
            var slider = self.find('.cs_slider');

            // breite des sliders
            var width = self.width();

            // alle 'slides'
            var items = self.find('.cs_item');

            // ist gerade eine animation aktiv?
            var inuse = false;

            // Container für die Buttons
            var buttonsDiv = $("<div></div>").addClass("buttons").appendTo(self);
            var buttons = []; // Array für die Buttons
            var i = 0;
            var activeButton;
            var maxHeight = 0; // speichert die größte Höhe die die Slides erreichen

            items.each(function() {
                var item = $(this).width(width); // setze das Item auf die Breite des Sliders
                maxHeight = item.height() > maxHeight ? item.height() : maxHeight;  // aktualisiere die maximale höhe
                var left = item.position().left; // position des slides innerhalb des sliders

                // erzeuge button für das item und hänge onclick handler an
                var button = $("<a></a>").text(++i).addClass("button").appendTo(buttonsDiv).click(function() {
                    activeButton.fadeTo('fast', 0.6); // fade aktiven button aus
                    activeButton = $(this); // schalte den button aktiv
                    activeButton.fadeTo('fast', 1.0); // fade den button ein

                    // wenn keine andere animation läuft
                    if (inuse === false) {
                        log('slide to : ' + left);
                        inuse = true;
                        // animiere den übergang
                        slider.animate({ 'left': -1 * left + 'px' }, defaults.speed, defaults.easing, function() {
                            inuse = false;
                        });
                    }
                });
                // füge neuen button dem array zu
                buttons.push(button);

                // setze alle buttons außer dem ersten auf inaktiv
                if (i > 1)
                    button.css('opacity', 0.6);

            });
            activeButton = buttons[0];

            // setze die höhe des sliders auf die höhe des größten slides
            self.height(maxHeight);
            log('slider initialisiert');
        });
    }

    // Javascript Controls einblenden die nur mit Javascript sichtbar sein sollen
    function showHiddenElements(className) {
        $(className).show();
        log("js elemente eingeblendet");
    }
    // Macht Boxen auf- und zuklappbar
    function initCollapsableBoxes(className) {
        // Macht jede Box auf/-zuklappbar
        $(className).each(function() {
            var box = $(this);

            var title = box.children("h2, h3");

            var text = title.text();

            var plus = $("<span></span>").addClass("plus").prependTo(title);
            plus.html(box.children(".content:visible").length > 0 ? "&ndash;" : "+");

            title.click(function() {
                // Klappt den Content der Box ein bzw. aus
                box.children(".content").slideToggle("slow");
                plus.html(plus.html() == "+" ? "&ndash;" : "+");
            });
            log('Aufklappbox initialisiert: ' + text);
        });
        log('alle Aufklappboxen intialisiert');
    }

    // Erzeugt CardView
    function initCardView(className) {
        $(className).each(function() {
            var tabs = $(this).addClass('tabs');
            var tabbar = $("<ul></ul>").addClass("bar clearfix");
            var buttons = [];

            tabs.prepend(tabbar);
            tabs.children(".tab").each(function() {

                var tab = $(this).hide();
                var label = tab.children("h2").attr("title");
                if (!label) {
                    label = tab.children("h2").remove().text();
                }
                var button = $("<a></a>").text(label);

                tab.children("h2").removeAttr("title");

                buttons.push(button);
                tabbar.append($("<li></li>").append(button));

                button.click(function() {
                    $(buttons).each(function() { this.removeClass("selected"); });
                    button.addClass("selected");
                    tabs.children('.tab').css('display', 'none');
                    tab.css('display', 'block');
                });

            });
            buttons[0].click();
            log('Cardview initialisiert');
        });
    }

    // Popup Schließen Button
    function initPopup(className) {
        $(className).each(function() {
            $('<a class="close-button">Schließen</a>').appendTo($("#header")).click(function() {
                window.close();
            });
            log('Popup initialisiert');
        });
    }

    // Printbutton im Printlayout und Urls
    function initPrint(className) {
        $(className).each(function() {
            var mainArea = $("#mainarea");

            $(".cardview").removeClass("cardview");
            // Erzeuge Druck Button
            $('<a class="print-button">Drucken</a>').appendTo($("#header")).click(function() {
                window.print();
            });
            log('printbutton hinzugefügt');

            // Schreibe aktuelle Url unter den Text
            var urls = $('<div class="urls"></div>').append('<h2>Url dieser Seite</h2>');
            urls.append($("<ul></ul>").addClass('linklist').append($('<li></li>').text(window.location.href.replace(/\?.*/, ""))));

            // Sammle aller Links im Text und füge sie als Fußnote unter den Text an
            var links = $("#mainarea a:visible");
            if (links.length > 0) {
                urls.append("<h2>Links in diesem Artikel</h2>");
                var elementCounter = 0;
                var list = $("<ul></ul>").addClass("linklist").appendTo(urls);
                links.each(function() {
                    var url = $(this).attr('href');
                    if (url.substring(0, 1) == "/") {
                        url = "http://" + window.location.host + url;
                    }
                    $("<li></li>").text('[' + ++elementCounter + '] ' + url).appendTo(list);
                    $(this).after(' [' + elementCounter + ']');
                });
            }
            mainArea.append(urls);
            log('Urls extrahiert');
        });
    }

    // Social Media Popup
    function initBookmarks(prototypeId, linkClass) {

        // Holt sich Vorlage aus Snippet
        var prototype = $(prototypeId).remove().addClass("bookmarks").removeAttr("id");

        // Hängt funktionialität an alle entsprechenden PageTask links
        $(linkClass).each(function() {
            var self = $(this).css("position", "relative");
            var link = self.find('a');
            var popup = $('<div class="overlay"></div>').hide().append(prototype.clone().show());
            if (prototype.length == 0) {
                popup.text("Social Media Rendering muss dem Templaten noch hinzugefügt werden");
            }
            self.css('position: relative');
            popup.appendTo(self);
            link.click(function() {
                popup.toggle("fast");
                return false;
            });
        });
    }
    // Kontaktformular
    var contactForm = function() {
        function initResetButton() {
            $("#resetForm").click(function() {
                $(":input").each(function() {
                    var type = this.type
                    var tag = this.tagName.toLowerCase();
                    if (type == 'text' || type == 'password' || tag == 'textarea')
                        this.value = '';
                    else if (type == 'checkbox' || type == 'radio')
                        this.checked = false;
                    else if (tag == 'select')
                        this.selectedIndex = -1;
                });
            });
        };
        function initShowThema() {
            $("#contactDatenweitergabeContainer").css('display', 'none');
            $("#contactThema1Container").css('display', 'none');
            $("#contactThema2Container").css('display', 'none');
            $("#contactThema3Container").css('display', 'none');
            if ($(".contactBetreff").val() == 1 || $(".contactBetreff").val() == 5) {
                $("#contactThema1Container").css('display', 'block');
                $("#contactDatenweitergabeContainer").css('display', 'block');
            }
            if ($(".contactBetreff").val() == 2)
                $("#contactThema2Container").css('display', 'block');
            if ($(".contactBetreff").val() == 3)
                $("#contactThema3Container").css('display', 'block');


            $(".contactBetreff").each(function() {
                $(this).change(function() {
                    $("#contactDatenweitergabeContainer").css('display', 'none');
                    $("#contactThema1Container").css('display', 'none');
                    $("#contactThema2Container").css('display', 'none');
                    $("#contactThema3Container").css('display', 'none');
                    if (this.value == 1 || this.value == 5) {
                        $("#contactThema1Container").css('display', 'block');
                        $("#contactDatenweitergabeContainer").css('display', 'block');
                    }
                    if (this.value == 2)
                        $("#contactThema2Container").css('display', 'block');
                    if (this.value == 3)
                        $("#contactThema3Container").css('display', 'block');
                });
            });
        };

        function initShowLayer() {
            $(".form .button").each(function() {
                $(this).click(function() {
                    $(".form .layer").toggle();
                });
            });
        };

        return {
            init: function() {
                initResetButton();
                initShowLayer();
                initShowThema();

                log("Kontaktformular initialisiert");
            }
        };
    } ();
    // repariert click methode für Browser die das nicht unterstützen
    function initClickFix(cssClass) {
        $(cssClass).each(function() {
            if (typeof (this.click) == "undefined") {
                this.click = function() {
                    if (this.onlick) result = this.onclick();
                    if (typeof (result) == 'undefined' || result) {
                        eval($(this).attr("href"));
                    }
                }
            }
        });
    }
    // Flash
    var Flash = function() {
        function getVersion() {
            // ie
            try {
                try {
                    var axo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.6');
                    try { axo.AllowScriptAccess = 'always'; }
                    catch (e) { return '6,0,0' }
                } catch (e) { }
                return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
                // other browsers
            } catch (e) {
                try {
                    if (navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin) {
                        return (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g, ",").match(/^,?(.+),?$/)[1];
                    }
                } catch (e) { }
            }
            return '0,0,0';
        }
        return {
            majorVersion: getVersion().split(',').shift(),
            init: function() {
                var version = this.majorVersion;
                $(".flash").each(function() {
                    var self = $(this);
                    var requiredVersion = self.find('param[name="requiredVersion"]').attr('value');
                    var alternate = self.find('.alternate');
                    if (parseInt(requiredVersion) > parseInt(version)) {
                        self.find('object').replaceWith(alternate);
                    }
                });

            }
        }
    } ();

    // Diverse Cookie Methoden
    var Cookies = {
        // Cookie lesen
        getCookie: function(name) {
            var index = document.cookie.indexOf(name + "=");
            if (index < 0)
                return null;
            index = document.cookie.indexOf("=", index) + 1;
            var endstr = document.cookie.indexOf(";", index);
            if (endstr < 0) endstr = document.cookie.length;
            return unescape(document.cookie.substring(index, endstr));
        },

        // Cookie schreiben 
        setPersistentCookie: function(name, value) {
            var expireDate = new Date();
            expireDate.setMonth(expireDate.getMonth() + 6);   // 6 Monate  

            document.cookie = name + "=" + value + "; expires=" + expireDate.toGMTString() + "; path=/";
        },

        // Cookie entfernen 
        deleteCookie: function(name) {
            if (this.getCookie(name))
                document.cookie = name + "=;path=/;expires=Thu, 01-Jan-1970 00:00:01 GMT";
        },

        // Feldelement setzen (URL-Syntax)
        setDictionaryValue: function(coll, key, value) {
            return key + "=" + value + "&" + this.removeDictionaryValue(coll, key);
        },

        // Feldelement entfernen (URL-Syntax)
        removeDictionaryValue: function(coll, key) {
            var array = coll.split('&');
            var result = '';
            for (var i = 0; i < array.length; i++) {
                if (array[i].indexOf(key + '=') != 0)
                    result += '&' + array[i];
            }
            return result.substr(1);
        },
        test: function() {
            this.setPersistentCookie("testcookie", "1");
            var value = Cookies.getCookie("testcookie");
            if (value == null)
                return false;
            this.deleteCookie("testcookie");
            return true;
        }
    };

    // Favoriten
    var Remember = {
        addFav: function() {
            if (!Cookies.test()) {
                alert("Für diese Funktion benötigen Sie die Cookie-Funktion Ihres PCs. Bitte ändern Sie Ihre Datenschutzeinstellungen entsprechend.");
                return;
            }

            var cval = Cookies.getCookie('efavs');
            Cookies.deleteCookie('efavs');
            if (cval == null)
                cval = "";
            var guid = _sc_CurrentId.toLowerCase().replace(/\{|\}/gi, '');
            cval = Cookies.setDictionaryValue(cval, guid, "1");
            Cookies.setPersistentCookie('efavs', cval);
            window.location.reload();
        },

        removeFav: function(oLink) {
            var guid = oLink.id.toLowerCase().substr(3);  //  ID darf keine "-" enthalten
            guid = guid.substring(0, 8) + '-' + guid.substring(8, 12) + '-' + guid.substring(12, 16) + '-' + guid.substring(16, 20) + '-' + guid.substring(20, 32);

            var cval = Cookies.getCookie('efavs');
            Cookies.deleteCookie('efavs');
            if (cval == null) cval = "";
            cval = Cookies.removeDictionaryValue(cval, guid);

            Cookies.setPersistentCookie('efavs', cval);

            $(oLink.parentNode).hide("fast");
        }
    };

    // Wird ausgeführt beim start der Seite
    $(function() {

        showHiddenElements(".js-show");
        initPopup("#popup-container");
        initPrint('#popup-container .print');
        initCardView(".cardview");
        initSlider('#contentslider', {});
        initCollapsableBoxes(".collapsable");
        initFastAccess(".fastaccess");
        initSearchfields('.searchfield');
        initAgentSearch('.agentsearch');
        initCaspardoSearch();
        initBookmarks('#socialMediaPrototype', 'li.bookmark');
        initAllowChange(".allowChange input");
        initPreviewAgentTexts();
        initIEFix();
        initClickFix("a.click-fix");
        initAgentMap(".agentMapGoogle");
        Flash.init();

        contactForm.init();

        log("initialisierung abgeschlossen");
    });

    // Öffentliche Schnittstelle
    // Überall aufrufbar über z.B. ergoUi.log('Das ist ein Test');
    window.ergoUi = {
        openWin: function(url, name, params) {
            var win = window.open(url, name, params);
            if (win == null) {
                alert("Fehler beim Öffnen eines Fensters.");
                log("Fehler beim Öffnen eines Fensters.");
                return;
            }
            try {
                win.focus();
            } catch (e) {
                log(e);
            }
        },
        log: function(message) {
            // Ruft private Log Methode auf
            log(message);
        },
        remember: Remember,
        cookies: Cookies
    }
})(jQuery);


// RN 20100408 Funktion für Popup-Fenster
// KB 20100426 In ErgoUi Klasse verschoben. TODO: Aufrufe anpassen: ergoUi.openWin(...)
function openWin(url, name, params) {
    ergoUi.openWin(url, name, params);
}


// RN 20100520
function getUrlParam(strParamName) {
    var strReturn = "";
    var strHref = window.location.href;
    if (strHref.indexOf("?") > -1) {
        var strQueryString = strHref.substr(strHref.indexOf("?")).toLowerCase();
        var aQueryString = strQueryString.split("&");
        for (var iParam = 0; iParam < aQueryString.length; iParam++) {
            if (aQueryString[iParam].indexOf(strParamName.toLowerCase() + "=") > -1) {
                var aParam = aQueryString[iParam].split("=");
                strReturn = aParam[1];
                break;
            }
        }
    }
    return unescape(strReturn);
}
 
 
