<!--

function inArray( a, needle )
{
	for(var i=0;i<a.length;i++) if (a[i]===needle) return true
	return false;
}

function trim(text){
	if ( !text || typeof(text)=="undefined"){
		return "";
	}
	else {
		return text.replace(/^\s+/,"").replace(/\s+$/,"");
	}
}

function isEmpty( o )
{
	o.value = trim( o.value );
	return o.value.length == 0;
}

function notEmpty( str )
{
	return trim( str ).length != 0;
}

function isValidEmail(email) {       
	var re = /^\s*[^@]+@([-\w]+\.)+[-\w]+\s*$/;
	return re.test(email);
}
function isValidCurrency(strCheck){
	var s = trim( strCheck );
	var re = /^\$?(\+|-)?\$?(\d+(,\d{3})*)?\.?\d*$/;
	var res = re.test(s);
	if ( res && arguments.length > 1)
	{
		re = /(,)/g;
		var s = s.replace( re, "" );
		re = /($)/g;
		var s = s.replace( re, "" );
		var f = parseFloat( s );
		if ( f < arguments[1] ) res = false;
		if ( arguments.legth > 2 && f > arguments[2] ) res = false;
	}
	return res;
}
function isValidNumber(strCheck){

	var s = trim( strCheck );
	var re = /^(\+|-)?(\d+(,\d{3})*)?\.?\d*$/;
	var res = re.test(s);
	if ( res && arguments.length > 1)
	{
		re = /(,)/g;
		var s = s.replace( re, "" );
		var f = parseFloat( s );
		if ( f < arguments[1] ) res = false;
		if ( arguments.length > 2 && f > arguments[2] ) res = false;
	}
	return res;
}
function isDigits( str ) {
	var re = /^\d+$/;
	return re.test( str );
}
function isAlphaNum( str ) {
	var re = /^\w+$/;
	return re.test( str );
}
function isValidDate( month, day, year )
{
	//alert( month +'/'+ day +'/'+ year );
	if (day<1 || isNaN(day) || isNaN(month) || month<1 || month >12 || isNaN(year) || year<1900 || year > 2100) return false;
	if ((month==4 || month==6 || month==9 || month==11) && day > 30) return false;
	if (month==2)
	{
		var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
		if (day > 29 || (day==29 && !isleap)) return false;
	}
	return true;
}

function isValidDateStr( str )
{
	// month/date/year
	var parts = str.split("/");
	if ( parts.length == 3 )
		return isValidDate( parseInt(parts[0]), parseInt(parts[1]), parseInt(parts[2])+(parts[2].length==2? 2000:0) );
	else
		return false;
}

function isValidPassword( str )
{
	var re = /^\S{5,255}$/;
	return re.test( str );
}
function isValidLogin( str )
{
	var re = /^[\w\.@-]{5,255}$/;
	return re.test( str );
}
function isValidPostal( country, zip )
{
	var re;
	var test = true;
	if ( country == 'US' ) { re = /^\d{5}(-?\d{4})?$/; test = re.test( zip ); }
	if ( country == 'CA' ) {
		re = /^[a-z]\d[a-z]/i; test = re.test( zip );
		if (test) { re = /\d[a-z]\d$/i; test = re.test( zip ); }
	}
	return test;
}

function digitsOnly( e )
{
	e = e || window.event;
	var key = e.which >= 0? e.which: e.keyCode;
	return ( key >= '0'.charCodeAt(0) && key <= '9'.charCodeAt(0) ) || key < 32;
}

function numberOnly( obj, e, allowMinus )
{
	//defaultCompany();
	var dec = '.'; //COMPANY.currency.decimal;
	if ( arguments.length < 3 ) allowMinus = false;
//	var key = window.event ? window.event.keyCode: e.which;
	e = e || window.event;
	var key = e.which >= 0? e.which: e.keyCode;
	return ( key < 32 || 
		(key >= '0'.charCodeAt(0) && key <= '9'.charCodeAt(0) ) || 
		(key == dec.charCodeAt(0) && obj.value.indexOf(dec) < 0 ) ||
		(allowMinus && key == '-'.charCodeAt(0) && obj.value.indexOf('-') < 0 ));
}


function defaultCompany()
{
	if (!window.COMPANY)
		window.COMPANY = {
			dateFormat: 'm/d/yyyy',
			time24: false,
			currency: {
				precision: 2,
				decimal: '.',
				thousands: ',',
				symbol: '$',
				position: 'left',
				positivePrefix: '$',
				negativePrefix: '-$',
				positiveSuffix: '',
				negativeSuffix: ''
			}
		};
}

