function initPage() {
	var gallery = document.getElementById( "gallery" );
	if( gallery ) {
		var pageContents = document.getElementById( "pageContents" );
		pageContents.style.height = Math.max( pageContents.offsetHeight, gallery.offsetHeight ) + "px";
	}
	init();
}

function init()
{
	// do nothing - it's a stub for pages that do not have a JavaScript body.onload handler
}

function submitForm( form )
{
	var url = form.action;
	if( !url || url == "null" ) {
		url = location.pathname;
	}
	var headless = url.lastIndexOf( "~" ) == url.length - 1;
	var pos = url.indexOf( "~" );
	if( pos > 0 )
	{
		pos = url.indexOf( "~", pos + 1 );
		if( pos > 0 )
		{
			url = url.substr( 0, pos );
		}
	}
	for( var i = 0; i < form.elements.length; i++ )
	{
		var field = form.elements[i];
		if( !field.disabled && field.name && ((field.type != "radio" && field.type != "checkbox") || field.checked) )
		{
			url += "~" + field.name + "=" + encodeURIComponent( field.value );
		}
	}
	if( headless ) {
		url += "~";
	}
	
	var target;
	switch( form.target ) {
		case "_top":
			target = window.top;
			break;
			
		case "_parent":
			target = window.parent;
			break;
			
		case "":
		case "null":
		case "_self":
			target = window;
			break;
			
		case "_blank":
			target = window.open( "", "" );
			break;
			
		default:
			target = window.frames[form.target];
			break;
	}
	target.location.href = url;
	return false;
}

