//stripped version - expects mootools
/*
Test and load mootools if needed
*/
if(typeof MooTools == 'undefined'){
	//load mootools via httpxml
	var objXmlHttp;
	try {
		objXmlHttp=new XMLHttpRequest();
	}
	catch(e) {
		objXmlHttp=new ActiveXObject('Microsoft.XMLHTTP');
	}
	objXmlHttp.open("GET", '/scripts/mootools.js', false);
	objXmlHttp.send(null);
	var strResponse=objXmlHttp.responseText
	//alert(strResponse);
	eval(strResponse);

	/*
	TO DO - ERROR HANDLING IN CASE LOAD FAILS
	*/
}else{
	//alert('NO need to load mootools');
}


/*
Generic functions
*/
function MM_findObj(strId) {
	return $(strId);
}

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=$(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=$(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=$(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

/*
Xml and related functions (IE only)
*/
var xmlFactory = {
  newXmlDocument: function(optFile) {
	 	if (document.implementation && document.implementation.createDocument){
	 		//ff or opera
	 		objXML=document.implementation.createDocument("","",null);
	 		if(optFile)objXML.load(optFile);
			return objXML;
	 	}else{
	 		//ie
	    if(window.ie){
				try {
					objXML = new ActiveXObject("MSXML2.FreeThreadedDOMDocument.4.0");
					objXML.setProperty("NewParser", true);
					objXML.validateOnParse = false;
					objXML.resolveExternals = false;
				}catch(e){
					//ms xml 4 not installed

					//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;
			}else{
				//this browser does not support cient side xml
				return false
			}
		}

  },
  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;
  }
};


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){
    if(!isFunction(arrParameters[param]))objXslProcessor.addParameter(param, arrParameters[param]);
  }

  objXslProcessor.transform();
  strOutput=objXslProcessor.output;

  // Cleanup
  objXslProcessor.reset();

  return strOutput
}

function createXslIncludePaths(objXsl, strXslIncludePathUrl){
	//this function creates fully qualified xsl:include values
	objXsl.setProperty("SelectionNamespaces", "xmlns:xsl='http://www.w3.org/1999/XSL/Transform'")
	var objCurrNode;
	var objNodeList=objXsl.selectNodes("//xsl:include")
	for (var i=0; i<objNodeList.length; i++) {
		objCurrNode=objNodeList.item(i);
		objCurrNode.setAttribute("href", strXslIncludePathUrl+objCurrNode.getAttribute("href"));
	}
}

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(objArguments){
	/*
	This function performs a serverside request by using the passed xmlhttp object.
	It returns the string that the server side script returned (sync) or passes the string on a user defined function 'strCallbackFunction' (async)
	Use named argument syntax:
	serverSideRequest({url: '/bla.html', callback: 'performTask()', method: 'get', formdata: arrFormData, debug: false})
	*/
	var bolAsync=true, bolSubmitFormData=false, bolDebug=false, bolSubmitXmlFile=false;
	var strDebug, strKey, strValue, strFormData='', strResult;
	var strUrl='', strCallbackFunction='', strMethod='post', arrFormData='';

	//translate the passed object into local variables
	strUrl=typeof objArguments.url != 'undefined'? objArguments.url : '';
	strCallbackFunction=typeof objArguments.callback != 'undefined'? objArguments.callback : '';
	strMethod=typeof objArguments.method != 'undefined'? objArguments.method.toLowerCase() : 'get';
	strDebug=typeof objArguments.debug != 'undefined'? objArguments.debug+'' : 'false';
	if(strDebug.toLowerCase()=='true')bolDebug=true;
	//form data
	arrFormData=typeof objArguments.arrdata != 'undefined'? objArguments.arrdata : '';
	if($type(arrFormData)=='string')arrFormData=typeof objArguments.formdata != 'undefined'? objArguments.formdata : '';
	if(bolDebug)arrFormData['debug']='true';
	if($type(arrFormData)!='string')bolSubmitFormData=true;

	//rework syntax of callback Function
	if(strCallbackFunction!="" && strCallbackFunction.indexOf('(')>0)strCallbackFunction=strCallbackFunction.split("(")[0];
	
	//detrmine asynchronous request
	if(strCallbackFunction=='')bolAsync=false;	

	//bolDebug=true;
	if(bolDebug)alert("Parameters recieved:\n"+"strUrl="+strUrl+"\n"+"strCallbackFunction="+strCallbackFunction+"\n"+"strMethod="+strMethod+"\n"+"arrFormData="+arrFormData+"\n bolSubmitFormData="+bolSubmitFormData+"\nbolAsync="+bolAsync);


	//bypass caching by adding a querystring to the url
	if(strMethod=='post'){
		strUrl+=(strUrl.indexOf('?')>0)?'&rnd=' + generateUniqueId():'?rnd=' + generateUniqueId();
	}else{
		if($type(arrFormData)!='string'){
			arrFormData['rnd']=generateUniqueId();
		}else{
			arrFormData=new Array();
			arrFormData['rnd']=generateUniqueId();
			bolSubmitFormData=true;
		}
	}

	//form data to sent
	if(bolSubmitFormData){
		var arr=new Array();
		for(strKey in arrFormData){
			//alert($type(arrFormData[strKey]));
			if($type(arrFormData[strKey])!='function' && $type(arrFormData[strKey])!='object'){
				strValue=encodeUrl(arrFormData[strKey]);
				arr.push(strKey+"="+strValue)
			}
		}
		strFormData=arr.join('&');
		if(bolDebug)alert('Form data sent to server:\n'+strFormData);
	}

	//create remote xmlhttp object
	objXmlHttpLocal = createRemote();

	//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);
				}
			}
		}
	}else{
		//make sure to clear any previously attached onreadystate functions
		/*
		Need to investigate memory leak problems in IE
		*/
		objXmlHttpLocal.onreadystatechange = function(){};
	}



	//perform request
	if(strMethod.toLowerCase()=="get")strUrl+="?"+strFormData;
	objXmlHttpLocal.open(strMethod.toUpperCase(), strUrl, bolAsync);
	if(bolSubmitFormData && strMethod.toLowerCase()=="post"){
		objXmlHttpLocal.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		objXmlHttpLocal.send(strFormData);
	}else{
		if(bolSubmitXmlFile){
			objXmlHttpLocal.send(arrFormData);
		}else{			
			objXmlHttpLocal.send(null);
		}
	}

	if(!bolAsync)return objXmlHttpLocal.responseText;
	
	function createRemote(){
		try {
			return(new XMLHttpRequest());
		}
		catch(e) {
			return(new ActiveXObject('Microsoft.XMLHTTP'));
		}
	}
	
}


