﻿var sBrowser;
var sVersion;
var sVersionMajorAndMinor;
var sMSIE = 'Microsoft Internet Explorer';
var sMozilla = 'Netscape';
var sOpera = 'Opera';
validBrowser();
// ISSUE Replace sVersion with iVersion
var fTooOld = false;

function validBrowser() {
	var sMsg = '';
	if (navigator.userAgent.indexOf(sOpera) > -1) { 
		sBrowser = sOpera;
	}
	else {
		sBrowser = navigator.appName;	
	};
	switch (sBrowser) {
		case sMSIE:
			sVersionMajorAndMinor = navigator.appVersion.substr((navigator.appVersion.indexOf('MSIE') + 'MSIE'.length + 1), 3);
			break;
		case sMozilla:
			sVersionMajorAndMinor = navigator.userAgent.substr((navigator.userAgent.indexOf(sMozilla) + sMozilla.length + 1), 3);
			break;
		case sOpera:
			sVersionMajorAndMinor = navigator.appVersion.substr(0, 3);
			break;
	};
	sVersion = sVersionMajorAndMinor.substr(0, 1);
// ISSUE: sBrowser = sMSIE; set for debugging purpose!
// sBrowser = sMSIE; // DEBUG
// ISSUE: sVersion = '5'; set for debugging purpose!
// sVersion = '5'; // DEBUG

	// For browsers that do not handle the getCookie function
	//if (sBrowser != sOpera) {
		if (getCookie('browserValidated') == '1') {
			return;
		};
	//};
	
	// Opera version 6 tells us it is in fact version 4. And for the appName property it tells it is MSIE!
	if ((sBrowser == sMSIE && sVersion < '4') || (sBrowser == sMozilla && sVersion < '5') || (sBrowser == sOpera && sVersion < '4')) {
		fTooOld = true;
		sMsg += 'Your browser (' + sBrowser + ', version: ' + sVersion + ') is too old to render our current pages properly.' + '\n'
		sMsg += 'We will later provide a version of our pages for browsers and versions' + '\n' + 'not sufficient compatible with our current pages.'
	}
	else if (sBrowser != sMSIE && sBrowser != sMozilla && sBrowser != sOpera) {
		sMsg = 'Your browser is not validated with respect to compatibility with this Site.';
	};
	if (sMsg > '') {
		sMsg += '\n' + 'This Site is currently best viewed with ' + sMSIE;
		alert(sMsg);
	};
	// For browsers that do not handle the setCookie function
	//if (sBrowser != sOpera) {
		setCookie('browserValidated', '1', '', -12, '/');
	//};
};


function findFrame(frameName) {
	if (top == null) {
		return false;
	};
	if (frameName == '_top') {
		return top;
	};		
	var frames = top.frames;
	if (frames.length == 0) {
		return false;
	};
	for(var i=0; i < frames.length; i++) {
		tmpFrame = frames[i];
	    if (tmpFrame.name.toUpperCase() == frameName.toUpperCase()) {
			return frames[i];
		};
	};
	return false;
};

// from the xbdhtml.js script file
function fnGetElement() {
	if (sBrowser == sMozilla && sVersion == '4') {
		var currentLayer = document.layers[fnGetElement.arguments[0]];
		for (var i = 1; i < fnGetElement.arguments.length && currentLayer; i++) {
			currentLayer = currentLayer.document.layers[fnGetElement.arguments[i]];
		};
		return currentLayer;
	} 
	else if (document.getElementById && document.getElementsByName) {
		var name = fnGetElement.arguments[fnGetElement.arguments.length-1];
		if (document.getElementById(name)) { //First try to find by id
			return document.getElementById(name);
		}
		else if (document.getElementsByName(name)) { //Then if that fails by name
			return document.getElementsByName(name)[0];
		};
	}
	else if (sBrowser == sMSIE && sVersion > '3') {
		var elt = eval('document.all.' + fnGetElement.arguments[fnGetElement.arguments.length-1]);
		return(elt);
	};
};

