// init for jabsorb 1.3
function initJSONRPC(contextPath) {
	var methods = 
		[
		 	"benutzerService.changePassword",
		 	"benutzerService.ermittleProduktempfehlungen",
		 	"benutzerService.loginUser",
		 	"benutzerService.logoutUser",
		 	"benutzerService.lostPassword",
		 	"benutzerService.registerUser",
		 	"benutzerService.setzeLebenssituation",
		 	"benutzerService.addBlackListId",
		 	"benutzerService.clearBlackList",
		 	"haftpflichtService.berechneMitProfilUndFormular",
		 	"vorsorgeService.berechneMitProfilUndFormular",
		 	"lebenService.berechneMitProfilUndFormular",
		 	"rechtService.berechneMitProfilUndFormular",
		 	"wohnenService.berechneMitProfilUndFormular",
		 	"unfallService.berechneMitProfilUndFormular",
		 	"kfzService.berechneMitProfilUndFormular",
		 	"krankenService.berechneMitProfilUndFormular",
		 	"merkzettelService.entferneMerkzettelEintrag",
		 	"merkzettelService.erstelleMerkzettelEintrag",
		 	"merkzettelService.sendMerkzettel",
		 	"merkzettelService.erstelleMerkzettelEintraege",
		 	"SeService.addRisiko"
	 	];
	JSONRpcClient.toplevel_ex_handler = function (error) {
		if (console){
			console.error("Error type:" + error.name + "\nError code:" + error.code + "\nDescription of error:" + error.message)
		}
	}
	return new JSONRpcClient(methods, contextPath + "/JSON-RPC");
}

function removeUnwantedQueryParams() {
	var q = $H(self.location.search.toQueryParams());
	q.unset('agn'); q.unset('lsId'); q.unset('layerId');
	return q;
}

function reloadWithoutUnwantedParams() {
	var q = removeUnwantedQueryParams();
	self.location.search = q.toQueryString();
}

function reloadWithAgnIfRequired(agn) {
	var q = removeUnwantedQueryParams();
	if(agn) {
		q.set('agn', agn);
	}
	
	self.location.search = q.toQueryString();
}

function setWait(state) {
	if ($('wait')) {
		if (state == 'on') {
			new Effect.Appear('wait');
		} else if (state == 'off') {
			new Effect.Fade('wait');	
		}	
	}
}

//--- Tracking ---------------------------------------------------------------

function trackEvent(kategorie, objekt, aktion) {
	// if etracker tracking is defined try to send it via etracker
	if(typeof(ET_Event) !== 'undefined') {
	  ET_Event.eventStart(objekt, kategorie, aktion, et_pagename);
	}
}

function toGermanNumber(jsNumber) {
	var parts = jsNumber.toFixed(2).split(".");
	var digits = parts[0].split("");
	while (digits.length % 3 != 0) digits.unshift("");
	
	parts[0] = digits.eachSlice(3, function(digits){ return digits.join(""); }).join(".");
	return parts[0] + "," + parts[1];
}

function getDateFromGermanString(dateString) {
	var fields = dateString.split(".");
	if (fields.length == 3) {
		var date = new Date();
		date.setDate(fields[0]);
		date.setMonth(fields[1]);
		date.setYear(fields[2]);
		return date;
	}
	return false;
}

function jsonMap(map){
	return {
		"javaClass": "java.util.HashMap",
		"map": map
	}
}

//--- Web 2.0 ----------------------------------------------------------------


/*
 * Öffnet und schließt Layer, abhängig davon, ob sie bereits offen oder noch geschlossen sind.
 * Ausserdem wird daruf geachtet, dass immer nur ein Layer offen ist.
 */
function blind(id) {
	if (effectOn == false) {
		if (isInList(id, openTabs)) {
			blindUp(id);
			return false;
		} else {
			blindDown(id);
			return true;
		}
	}
}
function blindUp(id) {
	new Effect.BlindUp(id + 'Layer', {duration:0.4, beforeStart: function() {effectOn = true}, afterFinish: function() {effectOn = false}});
	document.getElementById(id + "Lasche").className="link xRisikoLascheInaktiv";
	remove(id, openTabs);
}

