/* --------------------------------- */
/*          STOREFRONT v2.0          */
/* --------------------------------- */
/*           SFXv2.0 GLOBAL          */
/* --------------------------------- */
/*  Created:  2003-06-01             */
/*  Issued:   2003-06-01             */
/*  Modified: 2006-11-09             */
/*  Client: Sophiaknows              */
/*  Copyright (c) 2003-2006          */
/*  A.R. Tony Pisarra, SophiaKnows   */
/* --------------------------------- */
/* --------------------------------- */

Date.prototype.toUSText = function() {
	var shortnames = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
	return shortnames[this.getMonth()] + " " + this.getDate() + ", " + this.getFullYear();
	}

Date.prototype.getMonthString = function() {
	var args = Date.prototype.getMonthString.arguments;
	var key = (args[0])? args[0] : "";
	var strings = new Object();
		strings[""] = strings["M"] = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
		strings["F"] = ["January","February","March","April","May","June","July","August","September","October","November","December"];
		strings["m"] = ["01","02","03","04","05","06","07","08","09","10","11","12"];
	return strings[key][this.getMonth()];
	}
Date.prototype.numstrings = ["00","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60"];

Date.prototype.timestamp = function() {
	return this.toUSText() + " " + ((this.getHours()>12)?(this.numstrings[this.getHours()-12]): this.getHours()) + ":" + this.numstrings[this.getMinutes()] + ((this.getHours()>12)?" pm": " am");
	}
Date.prototype.sql_date = function() {	
	strings = ["01","02","03","04","05","06","07","08","09","10","11","12"];
	return this.getFullYear()+"-"+strings[this.getMonth()] + "-" + this.numstrings[this.getDate()];
	}

Date.prototype.intToString = function(i) {
	
	}

var mode=0;
var swatches = new Object();
// CATALOG
function Catalog(products) {
	this.products = products;
	this.init_guids();
	this.categories = this.init_categories();
	this.sections = this.init_sections();
	this.suppliers = this.init_suppliers();
	this.favorites = new Array();
	this.related = new Array();
	this.suggested = new Array();
	this.selected = new Object();
	this.active_range = new Array();
	this.kb = new Object();
	}

// CATALOG: INITS
Catalog.prototype.init_guids = function() {
	this.guids = new Object();
	this.indices = new Object();
	for(var i=0;i<this.products.length;i++) {
		product=this.products[i];
		this.guids[product.guid] = product;
		this.indices[product.guid] = i;
		}
	}
// CATALOG: INITS
Catalog.prototype.init_categories = function() {
	var categories = new Object();
	for(var i=0;(product=this.products[i]);i++) {
		categories[product.category]=(categories[product.category])?categories[product.category]:0;
		categories[product.category]++;
		}
	return categories;
	}

// CATALOG: INITS
Catalog.prototype.init_sections = function() {
	var sections = new Object();
	for(keys in this.categories) {
		sections[keys]={name:keys};
		}
	return sections;
	}

// CATALOG: INITS
Catalog.prototype.init_suppliers = function() {
	var suppliers = new Object();
	for(var i=0;(product=this.products[i]);i++) {
		suppliers[product.mfg]=(suppliers[product.mfg])?suppliers[product.mfg]:0;
		suppliers[product.mfg]++;
		}
	return suppliers;
	}

// CATALOG: INITS
Catalog.prototype.init_related = function(list) {
	for(var i=0;(rguids=list[i]);i++) {
		this.related[this.related.length] = rguids;
		for(var r=0;(rguid=rguids[r]);r++) {
			if(this.guids[rguid]) {
				var w = this.guids[rguid].related = new Array();
				for(var x=0;(y=rguids[x]);x++) {if(y!=rguid) {w[x] = this.guids[rguids[x]];}}
				}
			}
		}
	return this.related;
	}

// CATALOG: INITS
Catalog.prototype.init_suggested = function(list) {
	for(keys in list) {
		this.suggested[keys] = list[keys];
		for(var s=0;(sguid=list[keys][s]);s++) {
			if(this.guids[sguid]) {
				var w = this.guids[sguid].suggested = (this.guids[sguid].suggested)?this.guids[sguid].suggested:new Array();
				w[w.length]=(this.guids[keys])?this.guids[keys]:"";
				}
			}
		}
	return this.suggested;
	}
// CATALOG: INITS
Catalog.prototype.init_kb = function(list) {
	for(keys in list) {
		this.kb[keys] = list[keys];
		if(this.guids[keys]) {
			this.guids[keys]['help'] = list[keys];
			}
		}
	return this.kb;
	}

// CATALOG
Catalog.prototype.category_options = function() {
	var args = Catalog.prototype.category_options.arguments;
	var coptions = "";
	var ckeys = ksort(this.categories);
	for(var c = 0;(cname = ckeys[c]);c++) { coptions+="<option value=\""+ckeys[c]+"\""+((!args[0] || args[0]==ckeys[c] )?" selected":"")+">"+ckeys[c];}
	return coptions;
	}
// CATALOG
Catalog.prototype.mfg_options = function() {
	var args = Catalog.prototype.mfg_options.arguments;
	var moptions = "";
	var mkeys = ksort(this.suppliers);
	for(var m = 0;(mname = mkeys[m]);m++) { moptions+="<option value=\""+mkeys[m]+"\""+((!args[0] || args[0]==mkeys[m] )?" selected":"")+">"+mkeys[m];}
	return moptions;
	}

Catalog.prototype.product_options = function() {
	var args = Catalog.prototype.product_options.arguments;
	var moptions = "";
	var mkeys = ksort(this.suppliers);
	for(var m = 0;(p = this.products[m]);m++) { moptions+=p.select_option(); }
	return moptions;
	}

// CATALOG: 
Catalog.prototype.init_category_options = function(s) {
	var args=Catalog.prototype.init_category_options.arguments;
	var ckeys = ksort(this.categories);
	var a = (args[1])? 1 : 0;
	s.length = ckeys.length + parseInt(a);
	if(a) {
		s.options[0].value = "";
		s.options[0].text  = "ALL CATEGORIES";	
		}
	for(var c = 0;(cname = ckeys[c]);c++) { 
		s.options[c + parseInt(a)].value = cname;
		s.options[c + parseInt(a)].text  = cname;
		}
	}
// CATALOG
Catalog.prototype.init_mfg_options = function(s) {
	var args=Catalog.prototype.init_mfg_options.arguments;
	var mkeys = ksort(this.suppliers);
	var a = (args[1])? 1 : 0;
	s.length = mkeys.length + parseInt(a);;
	if(a) {
		s.options[0].value = "";
		s.options[0].text  = "ALL SUPPLIERS";	
		}
	for(var m = 0;(mname = mkeys[m]);m++) { 
		s.options[m + parseInt(a)].value = mname;
		s.options[m + parseInt(a)].text  = mname.toUpperCase();
		}
	}


// CATALOG
Catalog.prototype.toc = function() {
	var params = (Catalog.prototype.toc.arguments[0])?Catalog.prototype.toc.arguments[0] : new Object();
	this.active_range = this.filter(params);
	this.selected['index'] = this.active_range[0];
	this.selected['guid'] = this.products[this.active_range[0]].guid;
	var ttoc = "";
	this.active_indices = new Object;
	var xtoc = "<TABLE width=100% class=toc cellspacing=1 cellpadding=2>";
	for(var i=0;(i<this.active_range.length);i++) {
		var d = this.active_range[i];
		this.active_indices[this.products[this.active_range[i]].guid] = this.active_range[i];
		xtoc+= "<tr class=toc id=\"tr_"+d+"\" onclick=\"dosub('"+d+"',this)\" ondblclick=\"dosub2('"+d+"')\">";
		xtoc+= "<td class=guid>" + this.products[d].guid.replace(/_/g,"-");
		xtoc+= "<td class=title>" + this.products[d].title.toUpperCase();
//		xtoc+= "<td class=category>" + this.products[d].category.toUpperCase();
		xtoc+= "<td class=supplier>" + this.products[d].mfg.toUpperCase();
		xtoc+= "<td class=price align=right>" + this.products[d].price;
		}
	xtoc+="<\/TABLE>";
	return xtoc;
//	return this.active_range.length
	}

// CATALOG
Catalog.prototype.filter = function() {
	var params = (Catalog.prototype.filter.arguments[0])?Catalog.prototype.filter.arguments[0] : new Object();
	var xcategory = (params['category'])? params['category'] : "";
	var xmfg = params['mfg'] = ((params['mfg'])? params['mfg'] : ((params['supplier'])?params['supplier']: ""));
	var xrestrictions = (params['restrictions'])? eval("/"+unescape(params['restrictions']).replace(/\+/g," ")+"/i") : "";
	var xshow = (params['show'])? params['show'] : "favorites";
	var active_range = new Array();
	for(var i=0;i<this.products.length;i++) {
		if(xshow == 'all' || this.favorites[this.products[i].guid]) { 
				if( xcategory == "" || this.products[i].category.toUpperCase() == xcategory.toUpperCase()) {
					if( xmfg == "" || this.products[i].mfg.toUpperCase() == xmfg.toUpperCase()) {
						if(xrestrictions == "" 
						   || this.products[i].title.match(xrestrictions)
						   || this.products[i].guid.match(xrestrictions)		   
						   || this.products[i].category.match(xrestrictions)
						   || this.products[i].mfg.match(xrestrictions)) { 
							active_range[active_range.length] = i;
							}
						}
					}
				}
		}
	return active_range;
	}


Catalog.prototype.edit =function(i) {
	var item = ((this.products[i])?this.products[i]:((this.guids[i])?this.guids[i]:""));
	xcss="<style>input,textarea,select{border-width:1px;font-family:'Lucida Grande','Trebuchet MS',sans-serif;font-size:11px;width:100%;}th{text-align:center;font-weight:bold;width:70px;vertical-align:top;padding-top:2px;}body{background:#eee;}</style>";
//	SFWindow(xcss+this.form(i),650,450);
	SFPopurl("editor.html?guid="+item.guid,650,450);
	}
Catalog.prototype.formshow =function(f,i) {
	if(this.guids[i]) this.guids[i].formshow(f);
	}
/*

Catalog.prototype.export =function(i) {
	var x_item = (this.guids[i]!="") ? this.guids[i] : ((this.products[i])?(this.products[i]):"");
	if(x_item!="") {
		x_item.formsave(document.forms['admin']);
		alert(x_item.xml());
		}
	}
*/


//	C.2 CATALOG: PRODUCT: RETURN DETAIL
Catalog.prototype.form =function(i) {
	var vals = "";
	var poptions = "";
	var pform ="<table width=100% align=center cellpadding=1 cellspacing=1><form name=product>";
	var item = ((this.products[i])?this.products[i]:((this.guids[i])?this.guids[i]:""));
	pform+="<input type=hidden name=\"guid\" value=\""+this.guid+"\"/>"
	pform+="<tr><th colspan=2>SKU";
	pform+="<tr><td colspan=2><input name=\"sku\" value=\""+item.sku+"\"/>";
	pform+="<tr><th colspan=2>TITLE";
	pform+="<tr><td colspan=2><input name=\"title\" value=\""+item.title+"\"/>";
	pform+="<tr><th colspan=2>DESCRIPTION";
	pform+="<tr><td colspan=2><textarea name=\"description\">"+item.description+"</textarea>";
	pform+="<tr><th width=50%>CATEGORY<th width=50%>SUPPLIER";
	pform+="<tr><td width=50%>";
	pform+="<table width=100% cellspacing=0><tr>";
	pform+="<td width=*><select name=\"category\">"+this.category_options(item.category)+"</select>";
	pform+="<td width=30><input type=button  value=\"...\" onclick=\"if(x=prompt('Enter New Category')) {this.form.category.length++;so=this.form.category.options[this.form.category.length-1];so.value=x;so.text=x.toUpperCase();this.form.category.selectedIndex=this.form.category.length-1}\"/>";
	pform+="</table>";
	pform+="<td width=50%>";
	pform+="<table width=100% cellspacing=0><tr>";
	pform+="<td width=*><select name=\"supplier\">"+this.mfg_options(item.mfg)+"</select>";
	pform+="<td width=30><input type=button  value=\"...\" onclick=\"if(x=prompt('Enter New Supplier')) {this.form.supplier.length++;so=this.form.supplier.options[this.form.supplier.length-1];so.value=x;so.text=x;this.form.supplier.selectedIndex=this.form.supplier.length-1}\"/>";
	pform+="</table>";
	pform+="<tr><th width=50%>PRICE<th width=50%>IMAGE ";
	pform+="<tr><td width=50%><input name=\"price\" value=\""+item.price+"\"/>";
	pform+="<td align=center width=50%>";
	pform+="<table width=100% cellspacing=0><tr>";
	pform+="<td align=center width=*><input name=\"ximage\" value=\""+item.image+"\"/>";
	pform+="<td width=30 style=width:30px;><input style=width:30px; type=button value=\" ^ \"/>";
	pform+="<td width=30 style=width:30px;><input style=width:30px; type=button value=\"...\"/>";
	pform+="</table>";
	pform+="<tr><th colspan=2>OPTIONS";
	pform+="<tr><td width=50%><select name=options>";
	for(k in item.options) {
		vals = ((vals=="")? item.options[k]:vals);
		poptions+="<option value=\""+item.options[k]+"\">"+k;
		}
	pform+=(poptions!="")?poptions:"<option>N/A";
	pform+="<option>ADD OPTION";
	pform+="</select>";
	pform+="<td width=50%><select name=values>";
	vals=vals.split(",");
	if(vals.length>0) {
		for(vp=0;vp<vals.length;vp++) pform+="<option value=\""+vals[vp]+"\">"+vals[vp];
		} else {
		pform+="<option>N/A";
		}
	pform+="</select>";
	pform+="<\/table>";	
	pform+="<\/td><\/tr>";	
	pform+="<\/form>";	
	pform+="<\/table>";	
	return pform;
	}


// CATALOG
Catalog.prototype.tdc = function(i) {
	var c_tdc = "";
	for(var i=0;product=this.products[i];i++) {
		c_tdc+=product.tdc()+"\n";
		}
	return c_tdc;
	}

// CATALOG
Catalog.prototype.prices = function(i) {
	var c_tdc = "";
	for(var i=0;product=this.products[i];i++) {
		c_tdc+=product.guid+"\t"+product.price+"\n";
		}
	return c_tdc;
	}



// CATALOG
Catalog.prototype.pop_guid = function(i) {
	SFWindow(this.products[i].detail(),650,230);
	}
Catalog.prototype.pshow = function(f,i) {
	this.products[i].pshow(f)
	}


/* ------------------------------------------------------------------ *\
	OBJECT:	PRODUCT
\* ------------------------------------------------------------------ */


// CATALOG: PRODUCT (ALIAS FOR SFPRODUCT)
function product(guid,title,description,category,price,mfg,image) {
	var alias = new SFProduct(guid,title,description,category,price,mfg,image);
	for(keys in alias) {
		this[keys] = alias[keys];
		}
	}


/* ------------------------------------------------------------------ *\
	OBJECT:	PRODUCT
\* ------------------------------------------------------------------ */


// CATALOG: PRODUCT
function SFProduct(guid,title,description,category,price,mfg,image) {
	this.guid=guid;
	this.sku=(guid)?guid.replace(/_/g,"-") : "";
	this.title=title;
	this.description=description;
	this.category=category;
	this.price=price;
	this.mfg=mfg;
	this.image=image;
	this.options = new Object();
	}



//	C.2 CATALOG: PRODUCT: RETURN DETAIL
SFProduct.prototype.detail =function() {
	detail="<style>table.sub-table td{ border-bottom:solid #ccd 1px;padding-top:5px;padding-bottom:2px;}</style>";
	detail+="<table width=100% align=center cellpadding=5 cellspacing=5>";
	detail+="<tr>";
	detail+="<td class=SansBlack12 bgcolor=#FFFFFF valign=top width=50%>"
	detail+="<span class=SansBlack14><b>"+this.title.toUpperCase()+"<\/b> ("+this.sku+")"+"<\/span>";
	detail+="<br \/><br \/>"+this.description;
	detail+="<br \/><br \/>";
	detail+="<TABLE width=100% cellpadding=0 cellspacing=0 class='sub-table'>";
	detail+="<tr><td>SUPPLIER: <td align=right>"+this.mfg.toUpperCase();
	detail+="<tr><td>PRICE: <td align=right>"+convert_tocurrency(this.price);
	detail+="</TABLE>";
	detail+="</p>";
	detail+="<\/td>";
	detail+="<td style='vertical-align:middle;' bgcolor=#FFFFFF align=center width=50%><img src=\"http://www.ergonetics.com/images/medium/"+this.image+"\" \/><\/td>";
	detail+="<\/tr>";	
	detail+="<tr>";
	detail+="<td class=SansBlack12 bgcolor=#FFFFFF valign=top colspan=2 align=center>"
	if(this.swatch){
		var sc = 0;
		detail+="<table width=100% cellspacing=3 style='font-size:8px;'>";
		for(keys in this.swatch) {
			detail+=((sc%8)?"":'<tr>');
			detail+="<td style='padding:3;border:solid #dde 1px;' width='12.5%' align=center><img src=\"http://www.ergonetics.com/"+this.swatch[keys]+"\" height=20 width=100%><br />"+keys.toUpperCase();
			sc++;
			}
		detail+="</table>";
		}


	/*
	if(this.related){
		for(var b=0;b<this.related.length;b++) {detail+=(this.related[b])?"<div>"+this.related[b].title+"</div>":"";}
		}
	detail+="<td class=SansBlack12 bgcolor=#FFFFFF valign=top width=50%>"
	if(this.suggested){
		for(var b=0;b<this.suggested.length;b++) {detail+=(this.suggested[b])?"<div>"+this.suggested[b].title+"</div>":"";}
		}
	*/
	detail+="<\/table>";	
	return detail;
	}