//ISSUE: Implementere Keys og soerge for Trim() og Uppercase (case insensitivity) for getCookie og SetCookie
function getCookie(sName) {
	if (sBrowser == sMSIE) {
		if (window.clientInformation) {
			if (window.clientInformation.cookieEnabled != true) {
				return null;
			};
		};
	};
	var aCookie = document.cookie.split("; ");
	for (var i=0; i < aCookie.length; i++) {
		var aCrumb = aCookie[i].split("=");
		if (sName == aCrumb[0]) {
			return unescape(aCrumb[1]);
		};
	};
	return null;
};

//ISSUE: Implementere Keys og soerge for Trim() og Uppercase (case insensitivity) for getCookie og SetCookie
function setCookie(sName, sValue, sDomain, sOffset, sPath) {
	var sPairDomain = '';
	var sPairOffset = '';
	var sPairPath = '';
	
	if (sBrowser == sMSIE) {
		if (window.clientInformation) {
			if (window.clientInformation.cookieEnabled != true) {
				return;
			};
		};
	};

	if (sDomain !== '') {
		sPairDomain = 'domain=' + sDomain + ';';
	};
	if (sOffset !== '') {
		sPairOffset = 'expires=' + sOffset + ';';
	};
	if (sPath !== '') {
		sPairPath = 'path=' + sPath + ';';
	};
	
	var oDate = new Date();
	oDate.setUTCDate(eval(sOffset + 12));
	sOffset = oDate.toUTCString();
	
	//alert(sName + '=' + sValue + '\n' + sPairDomain + '\n' + sPairOffset + '\n' + sPairPath)
	//document.cookie = sName + '=' + escape(sValue) + ';domain=' + sDomain + ';expires=' + sOffset + ';path=' + sPath + ';';
	document.cookie = sName + '=' + escape(sValue) + ';' + sPairDomain + sPairOffset + sPairPath
};

function getCookiePrivate(sName) {
    var aCookie = document.cookie.split(';');
    for (var i=0; i < aCookie.length; i++) {
    var aCrumb = aCookie[i].split('=');
    if (sName == aCrumb[0])
        return unescape(aCrumb[1]);
    };
    return null;
};

function setCookiePrivate(sName, sValue, sDomain, sOffset, sPath) {
    var sPairDomain = '';
    var sPairOffset = '';
    var sPairPath = '';
    if (sDomain !== '') {
        sPairDomain = 'domain=' + sDomain + ';';
    };
    if (sOffset !== '') {
        sPairOffset = 'expire=' + sOffset + ';';
    };
    if (sPath !== '') {
        sPairPath = 'path=' + sPath + ';';
    };
    var oDate = new Date();
    oDate.setUTCDate(eval(sOffset + 12));
    sOffset = oDate.toUTCString();
    document.cookie = sName + '=' + escape(sValue) + ';domain=' + sDomain + ';expires=' + sOffset + ';path=' + sPath + ';';
    document.cookie = sName + '=' + escape(sValue) + ';' + sPairDomain + sPairOffset + sPairPath
};

function IDExists(sID) {
	if (fnGetElement(sID)) {
		return true;
	}
	else {
 		return false;
	};
};

// ISSUE: Synkroniseres med fnsReadQuery.
// Flyttes til Common script file?
function ReadQuery(Value, sQuery) {
	var r = '', sTemp, posData;
	if (Value == 'undefined' || sQuery == 'undefined') return r;
	if (sQuery == '' || Value == '') return r;
	if (sQuery.indexOf(Value) == -1) return r;
	if (sQuery.charAt(sQuery.length) !== '&') sQuery = sQuery + '&';
	posData = sQuery.indexOf(Value) + Value.length + 1;
	sTemp = sQuery.substr(posData);
	r =  sTemp.substring(0, sTemp.indexOf('&'));
	if (isNaN(r) == false && r !== '') r = eval(r);
	return r;
};

