var Volvokort = new Object();

/**
 * Volvokort.Aterforsaljare tar hand om metoder för att hantera aterforsaljare.
 */
Volvokort.Aterforsaljare = {

	/**
	 * Sätter den aktuella logotypen i ett återförsäljarformulär. Dels byts
	 * src för bilden och dels sätt id:t i ett hidden-fält. För att hitta 
	 * dialogen som används letar funktionen efter ett objekt med namnet 
	 * 'logotypeDialog' i document.
	 *
	 * @param id id för den aktuella kunden.
	 * @param src src för den aktuella bilden. 
	 */
	setLogotype : function(id, src) {

		window.top.document["logotypeDialog"].hide();
		$("#logotypeId", window.top.document).val(id);
		$("#logotypeImg", window.top.document).attr("src", src);
	}
};

/**
 * Volvokort.Dialog tar hand om dialoger.
 */
Volvokort.Dialog = {

	/**
	 * Lägger till en knapp till en dialog.
	 * 
	 * @param cfg.button en array där knapparna ska läggas.
	 * @param cfg.show anger om knappen ska visas eller inte.
	 * @param cfg.formId det formulär som knappen ska skicka.
	 * @param cfg.event det event som knappen ska skicka.
	 * @param cfg.text den text som ska stå på knappen.
	 * @param cfg.isDefault om knappen ska vara defaultknappen.
	 * @param cfg.ajax true om formuläret ska skickas med Ajax.
	 * @param cfg.dialogId för att kunna presentera en waitsymbol vid ajaxanrop.
	 */
	addButton : function(cfg) {
		var buttonList = cfg.buttonList;
		var show = cfg.show;
		var formId = cfg.formId;
		var event = cfg.event;
		var text = cfg.text;
		var isDefault = cfg.isDefault;
		var ajax = cfg.ajax;
		var dialogId = cfg.dialogId;

		if (show) {

			// Bestäm vilken handler som ska används för knappen.
			var handler;
			if (event) {
				handler = function() {
					if (event.substring(0, 10) == 'javascript') {
						window[event.substring(11)]();
					} else if (ajax) {
						Volvokort.Dialog.submitAjax(formId, event);
					} else {
						Volvokort.Form.submit(formId, event);
					}
					//Visa waitikonen
					$("#waitInDialog_" + dialogId).attr("style",
							"display:inline");
				};
			} else {
				handler = function() {
					Volvokort.Dialog.clear(formId);
					this.cancel();
				};
			}

			// Lägg till knappen till listan.
			buttonList.push( {
				text : text,
				handler : handler,
				isDefault : isDefault
			});
		}
	},

	/**
	 * Rensar en dialog från formulärvärden och felmeddelanden.
	 * 
	 * @param formId id för det formulär som ska rensas.
	 */
	clear : function(formId) {

		$("#" + formId + " input[type='text']").val("");
		$("#" + formId + " input[type='text']").attr("disabled", false);
		$("#" + formId + " input[type='checkbox']").attr("checked", false);
		$("#" + formId + " input").removeClass("error");

		$("div.errorBox div").html("");
		$("div.errorBox").hide();
		$("p[id^='waitInDialog_']").hide();
	},

	/**
	 * Skickar ett formulär via Ajax och tar hand om felhantering. Om allt går
	 * bra görs en redirect till den resultat sida som anropet refererar till.
	 * 
	 * @param formId id för det formulär som ska skickas.
	 * @param event namnet på det event som ska exekveras.
	 */
	submitAjax : function(formId, event) {

		if (event) {
			Volvokort.Form.addHiddenField(formId, event, "");
		}
		Volvokort.Form.addHiddenField(formId, "response", "json");

		YAHOO.util.Connect.setForm($("#" + formId)[0]);
		YAHOO.util.Connect.asyncRequest("POST", ($("#" + formId)[0]).action, {
			success : function(obj) {
				var response = YAHOO.lang.JSON.parse(obj.responseText);
				if (typeof response.errors != "undefined") {

					$("#" + formId + " input").removeClass("error");

					// Hantera felmeddelanden.
			var errorhtml = "<ul>";
			for (i = 0; i < response.errors.length; i++) {
				$(
						"#" + formId + " input[name='"
								+ response.errors[i].field + "']").addClass(
						"error");
				errorhtml += "<li>" + response.errors[i].value + "</li>";
			}
			errorhtml += "</ul>";
			$("div.errorBox div").html(errorhtml);
			$("div.errorBox").slideDown("normal");

			//Släck en eventuell waitsymbol
			$(".wait").hide();

			// hantera även ett ev nytt request token
			if (response.token != "undefined") {
				$("#token").attr("value", response.token);
			}

		} else {
			document.location.replace(response.redirectUrl);
		}
	},
	failure : function(obj) {
	}
		});
	},

	cancelSubmit : function() {
		$(".wait").hide();
	},

	/**
	 * Skalar om höjden på innehållet i en dialog när den yttre containern 
	 * ändrar storlek.
	 *
	 * @param args ...  
	 */
	resize : function(args) {

		var panelHeight = args.height;
		var headerHeight = this.header.offsetHeight;
		var footerHeight = this.footer.offsetHeight;
		var bodyHeight = (panelHeight - headerHeight - footerHeight);

		YAHOO.util.Dom.setStyle(this.body, "height", bodyHeight + "px");

		if (YAHOO.env.ua.ie == 6) {
			this.sizeUnderlay();
			this.syncIframe();
		}
	},

	/**
	 * Fix för IE som döljer taggen i <iframe></iframe>.
	 */
	ieBorderCollapseBugfix : function(el, id) {

		if (YAHOO.env.ua.ie) {
			el.hideEvent.subscribe(function() {
				$("iframe", $("#" + id)).each(function() {
					this.style.display = "none";
				});
			});

			el.showEvent.subscribe(function() {
				$("iframe", $("#" + id)).each(function() {
					this.style.display = "block";
				});
			});
		}
	},

	/**
	 * Fix för IE som döljer ramar i dialogen, speciellt innan den visas...
	 */
	ieBorderCollapseBugfixDialog : function(el, id) {

		if (YAHOO.env.ua.ie) {
			el.hideEvent.subscribe(function() {
				$("table", $("#" + id)).each(function() {
					this.style.display = "none";
				});
			});

			el.showEvent.subscribe(function() {
				$("table", $("#" + id)).each(function() {
					this.style.display = "block";
				});
			});
		}
	}
};

