/* changes and help */

function checkUnsavedChange( field, form_name, event) {	
	if ( document.forms[form_name].unsaved_changes.value == "true") {
		return;
	} else {
		if (field.type == 'checkbox') {
			if (event == 'onchange') {
				registerUnsavedChange(form_name);
			}
		}	
		else if (field.type == 'select-one') {
			if (event == 'onchange') {
				registerUnsavedChange(form_name);
			}
		} else if (field.value != field.defaultValue) {
			registerUnsavedChange(form_name);
		}
	}
}

function registerUnsavedChange( form_name ) {
	var unsavedField = document.forms[form_name].unsaved_changes;
	var firstSave = "false" == unsavedField.value;
	if (firstSave) {
		unsavedField.value = "true";
		
		var unsavedMessageDiv = document.getElementById('l-unsaved-changes');
		unsavedMessageDiv.className = 'active-unsaved-changes';	
	}
}

function checkUnsavedRefresh( form_name ) {
	var unsavedField = document.forms[form_name].unsaved_changes;
	if ("true" == unsavedField.value) {
		unsavedField.value = "false";
		registerUnsavedChange( form_name );	
	}
}


function setHelpText( helpText ) {
	var helpDiv = document.getElementById("l-help");
	helpDiv.innerHTML = '<p>' + helpText + '</p>';
}

function resetHelpText( helpText ) {
	var helpDiv = document.getElementById("l-help");
	helpDiv.innerHTML = '';
}

function help() {
	//determine which page is showing and open the help for it
	url = document.forms['helpid'].help.value;
	var pageName = getRootDirectory() + 'member/help.jsp?page=' + url;
	window.open(pageName,'helpwin');
}


/* account selector */

// this function is to be used from the onchange
// handler of the select
// This section is to prevent select's from
// loading again once a request has already
// been sent.

// START LOADING FUNCTIONS
var formSubmitted = false;

function setPageLoading(){
	formSubmitted = true;
}

function isPageLoading(){
	return formSubmitted;
}

// the same as submit loading url except get the url from a function.
function submitLoadingURLWithFunct(func) {

	if (!isPageLoading()) {
		//alert("about to load funct");
		if (func()) {
			setPageLoading();
		}
	}
}

function submitLoadingURL(theForm, url) {

	if (!isPageLoading()) {
		if (url != ''){
			theForm.action=url;
		}
		setPageLoading();
		theForm.submit();
	}
}


function submitLoading( theForm ) {
	submitLoadingURL(theForm, '' );
}

/* focus */
// Set focus on the first element that the user is reqd to fill in
function setFirstFocus(){
	var theForm;
	var formFound = false;
	var excluded = "account_selector helpid";
	for(var i=0; i < document.forms.length; i++) {
		var tmpName = document.forms[i].id;
		if(excluded.indexOf(tmpName) == -1) {
			var tmpForm = document.forms[tmpName];
			if(isDefined(tmpForm)) {
				theForm = tmpForm;
				formFound = true;
				break;
			}		
		}
	}
	if(formFound) {
		var smallestIndex = -1;
		var smallestElement;
		for(var i=0, elementCount = theForm.elements.length; i < elementCount; i++) {
			var element = theForm.elements[i];
			if (isFocusable(element)) {
				if(smallestIndex == -1) {
					smallestIndex = element.tabIndex;
					smallestElement = element;
				} else if(element.tabIndex < smallestIndex){
					smallestIndex = element.tabIndex;
					smallestElement = element;	
				}
			}		
		}
		if(smallestIndex != -1) {
			smallestElement.focus()
		}
	}	
}

function isFocusable(element) {
	return element.tabIndex > 0 && 
		(element.type.indexOf('text') != -1 || element.type == 'password') &&
    	!( (element.type.indexOf('text') != -1) && element.readOnly) && 
		!element.disabled;
}

/* format date */

//Used to format date values for last logged in