function fnsReadQuery(sValue, sQuery) {
    var r = '';
    var sTemp;
    var posData;
    if (sValue && sQuery) {
    }
    else {
        return r;
    };
    if (sQuery == '' || sValue == '') {return r};

    var sQueryOrig = sQuery;
    sQuery = sQuery.toLowerCase();
    var sValueOrig = sValue;
    sValue = sValue.toLowerCase();

    if (sQuery.indexOf(sValue) == -1) {
        return r;
    };
    if (sQuery.charAt(sQuery.length) !== '&') {
        sQuery += '&';
    };
    // Assume encoded ampersand ('&amp;')
    if (sQuery.indexOf(sValue) > -1) {
		while (sQuery.charAt(sQuery.indexOf(sValue) - 1) != ';' & sQuery.charAt(sQuery.indexOf(sValue) - 5) != '&') {
		    sQuery = sQuery.substr(sQuery.indexOf(sValue) + sValue.length);
		    if (sQuery.indexOf(sValue) == -1) {
				break;
			};
		};
	};
    if (sQuery.indexOf(sValue) == -1) {
        return r; //???? ISSUE!
    };

	// Try first Case Sensitive...
    if (sQueryOrig.indexOf(sValueOrig) > -1) {
		posData = sQueryOrig.indexOf(sValueOrig) + sValue.length + 1;
		sTemp = sQueryOrig.substr(posData);
		r =  sTemp.substring(0, sTemp.indexOf('&'));
	}

	// If no match try all lowercase
	else {
		posData = sQuery.indexOf(sValue) + sValue.length + 1;
		sTemp = sQuery.substr(posData);
		r =  sTemp.substring(0, sTemp.indexOf('&'));
    };
    if (isNaN(r) == false && r !== '') {
        r = eval(r);
    };
    if (r) {
		r = r.toString();
    };
    return r;
};

function getCollection(sValue, sAttribute, oOuterObject, sTagType) {
//ISSUE: Convert a single instance into a collection with a single member
	var r = new Array(), oStart, oItem, j = 0;
	if (oOuterObject) {oStart = oOuterObject;} else {oStart = document.body;};

	if (IsEmpty(sValue) == true && IsEmpty(sAttribute) == true && IsEmpty(sTagType) == true) {
		if (oOuterObject) {
			r = oOuterObject.getElementsByTagName('*');
		}
		else {
			r = document.getElementsByTagName('*');
		};
	}
	else {
		if (!sValue > '') {sValue = 'true';};
		if (!sAttribute > '') {sAttribute = 'id';};

		if (document.all && sAttribute.toUpperCase() == 'ID') {
			r = oStart.all(sValue);
		}
		else {
			for (var i = 0; i < oStart.getElementsByTagName('*').length; i++) {
				oItem = oStart.getElementsByTagName('*')[i];
				if (sTagType > '') {
					if (oItem.tagName.toUpperCase() == sTagType.toUpperCase()) {
						if (oItem.getAttribute(sAttribute)) {
							if (oItem.getAttribute(sAttribute).toUpperCase() == sValue.toUpperCase()) {
								r[j] = oItem;
								j += 1;
							};
						};
					};
				}
				else {
					if (oItem.getAttribute(sAttribute)) {
						if (oItem.getAttribute(sAttribute).toUpperCase() == sValue.toUpperCase()) {
							r[j] = oItem;
							j += 1;
						};
					};
				};
			};
		};
	};
	return r;
};

function setCollection(oColl, sAttrToSet, sData, fData_Append) {
    if (!oColl) return true;
    for (var i = 0; i < oColl.length; i++) {
        //ISSUE: Style is a property its another task to handle as its an object with subvalues
        var sDataNew = sData
        if (fData_Append == true && IsUndefined(oColl[i].getAttribute(sAttrToSet)) == false) {
            if (sAttrToSet.toLowerCase() == 'style') {
                sDataNew = oColl[i].getAttribute(sAttrToSet).cssText + sData;
            }
            else {
                sDataNew = oColl[i].getAttribute(sAttrToSet) + sData;
                oColl[i].setAttribute(sAttrToSet, '', 0);
            };
        };
        if (sAttrToSet.toLowerCase() == 'style') {
            oColl[i].getAttribute(sAttrToSet).cssText = sDataNew;
        }
        else {
            oColl[i].setAttribute(sAttrToSet, sDataNew, 0);
        };
        //alert(oColl[i].getAttribute(sAttrToSet));
    };
	return true;
};

