function hideElement(el_selector) {
	var element;
	element = $(el_selector);  //use selector as id
	if(element) element.style.display="none";
	else { //id doesn't exist, try classname
		var elements = document.body.getElements("."+el_selector); 
		for(var i=0;i<elements.length;i++) {
			elements[i].style.display="none";
		}
	}
}

function showElement(el_selector) {
	var element;
	element = $(el_selector);  //use selector as id
	if(element) element.style.display="block";
	else { //id doesn't exist, try classname
		var elements = document.body.getElements("."+el_selector); 
		for(var i=0;i<elements.length;i++) {
			elements[i].style.display="block";
		}
	}
}

function toggleElement(el_selector) {
	var element;
	element = $(el_selector);  //use selector as id
	if(element) {
		if(element.style.display=="none") element.style.display="block";
		else if(element.style.display=="block") element.style.display="none";
	}
	else { //id doesn't exist, try classname
		var elements = document.body.getElements("."+el_selector); 
		for(var i=0;i<elements.length;i++) {
			if(elements[i].style.display=="none") elements[i].style.display="block";
			else if(elements[i].style.display=="block") elements[i].style.display="none";
		}
	}
}

function checkForm(t,a){
	var c = false;
	var r = a.split(",");
	for(i=0;i<r.length;i++){
		d = document.getElementById(r[i]);
		if(d.type=='file'){
			var ft = d.filetypes.split(",");
			var t = d.value.split(".");
			var cf = false;
			t = t[t.length-1].toLowerCase();
			for(ii=0;ii<ft.length;ii++){
				if(ft[ii]==t)
					cf = true;
			}
			d.style.backgroundColor = !cf||d.value==''?"#FFFF40":"";
			c = cf?c:true;
		} else if(d.tagName=='SELECT'){
			for(x=0;x<d.options.length;x++)
				d.options[x].style.backgroundColor = d.options[d.options.selectedIndex].value=='0'||d.options[d.options.selectedIndex].value==''?"#FFFF40":'';
		} else {
			d.style.backgroundColor = d.value==''?"#FFFF40":"";
			if(d.value=='')
				c = true;
		}
	}

	if(c){
		alert('You must check/complete the highlighted items before you continue');
		return false;
	} else 
		return true;
}

function confDel(url,item,itemtype,message) {
	var confmessage="Are you sure you want to delete this "+itemtype+" - \'"+item+"\'? \n\n"+message;
	var answer=confirm(confmessage);
	if(answer==true){
		window.location.href=url;
	}
}

/****
* Form Validation functions
* 
* Variables: 
*	regex_inputname - A regular expression to compare user input to a specific format, e.g. email, postcode.
*	regex_FailMsg_inputname - A message to display when input doesn't match specified format.
*   falseInputValue_inputname - If the input field has a specific value it reverts to when the field is not focused and no value is entered, 
*   						    it needs to be passed here.
*	emptyFieldMsg_inputname - The message to be displayed next to the form if the form value is not entered.
*   formName - The name of the form to be validated.  REQUIRED.
*
* Form fields with display:none are ignored.
*
* Long Example Usage (full validation): 
*		 <form name="myForm">
*        	Email: <input type="text" name="emailfield" class="required" value="Insert email address here" />
*			<input type="hidden" id="regex_emailfield" value="^\w+[\w-\.]*\@\w+((-\w+)|(\w*))\.[a-z]{2,3}$"/>
*			<input type="hidden" id="regexFailMsg_emailfield" value="Your email address is not in the correct format."/>
*			<input type="hidden" id="falseInputValue_emailfield" value="Insert email address here"/>
* 			<input type="hidden" id="emptyFieldMsg_emailfield" value="Please enter an email address"/>
*			<span class="fieldNotification" id="fieldNotification_emailfield"></span>
*			<input type="submit" onclick="return validateForm('myForm','This field is empty!','Regex failed.')" value="Submit" />
*		 </form>
* 
* Short Example Usage (basic validation): 
*		 <form name="myForm">
*        	Email: <input type="text" name="emailfield" class="required" value="" />
*			<span class="fieldNotification" id="fieldNotification_emailfield"></span>
*			<input type="submit" onclick="return validateForm('myForm');" value="Submit" />
*		 </form>
****/