/*
APM 6968 05/01/2004
This will return the formatted text to print out the last logged in time
*/
function formatLastLoggedInDate(date) {
     var offset = new Date().getTimezoneOffset();
	offset *= -1;
	var GMT = new String();
	if((offset % 60) != 0){
		GMT = ((offset - 30) / 60) + ":30 GMT";
	} 
	else{
		GMT = offset / 60 + " GMT";
	}
	var text = formatDay(date) + " " + formatMonth(date) + " " +
	date.getDate() + " " + date.getFullYear() + ", " + formatDecimal(date.getHours()) + ":" +
	formatDecimal(date.getMinutes()) + " (Time Zone " + GMT +")";
	return text;
}

//here for backwards compadaibility only
function formatLastLoggedIn(date, label){
	return label + " " + formatLastLoggedInDate(date);
}

/* 
Gets the hour or minute and formats it to the correct decimal place
*/
function formatDecimal(t){
	var time = new String();
	if(t < 10){
		time = "0" + t;	
	}	
	else{
		time = t;
	}
	return time;
}
/* 
Gets the month name as a string from a date object
*/
function formatMonth(D) {
	var MA = new String('JanFebMarAprMayJunJulAugSepOctNovDec')
	var M3 = 3*D.getMonth();
	var month = MA.substring(M3, M3+3);
	return month;
}

/* 
Gets the day name as a string from a date object
*/
function formatDay(D) {
	var DA = new String('SunMonTueWedThuFriSat')
	var D3 = 3*D.getDay();
	var day = DA.substring(D3, D3+3);
	return day;
}

/*
 validate
*/
//Functions to perform validations on input fields

function filter_number(in_string){
	var lookup='0123456789.'
	var temp=''
	in_string=in_string+""

	for (i=0; i< in_string.length; i++){
		if (lookup.indexOf(in_string.charAt(i))!=-1){
			temp+=in_string.charAt(i)
		}
	}
	return temp
}

function split_numeric(in_string) {
	var new_array=new Array()
	var lookup='0123456789'
	var j=0
	var temp=""
	var i

	in_string=in_string+""
	for (i=0; i< in_string.length; i++){
		if (lookup.indexOf(in_string.charAt(i))==-1){
			if (temp !=''){
				new_array[j]=temp
				temp=""
				j++
			}
		}else{
			temp+=in_string.charAt(i)
		}
	}
	if(temp!="")
		new_array[j]=temp
	return new_array
}

function check_date(day,month,year){
  day=parseInt(day+"", 10)
  month=parseInt(month+"", 10)
  year=parseInt(year+"", 10)
  if (month == 1||month == 3||month == 5||month == 7||month == 8||month == 10||month == 12)
      if (31 >= day && day >=1)
          return true
  if (month == 2){
      days=28
      if (year%4==0)
          days=29
      if (year%100==0)
          days=28
      if (year%400==0)
          days=29
      if (days >=day && day >=1)
          return true
  }
  if (month == 4||month == 6||month == 9||month == 11)
      if (30 >= day && day >=1)
          return true
  return false
}

function is_number(in_string) {
    allow = '0123456789.';
    if (in_string == '') {
        return false;
    }
    var i;
    for (i = 0; i < in_string.length; i++){
        if (allow.indexOf(in_string.charAt(i)) == -1){
        	if (!(i == 0 && in_string.length > 1 && in_string.charAt(i) == '-')) {
            	return false;
            }
        }
    }
    return true;
}

function removeCommas(inString) {
	if (inString == null) {
		return null;
	}
	var resultingString = "";
	for(var i=0; i < inString.length; i++) {
		if (inString.charAt(i) != ',') {
			resultingString += inString.charAt(i);
		}
	}
	return resultingString;
}

function round(in_string, dp) {
	in_string = "" + in_string;
	if(is_number(in_string)) {
		num = parseFloat(in_string);
		temp = "";
		if(num == 0) {
			temp = "0";
			for(i=0;i<dp;++i) {
				temp += "0";
			}
		} else {
			if(num < 1 && num > 0) {
				temp = "0";
			}
			temp += Math.round(num * Math.pow(10, dp));
		}
		retval = temp.substring(0, temp.length - dp);
		if (dp != 0){
			retval = retval + "." + temp.substring(temp.length - dp, temp.length);
			if (retval.charAt(0) == "." ){
				retval = "0" + retval;	
			}
		}
		
		return retval;
	} else {
		return in_string;
	}
}

