﻿(function($) {
    var debug = false;

    // Private Methods
    function log(msg) {
        if (window.console && debug) {
            window.console.log(msg);
        }
    }

    // Beispiel: "Hallo {0}".format("Welt");
    String.prototype.format = function() {
        var formatted = this;
        for (var i = 0; i < arguments.length; i++) {
            var regexp = new RegExp('\\{' + i + '\\}', 'gi');
            formatted = formatted.replace(regexp, arguments[i]);
        }
        return formatted;
    };

    // Media Snippet
    $.fn.mediaSnippet = function() {
        this.each(function() {
            var $this = $(this);
            var object = $this.children("object").eq(0);
            var link = $this.children("a").eq(0);
            var image = $this.find("img").eq(0);
            if (image.length > 0) {
                if (!link.attr("href")) {
                    link.replaceWith(image);
                }
            } else {
                link.remove();
            }
            if (object.length > 0) {
                if (image.length > 0) {
                    if (link.length > 0) {
                        link.replaceWith(image);
                    }
                    image.css("cursor", "pointer").click(function() {
                        object.css("position", "absolute");
                        object.css("top", 0);
                        object.css("left", 0);
                        object.width(image.width());
                        object.height(image.height());
                        image.css("visibility", "hidden");
                        object.show();
                    });
                } else {
                    var flashVars = object.find("param[name='FlashVars']");
                    var value = flashVars.attr("value");
                    if (value) {
                        value = value.replace("%2fErgoDe%2fWebForms%2fGenericFlashXML.aspx%3fmovie%3d", encodeURI("/de/Resources/Flash Xml/VermittlerVideoNeu_xml?bla="));
                        flashVars.attr("value", value);
                        var parent = object.parent();
                        object.remove();
                        object.appendTo(parent);
                        object.attr("data", object.attr("data") + "?v=2");
                        var src = object.find("param[name='src'");
                        src.attr("value", src.attr("value") + "?v=2");
                    }
                    object.width(537);
                    object.height(327);
                    object.show();
                }
            }
        });
    };

    $.fn.contentSlider = function(options) {
        // Einstellungen können durch den options Parameter ergänzt oder überschrieben werden
        var settings = {
            speed: 400,
            easing: 'swing',
            interval: 7
        };

        if (options)
            $.extend(defaults, options);

        this.each(function() {
            var $this = $(this);
            var slider = $this.find('.cs_slider');
            var width = $this.width();
            var items = $this.find('.cs_item').width(width);

            // ist gerade eine animation aktiv?
            var inuse = false;


            // Container für die Buttons
            var buttonsDiv = $this.find(".buttons");
            if (buttonsDiv.length == 0) {
                buttonsDiv = $("<div></div>").addClass("buttons").appendTo($this);
            }
            var buttons = $this.data("buttons");
            if (!buttons) {
                buttons = [];
            }
            var i = 0;
            var activeButton;
            var maxHeight = 0; // speichert die größte Höhe die die Slides erreichen
            var currentIndex = 0;
            function gotoItem(index) {
                // wenn keine andere animation läuft
                if (inuse === false) {
                    activeButton.fadeTo('fast', 0.6); // fade aktiven button aus
                    activeButton = buttons[index]; // schalte den button aktiv
                    activeButton.fadeTo('fast', 1.0); // fade den button ein

                    var left = items.eq(index).position().left;

                    log('slide to : ' + left);
                    inuse = true;
                    currentIndex = index;
                    // animiere den übergang
                    slider.animate({ 'left': -1 * left + 'px' }, settings.speed, settings.easing, function() {
                        inuse = false;
                    });
                }
            }

            var interval = $this.data("interval");
            if (!interval && interval !== 0) interval = settings.interval;
            var intervalId;
            function resetInterval() {
                if (intervalId) {
                    clearInterval(intervalId);
                }
                if (interval > 0) {
                    intervalId = setInterval(function() {
                        gotoItem(currentIndex < buttons.length - 1 ? currentIndex + 1 : 0);
                    }, interval * 1000);
                }
            }
            resetInterval();

            items.each(function(index) {
                var item = $(this);
                maxHeight = item.height() > maxHeight ? item.height() : maxHeight;  // aktualisiere die maximale höhe
                // erzeuge button für das item und hänge onclick handler an
                var button = $("<a></a>").text(++i).addClass("button").appendTo(buttonsDiv).click(function() {
                    resetInterval();
                    gotoItem(index);
                });
                // füge neuen button dem array zu
                buttons.push(button);

                // setze alle buttons außer dem ersten auf inaktiv
                if (index > 0)
                    button.css('opacity', 0.6);

            });
            if (!activeButton) {
                activeButton = buttons[0];
            }
            if (settings.page) {
                gotoItem(settings.page);
            }

            // setze die höhe des sliders auf die höhe des größten slides
            $this.height(maxHeight);
            log('slider initialisiert');

        });
    };

    $.fn.disableSelection = function() {
        return $(this).attr('unselectable', 'on')
                    .css('-moz-user-select', 'none')
                    .each(function() {
                        this.onselectstart = function() { return false; };
                    });
    };

    // TODO: entfernen wenns nicht mehr gebraucht wird
    $.fn.startPageSlider = function(options) {
        var settings = {
            pageWidth: 980,
            interval: 10,
            height: 600
        };
        if (options) $.extend(settings, options);

        if (!this.length)
            return this;

        var height = this.parent().data("height");
        height = height ? height : settings.height;
        var interval = this.parent().data("interval");
        interval = interval ? interval : settings.interval;

        var sliderContainer = $("<div>", { "class": "page-slider" }).width(settings.pageWidth).height(height).prependTo($("body"));
        var itemList = $("<ul>").prependTo(sliderContainer).width(this.length * (settings.pageWidth)).height(height);
        $("#columns").height(height - 106);
        var count = this.length;

        var images = [];
        var width = (settings.pageWidth - 40) / count;
        //var bar = $("<div>", { "class": "bar" }).css("left", width / 2 + 15).css("right", width / 2 + 17).appendTo(this.parent());
        //var handle = $("<div>", { "class": "handle" }).css("left", -15).appendTo(bar).mousedown(next);
        var bar = $("<div>", { "class": "bar" }).css("left", width / 2 + 15).css("right", width / 2 + 17).appendTo(this.parent()).slider({ animate: true, max: (this.length - 1) * 100 }).removeClass("ui-slider");
        this.mousemove(function() {
            $("body").focus();
        });
        var result = this.each(function(i) {
            var $this = $(this).disableSelection();
            $this.parent().disableSelection();
            var page = { label: $this.text(), image: $this.data("image"), link: $this.data("link") };
            var item = $("<li>").width(settings.pageWidth).appendTo(itemList).height(height);
            images.push({ "src": page.image, "onload": function(img) {
                img.prependTo(item);
            }
            });
            if (page.link) {
                var link = $("<a />").addClass("full-page-link").attr("href", page.link).appendTo(item);
            }

            $this.css("left", width * i + 20).width(width);
            $this.click(function() { gotoIndex(i); });

        });
        result.eq(0).css({ "font-weight": "bold", "padding-top": 15 });
        var intervalHandle;
        function loadNextImage() {
            if (images.length) {
                var image = images.splice(0, 1)[0];
                var img = document.createElement("img");
                img.onload = function() {
                    loadNextImage();
                    image.onload($(img));
                };
                img.src = image.src;
            } else {
                startInterval();
            }
        }
        function startInterval() {
            if (intervalHandle) {
                clearInterval(intervalHandle);
            }
            intervalHandle = setInterval(next, interval * 1000);
        }
        var currentIndex = 0;
        function next() {
            if (currentIndex < count - 1) {
                gotoIndex(currentIndex + 1);
            } else {
                gotoIndex(0);
            }
        }
        function gotoIndex(index) {
            var pos = -(index * (settings.pageWidth));
            itemList.animate({ left: pos }, "slow");

            result.eq(currentIndex).animate({ "padding-top": 10 }).css("font-weight", "normal");
            result.eq(index).animate({ "padding-top": 15 }).css("font-weight", "bold");
            currentIndex = index;
            //handle.animate({ left: width * index - 12 }, "slow");
            bar.slider("value", index * 100);
            startInterval();
        }
        bar.bind("slide", function(event, ui) {
            startInterval();
        });
        bar.bind("slidechange", function(event, ui) {
            var newIndex = Math.round(ui.value / 100);
            if (newIndex != currentIndex) {
                gotoIndex(newIndex);
            } else if (ui.value != newIndex * 100) {
                bar.slider("value", newIndex * 100);
            }
        });
        loadNextImage();
        return result;
    };

    // Google Map
    $.fn.gmap = function(options) {
        var settings = {
            infoContent: null,
            query: null,
            routing: null,
            logo: '/ergode/images/new/icons/marker_vic.png',
            onQueryFound: function(query, coords) { },
            onDirectionsFound: function(directions, distance) { }
        };
        if (options) $.extend(settings, options);
        return this.each(function() {
            if (typeof (google) != "undefined" && typeof (google.maps) != "undefined") {
                var $this = $(this);


                // Initialisiere Karte
                var map = $this.data("googlemap");
                if (!map) {
                    var initialMapOptions = {
                        mapTypeId: google.maps.MapTypeId.ROADMAP,
                        zoom: 14,
                        center: new google.maps.LatLng(-34.397, 150.644),
                        navigationControlOptions: {
                            style: google.maps.NavigationControlStyle.SMALL
                        }
                    };
                    map = new google.maps.Map($this[0], initialMapOptions);
                    $this.data("googlemap", map);
                }

                // Initialisiere Info Box
                var infoBox = $this.data("infobox");
                if (!infoBox) {
                    infoBox = new google.maps.InfoWindow();
                    $this.data("infobox", infoBox)
                }
                if (settings.infoContent) {
                    infoBox.setContent(settings.infoContent)
                }

                // Setze Marker
                var markers = $this.data("mapmarkers");
                if (!markers) markers = [];
                var query = settings.query ? settings.query : $this.data("query");
                if (query) {

                    var googleGeoCoder = new google.maps.Geocoder();
                    if (googleGeoCoder && map) {
                        googleGeoCoder.geocode({ 'address': query }, function(results, status) {
                            if (status == google.maps.GeocoderStatus.OK) {
                                var location = results[0].geometry.location;
                                map.setCenter(location);
                                for (var i = 0; i < markers.length; i++) {
                                    markers[i].setMap(null);
                                }
                                markers.length = 0;
                                var marker = new google.maps.Marker({ position: location, map: map, icon: settings.logo });
                                google.maps.event.addListener(marker, 'click', function() {
                                    if (infoBox) {
                                        infoBox.open(map, marker);
                                    }
                                });
                                markers.push(marker);
                                settings.onQueryFound(query, location);
                                $this.data("mapmarkers", markers);
                            }
                        });
                    }
                }

                // Starte Routenplanung
                if (settings.routing && settings.routing.clear == true) {
                    // PolyLine entfernen
                    var googlePolyLine = $this.data("polyline");
                    if (googlePolyLine) googlePolyLine.setMap(null);

                    var startMarker = $this.data("startMarker");
                    if (startMarker) startMarker.setMap(null);

                    map.setCenter(markers[0].position);
                    map.setZoom(14);

                } else if (settings.routing) {
                    var googleDirectionsRenderer = new google.maps.DirectionsRenderer();
                    googleDirectionsRenderer.setMap(map);

                    var routingRequest = {
                        origin: settings.routing.start,
                        destination: settings.routing.destination,
                        travelMode: google.maps.DirectionsTravelMode.DRIVING,
                        region: 'de'
                    };

                    var googleDirectionsService = new google.maps.DirectionsService();
                    googleDirectionsService.route(routingRequest, function(result, status) {
                        if (status == google.maps.DirectionsStatus.OK) {
                            // Darstellungbereich ermitteln
                            var googleMapBounds = new google.maps.LatLngBounds();

                            // PolyLine entfernen
                            var googlePolyLine = $this.data("polyline");
                            if (googlePolyLine) googlePolyLine.setMap(null);

                            // Pfad erzeugen
                            googlePolyLine = new google.maps.Polyline({ path: [], strokeColor: '#ba122b', strokeOpacity: 0.5, strokeWeight: 3 });
                            $this.data("polyline", googlePolyLine);
                            var startMarker = $this.data("startMarker");

                            // Route rendern
                            var routeChunks = result.routes[0].legs;
                            for (i = 0; i < routeChunks.length; i++) {
                                // Startmarker erstellen
                                if (i == 0) {
                                    if (startMarker)
                                        startMarker.setMap(null);
                                    startMarker = new google.maps.Marker({ position: routeChunks[i].start_location, map: map, icon: '/ergode/images/new/icons/marker_small.png' });
                                    $this.data("starMarker", startMarker);
                                }
                                // Straßen der Teilroute
                                var streets = routeChunks[i].steps;
                                var directions = [];
                                for (j = 0; j < streets.length; j++) {
                                    // Wegbeschreibung füllen
                                    directions.push(streets[j].instructions);

                                    var currentStreet = streets[j].path;
                                    // Rendern der Pfadteile
                                    for (k = 0; k < currentStreet.length; k++) {
                                        googlePolyLine.getPath().push(currentStreet[k]);
                                        googleMapBounds.extend(currentStreet[k]);
                                    }
                                }
                                settings.onDirectionsFound(directions, routeChunks[i].distance);
                            }
                            // Polyline rendern und Bounds setzen
                            googlePolyLine.setMap(map);
                            map.fitBounds(googleMapBounds);
                        } else {
                            alert("Keine Routenplanung möglich, bitte überprüfen Sie Ihre Angaben!");
                        }
                    });

                }
            }
        });
    };

    $.fn.agentMap = function(options) {
        var settings = {
            revealRouteButtonLabel: "Route berechnen",
            calculateRouteButtonLabel: "Route berechnen"
        };
        if (options) $.extend(settings, options);

        return this.each(function() {
            var $this = $(this);
            var parent = $this.parent();
            $this.remove();

            // Map Daten
            var query = $this.data("query");
            var logoType = $this.data("logotype");

            // Map erzeugen
            var map = $("<div />").addClass("map").appendTo(parent);
            map.gmap({
                query: query,
                infoContent: $this.html(),
                logo: logoType == "Victoria" ? '/ergode/images/new/icons/marker_vic.png' : '/ergode/images/new/icons/marker_ergo.png',
                onQueryFound: function(query, coords) {

                }
            });

            // Seitenleiste erzeugen
            var sidebar = $("<div />").addClass("sidebar").prependTo(parent);
            sidebar.append($this);
            var showRoutingFormButton = $("<a />").addClass("show-route").text(settings.revealRouteButtonLabel).prependTo(sidebar);

            var form = $("<div />").addClass("form").hide().prependTo(sidebar);
            showRoutingFormButton.click(function() { showRoutingFormButton.hide(); form.show(); });

            var cancelButton = $("<a />").addClass("close").appendTo(form).click(function() {
                form.hide();
                showRoutingFormButton.show();
                printButton.hide();
                directions.empty();
                distance.empty();
                map.gmap({ routing: { clear: true} });
            });

            var fromField = $('<input type="text" />').appendTo(form).wrap("<p />");
            var toField = $('<input type="text" />').val(query).appendTo(form).wrap("<p />");
            var calculateButton = $('<a />').text(settings.calculateRouteButtonLabel).appendTo(form);
            var printButton = $("<a>").addClass("print-directions").text("Drucken").appendTo(form).hide().css("float", "left").openInNewWindow();
            var distance = $("<p />").addClass("distance").appendTo(form);
            var directions = $('<ul />').addClass("directions").appendTo(form);


            // Route berechnen
            calculateButton.click(function() {
                var start = fromField.val();
                var destination = toField.val();
                map.gmap({
                    routing: { start: start, destination: destination },
                    onDirectionsFound: function(results, dist) {
                        printButton.attr("href", "http://maps.google.de/maps?f=d&source=s_d&saddr={0}&daddr={1}&hl=de&mra=ls&ie=UTF8&layer=c&pw=2".format(encodeURIComponent(start), encodeURIComponent(destination))).show();
                        distance.text("Entfernung: " + dist.text).css("padding-top", 10);
                        directions.empty().css("margin-top", 10);
                        $.each(results, function(index, value) {
                            $("<li />").html(value).appendTo(directions);
                        });
                    }
                });
            });
        });
    };

    // Statische Google Karte, wird über Snippet konfiguriert
    $.fn.staticMap = function() {
        this.each(function() {
            var $this = $(this);
            var content = $this.html();
            $this.empty();

            var query = $this.data("query");
            var markerImage = $this.data("marker");

            $this.gmap({
                query: query,
                infoContent: content,
                logo: markerImage
            });
        });
    };

    // Schnellzugriff
    $.fn.fastAccess = function() {
        return this.filter("select").each(function() {
            var $this = $(this);
            $this.change(function() {
                var url = $this.find("option:selected").data("href");
                if (url) {
                    window.location = url;
                } else {
                    this.selectedIndex = 0;
                }
            });
        });
    };

    // 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');
    }

    function wrapAdjacentElements(childClassName, parentClassNames) {
        var div = null;
        var allChildren = $(childClassName);
        for (var i = 0; i < allChildren.length; i++) {
            var child = $(allChildren[i]);
            if (child.parent().filter(parentClassNames).length == 0) {
                var div = $("<div></div>").addClass(parentClassNames.replace(/\./gi, ' '));
                child.before(div);
                while (child != null && child.length > 0) {
                    var next = child.next(childClassName);
                    div.append(child.remove());
                    child = next;
                    i++;
                }
            }
        }
    }

    // Erzeugt CardView
    function initCardView(className) {
        wrapAdjacentElements('.tab', className + ".snippet");
        $(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"); this.parent().removeClass("selected"); });
                    button.parent().addClass("selected");
                    button.addClass("selected");
                    tabs.children('.tab').css('display', 'none');
                    tab.css('display', 'block');
                });

            });
            if (buttons.length < 4) {
                tabbar.addClass("medium");
            }
            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 .tab").removeClass("tab");
            $(".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 != null && url != "" && !$(this).find(":first").is("img") && url.substring(0, 1) != "#") {
                        if (url.substring(0, 1) == "/") {
                            url = "http://" + window.location.host + url;
                        }
                        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"));
                    }
                }
            }
        });
    }


    function initLayer() {
        var visibleCount = 0;


        $(".openLayer").click(function() {
            var key = $(this).attr('key');
            $(".flashlayer").each(function() {
                var self = $(this);
                if (self.attr('key') == key && visibleCount == 0) {
                    visibleCount++;
                    self.css('display', 'block');
                }
                self.find(".closeLayer").click(function() {
                    visibleCount = 0;
                    self.css('display', 'none');
                });
            });

        });
        $("a.iframelayer, .iframelayer a").each(function() {
            var self = $(this);
            var url = self.attr("href");
            self.unbind();
            self[0].onclick = function() { };

            var width = self.data("width");
            var height = self.data("height");

            self.click(function() {
                var overlay = $("<div></div>").addClass("iframe-layer-overlay").appendTo($("body")).css("opacity", "0").fadeTo('fast', 0.5, function() {
                    var layer = $("<div></div>").addClass("layer").appendTo($("body"));
                    var box = $("<div></div>").addClass("layer-box").appendTo(layer);

                    var layerbar = $("<div class='layerBar clearfix'><div class='closeLayer'>Schließen</div></div>").appendTo(box);
                    var iframe = $("<iframe />").attr("src", url).attr("frameborder", "0").appendTo(box);
                    if (width) {
                        iframe.css("width", width);
                        box.css("width", width);
                    }
                    if (height) {
                        iframe.css("height", height);
                    }
                    function hide() {
                        layer.remove();
                        overlay.fadeOut('fast', function() {
                            overlay.remove();
                        });
                    };
                    layer.click(hide);
                    layerbar.click(hide);
                    overlay.click(hide);
                    box.click(function() { return false; });

                    /* .close-buttons innerhalb der iframes (für Formulare, die normalerweise im Popup aufgehen */
                    try {
                        iframe.contents().find(".close-button").unbind().click(hide);
                    } catch (e) {
                        log(e);
                    }
                });
                return false;
            });
        });


    }
    function initFormControlls() {
        $(".form-slider").each(function() {
            var self = $(this);
            var slider = $("<span></span>");
            var disabled = self.find(".form-slider-disabled").val() == "True";
            var max = tmax = parseInt(self.find(".form-slider-max").val());
            var min = tmin = parseInt(self.find(".form-slider-min").val());
            var step = parseInt(self.find(".form-slider-step").val());
            var value = self.find(".form-slider-value");
            var valueField = $("<span></span>").addClass("form-slider-value-field");
            self.append(slider).append(valueField);

            if (max < min) {
                tmax = min;
                tmin = max;
            }

            function translate(v) {
                if (max < min) {
                    return Math.abs(v - max - min);
                }
                return v;
            }

            function update(v) {
                value.val(translate(v));
                valueField.text(translate(v));

            };

            var options = {
                disabled: disabled,
                max: tmax,
                min: tmin,
                step: step,
                value: parseInt(translate(value.val())),
                slide: function(event, ui) {
                    update(ui.value);
                }
            }

            slider.slider(options);
            valueField.text(value.val());
        });

        $(".form-progressbar").each(function() {
            var self = $(this);
            var components = self.text().split(" von ");
            if (components.length == 2) {
                self.empty();
                var current = parseInt(components[0]);
                var max = parseInt(components[1]);
                var width = self.width();
                var partWidth = (width / max) - 1;
                var bar = $("<div></div>").addClass("bar").appendTo(self);
                for (var i = 0; i < current; i++) {
                    var part = $("<div></div>").addClass("part").appendTo(bar).width(partWidth);
                    if (i == 0) {
                        part.addClass("ui-corner-left");
                    }
                    if (i == max - 1) {
                        part.addClass("ui-corner-right");
                        part.width(partWidth + 1);
                    }
                }
            } else {
                log("Progressbar konnte nicht initialisiert werden");
            }
        });
    };

    // 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;
        }
    };

    var PageVoting = {

        init: function(prototypeId, linkClass) {

            // Holt sich Vorlage aus Snippet
            var prototype = $(prototypeId).remove().removeAttr("id");
            var activeLink = null;

            // 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="vote-overlay"></div>').hide();
                if (prototype.length == 0) {
                    popup.text("Vote Rendering muss dem Templaten noch hinzugefügt werden");
                }
                self.css('position: relative');
                link.click(function() {
                    if (activeLink == null) {
                        popup.append(prototype.show()).appendTo(self);
                        popup.toggle("fast");
                        activeLink = link;
                    } else {
                        if (activeLink == link) {
                            activeLink = null;
                            popup.toggle("fast");
                        } else {
                            activeLink.click();
                            popup.append(prototype.show()).appendTo(self);
                            popup.toggle("fast");
                            activeLink = link;
                        }
                    }
                    return false;
                });
            });
        }
    };

    // 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");
        }
    };

    $.fn.openInNewWindow = function() {
        return this.click(function(e) {
            e.preventDefault();
            window.open(this.href);
            return false;
        });
    };

    // Wird ausgeführt beim start der Seite
    $(function() {

        showHiddenElements(".js-show");
        initPopup("#popup-container");
        initPrint('#popup-container .print');
        initCardView(".cardview");
        wrapAdjacentElements('.faq', ".snippet");
        $('#contentslider').contentSlider();
        initCollapsableBoxes(".collapsable");
        $(".fastaccess").fastAccess();
        initSearchfields('.searchfield');
        initAgentSearch('.agentsearch');
        initCaspardoSearch();
        PageVoting.init('#pagevoting', 'li.vote');
        initBookmarks('#socialMediaPrototype', 'li.bookmark');
        initAllowChange(".allowChange input");
        initPreviewAgentTexts();
        initIEFix();
        initClickFix("a.click-fix");
        $(".media-snippet").mediaSnippet();

        $(".maps .contact").agentMap();
        $(".staticmap .map").staticMap();

        $("a.new-window").openInNewWindow();

        Flash.init();
        initLayer();
        initFormControlls();

        contactForm.init();
        $("iframe").attr("frameBorder", "0");

        $(".startpage-slider li").startPageSlider();

        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);
            try {
                win.focus();
            } catch (e) {
                log(e);
            }
        },
        log: function(message) {
            // Ruft private Log Methode auf
            log(message);
        },
        pageVoting: PageVoting,
        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);
}