function blindDown(id) {

	// öffnet Tab
	function innerBlindDown(innerId) {
		new Effect.BlindDown(innerId + "Layer", {duration:0.4, beforeStart: function() {effectOn = true}, afterFinish: function() {effectOn = false}});
		document.getElementById(innerId + "Lasche").className="link xRisikoLascheAktiv";
		add(innerId, openTabs);
	}
	
	// offenes Tab schließen und erst dann das zu öffnende öffnen
	if (openTabs.length == 1) {
		new Effect.BlindUp(openTabs[0] + "Layer", {duration:0.4, beforeStart: function() {effectOn = true}, afterFinish: function() {innerBlindDown(id)}});
		document.getElementById(openTabs[0] + "Lasche").className="link xRisikoLascheInaktiv";
		remove(openTabs[0], openTabs);
	} else {
		// kein anderes Tab offem, also Zieltab öffnen
		innerBlindDown(id);
	}
}

/*
 * Verschieben der Pages im Window inkl. des Fadens des Hintergrunds.
 */
function slide(id, w, fadeId, fade) {
	if (fade== 'in') {
		new Effect.Opacity(fadeId, {duration:0.4, from:0.1, to:1.0});
	} else if (fade == 'out') {
		new Effect.Opacity(fadeId, {duration:0.4, from:1.0, to:0.1});
	}
	new Effect.Move (id,{duration:0.4, x: w, y: 0, mode: 'relative', queue: { position: 'end', scope: id }});
}

/*
 * Abhängiges Blinden
 */
function blindConditional(id, state, before, after) {
	if (state == 'off') {
		new Effect.Fade(id, {duration:0.4, beforeStart: before})
		new Effect.BlindUp(id, {duration:0.4, afterFinish: after})
	} else if (state == 'on') {
		new Effect.Appear(id, {duration:0.4, beforeStart: before})
		new Effect.BlindDown(id, {duration:0.4, afterFinish: after})
	}
}

/* Setzt eine Reihe von Werten (Array) auf die Elemente eines Formulars. */
function setFormValues(formId, values) {

	// Get Form By Id
	var form = $(formId);

	// Iterate over all Elements to set
	var i = 0;
	var j = values.size(); 
	Form.getElements(form).each(
			function(item) {
				setFormValue(item, values[i++]);
			}
	);
}

/* Setzt einen Wert auf ein Feld, abhängig vom Feldtyp. */
function setFormValue(field, value) {
	if (field.type == 'checkbox' || field.type == 'radio') {
		field.checked = value;
	} else if (field.type == 'text' || field.type == 'select-one' || field.type == 'hidden') {
		field.value = value;
	} else if (field.type == 'submit') {
		// TODO: auto Submit?
	}
	fireEvent(field, 'change');
}

function dropdownClickHandler(dropdown) {
	if(dropdown.selectedIndex > 0) {
		location.href = dropdown.value;
	}

	return false;
}

function hideDivWhenValueIs(div, input, value){
	Event.observe(document, "dom:loaded", function(){
		hideDivWhen(div, inputIsValue(input, value));
		$(input).observe('change', function(){
			hideDivWhen(div, inputIsValue(input, value));
		});
	});
}

function removeDivWhenValueIs(div, input, value){
	Event.observe(document, "dom:loaded", function(){
		removeDivWhen(div, inputIsValue(input, value));
		$(input).observe('change', function(){
			removeDivWhen(div, inputIsValue(input, value));
		});
	});
}

function removeDivWhen(div, hide) {
	var element = $(div);
	var queue = Effect.Queues.get('effect_for_'+div);
	queue.each(function(e) {e.cancel(); e.finish()});
	if (element.visible() && hide){
		element.hide();
		//new Effect.BlindUp(element,{queue: { scope: 'effect_for_'+div }});
	} else if (!element.visible() && !hide){
		element.show();
		//new Effect.BlindDown(element,{queue: { scope: 'effect_for_'+div }});
	}
}


function hideDivWhenValueIsNot(div, input, value){
	Event.observe(document, "dom:loaded", function(){
		hideDivWhen(div, !inputIsValue(input, value));
		$(input).observe('change', function(){
			hideDivWhen(div, !inputIsValue(input, value));
		});
	});
}

function inputIsValue(input, value) {
	var values = $w(value);
	return values.indexOf($F(input)) != -1;
}

