// carte.js
//
// Copyright © 2005 Drakware

var cat_arr = new Array();
var cat_add_state = 0;
var cat_current = 0;

var cart_arr = new Array(); // global cart items
var cart_del_state = 0;
var cart_sort_method = 'namea';
var timerID = null;

var iv_arr = new Array();
var iv_add_state = 0;

var cart_save_blocking = 0;
var cart_save_timer = null;

var lasthref = '';
var argtimer = null;

function argwatch() {
	check_args();
	clearTimeout(argtimer);
	argtimer = setTimeout("argwatch()", 250);
}

function check_args() {
	var thref = document.location.href;
	if (thref == lasthref) return;
	lasthref = thref;

	var ret = handle_hash_marker(thref); // returns 0 or an array of CArg objects
	if (ret == 0) { // no args
		mainview();
	} else {
		var t = get_arg('t', ret);
		if (t == "catview") {
			var id = get_arg('id', ret);
			var start = get_arg('start', ret);
			var order = get_arg('order', ret);
			var cstart = get_arg('cstart', ret);
			if (cstart == 'search') {
				var q = get_arg('q', ret);
				catview(id,start,order,'search',q);
			} else {
				catview(id, start, order, cstart);
			}
		} else if (t == "mainview") {
			var start = get_arg('start', ret);
			mainview(start);
		} else if (t == "newview") {
			var start = get_arg('start', ret);
			var order = get_arg('order', ret);
			newview(start,order);
		} else if (t == "search") {
			var q = get_arg('q', ret);
			search_submit(q);
		}
	}
}
function get_arg(key, arr) {
	for (var i=0; i<arr.length; i++) {
		if (arr[i].key == key) {
			return arr[i].value;
		}
	}
	return '';
}
function CArg(key, value) {
	this.key = key;
	this.value = value;
}
function handle_hash_marker(str) {
	var finalargs = new Array();
	var tmp = new Array();
	tmp = str.split('#');
	if (tmp.length < 2) { return 0; }
	
	var argstr = tmp[1];
	var args = new Array();
	args = argstr.split('&');
	
	for (var i=0; i<args.length; i++) {
		tmp = args[i].split('=');
		var newarg = new CArg(tmp[0], tmp[1]);
		finalargs.push(newarg);
	}
	
	return finalargs;
}


// Item constructor
function CItem(name, category, pic, price, pcents, type, iqty, itemid, catalogid, qty, incat) {
	this.name = name;
	this.category = category;
	this.pic = pic;
	this.price = price;
	this.pcents = pcents;
	this.type = type;
	this.iqty = iqty;
	this.itemid = itemid;
	this.catalogid = catalogid;
	this.qty = qty;
	this.incat = incat;
}

function cat_add_item(name, category, pic, price, pcents, type, iqty, itemid, catalogid, qty, incat) {
	// called for each item when we display a category
	var item = new CItem(
		name,
		category,
		pic,
		price,
		pcents,
		type,
		iqty,
		itemid,
		catalogid,
		0,
		0
	);
	cat_arr.push(item);
}
function clear_cat() {
	cat_arr.splice(0,cat_arr.length);
}