//	C.2 CATALOG: PRODUCT: RETURN DETAIL
SFProduct.prototype.detail_small =function() {
	detail="<style>table.sub-table td{ border-bottom:solid #ccd 1px;padding-top:5px;padding-bottom:2px;}</style>";
	detail+="<table width=100% align=center cellpadding=5 cellspacing=5>";
	detail+="<tr>";
	detail+="<td class=SansBlack12 bgcolor=#FFFFFF valign=top width=70%>"
	detail+="<span class=SansBlack14><b>"+this.title.toUpperCase()+"<\/b> ("+this.sku+")"+"<\/span>";
	detail+="<br \/><br \/>"+this.description;
	detail+="<br \/><br \/>";
	detail+="<TABLE width=100% cellpadding=0 cellspacing=0 class='sub-table'>";
	detail+="<tr><td>SUPPLIER: <td align=right>"+this.mfg.toUpperCase();
	detail+="<tr><td>PRICE: <td align=right>"+convert_tocurrency(this.price);
	detail+="</TABLE>";
	detail+="</p>";
	detail+="<\/td>";
	detail+="<td style='vertical-align:middle;' bgcolor=#FFFFFF align=center width=30%><img src=\"http://www.ergonetics.com/images/50/"+this.image+"\" \/><\/td>";
	detail+="<\/tr>";	
	detail+="<tr>";
	detail+="<td class=SansBlack12 bgcolor=#FFFFFF valign=top colspan=2 align=center>"
	if(this.swatch){
		var sc = 0;
		detail+="<table width=100% cellspacing=3 style='font-size:8px;'>";
		for(keys in this.swatch) {
			detail+=((sc%8)?"":'<tr>');
			detail+="<td style='padding:3;border:solid #dde 1px;' width='12.5%' align=center><img src=\"http://www.ergonetics.com/"+this.swatch[keys]+"\" height=20 width=100%><br />"+keys.toUpperCase();
			sc++;
			}
		detail+="</table>";
		}
	detail+="</table>";
	return detail;
	}
//	C.2 CATALOG: PRODUCT: RETURN DETAIL
SFProduct.prototype.detail_xtnd =function() {
	detail="<style>table.sub-table td{ border-bottom:solid #ccd 1px;padding-top:5px;padding-bottom:2px;}</style>";
	detail+="<table width=100% align=center cellpadding=5 cellspacing=5>";
	detail+="<tr>";
	detail+="<td class=SansBlack12 bgcolor=#FFFFFF valign=top width=50%>"
	detail+="<span class=SansBlack14><b>"+this.title.toUpperCase()+"<\/b> ("+this.sku+")"+"<\/span>";
	detail+="<br \/><br \/>"+this.description;
	detail+="<br \/><br \/>";
	detail+="<TABLE width=100% cellpadding=0 cellspacing=0 class='sub-table'>";
	for(keys in this.options) {
		detail+="<tr><td valign=top>"+keys.toUpperCase()+"(S): <td align=right>"; 
		for(var k=0;(val=this.options[keys].split(/ ?, ?/)[k]);k++) {
			detail+=val.toUpperCase()+", ";
			}
		detail = detail.replace(/, ?$/,"");
		}


	detail+="<tr><td>SUPPLIER: <td align=right>"+this.mfg.toUpperCase();
	detail+="<tr><td>PRICE: <td align=right>"+convert_tocurrency(this.price);
	detail+="</TABLE>";
	detail+="</p>";
	detail+="<\/td>";
	detail+="<td style='vertical-align:middle;' bgcolor=#FFFFFF align=center width=50%><img src=\"http://www.ergonetics.com/images/medium/"+this.image+"\" \/><\/td>";
	detail+="<\/tr>";	
	detail+="<tr>";
	detail+="<td class=SansBlack12 bgcolor=#FFFFFF valign=top colspan=2 align=center>"
	if(this.swatch){
		var sc = 0;
		detail+="<table width=100% cellspacing=3 style='font-size:8px;'>";
		for(keys in this.swatch) {
			detail+=((sc%8)?"":'<tr>');
			detail+="<td style='padding:3;border:solid #dde 1px;' width='12.5%' align=center><img src=\"http://www.ergonetics.com/"+this.swatch[keys]+"\" height=20 width=100%><br />"+keys.toUpperCase();
			sc++;
			}
		detail+="</table>";
		}


	/*
	if(this.related){
		for(var b=0;b<this.related.length;b++) {detail+=(this.related[b])?"<div>"+this.related[b].title+"</div>":"";}
		}
	detail+="<td class=SansBlack12 bgcolor=#FFFFFF valign=top width=50%>"
	if(this.suggested){
		for(var b=0;b<this.suggested.length;b++) {detail+=(this.suggested[b])?"<div>"+this.suggested[b].title+"</div>":"";}
		}
	*/
	detail+="<\/table>";	
	return detail;
	}

SFProduct.prototype.detail2 =function() {	
	detail="<table width=90% align=center  cellpadding=0 cellspacing=0>";
	detail+="<tr>";
	detail+="<td class=SansBlack12 bgcolor=#FFFFFF valign=top>"
	detail+="<div style='float:right;padding-left:25px;padding-top:20px;padding-bottom:15px;'><img onclick=\"enlarge(this.src)\" src=\"http://www.ergonetics.com/images/medium/"+this.image+"\" \/><\/div>";
	detail+="<span class=SansBlack14><b>"+this.title.toUpperCase()+"<\/b> ("+this.sku+")"+"<\/span>";
	detail+="<p>"+this.description;
	detail+=(this['specifications']) ? " (<a href=#detail>See, product details</a>)" : "";

	if(this['help'] && this.help.length){
		detail+="<div style='margin-bottom:8px;margin-top:8px;'>";
		for(var b=0;b<this.help.length;b++) {detail+=(kbitem=this.help[b])? "<div class=kb-item>"+kbitem['title'].toUpperCase().link(kbitem['link'])+"<\/div>":"";}
		detail+="<\/div>";
		}
	detail+="<tr>";
	detail+="<td class=SansBlack12 bgcolor=#FFFFFF valign=top colspan=2 align=center>"
	detail+="<TABLE width=100% cellpadding=0 cellspacing=0 class='sub-table'>";
	detail+="<tr><td>SUPPLIER: <td align=right><a href='?category="+this.category+"&supplier="+this.mfg+"'>"+this.mfg.toUpperCase()+"</a>";
	detail+="<tr><td>CATEGORY: <td align=right><a href='?category="+this.category+"'>"+this.category.toUpperCase()+"</a>";
	detail+="<tr><td>PRICE: <td align=right>"+convert_tocurrency(this.price);
	detail+="</TABLE>";
	detail+="</p>";
	detail+="<\/td>";
	detail+="<\/tr>";	
	detail+="<tr>";
	detail+="<td class=SansBlack12 bgcolor=#FFFFFF valign=top colspan=2 align=center>"
	if(this.swatch){
		var sc = 0;
		detail+="<table width=100% cellspacing=3 style='font-size:8px;'>";
		for(keys in this.swatch) {
			detail+=((sc%8)?"":'<tr>');
			detail+="<td style='padding:3;border:solid #dde 1px;' width='12.5%' align=center><img src=\"http://www.ergonetics.com/"+this.swatch[keys]+"\" height=20 width=100%><br />"+keys.toUpperCase();
			sc++;
			}

		detail+="</table>";
		}


	detail+="<tr><td><br /><br />"+this.orderbar();


	detail+="<tr><td><table width=100% class=small-summaries><tr>";
	if(this['related'] && this.related.length){
		detail+="<td width=50% class=SansBlack11 valign=top><br/><div class=q_label><b>RELATED PRODUCTS/SERVICES</b></div><br/>";
		for(var b=0;b<this.related.length;b++) {detail+=(this.related[b])?this.related[b].quick():"";}
		}
	detail+="<td width=50% class=SansBlack12 valign=top>";
	if(this.suggested){

		detail+="<br/><div class=q_label><b>SUGGESTED ACCESSORIES/SERVICES</b></div><br/>";
		for(var b=0;b<this.suggested.length;b++) {detail+=(this.suggested[b])?this.suggested[b].quick():"";}
		}
	detail+="<\/table>";	


	if(specs = this['specifications']) {
		detail+="<a name=detail></a><div class=q_label align=center><b>PRODUCT DETAILS</b></div><br/>";
		detail+="<ul class=specifications>";
		for(keys in specs) {
			if(keys!='guid' && specs[keys]) detail+="<p><li>"+specs[keys];
			}
		detail+="</ul>";
		}


	if(this['longdescription']){
//		detail+="<tr><td class=SansBlack12><br /><br /><b>DETAILS & SPECIFICATIONS</b><br/>";
//		detail+=SFHtmlentitydecode(this['longdescription']);
		}

	detail+="<\/table>";	
	return detail;
	}


SFProduct.prototype.orderbar =function() {
	var form = "<div class='order-bar'>";
		form+= "<form id=\""+this.guid+"\" name=\""+this.guid+"\">";
		form+= "<b>PRICE</b>: <input name=\"price\" value='"+this.price+"' size='7' />";
		form+= "&nbsp; ";
		form+= "<b>QTY</b>: <input name=\"qty\" value='1' size=3 onchange=\"quick_calc(this.form)\" />";
		form+= "&nbsp; ";
		form+= "<b>SUB</b>: <input name=\"sub\" value='"+this.price+"' size=7 />";
		form+= "&nbsp; ";
		form+= "&nbsp; ";
		form+= "<button style=''>Add to Cart+</button>";		
		form+= "</form>";
		form+= "</div>";
	return form;
	}

//	C.2 CATALOG: PRODUCT: RETURN DETAIL
SFProduct.prototype.form =function() {
	var vals = "";
	var poptions = "";
	var pform ="<table width=100% align=center cellpadding=5 cellspacing=1><form name=product>";
	pform+="<tr><th>SKU<td><input name=\"sku\" value=\""+this.sku+"\"/>"
	pform+="<tr><th>TITLE<td><input name=\"title\" value=\""+this.title+"\"/>"
	pform+="<tr><th>DESCRIPTION<td><textarea name=\"description\">"+this.description+"</textarea>"
	pform+="<tr><th>CATEGORY<td><input name=\"category\" value=\""+this.category+"\"/>"
	pform+="<tr><th>PRICE<td><input name=\"price\" value=\""+this.price+"\"/>"
	pform+="<tr><th>SUPPLIER<td><input name=\"mfg\" value=\""+this.mfg+"\"/>"
	pform+="<tr><th>IMAGE <td align=center><table width=100%><tr>";
	pform+="<td align=center width=*><input name=\"ximage\" value=\""+this.image+"\"/>"
	pform+="<td width=30 style=width:30px;><input style=width:30px; type=button value=\" ^ \"/>";
	pform+="<td width=30 style=width:30px;><input style=width:30px; type=button value=\"...\"/>";
	pform+="<\/table>";
	pform+="<tr><th>OPTIONS<td><table width=100%><tr>";
	pform+="<td width=50%><select name=options>";

	for(k in this.options) {
		vals = ((vals=="")? this.options[k]:vals);
		poptions+="<option value=\""+this.options[k]+"\">"+k;
		}
	pform+=(poptions!="")?poptions:"<option>N/A";
	pform+="<option>ADD OPTION";
	pform+="</select>";
	pform+="<td width=50%><select name=values>";
	vals=vals.split(",");
	if(vals.length>0) {
		for(vp=0;vp<vals.length;vp++) pform+="<option value=\""+vals[vp]+"\">"+vals[vp];
		} else {
		pform+="<option>N/A";
		}
	pform+="</select>";
	pform+="<td width=50%>";
	pform+="<\/table>";	
	pform+="<\/td><\/tr>";	
	pform+="<\/form>";	
	pform+="<\/table>";	
	return pform;
	}

SFProduct.prototype.tr =function() {
	var xtr = "<tr class=toc id=\"tr_"+this.guid+"\" onclick=\"dosub('"+this.guid+"',this)\" ondblclick=\"dosub2('"+this.guid+"')\">";
		xtr+= "<td class=guid>" + this.guid.replace(/_/g,"-");
		xtr+= "<td class=title>" + this.title.toUpperCase();
		xtr+= "<td class=supplier>" + this.mfg.toUpperCase();
		xtr+= "<td class=category>" + this.category.toUpperCase();
		xtr+= "<td class=price align=right>" + SFCurrency(this.price);
	return xtr;
	}

SFProduct.prototype.tr_short =function() {
	var xtr = "<tr class=toc id=\"tr_"+this.guid+"\" onclick=\"dosub('"+this.guid+"',this)\" ondblclick=\"dosub2('"+this.guid+"')\">";
		xtr+= "<td class=guid>" + this.guid.replace(/_/g,"-");
		xtr+= "<td class=title>" + this.title.toUpperCase();
		xtr+= "<td class=supplier>" + this.mfg.toUpperCase();
		xtr+= "<td class=price align=right>" + SFCurrency(this.price);
	return xtr;
	}



SFProduct.prototype.tr_form =function() {
	var xtr = "<tr class=toc id=\"tr_"+this.guid+"\" onclick=\"parent.toggle_class_select(this)\">";
//		xtr+= "<td class=checkbox><input type=checkbox name=\""+this.guid+"\"" + this.guid.replace(/_/g,"-");
		xtr+= "<td class=guid>" + this.guid.replace(/_/g,"-");
		xtr+= "<td class=title>" + this.title.toUpperCase();
		xtr+= "<td class=supplier>" + this.mfg.toUpperCase();
		xtr+= "<td class=category>" + this.category.toUpperCase();
		xtr+= "<td class=price align=right>" + SFCurrency(this.price);
	return xtr;
	}

SFProduct.prototype.edit =function() {
//	xcss="<style>input,textarea,select{border-width:1px;font-family:'Lucida Grande','Trebuchet MS',sans-serif;font-size:11px;width:100%;}th{text-align:left;font-weight:normal;width:70px;vertical-align:top;padding-top:8px;}</style>";
//	SFWindow(xcss+this.form(),550,450);
	SFPopurl('edit.php?guid='+this.guid,550,400);
	}

SFProduct.prototype.remove = function(f) {
	f.elements['guid'].value = this.guid;
	f.elements['ACTION'].value = "delete";
//	alert(f.elements['guid'].value)
	f.submit();
	}

//	C.2 CATALOG: PRODUCT: RETURN DETAIL
SFProduct.prototype.detail_mini =function() {
	var args = SFProduct.prototype.detail_mini.arguments;
	var x_description = this.description.split('.');
	detail="";
	detail+="<div class=mini-detail>";
	detail+="<div class=image align=center><a href='?item="+this.guid+"' title='Item Details'>";
	detail+="<img src=\"images/medium/"+this.image+"\" "+((this['thumbnail'])? "height="+(getthumbratio(this['thumbnail'])['height']/2):"height='45'")+" border='0'/>";
	detail+="</a><\/div>";
	detail+="<div class=description>";
	detail+="<a href='?item="+this.guid+"'>"+this.title.toUpperCase()+"<\/a>: ";
	detail+=x_description[0]+"</div>";
	detail+="<div class='sub-table'>";
	detail+="<TABLE width=100% cellpadding=0 cellspacing=0 class='sub-table'>";
	detail+="<tr><td valign=top>CATEGORY: <td align=right><a href=\"?category="+this.category.toUpperCase()+"\">"+this.category.toUpperCase()+"</a>";
	detail+="<tr><td>SUPPLIER: <td align=right><a href=\"?supplier="+this.mfg.toUpperCase()+"\">"+this.mfg.toUpperCase()+"</a>";
	detail+="<tr><td>PRICE: <td align=right>"+convert_tocurrency(this.price);
	detail+="</TABLE>";
	detail+="</div>";
	detail+="</div>";
	return detail;
	}


SFProduct.prototype.select_option = function () {
	return "<option value=\""+this.guid+"\">"+this.mfg.toUpperCase()+":  "+this.title.toUpperCase();
	}

SFProduct.prototype.formoptions = function(f) {
	var ocount=0;
	var pcount=0;
	var vals = "";
	for(k in this.options) { ocount++;}
	f.options.length=ocount;
	for(k in this.options) {
		vals = ((vals=="")? this.options[k]:vals);
		f.options.options[pcount].value = this.options[k];
		f.options.options[pcount].text =k;	
		pcount++;
		}
	avals=vals.split(',');
	f.values.length=0;
	f.values.length=avals.length;
	for(var v=0;(xval=avals[v]);v++) {
		f.values.options[v].text=xval;
		f.values.options[v].value=xval;
		}

	}

SFProduct.prototype.formshow = function(f) {
	f.guid.value=this.guid;
	f.sku.value=this.sku;
	f.title.value=this.title;
	f.description.value=SFHtmldecode(this.description);
	f.category.selectedIndex = getIndex(f.category,this.category);
	f.price.value=this.price;
	f.supplier.selectedIndex = getIndex(f.supplier,this.mfg);
	f.image.value=this.image;
	this.formoptions(f);
	}


SFProduct.prototype.formsave = function(f) {
	this.guid = f.sku.value.replace(/-/g,"_");
	this.sku = f.sku.value;
	this.title = f.title.value;
	this.description = SFHtmlencode(f.description.value);
	this.category = f.category.value;
	this.price = f.price.value;
	this.supplier = f.supplier.value;
	this.image = f.image.value;
	this.formoptions(f);
	}

SFProduct.prototype.xml = function() {
	var x_xml= "<item";
	x_xml+=((this.guid)?" guid=\""+this.guid+"\"":"");
//	x_xml+=((this.sku)?" sku=\""+this.sku+"\"":"");
	x_xml+=((this.title)?" title=\""+this.title+"\"":"");
	x_xml+=((this.description)?" description=\""+this.description+"\"":"");
	x_xml+=((this.category)?" category=\""+this.category+"\"":"");
	x_xml+=((this.price)?" price=\""+this.price+"\"":"");
	x_xml+=((this.mfg)?" supplier=\""+this.mfg+"\"":"");
	x_xml+=((this.image)?" image=\""+this.image+"\"":"");
	x_xml+="/>";
	return x_xml;
	}
SFProduct.prototype.tdc = function() {
	var x_tdc= "";
		x_tdc+=this['guid']+"\t";
		x_tdc+=this['title']+"\t";
		x_tdc+=this['description']+"\t";
		x_tdc+=this['category']+"\t";
		x_tdc+=this['mfg']+"\t";
		x_tdc+=this['price']+"\t";
		x_tdc+=this['image'];
	return x_tdc;
	}

SFProduct.prototype.csv = function() {
	var x_csv= "";
		x_csv+=this['guid']+"\",\"";
		x_csv+=this['title']+"\",\"";
		x_csv+=this['description']+"\",\"";
		x_csv+=this['category']+"\",\"";
		x_csv+=this['mfg']+"\",\"";
		x_csv+=this['price']+"\",\"";
		x_csv+=this['image'];
	return x_csv;
	}


SFProduct.prototype.popup =function() {
	SFWindow(this.detail(),650,330);
	}

