var sprintf = (function() {
	function get_type(variable) {
		return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
	}
	function str_repeat(input, multiplier) {
		for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}
		return output.join('');
	}

	var str_format = function() {
		if (!str_format.cache.hasOwnProperty(arguments[0])) {
			str_format.cache[arguments[0]] = str_format.parse(arguments[0]);
		}
		return str_format.format.call(null, str_format.cache[arguments[0]], arguments);
	};

	str_format.format = function(parse_tree, argv) {
		var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;
		for (i = 0; i < tree_length; i++) {
			node_type = get_type(parse_tree[i]);
			if (node_type === 'string') {
				output.push(parse_tree[i]);
			}
			else if (node_type === 'array') {
				match = parse_tree[i]; // convenience purposes only
				if (match[2]) { // keyword argument
					arg = argv[cursor];
					for (k = 0; k < match[2].length; k++) {
						if (!arg.hasOwnProperty(match[2][k])) {
							throw(sprintf('[sprintf] property "%s" does not exist', match[2][k]));
						}
						arg = arg[match[2][k]];
					}
				}
				else if (match[1]) { // positional argument (explicit)
					arg = argv[match[1]];
				}
				else { // positional argument (implicit)
					arg = argv[cursor++];
				}

				if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {
					throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));
				}
				switch (match[8]) {
					case 'b': arg = arg.toString(2); break;
					case 'c': arg = String.fromCharCode(arg); break;
					case 'd': arg = parseInt(arg, 10); break;
					case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;
					case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;
					case 'o': arg = arg.toString(8); break;
					case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;
					case 'u': arg = Math.abs(arg); break;
					case 'x': arg = arg.toString(16); break;
					case 'X': arg = arg.toString(16).toUpperCase(); break;
				}
				arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);
				pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';
				pad_length = match[6] - String(arg).length;
				pad = match[6] ? str_repeat(pad_character, pad_length) : '';
				output.push(match[5] ? arg + pad : pad + arg);
			}
		}
		return output.join('');
	};

	str_format.cache = {};

	str_format.parse = function(fmt) {
		var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;
		while (_fmt) {
			if ((match = /^[^\x25]+/.exec(_fmt)) !== null) {
				parse_tree.push(match[0]);
			}
			else if ((match = /^\x25{2}/.exec(_fmt)) !== null) {
				parse_tree.push('%');
			}
			else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {
				if (match[2]) {
					arg_names |= 1;
					var field_list = [], replacement_field = match[2], field_match = [];
					if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
						field_list.push(field_match[1]);
						while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
							if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
								field_list.push(field_match[1]);
							}
							else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) {
								field_list.push(field_match[1]);
							}
							else {
								throw('[sprintf] huh?');
							}
						}
					}
					else {
						throw('[sprintf] huh?');
					}
					match[2] = field_list;
				}
				else {
					arg_names |= 2;
				}
				if (arg_names === 3) {
					throw('[sprintf] mixing positional and named placeholders is not (yet) supported');
				}
				parse_tree.push(match);
			}
			else {
				throw('[sprintf] huh?');
			}
			_fmt = _fmt.substring(match[0].length);
		}
		return parse_tree;
	};

	return str_format;
})();

var vsprintf = function(fmt, argv) {
	argv.unshift(fmt);
	return sprintf.apply(null, argv);
};

function wopen(url, name, w, h)
{
// Fudge factors for window decoration space.
w += 32;
h += 96;
 var win = window.open(url,
  name,
  'width=' + w + ', height=' + h + ', ' +
  'location=no, menubar=no, ' +
  'status=no, toolbar=no, scrollbars=yes, resizable=no, top=150, left=230');
 win.resizeTo(w, h);
 win.focus();
}

function textCounter(field, countfield, maxlimit) {
if (field.value.length > maxlimit) 
	field.value = field.value.substring(0, maxlimit);
else 
	countfield.value = maxlimit - field.value.length;
}

