Number.prototype.NaN0=function(){return isNaN(this)?0:this;}

// CREDITS: // Automatic Page Refresher by Peter Gehrig and Urs Dudli www.24fun.com
// Permission given to use the script provided that this notice remains as is.
// Additional scripts can be found at http://www.hypergfurl.com.
// Configure refresh interval (in seconds)
var refreshinterval = 60
// Shall the coundown be displayed inside your status bar? Say "yes" or "no" below:
var displaycountdown = "yes"
// Do not edit the code below
var starttime
var nowtime
var reloadseconds = 0
var secondssinceloaded = 0 
function starttime() {
	starttime=new Date();
	starttime=starttime.getTime();
	countdown();
}

function countdown() {
	nowtime = new Date();
	nowtime = nowtime.getTime();
	secondssinceloaded = (nowtime - starttime) / 1000;
	reloadseconds = Math.round(refreshinterval - secondssinceloaded);
	if (refreshinterval >= secondssinceloaded) {
		var timer = setTimeout("countdown()",1000);
		if (displaycountdown == "yes")  {
			window.status = "Page refreshing in " + reloadseconds + " seconds";
		}
	} else {
		clearTimeout(timer);
		window.location.reload(true);
	}
}

/* IN - num:            the number to be formatted
	   decimalNum:     the number of decimals after the digit
	   bolLeadingZero: true / false to use leading zero
	   bolParens:      true / false to use parenthesis for - num

  RETVAL - formatted number
*/
function FormatNumber(num, decimalNum, bolLeadingZero, bolParens) {
  	var tmpNum = num;

  	// Return the right number of decimal places
  	tmpNum *= Math.pow(10, decimalNum);
  	tmpNum = Math.floor(tmpNum);
  	tmpNum /= Math.pow(10, decimalNum);

  	var tmpStr = new String(tmpNum);
	
  	// See if we need to hack off a leading zero or not
  	if (!bolLeadingZero && num < 1 && num > -1 && num !=0)
		if (num > 0)
			tmpStr = tmpStr.substring(1,tmpStr.length);
		else
			// Take out the minus sign out (start at 2)
			tmpStr = "-" + tmpStr.substring(2,tmpStr.length);                        

	// See if we need to put parenthesis around the number
	if (bolParens && num < 0)
		tmpStr = "(" + tmpStr.substring(1,tmpStr.length) + ")";
	
	return tmpStr;
}

function formatCurrency(num) {
	num = num.toString().replace(/\$|\,/g,'');
	if (isNaN(num)) num = "0";
	
	sign = (num == (num = Math.abs(num)));
	num = Math.floor(num * 100 + 0.50000000001);
	cents = num % 100;
	num = Math.floor(num / 100).toString();
	
	if (cents < 10) cents = "0" + cents;
	for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++)
		num = num.substring(0, num.length - (4 * i + 3)) + ',' + num.substring(num.length - (4 * i + 3));
		
	return (((sign) ? '' : '-') + '$' + num + '.' + cents);
}

function FormatCent(num) {
	num -= 0;
	return (num == Math.floor(num) ? num + '.00' : (num * 10 == Math.floor(num * 10) ? num + '0' : num));
}

function NVL(value, valueIfNull) {
	if (value == null)
		return valueIfNull;
	else
		return value;
}

// remove leading spaces 
function ltrim(strText) {
	var str = new String(strText);
	
	if (str > "") {
		while (str.substring(0,1) == ' ' || str.substring(0, 1) == "\n" || str.substring(0, 1) == "\r") 
			str = str.substring(1, str.length);
	}
	
	return str.toString();
}

// remove trailing spaces 
function rtrim(strText) {
	var str = new String(strText);
	
	if (str > "") {
		while (str.substring(str.length-1, str.length) == ' ' || str.substring(str.length-1, str.length) == "\n" || str.substring(str.length-1, str.length) == "\r")
			str = strText.substring(0, str.length-1);
	}
	
	return str.toString();
}

// remove leading and trailing spaces
function trim(str) {
	return(rtrim(ltrim(str)));
} 

function left(str, n){
	if (n <= 0)
		return "";
	else if (n > String(str).length)
		return str;
	else
		return String(str).substring(0,n);
}

function right(str, n){
	if (n <= 0)
		return "";
	else if (n > String(str).length)
		return str;
	else {
		var iLen = String(str).length;
		return String(str).substring(iLen, iLen - n);
	}
}