function iv_add_mdown_vis(index) {
	var elup = document.getElementById("iv_add_up_" + index);
	var eldown = document.getElementById("iv_add_down_" + index);
	elup.style.visibility = 'hidden';
	eldown.style.visibility = 'visible';
}
function iv_add_mup_vis(index) {
	var elup = document.getElementById("iv_add_up_" + index);
	var eldown = document.getElementById("iv_add_down_" + index);
	elup.style.visibility = 'visible';
	eldown.style.visibility = 'hidden';	
}
function iv_add_click(index) {
	iv_add_mdown(index);
	iv_add_mup(index);
}
function iv_add_mdown(index) {
//	iv_add_mdown_vis(index);
	iv_add_state = index;
}
function iv_add_mup(index) {
//	iv_add_mup_vis(index);
	if (iv_add_state == index) { // click
		// create a new item here - js defaults to passing a reference
		if (isNaN(document.getElementById('iv_' + index + '_qty').value)) { document.getElementById('iv_' + index + '_qty').value = 1; }
		var item = new CItem(
			iv_arr[index].name,
			iv_arr[index].category,
			iv_arr[index].pic,
			iv_arr[index].price,
			iv_arr[index].pcents,
			iv_arr[index].type,
			iv_arr[index].iqty,
			iv_arr[index].itemid,
			iv_arr[index].catalogid,
			// maybe update this dynamically when they enter a value
			document.getElementById('iv_' + index + '_qty').value * 1,  // *1 converts to an int easily
			iv_arr[index].incat
			);
		add_to_cart(item);
	}
	iv_add_state = 0;
}
function iv_add_click(index) {
	iv_add_mdown(index);
	iv_add_mup(index);
}
function iv_add_keydown(event, id) {
	var el = document.getElementById('iv_' + id + '_qty');
	var IE = (document.all) ? 1 : 0;

	if (event == null) event = window.event;
	if (event) {
		var key = event.keyCode;

		switch(key) {
			case KC_ENTER:
				if (!IE) break;
				if (!event.ctrlKey && !event.shiftKey) {
					el.select();
					iv_add_mdown(id);
					iv_add_mup(id);
					input_stopevent(event);
				}
				break;
			default:
				break;
		}
	}
}
function iv_add_keypress(event, index) {
	var el = document.getElementById('iv_' + index + '_qty');
	var IE = (document.all) ? 1 : 0;	// check for IE

	if (event == null) event = window.event;

	var key = event.keyCode;
	if ( key == 0 ) keyCode = event.charCode;
	if ( key == 0 ) key = event.which;

	switch (key) {
		case KC_ENTER:
			if (!event.ctrlKey && !event.shiftKey) {
				el.select();
				iv_add_mdown(index);
				iv_add_mup(index);
				input_stopevent(event);
			}
			break;
		default:
			break;
	}
}

function cart_add_keydown(event, id) {
	var el = document.getElementById('cat_' + id + '_qty');
	var IE = (document.all) ? 1 : 0;

	if (event == null) event = window.event;
	if (event) {
		var key = event.keyCode;

		switch(key) {
			case KC_ENTER:
				if (!IE) break;
				if (!event.ctrlKey && !event.shiftKey) {
					el.select();
					cart_add_mdown(id);
					cart_add_mup(id);
					input_stopevent(event);
				}
				break;
			default:
				break;
		}
	}
}

function cart_add_keypress(event, index) {
	var el = document.getElementById('cat_' + index + '_qty');
	var IE = (document.all) ? 1 : 0;	// check for IE

	if (event == null) event = window.event;

	var key = event.keyCode;
	if ( key == 0 ) keyCode = event.charCode;
	if ( key == 0 ) key = event.which;

	switch (key) {
		case KC_ENTER:
			if (!event.ctrlKey && !event.shiftKey) {
				el.select();
				cart_add_mdown(index);
				cart_add_mup(index);
				input_stopevent(event);
			}
			break;
		default:
			break;
	}
}

function cart_add_mdown_vis(index) {
	var elup = document.getElementById("cart_add_up_" + index);
	var eldown = document.getElementById("cart_add_down_" + index);
	elup.style.visibility = 'hidden';
	eldown.style.visibility = 'visible';
}
function cart_add_mup_vis(index) {
	var elup = document.getElementById("cart_add_up_" + index);
	var eldown = document.getElementById("cart_add_down_" + index);
	elup.style.visibility = 'visible';
	eldown.style.visibility = 'hidden';	
}
function cart_add_click(index) {
	cart_add_mdown(index);
	cart_add_mup(index);
}
function cart_add_mdown(index) {
//	cart_add_mdown_vis(index);
	cat_add_state = index;
}
function cart_add_mup(index) {
//	cart_add_mup_vis(index);
	if (cat_add_state == index) { // click
		// create a new item here - js defaults to passing a reference
		if (isNaN(document.getElementById('cat_' + index + '_qty').value)) { document.getElementById('cat_' + index + '_qty').value = 1; }
		var item = new CItem(
			cat_arr[index].name,
			cat_arr[index].category,
			cat_arr[index].pic,
			cat_arr[index].price,
			cat_arr[index].pcents,
			cat_arr[index].type,
			cat_arr[index].iqty,
			cat_arr[index].itemid,
			cat_arr[index].catalogid,
			// maybe update this dynamically when they enter a value
			document.getElementById('cat_' + index + '_qty').value * 1,  // *1 converts to an int easily
			cat_arr[index].incat
			);
		add_to_cart(item);
	}
	cat_add_state = 0;
}

