/* onload ************************************** */
if (window.attachEvent) //IE
	window.attachEvent("onload", global);
if (window.addEventListener) //Others
	window.addEventListener("load", global, true);



/* functions ************************************** */
function global() {
	//Global Date/Time
	if(document.getElementById('global_clock')) {
		updateClock();
	}

	if(document.getElementById('global_countUp')) {
		countUp(0);
	}
}



/************************
* round
* @param {string} num - the number to be rounded.
* @param {string} dec - the number of decimal places you want rounded to.
************************/
function roundNumber(num, dec) {
	return parseFloat(parseFloat(num).toFixed(dec));
}


/************************
strtolower
************************/
function strtolower(str) {
    return (str+'').toLowerCase();
}


/************************
Numbers Only
************************/
function numbersOnly(str) {
	if(str.indexOf('.') != -1) {
		var split = str.split('.');
		return split[0].replace(/[^0-9]/g, '')+'.'+split[1].replace(/[^0-9]/g, '');
	} else {
		return str.replace(/[^0-9]/g, '');
	}
}


/************************
Ucfirst
http://kevin.vanzonneveld.net
************************/
function ucfirst(str) {
	str += '';
	var f = str.charAt(0).toUpperCase();
	return f + str.substr(1);
}


/************************
ucwords
Uppercase the first character of every word in a string
http://kevin.vanzonneveld.net
************************/
function ucwords( str ) {
    return (str+'').replace(/^(.)|\s(.)/g, function ( $1 ) { return $1.toUpperCase ( ); } );
}


/************************
Implode
Example: implode(' ', ['Kevin', 'van', 'Zonneveld']);
http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_implode/
************************/
function implode(glue, pieces) {
	return ((pieces instanceof Array) ? pieces.join(glue) : pieces);
}


/************************
Empty
http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_empty/
************************/
function empty(mixed_var) {
	var key;
	
	if (mixed_var === ""
		|| mixed_var === 0
		|| mixed_var === "0"
		|| mixed_var === null
		|| mixed_var === false
		|| mixed_var === undefined
	){
		return true;
	}
	
	if (typeof mixed_var == 'object') {
		for (key in mixed_var) {
			return false;
		}
		return true;
	}
	
	return false;
}


/************************
is_string
Returns true or false.
http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_is_string/
************************/
function is_string( mixed_var ){
    return (typeof( mixed_var ) == 'string');
}


/************************
str_replace
http://kevin.vanzonneveld.net
************************/
function str_replace(search, replace, subject) {
    var s = subject;
    var ra = r instanceof Array, sa = s instanceof Array;
    var f = [].concat(search);
    var r = [].concat(replace);
    var i = (s = [].concat(s)).length;
    var j = 0;
    
    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];
}


/************************
trim
http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_trim/
************************/
function trim (str, charlist) {
    var whitespace, l = 0, i = 0;
    str += '';
    
    if (!charlist) {
        // default list
        whitespace = " \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000";
    } else {
        // preg_quote custom list
        charlist += '';
        whitespace = charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\$1');
    }
    
    l = str.length;
    for (i = 0; i < l; i++) {
        if (whitespace.indexOf(str.charAt(i)) === -1) {
            str = str.substring(i);
            break;
        }
    }
    
    l = str.length;
    for (i = l - 1; i >= 0; i--) {
        if (whitespace.indexOf(str.charAt(i)) === -1) {
            str = str.substring(0, i + 1);
            break;
        }
    }
    
    return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
}



/************************
Search Google for given values.
The first param (string) is the type of search.
Accepts either form field names or string values.
All other params (form fields in the DOM document. or string values) are the search terms.
************************/
function google_search() {

	var keys = arguments;
	var query = Array();
	var errMsg = Array();

	//the first arg is always the type of search.
	var type = keys[0];


	//loop through other args to build query string.
	for (i=1; i<keys.length; i++) {
		//string or form fields?
		if(is_string(keys[i])) {
			query[i] = str_replace(['\n', '\r'], [' ', ' '], keys[i]); //strip new lines in textareas etc.
		}
		else {
			if(keys[i].value == '') {
				errMsg[i] = '\n - '+ucwords(str_replace('_', ' ', keys[i].name));
				errMsg[i] = str_replace(['[', ']'], [' ', ''], errMsg[i]); //strip brackets for pretty error message
			} else {
				query[i] = str_replace(['\n', '\r'], [' ', ' '], keys[i].value); //strip new lines in textareas etc.
			}	
		}
	}

	
	//open window or alert errors.
	if(!empty(errMsg)) {
		alert('Enter the:'+implode('', errMsg));
	} else {
		switch(type) {
			case 'web' :
				window.open('http://www.google.com.au/search?hl=en&safe=off&q='+implode('\+', query)+'&btnG=Search&meta=cr%3DcountryAU');
				break;
			case 'maps' :
				window.open('http://maps.google.com.au/maps?q='+implode('\+', query));
				break;
		}
	}
}