Volvokort.EFaktura = {

	anmalEFaktura : function(kontonummer, kontonummerLabel) {
		$("#kontonummer").val(kontonummer);
		$("#kontonummerLabel").text(kontonummerLabel);
		anmalanDialog.show();
		return false;
	}
};

/**
 * Volvokort.Form tar hand om formulär.
 */
Volvokort.Form = {

	/**
	 * Lägger till ett hidden fält till formuläret. Fältet för det namn och
	 * värde som man anger.
	 *
	 * @param form det formulär (eller namnet på det) som fältet ska läggas till på.
	 * @param name namnet på det fält som man ska lägga till.
	 * @param value värdet på det fält som man ska lägga till.
	 */
	addHiddenField : function(form, name, value) {

		if (name == null || name == "") {
			return;
		}
		if (typeof (form) == "string") {
			form = document.forms[form];
		}
		if (form[name] && typeof (form[name]) != 'function'
				&& form[name].type != "submit") {
			form[name].value = value;
		} else {
			$(form).append(
					'<input type="hidden" name="' + name + '" value="' + value
							+ '">');
		}
	},

	/**
	 * Postar det angivna formuläret men lägger till alla parametrar som finns
	 * angivna i den map som man skickar in som hidden fält först. För att
	 * efterlikna Stripes så finns det även möjlighet att lägga till ett event
	 * som ska köras. även detta görs genom ett hidden fält.
	 *
	 * @param form det formulär (eller namnet på det) som fältet ska läggas till på.
	 * @param event det event som ska köras på servern.
	 * @param parameters de parametrar som ska skickas med. Denna anges som en
	 *        map enligt {name: 'Tom', type: 'Human'}.
	 */
	submit : function(form, event, parameters) {

		if (typeof (form) == "string") {
			form = document.forms[form];
		}
		for ( var param in parameters) {
			Volvokort.Form.addHiddenField(form, param, parameters[param]);
		}
		Volvokort.Form.addHiddenField(form, event, "");
		form.submit();
	},

	/**
	 * Lägg till validering för ett formulär innan det skickas till servern.
	 * Om valideringen inte går igenom kommer felmeddelanden visas och
	 * formuläret kommer inte att skickas till servern.
	 * @param form det formulär som skall valideras
	 * @param cfg valideringskonfiguration. Konfigurationen anges enligt
	 * {
	 * 	appender: Volvokort.Form.Appenders.?
	 * 	validations: [{
	 *    field: id/el för det form field som skall valideras
	 *    validator: Volvokort.Form.Validators.?
	 *    formatter: Volvokort.Form.Formatters.?
	 *    message: meddelande som skall visas vid fel
	 *  ]
	 * }
	 */
	addValidation : function(form, cfg) {
		if (typeof (form) == "string") {
			form = document.forms[form];
		}

		YAHOO.util.Event.addListener(form, "submit",
				function(e) {
					var messages = [];
					for ( var i = 0; i < cfg.validations.length; i++) {
						var validation = cfg.validations[i];
						if (!validation.validator(YAHOO.util.Dom
								.get(validation.field))) {
							messages.push(validation.message);
						}
					}

					if (messages.length > 0) {
						typeof (cfg.appender) == "function" ? cfg
								.appender(messages) : alert(messages);

						YAHOO.util.Event.stopEvent(e);
					} else {
						for ( var i = 0; i < cfg.validations.length; i++) {
							var validation = cfg.validations[i];
							if (typeof (validation.formatter) == "function") {
								validation.formatter(validation.field);
							}
						}
					}
				});
	},

	/**
	 * Disabla alla input-fält i containrar med klassen .disable
	 * Gråa även ut text och labels så att det syns
	 * @param disable boolean disabla om true, annars enabla
	 */
	toggleDisabled : function(disable) {

		if (disable) {
			// disable och gråa ut
			$(".disable input").attr("disabled", "true");
			$(".disable").css("color", "gray");
			$(".disable label").css("color", "gray");
		} else {
			// enable och ta tillbaka svart text igen
			$(".disable input").removeAttr("disabled");
			$(".disable").css("color", "black");
			$(".disable label").css("color", "black");
		}
	},

	Appenders : {
		/**
		 * Lägg till felmeddelande till en div med klassen
		 * errorMsg. Om inte diven finns redan så kommer vi
		 * att skapa den.
		 * @param $parent jQuery objekt där errorMsg skall appendas om
		 * den inte finns redan.
		 * @param messages array utav felmeddelanden
		 */
		_default : function($parent, messages) {
			if ($("#loginform .errorMsg").length == 0) {
				$parent.append($("<div/>").addClass("errorMsg"));
			}

			var sb = [];
			sb[sb.length] = "<ul>";
			for ( var i = 0; i < messages.length; i++) {
				sb[sb.length] = "<li>";
				sb[sb.length] = messages[i];
				sb[sb.length] = "</li>";
			}
			sb[sb.length] = "</ul>";

			$(".errorMsg").html(sb.join(""));
		},

		/**
		 * Lägg till felmeddelande för inloggninsruta
		 * @param messages array utav felmeddelanden
		 */
		Login : function(messages) {
			if ($("#loginform .errorMsg").length == 0) {
				$("form#loginform div.table-small2 tbody").prepend(
						$("<tr/>").append(
								$("<td/>").attr("colSpan", 2).css("padding",
										"10px")));
			}

			Volvokort.Form.Appenders
					._default(
							$("form#loginform div.table-small2 tbody tr:first-child td"),
							messages);
		}
	},

	Formatters : {
		/**
		 * Ta bort alla bindestreck och mellanslag
		 * @param el
		 */
		Login : function(el) {
			YAHOO.util.Dom.get(el).value = YAHOO.util.Dom.get(el).value
					.replace(/[- ]/g, "");
		}
	},

	Validators : {
		/**
		 * Kontrollerar om inmatningen är av rätt format.
		 * För organisationsnummer måste 3:e siffran vara > 1 
		 * (unikt för organisationsnummer) samt ha följande
		 * format: xxxxxx-xxxx alt. xxxxxxxxxx. Personnummer måste
		 * ha följande format: xxxxxxxx-xxxx alt. xxxxxxxxxxxx.
		 * 
		 * @param el Elementet som skall valideras
		 * @return true om giltligt, annars false
		 */
		Login : function(el) {
			var regexp = function(el, regexp) {
				if (typeof (el) == "object" && typeof (el.value) == "string") {
					return el.value.match(regexp);
				}

				return false;
			};

			if (regexp(el, /^\s?\d{2}[2-9]\d{3}-?\d{4}\s?$/)) { // Org.nr
				return true;
			} else if (regexp(el, /^\s?\d{8}-?\d{4}\s?$/)) { // P.nr
				return true;
			} else {
				return false;
			}
		}
	}
};

