/**
 * Atlantic Sportswear
 *
 * @category	ASW
 * @package		Javascript
 * @copyright	Copyright (c) 2008 Kaaterskil Management, LLC
 * @version		$Id: asw.js 90 2009-02-23 11:29:11Z Blair $
 */

/*------------------------------------------------------------
DOM FUNCTIONS
------------------------------------------------------------*/
function preload(){
}
/**
 * Gets element from DOM tree
 * @param string e
 */
function find_DOM(e){
	if(document.getElementById){
		var r = document.getElementById(e);
	}else if(document.all){
		var r = document.all[e];
	}else if(document.layers){
		var r = document.layers[e];
	}
	return r;
}

/**
 * Swaps images on rollover
 */
function roll(img_name, img_src){
	document[img_name].src = img_src;
}

function click_change(btn_name, img_src){
	items = document.getElementsByTagName('input');
	for(var i = 0; i < items.length; i++){
		var e = items[i];
		if(e.name == btn_name){
			e.src = img_src;
			break;
		}
	}
}

/**
 * Loads subteam address into shipping fields
 * @param string v
 */
function load_subteam_address(v){
	var f = document.info;
	var a = v.split(';');
	
	f.shipping_name.value		= a[1];
	f.shipping_address1.value	= a[2];
	f.shipping_address2.value	= a[3];
	f.shipping_city.value		= a[4];
	f.shipping_state.value		= a[5];
	f.shipping_ZIP_Code.value	= a[6];
}

/**
 * Copies billing address to shipping address fields
 */
function copy_billing_address(){
	var f = document.info;
	if(f.is_shipping_same.checked){
		f.shipping_first_name.value	= f.billing_first_name.value;
		f.shipping_last_name.value	= f.billing_last_name.value;
		f.shipping_address1.value	= f.billing_address1.value;
		f.shipping_address2.value	= f.billing_address2.value;
		f.shipping_city.value		= f.billing_city.value;
		
		var val = f.billing_state.options[f.billing_state.selectedIndex].value;
		for(var i = 0; i < f.shipping_state.length; i++){
			var o = f.shipping_state.options[i];
			o.selected = o.value == val ? true : false;
		}
		f.shipping_state.selectedIndex = f.billing_state.selectedIndex;
	
		f.shipping_ZIP_Code.value	= f.billing_ZIP_Code.value;
	}else{
		f.shipping_first_name.value	= '';
		f.shipping_last_name.value	= '';
		f.shipping_address1.value	= '';
		f.shipping_address2.value	= '';
		f.shipping_city.value		= '';
		
		for(var i = 0; i < f.shipping_state.length; i++){
			f.shipping_state.options[i].selected = false;
		}
		f.shipping_state.selectedIndex = 0;
	
		f.shipping_ZIP_Code.value	= '';
	}
}

/**
 * Displays shipto input fields
 * @param checkbox element fe
 */
function display_shipto(fe){
	var e = find_DOM('shipto_customer');
	if(fe.checked){
		e.style.display = 'none';
	}else{
		e.style.display = 'block';
	}
}
 
/**
 * Returns an element's coordinates.
 * @param e		The html element's DOM id
 */
function get_coords(e){
	var r = {x:0, y:0}
	while(e){
		r.x += e.offsetLeft;
		r.y += e.offsetTop;
		e = e.offsetParent;
	}
	return r;
}

/**
 * Set element x/y coordinates
 * @param e			The html element
 * @params x, y		coordinate values
 */
function set_coords(e, x, y){
	var r = {x:0, y:0};
	if(e.offsetParent){
		r = get_coords(e.offsetParent);
	}
	e.style.left	= (x - r.x) + 'px';
	e.style.top		= (y - r.y) + 'px';
}

/**
 * Set product overlay images
 */