function cart_add_click(index) {
		cart_add_mdown(index);
		cart_add_mup(index);
}


function add_to_cart(item) {
	// check if we already have this item in the cart (you DO have unique item numbers, right?)
	for (var i = 0; i < cart_arr.length; i++) {
		if (cart_arr[i].catalogid == item.catalogid) {
			cart_arr[i].qty = (cart_arr[i].qty *1) + item.qty;
			//update_cart();
			// instead of updating the whole cart, just rewrite the price - makes the process smoother
			update_cart_ttl(i);
			cart_highlight(i, 'qtyup');
			return;
		}
	}

	// Add a new item
	cart_arr.push(item);
	cart_sort();
	update_cart();
}

function cart_del_mdown(index) {
	cart_del_state = index;
}
function cart_del_mup(index) {
	if (cart_del_state == index) {
		del_from_cart(index);
	}
	cart_del_state = 0;
}
function cart_del(index) {
	del_from_cart(index);
}
function del_from_cart(index) {
//	cat_unhighlight(cart_arr[index].id);
	cart_arr.splice(index,1);
	update_cart();
}

function clear_cart() {
	cart_arr.splice(0,cart_arr.length);
}

function update_cart_ttl(index) {
	var itm = document.getElementById('cart_' + index + '_ttl');
	var newstr = '';
	newstr = calcEuroPrice(cart_arr[index].price, cart_arr[index].pcents, cart_arr[index].qty);
	itm.innerHTML = newstr;

	var itmq = document.getElementById('cart_' + index + '_qty');
	itmq.value = cart_arr[index].qty;

	update_checkout_total();
}

function cart_highlight(index, type) {
	var itm = document.getElementById('cart_it_' + index);
	if (itm) {
		if (type == 'qtyup') {
			itm.className = 'cart_it cart_itqtyup';
			timerID = setTimeout('cart_unhighlight(' + index + ')', 1000);
		} else if (type == 'samecat') {
			itm.className = 'cart_it cart_itcur';
		} else if (type == 'activeitem') {
			itm.className = 'cart_it cart_itactive';
		}
	}
}

function cart_unhighlight(index) {
	var itm = document.getElementById('cart_it_' + index);
	if (itm) {
		if (cart_arr[index].incat == 1) {
			itm.className = 'cart_it cart_itcur';
		} else {
			itm.className = 'cart_it';
		}
	}
}

//////////////////
// KEYDOWN EVENTS
//////////////////

function cart_update_quantity_keydown(event, index) {
	var el = document.getElementById('cart_' + index + '_qty');
	var IE = (document.all) ? 1 : 0;

	if (event == null) event = window.event;
	if (event) {
		var key = event.keyCode;

		switch(key) {
			case KC_ENTER:
			case KC_TAB:
				if (!IE) break;
				if (!event.ctrlKey && !event.shiftKey) {
					el.select();
					update_quantity(index);
					input_stopevent(event);
				}
				break;
			default:
				break;
		}
	}
}
function cart_update_quantity_keypress(event,index) {
	var el = document.getElementById('cart_' + index + '_qty');
	var IE = (document.all) ? 1 : 0;	// check for IE

	if (event == null) event = window.event;

	var key = event.keyCode;
	if ( key == 0 ) keyCode = event.charCode;
	if ( key == 0 ) key = event.which;

	switch (key) {
		case KC_ENTER:
		case KC_TAB:
			if (!event.ctrlKey && !event.shiftKey) {
				el.select();
				update_quantity(index);
				input_stopevent(event);
			}
			break;
		default:
			break;
	}
}


