/*
	Gemensamma hjälpfunktioner hela sajten.
	
	$Id: commonFunctions.js,v 1.35.6.3 2010/03/11 12:37:36 matwra Exp $
*/

/*
*   Returnerar true om man använt en siffertangent. Om funktionen
*   inte är lyckas identifiera tangenten som använts returnerar 
*   den ändå true och låter serverkontrollen göra jobbet. 
*/
function isNumericKey(e) {
	var k = document.all ? e.keyCode : e.which;
	if (k == null)
	   return true;
	return ((k > 47 && k < 58) || k == 8 || k == 0 || k == 13);
}

/*
*   Returnerar true om man använt tecken som tillåts för personnummer
*   (siffror eller bindestreck). Om funktionen inte lyckas identifiera
*   tangenten som använts returnerar den ändå true och låter 
*   serverkontrollen göra jobbet.
*/
function isPnrKey(e) {
	var k = document.all ? e.keyCode : e.which;
	if (k == null)
	   return true;
	return ((k > 47 && k < 58) || k == 45 || k == 8 || k == 0 || k == 13);
}

/*
 * Returnerar true om man använt bokstäver, kommatecken eller bindestreck.
 * Om funktionen inte lyckas identifiera
 * tangenten som använts returnerar den ändå true och låter 
 * serverkontrollen göra jobbet.
 */
function isValidChar(e){
	var k = document.all ? e.keyCode : e.which;
	if (k == null)
	   return true;
	return ((k > 64 && k < 91) || (k > 96 && k < 123) || (k == 229 || k == 197) || (k == 228 || k == 196) || (k == 246 || k == 214) || k == 44 || k == 45 || k == 32 || k == 8 || k == 0);
}

/*
*   Returnerar true om man använt tecken som tillåts för telefonnummer
*   (siffror, bindestreck eller plus). Om funktionen inte lyckas identifiera
*   tangenten som använts returnerar den ändå true och låter 
*   serverkontrollen göra jobbet.
*/
function isPhoneNumberKey(e) {
	var k = document.all ? e.keyCode : e.which;
	if (k == null)
	   return true;
	return ((k > 47 && k < 58) || k == 43 || k == 45 || k == 8 || k == 0 || k == 13);
}

/*
 * Returnerar true om man använt tecken som tillåts för kontonummer (siffror
 * och bindestreck). Eftersom isPnrKey gör kontroll på samma tecken så anropas
 * den metoden härifrån för att slippa duplicerad kod.
 */
function isAccountNumberKey(e) {
	return isPnrKey(e);
}

/*
*   Rensar ut det som inte är siffror genom att enbart 
*   returnera de numeriska tal som ingår i en text.
*/
function extractNumeric(str) {
	return str.replace(/\D/g,"");
}


/*
*   Rensar ut det som inte är giltiga personnummertecken (siffror
*   eller bindestreck) genom att enbart returnera de tillåtna tecken
*   som ingår i en text.
*/
function extractPnrChars(str) {
	return str.replace(/[^0-9-]/g,"");
}


/*
*   Returnerar det första element med ett givet klassnamn.
*   För ökad prestanda kan argumenten "node" och "tag" användas
*   för att bara söka element av en viss tagtyp och inom en viss
*   nod.
*/
function getFirstElementByClass(searchClass,node,tag) {
	var classElement;
	if (node == null)
		node = document;
	if (tag == null)
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (var i = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElement = els[i];
			break;
		}
	}
	return classElement;
}



/**
*   Visar (eller döljer) felmeddelanderuta och de fel den innehåller.
*   Parametrar:
*      errorContainer är den ruta där felen finns.
*      showErrors anger om rutan (och eventuella) fel ska visas eller gömmas.
*                 true slår på rutan och går igenom arrayen med fel, medan false
*                 gömmer rutan och samtliga list items i den.
*      errorMessages är den array som innehåller felmeddelanden. Nödvändig om showErrors är true.
*/
function showErrorBox(errorContainer, showErrors, errorMessages) {
	var errorContainer = document.getElementById(errorContainer);
	errorContainer.style.display = showErrors ? 'block' : 'none';
	var lists = errorContainer.getElementsByTagName("ul");
	for (var i=0; i<lists.length; i++) {
		lists[i].style.display = 'block';
		var items = lists[i].getElementsByTagName("li");
		for (var j=0; j<items.length; j++) {
			var thisItem = items[j];
			if (showErrors) {
				if (errorMessages.contains(thisItem.id)) {
					// Visa felmeddelande.
					thisItem.style.display = 'list-item';
					
					// En del felmeddelanden har nästlade listor. I så fall ska den visas nu. 
					// (Den behöver inte döljas eftersom den försvinner när föräldern göms.)
					if (thisItem.getElementsByTagName("ul")!=null) {
						var subLists = thisItem.getElementsByTagName("ul");
						for (var k=0; k<subLists.length; k++) {
							var subListItems = subLists[k].getElementsByTagName("li");
							for (var l=0; l<subListItems.length; l++) {
								subListItems[l].style.display = 'list-item';
							}
						
						}
						
					}

				}
			} else {
				// Dölj felmeddelande.
				thisItem.style.display = 'none';
			}
		}
	}
}