function hideDivWhen(div, hide) {
	var element = $(div);
	var queue = Effect.Queues.get('effect_for_'+div);
	queue.each(function(e) {e.cancel(); e.finish()});
	if (element.visible() && hide){
		new Effect.BlindUp(element,{queue: { scope: 'effect_for_'+div }});
	} else if (!element.visible() && !hide){
		new Effect.BlindDown(element,{queue: { scope: 'effect_for_'+div }});
	}
}

/* Default Hilfe-Bubbles */

var hPrefix = "<div class=\"defaultHilfeRand xHilfe_Oben\"></div><div class=\"defaultHilfeText Hilfetext xHilfe_Mitte\">";
var hPostfix = "</div><div class=\"defaultHilfeRand xHilfe_Unten\"></div>";

var tPrefix = "<strong>";
var tPostfix = "</strong><br />";

function defaultHelpBubble(text, heading) {
	if(heading) {
		return overlib(hPrefix + tPrefix + heading + tPostfix + text + hPostfix, VAUTO);
	} else {
		return overlib(hPrefix + text + hPostfix, VAUTO);
	}
}
//--- Rechenbloecke ---------------------------------------------------------

function clearFormErrors(form) {
	var f = $(form);
	f.select('.Rechenblock_Fehler_Hintergrund').each(function(element){element.removeClassName('Rechenblock_Fehler_Hintergrund');});
	f.select('.fehlerContainer').each(function(element){element.hide();});
	f.select('.field_errors').each(function(element){element.update('');});
}

function addFormErrors(form, errors) {
	$A(errors.fehler.list).each(function(fehler){
		$A(fehler.feld.list).each(function(feld){
			$(form.elements['p_'+feld]).addClassName('Rechenblock_Fehler_Hintergrund');
		});
		var fehlerfeld = $(form.elements['p_'+$A(fehler.feld.list).first()]);
		fehlerfeld.up('div').down('.fehlerContainer').show();
		var fehlerbereich = fehlerfeld.up('div').down('.field_errors');

		var alreadyInList = 
			fehlerbereich.descendants()
			.pluck('innerHTML').detect(function(errorMessage) {
				return errorMessage == fehler.fehler;
			});

		alreadyInList || fehlerbereich.insert(new Element('li').update(fehler.fehler));
		
	});
}

function addProductErrors(pair, form) {
	var f = $('fehler_'+pair.key);
	if (f) {
		$A(pair.value.fehler.list).each(function(fehler){
			f.insert(new Element('li').update(fehler.fehler));
			f.up('.fehlerContainer').show();
			$A(fehler.feld.list).each(function(feld){
				var fehlerfeld = $(form.elements['p_'+feld]);
				fehlerfeld && fehlerfeld.addClassName('Rechenblock_Fehler_Hintergrund');
			});
		});
	}
}

//--- Produktempfehlungen ----------------------------------------------------

function ermittleProduktempfehlung() {
	if(typeof(jsonrpc) != 'undefined') {
		jsonrpc.benutzerService.ermittleProduktempfehlungen(function(result){
			if (result != null && !result.sessionTimeout) {
				// Alle Aktionen, welche nach Empfangen von Empfehlungen ausgeführt werden sollen
				clearEmpfehlungen();
				setEmpfehlungen(result.data);
				Event.fire(document, 'produktempfehlung:ermittelt');
			}
		});
	}
}

function clearEmpfehlungen() {
	$$('._gewichtet').each(
		function(node) {
			node.removeClassName('_gewichtet');
			$R(1, 5).each(function (i){
				node.removeClassName('_gewichtung'+i);
			});
		}
	);
}
function setEmpfehlungen(empfehlungen) {
	$H(empfehlungen.map).each(
		function(produkt) {
			$$('._' + produkt.key).each(
					function(node) {
						if (!node.hasClassName('disabled')) {
							node.addClassName('_gewichtet');
							node.addClassName('_gewichtung' + produkt.value);
						}
					}
			);
		}
	);
}

function checkTimeout(timeout) {
	if (timeout) alert('Ihre Session ist leider abgelaufen. Bitte laden Sie die Seite neu.');
	return timeout;
}

// until prototypejs can do standard events
function fireEvent(element,event){
	if(document.createEvent){
		// dispatch for firefox + others
		var evt = document.createEvent("HTMLEvents");
		evt.initEvent(event, true, true ); // event type,bubbling,cancelable
		return !element.dispatchEvent(evt);
	}
	else{
		// dispatch for IE
		var evt = document.createEventObject();
		return element.fireEvent('on'+event,evt)
	}
}