function vCheckCountryValue() {
	var nCountrySelected = document.Register.country.selectedIndex; 

	// 	top:-114px;
	// Option 2 is "other"
	
	if (nCountrySelected == "2") {
		document.getElementById("statetext").style.display = "none";
		document.Register.state.style.display = "none";
		document.getElementById("statemarker").style.display = "none";
		
		document.getElementById("countrytext").style.display = "table-cell";
		document.Register.other_country.style.display = "inline";
		document.getElementById("countrymarker").style.display = "table-cell";
	}
	else {
		document.getElementById("statetext").style.display = "table-cell";
		document.Register.state.style.display = "inline";
		document.getElementById("statemarker").style.display = "table-cell";
		
		if (document.getElementById("countrytext").style.display != "none") {
			document.getElementById("countrytext").style.display = "none";
			document.getElementById("countrymarker").style.display = "none";
		}
		if (document.Register.other_country.style.display != "none") {
			document.Register.other_country.style.display = "none";
		}
	}
}

function roundNumber(num, dec) {
	var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
	return result;
}

function vUpdateShipping() {
	var itemSubtotal = document.getElementById('subtotal');
	var itemTotal = document.getElementById('total');

	var subtotal = parseFloat(itemSubtotal.innerHTML);
	var total = parseFloat(itemTotal.innerHTML);
	
	var shippingDD = document.checkout.shipmethod;
	
	var shippingSelection = shippingDD.options[shippingDD.selectedIndex].text;
	
	var nPos = shippingSelection.indexOf("$");
	var strShipping = shippingSelection.substr(nPos + 1);
	nLength = strShipping.length;
	strShipping = strShipping.substr(0, nLength -1);
	var fShipping = parseFloat(strShipping);
	
	var fNewValue = sprintf("%.02f", Math.round((subtotal + fShipping)*100)/100);
	
	itemTotal.innerHTML =  fNewValue;
}

function vModifyQuantity(nValue) {
	var nAmount = parseInt(nValue);
	
	var nOldValue = parseInt(document.flypage.quantity.value);

	if ((nOldValue + nAmount) < 1)
		return;
		
	document.flypage.quantity.value = (nOldValue + nAmount);
	document.flypagewish.quantity.value = (nOldValue + nAmount);
}

function vUpdateReader() {
	var readerDD = document.flypage.eformat;
	var strReader = readerDD.options[readerDD.selectedIndex].text;
		
	document.flypagewish.eformat.value = strReader;
}

function vRateBook(id, value) {
	new Ajax.Updater( 'rating', '/ratebook.php?id=' + id + '&v='+value + '&r=<?php echo strGetRandomID(); ?>');
}

function vHoverStars(value) {
	var i;
	for (i=1; i<=value; i++) {
		document.getElementById("star" + i).src = "/images/website/star1.png";
	}
	for (i=value+1; i<=5; i++) {
		document.getElementById("star" + i).src = "/images/website/star.png";
	}
}

function updatePurchaseMode() {
	var chosen = "";
	var len = document.flypage.mode.length;

	for (i = 0; i <len; i++) {
		if (document.flypage.mode[i].checked) {
			chosen = document.flypage.mode[i].value;
		}
	}

	if (chosen == "") {
		chosen = "single";
	}
	
	// Chosen is now "single" or "case" based on what they picked.
	
	if (chosen == "single") {
		document.getElementById("caseprice").style.visibility = "hidden";
		document.getElementById("indprice").style.visibility = "visible";
		document.flypage.yncase.value = "N";
		document.flypagewish.yncase.value = "N";
	}
	else if (chosen == "case") {
		document.getElementById("indprice").style.visibility = "hidden";
		document.getElementById("caseprice").style.visibility = "visible";
		document.flypage.yncase.value = "Y";
		document.flypagewish.yncase.value = "Y";
	}
}