function update_quantity(index) {
	var el = document.getElementById('cart_' + index + '_qty');
	var newqty = el.value *1;
	if (isNaN(newqty)) {
		el.value = 1;
		newqty = 1;
//		return;	
	}
	if (newqty < 1) {
		del_from_cart(index);
		return;
	}
	if (cart_arr[index].qty != newqty) {
		cart_arr[index].qty = newqty;
		//update_cart();
		//cart_sort();
		update_cart_ttl(index);

		cart_highlight(index, 'qtyup');
//		cat_highlight(index, 'qtyup');
	}
}

function calc_checkout_total() {
	var totalprice = 0;
	var totalcents = 0;
	for (var i = 0; i < cart_arr.length; i++) {
		totalprice += cart_arr[i].price * cart_arr[i].qty; // *1 = convert to float
		totalcents += cart_arr[i].pcents * cart_arr[i].qty;
	}

	return calcEuroPrice(totalprice, totalcents, 1);
}

function update_checkout_total() {
//	document.getElementById("ttlamount").innerHTML = addCommas(round2(total));
	document.getElementById("checkout_subtotal").innerHTML = calc_checkout_total();

//	if (checkout_visible == 1) {
		// re-calc shipping, tax again
//		checkout_get_tax();
//		checkout_get_shipping(); // this updates total as well, because it has to get data from an external source
//	}								// if we updated the total instantly, it'd get an old value
}

function change_cart_sort() {
	cart_sort_method = document.getElementById("cart_sort_sel").value;
	if (cart_sort_method == '') return;

	cart_sort();
	update_cart();
}

function cart_sort() {
	if (cart_sort_method == 'order_added') {
		return;
	} else if (cart_sort_method == 'namea') {
		cart_arr.sort(cart_sort_compare_namea);
	} else if (cart_sort_method == 'namez') {
		cart_arr.sort(cart_sort_compare_namez);
	} else if (cart_sort_method == 'quantitylh') {
		cart_arr.sort(cart_sort_compare_qtylh);
	} else if (cart_sort_method == 'quantityhl') {
		cart_arr.sort(cart_sort_compare_qtyhl);
	} else if (cart_sort_method == 'pricelh') {
		cart_arr.sort(cart_sort_compare_pricelh);
	} else if (cart_sort_method == 'pricehl') {
		cart_arr.sort(cart_sort_compare_pricehl);
	} else if (cart_sort_method == 'pricetotallh') {
		cart_arr.sort(cart_sort_compare_pricetotallh);
	} else if (cart_sort_method == 'pricetotalhl') {
		cart_arr.sort(cart_sort_compare_pricetotalhl);
	}
}
function cart_sort_compare_namea(a,b) {
	var str1 = a.name;
	var str2 = b.name;
	return str1>str2?1:str1<str2?-1:0;
}
function cart_sort_compare_namez(a,b) {
	var str1 = a.name;
	var str2 = b.name;
	return str1<str2?1:str1>str2?-1:0;
}
function cart_sort_compare_qtylh(a,b) {
	var q1 = a.qty*1;
	var q2 = b.qty*1;
	return q1>q2?1:q1<q2?-1:0;
}
function cart_sort_compare_qtyhl(a,b) {
	var q1 = a.qty*1;
	var q2 = b.qty*1;
	return q1<q2?1:q1>q2?-1:0;
}
function cart_sort_compare_pricelh(a,b) {
	var q1 = a.price*1;
	var q2 = b.price*1;
	return q1>q2?1:q1<q2?-1:0;
}
function cart_sort_compare_pricehl(a,b) {
	var q1 = a.price*1;
	var q2 = b.price*1;
	return q1<q2?1:q1>q2?-1:0;
}
function cart_sort_compare_pricetotallh(a,b) {
	var q1 = a.price * a.qty;
	var q2 = b.price * b.qty;
	return q1>q2?1:q1<q2?-1:0;
}
function cart_sort_compare_pricetotalhl(a,b) {
	var q1 = a.price * a.qty;
	var q2 = b.price * b.qty;
	return q1<q2?1:q1>q2?-1:0;
}