function fmtFloat(n,d)
{
	defaultCompany();

	n = Number(n); if (isNaN(n)) n = 0;

	if (isNaN(Number(d))) d = COMPANY.currency.precision;
	var r;
	try
	{
		r = (n).toFixed( d );
	}
	catch(e)
	{	
		var s, x ;
		var den = .5/Math.pow( 10, d);
		if (n < 0) n -= den; else n += den;
		s = n.toString();
		x = s.indexOf(".",0);
		r = s.substring(0,x+d+1);
	}
	return r;
}
function fmtFloatLocale( v, n, groups )
{
	var o = (n && n<0)? v.toString() :fmtFloat( v, n ),
	s, l = (s = (o = o.replace(/\./, COMPANY.currency.decimal)).split("")).length;
	if (groups)
	{
		for(var i = (l - (n && n+1)); (i -= 3) > 0; s[i-1] += COMPANY.currency.thousands);
		return s.join("");
	}
	else return o;
}
function fmtCurrency( v, groups, noround )
{
	defaultCompany();

	var s, l = (s = (noround? v.toString(): fmtFloatLocale( v, COMPANY.currency.precision, groups )).split("")).length;
	
	if (s[0] == '-') 
		{s[0] = COMPANY.currency.negativePrefix; s[l-1] += COMPANY.currency.negativeSuffix}
	else
		{s[0] = COMPANY.currency.positivePrefix + s[0]; s[l-1] += COMPANY.currency.positiveSuffix}

	return s.join("").replace( new RegExp("\\$","g"), COMPANY.currency.symbol );
/*
	var n = COMPANY.currency.precision,
		o = fmtFloat( v, n ).replace(/\./, COMPANY.currency.decimal),
		h = o.charAt(0) == '-', 
		s, l = (s = (o.replace(/-/g, "")).split("")).length;
	
	for(var i = (l - (n && n+1)); (i -= 3) > 0; s[i-1] += COMPANY.currency.thousands);
	if (h) 
		{s[0] = COMPANY.currency.negativePrefix + s[0]; s[l-1] += COMPANY.currency.negativeSuffix}
	else
		{s[0] = COMPANY.currency.positivePrefix + s[0]; s[l-1] += COMPANY.currency.positiveSuffix}

	return s.join("").replace( new RegExp("\\$","g"), COMPANY.currency.symbol );
*/
}
function parseFloatLocale(s, clean)
{
	defaultCompany();
	if (COMPANY.currency.decimal != '.') s = s.replace(new RegExp(COMPANY.currency.decimal), '.');
	if (clean) s = s.replace(/[^\d\.-]/g, '');
	return parseFloat(s);
}
function makeCurrencyInput(v, attrs, minus, noround)
{
	defaultCompany();
	minus = minus || false;
	var l = COMPANY.currency.position == 'left'? COMPANY.currency.symbol + '&nbsp;':'';
	var r = COMPANY.currency.position == 'left'? '': '&nbsp;' + COMPANY.currency.symbol;
	return l + '<input type="text" onkeypress="return numberOnly(this, event, '+ minus +');" value="' +
		(noround? v.toString(): fmtFloatLocale(v, COMPANY.currency.precision, false ))+ '" ' + attrs + '>' + r;  
}
function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