function validateForm(formName,fieldEmptyMsg,regexFailMsg) {

	var getFormElements = new Function('var IE = isIE(); if(!IE || IE>7) return document.forms.'+formName+'.getElements("input[type!=\'hidden\'], select, textarea");	else return $("'+formName+'").getElements("input[type!=\'hidden\'], select, textarea");');
 	var formelements = getFormElements();
	formelements.each(function(item){item.addClass('form-element');});
	var elements = $$(".form-element");
	/*var elements = document.forms.courseApply.getElements("input, textarea");*/
	if(!fieldEmptyMsg) fieldEmptyMsg="Please enter a value for this field.";
	if(!regexFailMsg) regexFailMsg="This value is not formatted correctly.";
	
	var hasFocus = false;
	var validated = true;
	var cbNames = [];
	var cbArray = new Object();
	
	//set up checkbox array
	for(var i=0;i<elements.length;i++) {
		if(elements[i].type=="checkbox" && elements[i].className.match(/required/)) cbNames.push(elements[i].name);
	}
	for(var i=0;i<cbNames.length;i++) {
		cbName = cbNames[i];
		cbArray[cbName] = 0; 
	}
	
	
	for(var i=0;i<elements.length;i++) {
 		if($("falseInputValue_"+elements[i].name)) var falseInputValue = $("falseInputValue_"+elements[i].name).value;
		//if($("regex_"+elements[i].name)) alert($("regex_"+elements[i].name).value);
		if($("regex_"+elements[i].name)) {//alert($("regex_"+elements[i].name).value);
		var regex = new RegExp($("regex_"+elements[i].name).value);}
		//if($("fieldNotification_"+elements[i].name)) var notification = $("fieldNotification_"+elements[i].name);
		
		//test offsetheight to see if form element is being displayed
		var height = elements[i].offsetHeight;
		
		//notification.innerHTML = regex;
		if(elements[i].className.match(/required/)) {
			//alert(cbArray.length);
			//if checkbox
			if(elements[i].type=="checkbox" && elements[i].checked) {				
				cbArray[elements[i].name]++;
				//alert("name:"+elements[i].name+",checked:"+elements[i].checked+",value:"+cbArray[elements[i].name]);
			}				
			
			//if falseInputValue set or field is blank
			else if(height!="0" && (elements[i].value=="" || (falseInputValue && elements[i].value==falseInputValue))) {
				if(!hasFocus) {
					elements[i].focus();
					hasFocus = i;
				}
				validated = false;
		
				if($("emptyFieldMsg_"+elements[i].name)) var fieldSpecificEmptyMsg = $("emptyFieldMsg_"+elements[i].name).value; 
	
				if($("fieldNotification_"+elements[i].name)) {
					if(fieldSpecificEmptyMsg) $("fieldNotification_"+elements[i].name).innerHTML=fieldSpecificEmptyMsg;
					else $("fieldNotification_"+elements[i].name).innerHTML=fieldEmptyMsg;
				}
				else alert("Missing notification field..."+(fieldSpecificEmptyMsg?fieldSpecificEmptyMsg:fieldEmptyMsg));
				
			}
			else if(height!="0" && (elements[i].type!="button" || elements[i].type!="submit")){
				//alert("required but not blank - i="+i+", elements[i].value="+elements[i].value+",reg:"+regex);
				if(regex) {
					//alert("reg:"+regex+" result:"+elements[i].value.match("/"+regex+"/"));
					if (!elements[i].value.match(regex)) {
						//alert("reg failed:"+regex+" result:"+elements[i].value.match(regex));
						if(!hasFocus) {
							elements[i].focus();
							hasFocus = i;
						}
						validated=false;
						if($("regexFailMsg_"+elements[i].name)) var fieldSpecificRegexFailMsg = $("regexFailMsg_"+elements[i].name).value;
						if($("fieldNotification_"+elements[i].name) && fieldSpecificRegexFailMsg) {
							$("fieldNotification_"+elements[i].name).innerHTML=fieldSpecificRegexFailMsg;
						}
						else if($("fieldNotification_"+elements[i].name)) { 
							$("fieldNotification_"+elements[i].name).innerHTML=regexFailMsg;
						}
						else alert("Missing notification field..."+(fieldSpecificRegexFailMsg?fieldSpecificRegexFailMsg:regexFailMsg));
					}
					else if($("fieldNotification_"+elements[i].name)) $("fieldNotification_"+elements[i].name).innerHTML="";
				}
				else {			
					if($("fieldNotification_"+elements[i].name)) {
						//alert("blanking...inner:"+notification.innerHTML+" msg:"+fieldSpecificEmptyMsg);
						$("fieldNotification_"+elements[i].name).innerHTML="";
					}
				}
				
			}
		}
		else {			
			if(notification) {
				//alert("blanking...inner:"+notification.innerHTML+" msg:"+fieldSpecificEmptyMsg);
				notification.innerHTML="";
			}
		}
	}
	//alert('d:'+display+',val:'+validated+',id:'+elements[i].id);
	
	var cbArraysize = Object.size(cbArray);

	if(cbArraysize>0) {
		var cbValidation = true;
		for(key in cbArray) {	
			if($("fieldNotification_"+key)) var notification = $("fieldNotification_"+key);
			if($("reqdCheckboxes_"+key)) var reqdCheckboxes = $("reqdCheckboxes_"+key);
			else var reqdCheckboxes = 1;
			if($("emptyFieldMsg_"+key)) var fieldSpecificEmptyMsg = $("emptyFieldMsg_"+key).value; 
			
			if(cbArray[key]<reqdCheckboxes) {
				cbValidation = false;
				if(notification) {
					if(fieldSpecificEmptyMsg) {notification.innerHTML=fieldSpecificEmptyMsg;}
					else notification.innerHTML="Please complete this field.";
				}
				else alert("Missing notification field..."+(fieldSpecificEmptyMsg?fieldSpecificEmptyMsg:fieldEmptyMsg));
			}
			else if(cbValidation) {			
				if(notification) {
					//alert("blanking...inner:"+notification.innerHTML+" msg:"+fieldSpecificEmptyMsg);
					notification.innerHTML="";
				}
			}
		}
		if(!cbValidation) validated = false;

	}
	
	if (validated) return true;
	else return false;
}