/*
 * Öppnar en url (fondfaktasida) i ett nytt fönster.
 */
function openWin(url, name){
	window.open(url, name, 'width=800, height=600, location=0, menubar=0, directories=0, toolbar=0, status=0, resizable=0, scrollbars=1');
}

/*
*   Valideringsfunktion för loginformuläret. Innehåller logik för validering
*   och om något av kraven inte uppfylls läggs en SiteVision-url till i errors-arrayen
*   för att sedan visas som text i röda rutan.
*   
*   (Funktionen är kanske egentligen inte hemmahörande i commonFunctions, men den är 
*   så tätt sammankopplad till metoder och funktioner här att den passar bäst här.)
*/
function validateLoginForm(form, errorContainer) {
	if(document.LogonForm.result.value != null && document.LogonForm.result.value == 'submit') {
		showErrorBox(errorContainer, false);

		// Om det finns felmeddelanden från det att sidan postats till servern måste
		// dessa först döljas innan vi gör javascriptvalideringen. (Dessutom ser det
		// snyggare ut om sidan rensas på fel innan vi försöker posta igen.)
		var loginPortlet = document.getElementById('loginPortlet');
		if (loginPortlet != null) {
			var loginDivs = loginPortlet.getElementsByTagName("div");
			if (loginDivs != null) {
				for (var j=0; j<loginDivs.length; j++) {
					 if (loginDivs[j].className == 'portlet-msg-error') {
						loginDivs[j].style.display = 'none';
						loginDivs[j].style.visibility = 'hidden';
					}
				}
			}
		}
		// Ta bort alla tidigare felmarkeringar på fält.
		$svjq('.DataError').removeClass('DataError');

		var errors = new Array();
		var personNumber = form.username.value;
		var pin = form.password.value;
		if (null != form.captchaAnswerField)
		{
			var captcha = form.captchaAnswerField.value;
			if (captcha.isEmpty()) {
				errors[errors.length] = 'cms.BlanktCaptcha';
				$svjq('#'+form.captchaAnswerField.id).addClass('DataError');
			}
		}
		
		if (personNumber.isEmpty()) {
			errors[errors.length] = 'cms.BlanktPersonnummer';
			$svjq('#'+form.username.id).addClass('DataError');
		} else if (!personNumber.matchesPnrFormat()) {
			errors[errors.length] = 'cms.OgiltigtFormat';
			$svjq('#'+form.username.id).addClass('DataError');
		} else if (!personNumber.pnrChecksumIsValid()) {
			errors[errors.length] = 'cms.OgiltigtPersonnummer';
			$svjq('#'+form.username.id).addClass('DataError');
		}

		if (pin.isEmpty()) {
			errors[errors.length] = 'cms.BlankPin';
			$svjq('#'+form.password.id).addClass('DataError');
		} else if (pin.length != 5 || !pin.hasOnlyNumerics()) {
			errors[errors.length] = 'cms.EndastSiffror';
			$svjq('#'+form.password.id).addClass('DataError');
		}
	
		if (errors.length > 0) {
			showErrorBox(errorContainer, true, errors);
			form.reset();
			form.elements[0].focus();
			handleFieldErrors(true);
			return false;
		}
		
		/** Tillfällig funktionalitet. Tas bort så snart som möjligt. */
		form.username.value = convertToElwisFormat(form.username.value);
		/**************************************************************/
		
		purgePercentCookies();
	}
	
	return true;
}

