////////////////////////////////////////////////////////////////////////////////
// Useful JavaScript Functions Library
////////////////////////////////////////////////////////////////////////////////
function capitalizeWords( string ) {
	var tmpStr, tmpChar, preString, postString, strlen;
	tmpStr = string.toLowerCase();
	stringLen = tmpStr.length;
	if (stringLen > 0) {
	  for (i = 0; i < stringLen; i++) {
	    if (i == 0) {
	      tmpChar = tmpStr.substring(0,1).toUpperCase();
	      postString = tmpStr.substring(1,stringLen);
	      tmpStr = tmpChar + postString;
  	  } else {
				tmpChar = tmpStr.substring(i,i+1);
				if ( (tmpChar == " " || tmpChar == "-") && i < (stringLen-1)) {
		      tmpChar = tmpStr.substring(i+1,i+2).toUpperCase();
		      preString = tmpStr.substring(0,i+1);
		      postString = tmpStr.substring(i+2,stringLen);
		      tmpStr = preString + tmpChar + postString;
    	  }
	    }
	  }
	}
	return tmpStr;
}	// capitalizeWords()

function checkDate( field, name ) {
	if (typeof name == 'undefined') name = field.name;
	field.value = trim(field.value);
	if (field.value.length) {
		if (!isValidDate(field.value)) {
			// Alert user if date is invalid
			alert('Field "' + name + '" contains an invalid or incorrectly formatted date.\n\n' +
						'The date format required is dd-mmm-yy. For example, 31-May-04.');
			field.focus();
			field.select();
			return false;
		} else {
			// Ensure month name starts with a capital letter and continues in lower case
			field.value = capitalizeWords(field.value);
		}
	}
	return true;
}	// checkDate()

function checkEmail( field, name ) {
	if (typeof name == 'undefined') name = field.name;
	field.value = trim(field.value);
	if (!IsValidEmail(field.value)) {
		// Alert user if email is invalid
		alert('Field "' + name + '" contains an invalid or incorrectly formatted email address.');
		field.focus();
		field.select();
		return false;
	}
	return true;
}	// checkEmail()

function checkField( field, name ) {
	if (typeof name == 'undefined') name = field.name;
	field.value = trim(field.value);
	if (!field.value) {
		// Alert user if field is empty
		alert('Field "' + name + '" cannot be left empty.');
		field.focus();
		field.select();
		return false;
	}
	return true;
}	// checkField()

function checkTime( field, name ) {
	if (typeof name == 'undefined') name = field.name;
	field.value = trim(field.value);
	if (field.value.length) {
		if (!isValidTime(field.value)) {
			// Alert user if time is invalid
			alert('Field "' + name + '" contains an invalid or incorrectly formatted time.\n\n' +
						'The time format required is hh:mm. For example, 19:15.');
			field.focus();
			field.select();
			return false;
		}
	}
	return true;
}	// checkTime()

function checkList( field, name ) {
	if (typeof name == 'undefined') name = field.name;
	field.value = trim(field.value);
	if (!field.value) {
		// Alert user if field is empty
		alert('Please select an option from the "' + name + '" field.');
		field.focus();
		return false;
	}
	return true;
}	// checkList()

function checkNumber( field, name ) {
	if (typeof name == 'undefined') name = field.name;
	field.value = trim(field.value);
	if (isNaN(field.value)) {
		// Alert user if number is invalid
		alert('Field "' + name + '" contains an invalid number.\n\n' +
					'Only numerical values may be entered into this field.');
		field.focus();
		field.select();
		return false;
	}
	return true;
}	// checkNumber()

function daysInMonth( month ) {
	switch ( month.toUpperCase() ) {
		case "FEB": return 28;
		case "APR":
		case "JUN":
		case "SEP":
		case "NOV": return 30;
		case "JAN":
		case "MAR":
		case "MAY":
		case "JUL":
		case "AUG":
		case "OCT":
		case "DEC": return 31;
		default: return 0;
	}
}	// daysInMonth()

function numberOfMonth( month ) {
	switch ( month.toUpperCase() ) {
		case "JAN": return 0;
		case "FEB": return 1;
		case "MAR": return 2;
		case "APR": return 3;
		case "MAY": return 4;
		case "JUN": return 5;
		case "JUL": return 6;
		case "AUG": return 7;
		case "SEP": return 8;
		case "OCT": return 9;
		case "NOV": return 10;
		case "DEC": return 11;
	}
}	// daysInMonth()