SFProduct.prototype.pshow = function(f) {
	var ocount = 1;
	f.ptitle.value = SFHtmldecode(this.title);
	f.pguid.value = this.guid;
	f.pprice.value = this.price;
	f.pqty.selectedIndex = 0;
	f.psubtotal.value = convert_tocurrency(this.price);
	f.options_1.length=1;
	f.options_1.style.display='none';
	f.options_1.options[0].value = "";
	f.options_1.options[0].text = "N/A";
	f.options_2.length=1;			
	f.options_2.style.display='none';
	f.options_2.options[0].value = "";
	f.options_2.options[0].text = "N/A";
	for(keys in  this.options) {
		var vals =this.options[keys].split(',');
		var s = f.elements['options_'+ocount];
		s.style.display='block';
		s.length = vals.length;
		for(v=0;v<vals.length;v++) {
			s.options[v].value = keys+":"+vals[v];
			s.options[v].text = (keys+": "+vals[v]).toUpperCase();
			}		
		ocount++;
		}
	}



/* ------------------------------------------------------------------ *\
	OBJECT:     CART
\* ------------------------------------------------------------------ */

// CART
function Cart(products) {
	this.items = new Array();
	this.service_ids = {'E-SVC-INSTALL-S':1,'E-SVC-INSTALL-A':1,'E-SVC-ASSESS':2};
	this.products = products;
	this.guids = new Object();
	for(var p = 0; (product=this.products[p]); p++) this.guids[product.guid] = product;
	if(sxml = Get_Cookie('cart')) {
		xmlItems = parseitems(sxml);
		for(p=0;p<xmlItems.length;p++) {
			//if(this.products[xmlItems[p].guid]) this.items[this.items.length] = new CItem(xmlItems[p].guid,xmlItems[p].title,xmlItems[p].qty,this.products[xmlItems[p].guid].price,((xmlItems[p]['option'])?xmlItems[p]['option'].split(','):""));
			this.items[this.items.length] = new CItem(xmlItems[p].guid,xmlItems[p].title,xmlItems[p].qty,xmlItems[p].price,((xmlItems[p]['option'])?xmlItems[p]['option'].split(','):""));
			}
		}
	}

// CART: ADD ITEM
Cart.prototype.add_item = function(guid,qty,price,options) {
	var title = this.products[guid].title;
	title = title.replace(/ - \d+ remaining/i,"");
	this.items[this.items.length] = new CItem(guid,title,qty,price,options);
	Set_Cookie("cart",this.xml());
	}
// CART: ADD CUSTOM ITEM
Cart.prototype.add_custom_item = function(name,qty,price) {
	var args = Cart.prototype.add_custom_item.arguments;
	var temp_guid = ((args[3])?args[3]:'CSTM-ITEM');
//	var temp_guid =source.substring(0,3).toUpperCase()+"-";
//	    temp_guid+= name.replace(/[^\w]/g,"").substring(0,10).toUpperCase();
	this.items[this.items.length] = new CItem(temp_guid,name,price,qty,"");
	Set_Cookie("cart",this.xml());
	}
// CART: RESET
Cart.prototype.reset = function(xml) {
	Set_Cookie("cart",xml);
	xmlItems = parseitems(xml);
	this.items.length=0;
	for(p=0;p<xmlItems.length;p++) {
		this.items[this.items.length] = new CItem(xmlItems[p].guid,xmlItems[p].title,xmlItems[p].qty,xmlItems[p].price,((xmlItems[p]['option'])?xmlItems[p]['option'].split(','):""));
		}

	}


// CART: SUMMARY TABLE
Cart.prototype.summary_table = function() {
	this.total();
	var table = "<table width=100% cellpadding=2 cellspacing=1 class=toc><form>";
	for(t=0;t<this.items.length;t++) table+=this.items[t].detail(this.products,t);
	table+="<tr><td colspan=6> <td align=right>---------";
	table+="<tr><td colspan=6 align=right> SUBTOTAL<td align=right>"+convert_tocurrency(this.subtotal);
	table+="<tr><td colspan=6 align=right> SHIPPING<td align=right>"+convert_tocurrency(this.shipping);
	table+= "</table>";
	return table;
	}

// CART: MINI TABLE
Cart.prototype.mini = function() {
	this.total();
	var mtable = "<table width=100% cellpadding=2 cellspacing=1 class=mini style='font-size:9px;'>";
	mtable+="<tr><td align=center colspan=5><big>SHOPPING CART</big>";
	for(a=0;a<this.items.length;a++) mtable+=this.items[a].mdetail(this.products,a);
	mtable+="<tr><td colspan=4> <td align=right>-------";
	mtable+="<tr><td colspan=4 align=right> SUBTOTAL<td align=right>"+convert_tocurrency(this.subtotal);
	mtable+="<tr><td colspan=4 align=right> SHIPPING<td align=right>"+convert_tocurrency(this.shipping);
	mtable+= "</table>";
	return mtable;
	}

// CART: ALERT ACTION
Cart.prototype.alert_action = function(action,guid) {
	var actions = {'add': 'ADDED TO ORDER'};
	this.total();
	var astr = this.products[guid].title + "\n" + actions[action];
	astr+="\nITEMS: "+this.items.length;
	astr+="\nSUBTOTAL: "+convert_tocurrency(this.subtotal);
	alert(astr);
	}


// CART: SUBMIT
Cart.prototype.submit = function(f) {
	this.total();
	f.subtotal.value=convert_tocurrency(this.subtotal);
	f.shipping.value=convert_tocurrency(this.shipping);
	f.tax.value=convert_tocurrency(this.tax);
	f.xml.value = escape(this.xml());
//	SFWindow(this.xml().replace(/</g,"&lt;"));
	f.submit();
	}
Cart.prototype.xml = function() {
	var xml = "";
	for(z=0;z<this.items.length;z++) {xml+=this.items[z].xml();}
	return xml;
	}

// CART: TOTAL
Cart.prototype.total = function() {
	var subtotal = 0;
	var shippable = 0;
	var install = 0;
	var shipping = 0;
	var tax = 0;
	for(w=0;w<this.items.length;w++) {
		subtotal+=parseFloat(this.items[w].subtotal);
		shippable += (this.service_ids[this.items[w].guid]) ? 0 : parseFloat(this.items[w].subtotal);
		install +=(this.service_ids[this.items[w].guid]==1)? 1 : 0;
		}
	this.tax = 0;
	this.subtotal = subtotal;
	this.shipping = ((install>0)? 0 : return_sh(shippable));
	}

// CART: CITEM OBJECT
function CItem(guid,title,qty,price,options) {
	var args = CItem.arguments;
	this.guid = guid;
	this.title = title;
	this.qty = qty;
	this.price = price;
	this.subtotal = convert_tocurrency(price * qty);
	this.options = options;	
	this.option = options;	
	}
// CART: CITEM
CItem.prototype.detail = function() {
	var opts = "";
	for(k=0;k<this.options.length;k++) opts+= this.options[k]+" ";
	trow ="<tr><td width=25 align=center><input type=checkbox value=\""+escape(this.xml())+"\" onclick=''>";
	trow+="<td class=title><a href=\"#\" onclick=\"dosub('"+this.guid+"')\" style='color:#007;'>"+this.title.toUpperCase()+"</a>";
	trow+="<td class=guid>"+this.guid.replace(/_/g,"-");
	trow+="<td class=options>"+((this.options!="")?this.options : "N/A");
	trow+="<td class=price>"+this.price;
	trow+="<td class=qty>"+this.qty;
	trow+="<td class=subtotal align=right>"+this.subtotal;
	return trow;
	}
// CART: CITEM
CItem.prototype.mdetail = function() {
	var opts = "";
	for(k=0;k<this.options.length;k++) opts+= this.options[k]+" ";
	mrow="<tr>";
	mrow+="<td>"+this.title.toUpperCase();
	mrow+="<td> "+((opts != "") ? opts : "N/A");
	mrow+="<td align=right>"+this.price;
	mrow+="<td align=right>"+this.qty;
	mrow+="<td align=right>"+this.subtotal;
	return mrow;
	}
// CART: CITEM
CItem.prototype.xml = function() {
	var opts = "";
	x_xml ="<item guid=\""+this.guid+"\"";
	x_xml+=" title=\""+this.title+"\"";
	x_xml+=" price=\""+this.price+"\"";
	x_xml+=" qty=\""+this.qty+"\"";
	for(k=0;k<this.options.length;k++) { x_xml+= " option=\""+this.options[k]+"\"";}
	x_xml+="/>";
	return x_xml;
	}


// CART: CITEM OBJECT
function CItemXtd(guid,title,qty,price) {
	var args = CItem.arguments;
	this.products = products;
	this.guid = guid;
	this.qty = qty;
	this.price = price;
	this.subtotal = convert_tocurrency(price * qty);
	}
// CART: CITEM
CItemXtd.prototype.xml = function() {
	var opts = "";
	x_xml ="<item guid=\""+this.guid+"\"";
	x_xml+=" title=\""+this.qty+"\"";
	x_xml+=" price=\""+this.price+"\"";
	x_xml+=" qty=\""+this.qty+"\"";
	for(k=0;k<this.options.length;k++) { x_xml+= " option=\""+this.options[k]+"\"";}
	x_xml+="/>";
	return x_xml;
	}


/* ------------------------------------------------------------------ *\
	OBJECT:     ORDER
\* ------------------------------------------------------------------ */

// ORDER: CONSTRUCTOR
function Order(cart) {
	this.address = new Object();
	this.cart = cart;
	this.address['billing'] = new Address(new Object());
	this.address['shipping'] = new Address(new Object());
	}

// ORDER: GET ADDRESS
Order.prototype.getaddress = function(f,key) {
	this.address[key].formsave(f,key);
	}
// ORDER: GET ADDRESS
Order.prototype.getadmin = function(f,f2) {
	var xadmin = new Object();
	xadmin['email']=f.administrator.value;
//	name_array=f.administrator.options[f.administrator.selectedIndex].text.split(' ');
	xadmin['first_name']=f.billing_first_name.value;
	xadmin['last_name']=f.billing_last_name.value;
	xadmin['organization']=f.billing_organization.value;
	f2.elements['billing_first_name'].value =xadmin['first_name'];
	f2.elements['billing_last_name'].value =xadmin['last_name'];
	f2.elements['billing_email'].value =xadmin['email'];
	f2.elements['billing_organization'].value =xadmin['organization'];
	}

Order.prototype.geterrors = function(f) {
	var errors = "";
	this.getaddress(f,'billing');
	errors+=((this.address['billing'].first_name!="")?"" : "Please include a First Name\n");
	errors+=((this.address['billing'].last_name!="")?"" : "Please include a Last Name\n");	
	errors+=((this.address['billing'].city!="")?"" : "Please include a City\n");	
	errors+=((this.address['billing'].state!="")?"" : "Please select a State\n");	
	errors+=((this.address['billing'].zip!="")?"" : "Please include a Zip Code\n");	
	errors+=((this.address['billing'].email!="")?"" : "Please include a Valid Email Address\n");	
	return errors;
	}


/* ------------------------------------------------------------------ *\
	ADDRESS
\* ------------------------------------------------------------------ */
	
// ADDRESS: CONSTRUCTOR
function Address(params) {
	this.first_name=((params['first_name'])?params['first_name']:"");
	this.last_name=((params['last_name'])?params['last_name']:"");
	this.organization=((params['organization'])?params['organization']:"");
	this.address = ((params['address'])?params['address']:new Array());
	this.city=((params['city'])?params['city']:"");
	this.state=((params['state'])?params['state']:"");
	this.zip=((params['zip'])?params['zip']:"");
	this.phone=((params['phone'])?params['phone']:"");
	this.email=((params['email'])?params['email']:"");
	}
// ADDRESS: 
Address.prototype.formsave = function(f) {
	var args = Address.prototype.formsave.arguments;
	var prefix =((args[1])? args[1]+'_' : "");
	this.first_name=((f.elements[prefix+'first_name'])?f.elements[prefix+'first_name'].value:"");
	this.last_name=((f.elements[prefix+'last_name'])?f.elements[prefix+'last_name'].value:"");
	this.organization=((f.elements[prefix+'organization'])?f.elements[prefix+'organization'].value:"");
	for(var a=1;(seg = f.elements[prefix+'address'+a]);a++) this.address[this.address.length] = f.elements[prefix+'address'+a].value;
	this.city=((f.elements[prefix+'city'])?f.elements[prefix+'city'].value:"");
	this.state=((f.elements[prefix+'state'])?f.elements[prefix+'state'].value:"");
	this.zip=((f.elements[prefix+'zip'])?f.elements[prefix+'zip'].value:"");
	this.phone=((f.elements[prefix+'phone'])?f.elements[prefix+'phone'].value:"");
	this.email=((f.elements[prefix+'email'])?f.elements[prefix+'email'].value:"");
	}
// ADDRESS: 
Address.prototype.makepostable = function(f) {
	var args = Address.prototype.makepostable.arguments;
	var prefix =((args[1])? args[1]+'_' : "");
	if(f.elements[prefix+'first_name']) f.elements[prefix+'first_name'].value = this.first_name;
	if(f.elements[prefix+'last_name']) f.elements[prefix+'last_name'].value = this.last_name;
	if(f.elements[prefix+'organization']) f.elements[prefix+'organization'].value = this.organization;
	if(f.elements[prefix+'city']) f.elements[prefix+'city'].value = this.city;
	if(f.elements[prefix+'state']) f.elements[prefix+'state'].value = this.state;
	if(f.elements[prefix+'zip']) f.elements[prefix+'zip'].value = this.zip;
	if(f.elements[prefix+'address']) {
		for(var e=0;e<this.address.length;e++) f.elements[prefix+'address'].value += this.address[e] + " ";
		f.elements[prefix+'address'].value=f.elements[prefix+'address'].value.replace(/ +$/,"");
		}
	for(var a=1;(seg = f.elements[prefix+'address'+a]);a++) seg.value = ((this.address[a-1])?this.address[a-1]:"");
	if(f.elements[prefix+'phone']) f.elements[prefix+'phone'].value = this.phone;
	if(f.elements[prefix+'email']) f.elements[prefix+'email'].value = this.email;
	}



/* ------------------------------------------------------------------ *\
	JOURNAL
\* ------------------------------------------------------------------ */

function Journal(transactions) {
	var args = Journal.arguments;
	this.service_ids = {'E-SVC-INSTALL-S':1,'E-SVC-INSTALL-A':1,'E-SVC-ASSESS':2};
	this.transactions = transactions;	
	if(new Date(transactions[0].date).getTime()< new Date(transactions[transactions.length-1].date).getTime()) {
		this.transactions=this.transactions.reverse();
//		alert('reversed');
		}
	this.customers= new Object;
	this.customers_count = 0;
	this.forms = new Object;
	this.frames = new Object;
	this.guids = new Object;
	this.indices = new Object;
	this.selected = (this.transactions[0])?this.transactions[0].guid:"";
	this.active_range = new Array()
	this.products = ((args[1])? args[1] : new Object());
	this.guid = ((args[2])?args[2]: "");
	for(var k=0;(t=this.transactions[k]);k++) {
		if(t['guid']) {
		this.guids[t.guid]=this.transactions[k];
		this.indices[t.guid]=k;
		if(t['address']['billing']['last_name']) var keystr = t['address']['billing']['last_name'].toUpperCase()+", "+t['address']['billing']['first_name'].toUpperCase();
		this.customers_count +=((this.customers[keystr])? 0 : 1);
		this.customers[keystr] = ((this.customers[keystr])? this.customers[keystr]+1 : 1);
		this.transactions[k].products = this.products;
		}}
	
	}
Journal.prototype.remove_transaction = function (guid) {
	var new_transactions = new Array;
	for(var k=0;(t=this.transactions[k]);k++) {
		if( t.guid != guid) new_transactions[new_transactions.length] = t;
		}
	this.reset_transactions(new_transactions);
	}
Journal.prototype.reset_transactions = function (transactions) {	
	this.transactions = transactions;
	this.customers= new Object;
	this.customers_count = 0;
	this.guids = new Object;
	this.indices = new Object;

	for(var k=0;(t=this.transactions[k]);k++) {
		this.guids[t.guid]=this.transactions[k];
		this.indices[t.guid]=k;
		if(t['address']['billing']['last_name']) var keystr = t['address']['billing']['last_name'].toUpperCase()+", "+t['address']['billing']['first_name'].toUpperCase();
		this.customers_count +=((this.customers[keystr])? 0 : 1);
		this.customers[keystr] = ((this.customers[keystr])? this.customers[keystr]+1 : 1);
		this.transactions[k].products = this.products;
		}
	}


Journal.prototype.admin_toc = function () {
	var atoc ="<table width=100% cellspacing=1 class=control-bar height=30><tr>";
	    atoc+="<form>";
	    atoc+="<td width=25% align=center><button type=button onclick=\"window.close()\">CLOSE/CANCEL</button>";
	    atoc+="<td width=25% align=center><button type=button onclick=\"\">DELETE SELECTED</button>";
	    atoc+="<td width=25% align=center><button type=button onclick=\"f=opener.document.forms['update'];f.action.value='save';f.guid.value=opener.XJOURNAL.get_batch_checked(this.form);f.status.value=this.form.status.value;f.submit();window.close();\">MARK SELECTED AS:</button>";
	    atoc+="<td width=25% align=center><select name=status><option value='OPENED'>OPENED<option value='CHARGED'>CHARGED<option value='BACK ORDERED'>BACK ORDERED<option value='SCHEDULING'>SCHEDULING<option value='SCHEDULED'>SCHEDULED<option value='SHIPPED' selected>SHIPPED<option value='COMPLETED' selected>COMPLETED</select>";
	    atoc+="<\/table>";
	    atoc+="<table width=100% class=grey-frame cellspacing=1>";
	for(var q = 0; (t=this.transactions[q]);q++) {
		atoc+="<tr onclick=\"opener.SFToggleCheckbox(document.forms[0].elements['"+t.guid+"'])\" class=toc><td><input type=checkbox name=\""+t.guid+"\" value=\""+t.guid+"\" style='height:11px;font-size:9px;' />"+t.tr();
		}
	atoc+="</form>";
	atoc+="<\/table>";
	return atoc;
	}