/**
 * Volvokort.Image tar hand om metoder som har med bilder att göra.
 */
Volvokort.Images = {

	/**
	 * Initierar alla bilder genom att hitta de som har klassen hover och lägga
	 * en hovereffekt på dem.
	 */
	init : function() {

		$(".hover")
				.hover(
						function() {
							var src = this.src;
							if (this.realSrc) {
								src = this.realSrc;
							}
							if (src.indexOf("Hover") == -1) {
								var idx = src.lastIndexOf(".");
								var newSrc = src.substring(0, idx) + "Hover"
										+ src.substring(idx);
								// Specialfall för att hantera transparanta bilder i IE6.
								if (this.runtimeStyle
										&& this.runtimeStyle.filter != null) {
									this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft."
											+ "AlphaImageLoader(src='"
											+ newSrc
											+ "')";
									this.realSrc = newSrc;
								} else {
									this.src = newSrc;
								}
							}
							return false;
						},
						function() {
							var src = this.src;
							if (this.realSrc) {
								src = this.realSrc;
							}
							if (src.indexOf("Hover") != -1) {
								var idx = src.indexOf("Hover");
								var newSrc = src.substring(0, idx)
										+ src.substring(idx + 5);
								// Specialfall för att hantera transparanta bilder i IE6.
								if (this.runtimeStyle
										&& this.runtimeStyle.filter != null) {
									this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft."
											+ "AlphaImageLoader(src='"
											+ newSrc
											+ "')";
									this.realSrc = newSrc;
								} else {
									this.src = newSrc;
								}
							}
							return false;
						});
	}
};