function isLeapYear( year ) {
	if (year && year >= 0)
		return (Number(year) % 4 == 0);
	else
		return false;
}	// isLeapYear()

function isValidDate( date ) {
  var dateFormat = /^\d{1,2}-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\d{2}$/i;

	if ( dateFormat.test(date) ) {
		if ( date.indexOf('-') == 1 ) date = "0" + date;
		var day = date.substr(0, 2);
		var month = date.substr(3, 3);
		var year = date.substr(7);
		var days = daysInMonth(month);
		if ( month.toUpperCase() == "FEB" ) days += Number(isLeapYear(year));
		return (day > 0 && day <= days);
	}

	return false;
}	// isValidDate()

function IsValidEmail( email ) {
	var emailFormat = /^[a-z0-9]+([-_\.]?[a-z0-9])+@[a-z0-9]+([-_\.]?[a-z0-9])+\.[a-z]{2,4}/gi;
	return emailFormat.test(email);
}	// isValidEmail()

function isValidTime( time ) {
  var timeFormat = /^\d{1,2}:\d{2}$/i;

	if ( timeFormat.test(time) ) {
		var hour = time.substr(0, time.indexOf(':'));
		var mins = time.substr(time.indexOf(':') + 1);
		return (hour >= 0 && hour <= 23 && mins >= 0 && mins <= 59);
	}

	return false;
}	// isValidTime()

function getDateValue( date ) {
  var dateFormat = /^\d{1,2}-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\d{2}$/i;

	if ( dateFormat.test(date) ) {
		if ( date.indexOf('-') == 1 ) date = "0" + date;
		var day = date.substr(0, 2);
		var month = numberOfMonth(date.substr(3, 3));
		var year = "20" + date.substr(7);
		return new Date(year, month, day);
	}
	return new Date();
}	// getDateValue()

function limitInputSize( field, fieldName, fieldSize ) {
	if (field.value != null) {
		if (field.value.length > fieldSize) {
			// Alert user if input string is too long
			alert('Field "' + fieldName + '" cannot contain more than ' + fieldSize + ' characters.\n\n' +
						'Please reduce this field\'s content by at least ' + (field.value.length - fieldSize) + ' character(s).');
			field.focus();
			return false;
		} else {
			return true;
		}
	}
}	// limitInputSize()

function makeLongYear( year ) {
	if (year && year >= 0 && year <= 99) {
		year = Number(year);
		(year < 70) ? year += 2000 : year += 1900;
	}
	return year;
}	// makeLongYear()

function openWindow( winURL, winName, winWidth, winHeight, winResizable, winStatusBar, winScrollBars ) {
	if (typeof winResizable == 'undefined') winResizable = true;
	if (typeof winStatusBar == 'undefined') winStatusBar = true;
	if (typeof winScrollBars == 'undefined') winScrollBars = true;
	var xPos = Math.floor((screen.availWidth - winWidth) / 2);
	var yPos = Math.floor((screen.availHeight - winHeight) / 2);
	var resizable; (winResizable) ? resizable = ",resizable" : resizable = "";
	var statusbar; (winStatusBar) ? statusbar = ",status" : statusbar = "";
	var scrollbars; (winScrollBars) ? scrollbars = ",scrollbars" : scrollbars = "";
	var win = window.open(winURL, winName, "width=" + winWidth + ",height=" + winHeight + ",left=" + xPos + ",top=" + yPos + resizable + statusbar + scrollbars, true);
	win.focus();
	return win;
}	// openWindow()

function trim( inputString, removeChar ) {
	if (inputString == null) return null;
	if (typeof removeChar == 'undefined') removeChar = ' ';

	// Trim leading characters from input string
	while ((inputString.length > 0) && (inputString.charAt(0) == removeChar))
		inputString = inputString.substring(1, inputString.length);

	// Trim trailing characters from input string
	while ((inputString.length > 0) && (inputString.charAt(inputString.length - 1) == removeChar))
		inputString = inputString.substring(0, inputString.length - 1);

	return inputString;
}	// trim()
