function isEmpty(inputStr) {
	if (trim(inputStr).length==0) {
		return true;
	}
	return false;
}

function isInputEmpty(field, fieldName) {
	if (isEmpty(field.value)) {
		alert("Please enter " + fieldName);
		field.focus();
		return true;
	}
	return false;
}

// Return true if date object is a valid date
function isValidDate(date) {
	var inputStr = date.value;
	
	var delim1 = inputStr.indexOf("/");
	var delim2 = inputStr.lastIndexOf("/");
	if (delim1 == -1 || delim1 == delim2) {
		return false;
	}

	//there are delimiters; extract component values
	var dd = inputStr.substring(0,delim1);
	var mm = inputStr.substring(delim1 + 1, delim2);
	var yyyy = inputStr.substring(delim2 + 1, inputStr.length);

	if (!isNumber(dd) || !isNumber(mm) || !isNumber(yyyy)) {
		return false;
	}
	
	//there are delimiters; extract component values
	dd = parseInt(dd, 10);
	mm = parseInt(mm, 10);
	yyyy = parseInt(yyyy, 10);

	if (yyyy < 1900 || yyyy > 9999) {
		return false;
	}

	if (mm < 1 || mm > 12) {
		return false;
	}

	var months = new Array("", "January", "Febuary", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");

	var monthlength = getMonthLength(mm,yyyy);

	if (dd > monthlength) {
		return false;
	}

//  PR7 5/7/2000	
	if (dd == 00 || dd == 0) {
		return false;
	}
		
	if (mm.toString().length == 1) mm = "0" + mm;
	if (dd.toString().length == 1) dd = "0" + dd;
	
	date.value = ""+dd+"/"+mm+"/"+yyyy;

	return true;
}

// Return true if date object is a valid date
// otherwise display error message and focus on the object and return false
function isDate(date) {
	var inputStr = date.value;
	
	var delim1 = inputStr.indexOf("/");
	var delim2 = inputStr.lastIndexOf("/");
	if (delim1 == -1 || delim1 == delim2) {
		alert("Please enter the date in dd/mm/yyyy format.");
		date.focus();
		return false;
	}

	//there are delimiters; extract component values
	var dd = inputStr.substring(0,delim1);
	var mm = inputStr.substring(delim1 + 1, delim2);
	var yyyy = inputStr.substring(delim2 + 1, inputStr.length);

	if (!isNumber(dd) || !isNumber(mm) || !isNumber(yyyy)) {
		alert("Please enter the date in dd/mm/yyyy format.");
		date.focus();
		return false;
	}
	
	//there are delimiters; extract component values
	dd = parseInt(dd, 10);
	mm = parseInt(mm, 10);
	yyyy = parseInt(yyyy, 10);
	
	if (yyyy < 1900 || yyyy > 9999) {
		alert("Please enter a 4 digit year between 1900 and 9999.");
		date.focus();
		return false;
	}


	if (mm < 1 || mm > 12) {
		alert("Months must be entered between the range of 1 (January) and 12 (December).");
		date.focus();
		return false;
	}

	var months = new Array("", "January", "Febuary", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");

	var monthlength = getMonthLength(mm,yyyy);

	if (dd > monthlength) {
		alert(months[mm] + " of " + yyyy + " has only " + monthlength + " days.");
		date.focus();
		return false;
	}

//  PR7 5/7/2000	
	if (dd == 00 || dd == 0) {
		alert("You must enter a valid day.");
		date.focus();
		return false;
	}
	
	if (mm.toString().length == 1) mm = "0" + mm;
	if (dd.toString().length == 1) dd = "0" + dd;
	
	date.value = ""+dd+"/"+mm+"/"+yyyy;
	
	return true;
}

// Return the length of month from the input month and year
function getMonthLength(mm,yyyy) {
	if (mm == 2) {
		if (yyyy % 4 > 0) {
			return 28;
		}
		else {
			return 29;
		} 
	} 
	if (mm == 4 || mm == 6 || mm == 9 || mm == 11) {
		return 30;
	}
	return 31;
}

// It is a valid input date if it is empty or valid date
// otherwise display error message and focus on the object and return false
function isInputDate(date) {
  	if (isEmpty(date.value)) return true;
	else return isDate(date);
}

function isInputContractDate(date) {
	return isInputDateEarlierThanToday(date, "Contract Date");
}

// It is a valid DOB if it is empty or (it is a valid date and earlier than today)
// otherwise display error message and focus on the object and return false
function isInputDOB(dob) {
	return isInputDateEarlierThanToday(dob, "Date of Birth");
}

// return true if date object is empty or (its value is a valid date and not later than today)
// otherwise display error message and focus on the object and return false
function isInputDateEarlierThanToday(date, fieldName) {
  	if (isEmpty(date.value)) return true;
	else return isDateEarlierThanToday(date, fieldName);
}

// return true if date object is empty or (its value is a valid date and not earlier than today)
// otherwise display error message and focus on the object and return false
function isInputDateLaterThanToday(date, fieldName) {
  	if (isEmpty(date.value)) return true;
	else return isDateLaterThanToday(date, fieldName);
}

// return true if date object is a valid date and not earlier than today
// otherwise display error message and focus on the object and return false
function isDateLaterThanToday(date, fieldName){
	// check if it is a date
	if (!isDate(date)) return false;

	// check if	it is later than today
	if (!isValidDateLaterThanToday(date.value)) {
		alert(fieldName + " must not be earlier than today.");
		date.focus();
		return false;
	}
	return true;
}

// return true if date object is a valid date and not later than today
// otherwise display error message and focus on the object and return false
function isDateEarlierThanToday(date, fieldName){
	// check if it is a date
	if (!isDate(date)) return false;

	// check if	it is later than today
	if (!isValidDateEarlierThanToday(date.value)) {
		alert(fieldName + " must not be greater than todays date.");
		date.focus();
		return false;
	}
	return true;
}

// return true if date object is a valid date and not later than today
function isValidDateEarlierThanToday(date) {
	// check if	it is later than today
	if (date2Time(date) > date2Time(getTodayStr())) {
		return false;
	}
	
	return true;
}

// return true if date object is a valid date and not earlier than today
function isValidDateLaterThanToday(date) {
	// check if	it is later than today
	if (date2Time(date) < date2Time(getTodayStr())) {
		return false;
	}
	
	return true;
}

function getTodayStr() {
	var nowaday = new Date();
	
	return date2Str(nowaday);
}

function isDateLessThanFirstJuly(date, fieldName) {
  	if (isEmpty(date.value)) return true;
	if (!isDate(date)) return false;

	if (dateComp(date.value, "01/07/2000") < 0) {			
		alert (fieldName + " must not be less than 1/7/2000.");
		date.focus();
		return false;
	}
	return true;
}

function isValidDateLessThanFirstJuly(date) {
  	if (isEmpty(date.value)) return true;
	if (!isDate(date)) return false;
	if (dateComp(date.value, "01/07/2000") < 0) {			
		return false;
	}
	return true;
}

function chkFrmDate2Date(d1,d2) {

	if (isEmpty(d1.value)) {
		if (!isEmpty(d2.value)) {
			alert ("Please enter a From Date");
			d1.focus();
			return false;
		}
	}
	
	if (isEmpty(d2.value)) {
		if (!isEmpty(d1.value)) {
			alert ("Please enter a To Date");
			d2.focus();
			return false;
		}
	}
 
	if (isEmpty(d1.value) && isEmpty(d2.value)) {
		return true;
	}
	
	if (dateComp(d1.value, d2.value) > 0) {
		alert ("From Date can not be later than To Date");
		d1.focus();
		return false;
	}
	return true;
}

// return time from date string
function date2Time(datestr) {
	return Date.UTC(datestr.substring(6,10), parseInt(datestr.substring(3,5), 10)-1, datestr.substring(0,2))
}

function dateComp(d1, d2) {
	return date2Time(d1) - date2Time(d2);			
}


function date2Str(date) {
	var dd = date.getDate();
	if (dd.toString().length == 1) dd = "0"+dd;

	var mm = date.getMonth() + 1;
	if (mm.toString().length == 1) mm = "0"+mm;

	var yyyy = date.getYear();
	if (yyyy.toString().length < 4) {
		if (yyyy > 80) yyyy = yyyy + 1900;
		else yyyy = yyyy + 2000;
	}

	return ""+dd+"/"+mm+"/"+yyyy;
}

function isNumber(num) {
	var valid = "0123456789";
	var temp;
   
	num = trim(num);    
	for (var i=0; i<num.length; i++) {
    	temp = "" + num.substring(i, i+1);
    	if (valid.indexOf(temp) == "-1") {
			return false;
		}
  	}	
 	return true;
}

function isFloat(num) {
	var valid = ".0123456789";
	var temp;
   
	num = trim(num);    
	for (var i=0; i<num.length; i++) {
    	temp = "" + num.substring(i, i+1);
    	if (valid.indexOf(temp) == "-1") {
			return false;
		}
  	}	
 	return true;
}

function isInputNumber(num, fieldName) {
  	if (isEmpty(num.value))	return true;
	if (!isNumber(num.value)) {
		alert("Please enter a number on " + fieldName);
		num.focus();
		return false;	
	}
	return true;
}

function upper(field) {
	var upper = field.value
	
	upper = upper.toUpperCase();
	field.value = trim(upper);
}

function checkInputLength(field, fieldLen, fieldName) {
	if (trim(field.value).length < fieldLen) {
		alert("Please enter "+fieldName+ " in not less than " + fieldLen + " characters");
		field.focus();
		return false;
	}
	return true; 
}

function isInputPostcode(postcode) {
	return isInputDigits(postcode, "Postcode", 4);
}

function isInputBSB(bsb) {
	return isInputDigits(bsb, "BSB", 6);
}

function isInputDigits(digits, fieldName, fieldLen) {
  	if (isEmpty(digits.value))
		return true;
	if (!isNumber(digits.value) || (trim(digits.value).length < fieldLen)) {
		alert("Please enter "+fieldName+" in " + fieldLen + " digits");
		digits.value = trim(digits.value)
		digits.focus();
		return false;
	}
	return true; 
}

function isValidDigits(digits, fieldLen) {
	if (!isNumber(digits) || (trim(digits).length < fieldLen)) {
		return false;
	}
	return true; 
}

function trim(str) {
	return rtrim(ltrim(str));
}

function rtrim(str) {
	while (str.length > 0 && str.substring(0,1) == " ") { 
		str=str.substring(1);
	}
	return str;
}

function ltrim(str) {
	while (str.length > 0 && str.substring(str.length-1) == " ") {
		str=str.substring(0, str.length-1);
	}
	return str;
}

function isCents(cents) {
	cents = trim(cents);
	
	var dot = cents.indexOf(".");
	var lastdot = cents.lastIndexOf(".");

	if (dot == -1) {
		return isNumber(cents);
	}
	else { 
		if (dot != lastdot) return false;
		//if (cents.length - dot > 3) return false;
		if (cents.length - dot == 1) return false;
		
		if (isNumber(cents.substring(0, dot)) == false) return false;
		
		return isNumber(cents.substring(dot+1, cents.length));
	}
}

function isCurrency(curr) {
	curr = trim(curr);
	
	var dot = curr.indexOf(".");
	var lastdot = curr.lastIndexOf(".");

	if (dot == -1) {
		return isNumber(curr);
	}
	else { 
		if (dot != lastdot) return false;
		if (curr.length - dot > 3) return false;
		if (curr.length - dot == 1) return false;
		
		if (isNumber(curr.substring(0, dot)) == false) return false;
		
		return isNumber(curr.substring(dot+1, curr.length));
	}
}

function isInputCurrency(curr, fieldName) {
  	if (isEmpty(curr.value)) return true;
	if (!isCurrency(curr.value)) {
		alert("Please enter the " + fieldName + " without $ or punctuation eg 150000.00");
		curr.focus();
		return false;	
	}
	return true;
}

// Formats a number as currency, containing cents.
function formatCurrencyLong(num) {

	num = num.toString().replace(/ |\$|\,/g,'');

	// If not numeric, return nothing:	
	if (isNaN(num) || num == '') return('');

	// Determine cents:	
	cents = Math.floor((num*100+0.5)%100); 
	
	num = Math.floor(num).toString();

	// Pad cents with a leading zero: 	
	if (cents < 10) cents = "0" + cents;

	// Add commas:
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++) 
		num = num.substring(0,num.length-(4*i+3))+','+num.substring(num.length-(4*i+3)); 

	// Build the final amount:	
	return ('$' + num + '.' + cents); 
	
}

// Formats a number as currency, with cents removed.
function formatCurrencyShort(num) {

	num = num.toString().replace(/ |\$|\,/g,'');

	// If not numeric, return nothing:	
	if (isNaN(num) || num == '') return('');

	num = Math.floor(num).toString();

	// Add commas:
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++) 
		num = num.substring(0,num.length-(4*i+3))+','+num.substring(num.length-(4*i+3)); 

	// Build the final amount:	
	return ('$' + num); 
	
}

// rounds a number to a specified number of decimal places.
function roundNumber(num,decplaces) {
	decplaces = (!decplaces ? 2 : decplaces);
	num = '' + num;
	num = num.substring(0,25);
	num = Number(num);
    return Math.round(num*Math.pow(10,decplaces)) / Math.pow(10,decplaces);
}