function format(element) {
	element.value = round(element.value, 2);
}

function checkDate(field){
	var nw=new Date()
	var val = field.value
	val = val+''

	strings = split_numeric(val)
	if (strings.length == 3) {
		day = parseInt(strings[0], 10);
		month = parseInt(strings[1], 10);
		year = parseInt(strings[2], 10);
	} else {
		return false;
	}
	if (day > 31 && 32>year){
		temp=day
		day=year
		year=temp
	}
	if (year < 100){
		cy=nw+""
		cy=parseInt(cy.substring((cy.length)-4,cy.length))
		nw=nw+""
		cn=nw.substring((nw.length)-4,(nw.length)-2)+"00"
		cn=parseInt(cn)
		if (Math.abs(cy - (cn+year))>Math.abs(cy - (cn+year -100))){
            year=cn+year -100
		}else if(Math.abs(cy - (cn+year))>Math.abs(cy - (cn+year +100))){
            year=cn+year +100
		}else{
            year=cn+year
		}
	}
	if (!check_date(day,month,year)){
		return false
	}
	field.value=((10>day)?"0":"")+day+"/"+((10>month)?"0":"")+month+"/"+year
	return true
}

//These are the nice functions that should be called
//from other pages.

function isBlank(fld) {
    return (fld.value == '');
}

function isNumber(fld) {
    return is_number(fld.value);
}

function isDate(fld) {
    return checkDate(fld);
}

function trim(str) {
	while((str.lastIndexOf(" ") == str.length-1) && (str.length > 0)) {
		str = str.substring(0, str.length-1);
	}
	return str;
}

function trim2(before) {
	arrayOfStrings = before.split(" ");
	var after = "";
	for (var i=0; i<arrayOfStrings.length; i++) {
		after = after.concat(arrayOfStrings[i]);
	}
	return after;
}

function selected(sel) {
	return sel.options[sel.selectedIndex].value;
}

function selectedOption(sel) {
	return sel.options[sel.selectedIndex];
}

function filterNumber(fld) {
	fld.value = filter_number(fld.value);
	return fld;
}

function validateExpiry(strMonth, strYear) {
    /*
     * kb. (25/07/01). SIR 1030. Contrib expiry date not recognising month numbers starting with zero.
     * eg. '09'. Fixed parseInt invocations to specify the base.
     */
	expiry_month = parseInt(strMonth, 10);
	expiry_year = parseInt(strYear, 10);

	current = new Date();
	current_year = current.getYear();
	current_month = current.getMonth() + 1;

	if (expiry_month > 12 || expiry_month < 1) {
		return -1;
	} else if (expiry_year < current_year) {
		return -2;
	} else if ((expiry_year == current_year) && (expiry_month < current_month)) {
		return -3;
	} else {
		return 0;
	}
}

function formatDate(date) {
	return date.getDate() + "/" + (date.getMonth()+1) + "/" + (date.getYear() <= 1900 ? date.getYear() + 1900 : date.getYear());
}


/* This function comparse to date1 to date2
 * If date1 is less than date2 then -1 is returned
 * If date1 is greater than date2 1 is returned
 * If date1 is equal to date2 then 0 is returned
 */

function dateComparison(date1, date2) {
	var date1Year = date1.getYear() <= 1900 ? date1.getYear() + 1900 : date1.getYear();
	var date2Year = date2.getYear() <= 1900 ? date2.getYear() + 1900 : date2.getYear();
	if (date1Year < date2Year) {
		return -1;
	} else if (date1Year > date2Year) {
		return 1;
	} else {
		if (date1.getMonth() < date2.getMonth()) {
			return -1;
		} else if (date1.getMonth() > date2.getMonth()) {
			return 1;
		} else {
			if (date1.getDate() < date2.getDate()) {
				return -1;
			} else if (date1.getDate() > date2.getDate()) {
				return 1;
			} else {
				return 0;
			}
		}
	}
}