//var fResizeRunning = false, fResizeRunning2 = false;
var oColl; // ISSUE: Lage en mere intelligent caching mekanisme senere
var fFirstTimeInsideScroll = true;
function insideScroll(sAttribute, iMargin, iDelay) {
	//if (iDelay < 1) {
		//if (fResizeRunning2 == false) {
			//fResizeRunning2 = true;
			var oRoot = document.body, sElement = 'div';
			if (!sAttribute > '' || sAttribute == 'undefined') {sAttribute = 'insideScroll';}; // if (sAttribute == 'undefined') {sAttribute = 'insideScroll';}; // Virker bare når kalles via SetTimeout!
			if (!oColl) { // ISSUE: Lage en mere intelligent caching mekanisme senere
				oColl = getCollection('true', sAttribute, oRoot, sElement);
			};
			var iElements = 1;
			for (var i = 0; i < oColl.length; i++) {
				with (oColl[i]) {
					if (tagName.toLowerCase() != 'iframe') {
						style.display = 'none';
					};
				};
			};
			for (var i = 0; i < oColl.length; i++) {
				var oObj = oColl[i], iPrev = 1;
				if (oObj) {
					with (oObj.style) {
						var oParent = oObj.parentNode;
						
						if (i < oColl.length - 1) {
							if (oParent != oColl[i + 1].parentNode) {
								iElements = 1;
							};
						};
						if (i == 0) {iPrev = 0;};
						if (oParent != oColl[i - iPrev].parentNode || i == 0) {
							for (var j = i + 1; j < oColl.length; j++) {
								if (oParent == oColl[j].parentNode) {
									iElements += 1;
								}
								else {
									break;
								};
							};
						};
						if (oObj.nodeName.toLowerCase() == 'iframe') {
							return;
						};
						var iParentHeight = oParent.clientHeight;
						var iParentWidth = oParent.clientWidth;
						if (iParentHeight == 0) {iParentHeight = oParent.scrollHeight;};
						if (iParentWidth == 0) {iParentWidth = oParent.scrollWidth;};
						iParentHeight = iParentHeight / iElements
						if (iMargin > '' && iMargin != 'undefined') {
							if (iParentWidth > iMargin) {iParentWidth -=  iMargin;};
							if (iParentHeight > iMargin) {iParentHeight -=  iMargin;};
						}
						else {
							var iMargin = 0;
						};
						if (overflow != 'auto') {overflow = 'auto'};
						if (height != iParentHeight.toString() + 'px') {height = iParentHeight.toString() + 'px'};
						if (width != iParentWidth.toString() + 'px') {width = iParentWidth.toString() + 'px'};
						display = ''; // 'inline' dont work the expected way with Mozilla and Opera
						if (fFirstTimeInsideScroll == true) {  // once more for Opera and Mozilla
							fFirstTimeInsideScroll = false;
							if (iDelay == 0) {setTimeout('insideScroll(\'' + sAttribute + '\', \'' + iMargin + '\', -1);', 25);};
						};
					};
					//fResizeRunning2 = false;
					//fResizeRunning = false;
				};
			};
		//}
		//else {
		//	setTimeout('insideScroll(\'' + sAttribute + '\', \'' + iMargin + '\', 0);', 50);
		//};
	//}
	//else if (fResizeRunning == false) {
	//	fResizeRunning = true;
	//	setTimeout('insideScroll(\'' + sAttribute + '\', \'' + iMargin + '\', 0);', 500);
	//};
};




// NEW RESOURCES 12 okt 2004: http://webfx.eae.net/dhtml/ieemu/htmlmodel.html
//							  http://webfx.eae.net/dhtml/mozInnerHTML/mozInnerHtml.html
//							  http://www.codingforums.com/archive/index.php/t-2416