/**
 * Volvokort.Menu tar hand om metoder som har med menyn att göra.
 */
Volvokort.Menu = {

	/**
	 * Objekt som håller den aktuella animationen.
	 */
	anim : null,

	/**
	 * Initierar menyn genom att köra alla init metoder och lägga på de 
	 * lyssnare som behövs. 
	 */
	init : function() {

		// Skapa menyn.
		var menuBar = new YAHOO.widget.MenuBar("menu", {
			autosubmenudisplay : true,
			minscrollheight: 300,
			showdelay : 100,
			hidedelay : 750,
			lazyload : false
		});

		// Rendera menyn.
		menuBar.render();

		// Lägg på lyssnare.
		menuBar.subscribe("beforeShow", Volvokort.Menu.onSubmenuBeforeShow);
		menuBar.subscribe("show", Volvokort.Menu.onSubmenuShow);
	},

	/**
	 * Nollställer style när animationen är klar så att menyn för sin korrekta storlek.
	 *
	 * @param type används inte.
	 * @param args används inte.
	 * @param shadow en referens till menys skugga.
	 */
	onAnimationComplete : function(type, args, shadow) {

		var body = this.body;
		var ul = body.getElementsByTagName("ul")[0];
		if (shadow) {
			shadow.style.height = this.element.offsetHeight + "px";
		}
		ul.style.marginTop = "";
		body.style.overflow = "";
		if (this.parent && !(this.parent instanceof YAHOO.widget.MenuBarItem)) {
			if (YAHOO.env.ua.gecko) {
				body.style.width = "";
			}
			if (YAHOO.env.ua.ie == 7) {
				this.element.style.width = "";
			}
		}
	},

	/**
	 * Stoppar en eventuell animation som körs samt nollställer style för den 
	 * aktuella menyn innan animationen för att visar den börjar.
	 */
	onSubmenuBeforeShow : function() {

		if (this.parent) {
			var element = this.element;
			var shadow = element.lastChild;
			shadow.style.height = "0px";
			if (Volvokort.Menu.anim && Volvokort.Menu.anim.isAnimated()) {
				Volvokort.Menu.anim.stop();
				Volvokort.Menu.anim = null;
			}
			var body = this.body;
			if (this.parent
					&& !(this.parent instanceof YAHOO.widget.MenuBarItem)) {
				if (YAHOO.env.ua.gecko) {
					body.style.width = body.clientWidth + "px";
				}
				if (YAHOO.env.ua.ie == 7) {
					element.style.width = element.clientWidth + "px";
				}
			}
			body.style.overflow = "hidden";
			var ul = body.getElementsByTagName("ul")[0];
			ul.style.marginTop = ("-" + ul.offsetHeight + "px");
		}
	},

	/**
	 * Start animationen när menyn ska visas.
	 */
	onSubmenuShow : function() {

		if (this.parent) {
			var element = this.element;
			var shadow = element.lastChild;
			var ul = this.body.getElementsByTagName("ul")[0];
			Volvokort.Menu.anim = new YAHOO.util.Anim(ul, {
				marginTop : {
					to : 0
				}
			}, 0.3, YAHOO.util.Easing.easeOut);
			Volvokort.Menu.anim.onStart.subscribe(function() {
				shadow.style.height = "100%";
			});
			Volvokort.Menu.anim.animate();
			if (YAHOO.env.ua.ie) {
				shadow.style.height = element.offsetHeight + "px";
				Volvokort.Menu.anim.onTween.subscribe(function(type, args,
						shadow) {
					if (this.cfg.getProperty("iframe")) {
						this.syncIframe();
					}
					if (shadow) {
						shadow.style.height = this.element.offsetHeight + "px";
					}
				}, shadow, this);
			}
			Volvokort.Menu.anim.onComplete.subscribe(
					Volvokort.Menu.onAnimationComplete, shadow, this);
		}
	}
};