function set_product_overlays(){
	//position product overlays
	for(var i = 1; i < 4; i++){
		set_overlay('image_' + i, 'overlay_' + i);
	}
	
	//position product list overlays
	var e = find_DOM('scroll_list');
	if(e != null){
		var items = e.getElementsByTagName('div');
		for(i = 0; i < items.length; i++){
			set_overlay('scroll_image_' + i, 'scroll_overlay_' + i);
		}
	}
}

/**
 * Sets an html element over another
 * @param lower_id		The underling element id
 * @param overlay_id	The overlying element id
 */
function set_overlay(lower_id, overlay_id){
	var e1	= find_DOM(lower_id);
	var e2	= find_DOM(overlay_id);
	if(e1 != null && e2 != null){
		var r = get_coords(e1);
		e2.style.position = 'absolute';
		set_coords(e2, r.x, r.y);
	}
}

/**
 * Redirect
 */
function redirect(url){
	if(url != '' && url != 0){
		window.location.href = url;
	}
}

/*------------------------------------------------------------
TEXT FORMATTING FUNCTIONS
------------------------------------------------------------*/
/**
 * Returns a number as a currency decimal.
 * @param obj	The html form element
 */
function dollar_format(obj){
	var r = '0.00';
	var v = obj.value;
	var t = v.match(/[^0-9\.\-]/);
	if(!t){
		var a = v.split('.');
		if(a.length == 1){
			r = a[0] + '.00';
		}else{
			if(a[1].length > 2){
				a[1] = a[1].substr(0, 2) + '.' + a[1].substr(2);
				a[1] = Math.round(a[1]);
			}else if(a[1].length == 1){
				a[1] = a[1] + '0';
			}
			r = a[0] + '.' + a[1];
		}
	}
	obj.value = r;
	return;
}

/**
 * Returns a value in XXX-XXX-XXXX telephone format.
 * @param obj	The html form element
 */
function telephone_format(obj){
	var r = '';
	var v = obj.value;
	var p = /^\(?([2-9]\d{2})\)?(?:\-?|\s?)([2-9]\d{2})(?:\-?|\s?)(\d{4})$/;
	var t = v.match(p);
	if(t){
		if(t.length == 4){
			r = t[1] + '-' + t[2] + '-' + t[3];
		}else{
			r = t[1] + '-' + t[2];
		}
	}
	obj.value = r;
	return;
}

/**
 * Returns an uppercase value.
 * @param obj	The html form element
 */
function uppercase(obj){
	if(obj.value){
		obj.value.toUpperCase();
	}
	return;
}

/**
 * Returns a string with the first letter capitalized.
 * @param string str
 * @return string
 */
function ucfirst(str){
	return str.substring(0, 1).toUpperCase() + str.substring(1);
}

/**
 * Formats a form field name
 * @param string str
 * @return string
 */
function format_field_name(str){
	var r = '';
	
	str		= str.replace(/_id/, '');
	str		= str.replace(/_/g, ' ');
	words	= str.split(' ');
	for(var i = 0; i < words.length; i++){
		r += ' ' + ucfirst(words[i]);
	}
	r = r.substring(1);
	return r;
}

/*------------------------------------------------------------
FORM VALIDATION
------------------------------------------------------------*/
/**
 * Validates an add_to_cart action
 *
 * @param timestamp cutoff_ts
 * @return boolean
 */