function filterKeys(e) {	
	if (e && e.which) {
		what = this;
		code = e.which;
			
	} else {
		what = event.srcElement;
		code = event.keyCode;
	}
	
	if (!(code >=32 && code <= 165) || code == 127) return;
		
	var filterType = what._type;
	var allowLeadingSpace = what._allowLeadingSpace;
		
	if (allowLeadingSpace != null && code == 32 &&
		(allowLeadingSpace == "0" || allowLeadingSpace == "false") &&
		trim(what.value) == "") {
		
		if (!e) event.keyCode = 0;
		return false;
	}

	if (filterType == "alphanumeric") {
		if (!((code >= 48 && code <= 57) ||
			  (code >= 65 && code <= 90) ||
			  (code >= 97 && code <= 122) ||
			  (code == 32)))
		{ 
			if (!e) event.keyCode = 0;
			return false;
		}
	}
	else if (filterType == "ALPHANUMERIC") {
		if (!((code >= 48 && code <= 57) ||
			  (code >= 65 && code <= 90) ||
			  (code >= 97 && code <= 122) ||
			  (code == 32)))
		{ 
			if (!e) event.keyCode = 0;
			return false;
		}
		else if (code >= 97 && code <= 122) {
			// auto upper case letters
			if (e)
				e.which -= 32;
			else
				event.keyCode -=32;
		}
	}
	else if (filterType == "alpha") {
		if (!((code >= 65 && code <= 90) ||
			  (code >= 97 && code <= 122)||
			  (code == 32)))
		{ 
			if (!e) event.keyCode = 0;
			return false;
		}
	}
	else if (filterType == "integer") {
		if (!((code >= 48 && code <= 57) || code == 45)) {
			if (!e) event.keyCode = 0;
			return false;
		}
	}
	else if (filterType == "float") {
		if (!((code >= 48 && code <= 57) || code == 46 || code == 45)) {
			if (!e) event.keyCode = 0;
			return false;
		}
	}
}

function validationPassed(formName) {
	var msg = "";
	var msgRequired = "";
	var msgRange = "";
	var msgNaN = "";
	var elementCount;
	var formElements;
	var curElement;
	var setElementFocus = null;
	var element;
	var addMode = false;
	
	element = eval("document." + formName + "(\"hid.cmd\")");
	if (element != null && element.value == "add")
		addMode = true;
		
	elementCount = eval("document." + formName + ".elements.length");
	formElements = "document." + formName + ".elements[i]";
	
	for (var i = 0; i < elementCount; i++) {
		curElement = eval(formElements);
		if (curElement == null) continue;
		if (curElement.type == "hidden" || curElement.type == "button") continue;
		
		if (curElement.type == "text" || curElement.type == "password") {
			
			if (!addMode) {
				// if the value has not changed then do no further checks even if the current value is wrong.  This will prevent the
				// web app from forcing users to change values currently on the database when they may not have enough info to do so
				if (curElement._type == "float" || curElement._type == "integer") {
					if (curElement._curValue == curElement.value)
						// for when they are literal matched.  (allows for NULL checks)
						continue;
					else if ((curElement._curValue - 0) == (curElement.value - 0))
						// for when they are value matched
						continue;
						
				} else if (curElement._curValue == curElement.value) {
					// for when alpha types did not change
					continue;
				}
			}
			
			if (curElement._required == "1" && curElement.value == "") {
				msgRequired = msgRequired + "\n\t" + curElement._label;
				setFieldColor(curElement, "error");
				if (setElementFocus == null) setElementFocus = curElement;
				
			}  else if (curElement._type == "float" || curElement._type == "integer") {
			
				if (isNaN(curElement.value)) {
					msgNaN = msgNaN + "\n\t" + curElement._label;
					setFieldColor(curElement, "error");
					if (setElementFocus == null) setElementFocus = curElement;
					
				} else if (curElement._min > "" && curElement.value > "" &&
						 (curElement._min - 0) > (curElement.value - 0)) {
					msgRange = msgRange + "\n\t" + curElement._label;
					setFieldColor(curElement, "error");
					if (setElementFocus == null) setElementFocus = curElement;
				
				} else if (curElement._max > "" && curElement.value > "" &&
						 (curElement._max - 0) < (curElement.value - 0)) {
					msgRange = msgRange + "\n\t" + curElement._label;
					curElement.style.border = "thin #FF0000 solid";
					if (setElementFocus == null) setElementFocus = curElement;
				
				} else {
					// return border to normal
					setFieldColor(curElement, "");
				}
			} else {
				// return border to normal
				setFieldColor(curElement, "");
			}
		} else if (curElement.type == "dropdown") {
			if (!addMode) {
				// if the value has not changed then do no further checks even if the current value is wrong.  This will prevent the
				// web app from forcing users to change values currently on the database when they may not have enough info to do so
				if (curElement._curValue == curElement.value)
					continue;
			}
			
			if (curElement._required == "1" && curElement.value == "") {
				msgRequired = msgRequired + "\n\t" + curElement._label;
				setFieldColor(curElement, "error");
				if (setElementFocus == null) setElementFocus = curElement;
			} else {
				setFieldColor(curElement, "");
			}
		}
	}

	if (msgRequired > "") {
		msg = "The following required fields has no data:\n" + msgRequired;
	}

	if (msgNaN > "") {
		msgNaN = "The following fields contains invalid value:\n" + msgNaN;
		
		if (msg > "")
			msg = msg + "\n\n" + msgNaN;
		else
			msg = msgNaN;
	}
		
	if (msgRange > "") {
		msgRange = "The following fields contains out of range data:\n" + msgRange;
		
		if (msg > "")
			msg = msg + "\n\n" + msgRange;
		else
			msg = msgRange;
	}

	if (msg > "") alert(msg + "\n\nPlease correct and try again.");

	if (setElementFocus != null) setElementFocus.focus();
	
	// if has a message then return false to indicate validation failed
	return (msg == "");
}