/************************
* Validate abn on business.gov.au
* @param {string} num - the abn to search.
************************/
function validate_abn(num) {
	if(!num)
		alert('Specify the ABN/ACN.');
	else
		window.open(encodeURI('http://www.abr.business.gov.au/(1wa5olnptomhnt45gmof1a45)/search.aspx?SearchText='+num+'&StartSearch=True'), 'abn');
}



/************************
* Calculate LVR
* @param {element} loan - the loan amount field.
* @param {element} security - the security amount field.
* @param {element} lvr - the field to put the calculated value into.
************************/
function calculate_lvr(loan,security,lvr) {
	if(loan.value.length < 1 || security.value.length < 1) {
		alert('Enter both the Loan Amount and the Security Value first.');
		return;
	}

	var loan_int = numbersOnly(loan.value);
	var security_int = numbersOnly(security.value);

	if(loan_int.length < 1 || security_int.length < 1) {
		alert('Enter only "numbers" or "currency format" for the Loan Amount and Security Value.\n\nExample: $500,000 or 500000');
		return;
	}


	var calc_lvr = (loan_int/security_int)*100;
	lvr.value = roundNumber(calc_lvr, 0)+'%';
}


/************************
Popup controls.
Also appears in the screen.css
************************/
function popUpControls99999999(el,show) {
	var theDiv = el;	

	//Look for the controls, and style/show/hide them.
	for(i=0; i<theDiv.childNodes.length; i++) {
		if(theDiv.childNodes[i].className) {
			if(theDiv.childNodes[i].className.search(/popUpControlControls/i) > -1) {
				theDiv.childNodes[i].style.display = (show) ? 'inline' : 'none';
				theDiv.childNodes[i].style.left = theDiv.style.width;
			}
		}
	}

	//alert(test.clientWidth);
	theDiv.style.backgroundColor = (show) ? '#EDECFE' : 'transparent';
}


/*************************
This is useful for select box actions and for showing a confirm dialog
Example: submitForm(this,'delete~test') delete and test being the value of the select box options to validate.
Or submitForm(this,'delete')
*************************/
function submitForm(what,confirmValues) {

	//var args = submitForm.arguments;
	//var argsLength = submitForm.length;

	var theForm = what.form;
	var theValue = what.value;
	var doConfirm = false;

	//confirm it?
	if(confirmValues) {
		if(confirmValues.indexOf('~') != -1) {
			var split = confirmValues.split('~');
			for(i=0; i<split.length; i++) {
				if(split[i] == theValue) {
					doConfirm = true;
					break;
				}
			}
		}

		else if(confirmValues == theValue) {
			doConfirm = true;
		}
	}

	if(doConfirm) {
		if(!confirm('Are you sure?'))
			return false;
	}

	theForm.submit();
}


/*************************
Prints a page
************************/
function printPage(timeout) {
	if(timeout)
		setTimeout("printPage(false)", timeout);
	else
		window.print();
}



/************************
Show/Hide an element
Example: <a href='#' onclick='jsShowHide(\"logHistory\",this,\"Show History~Hide History\");return false;'>Show History]</a>
************************/
function jsShowHide(container,trigger,trigger_text) {
	
	/*
	This works, but IE doesn't handle table-row, so we specify '' (blank) as the display type.
	All browsers will default to the display type for the element Eg, div will be 'block', span will be 'inline'.
	//display; inline, table-row, table-cell?
	switch(strtolower(document.getElementById(container).tagName)) {
		case('tr') : var displayType = 'table-row'; break;
		default : var displayType = 'inline';
	}
	*/
	
	var displayType = '';
	
	document.getElementById(container).style.display = (document.getElementById(container).style.display == 'none') ? displayType : 'none';

	if(trigger_text) {
		text = trigger_text.split('~',2);
		trigger.innerHTML = (trigger.innerHTML == text[0]) ?  text[1] : text[0];
	}

}



/************************
Redirect to a new page and/or new window.
************************/
function redirect(new_url,old_url) {
	var target = null; //window target can't be false, so we use null as a default.

	if(!new_url || new_url == '') {
		return;
	}

	//target?
	if(new_url.indexOf('~') != -1) {
		var split = new_url.split('~');
		var new_url = split[0];
		var target = split[1];
	}

	//has old url?
	if(old_url) {
		var new_url = new_url+''+((new_url.indexOf('?') != -1) ? '&' : '?')+'old_url='+old_url
	}

	var action = (target) ? window.open(new_url,target) : window.location.href = new_url;
	return action;
}


/************************
Sync input fields
Useful for matching addresses and postal addresses, etc.
Example: <input type='checkbox' value='0' onclick='syncFields(this,\"address~postal_address,suburb~postal_suburb,state~postal_state,postcode~postal_postcode\");' />
************************/
function syncFields(trigger,data,clear) {

	var theForm = trigger.form;
	var fields = data.split(',');

	for(i=0; i<fields.length; i++) {
		var pairs = fields[i].split('~');

		//clear fields when unchecking?
		if(!trigger.checked || clear) {
			switch(theForm[pairs[0]].type) {
				case('select-one') : theForm[pairs[1]].selectedIndex = 0; break;
				case('checkbox') : theForm[pairs[1]].checked = false; break;
				default : theForm[pairs[1]].value = '';
			}
		}

		else {
			switch(theForm[pairs[0]].type) {
				case('select-one') : theForm[pairs[1]].selectedIndex = theForm[pairs[0]].selectedIndex;
				case('checkbox') : theForm[pairs[1]].checked = theForm[pairs[0]].checked; break;
				default : theForm[pairs[1]].value = theForm[pairs[0]].value;
			}
		}
	}
}