/**
 * Volvokort.Logout tar hand om att logga ut användaren.
 */
Volvokort.Logout = {

	/**
	 * Kontrollerar om sessionen har timeat ut och loggar i sådana fall ut 
	 * användaren. Om sessionen inte har timat ut så schemaläggs en ny kontroll
	 * vid den tid då den borde timea ut.
	 * 
	 * @param firstCheck tiden som man ska vänta innan man kontrollerar.
	 * @param checkUrl den url som används för att kontrollera sessionen.
	 * @param logoutUrl den url som används för att logga ut användaren.
	 */
	checkTimeout : function(firstCheck, checkUrl, logoutUrl) {

		window.setTimeout(function() {
			jQuery.ajax( {
				url : checkUrl,
				success : function(data) {
					var remainingTime = parseInt(data, 10);
					if (remainingTime <= 0) {
						document.location.href = logoutUrl;
					} else {
						Volvokort.Logout.checkTimeout(remainingTime, checkUrl,
								logoutUrl);
					}
				}
			})
		}, firstCheck);
	}
};

Volvokort.Login = {
	checkCookiesEnabled : function() {
		if(document.cookie.length <= 0) {
			jQuery("#content #nocookies").css('display', 'block');	
		}
	} 
};

/**
 * Volvokort.Number tar hand om att parsa och formatera nummer.
 */
Volvokort.Number = {

	/**
	 * Tolkar en text som ett tal utan att bry sig om tusentalsseparator och komma.
	 */
	parseNumber : function(text) {

		if (text == null) {
			return null;
		}

		var result = text.replace(/[\s\xA0]+/g, "");
		result = result.replace(",", ".");
		return parseFloat(result);
	},

	/**
	 * Formatterar ett tal med tusentalsseparator, två decimaler och komma.
	 */
	formatNumber : function(number) {
		if (number || number == 0) {
			var str = number.toFixed(2).replace(".", ",");

			// Börja med att lägga på decimalerna.
	var result = str.substr(str.length - 3, 3);
	var len = str.length - 3;
	while (len > 3) {
		result = " " + str.substr(len - 3, 3) + result;
		len -= 3;
	}
	return str.substr(0, len) + result;
} else {
	return '';
}
}
};

/**
 * Volvokort.Page används för diverse funktioner som har med sidan att göra.
 */
Volvokort.Page = {

	/**
	 * Initierar sidan genom att sätta rätt klasser på formulärelement och gör
	 * så att det går att klicka på samarbetspartners och faq och de swoschar 
	 * fram.  
	 */
	init : function() {

		// Lägg på rätt klasser på formulärelement.
		$("input[type='checkbox']").addClass("checkbox");
		$("input[type='image']").addClass("image");
		$("input[type='password']").addClass("password");
		$("input[type='text']").addClass("text");

		// Fixa så att alla externa länkar och dokument öppnas i nya fönster.
		$("a[href^='http://']").not("a[href*='volvofinans.net']").not(
				"a[href*='volvokort.com']").attr( {
			target : "_blank",
			title : "Länken öppnas i ett nytt fönster"
		});
		$("a[href^='https://']").not("a[href*='volvofinans.net']").not(
				"a[href*='volvokort.com']").attr( {
			target : "_blank",
			title : "Länken öppnas i ett nytt fönster"
		});
		$("a[href*='/efaktura/visa.pdf']").attr( {
			target : "_blank",
			title : "E-fakturan öppnas i ett nytt fönster"
		});
		$("a[href*='/fakturor/faktura.pdf']").attr( {
			target : "_blank",
			title : "Fakturan öppnas i ett nytt fönster"
		});
		$("a[href*='/dokument/']").not("a[href*='/admin/dokument/']").attr( {
			target : "_blank",
			title : "Dokumentet öppnas i ett nytt fönster"
		});
		$("a[href*='/kund/erbjudande.pdf']").attr( {
			target : "_blank",
			title : "Erbjudandet öppnas i ett nytt fönster"
		});

		// Se till att faq:n kan visas.
		$("dt.faq").click(function() {
			$(this).next("dd").slideToggle(300);
			return false;
		});

		// Se till att samarbetspartners kan visas.
		$("dt.partner")
				.click(function() {

					// Dölj alla övriga.
						$(this).prevAll("dd").slideUp("normal");
						$(this).nextAll("dd").not($(this).next("dd")).slideUp(
								"normal");

						// Ta bort active från alla övriga.
						$(this).prevAll("dt").removeClass("active");
						$(this).nextAll("dt").removeClass("active");

						// Toggla om den här ska visas eller inte.
						$(this).next("dd").slideToggle(300);
						$(this).toggleClass("active");

						return false;
					});
	}
};

/**
 * Volvokort.Sidor tar hand om metoder för att hantera sidor.
 */