function test_add_to_cart(cutoff_ts){
	var cutoff	= new Date(cutoff_ts * 1000);
	var now		= new Date();
	
	//test current time against cutoff
	if(now <= cutoff){
		//test for option selections
		var o		= document.getElementsByTagName('select');
		var err		= new Array();
		var err2	= '';

		if(o.length > 0){
			//size error test
			var st = false;
			//size selected test
			var st2 = false;
			
			for(var i = 0; i < o.length; i++){
				var t = o[i].options[o[i].selectedIndex].value;

				//if an option choice has not been selected...
				if(t == 0){
					if(!st || o[i].id.search(/[Ss]ize/) < 0){
						/*
						 * Add the option to the error list if a) the 
						 * option category is not a size, or b) if the 
						 * option category is a size and no other size 
						 * categories have been added to the error list yet.
						 */
						err.push("\n-" + o[i].id);

					}else{
						/*
						 * If the option is a size category, add the option 
						 * name to an already existing size category error.
						 */
						for(var j = 0; j < err.length; j++){
							if(err[j].search(/[Ss]ize/) > 0){
								err[j] += ' or ' + o[i].id;
								break;
							}
						}
					}
					/*
					 * If the option is a size category, set the size 
					 * error test to true so another unselected size 
					 * category won't be added to the error list.
					 */
					if(o[i].id.search(/[Ss]ize/) > 0){
						st = true;
					}
				}else{
					/*
					 * If the selected option is a size category, remove 
					 * other size categories from the error list.
					 */
					for(var j = 0; j < err.length; j++){
						if(err[j].search(/[Ss]ize/) > 0){
							err.splice(j, 1);
						}
					}
					/*
					 * If a size category has been selected, throw an 
					 * error if a previous size category has already been 
					 * selected. Otherwise, set both flags to true.
					 */
					if(o[i].id.search(/[Ss]ize/) > 0){
						if(st2){
							var err2 = 'You have selected more than one size.';
						}else{
							st = true;
							st2 = true;
						}
					}
				}
			}
			if(err != '' || err2 != ''){
				var msg = 'Hold up!';
				if(err != ''){
					msg += '\n\nPlease make the following option selections:';
					msg += err.join();
				}
				if(err2 != ''){
					msg += "\n\n" + err2;
				}
				alert(msg);
				return false;
			}
			return true;
		}
		return true;
	}
	
	//display cutoff failure
	msg = 'The cutoff date for this webstore has passed. ';
	msg += 'You cannot purchase any items.';
	alert(msg);
	return false;
}

/**
 * Sets required fields for checkout info form and validates data entry.
 *
 * @param f		The form element
 * @return boolean
 */
function validate_checkout_info(f){
	if(f.subteam_id){
		f.subteam_id.required			= true;
	}
	if(f.player_name){
		f.player_name.required			= true;
	}
	if(!f.shipto_customer || f.shipto_customer.checked){
		f.shipping_last_name.required	= true;
		f.shipping_address1.required	= true;
		f.shipping_city.required		= true;
		f.shipping_state.required		= true;
		f.shipping_ZIP_Code.required	= true;
	}
	f.billing_last_name.required		= true
	f.billing_address1.required			= true;
	f.billing_city.required				= true;
	f.billing_state.required			= true;
	f.billing_ZIP_Code.required			= true;
	f.billing_telephone.required		= true;
	
	return validate_form(f);
}

/**
 * Generic form validation
 *
 * @param f		The form element
 * @return boolean
 */
function validate_form(f){
	var empty	= '';
	var not_set	= '';
	var msg		= '';
	var str		= '';
	
	for(var i = 0; i < f.length; i++){
		var e = f.elements[i];
		if(e.type == 'text' || e.type == 'textarea'){
			if(e.required && (e.value == '' || e.value == null)){
				empty += '\n- ' + format_field_name(e.name);
			}
		}
		if(e.type == 'select-one' || e.type == 'select-multiple'){
			if(e.required && e.selectedIndex <= 0){
				not_set += '\n- ' + format_field_name(e.name);
			}
		}
	}
	if(empty != '' || not_set != ''){
		msg = 'Hold up! The form has errors:';
		if(empty != ''){
			msg += '\n\nThe following required fields are empty: ' + empty;
		}
		if(not_set != ''){
			msg += '\n\nThe following selections have not been made: ';
			msg += not_set;
		}
		alert(msg);
		return false;
	}
	return true;
}

/**
 * Performs RegExp pattern matching.
 *
 * @param ty	The type of pattern to match.
 * @param obj	The html form element.
 */
function validate_string(ty, obj){
	var s = obj.value;
	if(ty != '' && s != ''){
		var p	= set_regexp_pattern(ty);
		var msg = set_validation_error_message(ty);
		var t	= s.match(p);
		if(!t){
			alert(msg);
			obj.value = '';
			return false;
		}else{
			return true;
		}
	}
}