function checkEmpty( field, msg )
{
	if( !field || 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 || 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 )
{
	if( !field || field.disabled || field.readOnly )
	{
		return;
	}
	checkNumeric( field, msg, true );
	if( field.value.indexOf( '.' ) != field.value.lastIndexOf( '.' ) )
	{
		 throw { field: field, msg: msg };
	}
}

function checkRegexp( field, expr, msg )
{
	if( !field || field.disabled || field.readOnly )
	{
		return;
	}
	var match = field.value.match( expr );
	if( !match || match.length != 1 )
	{
		throw { field: field, msg: msg };
	}
}

function checkEmail( field, msg )
{
	msg = msg || "This does not appear to be a valid e-mail address";
	checkRegexp( field, /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i, msg )
}

function checkAddress( form )
{
	checkEmpty( form.first_name, "Please enter your first name" );
    checkEmpty( form.last_name, "Please enter your last name" );
   	checkEmpty( form.email_address, "Please enter the e-mail address" );
   	checkEmail( form.email_address );
}

function checkCC( form )
{
	checkEmpty( form.credit_card_type, "Please select your payment option" );
	checkEmpty( form.ccName, "Please enter your name as it appears on the credit card" );
	checkEmpty( form.credit_card_number, "Please enter your credit card number" );
	if( form.cc_changed.value == "true" )
	{
		checkNumeric( form.credit_card_number, "Please enter your credit card number using only digits" );
		if( form.credit_card_number.value.length < 12 )
		{
			throw { field: form.credit_card_number, msg: "Please enter your credit card number using at least 12 digits" };
		}
	}
	var now = new Date();
	if( form.expiration_year.value < now.getFullYear() )
	{
		throw { field: form.expiration_year, msg: "Your credit card expiration year is in the past" };
	}
	if( form.expiration_year.value == now.getFullYear() && form.expiration_month.value <= now.getMonth() )
	{
		throw { field: form.expiration_month, msg: "Your credit card expiration date is in the past" };
	}
}

function checkQuantity( field )
{
	checkEmpty( field, "Please enter the number of cards you want to buy" );
	checkNumeric( field, "Please enter the quantity using only digits" );
	if( field.disabled || field.readOnly )
	{
		return;
	}
	if( parseInt( field.value ) == 0 ) {
		throw { field: field, msg: "You must enter at least 1 card" };
	}
}

function toggleCart( homeURL )
{
	var btn = document.getElementById( 'btnToggleCart' );
	if( btn.className == "disabled" ) {
		return false;
	}
	var cart = document.getElementById( "cart" );
	if( cart.style.display == "block" )
	{
		hideCart();
	}
	else
	{
		cart.src = homeURL + "~Cart.php~";
	}
	return true;
}

function showCart()
{
	var cart = document.getElementById( "cart" );
	cart.style.display = "block";
}

function hideCart()
{
	var cart = document.getElementById( "cart" );
	if( cart.style.display != "block" )
	{
		return;
	}
	cart.style.display = "none";
	cart.src = "about:blank"; 
}

function setFieldValue( form, fieldName, value, field )
{
	if( !field ) {
		field = form.elements[fieldName];
	}
	if( !field )
	{
		if( value instanceof Array ) {
			fieldName += "[]";
			field = form.elements[fieldName];
			if( field.length !== undefined ) {
				for( var i = 0; i < field.length; i++ ) {
					setFieldValue( null, null, value[i], field[i] );
				}
			} else {
				setFieldValue( null, null, value[0], field );
			}
		}
		return; // Not a form field
	}
	if( field.length !== undefined && field.type === undefined )
	{
		for( var i = 0; i < field.length; i++ )
		{
			if( field[i].type == "radio" ) { // radio
				if( field[i].value == value )
				{
					field[i].checked = true;
					break;
				}
			} else { // multiple fields with the same name
				field[i].value = value;
			}
		}
	}
	else if( field.type == "checkbox" ) // checkbox
	{
		field.checked = field.value == 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.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;
	}
}

/*
Selects the item, unselecting any other from the same hierarchical parent with the same tag and class
*/
function selectItem( item, parent )
{
	if( !parent )
	{
		parent = item.parentNode;
	}
	var siblings = parent.getElementsByTagName( item.tagName );
	for( var i = 0; i < siblings.length; i++ )
	{
		var sibling = siblings[i];
		if( sibling.className != item.className )
		{
			continue;
		}
		sibling.style.backgroundColor = "";
		sibling.style.color = "";
	}
	item.style.backgroundColor = "Highlight";
	item.style.color = "HighlightText";
}

function setPasswordType( field )
{
	if( field.type == "password" )
	{
		return;
	}
	if( navigator.userAgent.indexOf( "MSIE" ) < 0 )
	{
		field.type = "password";
		field.value = "";
	}
	else
	{
		pwd = document.createElement( "input" );
		pwd.type = "password";
		pwd.name = field.name;
		pwd.className = field.className;
		field.replaceNode( pwd );
		field = pwd;
	}
	field.focus();
}

function signup( lnk )
{
	document.getElementById( "user_login" ).style.display = 'none';
	document.getElementById( "user_signup" ).style.display = 'block';
	lnk.parentNode.style.visibility = "hidden";
}

function validateSignup( form, doAlert )
{
	try
	{
		checkEmpty( form.email, "Please enter your e-mail address" );
		checkEmail( form.email );
	}
	catch( e )
	{
		e.field.focus();
		if( doAlert ) {
			alert( e.msg );
		} else {
			showError( e.msg );
		}
		return false;
	}
	return true;
}

function validateLogin( form )
{
	try
	{
		checkEmpty( form.email, "Please enter your e-mail address" );
		checkEmail( form.email );
		if( form.password )
			checkEmpty( form.password, "Please enter your password" );
	}
	catch( e )
	{
		e.field.focus();
		showError( e.msg );
		return false;
	}
	return true;
}

function onCountryChange( combo )
{
	var showState = combo.value == "USA";
	var state = document.getElementById( "stateList" );
	state.style.display = showState ? "block" : "none";
	state.disabled = !showState;
	
	var province = document.getElementById( "province" );
	province.style.display = !showState ? "block" : "none";
	province.disabled = showState;
}

function getDateFromComponents( form, index )
{
	var edtYear = form.elements["year[" + index + "]"];
	var year = edtYear.value;
	if( year.length != 4 )
	{
		return null;
	}
	var cmbMonth = form.elements["month[" + index + "]"];
	var cmbDay = form.elements["day[" + index + "]"];
	var date = new Date( year, cmbMonth.value - 1, cmbDay.value );
	edtYear.value = date.getFullYear();
	cmbMonth.value = date.getMonth() + 1;
	cmbDay.value = date.getDate();
	return date;
}

function getComboText( cmb ) {
	if( cmb.selectedIndex < 0 ) {
		return "";
	}
	return cmb.options[cmb.selectedIndex].text;
}

function validateSearch( form ) {
	try
	{
		checkEmpty( form.keyword, "Please enter a keyword to search for" );
		checkRegexp( form.keyword, /^\w+$/, "Please type a single word to search for" );
	}
	catch( e )
	{
		e.field.focus();
		alert( e.msg );
		return false;
	}
	return true;
}

function getPosition( comp ) {
	var left = 0;
	var top = 0;
	while( comp.offsetParent ) {
		left += comp.offsetLeft;
		top += comp.offsetTop;
		comp = comp.offsetParent;
	}
	return { left: left, top: top };
}

function addEllipsis( node ) {
	var parent = node.parentNode;
	var text = node.innerHTML;
	for( var i = text.length - 1; node.offsetHeight > parent.offsetHeight; i-- ) {
		node.innerHTML = text.substr( 0, i ) + "...";
	}
}

function consumeEvent( ev ) {
	ev = ev || window.event;

	ev.cancelBubble = true;
	ev.returnValue = false;

	if( ev.stopPropagation ) {
		ev.stopPropagation();
	}

	if( ev.preventDefault ) {
		ev.preventDefault();
	}

	if( ev.stopEvent ) {
		ev.stopEvent();
	}
}

function showError( text ) {
	showInfo( "error", text );
}

function showMessage( text ) {
	showInfo( "message", text );
}

function showInfo( id, text ) {
	var info = document.getElementById( id );
	info.innerHTML = "";
	var lines = text.split( "\n" );
	for( var i = 0; i < lines.length; i++ ) {
		info.appendChild( document.createTextNode( lines[i] ) );
		if( i < lines.length - 1 ) {
			info.appendChild( document.createElement( "br" ) );
		}
	}
	info.style.display = "block";
}
