/************************************************************************************************************
 *	
 *	Type: 		Javascript
 *	Author:		Martin Hedvall, John Fors
 *	Last modified: 	2008-12-05, 2009-02-13, 2009-11-14
 *
 *	Description: 	Displays images with a size that depend on available screen width/height. Prevents scrolling when
 *				an image is displayed.
 *
 ************************************************************************************************************/



//Specify the number of user printable input fields
var nrOfEmptyFields = 4;

//Boende
var Living = new Array();
var LivingID = new Array();
var LivingMoney = new Array();
var LivingPeriods = new Array();
var LivingAuto = new Array();
var LivingAutoDate = new Array();
Living[0] = "Hyra/Avgift";
Living[1] = "Ränta/Amortering";
Living[2] = "Värme";
Living[3] = "El";
Living[4] = "Vatten";
Living[5] = "Sophämtning";
Living[6] = "TV-licens";
Living[7] = "Bredband";
Living[8] = "Fast telefoni";
Living[9] = "Försäkringar";
var LivingOrgLength = Living.length;
//Initially set all money fields to zero (default value)
for(var i=0; i<Living.length; i++) {
	LivingMoney[i] = 0;
	LivingPeriods[i] = "month";
	LivingAuto[i] = 0;
	LivingAutoDate[i] = 0;
}

//Mat
var Food = new Array();
var FoodID = new Array();
var FoodMoney = new Array();
var FoodPeriods = new Array();
var FoodAuto = new Array();
var FoodAutoDate = new Array();
Food[0] = "Livsmedel";
Food[1] = "Städprodukter";
Food[2] = "Hudvård";
var FoodOrgLength = Food.length;
//Initially set all money fields to zero (default value)
for(var i=0; i<Food.length; i++) {
	FoodMoney[i] = 0;
	FoodPeriods[i] = "month";
	FoodAuto[i] = 0;
	FoodAutoDate[i] = 0;
}

//Transport
var Transport = new Array();
var TransportID = new Array();
var TransportMoney = new Array();
var TransportPeriods = new Array();
var TransportAuto = new Array();
var TransportAutoDate = new Array();
Transport[0] = "Kommunaltrafik";
Transport[1] = "Avbet. billån";
Transport[2] = "Bilförsäkring";
Transport[3] = "Skatt";
Transport[4] = "Bränsle";
Transport[5] = "Taxi";
var TransportOrgLength = Transport.length;
//Initially set all money fields to zero (default value)
for(var i=0; i<Transport.length; i++) {
	TransportMoney[i] = 0;
	TransportPeriods[i] = "month";
	TransportAuto[i] = 0;
	TransportAutoDate[i] = 0;
}

//Kläder
var Clothes = new Array();
var ClothesID = new Array();
var ClothesMoney = new Array();
var ClothesPeriods = new Array();
var ClothesAuto = new Array();
var ClothesAutoDate = new Array();
Clothes[0] = "Kläder";
Clothes[1] = "Skor";
var ClothesOrgLength = Clothes.length;
//Initially set all money fields to zero (default value)
for(var i=0; i<Clothes.length; i++) {
	ClothesMoney[i] = 0;
	ClothesPeriods[i] = "month";
	ClothesAuto[i] = 0;
	ClothesAutoDate[i] = 0;
}

//Sparande
var Saving = new Array();
var SavingID = new Array();
var SavingMoney = new Array();
var SavingPeriods = new Array();
var SavingAuto = new Array();
var SavingAutoDate = new Array();
Saving[0] = "Buffert";
Saving[1] = "Pension";
Saving[2] = "Till barnen";
var SavingOrgLength = Saving.length;
//Initially set all money fields to zero (default value)
for(var i=0; i<Saving.length; i++) {
	SavingMoney[i] = 0;
	SavingPeriods[i] = "month";
	SavingAuto[i] = 0;
	SavingAutoDate[i] = 0;
}

//Lån
var Loan = new Array();
var LoanID = new Array();
var LoanMoney = new Array();
var LoanPeriods = new Array();
var LoanAuto = new Array();
var LoanAutoDate = new Array();
Loan[0] = "Ränta";
Loan[1] = "Amortering";
var LoanOrgLength = Loan.length;
//Initially set all money fields to zero (default value)
for(var i=0; i<Loan.length; i++) {
	LoanMoney[i] = 0;
	LoanPeriods[i] = "month";
	LoanAuto[i] = 0;
	LoanAutoDate[i] = 0;
}