/* AJAX user notification */

function notifyUsr(message){
	var notification = $('notification');
	notification.innerHTML = message;
	notification.setStyle('visibility','visible');
	notification.setStyle('opacity',1);
	fade("notification",10000);
	//setTimeout("fade('notification')",1000);
}

var fadeinstance = '';
					  
function fade(element_id,timeout) {
  	

	var el = $(element_id);

	if(!el)	var el = window.opener.$(element_id);
	
	if(timeout == 0 && el.style.opacity=="1") {
		var Fade = new Fx.Tween(el);
							
		Fade.start("opacity", [1,0]);
	}
	else {
		fadeinstance = setTimeout("fade('"+element_id+"',"+(timeout-100)+")",100);
	}
}

function stopFade() {
	clearTimeout(fadeinstance);
}

function fillScreen(e)
{
	var c = document.getElementById('pageContent');
	var f = getIFrameDocument(e);
	var w = c.offsetWidth;
	var h = f.body.offsetHeight;
	var p = c.style.padding;

	var newWidth  = w + p + 'px';
	var newHeight = ( h < 400 ? 400 : h ) + 'px';

	e.style.width  = newWidth;
	e.style.height = newHeight;
}

function getIFrameDocument(frame)
{
    var rv = null;
    // if contentDocument exists, W3C compliant (e.g. Mozilla)
    if (frame.contentDocument)
        rv = frame.contentDocument;
    else // bad IE  ;)
        rv = document.frames[0].document;
    return rv;
}


function resizeText(multiplier) {     
	var fontsz = "0.69em"; //Default size   
	if(multiplier!="reset") {
		if (Cookie.read('font_size'))  {       
			// Use MooTools to get the cookie (if it exists)       
			var fontsz = Cookie.read('font_size');     
    	}
		fontsz = Math.round(parseFloat(fontsz) * multiplier * 100) / 100 + "em";   // Change body text size        
	}
    
    document.body.style.fontSize = fontsz;      //Set a new cookie with MooTools     
         
    var myCookie = Cookie.write('font_size', fontsz, {        
          duration: 365 //Save for 365 days     
    });   
}   