/**
*   TILLFÄLLIG FUNKTIONALITET. TAS BORT SÅ SNART SOM MÖJLIGT.
*
*   Av säkerhetsskäl kommenteras och dokumenteras inte den här
*   metoden här. Se istället ERR27570. 
*/
function convertToElwisFormat(username) {
	if (pnrRegExp.test(username)) {

		if (!RegExp.$1.isEmpty()) {
			pnrRegExp.test(username);
			return RegExp.$1 + RegExp.$2 + RegExp.$3 + RegExp.$4 + RegExp.$5;
		}
		
		pnrRegExp.test(username);
		convertedString = RegExp.$2 + RegExp.$3 + RegExp.$4 + RegExp.$5;
		var yearPrefix = new String('19');
		if (new Number(RegExp.$2) < new Number(30)) {
			yearPrefix = new String('20');
		}
		return yearPrefix + convertedString;
	}
	return username;
}


/* Regexp för epostkontroll */
var emailRegExp = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;



/*
*   Strängmetod
*   Returnerar true om strängen matchar formatet för giltig epostadress.
*/
String.prototype.matchesEmailFormat = function() {
	return emailRegExp.test(this);
}


/* Regexp för personnummerkontroll. Uppdelad för snabb åtkomst till fälten för år, månad, dag och nummer. */
var pnrRegExp = /^(\d{2})?(\d{2})(\d{2})(\d{2})\-?(\d{4})$/;



/*
*   Strängmetod
*   Returnerar true om strängen matchar något av de fyra formaten för personnummer.
*/
String.prototype.matchesPnrFormat = function() {
	return pnrRegExp.test(this);
}


/* Regexp för telefonnummerkontroll */
var phoneRegExp = /^[+]?[0-9][^a-z][0-9,-]*$/;


/*
 * Strängmetod
 * Returnerar true om strängen matchar formatet för giltigt telefonnummer.
 */
String.prototype.matchesPhoneFormat = function() {
	return phoneRegExp.test(this);
}


/* Regexp för datumkontroll */
var dateRegExp = /^[0-9]{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])/;


/*
 * Strängmetod
 * Returnerar true om strängen matchar formatet för giltigt datum.
 */
String.prototype.matchesDateFormat = function() {
	return dateRegExp.test(this);
}

/* Reguljärt uttryck för att endast godkänna 7-12 tecken i bankkontonummer. */
var accountRegExp = /^\d{7,12}$/;


/*
 * Strängmetod
 * Returnerar true om strängen matchar formatet för giltigt konto.
 */
String.prototype.matchesAccountFormat = function() {
	return accountRegExp.test(this);
}

/* Reguljärt uttryck för att endast godkänna 4 tecken i clearingnummer. */
var clearingRegExp = /^\d{4}$/;

/*
 * Strängmetod
 * Returnerar true om strängen matchar formatet för giltigt clearingnr.
 */
String.prototype.matchesClearingFormat = function() {
	return clearingRegExp.test(this);
}

/* Reguljärt uttryck för plusgiro. */
var plusgiroRegExp = /^[0-9]{2,8}$/;

/*
 * Strängmetod
 * Returnerar true om strängen matchar formatet för giltigt plusgironr.
 */
String.prototype.matchesPlusGiroFormat = function() {
	var plusgiro = this;
	if (plusgiro.length > 2 && plusgiro.charAt(plusgiro.length - 2) == '-') {
		plusgiro = plusgiro.trim();
		plusgiro = plusgiro.replace("-", "");
	}	
	return plusgiroRegExp.test(plusgiro);
}


/*
*   Strängmetod
*   Returnerar true om strängen är ett personnummer med giltig kontrollsiffra.
*/
String.prototype.pnrChecksumIsValid = function() {
	if (pnrRegExp.test(this)) {
		var convertedString = RegExp.$2 + RegExp.$3 + RegExp.$4 + RegExp.$5;
		// convertedString innehåller år (utan sekelskiftessiffra), månad, dag, och nummer (fyra siffror)
		var nn="";
		for (var n=0 ;n<convertedString.length; n++) {
			nn += ((((n+1)%2)+1)*convertedString.substring(n,n+1));
		}
		var checksum=0;
		for (var n=0; n<nn.length; n++){
			checksum+=nn.substring(n,n+1)*1;
		}
		return (checksum%10==0);
	} else {
		// Här borde vi aldrig hamna eftersom matchesPnrFormat körs först.
		// Å andra sidan måste vi ändå köra test för att snabbt få tillgång
		// till siffrorna och kan därför lika gärna ha else-satsen här.
		return false;
	}
}