//Övrigt
var Others = new Array();
var OthersID = new Array();
var OthersMoney = new Array();
var OthersPeriods = new Array();
var OthersAuto = new Array();
var OthersAutoDate = new Array();
Others[0] = "Tekniska prylar";
Others[1] = "Shopping";
Others[2] = "Snus";
Others[3] = "Cigaretter";
Others[4] = "Alkohol";
Others[5] = "Nöjen";
Others[6] = "Godis";
Others[7] = "Tidningar";
Others[8] = "Läkarvård";
Others[9] = "Läkemedel";

var OthersOrgLength = Others.length;
//Initially set all money fields to zero (default value)
for(var i=0; i<Others.length; i++) {
	OthersMoney[i] = 0;
	OthersPeriods[i] = "month";
	OthersAuto[i] = 0;
	OthersAutoDate[i] = 0;
}

//Addons for ajax cue script
var save_sdXmlHttp = new XmlHttpObject(false,500,3000,5500,10,"","");
var save_sending = false;

/* Functions to display, calculate etc. */
function displayCountlist(user_id, Income, Categories, category_id, category_name, useAjax) {
	//Select category name
	if(category_id==5) {
		return false;
	}
	
	//Select the correct data arrays
	switch(category_name) {
		case "Boende":
			DataArray = Living;
			DataID = LivingID;
			MoneyArray = LivingMoney;
			PeriodArray = LivingPeriods;
			AutoArray = LivingAuto;
			AutoDateArray = LivingAutoDate;
			OrgLength = LivingOrgLength;
			break;
		case "Mat":
			DataArray = Food;
			DataID = FoodID;
			MoneyArray = FoodMoney;
			PeriodArray = FoodPeriods;
			AutoArray = FoodAuto;
			AutoDateArray = FoodAutoDate;
			OrgLength = FoodOrgLength;
			break;
		case "Transport":
			DataArray = Transport;
			DataID = TransportID;
			MoneyArray = TransportMoney;
			PeriodArray = TransportPeriods;
			AutoArray = TransportAuto;
			AutoDateArray = TransportAutoDate;
			OrgLength = TransportOrgLength;
			break;
		case "Kläder":
			DataArray = Clothes;
			DataID = ClothesID;
			MoneyArray = ClothesMoney;
			PeriodArray = ClothesPeriods;
			AutoArray = ClothesAuto;
			AutoDateArray = ClothesAutoDate;
			OrgLength = ClothesOrgLength;
			break;
		case "Sparande":
			DataArray = Saving;
			DataID = SavingID;
			MoneyArray = SavingMoney;
			PeriodArray = SavingPeriods;
			AutoArray = SavingAuto;
			AutoDateArray = SavingAutoDate;
			OrgLength = SavingOrgLength;
			break;
		case "Lån":
			DataArray = Loan;
			DataID = LoanID;
			MoneyArray = LoanMoney;
			PeriodArray = LoanPeriods;
			AutoArray = LoanAuto;
			AutoDateArray = LoanAutoDate;
			OrgLength = LoanOrgLength;
			break;
		case "Övrigt":
			DataArray = Others;
			DataID = OthersID;
			MoneyArray = OthersMoney;
			PeriodArray = OthersPeriods;
			AutoArray = OthersAuto;
			AutoDateArray = OthersAutoDate;
			OrgLength = OthersOrgLength;
			break;
		default:
			//Display empty arrays;
			DataArray = new Array;
			DataID = new Array;
			MoneyArray = new Array;
			PeriodArray = new Array;
			AutoArray = new Array;
			AutoDateArray = new Array;
			OrgLength = 0;
	}
	
	viewerDiv = document.getElementById('blank_div');
	viewerDiv.style.display = "inline";
	var display_block =		"<div id=\"countlist_wrapper\" style=\"color: #ffffff\">"
							+	"<div id=\"countlist_top\" style=\"text-align: center; font-size: 14px; font-weight: bold\"><table style=\"width: 80%; height: 100%; margin: 0px auto\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr><td style=\"text-align: left\">"+ category_name +"</td><td style=\"text-align: right; vertical-align: middle\"><img style=\"cursor:pointer\" onclick=\"hideCountlist()\" src=\"/images/layout/buttons/button_close.png\" alt=\"stäng\" /></td></tr></table></div>"
							+	"<div id=\"countlist_repeat\">"
								+	"<hr style=\"margin: 0px 15px 0px 10px; padding: 0px\" />"
								+ 	"	<table style=\"margin: 0px auto\" border=\"0\" cellpadding=\"0\" cellspacing=\"6\"><tr>"
								+			"<td style=\"font-weight: bold\">Utgift</td>"
								+			"<td style=\"font-weight: bold\">Kostnad</td>"
								+			"<td style=\"font-weight: bold\">Avser</td>"
								+			"<td style=\"font-weight: bold\">Autodragning</td>"
								+			"<td style=\"font-weight: bold; text-align: center\">Dag</td>"
								+			"</tr><tr>"
								+			"<td><hr /></td>"
								+			"<td><hr /></td>"
								+			"<td><hr /></td>"
								+			"<td><hr /></td>"
								+			"<td><hr /></td>"
								+			"</tr><tr>";
	/*
	alert(Others.length);
	alert(nrOfEmptyFields);
	*/
	// Get the correct vectors depending on category_name
	
	for(var i=0; i < (OrgLength + nrOfEmptyFields); i++) {
		if(i < OrgLength) {
			display_block += "<td>" + DataArray[i] + "</td><td><input id=\"countField_"+i+"\" size=\"3\" value=\""+MoneyArray[i]+"\" onkeyup=\"calculateSum("+(OrgLength + nrOfEmptyFields)+")\" />kr</td>";
		}
		else if((i >= OrgLength) && (i < DataArray.length)) {
			display_block += "<td><input id=\"countTextField_"+i+"\" size=\"15\" value=\""+DataArray[i]+"\" /></td><td><input id=\"countField_"+i+"\" size=\"3\" value=\""+MoneyArray[i]+"\" onkeyup=\"calculateSum("+(OrgLength + nrOfEmptyFields)+")\" />kr</td>";
		}
		else {
			display_block += "<td><input id=\"countTextField_"+i+"\" size=\"15\" /></td><td><input id=\"countField_"+i+"\" size=\"3\" value=\"0\" onkeyup=\"calculateSum("+(OrgLength + nrOfEmptyFields)+")\" />kr</td>";
		}
		//Period
		display_block += 		"<td><select id=\"periodField_"+i+"\" name=\"selectField_"+i+"\" onchange=\"calculateSum("+(OrgLength + nrOfEmptyFields)+")\">";
		if("quarter" == PeriodArray[i]) {
			display_block +=	"<option value=\"month\">Månad</option>"
							+	"<option value=\"quarter\" selected=\"selected\">Kvartal</option>"
							+	"<option value=\"year\">År</option>";
		}
		else if("year" == PeriodArray[i]) {
			display_block +=	"<option value=\"month\">Månad</option>"
							+	"<option value=\"quarter\">Kvartal</option>"
							+	"<option value=\"year\" selected=\"selected\">År</option>";			
		}
		else {
			display_block +=	"<option value=\"month\">Månad</option>"
							+	"<option value=\"quarter\">Kvartal</option>"
							+	"<option value=\"year\">År</option>";		
		}
		display_block +=		"</select>"
						+	"</td>";
		
		//Auto reduction
		display_block += 		"<td style=\"text-align: center\"><select id=\"autoField_"+i+"\" name=\"selectAField_"+i+"\">";
		if(1 == AutoArray[i]) {
			display_block +=	"<option value=\"no\">Nej</option>"
							+	"<option value=\"yes\" selected=\"selected\">Ja</option>";
		}
		else {
			display_block +=	"<option value=\"no\" selected=\"selected\">Nej</option>"
							+	"<option value=\"yes\">Ja</option>";			
		}
		display_block +=		"</select>"
						+	"</td>";
		//Date
		if(i < AutoDateArray.length) {
			if(AutoDateArray[i] != 0) {
				display_block += 	"<td style=\"text-align: center\"><input id=\"autoDateField_"+i+"\" size=\"2\" value=\""+AutoDateArray[i]+"\" /></td>";
			}
			else {
				display_block += 	"<td style=\"text-align: center\"><input id=\"autoDateField_"+i+"\" size=\"2\" value=\"\" /></td>";
			}
		}
		else {
			display_block += 	"<td style=\"text-align: center\"><input id=\"autoDateField_"+i+"\" size=\"2\" value=\"\" /></td>";
		}
		display_block += "</tr><tr>";
	}
	display_block += "<td><hr /></td>"
								+			"<td><hr /></td>"
								+			"<td><hr /></td>"
								+			"<td><hr /></td>"
								+			"<td><hr /></td>"
								+			"</tr><tr>"
								+			"<td style=\"font-weight: bold\">Summa\/månad:</td>"
								+			"<td id=\"sumField\" style=\"font-weight: bold\">0 kr</td>"
								+			"<td></td>"
								+			"<td></td>"
								+			"<td><img src=\""+ getSaveButton(useAjax) +"\" style=\"cursor:pointer\" onclick=\"saveCountlist("+user_id+","+Income+","+Categories+","+(OrgLength + nrOfEmptyFields)+", '"+"field_"+category_id+"',"+category_id+",'"+category_name+"',"+useAjax+")\" alt=\"Spara\" /></td>"
								+			"</tr><tr>"
								+			"<td><hr /></td>"
								+			"<td><hr /></td>"
								+			"<td><hr /></td>"
								+			"<td><hr /></td>"
								+			"<td id=\"save_message\"><hr /></td>"
								+		"</tr></table>"
							+		"</div>"
							+	"<div id=\"countlist_bottom\"></div>"
						+	"</div>";
	viewerDiv.innerHTML = display_block;
	calculateSum((OrgLength + nrOfEmptyFields));
	document.getElementById('countField_0').focus();
	
	//Change css properties depending on browser height and scroll position
	
	//Get client height
	var AvailableHeight = 0;
	//IE
	if(!window.innerWidth) {
		//strict mode
		if(!(document.documentElement.clientWidth == 0))
		{
			AvailableHeight = document.documentElement.clientHeight;
		}
		//quirks mode
		else
		{
			AvailableHeight = document.body.clientHeight;
		}
	}
	else {
		//w3c
		AvailableHeight = window.innerHeight;
	}
	var constAvailableHeight = AvailableHeight;
	
	if( window.innerHeight && window.scrollMaxY ) // Firefox 
	{
		pageHeight = window.innerHeight + window.scrollMaxY;
	}
	else if( document.body.scrollHeight > document.body.offsetHeight ) // all but Explorer Mac
	{
		pageHeight = document.body.scrollHeight;
	}
	else // works in Explorer 6 Strict, Mozilla (not FF) and Safari
	{
		pageHeight = document.body.offsetHeight + document.body.offsetTop;
	}
	
	//Set backdiv height to the maximum of pageHeight and windowHeight
	if(pageHeight > AvailableHeight) {
		AvailableHeight = pageHeight;
	}
	
	if (typeof document.body.style.maxHeight != "undefined") {
		// IE 7, mozilla, safari, opera 9 - switch background to semitransparent
		if (document.getElementById("blank_div")) {
			ModObject = document.getElementById('blank_div');
			ModObject.style.position = "fixed";
			ModObject.style.height = AvailableHeight+"px";
			ModObject.style.backgroundColor = "transparent";
			ModObject.style.backgroundImage = "url('/images/layout/login/transparent.png')";
			ModObject.style.backgroundRepeat = "repeat";
		}
	}
	else {
		//Just set the background height
		if (document.getElementById("blank_div")) {
			ModObject = document.getElementById('blank_div');
			ModObject.style.height = AvailableHeight+"px";
		}
	}
	
	//If true: Check if margin-top needs to be modified in order to
	//fit the div in the window.
	if (document.getElementById("countlist_wrapper")) {
		ModObject = document.getElementById('countlist_wrapper');
		var marginTop = Math.round((constAvailableHeight - ModObject.offsetHeight + ModObject.style.marginTop)/3);
		if(marginTop < 0) {
			marginTop = 0;
		}
		ModObject.style.marginTop = marginTop+"px";
	}
}
function hideCountlist() {
	//Just kill the window
	viewerDiv = document.getElementById('blank_div');
	viewerDiv.innerHTML = "";
	viewerDiv.style.display = "none";
}
function getSaveButton(useAjax) {
	var buttonString = "/images/layout/board/board_regsave.png";
	if(!useAjax) {
		buttonString = "/images/layout/board/board_ok.png";
	}
	return buttonString;
}
function saveCountlist(user_id, Income, Categories, NrOfCategories, field, category_id, category_name, useAjax) {
	//Bring sum into the input box
	var MoneyString = document.getElementById('sumField').innerHTML;
	var sum = parseInt(MoneyString.substring(0, (MoneyString.length-3)));
	document.getElementById(field).value = sum;
	//Update the money on the board
	viewMoney(Income, Categories, category_id);
	//Store all values into the strings
	
	//Select the correct data arrays
	switch(category_name) {
		case "Boende":
			DataArray = Living;
			DataID = LivingID;
			MoneyArray = LivingMoney;
			PeriodArray = LivingPeriods;
			AutoArray = LivingAuto;
			AutoDateArray = LivingAutoDate;
			OrgLength = LivingOrgLength;
			break;
		case "Mat":
			DataArray = Food;
			DataID = FoodID;
			MoneyArray = FoodMoney;
			PeriodArray = FoodPeriods;
			AutoArray = FoodAuto;
			AutoDateArray = FoodAutoDate;
			OrgLength = FoodOrgLength;
			break;
		case "Transport":
			DataArray = Transport;
			DataID = TransportID;
			MoneyArray = TransportMoney;
			PeriodArray = TransportPeriods;
			AutoArray = TransportAuto;
			AutoDateArray = TransportAutoDate;
			OrgLength = TransportOrgLength;
			break;
		case "Kläder":
			DataArray = Clothes;
			DataID = ClothesID;
			MoneyArray = ClothesMoney;
			PeriodArray = ClothesPeriods;
			AutoArray = ClothesAuto;
			AutoDateArray = ClothesAutoDate;
			OrgLength = ClothesOrgLength;
			break;
		case "Sparande":
			DataArray = Saving;
			DataID = SavingID;
			MoneyArray = SavingMoney;
			PeriodArray = SavingPeriods;
			AutoArray = SavingAuto;
			AutoDateArray = SavingAutoDate;
			OrgLength = SavingOrgLength;
			break;
		case "Lån":
			DataArray = Loan;
			DataID = LoanID;
			MoneyArray = LoanMoney;
			PeriodArray = LoanPeriods;
			AutoArray = LoanAuto;
			AutoDateArray = LoanAutoDate;
			OrgLength = LoanOrgLength;
			break;
		case "Övrigt":
			DataArray = Others;
			DataID = OthersID;
			MoneyArray = OthersMoney;
			PeriodArray = OthersPeriods;
			AutoArray = OthersAuto;
			AutoDateArray = OthersAutoDate;
			OrgLength = OthersOrgLength;
			break;
		default:
			//Display empty arrays;
			DataArray = new Array;
			DataID = new Array;
			MoneyArray = new Array;
			PeriodArray = new Array;
			AutoArray = new Array;
			AutoDateArray = new Array;
			OrgLength = 0;
	}
	var SelectId = "";
	var MoneyId = "";
	var NameId = "";
	var AutoId = "";
	var AutoDateId = "";
	
	//Prepare for AJAX script
	var idString = "";
	var nameString = "";
	var moneyString = "";
	var periodString = "";
	var autoString = "";
	var autoDateString = "";
	for(var i=0; i < (OrgLength + nrOfEmptyFields); i++) {
		SelectId = "periodField_"+i;
		MoneyId = "countField_"+i;
		NameId = "countTextField_"+i;
		AutoId = "autoField_"+i;
		AutoDateId = "autoDateField_"+i;
		
		PeriodArray[i] = document.getElementById(SelectId).value;
		MoneyArray[i] = document.getElementById(MoneyId).value;
		//Auto
		if(document.getElementById(AutoId).value == "yes") {
			AutoArray[i] = 1;
		}
		else {
			AutoArray[i] = 0;
		}
		//Autodate
		if(document.getElementById(AutoDateId).value != "") {
			AutoDateArray[i] = parseInt(document.getElementById(AutoDateId).value);
		}
		else {
			AutoDateArray[i] = 0;
		}
		
		if(i >= OrgLength) {
			DataArray[i] = document.getElementById(NameId).value;
		}
		//AJAX strings
		if((DataArray[i] != "") && (DataArray[i] != " ")) {
			idString += "*" + DataID[i];
			nameString += "*" + DataArray[i];
			moneyString += "*" + MoneyArray[i];
			periodString += "*" + PeriodArray[i].substring(0,1);
			autoString += "*" + AutoArray[i];
			autoDateString += "*" + AutoDateArray[i];
		}
	}
	
	if(useAjax) {
		var concatString = "?user="+user_id+"&subid="+idString+"&cat="+category_id+"&name="+nameString+"&value="+moneyString+"&period="+periodString+"&auto="+autoString+"&dates="+autoDateString;

		//Store using AJAX
		SQLWriteData(concatString);
		//End storing information
	}
	viewerDiv = document.getElementById('blank_div');
	viewerDiv.innerHTML = "";
	viewerDiv.style.display = "none";
}

