/*
Generic functions
*/
function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_showHideLayers() { //v6.0
  var i,p,v,obj,args=MM_showHideLayers.arguments;
  for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args[i]))!=null) { v=args[i+2];
    if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v=='hide')?'hidden':v; }
    obj.visibility=v; }
}

function MM_setTextOfLayer(objName,x,newText) { //v4.01
  if ((obj=MM_findObj(objName))!=null) with (obj)
    if (document.layers) {document.write(unescape(newText)); document.close();}
    else innerHTML = unescape(newText);
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
	var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
	if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

/*
Xml and related functions
*/
var bolXmlObjectTest=false;
var xmlFactory = {
  newXmlDocument: function(optFile) {
  	var objXML;
    try{
			try {
				objXML = new ActiveXObject("MSXML2.FreeThreadedDOMDocument.4.0");
				objXML.setProperty("NewParser", true);
				objXML.validateOnParse = false;
				objXML.resolveExternals = false;
			} catch(e) {
				xmlFactory.installMsXml();
				//objXML = new ActiveXObject("MSXML2.FreeThreadedDOMDocument.3.0");
			}
			objXML.async = false;
			if (optFile){
				//load the xml via xmlhttp to prevent caching
				var xmlHttp = new ActiveXObject("MSXML2.XmlHttp.3.0");
				xmlHttp.open("GET", optFile, false);
				xmlHttp.setRequestHeader("Cache-Control", "no-cache");
				xmlHttp.setRequestHeader("Pragma", "no-cache");
				xmlHttp.send(null);

				var objXML = xmlHttp.responseXML;
			}
			return objXML;
		}catch(e){
			xmlFactory.installMsXml();
			//return;
		}

  },
  newXslTemplate: function() {
    var objXML;
    try {
      objXML = new ActiveXObject("MSXML2.XSLTemplate.4.0");
    } catch(e) {
      objXML = new ActiveXObject("MSXML2.XSLTemplate.3.0");
    }
    return objXML;
  },
  newXmlHttpObject: function() {
    var objHttpXml=false;
		if (window.XMLHttpRequest) {
			objHttpXml = new XMLHttpRequest();
		}else{
			if(window.ActiveXObject){
				try{
		      objHttpXml = new ActiveXObject("MMSXML2.XmlHttp.4.0");
		    }catch(e){
		      try{
		      	objHttpXml = new ActiveXObject("MSXML2.XmlHttp.3.0");
			    }catch(e){
			    	objHttpXml = new ActiveXObject("Microsoft.XMLHTTP");
			    }
		    }
			}
		}
    return objHttpXml;
  },

  installMsXml: function(){
  	//installs msxml on a client machine
  	var objXmlTest;
  	var bolMsXml4Present=true;
  	try {
			objXmlTest = new ActiveXObject("MSXML2.FreeThreadedDOMDocument.4.0");
		} catch(e) {
			bolMsXml4Present=false;
		}
		if(bolMsXml4Present){
			//there was another probem when loading the resource
			alert("There was a problem loading the xml data...\nPlease contact the system administrator.");
		}else{
			//MSXML 4 is not installed
	  	if(confirm("You do not have MSXML4 or higher installed on your system.\nPlease click 'OK' to install MSXML4 now.")){
		  	var strMsXmlCabLocation='/system/_components/msxml4.cab';
		  	var strMsXmlVersion='4,10,9127,0';

		  	var strHtml='';

				strHtml+='<html>\n';
				strHtml+='<head>\n';
				strHtml+='<title>MSXML4 Installer Page</title>\n';
				strHtml+='<link href="../../scripts/_css/default.css" type="text/css" rel="stylesheet" />\n';
				strHtml+='<script language="javascript" src="/_assets/scripts/default_scripts.js">//</script>\n';
				strHtml+='</head>\n';
				strHtml+='<body onload="installMsxmlStatusCheck();">\n';
				strHtml+='<div id="content">Bezig het MSXML4 component te installeren.</div>\n';
				strHtml+='<object id="MSXML4"\n';
				strHtml+='classid="clsid:88d969c0-f192-11d4-a65f-0040963251e5"\n';
				strHtml+='codebase="'+strMsXmlCabLocation+'#version='+strMsXmlVersion+'"\n';
				strHtml+='type="application/x-oleobject"\n';
				strHtml+='style="display: none"></object>\n';
				strHtml+='</body>\n';
				strHtml+='</html>\n';
				//alert(strHtml);

				var objInstallWindow = window.open('', 'objWindow', 'width=450,height=100,navigation=false');
				//var objInstallWindow = window.showModalDialog('javascript:document.writeln(' +strHtmlBegin+')','','dialogHeight: 300px; dialogWidth: 400px; resizable:1');
				objInstallWindow.document.open();
				objInstallWindow.document.write(strHtml);
				objInstallWindow.document.close();
				objInstallWindow.focus();
				//objInstallWindow.installMsxmlStatusCheck();

				/*
				pause the script until msxml has been installed and the user has closed the popup window
				*/
				while(!objInstallWindow.closed && objInstallWindow.location){
					pauseScript(1000);
				}

				//focus on current window and reload to start using the new installed component
				window.focus();
				document.location.reload(true);
		  }
		}
	}
};


function installMsxmlStatusCheck(){
	//this function tests if the msxml component has been installed
	if ( MSXML4 == undefined )
	{
		setTimeout( "installMsxmlStatusCheck();", 1000 );
	}
	else
	{
		content.innerHTML = "<b>Het MSXML4 component is succesvol geinstalleerd!</b><br /><br /><a href='javascript:self.close();'>Klik hier om het venster te sluiten.</a>";
	}
}

function transformXmlAdvanced(strXmlPath, strXslPath, arrParameters){
  var strOutput="";
  //the xsl document
  var objXslDoc = xmlFactory.newXmlDocument();
  var objXmlDoc = xmlFactory.newXmlDocument();
  var objXslTemplate = xmlFactory.newXslTemplate();

  //load xml
  if(strXmlPath.documentElement){
    objXmlDoc.loadXML(strXmlPath.xml);
  }else{
    objXmlDoc.load(strXmlPath);
  }

  //load xsl
  if(strXslPath.documentElement){
    objXslDoc.loadXML(strXslPath.xml);
  }else{
	objXslDoc.load(strXslPath);
  }


  objXslTemplate.stylesheet = objXslDoc;
  var objXslProcessor = objXslTemplate.createProcessor();
  objXslProcessor.input = objXmlDoc;

  // Set parameters
  for (var param in arrParameters){
    objXslProcessor.addParameter(param, arrParameters[param]);
  }

  objXslProcessor.transform();
  strOutput=objXslProcessor.output;

  // Cleanup
  objXslProcessor.reset();

  return strOutput
}

function indentXml(doc){
	// Nicely indent the XML
  var indent = '';
  var last = 'start';
  var xml = doc.xml.replace(/(>\s*)?((<[^\/>]+\/)|(<[^\/][^\/>]*)|(<\/[^>]+))/g,
    function(m0, notext, tag, emptytag, starttag, endtag)
    {
      var v = indent;
      if (starttag)
      {
        indent += '  ';
        last = 'start';
      }
      else if (endtag)
      {
        indent = indent.substr(0, indent.length-2);
        v = (last=='start'?'':indent);
        last = 'end';
      }
      else
        last = 'end';

      return (notext?'>\n'+v:'') + tag;
    }
  );
	doc.loadXML(xml);
}

function saveXmlDomObject(objXml, strUrl){
	/*
	This function saves the an xml dom object on the server
	*/

	//indent the xml file
	indentXml(objXml);

	//sent to server
	var objXmlHttp = xmlFactory.newXmlHttpObject();
	objXmlHttp.Open("POST", strUrl, false);
	objXmlHttp.Send(objXml);

	//deal with response
	switch (objXmlHttp.status)
  {
    case 200:
      //OK
      var strResponseText=objXmlHttp.responseText;
      alert(strResponseText);
      bolSuccess=true;
      //var resultXML = objXmlHttp.responseXML;
      break;
    case -1:
      alert('Error while saving ' + strUrl + ':\n\n' + objXmlHttp.responseText);
      break;
    default:
      alert('Server responded not ok while saving ' + strUrl + ':\n\nstatus:' + objXmlHttp.status + '\nmessage: ' + objXmlHttp.responseText);
  }
}

function serverSideRequest(){
	/*
	This function performs a serverside request by using the passed xmlhttp object.
	It passes form data to the requested url using the arrFormData array. This array should be passed in the following syntax
	arrFormData['<<form field name>>']="<<form field value>>";
	It returns the string that the server side script returned (sync) or passes the string on a user defined function 'strCallbackFunction' (async)
	
	Or you can use named argument syntax
	serverSideRequest({url: '/bla.html', callback: 'performTask()', xmlhttp: objXmlHttp, method: 'GET', formdata: arrFormData})
	*/
	var arrArguments=serverSideRequest.arguments;
	var intArguments=arrArguments.length;
	var bolAsync=true, bolSubmitFormData=false, bolDebug=false, bolSubmitXmlFile=false;
	var strKey, strValue, strFormData='', strResult;
	//default argument values
	var strUrl='', strCallbackFunction='',objXmlHttpLocal='',strMethod='POST',arrFormData='';
	
	var bolUseNamedArguments=false;
	if(intArguments==1 && isObject(arrArguments[0]))bolUseNamedArguments=true;

	if(bolUseNamedArguments){
		//get the named arguments
		var objArguments=arrArguments[0];
		strUrl=typeof objArguments.url != 'undefined'? objArguments.url : '';
		strCallbackFunction=typeof objArguments.callback != 'undefined'? objArguments.callback : '';
		objXmlHttpLocal=typeof objArguments.xmlhttp != 'undefined'? objArguments.xmlhttp : '';
		strMethod=typeof objArguments.method != 'undefined'? objArguments.method : 'POST';
		arrFormData=typeof objArguments.arrdata != 'undefined'? objArguments.arrdata : '';
	}else{
		//retrieve the arguments passed
		switch(intArguments){
			case 0:
				alert("This function requires at least 1 argument");
				break;
			case 1:
				if(arrArguments[0]!='')strUrl=arrArguments[0];
				break;
			case 2:
				if(arrArguments[0]!='')strUrl=arrArguments[0];
				if(arrArguments[1]!='')strCallbackFunction=arrArguments[1];
				break;
			case 3:
				if(arrArguments[0]!='')strUrl=arrArguments[0];
				if(arrArguments[1]!='')strCallbackFunction=arrArguments[1];
				if(arrArguments[2]!='')objXmlHttpLocal=arrArguments[2];
				break;
			case 4:
				if(arrArguments[0]!='')strUrl=arrArguments[0];
				if(arrArguments[1]!='')strCallbackFunction=arrArguments[1];
				if(arrArguments[2]!='')objXmlHttpLocal=arrArguments[2];
				if(arrArguments[3]!='')strMethod=arrArguments[3];
				break;
			case 5:
				if(arrArguments[0]!='')strUrl=arrArguments[0];
				if(arrArguments[1]!='')strCallbackFunction=arrArguments[1];
				if(arrArguments[2]!='')objXmlHttpLocal=arrArguments[2];
				if(arrArguments[3]!='')strMethod=arrArguments[3];
				if(isArray(arrArguments[4]) || isObject(arrArguments[4]))arrFormData=arrArguments[4];
				break;
		}
	}
	
	
	if(bolDebug)alert("Parameters recieved:\n"+"strUrl="+strUrl+"\n"+"strCallbackFunction="+strCallbackFunction+"\n"+"objXmlHttpLocal="+objXmlHttpLocal+"\n"+"strMethod="+strMethod+"\n"+"arrFormData="+arrFormData);

	/*
	bypass caching by adding a querystring to the url
	*/
	strUrl+=(strUrl.indexOf('?')>0)?'&rnd=' + Math.random():'?rnd=' + Math.random();
	//try to reuse a xml http object - could not get this to work cross browser
	/*
	clearing the onreadystatechange property in IE is problamatic so we instantiate a new xmlhttp object for each request
	*/
/*
	if(window.ActiveXObject){
		objXmlHttpLocal = xmlFactory.newXmlHttpObject();
		//if(CollectGarbage)alert("garbadge colection works");
	}else{
		if(isString(objXmlHttpLocal)){
			//use globally defined xmlhttp object
			objXmlHttpLocal=objXmlHttp;
			if(!isObject(objXmlHttpLocal)){
				//alert("create new object");
				objXmlHttpLocal = xmlFactory.newXmlHttpObject();
			}
		}
	}
*/
	objXmlHttpLocal = xmlFactory.newXmlHttpObject();

	//detrmine asynchronous request
	if(strCallbackFunction=='')bolAsync=false;

	//determine onreadystatechange function (async only)
	if(bolAsync){
		strCallbackFunction=strCallbackFunction.replace(/(.*)\(\)/,"$1");
		objXmlHttpLocal.onreadystatechange= function() {
			if (objXmlHttpLocal.readyState == 4) {
				if (objXmlHttpLocal.status == 200) {
				  //ok
				  strResult=objXmlHttpLocal.responseText;
				  if(bolDebug)alert("just before callback function\n\n"+strResult);
				  eval(strCallbackFunction+'(strResult);');
				}else{
					strResult="ERROR: There was a problem retrieving the server side data:\n" + objXmlHttpLocal.statusText;
					alert(strResult);
				}
			}
		}

		//eval("objXmlHttpLocal.onreadystatechange = "+strCallbackFunction+";");
	}else{
		//make sure to clear any previously attached onreadystate functions
		/*
		Need to investigate memory leak problems in IE
		*/
		objXmlHttpLocal.onreadystatechange = function() {};
		//delete objXmlHttpLocal['onreadystatechange'];
    //objXmlHttpLocal = null;


	}

	//build the form data string using the array
	if(isArray(arrFormData)){
		bolSubmitFormData=true;
		for(strKey in arrFormData){
			strValue=arrFormData[strKey];
			strValue=encodeUrl(strValue);
			strFormData+=strKey+"="+strValue+'&';
		}
		//strip last '&' from the string
		strFormData=strFormData.substr(0,(strFormData.length-1));
		if(bolDebug)alert('Form data sent to server:\n'+strFormData);
	}


	if(isObject(arrFormData)){
		bolSubmitXmlFile=true;
	}

	//perform request
	objXmlHttpLocal.open(strMethod, strUrl, bolAsync);
	//objXmlHttpLocal.setRequestHeader("encoding", "UTF-8");
	if(bolSubmitFormData){
		objXmlHttpLocal.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		objXmlHttpLocal.send(strFormData);
	}else{
		if(bolSubmitXmlFile){
			objXmlHttpLocal.send(arrFormData);
		}else{
			objXmlHttpLocal.send(null);
		}
	}

	if(bolAsync==false){
		return objXmlHttpLocal.responseText;
	}
}

function writeFlashHtml(objArguments){
	/*
	writes a flash html container using named argument syntax
	writeFlashHtml({src: 'bla.swf', width: 100, height: 100, version: 8})
	*/
	document.write(createFlshHtml(objArguments));
}

function createFlshHtml(objArguments){
	var strSrc = typeof objArguments.src != 'undefined'? objArguments.src : false;
	var intWidth = typeof objArguments.width != 'undefined'? objArguments.width : false;
	var intHeight = typeof objArguments.height != 'undefined'? objArguments.height : false;
	if(!strSrc || !intWidth || !intHeight)return; 
	
	var intVersion = typeof objArguments.version != 'undefined'? objArguments.version : 7;	
	var strId = typeof objArguments.id != 'undefined'? objArguments.id : 'flashmovie';
	var arrParametersPassed = typeof objArguments.params != 'undefined'? objArguments.params : new Array();
	var strAlign = typeof objArguments.align != 'undefined'? "align="+objArguments.align : "";
	var strScale = typeof objArguments.scale != 'undefined'? objArguments.scale : "showall";
	
	//flash parameters
	var arrParameters=new Array(), strParameterNodes='', strParameterAttributes='';
	arrParameters['quality']="high";
	arrParameters['bgcolor']="#ffffff";
	arrParameters['wmode']="opaque";
	arrParameters['scale']=strScale;
	for (strKey in arrParameters) {		
		strParameterNodes+='<param name="'+strKey+'" value="'+arrParameters[strKey]+'" />';
		strParameterAttributes+=' '+strKey+'="'+arrParameters[strKey]+'"';
	}
	
	var flashHTML = '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version='+intVersion+',0,0,0" width="'+intWidth+'" height="'+intHeight+'" '+strAlign+' id="'+strId+'">';
	flashHTML += '<param name="allowScriptAccess" value="sameDomain" />';
	flashHTML += '<param name="salign" value="lt" />';
	flashHTML += '<param name="movie" value="'+strSrc+'" />';
	flashHTML += strParameterNodes;
	flashHTML += '<embed'+strParameterAttributes+' swliveconnect="true" name="'+strId+'" id="'+strId+'" src="'+strSrc+'" width="'+intWidth+'" height="'+intHeight+'" '+strAlign+' type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />';
	flashHTML += '</object>';	
	
	return flashHTML;
}

/*
Form scripts
*/
function setFormFieldValue(objFormField, strValue){
	/*
	This function sets a value of a form field
	*/
	var strType, strNodeName;

	//test if this a radio button - does not seem to have a nodename property...
	if(!objFormField.nodeName){
		strNodeName="input";
		strType="radio";
	}else{
		strNodeName=objFormField.nodeName.toLowerCase();
		if(strNodeName=="input"){
			strType=objFormField.getAttribute('type');
		}
	}


	switch(strNodeName){
		case "input":
			//simple text box
			if(strType=="text")objFormField.value=strValue;
			//radio button
			if(strType=="radio"){
				//radio button
				for (var i=0;i<objFormField.length;i++){
					if(objFormField[i].value==strValue){
						objFormField[i].checked=true;
					}else{
						objFormField[i].checked=false;
					}
				}
			}
			//checkbox
			if(strType=="checkbox"){
				if(strValue=="" || objFormField.value!=strValue){
					objFormField.checked=false;
				}else{
					objFormField.checked=true;
				}
			}

			break;
		case "select":
			if(objFormField.getAttribute('multiple')){
				//multiple type select box
				var arrTemp=strValue.split('|');
				var strCurrentValue;
				var bolValueFound=false;
				for (var i=0;i<objFormField.options.length;i++){
					strCurrentValue=objFormField[i].value;
					for (var j=0;j<arrTemp.length;j++){
						if(arrTemp[j]==strCurrentValue)bolValueFound=true;
					}
					if(bolValueFound){
						objFormField[i].selected=true;
					}else{
						objFormField[i].selected=false;
					}
					bolValueFound=false;
				}
			}else{
				//a single selection select box
				for (var i=0;i<objFormField.options.length;i++){
					if(objFormField[i].value==strValue){
						objFormField[i].selected=true;
					}else{
						objFormField[i].selected=false;
					}
				}

			}
			break;
		case "textarea":
			objFormField.value=strValue;
			break;
		default:

	}



}

function getFormFieldValue(objFormField){
	/*
	This function returns the value of the form field based on the form element type
	If not selected or checked it returns ""
	*/
	var strType, strValue="", strNodeName;

	//test if this a radio button - does not seem to have a nodename property...
	if(!objFormField.nodeName){
		strNodeName="input";
		strType="radio";
	}else{
		strNodeName=objFormField.nodeName.toLowerCase();
		if(strNodeName=="input"){
			strType=objFormField.getAttribute('type');
		}
	}
	//alert(strType);

	switch(strNodeName){
		case "input":
			if(strType=="text" || strType=="file")strValue=objFormField.value;
			if(strType=="radio"){
				//radio button
				//alert('radio'+objFormField.length);
				for (var i=0;i<objFormField.length;i++){
					if (objFormField[i].checked)strValue=objFormField[i].value;
				}

			}
			if(strType=="checkbox"){
				if(objFormField.checked)strValue=objFormField.value;
			}
			break;
		case "select":
			if(objFormField.getAttribute('multiple')){
				//return the value of the multiple options list in a pipe seperated list
				for (var i=0;i<objFormField.options.length;i++){
					var objOption = objFormField.options[i];
					if(objOption.selected)strValue+=objOption.value+"|";
				}
				if(strValue!="")strValue=strValue.replace(/(.*)./,"$1");
			}else{
				strValue=objFormField[objFormField.selectedIndex].value
			}
			break;
		case "textarea":
			strValue=objFormField.value;
			break;
		default:

	}

	return strValue;
}

function getFormFieldObject(strIdentifier){
	/*
	This function gets the form field object
	*/
	//1) safest: use forms array and eval
	var arrForms=document.forms;
	if(arrForms.length>0){
		//attempt to locate the form object and generate a
		for (var i=0;i<arrForms.length;i++){
			var strEval='document.forms['+i+'].'+strIdentifier+';';
			try{
				var objEval=eval(strEval);
				if(isObject(objEval)){
					return objEval;
				}
			}catch(e){}

		}
	}

	//2) fallback scenario: use getelementbyid
	var objFormField;
	//alert(document.getElementById(strIdentifier).nodeName)
	if(document.getElementById(strIdentifier).getAttribute('type')!='radio'){
		objFormField=document.getElementById(strIdentifier);
		return objFormField;
	}else{
		//this is a radio button - strange beghavior - use evel to get hold of the object
		objFormField = eval('document.forms[0].' + strIdentifier);
		return objFormField;
	}
}

function getFormFieldValueById(strId){
	var objFormField=getFormFieldObject(strId);
	return getFormFieldValue(objFormField);
}

function setFormFieldValueById(strId, strValue){
	var objFormField=getFormFieldObject(strId);
	return setFormFieldValue(objFormField, strValue);
}

/*
Generic helper functions
*/
function encodeUrl(sStr) {
  return escape(sStr).replace(/\+/g, '%2C').replace(/\"/g,'%22').replace(/\'/g, '%27').replace(/\//g, '%2F');
}

function replaceQuerystringParameter(strUrl, strParameterName, strParameterValue){
	/*
	replaces an existing value of a querystring parameter with a new value
	if the querystring parameter does not exist yet it will be created
	*/
	strUrl=strUrl.replace(/\?/g, "&");
	var arrTemp, arrParameters=strUrl.split("&");
	var intQueryStringParameters=arrParameters.length;

	if(intQueryStringParameters==0 || strUrl.indexOf(strParameterName+"=")==-1){
		//querystring parameter does not exist so create it
		if(intQueryStringParameters==0){
			strUrl=strUrl+"?"+strParameterName+"="+strParameterValue;
		}else{
			strUrl=strUrl+"&"+strParameterName+"="+strParameterValue;
		}
	}else{
		//use split technique to replace the existing value with the new one
		var strParameterElement="";
		strUrl="";
		for (var i=0; i<intQueryStringParameters; i++) {
			strParameterElement=arrParameters[i];
			if(strParameterElement.indexOf(strParameterName+"=")==-1){
				strUrl+=strParameterElement;
			}else{
				//replace the parameter value
				arrTemp=strParameterElement.split("=");
				if(arrTemp.length > 0){
					strUrl+=arrTemp[0]+"="+strParameterValue;
				}else{
					strUrl+=strParameterElement+"="+strParameterValue;
				}
			}
			if(i<(intQueryStringParameters-1))strUrl+="&";
			//alert(strUrl);
		}
	}
	
	//turn the first & into ?
	arrTemp=strUrl.split("&");
	if(arrTemp.length > 0){
		for (i=0; i<arrTemp.length; i++) {
			if(i==0){
				strUrl=arrTemp[i]+'?';
			}else{
				strUrl+=arrTemp[i];
				if(i<(arrTemp.length-1))strUrl+="&";
			}
		}
	}
	return strUrl;
}

function retrieveQuerystringParameterValue(strUrl, strParameterName){
	//retrieves a querystring parameter value
	if(strUrl.indexOf('?')>-1){
		strUrl=strUrl.split('?')[1];
	}else{
		return "";
	}
	var arrTemp=strUrl.split('&'), arrTemp2;
	for (var i=0; i<arrTemp.length; i++) {
		arrTemp2=arrTemp[i].split("=");
		if(arrTemp2.length>1){
			if(arrTemp2[0]==strParameterName)return arrTemp2[1];
		}
	}
	if(arrTemp.length==0 && strUrl.indexOf('=')>-1){
		arrTemp2=strUrl.split("=");
		return arrTemp2[1];
	}
	return "";
}

function removeQuerystringParameter(strUrl, strParameterName){
	//removes a querystring parameter
	var strBaseUrl, strQuerystringNew="", arrTemp, arrTemp2;
	if(strUrl.indexOf('?')>-1){
		arrTemp=strUrl.split('?');
		strUrl=arrTemp[1];
		strBaseUrl=arrTemp[0];
	}else{
		return strUrl;
	}
	arrTemp=strUrl.split('&');
	for (var i=0; i<arrTemp.length; i++) {
		arrTemp2=arrTemp[i].split("=");
		if(arrTemp2.length>1){
			if(arrTemp2[0]!=strParameterName){
				strQuerystringNew+=arrTemp[i];
				if(i<arrTemp.length-1)strQuerystringNew+="&";
			}
		}
		
	}
	if(strQuerystringNew!=""){
		if(Right(strQuerystringNew, 1)=="&")strQuerystringNew=Left(strQuerystringNew, strQuerystringNew.length-1)
		return strBaseUrl+"?"+strQuerystringNew;
	}
	
	return strUrl;	
	
}

function createFileName(){
	var objDate=new Date();
	strYear=objDate.getUTCFullYear();
	strMonth=fixDateElement(objDate.getUTCMonth()+1);
	strDay=fixDateElement(objDate.getDate());
	strHour=fixDateElement(objDate.getUTCHours());
	strMinute=fixDateElement(objDate.getUTCMinutes());
	strSecond=fixDateElement(objDate.getUTCSeconds());
	return strYear+'-'+strMonth+'-'+strDay+'_'+strHour+'-'+strMinute+'-'+strSecond

	function fixDateElement(intDateElement){
		if(intDateElement<10){
			intDateElement="0"+intDateElement;
		}else{
			intDateElement=""+intDateElement;
		}
		return intDateElement;
	}
}

function openCenteredWindow(theURL,winName,features, myWidth, myHeight) { //v3.0
	var isCenter="true";


	if(window.screen)if(isCenter)if(isCenter=="true"){
		var myLeft = (screen.width-myWidth)/2;
		var myTop = (screen.height-myHeight)/2-10;
		features+=(features!='')?',':'';
		features+=',left='+myLeft+',top='+myTop;
	}

	var objNewWindow=window.open(theURL,winName,features+((features!='')?',':'')+'width='+myWidth+',height='+myHeight);
	return objNewWindow;

}

function getScrollXY() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement &&
      ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return [ scrOfX, scrOfY ];
}


function openDebugWindow(html){
	var encoded_html=html.replace(/\&/g,"&");
	encoded_html=encoded_html.replace(/>/g,">");
	encoded_html=encoded_html.replace(/</g,"&lt;");
	encoded_html=encoded_html.replace(/\n/g,"<br />");
	var traceWindow = window.open()
	traceWindow.document.open()
	traceWindow.document.write('<html><body><h1>Trace of generated HTML</h1><pre>')
	traceWindow.document.write('</pre><hr>'+encoded_html+'<hr>')
	traceWindow.document.write('</body></html>')
	traceWindow.document.close()

}

function timer(){
	var t1, t2;
	var intMs;
	this.startTimer=function(){
		t1 = new Date;
	}

	this.endTimer=function(){
		var intDeler=1;
		//check if the value that needs to be returned should be in a diffrent format
		if(arguments.length>0){
			strReturnValue=arguments[0];
			if(strReturnValue=="sec")intDeler=1000;
		}
		t2 = new Date;
		intMs=Math.round((t2 - t1)/intDeler);
		return intMs;
	}
}

function pauseScript(intMs) {
	//this function will pause the javascript thread and continue after a passed ms
	var s = "script" ;

	var dialogScript =
	"window.setTimeout(" +
	" function () { window.close(); }, " + intMs + ");";
	var result =
	window.showModalDialog(
	'javascript:document.writeln(' +
	'"<' + s + '>' + dialogScript + '<' + '/' + s + '>")');
}

function getRandom(){
	return Math.random()
}


function setOpacity(obj, value){
	/*
	Sets the opacity of an object (0-10)
	*/
	obj.style.opacity = value/10;
	obj.style.filter = 'alpha(opacity=' + value*10 + ')';
}

function generateUniqueId(){
  var t=Math.random();
  t=Math.round(t*10000);
  var t2=Math.random();
  t2=Math.round(t*10000);
  var objDate=new Date();
	var intSec=objDate.getSeconds();
  t=t+"x"+intSec+"x"+t2;
	return t;
}


/*
Cookie functions
*/
/*
EXAMPLE FUNTIONS ON HOW TO SET & GET VALUES FROM A COOKIE
*/
function storeInCooke(){
	//example
	// create an instance of the Date object
	var now = new Date();
	// fix the bug in Navigator 2.0, Macintosh
	fixDate(now);

	now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000);

	var url=document.getElementById('starturl').value;
	setCookie("performanceurl", url, now);
}