Journal.prototype.toc = function () {
	var atoc="<style>table {font-size:11px;} table.grey-frame {background:#ccc;}table.grey-frame td {background:#fff;padding:3px;}table.grey-frame th {background:#fff;padding:3px;text-align:left;}table.address-table div{padding-left:0px;} table.address-table {width:100%background:#fff;}table.address-table td {background:#fff;padding:2px;text-transform:uppercase;}<\/style>";
	var running_total = 0;
	atoc+="<p><table width=100% class=grey-frame cellspacing=1 cellpadding=3>";
	atoc+="<th>id<th>date<th>customer<th>status<th>items<th>total";
	for(var q = 0; (t=this.transactions[q]);q++) {
		atoc+="<tr class=toc><td>"+t.tr();
		running_total = parseFloat(running_total) + parseFloat(t.total);
		}
	atoc+="<tr><td colspan=7 align=right>----------<br />"+SFCurrency(running_total);
	atoc+="<\/table>";
	return atoc;
	}


Journal.prototype.all_transactions=function () {
	var args = Journal.prototype.all_transactions.arguments;
	var params = ((args[0])?args[0]:new Object());
	var x_customer = ((params['customer'])?params['customer']:"");
	var x_status = ((params['status'])?params['status']:"");
	var x_restrictions = ((params['restrictions'])?params['restrictions']:"");
	this.active_range = new Array()
	var all_transaction = new Object();
	    all_transaction['html'] = "";
	    all_transaction['first'] = "";
	var temp = (new Date(this.transactions[0].date).getTime()< new Date(this.transactions[this.transactions.length-1].date).getTime()) ? this.transactions.reverse() : this.transactions;
	for(var q = 0; (t=temp[q]);q++) {
		var c_expr = eval("/"+t.address['billing'].last_name+", "+t.address['billing'].first_name+"/i");
		if((x_status=="" || x_status==t.status) && (x_customer=="" || x_customer.match(c_expr))&& (x_restrictions=="" || t.match(x_restrictions))) {
			this.active_range[this.active_range.length] = q;
			all_transaction['first'] = ((all_transaction['first']=="") ? t.guid : all_transaction['first']);
			all_transaction['html']+="<tr class=toc id=\"tr_"+t.guid+"\" onclick=\"dosub('"+t.guid+"')\" ondblclick=\"dosub2("+q+")\">";
			all_transaction['html']+="<td width=15 align=center><a name='"+t.guid+"'><b>"+((t.status!="SHIPPED" && t.status!="COMPLETED")?"&bull;":"&nbsp;")+" </a></big>";
			all_transaction['html']+=t.tr();
			}
		}
	return all_transaction;
	}
Journal.prototype.all_services=function () {
	var args = Journal.prototype.all_services.arguments;
	this.active_range = new Array()
	var all_service = new Object();
	    all_service['html'] = "";
	    all_service['first'] = "";
	for(var q = 0; (t=this.transactions[q]);q++) {
		if(t.is_service_order()) {
			this.active_range[this.active_range.length] = q;
			all_service['first'] = ((all_service['first']=="") ? t.guid : all_service['first']);
			all_service['html']+="<tr class=toc id=\"tr_"+t.guid+"\" onclick=\"dosub('"+t.guid+"')\" ondblclick=\"dosub2("+q+")\">"+t.tr();
			}
		}
	return all_service;
	}

Journal.prototype.filter=function () {
	var args = Journal.prototype.filter.arguments;
	var params = ((args[0])?args[0]:new Object());
	var x_customer = ((params['customer'])?params['customer']:"");
	var x_status = ((params['status'])?params['status']:"");
	var x_restrictions = ((params['restrictions'])?params['restrictions']:"");
	this.active_range = new Array()
	for(var q = 0; (t=this.transactions[q]);q++) {
		var c_expr = eval("/"+t.address['billing'].last_name+", "+t.address['billing'].first_name+"/i");
		if((x_status=="" || x_status==t.status) && (x_customer=="" || x_customer.match(c_expr))&& (x_restrictions=="" || t.match(x_restrictions))) {
			this.active_range[this.active_range.length] = q;
			}
		}
	return this.active_range;
	}


Journal.prototype.pop_table = function () {
	var j_html = "";
	    j_html+=SFCss();
		j_html+="<style>table.grey-frame {background:#ccc;}table.grey-frame td {background:#fff;padding:3px;}<\/style>";
	    j_html+=this.toc();
	SFWindow(j_html,750,550);
	}

Journal.prototype.pop_system_table = function () {
	var j_html = "";
	    j_html+=SFCss('font-size:10px');
	    j_html+="<title>Batch Administration</title>";
	    j_html+="<style>";
		j_html+=ToolbarStyles.css(Get_Cookie('style'));
	    j_html+="table.control-bar {height:30px;}";
	    j_html+="table.control-bar td {vertical-align:middle;}";
	    j_html+="table.grey-frame {background:#ddd;}";
	    j_html+="table.grey-frame td {background:#fff;padding:3px;vertical-align:middle;}";
	    j_html+="tr.toc { cursor:pointer; }";
	    j_html+="body { margin:0; }";
	    j_html+="<\/style>";
	    j_html+=this.admin_toc();
	SFWindow(j_html,780,350);
	}


Journal.prototype.pop_range = function (start,end) {
	var atoc = "";
	var running_total = 0;
	    atoc+=SFCss();
	    atoc+="<style>button,select{width:100%;font-size:11px;border-width:1px;}table {font-size:11px;} table.grey-frame {background:#ddd;}table.grey-frame td {background:#fff;padding:5px;}table.address-table div{padding-left:0px;} table.address-table {width:100%background:#fff;}table.address-table td {background:#fff;padding:2px;text-transform:uppercase;}<\/style>";
	    atoc+="<p><table width=100% class=grey-frame cellspacing=1>";
	atoc+="<tr><td colspan=7 align=right><b>TRANSACTION RANGE: &nbsp; " + new Date(start).toUSText().toUpperCase() + " &nbsp; TO &nbsp; " + new Date(end).toUSText().toUpperCase() +"</b><br /><br />";
	for(var q = 0; (t=this.transactions[q]);q++) {
		if((new Date(t.date).getTime() <= start.getTime()) && (new Date(t.date).getTime() >= end.getTime())) {
			atoc+="<tr class=toc>"+t.tr();
//			atoc+=t.items_rows();
			running_total = parseFloat(running_total) + parseFloat(t.total);
			}
		}
	atoc+="<tr><td colspan=7 align=right>----------<br />"+SFCurrency(running_total);
	atoc+="<\/table>";
	SFWindow(atoc,750,550);
	}


Journal.prototype.get_range_stats = function (start,end) {
	var atoc = "";
	var running_total = 0;
	atoc+="<p><table width=100% class=grey-frame cellspacing=1>";
	atoc+="<tr><td colspan=7 align=right><b>TRANSACTION RANGE: &nbsp; " + new Date(start).toUSText().toUpperCase() + " &nbsp; TO &nbsp; " + new Date(end).toUSText().toUpperCase() +"</b><br /><br />";
	for(var q = 0; (t=this.transactions[q]);q++) {
		if((new Date(t.date).getTime() <= start.getTime()) && (new Date(t.date).getTime() >= end.getTime())) {
			atoc+="<tr class=toc>"+t.tr();
			running_total = parseFloat(running_total) + parseFloat(t.total);
			}
		}
	atoc+="<tr><td colspan=7 align=right>----------<br />"+SFCurrency(running_total);
	atoc+="<\/table>";
	return atoc;
	}

Journal.prototype.fshow = function (guid) {	
	if(this.frames['detail']) {
		this.selected = guid;
		this.active = this.guids[guid];
		this.frames['detail'].document.location.href = "order.html?guid="+guid;
		}
	this.forms['update'] = (this.forms['update'])? this.forms['update'] : document.forms['update'];
	this.forms['update'].journal.value = this.guid;
	this.forms['update'].guid.value = guid;
	
	if(x_button=document.getElementById('service-button')) {
		x_button.disabled = (this.guids[guid] && this.guids[guid].is_service_order()) ? 0 : 1;
		x_button.style.color = (x_button.disabled) ? "#AAA" : "#000";
		}

	}

Journal.prototype.init_guid_select = function(s) {
	s.length = this.transactions.length;
	for(var n=0;(o=s.options[n]);n++) {
		o.text=this.transactions[n].guid;
		o.value=this.transactions[n].guid;
		}
	}

Journal.prototype.init_customer_select = function(s) {
	var o_count = 1;
	var names = ksort(this.customers);
	s.length = names.length+1;
	s.options[0].text = "ALL CUSTOMERS";
	s.options[0].value = "";
	for(var k=0;(name=names[k]);k++) {
		var o = s.options[o_count];
		o.text=name;
//		o.text=name + " ( "+ this.customers[name] +" )";
		o.value=name;
		o_count++;
		}
	}

Journal.prototype.customerX = function(s) {
	s.length = this.customers.length;
	for(var n=0;(o=s.options[n]);n++) {
		o.text=this.customers[n];
		o.value=this.customers[n];
		}
	}

Journal.prototype.statstable = function() {
	var xstats = this.getstats();
	var stattable = "";
	stattable+="<table width=100%>";
	stattable+="<tr><td>TOTAL ORDERS <td align=right>"+this.transactions.length;
	stattable+="<tr><td>TOTAL ITEMS <td align=right>"+xstats['allitems'];
	stattable+="<tr><td>SUB TOTAL <td align=right>"+SFCurrency(xstats['subtotal']);
	stattable+="<tr><td>TOTAL SALES <td align=right>"+SFCurrency(xstats['total']);
	stattable+="</table>";
	xkeys = arsort( xstats['products'] )
	stattable+="<p><table width=100%>";
	for(l=0;l<xkeys.length;l++) {
		stattable+="<tr><td>("+xkeys[l].replace(/_/g,"-")+") "+((xstats['ptitles'][xkeys[l]])?xstats['ptitles'][xkeys[l]]:'DISCONTINUED SKU')+"<td align=right>"+xstats['products'][xkeys[l]];
		}
	stattable+="</table>";
	return stattable;
	}

Journal.prototype.popstats = function() {
	var xstats = this.getstats();
	statwin =SFCss();
	statwin+=this.statstable();
	SFWindow(statwin,450,250);
	}

Journal.prototype.popservice = function() {
	var tickets = "";
	for(var q = 0; (t=this.transactions[q]);q++) {
		if(x_service = t.is_service_order()) {
			tickets+="<ticket";
			tickets+=" guid=\""+t.guid+"\"";
			tickets+=" date=\""+t.date+"\"";
			tickets+=" appointment=\""+t.date+"\"";
			tickets+=" type=\""+x_service+"\"";
			tickets+=" note=\"N/A\"";
			tickets+=" status=\"COMPLETE\"";
			tickets+="/>\n";
			}
		}
		
	SFWindowText(tickets);
	}

Journal.prototype.getstats = function() {
	var stats = new Object();
		stats['products'] = new Object();
		stats['ptitles'] = new Object();
		stats['dates'] = new Object();
		stats['allitems'] = 0;
		stats['subtotal'] = 0;
		stats['total'] = 0;
	for(var q = 0; (t=this.transactions[q]);q++) {		
		stats['subtotal'] += parseFloat(t.subtotal);
		stats['total'] += parseFloat(t.total);
		for(var w = 0; (e=t.item[w]); w++) {
			e.guid = e.guid.replace(/_/g,"-").toUpperCase();
			stats['products'][e.guid] = stats['products'][e.guid] ? parseInt(stats['products'][e.guid]) : 0;
			stats['products'][e.guid] = parseInt(stats['products'][e.guid]) + parseInt(e.qty);
			stats['ptitles'][e.guid] = this.guids[e.guid]?this.guids[e.guid].title.toUpperCase() :  e.title.toUpperCase();
			stats['allitems']+=parseInt(e.qty);
			
			}
		stats['ptitles']['CSTM-ITEM'] = 'CUSTOM ITEM';
		}
	return stats;
	}

Journal.prototype.getstati = function() {
	var stati = new Object();
		stati['OPENED'] = 0;
		stati['SHIPPED'] = 0;
		stati['SCHEDULED'] = 0;
		stati['COMPLETED'] = 0;
		stati['BACK ORDERED'] = 0;
		stati['ALL'] = 0;
		stati['SERVICES'] = 0;
	for(var q = 0; (t=this.transactions[q]);q++) {		
		stati[t.status]++;
		stati['ALL']++;
		if(t.is_service_order()) stati['SERVICES']++;
		}
	return stati;
	}

Journal.prototype.getdates = function() {
	var dates = new Object();
	for(var q = 0; (t=this.transactions[q]);q++) {	
		dates[new Date(t.date).getTime()] = t.date;
		}	
	return dates;
	}

Journal.prototype.init_range_select = function(s) {
	var dates = this.getdates();
	date_keys = krsort(dates);
	s.length=date_keys.length;
	for(var d=0; d < date_keys.length; d++) {
		s.options[d].value = dates[date_keys[d]];
		s.options[d].text = dates[date_keys[d]];
		}	
	return dates;
	}

Journal.prototype.get_batch_checked = function(f) {
	var gstring = "";
	for(var e=0; element=f.elements[e];e++) {
		if(element.checked) gstring+=element.value+",";
		}
	gstring=gstring.replace(/,$/,"");
	return gstring;
	}

/* ------------------------------------------------------------------ *\
	TRANSACTION
\* ------------------------------------------------------------------ */

function Transaction(params) {
	this.service_ids = {'E-SVC-INSTALL-S':'S','E-SVC-INSTALL-S-CAPIN':'S','E-SVC-INSTALL-A':'A','E-SVC-ASSESS':'N'};
	this.stati = ['OPENED','SHIPPED','SCHEDULING','SCHEDULED','BACK ORDERED','COMPLETED'];
	this.address = new Object();
	this.products = new Object();
	for(keys in params) this[keys]=params[keys];
	}

Transaction.prototype.items_rows = function () {
	var row = "";
	for(i in this['item']) {
		row+="<tr><td>"+this['guid'];
		for(keys in this.item[i]) {
			row+="<td>"+this.item[i][keys];
			}
		}
	return row;
	}

Transaction.prototype.tr = function() {
	var x_customer = (this['address']['shipping']['last_name'].toUpperCase()+", "+this['address']['shipping']['first_name'].toUpperCase()).replace(/^,? ?(.+) ?,?$/,"$1");
	var tr = "";
	    tr+= "<td width=100><a name='"+this['guid']+"'>"+this['guid']+"<\/a><\/td>";
	    tr+= "<td width=120>"+new Date(this['date']).sql_date()+"<\/td>";
	    tr+= "<td>"+x_customer+"<\/td>";
	    tr+= "<td width=60>"+((this['status'])?this['status']:"&nbsp;")+"<\/td>";
	    tr+= "<td width=40 align=center>"+((key=this.is_service_order())? this.service_ids[key] : "&nbsp;")+"<\/td>";
	    tr+= "<td width=60>"+this['item'].length+" ITEMS<\/td>";
	    tr+= "<td width=80 align=right>"+this['total']+"<\/td>";
	return tr;    
	}
Transaction.prototype.match = function(r) {
	var m = 0;
	r = eval("/"+r+"/i");
	m+=((this.guid.match(r))?1:0);
	m+=((this.address['billing'].first_name.match(r))?1:0);
	m+=((this.address['billing'].last_name.match(r))?1:0);
	m+=((this.address['shipping'].first_name.match(r))?1:0);
	m+=((this.address['shipping'].last_name.match(r))?1:0);

	return m;    
	}
Transaction.prototype.pop = function() {
	var y_html="";
		y_html+="<title>Transaction Detail</title>";
		y_html+=SFCss();		
	    y_html+="<style>body{margin-left:20px;margin-right:20px;}table {font-size:11px;} table.grey-frame {background:#ccc;}table.grey-frame td {background:#fff;padding:3px;}table.address-table {width:100%background:#fff;}table.address-table td {background:#fff;padding:2px;text-transform:uppercase;}a {color:#000;}<\/style>";
	    y_html+="<div align=center style='font-size:32px;font-variant:small-caps;letter-spacing:1px;font-family:serif;'>Ergonetics.com<\/div>";
	    y_html+="<div align=center style='text-transform:uppercase;'>Suite 400 &middot; 1320 Fenwick Lane<br />Silver Spring, MD 20910<br />Telephone: 1-301-495-9399</div>";
	    y_html+="<p>";
	    y_html+=this.detail2();
	SFWindowChrome(y_html,750,550);
	}

Transaction.prototype.edit = function() {
	var y_html="";
		y_html+="<title>Edit Transaction</title>";
		y_html+= this.css();
	    y_html+="<style>";
		y_html+=ToolbarStyles.css(Get_Cookie('style'));
	    y_html+="table.control-bar {height:30px;}";
	    y_html+="table.control-bar td {vertical-align:middle;}";
	    y_html+="body { margin:0; }";
	    y_html+="</style>";
	    y_html+=this.form();
	SFWindowRaw(y_html,750,550);
	}

Transaction.prototype.css = function() {
	var t_css = "<style>td.label{width:100px;}";
		t_css+= "body,table,select,input,textarea,button{font-family:Arial,sans-serif;font-size:10px;}";
		t_css+= "select,input{border-width:1px;width:100%;}";
		t_css+= "td{vertical-align:top;padding:2px;}";
		t_css+= "td.label{width:90px;font-weight:normal;}";
		t_css+= "select{border-width:1px;}";
		t_css+= "textarea{border-width:1px;}";
		t_css+= "table.date-control{width:180px;}";
		t_css+= "table.date-control td {padding:0px;}";
		t_css+= "table.date-control select {width:98%;}";
		t_css+= "table.address-table {width:100%background:#fff;}";
		t_css+= "table.address-table td {background:#fff;padding:2px;text-transform:uppercase;}";
		t_css+= "li{list-style-type:none;padding-bottom:1px;}";
		t_css+= "button{width:100%;border-width:1px;}";
		t_css+= "input.num{text-align:right;}";
		t_css+= "input.autonum{text-align:right;color:#666;}";
		t_css+= "table.grey-frame {background:#ccc;}";
		t_css+= "table.grey-frame td {background:#fff;padding:3px;}";
		t_css+= "</style>";
	return t_css;
	}