function validatePersonNumber(pPersonNumber) {
    pPersonNumber = pPersonNumber.trim();
    pPersonNumber = pPersonNumber.replace("-", "");

    if (pPersonNumber.length == 6 || pPersonNumber.length == 10) {
      pPersonNumber = "19" + pPersonNumber;
    }
    // Checka formatet
    var tDatePart = pPersonNumber.substring(0, 8);
    var tDate;
    
    try {
        tDate = parseInt(tDatePart);
      } catch (nfe) {
        return false;
      }
    // Checka att datumet är schysst.
    var tYear = parseInt(tDate / 10000);
    var tMonth = parseInt((tDate % 10000) / 100);
    var tDay = parseInt((tDate % 100));

    if (tYear < 1900 || tYear > 2100) {     
      return false;
    }

    if (tMonth <= 0 || tMonth > 12) {
      return false;
    }
    
    if (tDay <= 0 || tDay > 31) {
        return false;
    }

    try {
      this.date = Date.parse(tDatePart);
    } catch (pe) {
      // Datumet är inte ett korrekt datum.
      if (tMonth == 0) {
        tMonth = 1;
      }
      var tYyyymmdd = "" + tYear;
      if (tMonth < 10) {
        tYyyymmdd += "0" + tMonth;
      } else {
        tYyyymmdd += tMonth;
      }
      tYyyymmdd += "01"
      try {
        this.date = tDateFormat.parse(tYyyymmdd);
      } catch (e) {
        return false;
      }
    }
    return true;
  }

/**
 * Kontrollerar om en datumsträng befinner sig före dagens datum.
 */
function isFutureDate(dateStr){
	var todayDate = new Date();
	var dateToCheckParts = dateStr.split("-");
	var dateToCheck = new Date(dateToCheckParts[0], dateToCheckParts[1]-1, dateToCheckParts[2]);
	return todayDate.isBeforeDate(dateToCheck);
}

/**
 * Kontrollerar om ett från- och ett till-datum utgör en korrekt period.
 */
function isValidPeriod(fromStr, toStr){
	var fromDateParts = fromStr.split("-");
	var fromDate = new Date(fromDateParts[0], fromDateParts[1]-1, fromDateParts[2]);
	var toDateParts = toStr.split("-");
	var toDate = new Date(toDateParts[0], toDateParts[1]-1, toDateParts[2]);
	return fromDate.isBeforeDate(toDate);
}

/**
 * Kontrollerar om ett datum är före ett annat datum.
 */
Date.prototype.isBeforeDate = function(dateToCheck){
	if (this.getFullYear() < dateToCheck.getFullYear()){
		return true;
	} else if (this.getFullYear() == dateToCheck.getFullYear() && this.getMonth() < dateToCheck.getMonth()){
		return true;
	} else if (this.getFullYear() == dateToCheck.getFullYear() && this.getMonth() == dateToCheck.getMonth() && this.getDate() < dateToCheck.getDate()){
		return true;
	}
	return false;
}

/*
*   
*   Hämtar värdet från cookien med namnet 'name'
*/
function getPercentCookie(name) {
    var value = 0;
    var aCookie = document.cookie.split("; ");
    for (var i=0; i < aCookie.length; i++) {
        var aCrumb = aCookie[i].split("=");
        if (name == aCrumb[0])
            value = unescape(aCrumb[1]);
    }
    return value;
}



/*
*   Hittar alla cookies som använts för att spara fondfördelning för fondbyte.
*/
function purgePercentCookies() {
    var cookieString = document.cookie;
    if (cookieString != null) {
    	cookies=cookieString.split("; ");
    	for (var i=0; i<cookies.length; i++) {
	    cookieParts = cookies[i].split("=");
	    if (cookieParts[0].indexOf('fundDistribution')!=-1) {
	    	deletePercentCookie(cookieParts[0]);
	    }
	}
    }
}



/*
*   Sparar cookie
*/
function setPercentCookie(name, value) {
	document.cookie = name + "=" + value + "; path = /";
}



/*
*   Tar bort cookie
*/
function deletePercentCookie(name) {
	document.cookie = name + "=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/";
}