// ISSUE: Make also cross browser versions of insertAdjacentHTML (and -Text)
function insertAdjacentElementCB(sWhere, oElementMoved, oElementTarget) {
	// sWhere Required. String that specifies where to insert the HTML element, using one of the following values: 
		// beforeBegin Inserts oElement immediately before the object
		// afterBegin Inserts oElement after the start of the object but before all other content in the object 
		// beforeEnd Inserts oElement immediately before the end of the object but after all other content in the object.
		// afterEnd Inserts oElement immediately after the end of the object. 
	// oElement Required. Object that specifies the element to be inserted adjacent to the object that invoked the insertAdjacentElement method.
	// Returns oElement at the new location
						


// CBrowser elements to be used:
// object.childNodes(iIndex)
// oElement = object.insertBefore(oNewNode [, oChildNode]) // insertAfter don't exist
// oElement = object.appendChild(oNode)
// [oElement = ] object.parentNode
// [oElement = ] object.nextSibling 
// [oElement = ] object.previousSibling

	var oNew;
	switch (sWhere)  {
		case 'beforeBegin':
			oNew = oElementTarget.parentNode.insertBefore(oElementMoved, oElementTarget);
			break;
		case 'afterBegin':
			if (oElementTarget.childNodes.length > 0) {
				oNew = oElementTarget.insertBefore(oElementMoved, oElementTarget.childNodes(oElementTarget.childNodes.length - 1));
			}
			else {
				oNew = oElementTarget.insertBefore(oElementMoved);
			};
			break;
		case 'beforeEnd':
			oNew = oElementTarget.parentNode.appendChild(oElementMoved);
			break;
		case 'afterEnd':
			if (oElementTarget.parentNode.childNodes.length > 0) {
				var oSib = oElementTarget.parentNode.childNodes(0).nextSibling;
				oNew = oSib.insertBefore(oElementMoved, oElementTarget);
			}
			else {
				oNew = oElementTarget.parentNode.appendChild(oElementMoved);
			};
			break;
		default:
	};
	return oNew;						
};

// ISSUE: Teste å sette in tekst direkte i f.eks. appendChild() istedenfor å bruke objekt som argument gjennom createElement. Har sett eksempler på det.
function insertAdjacentElementTest(sWhere, oElementMoved, oElementTarget) {
	var oDivPicturesEnabled = document.createElement('div');
	oDivPicturesEnabled.id = 'picturesEnabled';
	oDivPicturesEnabled.innerHTML = '<img src="/picturesEnabled.gif">';
	insertAdjacentElementCB('afterEnd', oDivPicturesEnabled, document.getElementById('dump'));
};
					
function fnfPicturesEnabled() {
	// ISSUE Opera dont take - at least locally so far - cookis from asp page. Takes however from javascript client side.
	var sReturn = getCookie('picturesEnabled');
	setCookie('picturesEnabled', '0', '', -12, '/');
	if (sReturn == '1') {
		return true;
	}
	else {
		return false;
	};	
};
					
function onReady() {
	//if (document.readyState == 'complete') {
		if (fnfPicturesEnabled() == false) {
			//document.getElementById('noPictures').style.display = 'inline';
		}
		else {
			document.getElementById('noPictures').style.display = 'none';
		};
	//};
};

function IsEmptyVarOrUndefAttr (oArg) {
	if (IsEmpty(oArg) == true || IsUndefined(oArg) == true) {
		return true;
	}
	else {
		return false;
	};
};

function IsEmpty (oArg) {
	if (!oArg && oArg != '') {
		return true;
	}
	else {
		return false;
	};
};

function IsUndefined (oAttribut) {
	if (oAttribut == undefined) {
		return true;
	}
	else {
		return false;
	};
};

function swapClassNames (sPairs, sIDOuter) {
	var sStatusOrig = window.status;
	try {
		var oAll = getCollection( null, null, document.getElementById(sIDOuter)); // document.getElementById(sIDOuter).getElementsByTagName('*')
		var aPairs = sPairs.split(';'), aPair = sPairs.split(';'), aPair;
		window.status = 'Swapping Classes...';
		for (var i = 0; i < aPairs.length; i++) {
		    aPair = aPairs[i].split(':');
			if (aPair[0] > '' && aPair[1] > '') {
				for (var j = 0; j < oAll.length; j++) {
					if (oAll[j].className == aPair[0]) oAll[j].className = aPair[1];
				};
			};
		};
	}
	catch (e) {
	};
	window.status = sStatusOrig;
};