Transaction.prototype.pop_edit = function() {
	var y_html = ""
	    y_html+="<style>input.num{font-size:11px;border-width:1px;width:100%;text-align:right;}table {font-size:11px;} table.grey-frame {background:#ddd;}table.grey-frame td {background:#fff;padding:3px;}table.address-table {width:100%background:#fff;}table.address-table td {background:#fff;padding:2px;text-transform:uppercase;}<\/style>";
	    y_html+="<div align=center style='font-size:32px;font-variant:small-caps;letter-spacing:1px;font-family:serif;'>Ergonetics.com<\/div>";
	    y_html+=this.items_form();
	SFWindowChrome(y_html,750,550);
	}


Transaction.prototype.item_tr = function(i) {
	var itr = "";
	    itr+= "<td width=100>"+i['guid'].replace(/_/g,"-")+"<\/a><\/td>";
	    itr+= "<td width=*>";
	    itr+= ((p = this.products[i['guid']])? "<a href=\"#\" onclick=\"parent.pop_item('"+i['guid']+"');return false;\" title=\""+p.description+"\">" : "<a href=\"#\" title=\"Sorry no info for this item #\">")
	    itr+= i['title'].toUpperCase()+((i['option'])? " ("+i['option'].toUpperCase()+")":"")+"</a><\/td>";
	    itr+= "<td width=80 align=right>"+i['price']+"<\/td>";
	    itr+= "<td width=40 align=right>"+i['qty']+"<\/td>";
	    itr+= "<td align=right width=80>"+convert_tocurrency(i['qty']*i['price'])+"<\/td>";
	return itr;    
	}

Transaction.prototype.is_service_order = function() {
	    for(var c=0;c <this.item.length;c++) {
	    	if(this.service_ids[this.item[c].guid]) return this.item[c].guid;
	    	}
	    return 0;
	    }

Transaction.prototype.detail = function() {
	var x_detail = "<table width=100% align=center cellspacing=0 cellpadding=0><tr>";
	    x_detail+= "<form>";
	    x_detail+= "<input type=\"hidden\" name=\"action\" value=\"save\"/>";
	    x_detail+= "<input type=\"hidden\" name=\"guid\" value=\""+this.guid+"\"/>";
	    x_detail+= "<td colspan=2>";
	    x_detail+= "<table width=100% cellpadding=0><tr>";
	    x_detail+= "<td width=33% height=25><b>ORDER # "+this.guid+"</b>";
	    x_detail+= "<td width=33% align=center><table cellspacing=0 cellpadding=0><tr><td><b>STATUS</b>: <td>"+this.status_select(this.status);
	    x_detail+= " <td>&nbsp;<button type=button onclick=\"f=parent.document.forms['update'];f.elements['action'].value=this.form.elements['action'].value;f.guid.value=this.form.guid.value;f.status.value=this.form.status.value;f.submit();\"> Save </button>";
	    x_detail+= " <td>&nbsp;<button type=button onclick=\"parent.SFPopurl('catalog-pop.html',550,200)\">Add Item</button></table>";
	    x_detail+= "<td width=33% align=right><b>ORDER DATE: "+this.date+"</b>";
		x_detail+="<\/table>";
		// ORDER ITEMS	    
	    x_detail+= "<table width=100% cellspacing=1 class=grey-frame>";
	    for(var c=0;c <this.item.length;c++) x_detail+="<tr>"+this.item_tr(this.item[c]);
		x_detail+="<\/table>";
		// ORDER ADDRESS:
	    x_detail+= "<tr><td width=50% valign=top><br />";
		// ORDER ADDRESS: BILLING
		x_detail+="<div style=\"padding:10px 0px 8px 3px;\"><b>BILLING ADDRESS</b><\/div>";
		x_detail+=this.address_table(this.address['billing'])
		// ORDER ADDRESS: BILLING
		x_detail+="<div style=\"padding:10px 0px 8px 3px;\"><b>SHIPPING ADDRESS</b><\/div>";
		x_detail+=this.address_table(this.address['shipping'])
		// ORDER CHARGES/PAYEMENTS
	    x_detail+= "<td width=50% valign=top style='border-left:solid #ddd 1px;'>";
		x_detail+=this.charges_table();
		x_detail+="<\/form>";		
		x_detail+="<\/table>";		
	return x_detail;    
	}


Transaction.prototype.detail2 = function() {
	var z_detail = "";
	    z_detail+= "<table width=100% cellpadding=0 style='font-weight:bold;'><tr>";
	    z_detail+= "<td width=33% height=25 align=left>ORDER # "+this.guid;
//	    z_detail+= "<td width=33% align=center>STATUS: "+this.status;
	    z_detail+= "<td width=33% align=center height=25><big><b>P A I D</b></big>";
	    z_detail+= "<td width=33% align=right height=25>ORDER DATE: "+this.date;	    
		z_detail+="<\/table>";
		// ORDER ITEMS	    
	    z_detail+= "<table width=100% cellspacing=1 class=grey-frame>";
	    for(var c=0;c <this.item.length;c++) z_detail+="<tr>"+this.item_tr(this.item[c]);
		z_detail+="<\/table>\n";
	    z_detail+= "\n<p>\n<table width=100% cellspacing=0>\n";
		// ORDER ADDRESS:
	    z_detail+= "<tr><td width=50% valign=top>\n";
		// ORDER ADDRESS: BILLING
		z_detail+="<div style=\"padding:10px 0px 8px 0px;\">BILLING ADDRESS<\/div>\n";
		z_detail+=this.address_table(this.address['billing'])
		// ORDER ADDRESS: BILLING
		z_detail+="<div style=\"padding:20px 0px 8px 0px;\">SHIPPING ADDRESS<\/div>\n";
		z_detail+=this.address_table(this.address['shipping'])
		// ORDER CHARGES/PAYEMENTS
	    z_detail+= "<td width=50% valign=top style='border-left:solid #ddd 1px;'>\n";
		z_detail+=this.charges_table();
		z_detail+="<\/table>";		
	return z_detail;    
	}



Transaction.prototype.xml = function() {
	z_xml= "<transaction>\n";
	z_xml+= "\t<guid>"+this.guid+"</guid>\n";
	z_xml+= "\t<status>"+this.status+"</status>\n";
	z_xml+= "\t<date>"+this.date+"</date>\n";
	// ORDER CHARGES/PAYEMENTS
	z_xml+="\t"+this.charges_xml();
	z_xml+="\t"+this.payments_xml();
	// ORDER MEMOS:
	z_xml+=this.memos_xml();
	// ORDER ADDRESS:
	// ORDER ADDRESS: BILLING
	z_xml+="\t"+this.address_xml(this.address['billing'],'billing');
	// ORDER ADDRESS: BILLING
	z_xml+="\t"+this.address_xml(this.address['shipping'],'shipping');
	// ORDER ITEMS	    
	for(var c=0;c <this.item.length;c++) z_xml+="\t"+this.item_xml(this.item[c]);
	z_xml+= "</transaction>\n";
	return z_xml;    
	}

Transaction.prototype.form = function() {
	var z_detail = "<table align=center width=100% cellspacing=1 cellpadding=0 class='control-bar'><tr>";
		z_detail+= "<form>";
	    z_detail+= "<td width=33%><button type=button onclick=\"opener.XJOURNAL.active.pop();window.close()\">PRINT TICKET</button>";
	    z_detail+= "<td width=33%><button type=button onclick=\"window.close()\">CLOSE/CANCEL</button>";
	    z_detail+= "<td width=33%><button type=button onclick=\"opener.reset_transaction(this.form,this.form.guid.value);window.close()\">SAVE CHANGES</button>";
		z_detail+= "<\/table>";		
		z_detail+= "<p><table width=95% align=center cellspacing=5 cellpadding=0><tr>";
	    z_detail+= "<td width=33% height=25><b>ORDER # "+this.guid+"</b>";
	    z_detail+= "<td width=33% align=center><table cellspacing=0 cellpadding=0><tr><td><b>STATUS:&nbsp;<td>"+this.status_select(this.status)+"</b></table>";
	    z_detail+= "<td width=33% align=right><b>ORDER DATE: "+this.date+"</b>"; 
		z_detail+="<\/table>";
		// ORDER ITEMS	    
		z_detail+= "<table width=95% align=center cellspacing=5 cellpadding=0><tr>";
	    z_detail+= "<tr><td align=center>";
	    z_detail+= "<p>"+this.items_form();
		z_detail+= "<\/table>";
		// ORDER ADDRESS:
		z_detail+= "<p><table width=95% align=center cellspacing=5 cellpadding=0><tr>";
	    z_detail+= "<tr><td width=50% valign=top style='padding-right:20px;''>";
		// ORDER ADDRESS: BILLING
//		z_detail+="<div style=\"padding:0px 0px 10px 3px;\" align=center><b>BILLING ADDRESS</b><\/div>";
		z_detail+=this.address_hidden(this.address['billing'],'billing')
		// ORDER ADDRESS: BILLING
		z_detail+="<div style=\"padding:0px 0px 10px 3px;\" align=center><b>SHIPPING ADDRESS</b><\/div>";
		z_detail+=this.address_form(this.address['shipping'],'shipping')
		// ORDER CHARGES/PAYEMENTS
	    z_detail+= "<td width=50% valign=top style='border-left:solid #ccc 1px;padding-left:20px;'>";
		z_detail+="<div style=\"padding:0px 0px 10px 0px;\" align=center><b>CHARGES/PAYMENTS</b><\/div>";
		z_detail+=this.charges_form();
		if(this.memo) {
		    z_detail+= "<tr>";
		    z_detail+= "<td width=50% valign=top>";
			z_detail+="<div style=\"padding:0px 0px 10px 0px;\" align=center><b>MEMORANDA/NOTES</b><\/div>";
			z_detail+=this.memos_form();
		    z_detail+= "<td width=50% valign=top>&nbsp;";

	    	}
		
	    z_detail+= "<input type=hidden name=\"guid\"  value=\""+this.guid+"\"/>";
	    z_detail+= "</form>";
		z_detail+="<\/table>";		
	return z_detail;    
	}


Transaction.prototype.status_select=function(selected) {
	select_str ="<select name=status style='border-style:none;'>";
	for(var i = 0;i<this.stati.length;i++) {
		select_str+="<option value=\""+this.stati[i]+"\""+((this.stati[i]==selected)?' SELECTED':'')+">"+this.stati[i];
		}
	select_str+="<\/select>";
	return select_str;
	}

Transaction.prototype.charges_table = function() {
	var chargestable= "<table width=100% cellspacing=1 cellpadding=3>";
		chargestable+="<tr><td>&nbsp;<td align=right width=80>---------";
		chargestable+="<tr><td align=right>SUB TOTAL<td align=right>"+this.subtotal;
		chargestable+="<tr><td align=right>FREIGHT<td align=right>"+this.freight;
		chargestable+="<tr><td align=right>SALES TAX<td align=right>"+this.tax;
		chargestable+="<tr><td>&nbsp;<td align=right>---------";
		chargestable+="<tr><td align=right>TOTAL CHARGES<td align=right>"+this.total;
		chargestable+="<tr><td align=right>TOTAL PAYMENTS<td align=right>"+this.payment['amount'];
		chargestable+="<tr><td>&nbsp;<td align=right>---------";
		chargestable+="<tr><td align=right>BALANCE DUE<td align=right>"+this.balance;
		chargestable+="<\/table>";
	return chargestable;
	}
Transaction.prototype.charges_form = function() {
	var chargestable= "<table width=100% cellspacing=1 cellpadding=3>";
		chargestable+="<tr><td>SUB TOTAL<td align=right width=80><input class='autonum' name=\"subtotal\" value=\""+this.subtotal+"\" onfocus=\"blur()\" size=10 />";
		chargestable+="<tr><td>FREIGHT<td align=right><input class='num' name=\"freight\" value=\""+this.freight+"\" onchange=\"opener.retotal(this.form);\" size=10 />";
		chargestable+="<tr><td>SALES TAX<td align=right><input class='num' name=\"tax\" value=\""+this.tax+"\" size=10 />";
		chargestable+="<tr><td>&nbsp;<td align=right>---------";
		chargestable+="<tr><td>TOTAL CHARGES<td align=right><input class='autonum' name=\"total\" value=\""+this.total+"\" onfocus=\"blur()\" size=10 />";
		chargestable+="<tr><td>TOTAL PAYMENTS<td align=right><input class='num' name=\"payment\" value=\""+this.payment['amount']+"\" size=10 />";
		chargestable+="<tr><td>&nbsp;<td align=right>---------";
		chargestable+="<tr><td>BALANCE DUE<td align=right><input class='autonum' name=\"balance\" value=\""+this.balance+"\"  onfocus=\"blur()\" size=10 align=right />";
		chargestable+="<\/table>";
	return chargestable;
	}

Transaction.prototype.charges_xml = function() {
	return "<charges subtotal=\""+this.subtotal+"\" shipping=\""+this.freight+"\" tax=\""+this.tax+"\" total=\""+this.total+"\"/>\n";
	}
Transaction.prototype.payments_xml = function() {
	var ptag = "<payment type=\"CC\" auth_code=\"";
		ptag+= ((this.payment['auth_code'])? this.payment['auth_code'] : "N/A" );
		ptag+= "\"";
		ptag+= " trans_id=\""+((this.payment['trans_id'])?this.payment['trans_id'] : "N/A")+"\" amount=\""+this.total+"\"/>\n";
	return ptag; 
	}


Transaction.prototype.address_table = function(a) {
	var atable = "<table class=address-table cellspacing=0>";
	    atable+= "<tr><td valign=top width=100 class=label>CUSTOMER<td>"+a.first_name+" "+a.last_name;
	    atable+=(a['organization'])? "<div>"+a['organization']+"<\/div>" : "";
	    atable+="<\/td>";
	  if(a.address) {
		  atable+= "<tr><td valign=top class=label>ADDRESS<td>"+a.address.replace(/, +/g,"<br />");
		    atable+= "<div>"+a.city+", "+a.state+" "+a.zip+"<\/div><\/td>";
	    	}
	    atable+= (a['email'])? "<tr><td class=label>EMAIL<td>"+a['email']+"<\/td>" : "";
	    atable+= (a['phone'])? "<tr><td class=label>PHONE<td>"+a['phone']+"<\/td>" : "";
	    atable+= "<\/table>";
	return   atable;    
	}

Transaction.prototype.address_xhtml = function(a) {
	var axhtml = "<div class=address-div>";
	    axhtml+= "<div>"+a.first_name+" "+a.last_name+"<\/div>";
	    axhtml+= "<div>"+a.address.replace(/, +/g,"<br />")+"<\/div>";
	    axhtml+= "<div>"+a.city+", "+a.state+" "+a.zip+"<\/div>";
	    axhtml+= (a['email'])? "<div>"+a['email']+"<\/div>" : "";
	    axhtml+= (a['phone'])? "<div>"+a['phone']+"<\/div>" : "";
	    axhtml+= "<\/div>";
	return   axhtml;    
	}

Transaction.prototype.address_xml = function(a,label) {
	var a_xml = "<"+label;
	    a_xml+= " first_name=\""+a.first_name+"\" last_name=\""+a.last_name+"\"";
	    a_xml+= " address=\""+a.address+"\"  city=\""+a.city+"\"  state=\""+a.state+"\"  zip=\""+a.zip+"\"";
	    a_xml+= (a['email'])? " email=\""+a['email']+"\"" : "";
	    a_xml+= (a['phone'])? " phone=\""+a['phone']+"\"" : "";
	    a_xml+= " />\n";
	return   a_xml;    
	}

Transaction.prototype.address_form = function(a) {
	var args = Transaction.prototype.address_form.arguments;
	var prefix = ((args[1])? args[1]+"_" : "");
	var atable = "<table class=address-table cellspacing=1 width=100%>";
	    atable+= "<tr><td class=label width=100>FIRST NAME<td><input name='"+prefix+"last_name' value='"+a.first_name+"'/><\/td>";
	    atable+= "<tr><td class=label width=100>LAST NAME<td><input name='"+prefix+"last_name' value='"+a.last_name+"'/><\/td>";
	    atable+= "<tr><td class=label width=100>ORGANIZATION<td><input name='"+prefix+"organization' value='"+((a['organization'])?a['organization']:'')+"'/><\/td>";
	    atable+= "<tr><td class=label width=100>ADDRESS<td><input name='"+prefix+"address' value='"+a.address+"'/><\/td>";
	    atable+= "<tr><td class=label width=100>&nbsp<td><table cellspacing=0 cellpadding=0 width=100%><tr><td><input name='"+prefix+"city' value='"+a.city+"'/><td width=20><input name='"+prefix+"state' value='"+a.state+"' size=4 /><td width=70><input name='"+prefix+"zip' value='"+a.zip+"' size=10/><\/table>";
	    atable+= "<tr><td class=label width=100>EMAIL<td><input name='"+prefix+"address' value='"+((a['email'])?a['email']:"")+"'/><\/td>";
	    atable+= "<tr><td class=label width=100>PHONE<td><input name='"+prefix+"address' value='"+((a['phone'])?a['phone']:"")+"'/><\/td>";
	    atable+= "<\/table>";
	return   atable;    
	}

Transaction.prototype.address_hidden = function(a) {
	var args = Transaction.prototype.address_hidden.arguments;
	var prefix = ((args[1])? args[1]+"_" : "");
	var ahidden = "";
	    ahidden+= "<input type='hidden' name='"+prefix+"last_name' value='"+a.first_name+"'/>";
	    ahidden+= "<input type='hidden' name='"+prefix+"last_name' value='"+a.last_name+"'/>";
	    ahidden+= "<input type='hidden' name='"+prefix+"organization' value='"+((a['organization'])?a['organization']:'')+"'/>";
	    ahidden+= "<input type='hidden' name='"+prefix+"address' value='"+a.address+"'/>";
	    ahidden+= "<input type='hidden' name='"+prefix+"city' value='"+a.city+"'/>";
	    ahidden+= "<input type='hidden' name='"+prefix+"state' value='"+a.state+"'/>";
	    ahidden+= "<input type='hidden' name='"+prefix+"zip' value='"+a.zip+"'>";
	    ahidden+= "<input type='hidden' name='"+prefix+"address' value='"+((a['email'])?a['email']:"")+"'/>";
	    ahidden+= "<input type='hidden' name='"+prefix+"address' value='"+((a['phone'])?a['phone']:"")+"'/>";
	return   ahidden;    
	}