/*
*   Sparar cookie med värden från formulärfält.
*/
function savePercent(thisitem) {
    setPercentCookie(thisitem.name, thisitem.value);
}



/*
*   Strängmetod
*   Returnerar true om strängen är tom och false i övriga fall.
*/
String.prototype.isEmpty = function() {
	return (this == null || this.trim().length == 0);
}



/*
*   Strängmetod
*   Returnerar true om strängen enbart består av siffror.
*/
String.prototype.hasOnlyNumerics = function() {
	var regexp = /^\d+$/;
	return regexp.test(this);
}



/*
*   Strängmetod
*   Tar bort whitespace från början och slutet av strängen.
*/
String.prototype.trim = function() {
	var newString = this;
	
	var endTrim = /((\s*\S+)*)\s*/;
	newString = newString.replace(endTrim, "$1");
		
	var leadTrim = /\s*((\S+\s*)*)/;
	newString = newString.replace(leadTrim, "$1");

	return newString;
}

/**
 * Returnerar innehållet i en sträng mellan två tecken.
 */
String.prototype.substringBetween = function(startChar, endChar){
	if (startChar == null){
		return this.substring(0, this.indexOf(endChar));
	} else if (endChar == null){
		return this.substring(this.indexOf(startChar)+1, this.length);
	} else {
		var firstString = this.substring(this.indexOf(startChar)+1, this.length);
		return firstString.substring(0, firstString.indexOf(endChar));
	}
}

/*
*   Arraymetod
*   Returnerar true om arrayen innehåller testvärdet
*/
Array.prototype.contains = function(testVal) {
	for (var i=0; i<this.length; i++) {
		if (this[i] == testVal) {
			return true;
		}
	}
	return false;
}



/*
*   Gör en formulärknapp inaktiv. Om felaktigt id angivits
*   för knappen händer ingenting.
*/
function disableButton(buttonId) {
	var button = document.getElementById(buttonId);
	if (button) {
		button.disabled = true;
	}
}


/*
*   Öppnar fönstret med talsyntes
*/
function openTalsyntes(){
	url= escape(location.href);
	newWin = window.open('http://isi.phoneticom.com/cgi-bin/ppmrsone?customerid=59&url='+url,'talsyntes','width=790, height=590');
	newWin.focus();
}


/*
 * Redirectar användaren till sidan som gäller för det inloggninssätt som valts dropdownmeny. * 
 */
function redirectLogin(url) {
	if(url == null || url.isEmpty()) {
		return false;
	}
    window.location.href = url;
}



/*
*	Fokuserar på första fältet i första formuläret med inmatningsfält 
*   (om det finns något sånt på sidan). 
*	Egentligen är det här en halvsanning eftersom de första två formulären
*   undantas då de förutsätts vara sidans sitemap och sökformulär. Vi 
*   letar alltså igenom samtliga formulär från och med det tredje tills
*   vi stöter på första text- eller lösenordsfält. 
*
*   Specialfallet är loginformuläret, vars sida använder en annan layout.
*   Där finns inga andra formulär och vi kan direkt identifiera personnummerfältet.
*/
function focusOnFirst() {
	var tmpForm, tmpElement;
	if (document.LogonForm && document.LogonForm.username) {
		with (document.LogonForm.username) {
			focus();
			select();
		}
	} else {
		$svjq('form').each(function(index) {
		    if (index > 1){ // Hoppa över de två första formulären.
		    	// Hitta första elementet som inte har klassen "nofocus", är synligt och editerbart.
		    	var firstField = $svjq(this).find(':input:not(.nofocus):visible:enabled:first');
		    	if (firstField != null && firstField.length != 0){
		    		firstField.focus();
		    		return false;
		    	}
		    }
		});
	}
	return;
}

/**
 * Ändrar ev. felmeddelandelänkar (länkar i felsummeringsytan) som pekar på resp. felfält.
 * Hanterar felhantering för fältfel (visar/döljer). 
 */
$svjq(document).ready(function() {
	// Fixa så att felmeddelandelänkarna pekar rätt.
	$svjq('.errorMsgList').find('li a').each(function(){
		var href = $svjq(this).attr('href');
		$svjq(this).attr('href', href.substring(href.indexOf('#'), href.length));
	});
	
	handleFieldErrors(false);
});

/**
 * Hanterar felhantering för fältfel.
 * 
 * @param clearErrors True om gammal felhantering ska rensas bort, false annars.
 */