/* Compares the two dates which are strings in the form dd/MM/yyyy.
 * Returns 0 if date1 = date2
 * -1 if date1 is less than date2
 * 1 if date1 is greater than date2
 * -2 if an error occurred
 * NOTE that some kind of validation should first be performed on the given
 * dates. eg. checkDate() - see above
 */

function dateComparisonStr(date1, date2)
{
	var nw = new Date()

	firstDate = split_numeric(date1);
	secondDate = split_numeric(date2);

	if (firstDate.length == 3)
	{
		firstDay = parseInt(firstDate[0], 10);
		firstMonth = parseInt(firstDate[1], 10);
		firstYear = parseInt(firstDate[2], 10);
	}
	else
	{
		return -2;
	}

	if (secondDate.length == 3)
	{
		secondDay = parseInt(secondDate[0], 10);
		secondMonth = parseInt(secondDate[1], 10);
		secondYear = parseInt(secondDate[2], 10);
	}
	else
	{
		return -2;
	}

	if (firstYear == secondYear)
	{
		if (firstMonth == secondMonth)
		{
			if (firstDay == secondDay)
			{
				return 0;
			}
			else
			{
				return ((firstDay > secondDay) ? 1 : -1);
			}
		}
		else
		{
			return ((firstMonth > secondMonth) ? 1 : -1);
		}
	}
	else
	{
		return ((firstYear > secondYear) ? 1 : -1);
	}
}

function focusAndSelect(objid) {
	obj = document.getElementById(objid);

	if(obj && obj.type != 'hidden' && obj.type != 'span') {
		if(obj.select) {
			obj.select();
		}
		if(obj.focus) {
			obj.focus();
		}
	}
}

function radioValue(obj) {
	if (obj.length) {
		// more than 1 in the group
		for (var i=0; i<obj.length; ++i) {
			if (obj[i].checked) {
				return obj[i].value;
			}
		}
		return null;
	} else {
		return obj.value;
	}
}
function setRadioValue(obj, value) {
	alert(obj.length);
	for (var i=0; i<obj.length; ++i) {
		alert(obj[i]);
	}
}

// format number into #,##0.00 format
function formatDollarString(num,dp){
	var fnum = cleanRound(num, dp);
	
	if ( fnum.length >= 7 ){ 
		fnum = fnum.substr(0,fnum.length-6) + "," + fnum.substr(fnum.length-6,fnum.length);
	}
	if ( fnum.length >= 11 ){
		fnum = fnum.substr(0,fnum.length-10) + "," + fnum.substr(fnum.length-10,fnum.length);
	}
	if ( fnum.length >= 15 ){
		fnum = fnum.substr(0,fnum.length-14) + "," + fnum.substr(fnum.length-14,fnum.length);
	}
	
	return fnum;
}

// Remove leading and trailing decimalplaces
function cleanRound(in_string, dp) {
	in_string = round(in_string, dp);
	
	// a unusual result created from the round function
	if (in_string == "00" ){
		in_string = "0.";
		for (var i=0; i < dp; ++i){
		    in_string += "0";	
		}			
	} else {
		if (in_string.length > 1 && in_string.charAt(0) == 0 && in_string.charAt(1) != "." ){
			in_string = in_string.substr(1,in_string.length-1);
		}
	}
	
	// decimal places are zero but not catered for
	if (in_string.charAt(in_string.length-1) == '.') {
		in_string = in_string.substr(0,in_string.length-1)
	}
	
	// only decimal but no zero
	if (in_string.charAt(0) == '.'){
		in_string = "0" + in_string;	
	}
	return in_string;
}

function isUndefined(a) {
    return !isDefined(a);
}

function isDefined(a) {
	return typeof a != 'undefined';
}

function isDefinedAndEmpty(field) {
	if (!isDefined(field)) {
		return false;
	} else {
		return isEmpty(field);
	}
}

