/**
 * Namespace for CTB Javascript libraries
 */
var CTB = {};

/**
 * Test for valid JSON.
 *
 * From: http://www.json.org/json.js
 */
CTB.parseJSON = function(json) {
	if (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/.test(json.
		replace(/\\./g, '@').
		replace(/"[^"\\\n\r]*"/g, ''))) {
			return eval('(' + json + ')');
	}
	return { };
};

/**
 * Test if an object is an array.
 *
 * From: http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256C720080D723
 */
CTB.isArray = function(obj) {
   if (obj.constructor.toString().indexOf("Array") == -1)
      return false;
   else
      return true;
}

/**
 * Format a number to be displayed nicely as a currency amount.
 */
CTB.formatCurrency = function(amount) {
	var i = parseFloat(amount);
	if(isNaN(i)) { i = 0.00; }
	var minus = '';
	if(i <= -0.01) { minus = '-'; }
	i = Math.abs(i);
	i = parseInt((i + .005) * 100);
	i = i / 100;
	s = new String(i);
	if(s.indexOf('.') < 0) { s += '.00'; }
	if(s.indexOf('.') == (s.length - 2)) { s += '0'; }
	s = '$' + minus + s;
	return s;	
};

/*
 * Test if a string contains a valid integer.
 */
CTB.isInteger = function(str) {
	if(str == null) return false;
	return str.match(/^\s*[-]{0,1}\d+\s*$/g);
};

/*
 * Test if a string contains a positive integer (n > 0).
 */
CTB.isPositiveInteger = function(str) {
	if(str == null) return false;
	return str.match(/^\s*\d*[1-9]+\d*\s*$/g);
};

/*
 * Test if a string contains a non-negative integer (n >= 0).
 */
CTB.isNonNegativeInteger = function(str) {
	if(str == null) return false;
	return str.match(/^\s*\d+\s*$/g);
};

/*
 * Test if a string contains a number.
 * (Positive or negative is accepted.)
 * (Decimal part is accepted.)
 */
CTB.isNumeric = function(str) {
	if(str == null) return false;
	str = CTB.trim(str);
	
	if((str.length == 1 && str.match(/^\d+$/g)) ||
		((str.length > 1) && str.match(/^[-]{0,1}\d*[.]{0,1}\d*$/g))) {
			return true;
	}

	return false;
};

/*
 * Trim a string.
 */
CTB.trim = function(str) {
	return str.replace(/^\s+|\s+$/g, '');
};

/*
 * Test if a value exists in an array.
 */
CTB.inArray = function (arr, value) {
	var i;
	for (i=0; i < arr.length; i++) {
		if (arr[i] === value) {
			return true;
		}
	}
	return false;
};

/*
 * If a value exists in an array, return the position where it is first found.
 *
 * Return -1 for no match.
 */
CTB.findInArray = function (arr, value) {
	var i;
	for (i=0; i < arr.length; i++) {
		if (arr[i] === value) {
			return i;
		}
	}
	return -1;
};

/*
 * Return an array of all elements with the given class name.
 *
 * Optionally limit search within a given node, or to elements with a certain tag name.
 *
 * From: http://www.dustindiaz.com/getelementsbyclass
 */
CTB.getElementsByClass = function(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

/*
 * Convenient shorthand for document.getElementById().
 *
 * Will return an array if an array is given.
 *
 * From: Prototype JS library
 */
function $() {
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof element == 'string') element = document.getElementById(element);
		if (arguments.length == 1) return element;
		elements.push(element);
	}
	return elements;
}


function toggleShipTable() {
	var table = document.getElementById('shipDiv').style;
	
	if(table.display != 'block') {
		showShipTable();
	}
	else {
		hideShipTable();
	}
}

function hideShipTable() {
	var table = document.getElementById('shipDiv').style;
	var submit = document.getElementById('submit_bill').style;
	
	table.display = 'none';
	submit.display = 'inline';
}

function showShipTable() {
	var table = document.getElementById('shipDiv').style;
	var submit = document.getElementById('submit_bill').style;
	
	table.display = 'block';
	submit.display = 'none';
}

function toggleMessage(i) {
	if ($('messageDiv'+i).style.display != 'block') {
		showMessage(i);
	}
	else {
		hideMessage(i);
	}
}

function showMessage(i) {
	$('messageDiv'+i).style.display='block';
	$('messageLink'+i).innerHTML = 'hide message';
}

function hideMessage(i) {
	$('messageDiv'+i).style.display='none';
	$('messageLink'+i).innerHTML = 'view message';
}

sfHover = function() {
	var sfEls = document.getElementById("main_nav").getElementsByTagName("LI");
	for (var i=0; i<sfEls.length; i++) {
		sfEls[i].onmouseover=function() {
			this.className+=" sfhover";
		}
		sfEls[i].onmouseout=function() {
			this.className=this.className.replace(new RegExp(" sfhover\\b"), "");
		}
	}
}
if (window.attachEvent) window.attachEvent("onload", sfHover);


