Activa.DOM.ready(function() {
	var keyword = 'Keyword Search';
	var search_field = did('search_field');
	if ( search_field && search_field.value != keyword ) {
		Activa.DOM.addClass(search_field, 'typed');
	}
	if ( search_field ) {
		Activa.registerEvent(search_field, 'blur', function(e) {
			if ( search_field.value == '' ) {
				search_field.value = keyword;
				Activa.DOM.removeClass(search_field, 'typed');
			}
		});
		Activa.registerEvent(search_field, 'focus', function(e) {
			if ( search_field.value == keyword ) {
				search_field.value = '';
			}
			Activa.DOM.addClass(search_field, 'typed');
		});
	}
});
/*
 * JS Zebra class. :)
 */
var Zebra = new Activa.Class({
	counter: 0,
	mod: 2,
	
	init: function(mod) {
		this.mod = mod;
		this.reset();
	},
	
	reset: function() {
		this.counter = 0;
	},
	
	getString: function() {
		return String(++this.counter % this.mod);
	}
});

Zebra.statics({
	instance: null,
	
	getInstance: function() {
		if ( !Zebra.instance ) {
			Zebra.instance = new Zebra(2);
		}
		return Zebra.instance;
	},
	
	applyToTable: function(table_id) {
		Zebra.getInstance().reset();
		Activa.toArray(did(table_id).getElementsByTagName('tr')).filter(function(tr, index) {
			// skip the first tr, and where class="btm"
			return index != 0 && !Activa.DOM.hasClass(tr, 'btm');
		}).forEach(function(tr) {
			// remove any existing zebra stuff, then reapply
			Activa.DOM.removeClass(tr, 'zebra0');
			Activa.DOM.removeClass(tr, 'zebra1');
			Activa.DOM.addClass(tr, 'zebra' + Zebra.getInstance().getString());
		});
	}
});

function updateShipping(parcel_index, url) {
	if ( did("service_" + parcel_index) ) {
		url += "/" + did("service_" + parcel_index).value;
	}
	if ( did("carrier_" + parcel_index) ) {
		url += "/" + did("carrier_" + parcel_index).value;
	}
    if ( did('promo_code') ) {
        url += "/" + did('promo_code').value;
    }
	new Activa.rpc(url, { onComplete: updateCheckoutModifiers });
}

function doUpdateShipping(obj) {	
	if ( obj.shipping_method == 'order' ) {
		did("shipping_total").innerHTML = "$" + obj.shipping;
		did("grand_total").innerHTML = "$" + obj.grand_total;
		Activa.DOM.showID("grand_total_row");
	}
}

function numberFormat(num) {
	num = parseFloat(num).toFixed(2);
	var p = num.split('.');
	var p1 = p[0];
	var p2 = p[1];
	var rg = /(\d+)(\d{3})/;
	while (rg.test(p1)) {
		p1 = p1.replace(rg, '$1'+','+'$2');
	}
	return p1+'.'+p2;
}