function update_cart() {
	var mainel = document.getElementById("cartmain");
	var mainstr = "";

	// first the items in the same category (this is kind of sloppy)
	for (var i = 0; i < cart_arr.length; i++) {
		if (cat_current > -1 && cart_arr[i].category == cat_current) {
			mainstr += '<div class="cart_it cart_itcur" id="cart_it_' + i + '">\n';
			mainstr += '	<img src="item_img/' + cart_arr[i].pic + 't.jpg" />\n';
			mainstr += '	<div class="title"><a href="javascript:itemview(' + cart_arr[i].itemid + ');">' + cart_arr[i].name + '</a></div>\n';
			mainstr += '	<div class="info">' + cart_arr[i].iqty + ' ' + cart_arr[i].type + '</div>\n';
			mainstr += '	<div class="price"><input id="cart_' + i + '_qty" class="qty" type="text" size="1" value="' + cart_arr[i].qty + '" onblur="update_quantity(' + i + ',' + cart_arr[i].id + ');" onfocus="this.select();" onkeypress="cart_update_quantity_keypress(event, ' + i + ');" onkeydown="cart_update_quantity_keydown(event, ' + i + ');" /> &euro; <span id="cart_'+ i +'_ttl">' + calcEuroPrice(cart_arr[i].price, cart_arr[i].pcents, cart_arr[i].qty) + '</span></div>\n';
			mainstr += '	<div class="close-up" onmouseup="cart_del_mup(' + i + ');" onmousedown="cart_del_mdown(' + i + ');"></div>\n';
			mainstr += '	<div class="remove">[<a href="javascript:cart_del(' + i + ');">X</a>]</div>\n';
			mainstr += '</div>\n';
			cart_arr[i].incat = 1;
		}
	}

	// now regular items
	for (var i = 0; i < cart_arr.length; i++) {
		if (cart_arr[i].category != cat_current) {
			mainstr += '<div class="cart_it" id="cart_it_' + i + '">\n';
			mainstr += '	<img src="item_img/' + cart_arr[i].pic + 't.jpg" />\n';
			mainstr += '	<div class="title"><a href="javascript:itemview(' + cart_arr[i].itemid + ');">' + cart_arr[i].name + '</a></div>\n';
			mainstr += '	<div class="info">' + cart_arr[i].iqty + ' ' + cart_arr[i].type + '</div>\n';
			mainstr += '	<div class="price"><input id="cart_' + i + '_qty" class="qty" type="text" size="1" value="' + cart_arr[i].qty + '" onblur="update_quantity(' + i + ',' + cart_arr[i].itemid + ');" onfocus="this.select();" onkeypress="cart_update_quantity_keypress(event, ' + i + ');" onkeydown="cart_update_quantity_keydown(event, ' + i + ');" /> &euro; <span id="cart_'+ i +'_ttl">' + calcEuroPrice(cart_arr[i].price, cart_arr[i].pcents, cart_arr[i].qty) + '</div>\n';
			mainstr += '	<div class="close-up" onmouseup="cart_del_mup(' + i + ');" onmousedown="cart_del_mdown(' + i + ');"></div>\n';
			mainstr += '	<div class="remove">[<a href="javascript:cart_del(' + i + ');">X</a>]</div>\n';
			mainstr += '</div>\n';
			cart_arr[i].incat = 0;
		}
	}
	if (cart_arr.length > 0) {
		checkout_enable();
	} else {
		checkout_disable();
	}

	if (mainstr == "") { mainstr = '<div class="empty">[ Cart Is Empty ]</div>'; }

	// stop highlighting first
	if (timerID) clearTimeout(timerID);

	// update the cart
	mainel.innerHTML = mainstr;

	update_checkout_total();
}