function CFormValidator( frm, fields_list )
{
	var form = frm;
	var fields = fields_list;
	var _this = this; // we need this for implicitly referenced class instances.
	var _oldOnClickHandlers = new Array();
	var _defaultBGColor = "#FFFFFF";
	var _changedBGColor = "#FFFF88";

	this.checkAway = function( func ) {
		if (document.getElementsByTagName)
			var x = document.getElementsByTagName('A');
		else if (document.all)
			var x = document.all.tags('A');
		else return;

		var win = window.location;
		for (var i=0; i<x.length; i++)
		{
			var tg = x[i];
			if (( tg.target.length == 0 || tg.target == '_self') && tg.getAttribute("xnocheck")===null &&
				tg.href.length > 0 && tg.href.substr(0,11).toLowerCase() != 'javascript:' /* && !tg.onclick */)
			{
				if ( tg.hash.length == 0 || tg.protocol != win.protocol || tg.host != win.host || tg.pathname != win.pathname || tg.search != win.search )
				{
					_oldOnClickHandlers[tg.innerHTML] = tg.onclick;
					tg.onclick = func || this.checkFormSave;
				}
			}
		}

	}

	this._bgcolor = function(modified) { return modified? _changedBGColor: _defaultBGColor }
	this._getform = function() { return typeof(form) == 'object'? form: document.forms[form]; }

	this.checkFormModified = function() {

		var frm = _this._getform();
		var fields_list = typeof( fields ) == 'string'? ',' + fields.replace(/\s+/,"").toLowerCase() + ',': '';

		if ( frm )
		{
			for ( var i=0; i<frm.elements.length; i++ )
			{
				var el = frm.elements[i];
				//alert( 'name=' + el.name + ' type=' + el.type );
				if ( el.name && ( 
						fields_list.length <= 2 || fields_list.indexOf( el.name.toLowerCase() ) > 0) )
				{
					switch( el.type )
					{
					case 'select-one':
					case 'select-multiple':
						for (var j=0; j<el.options.length; j++) 
							if ( el.options[j].defaultSelected != el.options[j].selected ) return true;
						break;
					case 'radio':
					case 'checkbox':
						if ( el.defaultChecked != el.checked ) return true;
						break;
					case 'text':
					case 'textarea':
					case 'password':
						if ( el.defaultValue != el.value ) return true;
						break;
					}
				}
			}
		}
		return false;
	}

	this.highlightModified = function() {

		var frm = _this._getform();
		var fields_list = typeof( fields ) == 'string'? ',' + fields.replace(/\s+/,"").toLowerCase() + ',': '';
		var t;

		if ( frm )
		{
			for ( var i=0; i<frm.elements.length; i++ )
			{
				var el = frm.elements[i];
				//alert( 'name=' + el.name + ' type=' + el.type );
				if ( el.name && ( 
						fields_list.length <= 2 || fields_list.indexOf( el.name.toLowerCase() ) > 0) )
				{
					t = false;
					switch( el.type )
					{
					case 'select-one':
					case 'select-multiple':
						for (var j=0; j<el.options.length; j++) 
							if ( el.options[j].defaultSelected != el.options[j].selected ) t = true;
						break;
					case 'radio':
					case 'checkbox':
						if ( el.defaultChecked != el.checked ) t = true;
						break;
					case 'text':
					case 'textarea':
					case 'password':
						if ( el.defaultValue != el.value ) t = true;
						break;
					}
					el.style.backgroundColor = _this._bgcolor(t);
				}
			}
		}
	}

	this.checkFormSave = function() {
		if ( _this.checkFormModified() && !confirm( 'Your changes are not saved. Proceed anyway?' ) )
		{
			//_this.highlightModified();
			return false;
		}
		if (_oldOnClickHandlers[this.innerHTML]) 
			return _oldOnClickHandlers[this.innerHTML]();
		else
			return true;
	}

	this.validate = function( list ) {
		
		var err = false;
		var frm = _this._getform();
		for (var i=0; i<list.length; i++)
		{
			var el = frm.elements[list[i][0]];
			var func = list[i][1];
			var text = list[i][2];
			switch( el.type || el[0].type )
			{
			case 'select-one':
			case 'select-multiple':
				if ( (func && !func(el)) || el.value.length == 0 ) err = true;
				break;
			case 'radio':
				if ( func && !func(el) ) err = true;
				else 
				{
					var j;
					for(j=0; j<el.length; j++) if (el[j].checked) break;
					if (j>=el.length) err = true;
				}
				break;
			case 'checkbox':
				if ( (func && !func(el)) || !el.checked ) err = true;
				break;
			case 'text':
			case 'textarea':
			case 'password':
				if ( typeof func == 'function' )
				{
					if ( !func(el.value) ) err = true;
				}
				else
					if ( isEmpty(el) ) err = true;
/*
				if ( func != notEmpty )
				{
					if ( notEmpty( el.value ) && func && !func(el.value) ) err = true;
				}
				else
					if ( !func(el.value) ) err = true;
*/
				break;
			}
			if ( err )
			{
				alert( text );
				if (el.type) el.focus();
				return false;
			}
		}
		return true;
	}
}

function setTextAreaMaxLength() {
	var x = document.getElementsByTagName('textarea');
	var counter = document.createElement('div');
	counter.className = 'counter';
	for (var i=0;i<x.length;i++) {
		if (x[i].getAttribute('maxlength')) {
			var counterClone = counter.cloneNode(true);
			counterClone.relatedElement = x[i];
			counterClone.innerHTML = '<span>0</span>/'+x[i].getAttribute('maxlength');
			x[i].parentNode.insertBefore(counterClone,x[i].nextSibling);
			x[i].relatedElement = counterClone.getElementsByTagName('span')[0];

			x[i].onkeyup = x[i].onchange = checkTextAreaMaxLength;
			x[i].onkeyup();
		}
	}
}

function checkTextAreaMaxLength() {
	var maxLength = this.getAttribute('maxlength');
	var currentLength = this.value.length;
	if (currentLength > maxLength)
		this.relatedElement.className = 'toomuch';
	else
		this.relatedElement.className = '';
	this.relatedElement.firstChild.nodeValue = currentLength;
	// not innerHTML
}

// must be called on body load

function initDocument()
{
	setTextAreaMaxLength();
}

-->