function updateCheckoutModifiers(obj) {
	var before_shipping = false;
	
	for ( var parcel_index = 0; parcel_index < obj.parcels.length; parcel_index++ ) {
	
		var tbody = did("checkout_table_" + parcel_index).tBodies[0];
	
		Activa.DOM.hideID("shipping_row_" + parcel_index);
		
		var sub_total_row_found = false;
		for ( var i = 0; i < tbody.childNodes.length; i++ ) {
			if ( tbody.childNodes[i].nodeName == 'TR' ) {
				if ( tbody.childNodes[i].id == 'grand_total_row_' + parcel_index ) {
					break;
				} else if ( tbody.childNodes[i].id == 'sub_total_row_' + parcel_index ) {
					sub_total_row_found = true;
				} else if ( sub_total_row_found ) {
					if ( tbody.childNodes[i].id != 'shipping_row_' + parcel_index ) {
						tbody.childNodes[i].parentNode.removeChild(tbody.childNodes[i]);
						i--;
					}
				}		
			}	
		}
		
		var insert_before_target = did("shipping_row_" + parcel_index) || did("grand_total_row_" + parcel_index);
		var modifier;
		
		for ( var i = 0; i < obj.parcels[parcel_index].modifiers.length; i++ ) {
			
			modifier = obj.parcels[parcel_index].modifiers[i];
			
			if ( modifier.service ) {
			
				if ( did("carrier_" + parcel_index) ) {
				
					while ( did("carrier_" + parcel_index).options.length > 0 ) {
						did("carrier_" + parcel_index).remove(0);
					}
					
					for ( var k=0; k < modifier.carriers.length; k++ ) {
						var optn = document.createElement("option");
						optn.text = modifier.carriers[k].text;
						optn.value = modifier.carriers[k].value;
						did("carrier_" + parcel_index).options.add(optn);
					}
					
					did("carrier_" + parcel_index).value = modifier.carrier;
				}
				
				if ( did("service_" + parcel_index) ) {
				
					while ( did("service_" + parcel_index).options.length > 0 ) {
						did("service_" + parcel_index).remove(0);
					}
					
					for ( var k = 0; k < modifier.services.length; k++ ) {
						var optn = document.createElement("option");
						optn.text = modifier.services[k].text;
						optn.value = modifier.services[k].value;
						did("service_" + parcel_index).options.add(optn);
					}
					
					did("service_" + parcel_index).value = modifier.service;
				}
				
				if ( modifier.tbd ) {
					Activa.DOM.showID('collect-shipping_' + parcel_index);
					did("shipping_total_" + parcel_index).innerHTML = 'TBD';
				} else {
					Activa.DOM.hideID('collect-shipping_' + parcel_index);
					did("shipping_total_" + parcel_index).innerHTML = (modifier.amount < 0 ? '-$' : '$') + numberFormat(Math.abs(modifier.amount));
				}				
			
				insert_before_target = did("grand_total_row_" + parcel_index);	
			} else {
				var tr = document.createElement('tr');
				tr.className = 'discount';
				
				var td = document.createElement('td');
				td.className = 'title first';
				td.colSpan = '3';
				td.appendChild(document.createTextNode(modifier.name));
				tr.appendChild(td);
				
				var td = document.createElement('td');
				td.className = 'price ' + (modifier.positive ? 'green' : 'red') + ' last';
				td.appendChild(document.createTextNode((modifier.amount < 0 ? '-$' : '$') + numberFormat(Math.abs(modifier.amount))));
				tr.appendChild(td);
				
				tbody.insertBefore(tr, insert_before_target);
			}
		}
		
		did("grand_total_" + parcel_index).innerHTML = "$" + numberFormat(obj.parcels[parcel_index].total);
		Activa.DOM.showID("shipping_row_" + parcel_index);
	}
	
	var trs = did("grand_total_row").parentNode.childNodes;
	for ( var i = 0; i < trs.length; i++ ) {
		if ( trs[i].nodeName == "TR" && Activa.DOM.hasClass(trs[i], 'discount') ) {
			did("grand_total_row").parentNode.removeChild(trs[i]);
			i--;
		}
	}
	
	while ( Activa.DOM.hasClass(did('bottom_of_table').previousSibling, 'discount') ) {
		did('bottom_of_table').parentNode.removeChild(did('bottom_of_table').previousSibling);
	}
	
	for ( var i = 0; i < obj.modifiers.length; i++ ) {	
		var tr = document.createElement('tr');
		tr.className = 'discount';
		
		var td = document.createElement('td');
		td.className = 'first';
		tr.appendChild(td);

		var td = document.createElement('td');
		td.className = 'total';
		td.colSpan = '2';
		td.appendChild(document.createTextNode(obj.modifiers[i].name));
		tr.appendChild(td);
		
		var td = document.createElement('td');
		td.className = 'price last ' + (obj.modifiers[i].positive ? 'green' : 'red');
		td.appendChild(document.createTextNode((obj.modifiers[i].amount < 0 ? '-$' : '$') + numberFormat(Math.abs(obj.modifiers[i].amount))));
		tr.appendChild(td);

		did("bottom_of_table").parentNode.insertBefore(tr, did("bottom_of_table"));
	}
	
	if ( (obj.payment_method == 'creditcard' || obj.payment_method == 'paypal') || obj.grand_total > 0 ) {
		if ( obj.payment_method == 'creditcard' ) {
			Activa.DOM.showID("checkout_form");
			Activa.DOM.hideID('paypal_form');
		} else if ( obj.payment_method == 'paypal' ) {
			Activa.DOM.hideID("checkout_form");
			Activa.DOM.showID('paypal_form');
		}
		Activa.DOM.hideID("checkout_promocode_form");
		Activa.DOM.hideID("checkout_giftcert_form");
		Activa.DOM.showID("payment_information");
		processPaymentType();
	} else {
		Activa.DOM.hideID("checkout_form");
		Activa.DOM.hideID('paypal_form');
		Activa.DOM.hideID("checkout_promocode_form");
		Activa.DOM.hideID("checkout_giftcert_form");
		Activa.DOM.hideID("payment_information");
		if ( obj.payment_method == 'promocode' ) {
			Activa.DOM.showID("checkout_promocode_form");
		} else if ( obj.payment_method == 'giftcert' ) {
			Activa.DOM.showID("checkout_giftcert_form");
		}
	}
		
	if ( obj.promo_error ) {
		did('promo_code_error').innerHTML = obj.promo_error;
		Activa.DOM.showID('promo_code_error');
	} else {
		did('promo_code_error').innerHTML = '';
		Activa.DOM.hideID('promo_code_error');
	}
	
	did("grand_total").innerHTML = "$" + numberFormat(obj.grand_total);

	if ( did('amount') ) {
		did('amount').value = obj.grand_total;
	}
	
	Zebra.applyToTable('checkout_table_0');
}

//If this function doesn't exist already.
function hover(obj, state){
	if ( !obj ) { 
		return; 
	}
	
	state = Boolean(state);
	if ( state ) {
		Activa.DOM.addClass(obj, 'hover');
	} else {
		Activa.DOM.removeClass(obj, 'hover');
	}
}