function setFieldTooltips(formName) {
	var elementCount;
	var formElements;
	var curElement;
	
	elementCount = eval("document." + formName + ".elements.length");
	formElements = "document." + formName + ".elements[i]";
	
	for (var i = 0; i < elementCount; i++) {
		curElement = eval(formElements);
		if (curElement == null) continue;
		if (curElement.type == "hidden" || curElement.type == "button") continue;
		
		if (curElement.type == "text" || curElement.type == "password") {
			//set standard text field look and feel
			setFieldColor(curElement, "");
			setToolTip(curElement);
		}
	}
}

function setToolTip(fieldElement) {
	var tooltip ="";
	var minValue;
	var maxValue;
	
	if (!(fieldElement.type == "text" || fieldElement.type == "password"))
		return;
	
	if (fieldElement._required == "1") tooltip = "Required";
	
	if (fieldElement._min > "" || fieldElement._max > "") {
		if (tooltip > "") tooltip = tooltip + ": ";
		
		minValue = (fieldElement._min > "" ? fieldElement._min : "MIN");
		maxValue = (fieldElement._max > "" ? fieldElement._max : "MAX");
		
		tooltip = tooltip + minValue + " - " + maxValue;
	}
	
	fieldElement.title = tooltip;
}

function setFieldColor(curElement, state) {
	if (curElement.type == "text" || curElement.type == "password") {
		if (state == "error") {
			curElement.style.border = "1px #FF0000 solid";
			curElement.style.background = "white";
		}
		else if (state == "warning") {
			curElement.style.border = "1px solid #7F9DB9";
			curElement.style.background = "#FFFF00";
		}
		else {
			curElement.style.border = "1px solid #7F9DB9";
			curElement.style.background = "white";
		}
			
	} else if (curElement.type == "dropdown") {
		if (state == "error")
			curElement.style.background = "#FF7777";
		else if (state == "warning")
			curElement.style.background = "#FFFF00";
		else
			curElement.style.background = "white"
	}
}

function IsNumeric(sText)
{
	var ValidChars = "-0123456789.";
	var IsNumber = true;
	var Char;
 
	for (i = 0; i < sText.length && IsNumber == true; i++) 
	{ 
		Char = sText.charAt(i); 
		if (ValidChars.indexOf(Char) == -1) IsNumber = false;
	}
	
	return IsNumber;
}

// checks a numeric input field for errors
// returns 0 = OK, 1 = Warning, 2 = Error
function checkNumericField(element) {
	var errorCode = 0;
	
	var required = NVL(element._required, "");
	var minValue = NVL(element._min, "");
	var maxValue = NVL(element._max, "");
	var lowValue = NVL(element._low, "");
	var highValue = NVL(element._high, "");

	element._msg = "";
	
	if (element.value == "") {
		if (required - 0 != 0) {
			setFieldColor(element, "error");
			element._msg = "Error: " + NVL(element._label, element.name) + " is required";
			errorCode = 2;
			
		} else
			setFieldColor(element, "");
		
	} else if (!IsNumeric(element.value)) {
		element._msg = "Error: Value is not a valid number";
		setFieldColor(element, "error");
		errorCode = 2;
			
	} else if (minValue > "" && (minValue - 0 > element.value - 0)) {
		setFieldColor(element, "error");
		element._msg = "Error: Value cannot be less than min " + minValue;
		errorCode = 2;
		
	} else if (maxValue > "" && (maxValue - 0 < element.value - 0)) {
		setFieldColor(element, "error");
		element._msg = "Error: Value cannot be greater than max " + maxValue;
		errorCode = 2;
		
	} else if (lowValue > "" && (lowValue - 0 > element.value - 0)) {
		setFieldColor(element, "warning");
		element._msg = "Warning: Value is less than " + minValue + " low";
		errorCode = 1;
		
	} else if (highValue > "" && (highValue - 0 < element.value - 0)) {
		setFieldColor(element, "warning");
		element._msg = "Warning: Value is greater than " + highValue + " high";
		errorCode = 1;
		
	} else
		setFieldColor(element, "");
	
	return errorCode;
	
}