function handleFieldErrors(clearErrors){
	// Rensa/dölj ev. felhantering.
	if(clearErrors){
		$svjq('.DataErrorMsg').hide();
		$svjq('label.apansokanxfel').removeClass('apansokanxfel');
		$svjq('label.apansokanxfeltext span:not(:first-child)').remove();
	}
	
	// Visa felhantering för de fält som har fel.
	$svjq('.DataError').each(function(i,e) {
		// Hitta felmeddelandeyta.
		var errMsgArea = getErrorMsgBody($svjq(this), '.DataErrorMsg');
		// Har fel-fältet en label?
		var label = $svjq(this).parent().parent().find('label.label');
		if (label != null && label.length > 0){
			// Markera fel-fältets label som felaktig.
			label.addClass('apansokanxfel');
			// Uppdatera felmeddelandetexten med rubriktexten.
			var errMsgLabel = errMsgArea.find('label');
			var errorLabels = new Array();
			label.each(function(){
				var labelText = $svjq(this).text();
				if ($svjq.inArray(labelText, errorLabels) == -1){
					errorLabels.push(labelText);
					errMsgLabel.append('<span style="text-decoration:none;">' +(errMsgLabel.text().length > 13 ? ', ' : '&nbsp;') +labelText.toLowerCase() +'</span>');
				}
			});
		}
		// Om felmeddelandeytan är gömd.
		if (errMsgArea.is(':hidden')){
			// Visa felmeddelandeytan.
			errMsgArea.show();
		}
	});
	
	// Hämta alla felmeddelandeytor som är synliga.
	$svjq('.DataErrorMsg:visible').each(function(){
		// Om fler än ett felmeddelande, lägg in ett 'och' framför sista meddelandet.
		var lastErrMsg = $svjq(this).find('span:last');
		if (lastErrMsg.text().charAt(0) == ','){
			lastErrMsg.text(lastErrMsg.text().replace(',', ' och'));
		}
	});
}

/**
 * Letar upp ett html-element baserat på en selector genom att rekursivt loopa sig uppåt i dom-strukturen.
 * 
 * @param element
 * @return
 */
function getErrorMsgBody(element, selector){
	var errMsgBody = null;
	while(errMsgBody == null){
		var parent = element.parent();
		if (parent.is(selector)){
			errMsgBody = parent;
		} else {
			var sibling = parent.children(selector);
			if (sibling != null && sibling.length > 0){
				errMsgBody = sibling;
			}
		}
		element = parent;
	}
	return errMsgBody;
}

/*
 * Trunkerar långa namn i inloggningsportleten.
 * Den här funktionen använder en jquery-plugin
 * för att ge trunkeringsstöd i Firefox (IE får
 * stödet via portletLayouts.css).
 */
$svjq(document).ready(function() {
    $svjq("#name").ellipsis();
});

/*
* Lägger på en tooltip till alla länkar med klassnamnet
* "tooltip". Använder ett jquery-plugin för att ge
* generellt tooltipstöd.
*/
$svjq(document).ready(function() {
    // Gå igenom samtliga tooltip-texter för att se om de är escapade eller inte. Om de är det måste de unescapas så att HTML-länkar och formattering fungerar.
    // OBS! Samtliga tooltip-texter bör hämtas escapade för att redaktionella länkar inte ska modifieras av SV. (Därav behovet av denna funktion)
    $svjq('.toolTipText').each(function(i,e) {
      var textcontent = $svjq(e).html();
      if (textcontent.match('&lt;') || textcontent.match('&gt;')) {
        // Den här texten innehåller escapad HTML-kod som måste konverteras. 
        var tmp = document.createElement('div');
        tmp.innerHTML = textcontent;
        $svjq(e).html(tmp.childNodes[0].nodeValue);
      } else {
        // Den här texten är redan encodad och inget behöver göras.
      }
   });
   
   // Sökväg till stäng-knappsbild (skrivs över från chimera).
   var cluetipDefaultCloseImgUrl = '/webdav/images/Gemensam/Formular/Forklbox/forklbox_stang.gif';
   if (typeof cluetipCloseImgUrl != 'undefined'){
	   cluetipDefaultCloseImgUrl = cluetipCloseImgUrl;
   }
    
   $svjq('.tooltip').cluetip({
    width: 450,
    activation: 'click',
    positionBy: 'bottomTop',
    closeText: '<img src="' +cluetipDefaultCloseImgUrl +'" border="0" alt="St&auml;ng" style="float: right" /><div style="clear:both" />',
    dropShadow: false,
    showTitle: false,
    local: true,
    hideLocal: false,
    sticky: true,
    onActivate: function(e) {if($svjq("#cluetip-inner").html() != '') { $svjq("#cluetip-inner").html('')}; return true;}
  });
});