function retrieveFromCookie(){
	var cookievalue = getCookie("performanceurl");
	if(cookievalue){
		document.getElementById('starturl').value=cookievalue;
	}
}

function setCookie(name, value, expires, path, domain, secure) {
  var curCookie = name + "=" + escape(value) +
      ((expires) ? "; expires=" + expires.toGMTString() : "") +
      ((path) ? "; path=" + path : "") +
      ((domain) ? "; domain=" + domain : "") +
      ((secure) ? "; secure" : "");
  document.cookie = curCookie;
}


/*
  name - name of the desired cookie
  return string containing value of specified cookie or null
  if cookie does not exist
*/

function getCookie(name) {
  var dc = document.cookie;
  var prefix = name + "=";
  var begin = dc.indexOf("; " + prefix);
  if (begin == -1) {
    begin = dc.indexOf(prefix);
    if (begin != 0) return null;
  } else
    begin += 2;
  var end = document.cookie.indexOf(";", begin);
  if (end == -1)
    end = dc.length;
  return unescape(dc.substring(begin + prefix.length, end));
}


/*
   name - name of the cookie
   [path] - path of the cookie (must be same as path used to create cookie)
   [domain] - domain of the cookie (must be same as domain used to
     create cookie)
   path and domain default if assigned null or omitted if no explicit
     argument proceeds
*/