function load_cart_xml() {
	var url = "xmlreq.php?t=cart_load";
	xmlreqGET(url);
}
function load_cart_xml_cb(xmldoc) {
	var cart = xmldoc.getElementsByTagName("cart")[0];
	clear_cart();
	if (getElementText(cart) == "no_data") {
		update_cart();
		return;
	}
	
	var items = cart.getElementsByTagName("item");

	for (var i=0; i < items.length; i++) {
		var newitem = new CItem(
			getChildText(items[i], "name"),
			getChildText(items[i], "category"),
			getChildText(items[i], "pic"),
			getChildText(items[i], "price"),
			getChildText(items[i], "pcents"),
			getChildText(items[i], "type"),
			getChildText(items[i], "iqty"),
			getChildText(items[i], "itemid"),
			getChildText(items[i], "catalogid"),
			getChildText(items[i], "qty"),
			getChildText(items[i], "incat")
		);
		newitem.name = newitem.name.replace('%u201C','“');	// bug?
		newitem.name = newitem.name.replace('%u201E','„');
		cart_arr.push(newitem);
	}

	update_cart();
}
function save_cart_xml() {
	if (cart_arr.length <= 0) return;

	var data = 't=cart_save&cart_xml=' + escape(get_cart_xml());
	var url = "xmlreq.php";
	xmlreqPOST(url, data);
	
	cart_save_blocking = 1;
}
function save_cart_xml_cb(xmldoc) {
	cart_save_blocking = 0;
}
function get_cart_xml() {
	if (cart_arr.length <= 0) { return "<cart>no_data</cart>\n"; }
	
	var xmlstr = '';
	xmlstr += '<cart>\n';
	for (var i = 0; i < cart_arr.length; i++) {
		xmlstr += '	<item>\n';
		xmlstr += '		<name>' + xmlescape(cart_arr[i].name) + '</name>\n';
		xmlstr += '		<category>' + cart_arr[i].category + '</category>\n';
		xmlstr += '		<pic>' + cart_arr[i].pic + '</pic>\n';
		xmlstr += '		<price>' + cart_arr[i].price + '</price>\n';
		xmlstr += '		<pcents>' + cart_arr[i].pcents + '</pcents>\n';
		xmlstr += '		<type>' + xmlescape(cart_arr[i].type) + '</type>\n';
		xmlstr += '		<iqty>' + cart_arr[i].iqty + '</iqty>\n';
		xmlstr += '		<itemid>' + cart_arr[i].itemid + '</itemid>\n';
		xmlstr += '		<catalogid>' + cart_arr[i].catalogid + '</catalogid>\n';
		xmlstr += '		<qty>' + cart_arr[i].qty + '</qty>\n';
		xmlstr += '		<incat>' + cart_arr[i].incat + '</incat>\n';
		xmlstr += '	</item>\n';
	}
	xmlstr += '</cart>\n';
	
	return xmlstr;
}
function get_cart_text() {
	var cstr = '';
	cstr += '<table>\n';
	for (var i = 0; i < cart_arr.length; i++) {
		cstr += '<tr>\n';
		cstr += '<td class="name">' + cart_arr[i].name + '</td>\n';
		cstr += '<td class="iqty">' + cart_arr[i].iqty + ' ' + cart_arr[i].type + '</td>\n';
		cstr += '<td class="qty">' + cart_arr[i].qty + '</td>\n';
		cstr += '<td class="price">&euro; ' + calcEuroPrice(cart_arr[i].price, cart_arr[i].pcents, cart_arr[i].qty) + '</td>\n';
		cstr += '</tr>\n';
	}
	cstr += '</table>\n';
	
	return cstr;
}

// Handy functions