/************************
Check/Uncheck numerous checkboxes
************************/
function checkBoxes(what) {
	frm = what.form;
	chk = (what.checked) ? true : false;
	for(i=0; i<frm.length; i++) {
		if(frm[i].type == 'checkbox')
			frm[i].checked = chk;
	}
}



/************************
checkBoxesSubmit
************************/
function checkBoxesSubmit(what) {
	sbmt = false;
	frm = what.form;

	if(what.selectedIndex < 1) {
		return;
	}

	for(i=0; i<frm.length; i++) {
		if(frm[i].type == 'checkbox' && frm[i].checked == true) {
			sbmt = true;
			break;
		}
	}
	if(sbmt) {
		frm.submit();
	}
}


/************************
generate a random password
************************/
function generate_password(el) {

	var characters='0123456789abcdefghijklmnopqrstuvwxyz';
	var passwordlength = 6;

	var randPass = '';
	var n = 0;
	var randomnumber = 0;
	while(n < passwordlength) {
		n++;
		randomnumber = Math.floor(characters.length*Math.random());
		randPass += characters.substring(randomnumber,randomnumber + 1);
	}

	el.value = randPass;

}


/************************
updateClock
************************/
function updateClock() {
	var currentTime = new Date();
	var currentDay = currentTime.getDate();
	var currentMonth = currentTime.getMonth() + 1;
	var currentYear = currentTime.getFullYear();
	var currentHours = currentTime.getHours();
	var currentMinutes = currentTime.getMinutes();
	var currentSeconds = currentTime.getSeconds();
	
	// Pad the minutes and seconds with leading zeros, if required
	currentMinutes = ( currentMinutes < 10 ? "0" : "" ) + currentMinutes;
	currentSeconds = ( currentSeconds < 10 ? "0" : "" ) + currentSeconds;
	
	// Choose either "AM" or "PM" as appropriate
	var timeOfDay = ( currentHours < 12 ) ? "am" : "pm";
	
	// Convert the hours component to 12-hour format if needed
	currentHours = ( currentHours > 12 ) ? currentHours - 12 : currentHours;
	
	// Convert an hours component of "0" to "12"
	currentHours = ( currentHours == 0 ) ? 12 : currentHours;
	
	// Compose the string for display
	var currentTimeString = currentHours + ":" + currentMinutes;
	
	// Update the time display
	document.getElementById("global_clock").firstChild.nodeValue = currentDay+"/"+currentMonth+"/"+currentYear+" "+currentTimeString+""+timeOfDay;

	setTimeout("updateClock()", 1000);
}



/************************
countUp
************************/
function countUp(secs) {
	secVar0 = secs;

	hourVar = Math.floor(secVar0/60/60);
	minVar = Math.floor(secVar0/60);
	secVar = secVar0 % 60; // The balance of seconds

	//format hours
	if(hourVar > 1)
		hourVar = hourVar+" hours ";
	else if(hourVar > 0)
		hourVar = hourVar+" hour ";
	else
		hourVar = "";

	//format minutes
	if(minVar > 1)
		minVar = minVar+" minutes ";
	else if(minVar > 0)
		minVar = minVar+" minute ";
	else
		minVar = "";

	//format seconds
	secVar = (secVar > 1 || secVar < 1) ? secVar+" seconds": secVar+" second";

	document.getElementById("global_countUp").firstChild.nodeValue = hourVar+""+minVar+""+secVar;
	setTimeout("countUp(secVar0+1)", 1000);
}





/************************
Grabs any TR with classname 'hiliteHoverTr', and adds hover effects to it.
************************/
function hiliteHoverTr(className) {
	var myArray = getElementsByClassName(className);
	
	for(i=0; i<myArray.length; i++) {
		myArray[i].onmouseover = function() {
			this.className+=' hoverTr';
		}
	
		myArray[i].onmouseout = function() {
			this.className = this.className.replace(new RegExp(' hoverTr'), '');
		}
	}

}





/************************
	Developed by Robert Nyman, http://www.robertnyman.com
	http://www.robertnyman.com/2008/05/27/the-ultimate-getelementsbyclassname-anno-2008/
	Code/licensing: http://code.google.com/p/getelementsbyclassname/
************************/
var getElementsByClassName = function (className, tag, elm){
	if (document.getElementsByClassName) {
		getElementsByClassName = function (className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className),
				nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for(var i=0, il=elements.length; i<il; i+=1){
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else if (document.evaluate) {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for(var j=0, jl=classes.length; j<jl; j+=1){
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try	{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k=0, kl=classes.length; k<kl; k+=1){
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for(var l=0, ll=elements.length; l<ll; l+=1){
				current = elements[l];
				match = false;
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};