function calculateSum(NrOfCategories) {
	var sum = 0;
	var documentId = "";
	var selectId = "";
	var thisMoney = 0;
	
	for(var i=0; i < NrOfCategories; i++) {
		documentId = "countField_"+i;
		if(IsValidNumber(document.getElementById(documentId).value)) {
			//check period time
			selectId = "periodField_"+i;
			if(document.getElementById(documentId).value != "") {
				thisMoney = parseInt(document.getElementById(documentId).value);
			}
			else {
				thisMoney = 0;
			}
			switch(document.getElementById(selectId).value) {
				case "month":
					sum += parseInt(thisMoney);
					break;
				case "quarter":
					sum += Math.round(thisMoney/3);
					break;
				case "year":
					sum += Math.round(thisMoney/12);
					break;
			}
			
		}
	}
	//write the sum
	document.getElementById('sumField').innerHTML = sum + " kr";
}
function IsValidNumber(sText) {
   var ValidChars = "0123456789";
   var IsNumber=true;
   var Char;
 
   for (i = 0; i < sText.length && IsNumber == true; i++) { 
      Char = sText.charAt(i); 
      if (ValidChars.indexOf(Char) == -1) {
         IsNumber = false;
         }
      }
   return IsNumber;
}
function SQLWriteData(sendData) {
	//Writes information to database using AJAX
	
	//function XmlHttpObject (keepQueue,minDelayBetweenCalls,retryTimeout,abortTimeout,maxNoRetries,evalOnRetry,evalOnAbort) {
	if (save_sending) {
		alert("sparar, var god vänta!");
		return;
	}
	save_sdXmlHttp.open("/include/classCountlist.php"+sendData,"","");
	document.getElementById('save_message').innerHTML = "<span style=\"color: #0000ff\">Sparar...</span>";
	login = true;
}