Volvokort.Sidor = {

	/**
	 * Initierar redigering av sidan.
	 * 
	 * @param form det formulär som ska postas när man ändrar html.
	 * @param formatHtmlUrl vart ska formuläret postas.
	 */
	init : function(form, formatHtmlUrl) {

		$(".editable").dblclick(function() {
			var obj = $(this);
			obj.find("span").hide();
			obj.find("input").show();
			obj.find("input").focus();
		});
		$(".editable input").blur(function() {
			var obj = $(this);
			obj.parent().find("span").text(obj.attr("value"));
			obj.parent().find("span").show();
			obj.hide();
		});
		$(".editableHTML").dblclick(function() {
			var obj = $(this);
			if (obj.hasClass("dynamic")) {
				var height = obj.height();
				if (height < 100) {
					height = 100;
				}
				obj.find("textarea").height(height);
			}
			obj.find("span").hide();
			obj.find("textarea").show();
			obj.find("textarea").focus();
		});
		$(".editableHTML textarea").blur(function() {
			var obj = $(this);
			$("#text").val(obj.val());
			YAHOO.util.Connect.setForm($("#" + form)[0]);
			YAHOO.util.Connect.asyncRequest("POST", formatHtmlUrl, {
				success : function(resp) {
					var result = YAHOO.lang.JSON.parse(resp.responseText);
					obj.parent().find("span").html(result.html);
					obj.parent().find("span").show();
					obj.hide();
				},
				failure : function(obj) {
				}
			});
		});
	},

	setBanner : function(id, src) {

		top.document["bannerDialog"].hide();
		$("#bannerId", window.top.document).val(id);
		$("#bannerImg", window.top.document).attr("src", src);
	},
	setBild : function(id, src) {

		top.document["bildDialog"].hide();
		var idx = $("#bildIndex", window.top.document).val();
		$("#bildId" + idx, window.top.document).val(id);
		$("#bildImg" + idx, window.top.document).attr("src", src);
	},
	setThumb : function(id, src) {

		top.document["thumbDialog"].hide();
		var idx = $("#thumbIndex", window.top.document).val();
		$("#thumbId" + idx, window.top.document).val(id);
		$("#thumbImg" + idx, window.top.document).attr("src", src);
	},
	showBildDialog : function(idx) {

		$("#bildIndex").val(idx);
		bildDialog.show();
	},
	showThumbDialog : function(idx) {

		$("#thumbIndex").val(idx);
		thumbDialog.show();
	},
	setDokument : function(id, src) {

		$("#dokumentId", window.top.document).val(id);
		Volvokort.Form.submit($("#sidaForm", window.top.document)[0],
				"adddokument");
	},
	hideUrlDialog : function(id) {

		$("#" + $("#urlId").val()).val($("#url").val());
		urlDialog.cancel();
	},
	showUrlDialog : function(id) {

		$("#url").val($("#" + id).val());
		$("#urlId").val(id);
		urlDialog.show();
	}
};

/**
 * Volvokort.Submenu tar hand om metoder som har med undermenyn att göra.
 */
Volvokort.Submenu = {

	/**
	 * Initierar undermenyn så att det går att klicka på menyerna och de 
	 * swoschar fram.  
	 */
	init : function() {

		// Initiera menyn.
		$("#submenu a.menu").click(function() {

			// Visa rätt undermeny.
				$("#submenu ul").find("ul").slideUp("normal");
				$(this).siblings("ul").slideToggle(300);
				$(this).siblings("ul").find("ul").slideToggle(300);

				// Sätt rätt undermeny till att vara aktiv.
				$("#submenu").children().children().removeClass("active");
				$(this).parent().addClass("active");

				return true;
			});
	}
};

/**
 * Volvokort.Table tar hand om tabeller.
 */