// Sets the proper appearance of toggle buttons using custom attribute "_state"
function setToggleStyle(toggle) {
	if (toggle == null) return false;
	
	if (toggle._state == null || toggle._state == "" || toggle._state == "0") {
		toggle.style.backgroundColor = "#A7A898";
		toggle.style.borderTop = "1px solid #FFFFF8";
		toggle.style.borderRight = "1px solid #82837D";
		toggle.style.borderBottom = "1px solid #82837D";
		toggle.style.borderLeft = "1px solid #FFFFF8";
		toggle.style.cursor = "hand";
		
	} else {
		toggle.style.backgroundColor = "#FEFFBF";
		toggle.style.borderTop = "1px solid #82837D";
		toggle.style.borderRight = "1px solid #FFFFF8";
		toggle.style.borderBottom = "1px solid #FFFFF8";
		toggle.style.borderLeft = "1px solid #82837D";
		toggle.style.cursor = "hand";
	}
}

//return IE4+or W3C DOM reference for an ID
function getObject(obj){
	var theObj
	if (document.all){
		if (typeof obj =="string"){
			return document.all(obj)
		}else {
			return obj.style
		}
	}
	if (document.getElementById){
		if (typeof obj =="string"){
			return document.getElementById(obj)
		}else {
			return obj.style
		}
	}
	return null
}

function btnMouseDown(button) {
	button.style.borderTopColor = "#6B6E72";
	button.style.borderRightColor = "#D7DBDF";
	button.style.borderBottomColor = "#D7DBDF";
	button.style.borderLeftColor = "#6B6E72";
}

function btnMouseUp(button) {
	button.style.borderTopColor = "#D7DBDF";
	button.style.borderRightColor = "#6B6E72";
	button.style.borderBottomColor = "#6B6E72";
	button.style.borderLeftColor = "#D7DBDF";
}

// disable the enter key on all broswers except IE, Firefox or Opera (i.e. Safari)
// this is a workaround to the Safari penchant for submitting the form no matter what
function formKeys(e) {
	var userAgent = navigator.userAgent.toLowerCase();
	if (userAgent.indexOf('safari') + 1 == 0) return true;
	
	if (e && e.which)
		code = e.which;	
	else
		code = event.keyCode;
			
	if (code == 13) {
		if (!e) event.keyCode = 0;
		return false;
	}
}

function setStyleClass(element, className) {
	element.setAttribute("class", className);
	element.setAttribute("className", className);
}

function initSelect(obj) {
	obj.options.length = 0;
}

function addSelect(obj, selItem) {
}

