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 button en array där knapparna ska läggas.
	 * @param show anger om knappen ska visas eller inte.
	 * @param formId det formulär som knappen ska skicka.
	 * @param event det event som knappen ska skicka.
	 * @param text den text som ska stå på knappen.
	 * @param isDefault om knappen ska vara defaultknappen.
	 * @param ajax true om formuläret ska skickas med Ajax.
	 * @param dialogId för att kunna presentera en waitsymbol vid ajaxanrop.
	 */
	addButton: function(buttonList, show, formId, event, text, isDefault, ajax, dialogId) {
		
		if (show) {
			
			// Bestäm vilken handler som ska används för knappen.
			var handler;
			if (event) {
				if (ajax) {
					handler = function() {
						if (typeof event == 'function') {
							event();
						} else if (eval('typeof ' + event) == 'function') {
							eval(event)();
						} else {
							Volvokort.Dialog.submitAjax(formId, event);
						}
						//Visa waitikonen
						$("#waitInDialog_" + dialogId).attr("style", "display:inline");
					};
				} else {
					handler = function() { 
						if (typeof event == 'function') {
							event();
						} else if (eval('typeof ' + event) == 'function') {
							eval(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 = eval("(" + 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) {
  			}
  		});
	},
	
	/**
	 * 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();
	}
};

/**
 * 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, 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.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 = eval("(" + 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 = {

	/**
	 * Initerar en tabell genom att skapa en datakälla och sätta
	 * konfigurationen tabellen.
	 * 
	 * @param column kolumndefinitionen för tabellen.
	 * @param url url:en som datakällan ska använda (JSON).
	 * @param id id för den div där tabellen ska läggas.
	 * @param loadData anger om man vill att data ska laddas direkt eller inte
	 * @param initParam är parametrar för en initial request och används tillsammans med loadData
	 * @param callback en metod som om man skickar med den kommer att anropas 
	 *     när datat kommer.
	 * @param alwaysPaginate Om false visas endast pagineringsfunktionen om den behövs
	 * @param pageSize Hur många rader som visas på en sida
	 * @param sortedByCol namnet på den kolumn som resultatet är sorterat på.
	 * @param sortedByDir den typ av sortering som är gjord, YAHOO.widget.DataTable.CLASS_ASC 
	 *     eller YAHOO.widget.DataTable.CLASS_DESC.
	 * @param formatRowFunction funktion för att formatera raderna innan vi visar upp dem
	 */
	init : function(columns, url, id, loadData, initParam, callback, alwaysPaginate, pageSize, 
				sortedByCol, sortedByDir, formatRowFunction) {
		
		// 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);
		}
		// 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;
		}
		// 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    : "Inga poster hittades",
			MSG_ERROR    : "-",
			MSG_LOADING  : "Laddar...",
			MSG_SORTASC  : "Klicka för att sortera stigande",
			MSG_SORTDESC : "Klicka för att sortera fallande",
			paginator : new YAHOO.widget.Paginator(paginatorConfig)
		});
		
		return myDataTable;
	},
	
	/**
	 * Skickar ett nytt request till servern för att hämta data.
	 *
	 * @param table data tabell som man vill använda.
	 * @param param den requeststräng som man vill skicka för att hämta data
	 * @param sortColumn om man vill sortera på en viss kolumn.
	 * @param desc om man vill att den ska vara omvänt sorterad.
	 */
	loadData : function(table, param, sortColumn, 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.
	 * 
	 * @param id id på den rad som skall för nedfallande rader.
	 */
	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();
});
