(function (options, $, Modernizr, console) { // Bricht ab, wenn die Abhängigkeiten nicht erfüllt sind $ || console.error("myergo.js benötigt jQuery"); Modernizr || console.error("myergo.js benötigt Modernizr"); if (!$ || !Modernizr) return; // Default Settings settings = $.extend({ serviceToken: "nicht gesetzt", werbeKZ: false, // legt den Storage fest der für $.fn.persistant verwendet wird persistantStorage: window.sessionStorage }, options); /** * Erlaubt das verwenden von semantischen HTML5 Elementen im IE8 oder älter **/ $.each(["header", "section", "footer", "aside", "article", "nav"], function (i, name) { document.createElement(name); }); /** * Clientseitiger Redirect, wenn der IE im falschen Browsermodus läuft **/ if ($("html").is(".oldie") && document.documentMode && document.documentMode < 8 && window.urlVars && !window.urlVars["bad_browser"]) { window.location.href = window.location.href + "?bad_browser=1"; } /** * Speichert Daten persistent an einem Element. * Das Element muss eine ID haben. * * Beispiele: * 1. var foobar = $("foo").persistant("bar"); * 2. $("foo").persistant("bar", foobar); * 3. $("foo").persistant("bar", foobar, window.sessionStorage); * **/ $.fn.persistant = function (name, value, storage) { function getKey(id) { return "#" + id + "-" + name; } storage = storage || $.fn.persistant.storage || window.localStorage; if (value !== undefined) { if (!storage) { return this; } return this.each(function () { var id = $(this).persistanceId(); if (id && value === null) { storage.removeItem(getKey(id)); } else if (id) { storage[getKey(id)] = value; } }); } else { if (!storage) { return null; } var id = $(this).persistanceId(); return storage[getKey(id)]; } }; $.fn.persistant.storage = settings.persistantStorage; /** * Erzeugt eine (hoffentlich) eindeutige ID für ein Element. **/ $.fn.persistanceId = function persistanceId() { persistanceId.existing = persistanceId.existing || {}; if (this.data("persistanceid")) { return this.data("persistanceid"); } var id = this.prop("id") || this.attr("class"); this.eq(0).parentsUntil("body").each(function () { id = ($(this).prop("id") || $(this).attr("class")) + "|" + id; }); while (persistanceId.existing[id]) { id += "+"; } persistanceId.existing[id] = true; this.data("persistanceid", id); return id; } /** * Hängt an einen Button einen Layer an, der per Click aktiviert wird. * Als Parameter wird ein Selektor für den Inhalt des Layers übergeben. * * Beispiel: * $("a.my-button").dropDownLayer(".my-content"); **/ $.fn.dropDownLayer = function (contentSelector) { var content = $(contentSelector).detach().css("display", "block"); var layer = $("
", { "class": "drop-down-layer" }).append(content); return this.each(function () { var $this = $(this); var isVisible = false; if (!Modernizr.borderradius) { $("").prependTo($this); } $this.click(function () { if (!isVisible) { $(this).removeClass("off").addClass("on"); if ($(this).parents(".contract").is($(".contract").filter(":last"))) { layer.css({ bottom: $(this).parent().height() - $(this).position().top, right: 10 }); } else { layer.css({ top: $(this).position().top + $(this).height(), right: 10 }); } $(this).after(layer.hide()); if (layer.find("li").length > 5 && !layer.data("float")) { layer.data("float", true); layer.css("visiblity", "hidden"); layer.show(); var width = layer.find("ul").width(); layer.hide(); layer.css("visibility", "visible"); layer.find("ul").width(width * 2 + 4).css("overflow", "hidden"); layer.find("li").css({ "float": "left", "width": width }); } layer.slideDown("fast", function () { isVisible = true; }); } }); $("body").click(function () { if (isVisible) { $this.removeClass("on").addClass("off"); layer.slideUp("fast", function () { layer.detach(); isVisible = false; }); } }); }); }; /** * Klappt Vertragslistenitems auf und zu * Zustand wird persistent gespeichert **/ $.fn.collapsable = function (options) { var settings = $.extend({ content: ".content", header: ".header", persistant: true, useTextIndicator: false, indicatorOpenClass: "minus", indicatorCollapsedClass: "plus" }, options); return this.each(function () { var $this = $(this); var content = $this.find(settings.content); var header = $this.find(settings.header); // Benutze HTML Local Storage um Zustand auszulesen if ($this.is(".not-persistant") === false && settings.persistant) { if ($this.persistant("collapsed") == "1") { $this.addClass("collapsed"); } else if ($this.persistant("collapsed") == "0") { $this.removeClass("collapsed"); } } // Setup Content if ($this.is(".collapsed")) { content.hide(); } content.on("slideUp", function (e) { // TODO: [KB] Persistenz? plus.removeClass(settings.indicatorOpenClass).addClass(settings.indicatorCollapsedClass); if (settings.useTextIndicator) plus.text("+"); $this.addClass("collapsed"); $this.trigger("collapsable.slideUp"); }); content.on("slideDown", function (e) { plus.removeClass(settings.indicatorCollapsedClass).addClass(settings.indicatorOpenClass); if (settings.useTextIndicator) plus.html("–"); $this.removeClass("collapsed"); $this.trigger("collapsable.slideDown"); }); // Setup Header var plus = $("", { "class": "indicator" }).css("font-family", "monospace").appendTo(header).addClass($this.is(".collapsed") ? settings.indicatorCollapsedClass : settings.indicatorOpenClass); if (settings.useTextIndicator) { plus.html($this.is(".collapsed") ? "+" : "–"); } header.click(function () { content.stop()[content.is(":visible") ? "slideUp" : "slideDown"]("fast", function () { $this.persistant("collapsed", $this.is(".collapsed") ? "1" : "0"); $this.trigger("collapse"); }); }); }); }; /** * Lädt Werbeblöcke in Verträgen * Benötigt als Parameter eine Funktion, die den CmsServiceProxy liefert (erlaubt lazy loading). * Beispiel: * $(".contract").contract(function() { return new $.CmsServiceProxy() }); **/ $.fn.contract = function (getCmsServiceProxy) { if (!$.isFunction(getCmsServiceProxy)) { throw new TypeError("contract Plugin erwartet Funktion als Parameter"); } return settings.werbeKZ ? this : this.each(function () { var $this = $(this); var cmsdata = $this.find(".cmsdata"); if (!cmsdata.length) return; var header = $this.find(".header"); var run = false; $this.one("collapsable.slideDown init", function () { if (run) return; run = true; var cmsServiceProxy = getCmsServiceProxy(); var busyindicator = header.busy({ img: '/meineversicherungen/L0/images/busy.gif', position: 'right', hide: false, offset: -40 }); header.find(".logo").hide(); cmsServiceProxy.getContractSpecialContent(cmsdata.data("contractsparte"), function (result) { var data = result.d || result; if (data.length && data != "null") { cmsdata.html(data); cmsdata.find("a,link,img,iframe").replaceUrls($.getEnvironmentKey()); cmsdata.show(); } busyindicator.busy("hide"); header.find(".logo").show(); }, function (xhr, status, err) { busyindicator.busy("hide"); header.find(".logo").show(); }); }); if (!$this.is(".collapsed")) { $this.trigger("init"); } }); } /** * Anwendbar auf eine Liste von Links * hängt an die **/ $.fn.selectActiveNavigationItem = function () { return this.each(function () { $(this).find("li").each(function (index) { var component = $(this).find("a").attr("href").toLowerCase().replace(".aspx", ""); if (!component.length) return; if (location.pathname.toLowerCase().startsWith(component)) { $(this).addClass("selected"); } else { $(this).removeClass("selected"); } }); if (!$(this).find(".selected").length) { $(this).find("li").eq(0).addClass("selected"); } }); } function getCmsServiceProxy() { return getCmsServiceProxy.instance || (getCmsServiceProxy.instance = new $.CmsContentServicesProxy("/myergo/services/contentservices.svc", settings.serviceToken)); } $(function () { $(".snippet.collapsable").collapsable({ header: "h2", useTextIndicator: true, indicatorOpenClass: "plus" }); $(".contract.collapsable").collapsable().contract(getCmsServiceProxy); $(".contract.details .segment").not(".services,.agent,.contract-note").addClass("collapsable").collapsable({ header: "h3", content: ".padding, ul.key-value, .content" }); $(".contract").each(function () { $(this).find("a.additional-services").dropDownLayer($(this).find("ul.additional-services")); }); $("#top-navigation").selectActiveNavigationItem(); }); })( // Abhängigkeiten window.myErgoConfig, window.jQuery, window.Modernizr, window.console || { error: function () { }, log: function () { } } ); /** * Prüft ob ein String mit einem gegeben Teilstring beginnt. * Beispiel: * "foo bar".startsWith("foo") * ergibt true **/ String.prototype.startsWith = function(str) { return (this.match("^"+str)==str) }