Transaction.prototype.items_form = function() {
	var args = Transaction.prototype.items_form.arguments;
	var itable = "<table class=grey-frame cellspacing=1 width=100%>";
	for(var i=0;x_item=this['item'][i];i++) {
		itable+="<tr>";
//		itable+="<td width=10><input type=checkbox name='item_"+i+"' value='item_"+i+"' style='width:8px;height:8px;'/>";
		itable+="<td width=120><input type=hidden name=guid_"+i+" value=\""+x_item['guid']+"\"/>"+x_item['guid'].replace(/_/g,"-");
		itable+="<td width=*><input type=hidden name=title_"+i+" value=\""+x_item['title']+"\"/>"+x_item['title'].toUpperCase();
		if(x_item['option']) {itable+="<input type=hidden name=option_"+i+" value=\""+x_item['option']+"\"/> ("+x_item['option']+")";}
		itable+="<td width=80><input onchange=\"opener.recalc(this.form,'"+i+"')\" type=text class=num name=price_"+i+" value=\""+x_item['price']+"\"/>";
		itable+="<td width=20><input onchange=\"opener.recalc(this.form,'"+i+"')\" type=text class=num name=qty_"+i+" value=\""+x_item['qty']+"\"/>";
		itable+="<td width=80><input onfocus=\"blur()\" type=text class=autonum name=subtotal_"+i+" value=\""+convert_tocurrency(x_item['price']*x_item['qty'])+"\"/>";
		}
	itable+= "<\/table>";
	return   itable;    
	}

Transaction.prototype.items_list = function() {
	var args = Transaction.prototype.items_list.arguments;
	var ilist = "";
	for(var i=0;x_item=this['item'][i];i++) {
		ilist+="<li>"+x_item['title'].toUpperCase();
		ilist+=" ("+x_item['guid'].replace(/_/g,"-") + ")</li>";
		}
	return   ilist;    
	}


Transaction.prototype.item_xml = function($item) {
		$x_option = ($item.option)? " option=\""+$item.option+"\"" : "";
		return "<item guid=\""+$item['guid']+"\" price=\""+$item['price']+"\" title=\""+$item['title']+"\" qty=\""+$item['qty']+"\""+$x_option+" />\n";
		}

Transaction.prototype.memos_form = function() {
	var memo_rows = "";
	var memo_table= "";
	if(this.memo) {
		memo_table= "<table width=100% cellspacing=1 cellpadding=3>";
		for(keys in this.memo) {
			memo_table+="<tr><td class=label width=100>"+keys.toUpperCase()+"<td align=right><input name=\"memo_"+keys+"\" value=\""+this.memo[keys]+"\"/>";
			}
		memo_table+="<\/table>";
		}	
	return memo_table;
	}

Transaction.prototype.memos_xml = function() {
	var m_xml = "";
	if(this.memo) {
		for(keys in this.memo) {
			m_xml+="\t<memo name=\""+keys+"\" value=\""+this.memo[keys]+"\"/>\n";
			}
		}
	return m_xml;
	}


/* ------------------------------------------------------------------ *\
	OBJECT: TICKETBOOK
\* ------------------------------------------------------------------ */

function TicketBook(tickets) {
	tickets = ((tickets)? tickets.reverse() : new Array());
	args = TicketBook.arguments;
	this.transactions = (args[1]) ? args[1] : new Object();
	this.tickets = new Array();
	this.guids = new Object();
	this.aging = new Array();
	for(var i=0;t=tickets[i];i++) {
		if(this.transactions[t.guid]) { tickets[i]["transaction"] = this.transactions[t.guid]; }
		this.tickets[i] = new Ticket(tickets[i]);		
		this.guids[t.guid]=this.tickets[i];
		if(this.tickets[i].is_aging()) this.aging[this.aging.length]=this.tickets[i];
		}
	}


TicketBook.prototype.table =  function () {
   x_table="<table width=100% class=grey-frame cellspacing=1 cellpading=4>";
	for(keys in this.guids) {
		x_table+=this.guids[keys].tr();
		}
	x_table+="</table>";
	return x_table;
	}

TicketBook.prototype.pop =  function () {
	var y_html="";
		y_html+="<title>Service Journal</title>";
	    y_html+="<script>function dosub(guid){opener.XTICKETS.guids[guid].edit()}</script>";
	    y_html+=SFCss("font-size:11px;");
	    y_html+="<style>";
	    y_html+="table.grey-frame {background:#ddd;}";
	    y_html+="table.grey-frame td {background:#fff;padding:3px;cursor:pointer;}";
	    y_html+="<\/style>";
	    y_html+="<table width=100% cellspacing=1 cellpading=4>";
	    y_html+="<tr><td width=33% align=left>DATES: "+this.tickets[(this.tickets.length-1)].date+" - "+this.tickets[0].date+"<td align=center width=33%>"+this.aging.length+" ITEMS OLDER THAN 7 DAYS <td align=right width=33%>"+this.tickets.length+" TOTAL TICKETS";
	    y_html+="</table>";
	    y_html+=this.table();
	SFWindowChrome(y_html,750,550);
	}

/* ------------------------------------------------------------------ *\
	OBJECT: TICKET
\* ------------------------------------------------------------------ */

function Ticket(params) {
	this.service_ids = {'E-SVC-INSTALL-S':'Standard Installation','E-SVC-INSTALL-A':'Advanced Installation','E-SVC-ASSESS':'Needs Assessment'};
	this.stati = ['OPENED','SCHEDULED','COMPLETED'];
	this.transaction = params['transaction'];
	this.guid = params['guid'];
	this.date = params['date'];
	this.type = params['type'];
	this.appointment = params['appointment'];
	this.status = params['status'];
	this.notes = ((params['notes'] && params['notes'] != "N/A")? params['notes'] : ((this.transaction && this.transaction['memo'] && this.transaction['memo']['notes'])? this.transaction['memo']['notes'] : "N/A"));
	this.memo = params['memo'];
	}

////////////////////////////////////////////////////////////////
//	CLASS TICKET: XML (XML)
////////////////////////////////////////////////////////////////
Ticket.prototype.xml = function () {
	var $x_tag = "<ticket";
		$x_tag+= " guid=\""+this.guid+"\"";
		$x_tag+= " date=\""+this.date+"\"";
		$x_tag+= " type=\""+this.type+"\"";
		$x_tag+= " appointment=\""+this.appointment+"\"";
		$x_tag+= " status=\""+this.status+"\"";
		$x_tag+= " notes=\""+this.notes+"\"";
		$x_tag+="/>";
	return $x_tag;
	}

////////////////////////////////////////////////////////////////
//	CLASS TICKET: (JS)
////////////////////////////////////////////////////////////////
Ticket.prototype.js = function () {
	var $x_js = "{";
		$x_js+= " guid:\""+this.guid+"\",";
		$x_js+= " date:\""+this.date+"\",";
		$x_js+= " type:\""+this.type+"\",";
		$x_js+= " appointment:\""+this.appointment+"\",";
		$x_js+= " status:\""+this.status+"\",";
		$x_js+= " notes:\""+this.notes+"\"";
		$x_js+="}";
	return $x_js;
	}

Ticket.prototype.css = function() {
	var args = Ticket.prototype.css.arguments;
	var t_css = SFCss(((args[0])?args[0]:""));
		t_css+= "<style>";
		t_css+= "td.label{width:80px;}";
		t_css+= "td.date-select select{width:200px;}";
		t_css+= "table.date-control{width:200px;}";
		t_css+= "table.date-control td {padding:0px;}";
		t_css+= "table.date-control select {width:98%;}";
		t_css+= "table.address-table {text-transform:uppercase;}";
		t_css+= "table.grey-frame{ background:#dde;}";
		t_css+= "table.grey-frame td{ background:#fff;padding:3px;}";
		t_css+= "li{list-style-type:none;padding-bottom:1px;}";
		t_css+= "</style>"
	return t_css;
	}

Ticket.prototype.pop =  function () {
	var y_html="";
		y_html+= "<title>Service Ticket</title>";
		y_html+= this.css('font-size:11px');
		y_html+= this.table();
	SFWindowChrome(y_html,700,450);
	}

Ticket.prototype.edit =  function () {
	var y_html="";
		y_html+= "<title>Service Ticket</title>";
		y_html+= this.css('font-size:10px');
	    y_html+="<style>";
		y_html+=ToolbarStyles.css(Get_Cookie('style'));
	    y_html+="table.control-bar {height:30px;}";
	    y_html+="table.control-bar td {vertical-align:middle;}";
	    y_html+="body { margin:0; }";
	    y_html+="</style>";
		y_html+=this.form();
	SFWindowRaw(y_html,700,450);
	}

////////////////////////////////////////////////////////////////
//	TICKET: TABLE
////////////////////////////////////////////////////////////////
Ticket.prototype.table =  function () {
	var $x_table = "";
		$x_table+="<div align=center style='font-size:24px;font-variant:small-caps;letter-spacing:1px;font-family:serif;'>Ergonetics.com<\/div>";
		$x_table+= "<div style='padding:8px 0px 12px 4px;font-size:12px;' align=center>SERVICE TICKET</div>"
		$x_table+= "<table cellspacing=0 cellpadding=0 width=100%>";
		$x_table+= "<form>";
		$x_table+= "<td width=33%>ORDER ID#: "+this.guid;
		$x_table+= "<td width=33% align=center>"+this.service_ids[this.type].toUpperCase();	
		$x_table+= "<td width=33% align=right>ORDER DATE: "+this.date;
		$x_table+="</table>";
		$x_table+= "<p><table cellspacing=0 cellpadding=0 width=100%>";
		$x_table+= "<tr>";

		$x_table+= "<td width=50% style='border-right:solid #ddd 1px;'>";
	if(this.transaction) {
		$x_table+= "<p>"+this.transaction.address_table(this.transaction.address['shipping']);
		$x_table+= "<td width=50%>";
		$x_table+= "<table cellspacing=0 cellpadding=0 width=100%>";
		$x_table+= "<tr><td class=label width=100>STATUS<td align=left>"+this.status;
		$x_table+= "<tr><td class=label width=100>APPOINTMENT<td align=left>"+((this.appointment)?this.appointment: "N/A");
		$x_table+= "<tr><td class=label width=100>NOTES<td align=left>"+this.notes;
		$x_table+= "</table>";
		$x_table+= "</table>";
		$x_table+= "<p><table cellspacing=0 cellpadding=0 width=100% align=center>";
		$x_table+= "<tr><td><p align=center>PRODUCTS</p>";
		$x_table+= "<tr><td>"+this.items_table();
		$x_table+= "</table>";		
//		$x_table+= "<p align=center><table cellspacing=0 cellpadding=0 align=center width=70%><td align=center width=50%><button type=button onclick=\"window.close();\">CLOSE</button><td align=center width=50%><button type=button onclick=\"opener.XTICKETS.guids['"+this.guid+"'].edit(this.form);window.close();\">EDIT</button></table>";
		$x_table+= "</form>";
		}
	return $x_table;
	}

////////////////////////////////////////////////////////////////
//	TICKET: FORM
////////////////////////////////////////////////////////////////
Ticket.prototype.form =  function () {
	var $x_table = "";
		$x_table+= "<table border=0 align=center width=100% class=control-bar><td align=center width=33%><button type=button onclick=\"opener.XTICKETS.guids['"+this.guid+"'].pop();\">PRINT TICKET</button><td align=center width=33%><button type=button onclick=\"window.close()\">CLOSE CANCEL</button><td align=center width=33%><button type=button onclick=\"opener.XTICKETS.guids['"+this.guid+"'].reset(this.form.status.value,this.form.appointment.value,this.form.notes.value);window.close();\">SAVE CHANGES</button></table>";
		$x_table+= "<p><table cellspacing=0 cellpadding=0 width=95% align=center><tr><td colspan=2 height=35>";
		$x_table+= "<table cellspacing=0 cellpadding=0 width=100% height=35>";
		$x_table+= "<form>";
		$x_table+= "<tr>";
		$x_table+= "<td width=33%><b>ORDER ID#: "+this.guid+"</b>";
		$x_table+= "<td width=33% align=center><b>"+this.service_ids[this.type].toUpperCase()+"</b>";	
		$x_table+= "<td width=33% align=right><b>ORDER DATE: "+this.date+"</b>";
		$x_table+="</table>";
		$x_table+= "<tr>";
		$x_table+= "<td width=50% style='border-right:solid #ddd 1px;'>";
		if(this.transaction) {
			$x_table+="<p>"+this.transaction.address_table(this.transaction.address['shipping'])+"</p>";
			}
		$x_table+= "<td width=50%>";
		$x_table+= "<p><table cellspacing=0 cellpadding=0 width=100%>";
		$x_table+= "<tr><td class=label width=100>STATUS</b><td align=left class=date-select>"+SFSelect('status',this.stati,this.status);
		$x_table+= "<tr><td class=label width=100>APPOINTMENT</b><td align=left>"+SFDateSelect(this.appointment,"appointment");
		$x_table+= "<tr><td class=label width=100>NOTES</b><td align=left><textarea name=notes cols=40 rows=2 style='width:200px;'>"+this.notes+"</textarea>";
		$x_table+="</table>";
		$x_table+="</table>";
		$x_table+= "<p><table cellspacing=0 cellpadding=0 width=95% align=center>";
		$x_table+= "<tr><td>"+this.items_table();
		$x_table+= "</table>";		
		$x_table+= "</form>";
	return $x_table;
	}

////////////////////////////////////////////////////////////////
//	TICKET: ITEMS LIST
////////////////////////////////////////////////////////////////

Ticket.prototype.items_list = function() {
	var args = Ticket.prototype.items_list.arguments;
	var ilist = "";
	for(var i=0;x_item=this.transaction['item'][i];i++) {
		if(!this.service_ids[x_item['guid']]) {
			ilist+="<li>"+ x_item['title'].toUpperCase() + " (" + x_item['qty']+" ITEMS)";
			}
		}
	return   ilist;    
	}
Ticket.prototype.items_table = function() {
	var args = Ticket.prototype.items_list.arguments;
	var itable = "<table cellspacing=1 cellpadding=0 class=grey-frame width=100%>";
	for(var i=0;x_item=this.transaction['item'][i];i++) {
		if(!this.service_ids[x_item['guid']]) {
			itable+="<tr><td>"+x_item['guid'].replace(/_/g,"-")+"<td>"+ x_item['title'].toUpperCase() + "<td align=right width=100 >QTY: " + x_item['qty'];
			}
		}
	itable+="</table>";
	return   itable;    
	}


////////////////////////////////////////////////////////////////
//	CLASS TICKET: (JS)
////////////////////////////////////////////////////////////////
Ticket.prototype.tr = function () {
	var x_customer = (this.transaction['address']['shipping']['last_name'].toUpperCase()+", "+this.transaction['address']['shipping']['first_name'].toUpperCase()).replace(/^,? ?(.+) ?,?$/,"$1");
	var $x_tr = "<tr"+((this.is_aging())?" style='color:#600;'": '')+" onclick=\"dosub('"+this.guid+"')\">";
		$x_tr+= "<td>"+this.guid;
		$x_tr+= "<td>"+this.date;
		if(this.transaction) {
			$x_tr+="<td>"+x_customer;
			}
		$x_tr+= "<td>"+this.service_ids[this.type].toUpperCase();
		$x_tr+= "<td>"+((this.appointment)? this.appointment : "N/A");
		$x_tr+= "<td>"+this.status;
		$x_tr+="</tr>\n";
	return $x_tr;
	}

////////////////////////////////////////////////////////////////
//	CLASS TICKET: (JS)
////////////////////////////////////////////////////////////////
Ticket.prototype.is_aging = function () {
	return (this.status == "OPENED" && ((new Date().getTime()) - (new Date(this.date).getTime()) > (86400000 * 7)));		
	}
/* ------------------------------------------------------------------ *\
	FORM<td> CHECKOUT
\* ------------------------------------------------------------------ */

// ADD/BUY: INVALIDATE
function invalidate(f) {
	f2 = document.forms['checkout'];
	x_order = new Order(x_cart);
	x_order.getaddress(f,'billing');
	x_order.getaddress(f,'shipping');
	x_order.address['billing'].makepostable(f2,'billing');
	x_order.address['shipping'].makepostable(f2,'shipping');
	x_order.cart.total();
	// AUTO EXEMPT GOV PURCHASERS (IN MD/DC)
	if(x_order.address['billing']['email'].match(/\.[gm][oi][vl]$/i) && f.elements['tax_exempt']) { f.tax_exempt.checked=1;}
	// AUTO EXEMPT GOV PURCHASERS (IN MD/DC)
	f2.subtotal.value=convert_tocurrency(x_order.cart.subtotal);
	f2.shipping.value=convert_tocurrency(x_order.cart.shipping);
	f2.tax.value=((f2.billing_state.value=="MD" && f.elements['tax_exempt'] && f.tax_exempt.checked !=1)?convert_tocurrency(f2.subtotal.value*.06) : "0");
	f2.xml.value = escape(x_order.cart.xml());
	f2.memo.value="";
	for(var m = 0; c = f.elements[m]; m++) if(c.className=="memo") f2.memo.value+= c.name+":"+c.value;
	f2.memo.value=f2.memo.value.replace(/,$/,'');
	if((x_errors=x_order.geterrors(f))=="") {
		if(f2.tax.value==0 || confirm('MD Sales Tax will be assessed on this order.\n\nGovernment purchasers should click [Cancel] and select the checkbox at the bottom of the form before proceeding.\n\nOther MD customers may click [OK] to continue their order')) {
			f2.mode.value = 'verify';
			f2.submit();
			}
		} else { alert(x_errors) }
	}

/* ------------------------------------------------------------------ *\
	FORM<td> ALL
\* ------------------------------------------------------------------ */

function recalc_subtotal(s,f) {
	thesub=f.elements[s.name+"_price"];
	s.value = ((v=s.value.replace(/[^\d]/g,"")) ? v : 1);
	thesub.value=convert_tocurrency((s.value)*x_catalog.guids[s.name].price);
	}

/* ------------------------------------------------------------------ *\
	FORM<td> ACCOUNTS
\* ------------------------------------------------------------------ */

// ADD/BUY: FAST ADD
function fast_add(guid,price,f) {
	var s=f.elements[guid];
	var q=s.value;
	var o=new Array();;
	for(i=0;i<f.elements.length;i++) {
		if( f.elements[i].type.indexOf('select') > -1
		    && f.elements[i].name!=guid
			&& f.elements[i].name!='categories'
		    ) {
			o[o.length]=f.elements[i].name+":"+f.elements[i].value;
			}
		}
	var my_catalog = new Catalog(products);
	var my_cart = new Cart(my_catalog.guids);
	my_cart.add_item(guid,q,price,o);
//	my_cart.alert_action('add',guid);
	x_cart=my_cart;
	mcart();
	document.location.href="?mode=order";
//	alert("Item Added to Shopping Cart")
//	PopParams("cart-pop.html",600,250);
	}