function isDefinedAndNotEmpty(field) {
	if (!isDefined(field)) {
		return false;
	} else {
		return !isEmpty(field);
	}
}

function isEmpty(value) {
	if (typeof value == 'object') {
		value = value.value;
	}
	return value == null || trim(value).length == 0;
}

function setValueIfDefined(field,value) {
	if (typeof field != 'undefined') {
		field.value = value;
	}
}

function clearIfDefined(field) {
	setValueIfDefined(field,'');
}

function enableFirst() {
	for(var i=1; i < arguments.length; i++) {
		var name = arguments[i];
		if (name != arguments[0]) {
			var ds = document.getElementById(name);
			if (ds) {
				ds.disabled = true;
			}
		}
	}
	var en = document.getElementById(arguments[0]);
	if (en) {
		en.disabled = false;
	}
	en.focus();
}

function checkRadioIfExists(name) {
	var radio = document.getElementById( name );
	if (radio) {
		radio.checked = true;
	}
}

function areCookiesEnabled(){
	//if not IE4+ nor NS6+
	if (!isDefined(navigator.cookieEnabled)){ 
	  	var tmpcookie = new Date();
	  	chkcookie = (tmpcookie.getTime() + '');
  		document.cookie = "chkcookie=" + chkcookie + "; path=/";
  		var cookieEnabled = !(document.cookie.indexOf(chkcookie,0) < 0);
		document.cookie=""; //erase dummy value
		return cookieEnabled;
	} else {
		return navigator.cookieEnabled;
	}
}

/*
 * Opens a 'generic' popup window. 
 */
function openPopupWindow(URL, width, height) {
	var h = height;
	var w = width;
	var top = 10;
	var left = 25;
	var params = 'width=' + w + ',screenX=5,screenY=5,height=' + h + ',left=' + left + ',top=' + top + ',resizable=yes,menubar=no,scrollbars=no,titlebar=no,toolbar=no,status=no';
    window.open(URL, new Date().getTime(), params);
}

// PG moved doPDF() to a central location
function doPDF(pdfURL) {
	var h = Math.round(screen.availHeight - 50);
	var w = Math.round(screen.availWidth - 50);
	openPopupWindow(pdfURL, w, h);
}

function openMemberPDF(url) {		
	var pdf_loc = getRootDirectory()+'members/pdf/'+url;		
	doPDF(pdf_loc);
}

/*
 * Valid return values NoJava, JavaUnknown, Java1.4-, Java5+
 */
function getJavaVersion() {
	var numPlugs=navigator.plugins.length;
	var lessJava15 = false;
	var equalMoreJava15 = false;
	if (numPlugs) {
		for (var x=0; x<numPlugs; x++) {
			var description = navigator.plugins[x].description;
			if (description.match('Java.* [2-9][.][0-9]')) {
				equalMoreJava15 = true;
			} else if (description.match('Java.* 1[.][5-9]')) {
				equalMoreJava15 = true;
			} else if (description.match('Java.* 1.[1-4]')) {
				lessJava15 = true;
			}
		}
	} else {
		return navigator.javaEnabled() ? 'JavaUnknown' : 'NoJava'
	}
	if (equalMoreJava15) {
		return 'Java5+';
	} else if (lessJava15) {
		return 'Java1.4-';
	} else {
		return 'NoJava';
	}
}

/*
	Show or hide a folder's files. Also change the icon on the folder to either
	folder-open or folder-closed.
*/
function changeFolderTree(id) {
	var files = document.getElementById(id);
	var shouldHide = (files.style.display != "none");
	files.style.display = shouldHide ? "none" : "inline";
	var folder = document.getElementById(id + 'folder');
	folder.className = shouldHide ? "folder-closed" : "folder-open";
}

function showSection(divId) {
	if (isDefined(document.getElementById(divId))) {
		document.getElementById(divId).style.display = "block";
	}
}

function hideSection(divId) {
	if (isDefined(document.getElementById(divId))) {
		document.getElementById(divId).style.display = "none";	
	}
}