// Test med Victors köskript

function oTimer () {
	var timer = null;
	var timerBusy = false;
	var lastCall=""
	var lastTimeout = 0;
	var that = this;

	this.setTimeout = function (callfunc, timeout, cancelActive) {
		if (timerBusy && !cancelActive) return null;
		if (timerBusy) clearTimeout(timer);
		lastCall = callfunc;
		lastTimeout = timeout;
		timer = window.setTimeout(function(){timerBusy=false; lastCall()},timeout);
		timerBusy = true;
		return this;
	};
	this.clearTimeout = function () {
		if (timerBusy) clearTimeout(timer);
		timerBusy = false;
	};
	this.isBusy = function() { return timerBusy };
}


function XmlHttpObject (keepQueue,minDelayBetweenCalls,retryTimeout,abortTimeout,maxNoRetries,evalOnRetry,evalOnAbort) {
	var count = 0;
	var queue=keepQueue;
	var delayBetweenCalls = minDelayBetweenCalls; 	//Min-tid mellan serveranrop
	var delayRetry = retryTimeout;			//Max-tid för ett serveranrop innan det skickas igen
	var delayAbort = abortTimeout;			//Max-tid (inklusive delayRetry) för ett serveranrop innan det försörs
	var maxRetries = maxNoRetries;			//Högsta antal omsändningar vid avbrott
	this.evalOnRetry= evalOnRetry;
	this.evalOnAbort = evalOnAbort;
	that = this; //För att få rätt referens till this *konvention*

	var lastUrl="";
	this.lastParameters="";
	var lastCallback="";

	
	var timerBetweenCalls = new oTimer(); //Tillgänglig för timeout
	var timerNextRetry = new Array();
	var timerAbort = new oTimer();
	var timerRetry = new oTimer();
	var retry = 0;

	if (delayAbort>=delayRetry*2) delayAbort=delayRetry*1.8;
	
	this.xmlHttp = new function () {
	   try { return new XMLHttpRequest(); } catch(e) {}
	   try { return new ActiveXObject("Msxml3.XMLHTTP"); } catch (e) {}
	   try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
	   try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
	   throw "XMLHttpRequest stöds ej!";
	   return null;
	};

	this.abort = function () {
		that.xmlHttp.onreadystatechange = function() {}
		that.xmlHttp.abort();
	};
	
	timerNextRetryLength = 0;
	this.open = function (url,parameter,callback) {
		lastUrl = url || lastUrl;
		this.lastParameters = parameter || this.lastParameters;
		lastCallback = callback || lastCallback;

//			document.getElementById('debug').innerHTML+='KeyPress: '+this.lastParameters+'<br />';
		if (timerBetweenCalls.isBusy() && timerRetry.isBusy()  && !queue) {
			return;
		}
		if (timerBetweenCalls.isBusy() || timerRetry.isBusy()) {
			//Avbryt eller försök igen senare, beroende på om kö ska hållas
			if (queue) {
				timerNextRetry[timerNextRetryLength] = new oTimer();
				timerNextRetry[timerNextRetryLength++].setTimeout(function() {that.open(null,null,null)},delayBetweenCalls/5,false);
				return;
			}
			else {
//					document.getElementById('debug').innerHTML+='New call before other done, aborting current call<br />';
				this.xmlHttp.onreadystatechange=function() {};
				this.xmlHttp.abort();
			}
		}
		if (retry>0) {
			this.abort();
		}

		if (retry<10) {
//				document.getElementById('debug').innerHTML+='Setting betweenCall, retry and abort timers...<br />'	
//				timerRetry.setTimeout(function() {/*document.getElementById('debug').innerHTML+='Retrytimeout: '+retry+'!<br />';*/retry++;eval(evalOnRetry);that.open(null,null,null)},delayRetry,true);
			timerBetweenCalls.setTimeout(function() {/*document.getElementById('debug').innerHTML+='BetweenCall timer reset<br />'*/},delayBetweenCalls,true);
			timerRetry.setTimeout(function() {/*retry++;document.getElementById('debug').innerHTML+='Retry delay timed out, no: '+retry+'!<br />';*/retry++;eval(evalOnRetry);that.open(null,null,null)},delayRetry,true);
			timerAbort.setTimeout(function() {/*document.getElementById('debug').innerHTML+='Abort delay timed out, no: '+retry+'!<br />';*/that.abort()},delayAbort,false);
		}
		else {
//				document.getElementById('debug').innerHTML+='Final abort timer set<br />'	
			timerAbort.setTimeout(function() {retry++;eval(that.evalOnAbort);},delayAbort,true);
		}

		if ((new String(this.lastParameters)).indexOf("document.getElementById")==0) this.lastParameters = eval(this.lastParameters);

		try {
			that.xmlHttp.open("GET",  lastUrl + this.lastParameters, true)
		}
		catch(e) {
			//alert("could not open, retry "+retry);
			return;
		}
		that.xmlHttp.onreadystatechange=function() {
			if (that.xmlHttp.readyState!=4) return; //Ej klar
			if(that.xmlHttp.responseText) {
			  try { var status = that.xmlHttp.status }
			  catch(e) { 
				that.open(null,null,null);
				return;
			  }
			  if (that.xmlHttp.status == 200 || that.xmlHttp.status == 304) {
				count++;
				retry=0;
				
				timerRetry.clearTimeout();
				timerAbort.clearTimeout();
//					document.getElementById('debug').innerHTML+="call succeeded, clear timerRetry & timerAbort<br />";
//					document.getElementById('debug').innerHTML+="Respons: "+count+"!<br />";
				lastCallback(that);
			  }
			}
		}
//			document.getElementById('debug').innerHTML+='Sending request: '+this.lastParameters+'<br />'	;

		try{ 
			that.xmlHttp.send(null);
		}
		catch(e) {
			//alert("could not send");
			return;
		};
	};

}