Volvokort.Table = (function() {

	/**
	 * Hjälpmetod för att hantera XHR-svar 
	 */
	function handleErrorsInTable(e) {

		var response = YAHOO.lang.JSON.parse(e.response.responseText);

		// ta hand om fel först
		if (response.errors != null) {
			var dataTable = e.callback.scope;
			
			var errorhtml = "<div class=\"errorMsg\" style=\"margin:0.3em;\"><ul>";
			for (var i = 0; i < response.errors.length; i++) {
				errorhtml += "<li style=\"font-size:100%\">" + response.errors[i].value + "</li>";
			}
			errorhtml += "</ul></div>";
			
			dataTable.set("MSG_ERROR", errorhtml);
		}
	};

	// Publika metoder
	return {
		/**
		 * Initerar en tabell genom att skapa en datakälla och sätta
		 * konfigurationen tabellen.
		 * 
		 * @param cfg.column kolumndefinitionen för tabellen.
		 * @param cfg.url url:en som datakällan ska använda (JSON).
		 * @param cfg.id id för den div där tabellen ska läggas.
		 * @param cfg.loadData anger om man vill att data ska laddas direkt eller inte
		 * @param cfg.initParam är parametrar för en initial request och används tillsammans med loadData
		 * @param cfg.callback en metod som om man skickar med den kommer att anropas 
		 *     när datat kommer.
		 * @param cfg.alwaysPaginate Om false visas endast pagineringsfunktionen om den behövs
		 * @param cfg.pageSize Hur många rader som visas på en sida
		 * @param cfg.sortedByCol namnet på den kolumn som resultatet är sorterat på.
		 * @param cfg.sortedByDir den typ av sortering som är gjord, YAHOO.widget.DataTable.CLASS_ASC 
		 *     eller YAHOO.widget.DataTable.CLASS_DESC.
		 * @param cfg.formatRowFunction funktion för att formatera raderna innan vi visar upp dem
		 * @param cfg.emptyMsg Textmeddelande som skall visas när tabellen är tom
		 */
		init : function(cfg) {
			var columns = cfg.columns;
			var url = cfg.url;
			var id = cfg.id;
			var loadData = cfg.loadData;
			var initParam = cfg.initParam;
			var callback = cfg.callback;
			var alwaysPaginate = cfg.alwaysPaginate;
			var pageSize = cfg.pageSize;
			var sortedByCol = cfg.sortedByCol;
			var sortedByDir = cfg.sortedByDir;
			var formatRowFunction = cfg.formatRowFunction;
			var msgEmpty = cfg.emptyMsg;

			// Fixa url:en.
			if (url.indexOf("?") == -1) {
				url = url + "?";
			} else if (url.indexOf("?") != url.length - 1) {
				url = url + "&";
			}
			// Lägg på random
			url = url + Math.random() + "&";

			// Bygg upp sorteringsoptions
			var sortedBy;
			if (sortedByCol) {
				if (sortedByDir) {
					sortedBy = {
						key : sortedByCol,
						dir : sortedByDir
					};
				} else {
					sortedBy = {
						key : sortedByCol,
						dir : YAHOO.widget.DataTable.CLASS_ASC
					};
				}
			}

			// Skapa en datakälla och konfigurera den.
			var myDataSource = new YAHOO.util.DataSource(url);
			myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
			myDataSource.connXhrMode = "cancelStaleRequests";

			myDataSource.responseSchema = {
				resultsList : "data",
				fields : columns
			};
			// Om användaren har skickat med en callbackmetod, lägg den som en lyssnare.
			if (callback) {
				myDataSource.subscribe("responseEvent", callback);
			}
			myDataSource.subscribe("responseEvent", handleErrorsInTable);

			// Om vi inte har skickat med något värde för alwaysPaginate är det gammal kod som vill ha Paginator.alwaysVisible till true
			if (alwaysPaginate == null) {
				alwaysPaginate = true;
			}
			// Om vi inte har skickat med något värde för pageSize är det gammal kod som vill ha Paginator.rowsPerPage till 20
			if (pageSize == null) {
				pageSize = 20;
			}

			if (!YAHOO.lang.isString(msgEmpty)) {
				msgEmpty = "Inga poster hittades";
			}

			// Skapa pagineringsoptions
			var paginatorConfig = {
				containerClass : "yui-pg-container clearfix",
				rowsPerPage : pageSize,
				alwaysVisible : alwaysPaginate,
				template : "{PreviousPageLink} {PageLinks} {NextPageLink} <label>Rader per sida {RowsPerPageDropdown}</label>",
				pageLinks : 8,
				nextPageLinkLabel : 'Nästa',
				previousPageLinkLabel : 'Föregående',
				rowsPerPageOptions : [ 10, 20, 50, 100 ]
			};

			// Skapa och konfigurera tabellen.
			var myDataTable = new YAHOO.widget.DataTable(id, columns,
					myDataSource, {
						initialLoad : loadData,
						initialRequest : initParam,
						sortedBy : sortedBy,
						formatRow : formatRowFunction,
						MSG_EMPTY : msgEmpty,
						MSG_ERROR : null, // Sätt null så att inte vårat meddelande ifrån handleErrorsInTable blir överskrivet av en statisk sträng
						MSG_LOADING : "Laddar...",
						MSG_SORTASC : "Klicka för att sortera stigande",
						MSG_SORTDESC : "Klicka för att sortera fallande",
						colCount : columns.length,
						paginator : new YAHOO.widget.Paginator(paginatorConfig)
					});

			return myDataTable;
		},

		/**
		 * Skickar ett nytt request till servern för att hämta data.
		 *
		 * @param cfg.table data tabell som man vill använda.
		 * @param cfg.param den requeststräng som man vill skicka för att hämta data
		 * @param cfg.sortColumn om man vill sortera på en viss kolumn.
		 * @param cfg.desc om man vill att den ska vara omvänt sorterad.
		 */
		loadData : function(cfg) {
			var table = cfg.table;
			var param = cfg.param;
			var sortColumn = cfg.sortColumn;
			var desc = cfg.desc;

			table.initializeTable();
			table.render();
			table.showTableMessage(table.get("MSG_LOADING"),
					YAHOO.widget.DataTable.CLASS_LOADING);
			table.getDataSource().sendRequest(param, {
				success : function(request, response, payload) {
					this.onDataReturnInitializeTable(request, response,
							payload);
					var paginator = this.get("paginator");
					paginator.set("totalRecords",
							response.results.length);
					if (sortColumn != null) {
						var column = this.getColumn(sortColumn);
						if (desc) {
							this.sortColumn(column,
									YAHOO.widget.DataTable.CLASS_DESC);
						} else {
							this.sortColumn(column,
									YAHOO.widget.DataTable.CLASS_ASC);
						}
					}
				},
				failure : function(request, response, payload) {
					this.MSG_ERROR = "Avbrutet";
				},
				scope : table
			});
		},

		/**
		 * Tar hand om öppning och stänging av nedfallande rader.
		 * Raden måste finnas och vara dold
		 * 
		 * @param id id på den rad som skall visas eller döljas.
		 */
		toggleRow : function(id) {

			var row = $("#" + id);
			// Vi måste kolla på cellnivå annars fungerar det inte i IE.
			var cell = $("#" + id + " :first-child");
			var div = $("#" + id + " div");
	
			if (!cell.is(":visible")) {
				row.show();
				row.find("td").show();
				div.slideDown(300);
			} else {
				div.slideUp(300, function() {
					row.find("td").hide();
					row.hide();
				});
			}
			return false;
		},

	/**
	 * Används som formatterare för alla kontonummer i json-tabeller så att de ser likadana ut överallt
	 */
	kontonummerFormatter : function(cell, record, column, data) {
		if (data) {
			var len = data.length - 3;
			var result = data;
			// gå igenom strängen baklänges och lägg in mellanslag mellan var tredje siffra
		while (len > 0) {
			result = result.substring(0, len) + " " + result.substring(len);
			len -= 3;
		}
		cell.innerHTML = result;
	} else {
		cell.innerHTML = "-";
	}
},

/**
 * Kan användas som formatterare för kortkontonummer om man vill visa dem 10 siffriga 
 * inkl ÅF profil
 */
kortkontonummerFormatter : function(cell, record, column, data) {
	if (data) {
		var len = data.length;
		// lägg in mellanslag mellan var tredje siffra
		// kontonumret är 7 siffror, ev med ett profilnummer före
		var result = data.substr(len - 7);
		result = result.substring(0, 1) + " " + result.substring(1, 4) + " "
				+ result.substring(4, 7);

		// profilnumret är siffrorna innan kontonumret, padda med 0 så att det blir 3
		var profil = data.substr(0, len - 7);
		if (profil.length > 0) {
			while (profil.length < 3) {
				profil = "0" + profil;
			}
			profil += " ";
		}
		cell.innerHTML = profil + result;
	} else {
		cell.innerHTML = "-";
	}
},

/**
 * Kan användas som formatterare när man vill att kolumnen ska visas som ett
 * belopp med kronor.
 */
currencyFormatter : function(cell, record, column, data) {
	if (data || data == 0) {
		cell.innerHTML = Volvokort.Number.formatNumber(data) + " kr";
	} else {
		cell.innerHTML = "-";
	}
},

quantityFormatter : function(cell, record, column, data) {
	if (data || data == 0) {
		cell.innerHTML = data + " st";
	}
},

literFormatter : function(cell, record, column, data) {
	if (data || data == 0) {
		cell.innerHTML = Volvokort.Number.formatNumber(data) + " l";
	}
},

/**
 * Kan användas som formatterare när man vill att kolumnen ska visas som ett
 * procentvärde.
 */
percentageFormatter : function(cell, record, column, data) {
	if (data || data == 0) {
		cell.innerHTML = Volvokort.Number.formatNumber(data) + " %";
	}
}
	}
}());

String.prototype.endsWith = function(str) {
	return (this.match(str + "$") == str);
}

// Initera alla objekt när sidan är färdigladdad.
$(document).ready(function() {

	Volvokort.Images.init();
	Volvokort.Menu.init();
	Volvokort.Page.init();
	Volvokort.Submenu.init();
});