function str_replace(search, replace, subject) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Gabriel Paderni
    // +   improved by: Philip Peterson
    // +   improved by: Simon Willison (http://simonwillison.net)
    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   bugfixed by: Anton Ongson
    // +      input by: Onno Marsman
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +    tweaked by: Onno Marsman
    // *     example 1: str_replace(' ', '.', 'Kevin van Zonneveld');
    // *     returns 1: 'Kevin.van.Zonneveld'
    // *     example 2: str_replace(['{name}', 'l'], ['hello', 'm'], '{name}, lars');
    // *     returns 2: 'hemmo, mars'
 
    var f = search, r = replace, s = subject;
    var ra = r instanceof Array, sa = s instanceof Array, f = [].concat(f), r = [].concat(r), i = (s = [].concat(s)).length;
 
    while (j = 0, i--) {
        if (s[i]) {
            while (s[i] = (s[i]+'').split(f[j]).join(ra ? r[j] || "" : r[0]), ++j in f){};
        }
    };
 
    return sa ? s : s[0];
}

function addJSTagsForAjax(code) {
	var newcode = str_replace('scr"+"ipt','script',code);
	return newcode;
}

function isIE(){
	if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)){ //test for MSIE x.x;
		var ieversion=new Number(RegExp.$1); // capture x.x portion and store as a number
		return ieversion;
	}
	else return false;
}


function urlencode( str ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Philip Peterson
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: AJ
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Brett Zamir
    // %          note: info on what encoding functions to use from: http://xkr.us/articles/javascript/encode-compare/
    // *     example 1: urlencode('Kevin van Zonneveld!');
    // *     returns 1: 'Kevin+van+Zonneveld%21'
    // *     example 2: urlencode('http://kevin.vanzonneveld.net/');
    // *     returns 2: 'http%3A%2F%2Fkevin.vanzonneveld.net%2F'
    // *     example 3: urlencode('http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a');
    // *     returns 3: 'http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a'
                             
    var histogram = {}, tmp_arr = [];
    var ret = str.toString();
    
    var replacer = function(search, replace, str) {
        var tmp_arr = [];
        tmp_arr = str.split(search);
        return tmp_arr.join(replace);
    };
    
    // The histogram is identical to the one in urldecode.
    histogram["'"]   = '%27';
    histogram['(']   = '%28';
    histogram[')']   = '%29';
    histogram['*']   = '%2A';
    histogram['~']   = '%7E';
    histogram['!']   = '%21';
    histogram['%20'] = '+';
    
    // Begin with encodeURIComponent, which most resembles PHP's encoding functions
    ret = encodeURIComponent(ret);
    
    for (search in histogram) {
        replace = histogram[search];
        ret = replacer(search, replace, ret) // Custom replace. No regexing
    }
    
    // Uppercase for full PHP compatibility
    return ret.replace(/(\%([a-z0-9]{2}))/g, function(full, m1, m2) {
        return "%"+m2.toUpperCase();
    });
    
    return ret;
}

function urldecode( str ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Philip Peterson
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: AJ
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Brett Zamir
    // %          note: info on what encoding functions to use from: http://xkr.us/articles/javascript/encode-compare/
    // *     example 1: urldecode('Kevin+van+Zonneveld%21');
    // *     returns 1: 'Kevin van Zonneveld!'
    // *     example 2: urldecode('http%3A%2F%2Fkevin.vanzonneveld.net%2F');
    // *     returns 2: 'http://kevin.vanzonneveld.net/'
    // *     example 3: urldecode('http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a');
    // *     returns 3: 'http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a'
    
    var histogram = {};
    var ret = str.toString();
    
    var replacer = function(search, replace, str) {
        var tmp_arr = [];
        tmp_arr = str.split(search);
        return tmp_arr.join(replace);
    };
    
    // The histogram is identical to the one in urlencode.
    histogram["'"]   = '%27';
    histogram['(']   = '%28';
    histogram[')']   = '%29';
    histogram['*']   = '%2A';
    histogram['~']   = '%7E';
    histogram['!']   = '%21';
    histogram['%20'] = '+';
 
    for (replace in histogram) {
        search = histogram[replace]; // Switch order when decoding
        ret = replacer(search, replace, ret) // Custom replace. No regexing   
    }
    
    // End with decodeURIComponent, which most resembles PHP's encoding functions
    ret = decodeURIComponent(ret);
 
    return ret;
}



Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