function writeFlashHtml(objArguments){
	/*
	writes a flash html container using named argument syntax
	writeFlashHtml({src: 'bla.swf', width: 100, height: 100, version: 8, id: 'myflashid', params: {wmode:'opaque'}, align: 'top', scale: 'showall'})
	*/
	document.write(createFlashHtml(objArguments));
}

function insertFlashHtml(el, objArguments){
	/*
	replaces the content of an element with the html to create a flash file
	*/
	if($type(el)=='string'){
		$(el).innerHTML=createFlashHtml(objArguments);
	}else{
		el.innerHTML=createFlashHtml(objArguments);
	}
}

function createFlashHtml(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 : generateUniqueId();
	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";
	var strBgColor = typeof objArguments.bgcolor != 'undefined'? objArguments.bgcolor : "#ffffff";
	var strWmode = typeof objArguments.wmode != 'undefined'? objArguments.wmode : "opaque";
	
	var strFlashVars = typeof objArguments.flashvars != 'undefined'? objArguments.flashvars : "";
	if(typeof objArguments.vars != 'undefined')strFlashVars=Hash.toQueryString(objArguments.vars);
	
	//flash parameters
	var arrParameters=new Array(), strParameterNodes='', strParameterAttributes='';
	//default parameters
	arrParameters['quality']="high";
	if(strBgColor!='')arrParameters['bgcolor']="#ffffff";
	arrParameters['wmode']=strWmode;
	arrParameters['scale']=strScale;
	if(strFlashVars!="")arrParameters['flashvars']=strFlashVars;
	//overwrite with the passed parameters
	$extend(arrParameters, arrParametersPassed);
		
	for (strKey in arrParameters) {
		//alert("yes");
		if(!isFunction(arrParameters[strKey])){
			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+'_ie">';
	flashHTML += '<param name="allowScriptAccess" value="always" />';
	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>';	
	//alert(flashHTML);
	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($(strIdentifier).getAttribute('type')!='radio'){
		objFormField=$(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 debugObject(objPassed){
	/*
	Find what an object contians
	*/
	var str="";
	var objInspect=objPassed.obj
	for(strKey in objInspect){
		str+="obj['"+strKey+"']="+objInspect[strKey]+"\n";
	}
	if($defined(objPassed.output)){
		if(objPassed.output.toLowerCase()=="debugwindow"){
			openDebugWindow(str);
		}else{
			alert(str);
		}		
	}else{
		alert(str);
	}
	
}

function openDebugWindow(html){
	var strHtml=convertHtmlForDisplay(html);
	var traceWindow = window.open()
	traceWindow.document.open()
	traceWindow.document.write('<html><body><h1>Trace of generated HTML</h1><pre>')
	traceWindow.document.write('</pre><hr>'+strHtml+'<hr>')
	traceWindow.document.write('</body></html>')
	traceWindow.document.close()

}

function convertHtmlForDisplay(html){
	var strHtml=html.replace(/\&/g,"&");
	strHtml=strHtml.replace(/>/g,">");
	strHtml=strHtml.replace(/</g,"&lt;");
	strHtml=strHtml.replace(/\n/g,"<br />");
	return strHtml;
}

function xtimer(){
	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 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;
}

function trim(str){
	return str.trim();
}


/*
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);
		}
	}
}

/* Handy mootools classes */
var objSequentialFunctionExec = new Class({
	/* Class that enables fireing functions in a sequence - function 2 only starts after function 1 is finished , etc.*/
	Implements: [Chain],
	initialize: function(){
		this.chain.apply(this, arguments);
		this.intArgumentsLength=arguments.length;
		this.arrArguments=arguments;
		this.intChainDelay=0;
	},
	add: function(){
		this.chain.apply(this, arguments);
		this.intArgumentsLength++;
	},
	set: function(){
		strKey=arguments[0];
		value=arguments[1];
		if(strKey=='delay')this.intChainDelay=value;
	},
	start: function(bolRememberSequence){
		var bolRememberSequenceInternal=true;
		var intDelay;
		if(arguments.length==1 && $type(arguments[0]=='boolean'))bolRememberSequenceInternal=arguments[0];
		for(var i=0; i<(this.intArgumentsLength); i++){
			if(this.intChainDelay==0){
				this.callChain();
			}else{
				intDelay=this.intChainDelay*(i+1);
				this.callChain.delay(intDelay, this);
			}
		}        	
		//fill the chain again with the original sequence of functions
		if(bolRememberSequenceInternal)this.chain.apply(this, this.arrArguments);
	}
});

/* Outer click */
(function() {
	var events;
	var check = function(e) {
		var target = $(e.target);
		var parents = target.getParents();
		events.each(function(item) {
			var element = item.element;
			if (element != target && !parents.contains(element))item.fn.call(element, e);
		}
		);
	}
	;
	Element.Events.outerClick = {
		onAdd: function(fn) {
			if(!events) {
				document.addEvent('click', check);
				events = [];
			}
			events.push( {
				element: this, fn: fn
			}
			);
		}
		,    onRemove: function(fn) {
			events = events.filter(function(item) {
				return item.element != this || item.fn != fn;
			}
			, this);
			if (!events.length) {
				document.removeEvent('click', check);
				events = null;
			}
		}
	}
	;
}
)();

function getOuterHtml(el){
	if(Browser.Engine.trident){
		return el.outerHTML;		
	}else{
		return el.getDocument().newElement('div').adopt(el.cloneNode(true)).innerHTML;		
	}	
}


function getCssSelector(node){
	//retrieves a css selector for the passed element
	var strCssSelector="";
	var arrSelector=[];
	var arrNodes=node.getParents();
	arrNodes.each(function(el){
		var strTag=el.get('tag');
		if(strTag!='tbody' && strTag!='html'){
			var strSelector="";
			if($defined(el.get('id')) && el.get('id')!=''){
				strSelector="#"+el.get('id');
			}else{
				if($defined(el.get('class')) && el.get('class')!='')strSelector="."+el.get('class');			
			}
			arrSelector.push(strTag+strSelector);
		}
	})
	
	arrSelector.reverse();
	strCssSelector=arrSelector.join(' ');
	return strCssSelector;
}