function URLencode(sStr) { 
	return escape(sStr). 
		replace(/\+/g, '%2B'). 
			replace(/\"/g,'%22'). 
				replace(/\'/g, '%27'). 
					replace(/\//g,'%2F'); 
}

function openDialog(dir, title, url, height) {
	var defaultData = "";
	
	if (window.showModalDialog) {
		changePending = "true"
		var returnValue = window.showModalDialog(
			dir + "/framesetDialog.jsp?title=" + escape(title) + "&url=" + escape(url), defaultData,
			"status:no;help:no;resizable:no;dialogHeight:" + height + ";dialogWidth:330px");
		
		changePending = "false"
	
		return (returnValue);
		
	} else {
		window.open(dir + "/framesetDialog.jsp?title=" + escape(title) + "&url=" + escape(url), title,
			"height=" + height + ",width=330,toolbar=no,directories=no,status=no, menubar=no, scrollbars=no, resizable=yes ,modal=yes");
	}
}

/*
 * Date Format 1.2.2
 * (c) 2007-2008 Steven Levithan <stevenlevithan.com>
 * MIT license
 * Includes enhancements by Scott Trenda <scott.trenda.net> and Kris Kowal <cixar.com/~kris.kowal/>
 *
 * Accepts a date, a mask, or a date and a mask.
 * Returns a formatted version of the given date.
 * The date defaults to the current date/time.
 * The mask defaults to dateFormat.masks.default.
 */
var dateFormat = function () {
	var	token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
		timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
		timezoneClip = /[^-+\dA-Z]/g,
		pad = function (val, len) {
			val = String(val);
			len = len || 2;
			while (val.length < len) val = "0" + val;
			return val;
		};

	// Regexes and supporting functions are cached through closure
	return function (date, mask, utc) {
		var dF = dateFormat;

		// You can't provide utc if you skip other args (use the "UTC:" mask prefix)
		if (arguments.length == 1 && (typeof date == "string" || date instanceof String) && !/\d/.test(date)) {
			mask = date;
			date = undefined;
		}

		// Passing date through Date applies Date.parse, if necessary
		date = date ? new Date(date) : new Date();
		if (isNaN(date)) throw new SyntaxError("invalid date");

		mask = String(dF.masks[mask] || mask || dF.masks["default"]);

		// Allow setting the utc argument via the mask
		if (mask.slice(0, 4) == "UTC:") {
			mask = mask.slice(4);
			utc = true;
		}

		var	_ = utc ? "getUTC" : "get",
			d = date[_ + "Date"](),
			D = date[_ + "Day"](),
			m = date[_ + "Month"](),
			y = date[_ + "FullYear"](),
			H = date[_ + "Hours"](),
			M = date[_ + "Minutes"](),
			s = date[_ + "Seconds"](),
			L = date[_ + "Milliseconds"](),
			o = utc ? 0 : date.getTimezoneOffset(),
			flags = {
				d:    d,
				dd:   pad(d),
				ddd:  dF.i18n.dayNames[D],
				dddd: dF.i18n.dayNames[D + 7],
				m:    m + 1,
				mm:   pad(m + 1),
				mmm:  dF.i18n.monthNames[m],
				mmmm: dF.i18n.monthNames[m + 12],
				yy:   String(y).slice(2),
				yyyy: y,
				h:    H % 12 || 12,
				hh:   pad(H % 12 || 12),
				H:    H,
				HH:   pad(H),
				M:    M,
				MM:   pad(M),
				s:    s,
				ss:   pad(s),
				l:    pad(L, 3),
				L:    pad(L > 99 ? Math.round(L / 10) : L),
				t:    H < 12 ? "a"  : "p",
				tt:   H < 12 ? "am" : "pm",
				T:    H < 12 ? "A"  : "P",
				TT:   H < 12 ? "AM" : "PM",
				Z:    utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
				o:    (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
				S:    ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
			};

		return mask.replace(token, function ($0) {
			return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
		});
	};
}();

// Some common format strings
dateFormat.masks = {
	"default":      "ddd mmm dd yyyy HH:MM:ss",
	shortDate:      "m/d/yy",
	mediumDate:     "mmm d, yyyy",
	longDate:       "mmmm d, yyyy",
	fullDate:       "dddd, mmmm d, yyyy",
	shortTime:      "h:MM TT",
	mediumTime:     "h:MM:ss TT",
	longTime:       "h:MM:ss TT Z",
	isoDate:        "yyyy-mm-dd",
	isoTime:        "HH:MM:ss",
	isoDateTime:    "yyyy-mm-dd'T'HH:MM:ss",
	isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
};

// Internationalization strings
dateFormat.i18n = {
	dayNames: [
		"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
		"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
	],
	monthNames: [
		"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
		"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
	]
};

// For convenience...
Date.prototype.format = function (mask, utc) {
	return dateFormat(this, mask, utc);
};

function selectOptionByValue(selectOptions, value) {
	if (selectOptions == null) return -1;
	
	for (var i = 0; i < selectOptions.options.length; i++) {
		if (selectOptions.options[i].value == value) {
			selectOptions.selectedIndex = i;
			selectOptions.setAttribute("_curValue", value);
			return i;
		}
	}
	
	selectOptions.selectedIndex = -1;
	selectOptions.setAttribute("_curValue", "");
}

function validateFileName(fileName) {
	fileName = fileName.replace(/^\s|\s$/g, ""); //trims string
    return /^[a-z,0-9,\(,\),\_,\.][\w\s\(\)\-\.]+\.(jpg|jpeg|tif|tiff|doc|pdf)$/i.test(fileName);
}

// JavaScript Document
function createCookie(name, value, days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
		var expires = "; expires=" + date.toGMTString();
	}
	else var expires = "";
	
	document.cookie = name + "=" + value + expires + "; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	
	for(var i = 0; i < ca.length; i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) {
			var value = c.substring(nameEQ.length,c.length);
			if (value.substring(0, 1) == "\"")
				value = value.substring(1, value.length - 1);
				
			if (value.substring(value.length - 1, 1) == "\"")
				value = value.substring(0, value.length - 1);

			return value;
		}
	}
	
	return null;
}

function eraseCookie(name) {
	createCookie(name, "", -1);
}

function cookieCheck(showMsg) {
	createCookie("allowCookies", "yes", 0);
	var allowCookies = readCookie("allowCookies");

	if (allowCookies == null || allowCookies != "yes") {
		if (showMsg != null && showMsg == true) {
			alert("Please Enable Cookies\n\nCookies are DISABLED on this browser.  Cookies are required" +
				  "\nfor Shopping Cart and Lightbox features.  Please see our Privacy" +
				  "\nPolicy if you have any concerns.");
		}
		
		return false;
		
	} else
		return true;
}

/***************** SIDEBAR JAVASCRIPT *****************/

function toggleMenu(pnl, menuName, classPrefix) {
	var menu = document.getElementById(menuName);
	if (menu == null) return false;
		
	if (menu.style.display == "none") {
		menu.style.display = "inline";
		setStyleClass(pnl, classPrefix + "Open");
		ajxSideMenuToggle(pnl, menuName, "1");
		
	} else {
		menu.style.display = "none";
		setStyleClass(pnl, classPrefix + "Close");
		ajxSideMenuToggle(pnl, menuName, "0");
	}
}

function ajxSideMenuToggle(pnl, pnlName, pnlState) {
	var ajaxReq = new ajaxRequest(pnl);
	ajaxReq.update("admin", "cmd=setPnl&pnlName=" + pnlName + "&pnlState=" + pnlState);
}

// called from the Authoring section to filter images for current Author only
function setAuthorFilter(filter) {
	var ajaxReq = new ajaxRequest(filter);
	ajaxReq.update("admin", "cmd=setfilter&filterauthor=" + (filter.checked ? "1" : "0"));
}

// called from the sideBar cart to go to CheckOut
function cartCheckOut() {
	try {
		document.location.href = varWebRoot + "/shop?cmd=viewCart";
	} catch (err) {
		document.location.href = "/shop?cmd=viewCart";
	}
}

// called to add cart items to the sideBar cart list
function refreshCartXML(element, xmlCart) {
	if (xmlCart == null) return;
	
	var itemCount = 0;
	var TBody = getObject("tableCart");
	
	//clear any existing rows
	while (TBody.rows.length > 0) TBody.deleteRow(0);

	var newR, newC;
	
	var currAcct = xmlCart.getElementsByTagName("current_account");
	var subCurrUser = document.getElementById("msg-user-id");

	if (currAcct.length > 0) {	
		if (subCurrUser != null)
			subCurrUser.innerHTML = currAcct[0].getElementsByTagName("user_id")[0].firstChild.nodeValue;
		
		var subLogIn = document.getElementById("sub-log-in");
		if (subLogIn != null) {
			window.location = varWebRootSSL + "/suborder";
			return;
		}
		
	} else if (subCurrUser != null) {
		window.location = varWebRootSSL + "/suborder?l=1";
		return;
	}
	
	var cartCredits = xmlCart.getElementsByTagName("credit");
	
	for (var i = 0; i < cartCredits.length; i++) {
			
		var table = "<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"textSmall\">";
		table += "<tr><td colspan=\"2\" style=\"padding-left:2px; padding-right:2px; padding-bottom:5px\">" + cartCredits[i].getElementsByTagName("credits")[0].firstChild.nodeValue + " Stock Photo Credits";
		table += "</td></tr><tr>";
		table += "<td class=\"cartListLeft\"><span class=\"hoverLink\" onClick=\"removeFromCart('crdcart', " + cartCredits[i].getElementsByTagName("credit_id")[0].firstChild.nodeValue + ")\">Remove</span></td>";
		table += "<td class=\"cartListRight\">";
		table += "$ " + FormatCent(cartCredits[i].getElementsByTagName("price")[0].firstChild.nodeValue);
		table += "</td></tr>";
		table += "</table>";
		
		newR = TBody.insertRow(TBody.rows.length);
		newC = newR.insertCell(newR.cells.length);
		newC.innerHTML = table;
		
		itemCount++;
		
		if ((i + 1) != cartCredits.length) {
			newR = TBody.insertRow(TBody.rows.length);
			newC = newR.insertCell(newR.cells.length);
			newC.innerHTML = "<hr width=\"90%\" size=\"1\" noshade=\"noshade\" style=\"color:#A5D3B3\"/>";
			newC.height = 5;
		}
	}
	
	var cartSubs = xmlCart.getElementsByTagName("sub");
	
	var subCreateAccount = document.getElementById("sub-create-account");
	if (subCreateAccount != null) displaySubInCartMessage((cartSubs.length > 0));
	
	for (var i = 0; i < cartSubs.length; i++) {
			
		var table = "<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"textSmall\">";
		table += "<tr><td colspan=\"2\" style=\"padding-left:2px; padding-right:2px; padding-bottom:5px\">" + cartSubs[i].getElementsByTagName("descr")[0].firstChild.nodeValue;
		
		if (nvlXML(cartSubs[i].getElementsByTagName("extended_license")[0], 0) == 1)
			table += "<br />Extended License";
		else
			table += "<br />Standard License";
			
		table += "</td></tr><tr>";
		table += "<td class=\"cartListLeft\"><span class=\"hoverLink\" onClick=\"removeFromCart('subcart', " + cartSubs[i].getElementsByTagName("sub_id")[0].firstChild.nodeValue + ")\">Remove</span></td>";
		table += "<td class=\"cartListRight\">";
		table += "$ " + FormatCent(cartSubs[i].getElementsByTagName("price")[0].firstChild.nodeValue);
		table += "</td></tr>";
		table += "</table>";
		
		newR = TBody.insertRow(TBody.rows.length);
		newC = newR.insertCell(newR.cells.length);
		newC.innerHTML = table;
		
		itemCount++;
		
		if ((i + 1) != cartSubs.length) {
			newR = TBody.insertRow(TBody.rows.length);
			newC = newR.insertCell(newR.cells.length);
			newC.innerHTML = "<hr width=\"90%\" size=\"1\" noshade=\"noshade\" style=\"color:#A5D3B3\"/>";
			newC.height = 5;
		}
	}
	
	var cartCCDs = xmlCart.getElementsByTagName("ccd");
	
	var subCreateAccount = document.getElementById("ccd-create-account");
	if (subCreateAccount != null) displayCCDInCartMessage((cartCCDs.length > 0));
	
	for (var i = 0; i < cartCCDs.length; i++) {
			
		var table = "<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"textSmall\">";
		table += "<tr><td colspan=\"2\" style=\"padding-left:2px; padding-right:2px; padding-bottom:5px\">" + cartCCDs[i].getElementsByTagName("descr")[0].firstChild.nodeValue;
		
		if (nvlXML(cartCCDs[i].getElementsByTagName("extended_license")[0], 0) == 1)
			table += "<br />Extended License";
		else
			table += "<br />Standard License";
			
		table += "</td></tr><tr>";
		table += "<td class=\"cartListLeft\"><span class=\"hoverLink\" onClick=\"removeFromCart('ccdcart', " + cartCCDs[i].getElementsByTagName("sub_id")[0].firstChild.nodeValue + ")\">Remove</span></td>";
		table += "<td class=\"cartListRight\">";
		table += "$ " + FormatCent(cartCCDs[i].getElementsByTagName("price")[0].firstChild.nodeValue);
		table += "</td></tr>";
		table += "</table>";
		
		newR = TBody.insertRow(TBody.rows.length);
		newC = newR.insertCell(newR.cells.length);
		newC.innerHTML = table;
		
		itemCount++;
		
		if ((i + 1) != cartCCDs.length) {
			newR = TBody.insertRow(TBody.rows.length);
			newC = newR.insertCell(newR.cells.length);
			newC.innerHTML = "<hr width=\"90%\" size=\"1\" noshade=\"noshade\" style=\"color:#A5D3B3\"/>";
			newC.height = 5;
		}
	}
	
	var cartCDs = xmlCart.getElementsByTagName("cd");
	
	for (var i = 0; i < cartCDs.length; i++) {
	
		if (i == 0 && cartSubs.length > 0) {
			newR = TBody.insertRow(TBody.rows.length);
			newC = newR.insertCell(newR.cells.length);
			newC.innerHTML = "<hr width=\"90%\" size=\"1\" noshade=\"noshade\" style=\"color:#A5D3B3\"/>";
			newC.height = 5;
		}
		
		var extended = cartCDs[i].getElementsByTagName("extended_license")[0].firstChild.nodeValue;
		
		var table = "<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"textSmall\">";
		table += "<tr><td colspan=\"2\" height=\"20\" style=\"padding-left:2px; padding-right:2px\">";
		table += "CD: " + cartCDs[i].getElementsByTagName("cd_name")[0].firstChild.nodeValue;
		table += "</td></tr>";
		table += "<tr><td colspan=\"2\" align=\"center\">";
		table += "<img class=\"cdCover\" src=\"" + varDirRoot + cartCDs[i].getElementsByTagName("cover_image")[0].firstChild.nodeValue + "\">";
		table += "</td></tr>";
		table += "<tr><td colspan=\"2\" height=\"18\" align=\"center\" valign=\"bottom\">";
		table += cartCDs[i].getElementsByTagName("format_name")[0].firstChild.nodeValue;
		
		if (extended == "1")
			table += " (Ext License)";
		else
			table += " (Std License)";
			
		table += "</td></tr>";
		table += "<tr><td class=\"cartListLeft\">";
		table += "<span class=\"hoverLink\" onClick=\"removeFromCart('cdcart', '" + cartCDs[i].getElementsByTagName("cd_id")[0].firstChild.nodeValue + "-" + cartCDs[i].getElementsByTagName("format_id")[0].firstChild.nodeValue + "')\">Remove</span>";
		table += "</td><td class=\"cartListRight\">";
		table += "$ " + FormatCent(cartCDs[i].getElementsByTagName("price")[0].firstChild.nodeValue);
		table += "</td></tr></table>";
		
		newR = TBody.insertRow(TBody.rows.length);
		newC = newR.insertCell(newR.cells.length);
		newC.innerHTML = table;
		
		itemCount++;
		
		if ((i + 1) != cartCDs.length) {
			newR = TBody.insertRow(TBody.rows.length);
			newC = newR.insertCell(newR.cells.length);
			newC.innerHTML = "<hr width=\"90%\" size=\"1\" noshade=\"noshade\" style=\"color:#A5D3B3\"/>";
			newC.height = 5;
		}
	}
	
	var cartImg = xmlCart.getElementsByTagName("img");
	
	for (var i = 0; i < cartImg.length; i++) {

		if (i == 0 && (cartSubs.length > 0 || cartCDs.length > 0)) {
			newR = TBody.insertRow(TBody.rows.length);
			newC = newR.insertCell(newR.cells.length);
			newC.innerHTML = "<hr width=\"90%\" size=\"1\" noshade=\"noshade\" style=\"color:#A5D3B3\"/>";
			newC.height = 5;
		}

		var subImage = 0;
		if (cartImg[i].getElementsByTagName("sub_image")[0] != null || cartImg[i].getElementsByTagName("ccd_image")[0] != null) subImage = 1;
		
		var table = "<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"textSmall\">";
		table += "<tr><td colspan=\"2\" height=\"20\" style=\"padding-left:2px\">";
		table += "Image: " + cartImg[i].getElementsByTagName("image_name")[0].firstChild.nodeValue;
		table += "</td></tr>";
		table += "<tr><td colspan=\"2\" align=\"center\">";
		table += "<img src=\"" + varDirRoot + cartImg[i].getElementsByTagName("thumb_path")[0].firstChild.nodeValue + "\">";
		table += "</td></tr>";
		table += "<tr><td colspan=\"2\" height=\"18\" align=\"center\" valign=\"bottom\">";
		table += cartImg[i].getElementsByTagName("descr")[0].firstChild.nodeValue;
		table += "</td></tr>";
		table += "<tr><td class=\"cartListLeft\">";
		table += "<span class=\"hoverLink\" onClick=\"removeFromCart('cart', '" + cartImg[i].getElementsByTagName("image_name")[0].firstChild.nodeValue + "-" + cartImg[i].getElementsByTagName("price_id")[0].firstChild.nodeValue + "')\">Remove</span>";
		table += "</td><td class=\"cartListRight\">";
		if (subImage == 1)
			table += "$ 0.00";
		else
			table += "$ " + FormatCent(cartImg[i].getElementsByTagName("price")[0].firstChild.nodeValue);
		table += "</td></tr></table>";
		
		newR = TBody.insertRow(TBody.rows.length);
		newC = newR.insertCell(newR.cells.length);
		newC.innerHTML = table;
		
		itemCount++;
		
		if ((i + 1) != cartImg.length) {
			newR = TBody.insertRow(TBody.rows.length);
			newC = newR.insertCell(newR.cells.length);
			newC.innerHTML = "<hr width=\"90%\" size=\"1\" noshade=\"noshade\" style=\"color:#A5D3B3\"/>";
			newC.height = 5;
		}
	}
	
	var cartTable = document.getElementById("cart-table");
	if (cartTable != null) cartTable.style.display = (itemCount == 0 ? "none" : "block");
	
	// var bodyArea = document.getElementById("body-area");
	// if (bodyArea != null) bodyArea.style.paddingLeft = (itemCount == 0 ? "10px" : "163px");
	
	/*
	if (itemCount == 0) {
		var table = "<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"textSmall\">";
		table += "<tr><td  height=\"20\" style=\"padding-left:2px\">";
		table += "Your Shopping Cart is Empty";
		table += "</td></tr></table>";
		
		newR = TBody.insertRow(TBody.rows.length);
		newC = newR.insertCell(newR.cells.length);
		newC.innerHTML = table;
	}
	*/
	
	document.getElementById("cartHeader").innerHTML = "My Cart (" + itemCount + ")";
}

function uploadCDImage() {
	var returnValue = openDialog(varWebRoot, "Upload CD Cover Image", "uploadCDImage.jsp", "100px");
}

function toggleAnalyticsExclusion(checkBox) {
	if (checkBox.name == "chk_isAdmin") {
		if (checkBox.checked)
			createCookie("excludeAnalyticsAdmin", 1, 100000);
		else
			eraseCookie("excludeAnalyticsAdmin");
			
	} else if (checkBox.name == "chk_isAuthor") {
		if (checkBox.checked)
			createCookie("excludeAnalyticsAuthor", 1, 100000);
		else
			eraseCookie("excludeAnalyticsAuthor");
	}
}


/********** CART JAVASCRIPT **********/

function removeFromCart(cartType, cartItem) {
	var cart = readCookie(cartType);
	var cartItems = null;
	var newCart = "";

	if (cart == null) return false;

	cartItems = cart.split('|');

	for (var i = 0; i < cartItems.length; i++) {
		if (cartItems[i] != cartItem) {
			if (newCart > "") newCart = newCart + "|";
			newCart = newCart + cartItems[i];
		}
	}
	
	if (newCart > "")
		createCookie(cartType, newCart, 365);
	else
		eraseCookie(cartType);
	
	if (document.getElementById("btn.CheckOut") != null)
		document.location.href = "shop?cmd=viewCart";
	else {
		ajaxRefreshCart();
	}
}

function clearCart(askConfirm) {
	
	if (askConfirm == null || askConfirm != false) {
		if (!confirm("Clear all items from your Shopping Cart?")) return;
	}
	
	createCookie("cdcart", "", -1);
	createCookie("cart", "", -1);
	createCookie("subcart", "", -1);
	createCookie("crdcart", "", -1);
	createCookie("ccdcart", "", -1);
		
	if (document.getElementById("btn.CheckOut") != null)
		document.location.href = "shop?cmd=viewCart";
	else {
		ajaxRefreshCart();
	}
}