function initPage()
{
	if( window.init ) {
		init();
	}
}

function onPageClick( e ) {
	e = e || event;
	for( var src = e.target || e.srcElement; src && (src != document.body); src = src.parentNode ) {
		if( src.name == "search" || src.id == "searchoptions" ) {
			return; // clicked the popup itself
		}
	}
	
	document.getElementById( 'searchoptions' ).style.visibility = 'hidden';
}

function onStateChange( cmb ) {
	var form = cmb.form;
	form.search.value = true;
	form.submit();
}

function onSearchFocus( e ) {
	document.getElementById( 'searchoptions' ).style.visibility = 'visible';
}

function validate( form, callback )
{
	if( !callback ) {
		callback = validateForm;
	}
	try
	{
		return callback.call( this, form ); // must be defined in the page script
	}
	catch( e )
	{
		e.field.focus();
		alert( e.msg );
		return false;
	}
}

function validateSearch( form ) {
	checkEmpty( form.search, "Please enter the keywords to search for" );
	return true;
}

function checkEmpty( field, msg )
{
	if( field.disabled || field.readOnly )
	{
		return;
	}
	if( field.value.replace( /\s/g, "" ).length == 0 )
	{
		throw { field: field, msg: msg };
	}
}

function checkNumeric( field, msg, allowDot )
{
	if( field.disabled || field.readOnly )
	{
		return;
	}
	var text = field.value;
	if( !text || !text.length || text.length == 0 )
	{
		return;
	}
	for( var i = 0; i < text.length; i++ )
	{
		var ch = text.charCodeAt( i );
		if( ( ch < 48 || ch > 57 ) && !( ch == 46 && allowDot ) )
		{
			throw { field: field, msg: msg };
		}
	}
	return;
}

function checkFloat( field, msg )
{
	checkNumeric( field, msg, true );
	if( field.value.indexOf( '.' ) != field.value.lastIndexOf( '.' ) )
	{
		 throw { field: field, msg: msg };
	}
}

function checkRegexp( field, expr, msg )
{
	if( field.disabled || field.readOnly )
	{
		return;
	}
	if( !expr.test( field.value ) )
	{
		throw { field: field, msg: msg };
	}
}

function checkEmail( field, msg )
{
	if( !msg ) {
		msg = "This does not appear to be an e-mail address";
	}
	checkRegexp( field, /^\w+[\.?\w]*@\w+[\.\w+]+$/, msg );
}

function checkPhone( field, msg )
{
	if( !msg ) {
		msg = "This does not appear to be a phone number";
	}
	if( field.value.length < 10 ) {
		throw { field: field, msg: msg };
	}
	checkRegexp( field, /^(\+\d)?\s?\(?(\d{3})\)?[- ]?\d{3}[- ]?\d{4}$/, msg );
}

function checkURL( field, msg )
{
	if( !msg ) {
		msg = "This does not appear to be a valid URL";
	}
	checkRegexp( field, /^(ftp|http|https):\/\/(\w+:?\w*@)?(\S+)(:\d{1,5})?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/, msg );
}

function checkZIP( field, msg ) {
	if( !msg ) {
		msg = "Please enter your zip code using only digits";
	}
    checkNumeric( form.zip, msg );
}

function checkASCII( field, msg ) {
	if( !msg ) {
		msg = "Special characters are not allowed";
	}
	for( var i = 0; i < field.value.length; i++ ) {
		var ch = field.value.charCodeAt( i );
		if( ch < 32 || ch > 127 ) {
			throw { field: field, msg: msg };
		}
	}
}

function setComboText( cmb, text ) {
	text = text.replace( /\s/g, "" ).toLowerCase();
	for( var i = 0; i < cmb.options.length; i++ ) {
		if( cmb.options[i].text.replace( /\s/g, "" ).toLowerCase() == text ) {
			cmb.selectedIndex = i;
			return cmb.value;
		}
	}
	return false;
}

function getComboText( cmb ) {
	if( cmb.selectedIndex < 0 ) {
		return null;
	}
	return cmb.options[cmb.selectedIndex].text;
}

function setFieldValue( field, value )
{
	if( !field )
	{
		return; // Not a form field
	}
	if( field.length !== undefined && field.type === undefined ) // radio
	{
		for( var i = 0; i < field.length; i++ )
		{
			if( field[i].value == value )
			{
				field[i].checked = true;
				break;
			}
		}
	}
	else if( field.type == "checkbox" ) // checkbox
	{
		field.checked = (value == field.value);
	}
	else if( field.multiple ) // multi-select
	{
		for( var i = 0; i < field.options.length; i++ )
		{
			field.options[i].selected = false;
			var val = field.options[i].value;
			for( var j = 0; j < value.length; j++ )
			{
				if( val == value[j] )
				{
					field.options[i].selected = true;
					break;
				}
			}
		}
	}
	else // input, single-select
	{
		field.value = value;
	}

	if( field.onchange )
	{
		field.onchange();
	}
	if( field.type != "submit" && !field.readOnly && field.onclick )
	{
		field.onclick();
	}
}

function getFieldValue( field )
{
	if( field.length !== undefined && field.type === undefined ) // radio
	{
		for( var i = 0; i < field.length; i++ )
		{
			if( field[i].checked )
			{
				return field[i].value;
			}
		}
		return null; // No radio button selected
	}
	else if( field.type == "checkbox" ) // checkbox
	{
		return field.checked ? field.value : null; // unchecked
	}
	else if( field.multiple ) // multi-select
	{
		var value = [];
		for( var i = 0; i < field.options.length; i++ )
		{
			if( field.options[i].selected )
			{
				value.push( field.options[i].value );
			}
		}
		return value;
	}
	else // input, single-select
	{
		return field.value;
	}
}

function checkClearFocus( edt ) {
	if( edt.value == edt.defaultValue ) {
		edt.value = '';
	}
}

function checkClearBlur( edt ) {
	if( edt.value == '' ) {
		edt.value = edt.defaultValue;
	}
}

function getFilterStateName() {
	var cmbState = document.forms.filter.state_id;
	for( var i = 0; i < cmbState.options.length; i++ )
	{
		if( cmbState.options[i].selected ) {
			return cmbState.options[i].text;
		}
	}
	return null;
}

function updateCategory( form ) {
	form.category.value = getComboText( form.category_id );
	return true;
}