/**
 * Retruns a RegExp matching pattern.
 * @param ty	The type of pattern to match
 */
function set_regexp_pattern(ty){
	var p_html_text	= /^[a-zA-Z0-9_#\-\+\='"\.\!\:\s,<>\/\(\)]+$/;
	var p_text		= /^[a-zA-Z0-9_#\-\+'"\.\!\:\s,\/\?\(\)]+$/;
	var p_int		= /^[\d\-]+$/;
	var p_float		= /^[0-9\-]+(\.[0-9]*)?$/;
	var p_dollar	= /^[0-9\-]+(\.[0-9]{0,2})?$/;
	var p_keyword	= /[a-zA-Z0-9_\-'\s]+/;
	var p_state		= /^[a-zA-Z]{2}$/;
	var p_ZIP_Code	= /^\d{5}-\d{4}|\d{5}|[A-Z]\d[A-Z] \d[A-Z]\d$/;
	var p_telephone	= /^\(?([2-9][0-9][0-9])\)?(?:[\-\.\s])?([2-9][0-9][0-9])(?:[\-\.\s])?([0-9]{4})$/;
	var p_email		= /([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,6})/;
	var p_year		= /^([1][9][0-9][0-9]|[2][0][0-9][0-9])$/;
	var p_ip		= /^(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))$/;
	var p_url		= /^((http|https)\:\/\/)?(([a-zA-Z0-9_\-]{2,}\.)+[a-zA-Z]{2,})(\:[a-zA-Z0-9]+)?([a-zA-Z0-9_\-\.\?\+\/\\&;%\$#\=~]*)?$/;
	
	var a = new Array();
	a[0]	= ['html_text', p_html_text];
	a[1]	= ['text', p_text];
	a[2]	= ['int', p_int];
	a[3]	= ['float', p_float];
	a[4]	= ['dollar', p_dollar];
	a[5]	= ['keyword', p_keyword];
	a[6]	= ['state', p_state];
	a[7]	= ['ZIP_Code', p_ZIP_Code];
	a[8]	= ['telephone', p_telephone];
	a[9]	= ['email', p_email];
	a[10]	= ['year', p_year];
	a[11]	= ['ip', p_ip];
	a[12]	= ['url', p_url];
	
	var r = '';
	for(var i = 0; i < a.length; i++){
		if(a[i][0] == ty){
			r = a[i][1];
			break;
		}
	}
	return r;
}

/**
 * Returns error text for a failed RegExp match.
 * @param ty	The type of pattern to match
 */
function set_validation_error_message(ty){
	var a = new Array();
	a[0]	= ['text',		'Please use only letters, dashes, periods, commas or whitespace.'];
	a[1]	= ['int',		'Please enter a valid integer.'];
	a[2]	= ['float',		'Please enter a valid decimal number.'];
	a[3]	= ['keyword',	'Please enter a query using standard characters.'];
	a[4]	= ['state',		'Please enter a two-character state abbreviation.'];
	a[5]	= ['ZIP_Code',	'Please enter a valid ZIP Code in XXXXX-XXXX format.'];
	a[6]	= ['telephone', 'Please enter a valid telephone number in XXX-XXX-XXXX format.'];
	a[7]	= ['email',		'Please enter a valid email address.'];
	a[8]	= ['year',		'Please enter a 4-digit year between 1900 and 2100.'];
	a[9]	= ['ip',		'Please enter valid IP address in XXX.XXX.XXX.XXX format.'];
	a[10]	= ['url',		'Please enter valid URL.'];
	
	if(ty.match(/[Tt]ext/)){
		ty = 'text';
	}
	if(ty.match(/int/)){
		ty = 'int';
	}
	
	var r = 'Hold up!';
	for(var i = 0; i < a.length; i++){
		if(a[i][0] == ty){
			r = a[i][1];
			break;
		}
	}
	return r;
}