function xmlescape(str) {
	var ret = '';
	for (var i = 0; i < str.length; i++ ) {
		var ch = str.charAt(i);
		switch(ch) {
			case '"':
				ret += '&quot;';
				break;
			case "'":
				ret += '&apos;';
				break;
			case '&':
				ret += '&amp;';
				break;
			case '<':
				ret += '&lt;';
				break;
			case '>':
				ret += '&gt;';
				break;
			default:
				ret += ch;
				break;
		}
	}
	return ret;
}

function getIndexOfId(id) {
	// make this a faster search later
	for (var i = 0; i < cart_arr.length; i++) {
		if (cart_arr[i].id == id) return i;
	}
	return -1;
}

function calcEuroPrice(price, pcents, qty) {
	price = price*1;
	pcents = pcents*1;
	qty = qty*1;
	
	var newcents = new Number((pcents * qty) % 100);
	var newprice = new Number(Math.floor(price * qty));
	var remainder = new Number(Math.floor((pcents * qty) / 100));
	
	newprice += remainder;
	if (newcents < 10 && newcents > 0) { newcents = '0' + newcents; }
	else if (newcents == 0) { newcents = '00'; }
	return newprice + ',' + newcents;
}

function round2(i) {
	var num = new Number(i);
	return num.toFixed(2);
}

function addCommas(str) {
	//  Parse the string to add a comma after each set of 3 numbers
	//  the number will be of the format XX,XXX,XXX,... or X,XXX,XXX,... or XXX,XXX,...
	// We're given a float with 2 decimal places, so set those aside
	var dec = str.substring((str.length - 3), str.length);
	str = str.substring(0, (str.length - 3));

	if (str.length < 4) { return str + dec; }

	var newstr = "";
	var firststr = "";
	var j = str.length % 3;		// get the number of leading characters (2, 1, or 0)
	if (j>0) firststr = str.substring(0,j) + ",";	// put a comma after them, if there are any
	for (var i = (str.length - j); i > 0; i--) {		// loop through the rest of the numbers
		if ((i % 3) == 0) {				// after groups of 3, place a comma (except after the last group, don't want XX,XXX,)
			if (i > 3) newstr = "," + str.substring((i-3)+j, i+j) + newstr;
			else newstr = str.substring((i-3)+j, i+j) + newstr;
		}
	}
	return firststr + newstr + dec;
}

function delCommas(str) {
	var i = str.indexOf(",");
	while (i != -1) {
		str = str.substring(0,i) + str.substring(i+1);

		i = str.indexOf(",");
	}

	return str;
}

function input_stopevent(event) {
	event.returnValue = false;
	if (event.preventDefault) {
		event.preventDefault();
	}
}

// keycodes
var KC_TAB = 9;
var KC_DELETE = 46;
var KC_BACKSPACE = 8;
var KC_LEFT_ARROW = 37;
var KC_RIGHT_ARROW = 39;
var KC_HOME = 36;
var KC_END = 35;
var KC_PAGE_UP = 33;
var KC_PAGE_DOWN = 34;
var KC_UP_ARROW = 38;
var KC_DOWN_ARROW = 40;
var KC_ESC = 27;
var KC_ENTER = 13;
var KC_SPACE = 32;
var KC_COMMA_KEY = 188;
var KC_SEMI_COLON_KEY = 186;
var KC_NBSP = 160;		// ISO 8859-1 and UNICODE non-breaking space
var KC_COMMA = 44;		// ISO 8859-1 and UNICODE comma ','
var KC_SEMI_COLON = 59;	// ISO 8859-1 and UNICODE semi-colon ';'
var KC_S = 83; // capital S
var KC_Ss = 115; // lowercase s
var KC_SHIFT_KEY = 16;
var KC_CTRL_KEY = 17;
var KC_ALT_KEY = 18;
var KC_LEFT_MS_WINDOWS_KEY = 91;
var KC_RIGHT_MS_WINDOWS_KEY = 92;
var KC_MS_MENU_KEY = 93;
//