// ADD/BUY: FAST BUY
function fast_buy(guid,price,f) {
	var s=f.elements[guid];
	var q=s.value;
	var o=new Array();;
	for(i=0;i<f.elements.length;i++) {
		if( f.elements[i].type.indexOf('select') > -1
		    && f.elements[i].name!=guid
			&& f.elements[i].name!='categories'
		    ) {
			o[o.length]=f.elements[i].name+":"+f.elements[i].value;
			}
		}
	var my_catalog = new Catalog(products);
	var my_cart = new Cart(my_catalog.guids);
	my_cart.add_item(guid,q,price,o);
	x_cart=my_cart;
	mcart();
	document.location.href="?mode=checkout";
	}

// ACCOUNT/MAIN:
// POP<td>
function pop_image(u) {
	url = "bigimage.html?imgsrc="+u;
	window.open(url,"","width=500,height=500,resizable=yes,scrollbars=yes");	
	}


/* ------------------------------------------------------------------ *\
	FORM<td> ADD/BUY: FULL SITE
\* ------------------------------------------------------------------ */

//  ADD/BUY: FULL ADD
function full_add(guid,price,f) {
	var s=f.elements[guid];
	var q=s.value;
	var o=new Array();
	for(i=0;i<f.elements.length;i++) {
		if( f.elements[i].type.indexOf('select') > -1
		    && f.elements[i].name!=guid
			&& f.elements[i].name!='categories'
		    ) {
			o[o.length]=f.elements[i].name+":"+f.elements[i].value;
			}
		}
	var my_catalog = new Catalog(products);
	var my_cart = new Cart(my_catalog.guids);
	my_cart.add_item(guid,q,price,o);
	document.location.href="?mode=cart";
	}

//  ADD/BUY: FULL BUY
function full_buy(guid,price,f) {
	var s=f.elements[guid];
	var q=s.value;
	var o=new Array();
	for(var i=0;i<f.elements.length;i++) {
		if( f.elements[i].type.indexOf('select') > -1
		    && f.elements[i].name!=guid
			&& f.elements[i].name!='categories'
		    ) {
			o[o.length]=f.elements[i].name+":"+f.elements[i].value;
			}
		}
	var my_catalog = new Catalog(products);
	var my_cart = new Cart(my_catalog.guids);
	my_cart.add_item(guid,q,price,o);
	document.location.href="?mode=checkout";
	}

/* ------------------------------------------------------------------ *\
	FORM<td> ADD/DELETE: CART VIEW
\* ------------------------------------------------------------------ */


// CART<td>
// ADD ITEM
function add_item(f) {
	xo = new Array();
	for(var o = 1; (f.elements['options_'+o] && f.elements['options_'+o].value !="");o++) xo[xo.length] = f.elements['options_'+o].value;
	x_cart.add_item(f.pguid.value,f.pqty.value,f.pprice.value, xo);
	cart.document.location.href="cart.html";
	mcart();
	}
// CART<td>
// DELETE ITEM
function delete_selected() {
	var xmlout="";
	var ischecked = 0;
	theform1=cart.document.forms[0];
	for(i=0;i<theform1.elements.length;i++) {
		if(theform1.elements[i].type=='checkbox' && theform1.elements[i].checked==false) {
			xmlout+=theform1.elements[i].value;	
			} else {ischecked++;}
		}
	if(ischecked>0) {
		if(confirm('Delete selected?')) {
			x_cart.reset(unescape(xmlout));
			cart.document.location.href="cart.html";			
			mcart();
			}
		} else {
			alert('No Items Selected');
			}
	}

// CART<td>
// PSHOW
function pshow(i) {
	x_catalog.pshow(document.forms[0],products[i].guid);
	}

// CART<td>
// QCALC
function qcalc(f) {
	f.psubtotal.value = convert_tocurrency(f.pqty.value*f.pprice.value);
	}

/* ------------------------------------------------------------------ *\
	GLOBAL: 
\* ------------------------------------------------------------------ */