function getState(vValue, fTriState) {
    // ISSUE: Erstatte "Ja" etc med en variabel for klient-spraakets spraakversjon
	vValue = vValue.toUpperCase();
    if (fTriState != true) {
        switch (vValue) {
            case '1':
                return true;
            case 'TRUE':
                return true;
            case 'Y':
                return true;
            case 'Yes':
                return true;
            case 'JA':
                return true;
            case 'J':
                return true;
            case true:
                return true;
            case 'ENABLE':
                return true;
            default:
                return false;
        };
    }
    else {
        switch (vValue) {
            case '2', 2, '':
                return 2;
            case '1':
                return 1;
            case 'TRUE':
                return 1;
            case 'Y':
                return 1;
            case 'Yes':
                return 1;
            case 'JA':
                return 1;
            case 'J':
                return 1;
            case true:
                return 1;
            case 'ENABLE':
                return 1;
            case '0':
                return 0;
            case 'FALSE':
                return 0;
            case 'N':
                return 0;
            case 'NO':
                return 0;
            case 'NEI':
                return 0;
            case false:
                return 0;
            case 'DISABLE':
                return 0;
            default:
                return 2;
          };
    };
};

function reposScroll2(oElementToScroll) {
    if (oElementToScroll) {
        if (oElementToScroll.scrollTop) {
            if (getCookie('reposScroll') == '1') {
	            oElementToScroll.scrollTop = parseInt(getCookie('scrollTop'));
	            setCookie('reposScroll', '0', '', -12, '/');
            }
            else {
	            oElementToScroll.scrollTop = 0;
            };
        };
    };
};

function reloadPage(oElementToScroll) {
    setCookie('reposScroll', '1', '', '', '/');
    setCookie('scrollTop', oElementToScroll.scrollTop, '', '', '/');
    document.location.reload();
};

function isNumeric(value) {return isFinite((value * 1.0) );};
function getNumber(value) {
    //ISSUE: Not finished: Wash away spaces and commas, replace decimal comma with dot etc
    if (isNumeric(value) == true) {
    };
};

function indexOfRev(sStr, sFind) {
    var strTest = ''
    var i = sStr.length;
    while (i--) {
        strTest = sStr.substr(i);
        if (strTest.indexOf(sFind) > -1) break;
    };
    return i;
};

/* <str> ToComma(<num>) 
 * Input: A number with no commas 
 * Output: The number with commas 
 */ 
function toComma(numb) { 
    var Result = new String; 
    if (isNumeric(numb) == false) return numb; 
    var strNumb = new String(numb); 
    splitString = strNumb.split("."); 
    if (splitString[0].length < 4) return numb; 
    splitString[0] = reverse(splitString[0]); 
    var loop = 0; 
    var strTemp = new String; 
    while (loop <= splitString[0].length)  { 
        strTemp += splitString[0].substr(loop, 3); 
        if ((loop += 3) < splitString[0].length) strTemp += ","; 
    }; 
    Result = reverse(strTemp); 
    if (isNumeric(splitString[1])) Result += "." + splitString[1]; 
    return Result; 
};


/* <str> reverse(<str>) 
 * Input: A string 
 * Output: The string, reversed 
 */ 
function reverse(strToReverse) { 
    var strRev = new String; 
    var i = strToReverse.length; 
    while (i--) strRev += strToReverse.charAt(i); 
    return strRev; 
};

/* 
 * left(<str>,<len>) 
 * 
 * Input: 1. A string 
 *        2. The number of characters of the string to be returned 
 * Output: The first <number> bytes of the passed in string 
 * 
 */ 
function left(str, num) { 
    var strLeft = new String(str); 
    return strLeft.substr(0, num); 
} ;

/* 
 * right(<str>, <len>) 
 * 
 * Input: 1. A string 
 *        2. The number of characters of the string to be returned 
 * Output: <number> bytes of the string, starting from the right 
 * 
 */ 
function right(str, num) { 
    var strRight = new String(str); 
    strRight = reverse(strRight); 
    return reverse(strRight.substr(0, num)); 
};