/*
*  Generell funktionalitet för det som händer när sidan laddas. (Eftersom vi saknar
*  tillgång till bodytaggen och inte kan styra över vilka funktioner som ska laddas när,
*  samlas dessa därför här och anropas vid rätt tillfälle.)
*/
$svjq(document).ready(function() {
	// Om dokumentet innehåller fondbytesformuläret ska siffror förladdas om 
	// kakor är satta. Anropar fundChange.js
	if (document.fundChangeForm) {
		populateFields();
	} else if (document.getElementById('cancelFundChangeAndPurgeCookies') != null){
		// Om dokumentet innehåller det här elementet innebär det att vi ska rensa kakorna
		// med inmatad fördelning. Den här funktionen körs från sidorna för att ta bort och avbryta
		// fondbyte eftersom fördelning inte ska förifyllas om man påbörjar ett nytt fondbyte efter
		// att ha avbrutit ett byte i steg 2. 
		purgePercentCookies();
	}
		
	// Fokusera på första inmatningsfältet i första formuläret.

	focusOnFirst();
});

/**
* Readspeaker behöver id på en behållare (span/div) för att veta vad som ska läsas upp.
* Vi använder klassnamn på behållaren för att få tag på behållarens id och göra om
* Readspeaker-länken.
*/
$svjq(document).ready(function() {
    if ($svjq("a.rs_link").length) {
    	if ($svjq('div.readspeakercontentstart') == 1) {
    	    id = $svjq('div.readspeakercontentstart').attr('id');
	        $svjq("a.rs_link").each(function() {
    	    	link = $svjq(this).attr("href").replace('readspeakercontent', id);
	    	    $svjq(this).attr('href', link);
	        }) ;
        }
    }
});

/*
*  Vanliga frgors funktionalitet för att visa och dölja svaret via klickbarhet.
*  De listas genom en nyhetsmodul, där varje fråga/svar består av 2 DIVar, en med frågan och en med svaret
*  För att rätt div ska öppnas/stängas tilldelas divarna IDn baserat på nyhetsartikelns Sitevision-identifier.
*/
function toggleFAQ(answerID) {

	var questionID = "1"+answerID;
	var answerclass = document.getElementById(answerID);
	var questionclass = document.getElementById(questionID);
	
	if(answerclass.className == "faqxvisasvar") {
    		answerclass.className = "faqxdoljsvar";
			questionclass.className = "faq_collapse";
  	}
	else {
		answerclass.className = "faqxvisasvar";
		questionclass.className = "faq_expand";
	}
} 



/*
*  Gör SELECT-menyn länkbar
*  Tar det valda objektet i en SELECT-meny och skickar till URL:en i <option value="... 
*/
function dropdown(mySel)
{
var myWin, myVal;
myVal = mySel.options[mySel.selectedIndex].value;
if(myVal)
   {
   if(mySel.form.target)myWin = parent[mySel.form.target];
   else myWin = window;
   if (! myWin) return true;
   myWin.location = myVal;
   }
return false;
}


/*
*  Skript för att hantera filmspelaren och dess funktioner 
*/