// PARSE ITEMS
function parseitems(xml) {
	var xItems = new Array();
	if(items=xml.match(/<item[^<]+\/>/g)) {
		for (x = 0; (x<items.length); x++) {
			var atts = items[x].match(/\w+=[\'\"][^\'\"]+[\'\"]/g);
			xItems[x] = new Object();
			for(a=0;a<atts.length;a++) {
				pairs = atts[a].replace(/[\'\"]/g,"").split("=");
				xItems[x][pairs[0]] = ((xItems[x][pairs[0]])? xItems[x][pairs[0]] + ','+ pairs[1] : pairs[1]) ;
				}
			}
		}
	return xItems;
	}

// CALCULATE ORDER (begin main)

function convert_tocurrency(num) {
	if(!num || num== "") return "0.00"
	if((num+"").match(/[^\d\.]/)) return num;
	num=Math.round(num*100)/100;
	num=num+"";
	num=num.replace(/^(\d+)$/,"$1.00");
	if(num.search(/^\d+\.\d$/)>-1){num=num+"0";}
	return num;
	}



function return_sh(subtotal) {
	sh=((subtotal>0)? "9.50" : "0.00");
	if(subtotal > 100 && subtotal < 501) { sh=(subtotal*.085); }
	if(subtotal > 500) {sh=(subtotal*.075);}	
	return sh;
	}

function getIndex(s,c) {
	for(var l=0;(m=s.options[l]);l++) {
		if(m.value.toLowerCase() == c.toLowerCase()) return l;
		}
	return 0;
	}


/* ------------------------------------------------------------------ *\
	TOOLBAR: STYLES
\* ------------------------------------------------------------------ */

ToolbarStyles = new Object();
	ToolbarStyles['black'] = {'background-image':'../images/topnav-bg-verydrkgray.png','color':'#FFF','border-top':'#999','border-bottom':'#000'};
	ToolbarStyles['vista'] = {'background-image':'../images/bez-black.png','color':'#FFF','border-top':'#FFF','border-bottom':'#000'};
	ToolbarStyles['blue'] = {'background-image':'../images/topnav-bg-blue-plus.png','color':'#FFF','border-top':'#67A','border-bottom':'#235'};
	ToolbarStyles['gray'] = {'background-image':'../images/topnav-bg-gray.png','color':'#000','border-top':'#EEE','border-bottom':'#666'};
	ToolbarStyles['css'] = function(title) {
	    var T = ToolbarStyles[title];
	    t_css = "table.control-bar {background-position:center;background-image:url('"+T['background-image']+"');border-top:solid "+T['border-top']+" 1px;border-bottom:solid "+T['border-bottom']+" 1px;}";	
	    t_css+="table.control-bar button {background-position:center;background-image:url('"+T['background-image']+"');color:"+T['color']+";border-style:solid;border-width:1px;border-color:"+T['border-top']+" "+T['border-bottom']+" "+T['border-bottom']+" "+T['border-top']+";padding-top:1px;padding-bottom:1px;}";
	    t_css+="table.control-bar td { padding: 1px; }";
		return t_css;
		}

/* ------------------------------------------------------------------ *\
	GLOBAL: UTILITIES
\* ------------------------------------------------------------------ */

function PopParams(url) {
	argv=PopParams.arguments;
	targetWindow = url;
	params="width="+((argv[1])?argv[1]:700)+",height="+((argv[2])?argv[2]:600)+",scrollbars=yes,resizable=yes";
	helpWindow=window.open(targetWindow,"",params);
	return false;
	}

//  C. GLOBAL : SFWINDOW 
function SFWindow(html) {
	var args = SFWindow.arguments;
	params="width="+((args[1])?args[1]:400);
	params += ",height="+((args[2])?args[2]:200);
	params +=",resizable=yes,scrollbars=yes";
	popwindow=window.open('','',params);
	popwindow.document.write("<style>body,table{font-family:'Lucida Grande','Trebuchet MS',sans-serif;font-size:11px;}td{vertical-align:top;padding:3px;} th{vertical-align:top;text-align:left;text-transform:uppercase;} td table td {border:none;padding:2px 0px 2px 0px;} a {text-decoration:none;} a {color:#447;}<\/style>");
	popwindow.document.write(html);
	popwindow.document.close();
	}

//  C. GLOBAL : SFWINDOWCHROME
function SFWindowChrome(html) {
	var args = SFWindowChrome.arguments;
	params="width="+((args[1])?args[1]:400);
	params += ",height="+((args[2])?args[2]:200);
	params +=",resizable=yes,scrollbars=yes,toolbar=yes,menubar=yes";
	popwindow=window.open('','',params);
	popwindow.document.writeln("<style>body,table{font-family:'Lucida Grande','Trebuchet MS',sans-serif;font-size:11px;}td{vertical-align:top;} a {text-decoration:none;} a {color:#447;}<\/style>");
	popwindow.document.write(html);
	popwindow.document.close();
	}

function SFWindowRaw(html) {
	var args = SFWindowRaw.arguments;
	params="width="+((args[1])?args[1]:400);
	params += ",height="+((args[2])?args[2]:200);
	params +=",resizable=yes,scrollbars=yes";
	popwindow=window.open('','',params);
	popwindow.document.write(html);
	popwindow.document.close();
	}


//  C. GLOBAL : SFWINDOW 
function SFWindowText(txt) {
	var args = SFWindowText.arguments;
	params="width="+((args[1])?args[1]:400);
	params += ",height="+((args[2])?args[2]:200);
	params +=",resizable=yes,scrollbars=yes";
	popwindow=window.open('','',params);
	popwindow.document.write("<pre>\n");
	popwindow.document.write(txt.replace(/</g,"&lt;"));
	popwindow.document.write("</pre>\n");
	popwindow.document.close();
	}



// C. GLOBAL: SFCURRENCY (begin main)

function SFCurrency(num) {
	if(!num || num== "") return "0.00"
	if((num+"").match(/[^\d\.]/)) return num;
	num=Math.round(num*100)/100;
	num=num+"";
	num=num.replace(/^(\d+)$/,"$1.00");
	if(num.search(/^\d+\.\d$/)>-1){num=num+"0";}
	return num;
	}

function SFCurrencyFormat(num) {
	var renum = "";
	num = SFCurrency(num)+"";
	var parts = (num).split(".");
	if(parts[0].length < 4) {
		return num
		} 
	for(var i=parts[0].length-1;i>=0;i--) {
		
		renum=parts[0].charAt(i) + renum;
		renum = ((i==0 || ((parts[0].length-parseInt(i))%3))?"" : ",") + renum; 


		}
	renum+="."+parts[1];
	return renum;
	}



//  C. GLOBAL : MWINDOW (alias SFWindow)
function MWindow(html) {
	var args = MWindow.arguments;
	SFWindow(args[0],((args[1])?args[1]:400),((args[2])?args[2]:200));
	}

//  C. GLOBAL : SFPOPURL 
function SFPopurl(url) {
	var args = SFPopurl.arguments;
	params="width="+((args[1])?args[1]:400);
	params += ",height="+((args[2])?args[2]:200);
	params +=",resizable=yes,scrollbars=yes";
	popwindow=window.open(url,'',params);
	}

//  C. GLOBAL : SFPOPURL 
function SFPopurlChrome(url) {
	var args = SFPopurlChrome.arguments;
	params="width="+((args[1])?args[1]:400);
	params += ",height="+((args[2])?args[2]:200);
	params +=",resizable=yes,scrollbars=yes,toolbar=yes,menubar=yes";
	popwindow=window.open(url,'',params);
	}


// C. GLOBAL<td> SFPARSEFORM
function SFParseform(){
	var $FORMDATA=new Object();
	var args = SFParseform.arguments;
    if (document.location.search.indexOf('=')>-1) { 
        keyvalues=unescape(document.location.search.substring('1').replace(/\+/g,' ')).split("&");
        for(p=0;p<keyvalues.length;p++) {
            pairs=keyvalues[p].split("=");
            $FORMDATA[pairs[0]]=pairs[1];
            }            
        }
    return ((args[0]) ? (($FORMDATA[args[0]])?$FORMDATA[args[0]]:"") : $FORMDATA);
    }

// C. GLOBAL: SFTOGGLECHECKBOX
function SFToggleCheckbox(c) {
	c.checked = (c.checked)? 0 : 1;
	}
// C. GLOBAL: SFDATESELECT
function SFDateSelect() {
	var args = SFDateSelect.arguments;
	var control = "";
	var now = new Date();
	var date = (args[0])? new Date(args[0]) : "";
	var name = (args[1])? args[1] : "date";
	var options = {m:"<option>",d:"<option>",y:"<option>"};
	var onchangestr = "this.form."+name+".value=this.form."+name+"_month.value+' '+this.form."+name+"_day.value+', '+this.form."+name+"_year.value";
	for(var i=0;i<12;i++) {
		month_string = new Date((parseInt(i)+1)+"/01/01").getMonthString('M');
		options['m']+="<option value=\""+month_string+"\""+((date && i==date.getMonth())?" SELECTED":"")+">"+month_string.toUpperCase();
		}
	for(var i=1;i<32;i++) {
		options['d']+="<option value=\""+i+"\""+((date && i==date.getDate())?" SELECTED":"")+">"+i;
		}
	for(var i=2005;i<(parseInt(now.getFullYear())+1);i++) {
		options['y']+="<option value=\""+i+"\""+((date && i==date.getFullYear())?" SELECTED":"")+">"+i;
		}
	control +="<table cellpadding=0 cellspacing=0 class=date-control><tr>";
	control +="<td><select name=\""+name+"_month\" onchange=\""+onchangestr+"\">"+options['m']+"</select>";
	control +="<td align=center><select name=\""+name+"_day\" onchange=\""+onchangestr+"\">"+options['d']+"</select>";
	control +="<td align=right><select name=\""+name+"_year\" onchange=\""+onchangestr+"\">"+options['y']+"</select>";
	control +="<input type=hidden name=\""+name+"\" value=\""+date+"\" />";
	control +="</table>";
	return control;
	}

// C. GLOBAL: SFDSELECT
function SFSelect(name,list) {
	var args = SFSelect.arguments;
	var selected = args[2] ? args[2] : "";
	control ="<select name=\""+name+"\">";
	if(typeof(list)=="object" && list.length)for(var i=0;( option = list[i] ); i++) control+= "<option value=\""+list[i]+"\""+((selected && list[i]==selected)?" selected":"")+">"+list[i];
	else if(list.typeOf()=="object") for(keys in list) control+= "<option value=\""+key+"\""+((selected && key==selected)?" selected":"")+">"+list[key];
	control+="</select>";
	return control;
	}
	
//  C. GLOBAL : SFSelectOption

function SFSelectOption(s,v) {
	for(var i=0;o=s.options[i];i++) {
		if(o.value == v) {
			s.selectedIndex = i;
			break;
			}
		}
	}

// C. GLOBAL CSS

function SFCss() {
	var css = {'font-family':'Arial,sans-serif','font-size':'11px' };
	var args = SFCss.arguments;
	if(args[0]) {
		for(var i=0;statement=args[0].split(';')[i];i++) { 
			css[statement.split(':')[0]] = statement.split(':')[1];
			}
		}
	var d_css = "<style>";
		d_css+= "body,table,select,input,textarea,button{font-family:"+css['font-family']+";font-size:"+css['font-size']+";}";
		d_css+= "td{vertical-align:top;padding:4px;}";
		d_css+= "button,textarea,select{width:100%;border-width:1px;}";
		d_css+= "</style>";
	return d_css;
	}


function SFEntityencode(str) {
	str = unescape(str);
	str = str.replace(/"/g,'&quot;');
	return str;
	}	
function SFHtmlencode(str) {
	str = unescape(str);
	str = unescape(escape(str).replace(/%u201[CD]/gi,'"'));
	str = unescape(escape(str).replace(/%u201[89]/gi,"'"));
	str = str.replace(/"/g,'&quot;');
	str = str.replace(/%B0/g,'&deg;');
	str = str.replace(/\xB0/g,'&deg;');
	str = str.replace(/[\r\n]/g,'<br />');
	str = str.replace(/<br\/>\s*<br\/>/g,'<p>');
	return str;
	}	
function SFHtmldecode(str) {
	str = unescape(str);
	str = str.replace(/&deg;/g,'\xB0');
	str = str.replace(/&amp;/g,'&');
	str = str.replace(/&quot;/g,'"');
	str = str.replace(/<br ?\/?>/g,'\r');
	str = str.replace(/<p>/g,'\r\r');
	str = str.replace(/<br\/>\s*<br\/>/g,'<p>');
	return str;
	}	

function SFHtmlentitydecode(str) {
	str = unescape(str);
	str = str.replace(/&amp;/g,'&');
	str = str.replace(/&lt;(\/?\w)&gt;/ig,'<$1>');
	str = str.replace(/&lt;li&gt;/ig,'<li>');
	return str;
	}	



function toggle_viz(t) {
	args=toggle_viz.arguments;
	a=((args[1])?args[1]:"");
	if(target =document.getElementById(t)) {
		target.style.display=((target.style.display=='block')?'none' : 'block');
		}
	if(a!="") {
		a.innerHTML =((a.innerHTML=='+')?"-":"+");
		}
	}

function toggle_display(t) {
	args=toggle_display.arguments;
	a=((args[1])?args[1]:"");
	if(target =document.getElementById(t)) {
		target.style.display=((target.style.display=='block')?'none' : 'block');
		}
	if(a!="") {
		a.innerHTML =((a.innerHTML=='+')?"-":"+");
		}
	}


function choosecolor(img,id) {
	t = document.images[id+'-color'];
	t.src = img.src;
	toggle_viz(id+'-swatch');
	f =document.forms[id]; 
	if(f.elements['color']) {
		for(s=0;s<f.elements['color'].options.length;s++) {
			if(f.elements['color'].options[s].text.toLowerCase() == img.name.toLowerCase()) f.elements['color'].selectedIndex = s;
			}
		}

	}

function setcolor(name,id) {
	t = document.images[id+'-color'];
	t.src = swatches[id][name];
	f =document.forms[id]; 
	if(f.elements['color']) {
		for(s=0;s<f.elements['color'].options.length;s++) {
			if(f.elements['color'].options[s].text.toLowerCase() == name.toLowerCase()) f.elements['color'].selectedIndex = s;
			}
		}
	}




////////////////////////////////////////////////////////////////////
//
//   <td>    asort(a)
//
//   <td>     returns an of an associative array (a) keys 
//                 sorted by member values(A-Z)
//                 
//                 
//
////////////////////////////////////////////////////////////////////

	function asort(a) {
		var b=new Array();
		var c=new Array();
		for(g in a) {
			b[b.length]=zero_prefix(a[g])+'\t'+g;
			}
		b=b.sort();
		for(var i=0; i<b.length;i++) {
			pairs=b[i].split("\t");
			c[c.length]=pairs[1];
			}
		return c;
		}

////////////////////////////////////////////////////////////////////
//
//   <td>    arsort(a)
//
//   <td>     returns an array of associative array (a)  
//                 keys sorted by member values(Z-A)
//                 
//                 
//
////////////////////////////////////////////////////////////////////

	function arsort(a) {
		var b=new Array();
		var c=new Array();
		for(g in a) {
			b[b.length]=zero_prefix(a[g])+'\t'+g;
			}
		b=b.sort();
		b=b.reverse();
		for(var i=0; i<b.length;i++) {
			pairs=b[i].split("\t");
			c[c.length]=pairs[1];
			}

		return c;
		}

////////////////////////////////////////////////////////////////////
//
//   <td>    ksort(a)
//
//   <td>     returns an array of associative array (a) 
//                 keys sorted by member keys (A-Z) 
//                 
//                 
//
////////////////////////////////////////////////////////////////////

	function ksort(a) {
		var b=new Array();
		var c=new Array();
		for(keys in a) {
			b[b.length]=keys+'\t'+a[keys];
			}
		b=b.sort();
		for(var i=0;i<b.length;i++) {
			pairs=b[i].split("\t");
			if(pairs[0]!="") c[c.length]=pairs[0];		
			}
		return c;
		}


////////////////////////////////////////////////////////////////////
//
//   <td>    krsort(a)
//
//   <td>     returns an array of associative array (a) 
//                 keys reverse sorted by member keys (Z-A) 
//                 
//                 
//
////////////////////////////////////////////////////////////////////

	function krsort(a) {
		var b=new Array();
		var c=new Array();
		for(keys in a) {
			b[b.length]=keys+'\t'+a[keys];
			}
		b=b.sort().reverse();
		for(var i=0;i<b.length;i++) {
			pairs=b[i].split("\t");
			if(pairs[0]!="") c[c.length]=pairs[0];		
			}
		return c;
		}

////////////////////////////////////////////////////////////////////
//
//   <td>    osort(a)
//
//   <td>     returns an array of array indices (a) 
//                 keys sorted by member keys (A-Z) 
//                 
//                 
//
////////////////////////////////////////////////////////////////////

	function osort(a,p) {
		var b=new Array();
		var c=new Array();
		for(g in a) {
			b[b.length]=zero_prefix(a[g][p])+'\t'+g;
			}
		b=b.sort();
		b=b.reverse();
		for(var i=0; i<b.length;i++) {
			pairs=b[i].split("\t");
			c[c.length]=pairs[1];
			}
		return c;
		}


////////////////////////////////////////////////////////////////////
//
//   <td>    zero_prefix(str)
//
//   <td>     pre-appends zeros to a number string enabling
//                 quasi-numeric sort of ASCII values
//                 
//                 
//
////////////////////////////////////////////////////////////////////


	function zero_prefix(str) {
		var xstr=str+"";
		if(xstr.match(/^[\d\.]+$/)) {
			prefix="";
			prelen= 10 - ((xstr.indexOf(".")>-1)?xstr.indexOf("."):xstr.length);
			for(e=0;e<prelen;e++) {prefix=prefix+"0";}
			xstr = prefix+""+str;
			}
		return xstr;	
		}
	




/* ------------------------------------------------------------------ *\
	GLOBAL: COOKIES
\* ------------------------------------------------------------------ */

// C.<td><td> SET COOKIE //
function Set_Cookie(name,value) {
	var args = Set_Cookie.arguments;
	this.name = name;
	this.value = value;
	this.expires = ((args[2])?args[2] : "");
	this.path = ((args[3])?args[3] : "");
	this.domain = ((args[4])?args[4] : "");
	this.secure = ((args[5])?args[5] : "");	
    document.cookie = this.name + "=" +escape(this.value) +
        ( (this.expires) ? ";expires=" + this.expires.toGMTString() : "") +
        ( (this.path) ? ";path=" + this.path : "") + 
        ( (this.domain) ? ";domain=" + this.domain : "") +
        ( (this.secure) ? ";secure" : "");
	}

// C.<td><td> RESET COOKIE //	
function Reset_Cookie(name,value) {
	var args = Reset_Cookie.arguments;
	var now = new Date();
	var name = name;
	var value = value;
	var expires = new Date(now.getTime() + (1 * 86400000));
	var path = (args[1])?args[1]:"";
	var domain = (args[2])?args[2]:"";
	Set_Cookie(name,value,expires,path,domain)
	}

// C.<td><td> GET COOKIEs //
function Get_Cookie(name) {
	var start = document.cookie.indexOf(name+"=");
	var len = start+name.length+1;
    if ((!start) && (name != document.cookie.substring(0,name.length))) return null;
    if (start == -1) return null;
    var end = document.cookie.indexOf(";",len);
    if (end == -1) end = document.cookie.length;
    return unescape(document.cookie.substring(len,end));
	}


// C.<td><td> KILL COOKIE //	
function Kill_Cookie(name) {
	var args = Kill_Cookie.arguments;
	var today = new Date();
	this.name=name;
	this.value="";
	this.path =(args[1])?args[1]:"";
	this.domain =(args[2])?args[2]:"";
	this.expires=new Date(today.getTime() - (1 * 86400000));
	Set_Cookie(this.name,this.value,this.expires,this.path,this.domain);
	}



function default_css() {
	var d_css = "<style>";
		d_css+= "body,table,select,input,textarea,button{font-family:'Arial',sans-serif;font-size:10px;}";
		d_css+= "td{vertical-align:top;padding:4px;}";
		d_css+= "button,textarea,select{width:100%;border-width:1px;}";
		d_css+= "</style>"
	return d_css;
	}




////////////////////////////////////////////////////////////////////
//
//    FUNCTION:    setActiveStyleSheet(title)
//
//    PURPOSE:     resets the active stylesheet to an alternative
//                 stylesheet with a name property equal to title
//                 and sets a cookie named 'style' set to the 
//                 value of title
//
////////////////////////////////////////////////////////////////////

function setActiveStyleSheet(title) {
	var i, a, main;
	for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
		if(a.getAttribute("rel").indexOf("style") != -1
		&& a.getAttribute("title")) {
			a.disabled = true;
			if(a.getAttribute("title") == title) a.disabled = false;
			}
		}
	Set_Cookie('style',title);
	}


//	E.1 AJAX: SKXML
function SFParseXml(xml) {
	var args = SFParseXml.arguments;
	var xml = xml;
	var tag = ((args[1])?args[1]:"item");
	var xItems = new Array;
	var expr = eval("/<"+tag+" [^>]+>/");
	if(items=xml.match(expr)) {
		for (x = 0; (x<items.length); x++) {
			var atts = items[x].match(/\w+=[\'\"][^\'\"]+[\'\"]/g);
			xItems[x] = new Object;
			for(a=0;a<atts.length;a++) {
				pairs = atts[a].replace(/[\'\"]/g,"").split("=");
				xItems[x][pairs[0]] = ((xItems[x][pairs[0]])? xItems[x][pairs[0]] + ','+ pairs[1] : pairs[1]) ;
				}
			}
		}
	return xItems;
	}





//	E.1 AJAX: SKXML
function SKXml(url) {
	var args = SKXml.arguments;
	var tag = ((args[1])?args[1]:"item");
	this[tag]=new Array();	
	var xhReq = new createXMLHttpRequest();
	xhReq.open("GET", url, false);
	xhReq.send(null);
	var xml = this.xml = xhReq.responseXML;
	var itemlist = xml.documentElement.getElementsByTagName(tag);
	for(i=0;i<itemlist.length;i++) {
		this[tag][i] = new Object();
		this[tag][i].nodeValue =((itemlist[i]['firstChild'] )?decode_htmlentities( itemlist[i].firstChild.nodeValue ) :"" );
		for(a=0;a<itemlist[i].attributes.length;a++) {
			this[tag][i][itemlist[i].attributes[a].name] = itemlist[i].getAttribute(itemlist[i].attributes[a].name);
			}
		}
	}


SKXml.prototype.getElements = function(tag) {
	var itemlist = this.xml.documentElement.getElementsByTagName(tag);
	var elements = new Object();
	elements[tag]=new Array();	
	for(i=0;i<itemlist.length;i++) {
		elements[tag][i] = new Object();
		elements[tag][i].nodeValue =((itemlist[i]['firstChild'] )?decode_htmlentities( itemlist[i].firstChild.nodeValue ) :"" );
		for(a=0;a<itemlist[i].attributes.length;a++) {
			elements[tag][i][itemlist[i].attributes[a].name] = itemlist[i].getAttribute(itemlist[i].attributes[a].name);
			}
		}
	return elements[tag];
	}



//	E.2 AJAX: SKTDC
function SKTdc(url) {
	var args = SKTdc.arguments;
	var USE_HEADER_ROW = ((args[1])?args[1]:"");
	var first = ((USE_HEADER_ROW)? 1 : 0);
	this.item = new Array();
	var xhReq = new createXMLHttpRequest();
	xhReq.open("GET", url, false);
	xhReq.send(null);
	var tdc = this.tdc = xhReq.responseText;
	var rows = tdc.split(/[\r\n]+/);
	var keys = this.keys = ((USE_HEADER_ROW)? rows[0].split(/\t/) : ((args[2])?args[2].split(/ *, */):[]));
	for(var i=first;row=rows[i];i++) {
		var index = this.item.length;
		this.item[index] = new Array();
		for(var c=0;col=row.split(/\t/)[c];c++) {
//			this.item[index][c] = col;	
			if(keys[c]) { this.item[index][keys[c]] = col;	}
			}
		}
	this.row = this.item;
	}
//	E.2 AJAX: SKTDC
function SKTdcAsynch(url) {
	var args = SKTdcAsynch.arguments;
	var USE_HEADER_ROW = ((args[1])?args[1]:"");
	var first = ((USE_HEADER_ROW)? 1 : 0);
	this.item = new Array();
	var xhReq = new createXMLHttpRequest();
	xhReq.open("GET", url, true);
	xhReq.onreadystatechange = SKSetHandler(this,'init_tdc');
	xhReq.send(null);
	}

SKTdcAsynch.prototype.init_tdc = function (e,xhReq) {
   	if (xhReq.readyState != 4)  { return; }
	var tdc = this.tdc = xhReq.responseText;
	var rows = tdc.split(/[\r\n]+/);
	var keys = this.keys = ((USE_HEADER_ROW)? rows[0].split(/\t/) : ((args[2])?args[2].split(/ *, */):[]));
	for(var i=first;row=rows[i];i++) {
		var index = this.item.length;
		this.item[index] = new Array();
		for(var c=0;col=row.split(/\t/)[c];c++) {
			this.item[index][c] = col;	
			if(keys[c]) { this.item[index][keys[c]] = col;	}
			}
		}
	this.row = this.item;
	}

	
//	E.2.1 AJAX: SKTDC: XML

SKTdc.prototype.xml = function() {
	var x_xml = "";
	for(var i=0;item=this.item[i];i++) {
		x_xml += "<item ";
		for(key in this.keys) {
			if(item[key]) x_xml += this.keys[key]+"=\""+item[key]+"\" ";
			}
		x_xml +="/>\n";
		}
	return x_xml;
	}



// CATALOG
/*
Catalog.prototype.toc1 = function() {
	var args = Catalog.prototype.toc.arguments;
	var xcategory = (args[0])? args[0] : "";
	var xrestrictions = (args[1])? eval("/"+unescape(args[1]).replace(/\+/g," ")+"/i") : "";
	var xshow = (args[2])? args[2] : "favorites";
	this.selected['index'] = "";
	this.selected['guid'] = "";
	this.active_range = new Array();
	var xtoc = "<TABLE width=100% class=toc cellspacing=1 cellpadding=2>";
	for(i=0;i<this.products.length;i++) {
		if(this.favorites[this.products[i].guid] || xshow == 'all') { 
		if(xcategory == "" || this.products[i].category.toUpperCase() == xcategory.toUpperCase()) { 
		if(xrestrictions == "" 
		   || this.products[i].title.match(xrestrictions)
		   || this.products[i].guid.match(xrestrictions)		   
		   || this.products[i].mfg.match(xrestrictions)) { 
			this.selected['index'] = (this.selected['index']!=="")?this.selected['index'] : i;
			this.selected['guid'] = (this.selected['guid']!=="")?this.selected['guid'] : this.products[i].guid;
			this.active_range[this.active_range.length] = i;
			xtoc+= "<tr class=toc id=tr_"+i+" onclick=dosub('"+i+"',this) ondblclick=dosub2('"+i+"')>";
			xtoc+= "<td class=guid>" + this.products[i].guid.replace(/_/g,"-");
			xtoc+= "<td class=title>" + this.products[i].title.toUpperCase();
			xtoc+= "<td class=category>" + this.products[i].category.toUpperCase();
			xtoc+= "<td class=supplier>" + this.products[i].mfg.toUpperCase();
			xtoc+= "<td class=price align=left>" + this.products[i].price;
			}}}
		}
	xtoc+="<\/TABLE>";
	return xtoc;
	}

*/


// G. DATE() EXTENSIONS

// G.1 DATE() EXTENSIONS: METHODS: DATE (str formats):
Date.prototype.date = function(formats) {
	var fstr = ' '+formats;
		// DAYS
		fstr = fstr.replace(/[\\]/g,"\\\\");
		fstr = fstr.replace(/([^\\])d/g,"$1"+this.numstrings[this.getDate()]);
		fstr = fstr.replace(/([^\\])D/g,"$1"+this.getDayName('D').replace(/(\w)/g,'\\$1'));
		fstr = fstr.replace(/([^\\])j/g,"$1"+this.getDate());
		fstr = fstr.replace(/([^\\])l/g,"$1"+this.getDayName('l').replace(/(\w)/g,'\\$1'));
		fstr = fstr.replace(/([^\\])N/g,"$1"+parseInt(this.getDay())+1);
		fstr = fstr.replace(/([^\\])w/g,"$1"+this.getDay());
		// MONTHS
		fstr = fstr.replace(/([^\\])M/g,"$1"+this.getMonthName('M').replace(/(\w)/g,'\\$1'));
		fstr = fstr.replace(/([^\\])F/g,"$1"+this.getMonthName('F').replace(/(\w)/g,'\\$1'));
		fstr = fstr.replace(/([^\\])m/g,"$1"+this.numstrings[parseInt(this.getMonth())+1]);
		fstr = fstr.replace(/([^\\])n/g,"$1"+(parseInt(this.getMonth())+1));
		// YEARS
		fstr = fstr.replace(/([^\\])Y/g,"$1"+this.getFullYear());
		fstr = fstr.replace(/([^\\])y/g,"$1"+(this.getFullYear()+'').substring(2,4));
		// TIME
		fstr = fstr.replace(/([^\\])a/g,"$1"+this.getMeridiem().replace(/(\w)/g,'\\$1'));
		fstr = fstr.replace(/([^\\])A/g,"$1"+this.getMeridiem().toUpperCase().replace(/(\w)/g,'\\$1'));
		fstr = fstr.replace(/([^\\])g/g,"$1"+this.get12Hours());
		fstr = fstr.replace(/([^\\])G/g,"$1"+this.getHours());
		fstr = fstr.replace(/([^\\])h/g,"$1"+this.numstrings[this.get12Hours()]);
		fstr = fstr.replace(/([^\\])H/g,"$1"+this.numstrings[this.getHours()]);
		fstr = fstr.replace(/([^\\])i/g,"$1"+this.numstrings[this.getMinutes()]);
		fstr = fstr.replace(/([^\\])s/g,"$1"+this.numstrings[this.getSeconds()]);
		fstr = fstr.replace(/([^\\])u/g,"$1"+this.getMilliseconds());
		// TIME ZONE
		fstr = fstr.replace(/([^\\])O/g,"$1"+this.getGMTOffset('O'));
		fstr = fstr.replace(/([^\\])P/g,"$1"+this.getGMTOffset('P'));
		fstr = fstr+"";
		fstr = fstr.replace(/^\s+/,"");
		fstr = fstr.replace(/\s+$/,"");
	return fstr.replace(/\\/g,'');
	}
// G.1 DATE() EXTENSIONS: METHODS: GETMONTHNAME ([ (M | F)] ):
Date.prototype.getMonthName = function() {
	var args = Date.prototype.getMonthName.arguments;
	var key = (args[0])? args[0] : "M";
	return this.strings[key][this.getMonth()];
	}
// G.2 DATE() EXTENSIONS: METHODS: GETDAYNAME ([ (D | l)] ):
Date.prototype.getDayName = function() {
	var args = Date.prototype.getDayName.arguments;
	var key = (args[0])? args[0] : "D";
	return this.strings[key][this.getDay()];
	}

Date.prototype.getMeridiem = function() {
	return ((this.getHours()>11) ? 'pm':'am');
	}

Date.prototype.get12Hours = function() {
	var hours = this.getHours();
	return (hours - ((hours<=12) ? 0 : ((hours<24)? 12 : -12)));
	}
Date.prototype.getGMTOffset = function() {
	var args = Date.prototype.getGMTOffset.arguments;
	var key = (args[0])? args[0] : "O";
	var hours = this.numstrings[parseInt(this.getTimezoneOffset()/60)];
	var minutes = this.numstrings[(this.getTimezoneOffset()%60)];
	return ((this.getTimezoneOffset()>=0)? '+' : '-') + (hours +((key == 'P')? ':' : '')+minutes);
	}


Date.prototype.strings = {
	"M" : ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],
	"F" : ["January","February","March","April","May","June","July","August","September","October","November","December"],
	"m" : ["01","02","03","04","05","06","07","08","09","10","11","12"],
	"D" : ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],
	"l" : ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]
	};

Date.prototype.numstrings = ["00","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60"];


Date.prototype.toUSText = function() {
	var shortnames = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
	return shortnames[this.getMonth()] + " " + this.getDate() + ", " + this.getFullYear();
	}