/**
 * rgbToHex - Converts an rgb color value into a hexidecimal value (without the leading '#')
 * @param	integer		r		Value of the color red in range 0-255;
 * @param	integer		g		Value of the color green in range 0-255;
 * @param	integer		b		Value of the color blue in range 0-255;
 * @return	string				Hexidecimal representation of the the color
 */
function rgbToHex(r,g,b){
	var rgb = slice(arguments,0,3), hex = '0123456789ABCDEF';
	for(var i=0;i < 3;i++){
		rgb[i] = isNaN(parseInt(rgb[i],10)) ? 0 : parseInt(rgb[i],10);
		rgb[i] = Math.round(Math.max(Math.min(255,rgb[i]),0));
		rgb[i] = hex.charAt( (rgb[i]-rgb[i]%16)/16 ) + hex.charAt( rgb[i]%16 );
	}
	return rgb.join('');
}

function getPosition(elm) {
	var pos = { x: 0, y: 0 };
	if ( elm.offsetParent ) {
		do {
			pos.x += elm.offsetLeft;
			pos.y += elm.offsetTop;
		} while ( elm = elm.offsetParent );
	}
	return pos;
};

function getScroll(elm) {
	var pos = { x: 0, y: 0 };
	if ( elm && elm.tagName != 'BODY' ) {
		pos.y += elm.scrollTop;
		pos.x += elm.scrollLeft;
		elm = elm.parentNode;
	}
	return pos;
}

/**
 * getStyle - Retrieve the value of the current style property
 * @param	mixed		obj		Element id or object
 * @param	string		prop	Name of style property to retrieve
 * @return	mixed				Value of the style property. *Note: Unit values will be returned as integers. (ie. 'px' will be stripped off)*
 */
function getStyle(obj,prop){
	obj = (typeof obj == 'object') ? obj : did(obj);
	if(!obj || !prop){ return null; }
	var regRGB = /rgb\((\d+),\s(\d+),\s(\d+)\)/i, color;
	var compVal = obj.currentStyle ? obj.currentStyle[prop] : window.getComputedStyle(obj,null).getPropertyValue(prop);
	if((color = regRGB.exec(compVal)) != null){ color.shift(); compVal = '#'+rgbToHex.apply(null,color); }
	return isNaN(parseFloat(compVal)) ? compVal : parseFloat(compVal);
}

/**
 * getStyles - Retrieve the current value of several styles
 * @param	mixed	obj		Element id or object
 * @param	string	prop	Name of style property to retrieve (pass another parameter for each style property)
 * @return	object			Object whose keys are the style property and values are the style property's value
 */
function getStyles(obj, prop) {
	var args = slice(arguments,1);
	var styles = {};
	args.forEach(function(arg){
		this[arg] = getStyle(obj,arg);
	},styles);
	return styles;
}

var Rule_US_Phone = new Activa.Class({
	Extends: Rule,
	last_len: 0,
	validate: function validatePhone() {
		if ( this.root() ) {
			return true;
		}
		var len = this.field.value.length;
		this.field.value = this.field.value.replace(/[\(\)\-\s]|[a-z]/gi, '');
		if ( len == 1 ) {
			if ( this.field.value === '0' || this.field.value === '1' ) {
				this.field.value = '';
			}
		}
		if ( len > 3 ) {
			if ( this.field.value.indexOf('(') === -1 ) {
				this.field.value = '('+this.field.value;
			}
		}
		if ( len > 4 ) {
			if ( this.field.value.indexOf(')') === -1 && this.field.value.indexOf('(') !== -1 ) {
				this.field.value = this.field.value.substr(0, 4)+') '+this.field.value.substr(4);
			}
			if ( len > 6 && this.field.value.indexOf(' ') === -1 ) {
				this.field.value = this.field.value.substr(0, 5)+' '+this.field.value.substr(5);
			}
			if ( this.field.value.indexOf('-') === -1 ) {
				var pos = 8;
				if ( /\(\d{3}\)\s/.test(this.field.value) ) {
					pos = 9;
				}
				if ( len > pos ) {
					this.field.value = this.field.value.substr(0, pos)+'-'+this.field.value.substr(pos);
				}
			}
		}
		if ( this.field.value.length > 14 && this.field.value[14] != ' ' ) {
			var x_pos = this.field.value.indexOf('x') || this.field.value.indexOf('X');
			if ( x_pos === -1 ) {
				this.field.value = this.field.value.substr(0, 14)+' x'+this.field.value.substr(14).trim();
			}
		}
		if ( this.field.value.indexOf('-') ) {
			var pos = this.field.value.indexOf('-');
			if ( pos < 8 ) {
				this.field.value = this.field.value.substr(0, pos-1)+this.field.value.substr(pos+1);
			}
		}
		var reg = new RegExp(/^\(\d{3}\)\s?\d{3}\-\d{4}(\sx\d+)?$/gi);
		this.last_len = this.field.value.length;
		return reg.test(this.field.value);
	}
});