//Dimma sidan och visa flashspelaren med de parametrar som skickas in
function displayFlash(baseURL, movieName){
	//Gå till sidans första DIV för att kunna dölja den
	var elementToHide = $svjq('#loadingbar_area').parent().parent().parent();
	
	// Skapa en dimmad div med rätt proportioner.
	var pageSize = getPageSize();
	elementToHide.append('<div id="BGElement" style="top:0px; left:0px; width:' +pageSize[0] +'px; height:' +pageSize[1] +'px;"></div>');
	
	// Skapa div:ar för flash-elementen.
	var loadHtml = '<div id="FlashElement">';
	loadHtml += '<div id="FlashContainer">';
	// Information för användare utan Flash Player, lägger sig bakom filmspelaren
	loadHtml += '<div id="noFlash">';
	loadHtml += '<a href="http://get.adobe.com/flashplayer/" target="_blank" style="position:relative; text-align:center;" alt="H&auml;mta Adobe Flash Player">';
	loadHtml += '<img id="noFlashBanner" src="' +window.location.protocol +'//www.adobe.com/images/shared/download_buttons/get_adobe_flash_player.png" border="0"></img>';
	loadHtml += '</a>';
	loadHtml += '<span class="brodtextxhogerpuff" style="margin-top:15px; display:block; position:relative; text-align:center;">';
	loadHtml += 'Adobe Flash Player kr&auml;vs f&ouml;r att spela upp filmer p&aring; Pensionsmyndigheten.<br />Klicka p&aring; knappen ovan f&ouml;r att ladda ner senaste versionen.<p /><a href="javascript:void(0)" onclick="hideFlashElement()">St&auml;ng f&ouml;nster</a>';
	loadHtml += '</span>';
	loadHtml += '</div>';
	loadHtml += '</div>';
	loadHtml += '</div>';
	elementToHide.append(loadHtml);
				
	//Ladda filmspelaren
	var so = new SWFObject( baseURL+"pmu-player.swf", "Pensionsmyndighetens filmspelare", "100%", "480", "7", "#66666");
	so.addParam( "wmode", "transparent" );
	so.addParam( "allowFullScreen", true );
	so.addVariable( "fileLoadPrefix", "/" );
	so.addVariable( "baseURL", baseURL+movieName+".xml" );
	so.write("FlashContainer");
}

//För stäng-knappen i filmspelaren (anropas från XML-filen)
function hideFlashElement(){
	if($svjq('#BGElement') != null && $svjq('#FlashElement') != null){
		$svjq('#BGElement').remove();
		$svjq('#FlashElement').remove();
	}
}

// Hämtar sidans storlek för att sätta BGElements storlek
function getPageSize(){
	
	var xScroll, yScroll;
	
	if (window.innerHeight && window.scrollMaxY) {	
		xScroll = document.body.scrollWidth;
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}
	
	var windowWidth, windowHeight;
	if (self.innerHeight) {	// all except Explorer
		windowWidth = self.innerWidth;
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body) { // other Explorers
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}	
	
	// for small pages with total height less then height of the viewport
	if(yScroll < windowHeight){
		pageHeight = windowHeight;
	} else { 
		pageHeight = yScroll;
	}

	// for small pages with total width less then width of the viewport
	if(xScroll < windowWidth){	
		pageWidth = windowWidth;
	} else {
		pageWidth = xScroll;
	}


	arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) 
	return arrayPageSize;
}

//Bokmärkesfunktionen (anropas från xml-filen)
function bookmark(url, title){

if (window.sidebar) // firefox
    window.sidebar.addPanel(title, url, "");
else if(window.opera && window.print){ // opera
    var elem = document.createElement('a');
    elem.setAttribute('href',url);
    elem.setAttribute('title',title);
    elem.setAttribute('rel','sidebar');
    elem.click();
}
else if(document.all)// ie
    window.external.AddFavorite(url, title);
}

/* Selected text cleaning function */
function cleanSelectedString(theString)
{
	var comments = theString.match(/<!--/gi);
	var temp = "";
	if(comments != undefined)
	{
		for(i=0;i<comments.length;i++)
		{
			var temp = theString.substring(theString.search(/<!--/gi),theString.search(/-->/gi)+3);
			theString = theString.replace(temp,"");
		}
	}
	var regexp = /(<\/?[A-Z]+[0-9]?)\s?[^>]*>/gi
	theString = theString.replace(regexp, "$1>");
	var regexp2 = /<\/?[A-Z]+[0-9]?\s?>/gi
	theString = theString.replace(regexp2, function(m) { return returnTags(m);});
	var regexp_spaces = /\s+?\s*/gi
	theString = theString.replace(regexp_spaces, " ");	
	var regexp_br = /(<br>)+?\s?(<br>\s*)*/gi
	theString = theString.replace(regexp_br, "<br>");	
	return theString;
}

function returnTags(thematch)
{ 
	var regtag = /<\/?(h[1-6]|a|area|ul|ol|dl|dd|dt|li|table|td|tr|th|p|hr|br)>/i
	if(regtag.test(thematch))
	{ 
		return thematch;
	} 
	else 
	{
		return "";
	}
}

window.onunload = function exit() {
	return true;
};

