(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)
}