function deleteCookie(name, path, domain) {
  if (getCookie(name)) {
    document.cookie = name + "=" +
    ((path) ? "; path=" + path : "") +
    ((domain) ? "; domain=" + domain : "") +
    "; expires=Thu, 01-Jan-70 00:00:01 GMT";
  }
}

// date - any instance of the Date object
// * hand all instances of the Date object to this function for "repairs"

function fixDate(date) {
  var base = new Date(0);
  var skew = base.getTime();
  if (skew > 0)
    date.setTime(date.getTime() - skew);
}

function trim(str){
	str=str.replace(/^(\s+)(\S.*)$/g,"$2");
	str=str.replace(/^(.*)(\s+)$/g,"$1");
	return str;
}


/*
Scripts to test variable types
*/
function isAlien(a) {
   return isObject(a) && typeof a.constructor != 'function';
}
function isArray(a) {
    return isObject(a) && a.constructor == Array;
}
function isBoolean(a) {
    return typeof a == 'boolean';
}
function isEmpty(o) {
    var i, v;
    if (isObject(o)) {
        for (i in o) {
            v = o[i];
            if (isUndefined(v) && isFunction(v)) {
                return false;
            }
        }
    }
    return true;
}
function isFunction(a) {
    return typeof a == 'function';
}
function isNull(a) {
    return typeof a == 'object' && !a;
}
function isNumber(a) {
    return typeof a == 'number' && isFinite(a);
}
function isObject(a) {
    return (a && typeof a == 'object') || isFunction(a);
}
function isString(a) {
    return typeof a == 'string';
}
function isUndefined(a) {
    return typeof a == 'undefined';
}

function Left(str, n){
	if (n <= 0){
		return "";
	}else{
		if (n > String(str).length){
			return str;
		}else{
			return String(str).substring(0,n);
		}
	}
}
function Right(str, n){
	if(n <= 0){
		return "";
	}else{
		if(n > String(str).length){
			return str;
		}else{
			var iLen = String(str).length;
			return String(str).substring(iLen, iLen - n);
		}
	}
}

