sprintfWrapper = {

	init : function () {

		if (typeof arguments == "undefined") { return null; }
		if (arguments.length < 1) { return null; }
		if (typeof arguments[0] != "string") { return null; }
		if (typeof RegExp == "undefined") { return null; }

		var string = arguments[0];
		var exp = new RegExp(/(%([%]|(\-)?(\+|\x20)?(0)?(\d+)?(\.(\d)?)?([bcdfosxX])))/g);
		var matches = new Array();
		var strings = new Array();
		var convCount = 0;
		var stringPosStart = 0;
		var stringPosEnd = 0;
		var matchPosEnd = 0;
		var newString = '';
		var match = null;

		while (match = exp.exec(string)) {
			if (match[9]) { convCount += 1; }

			stringPosStart = matchPosEnd;
			stringPosEnd = exp.lastIndex - match[0].length;
			strings[strings.length] = string.substring(stringPosStart, stringPosEnd);

			matchPosEnd = exp.lastIndex;
			matches[matches.length] = {
				match: match[0],
				left: match[3] ? true : false,
				sign: match[4] || '',
				pad: match[5] || ' ',
				min: match[6] || 0,
				precision: match[8],
				code: match[9] || '%',
				negative: parseInt(arguments[convCount]) < 0 ? true : false,
				argument: String(arguments[convCount])
			};
		}
		strings[strings.length] = string.substring(matchPosEnd);

		if (matches.length == 0) { return string; }
		if ((arguments.length - 1) < convCount) { return null; }

		var code = null;
		var match = null;
		var i = null;

		for (i=0; i<matches.length; i++) {

			if (matches[i].code == '%') { substitution = '%' }
			else if (matches[i].code == 'b') {
				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(2));
				substitution = sprintfWrapper.convert(matches[i], true);
			}
			else if (matches[i].code == 'c') {
				matches[i].argument = String(String.fromCharCode(parseInt(Math.abs(parseInt(matches[i].argument)))));
				substitution = sprintfWrapper.convert(matches[i], true);
			}
			else if (matches[i].code == 'd') {
				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)));
				substitution = sprintfWrapper.convert(matches[i]);
			}
			else if (matches[i].code == 'f') {
				matches[i].argument = String(Math.abs(parseFloat(matches[i].argument)).toFixed(matches[i].precision ? matches[i].precision : 6));
				substitution = sprintfWrapper.convert(matches[i]);
			}
			else if (matches[i].code == 'o') {
				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(8));
				substitution = sprintfWrapper.convert(matches[i]);
			}
			else if (matches[i].code == 's') {
				matches[i].argument = matches[i].argument.substring(0, matches[i].precision ? matches[i].precision : matches[i].argument.length)
				substitution = sprintfWrapper.convert(matches[i], true);
			}
			else if (matches[i].code == 'x') {
				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(16));
				substitution = sprintfWrapper.convert(matches[i]);
			}
			else if (matches[i].code == 'X') {
				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(16));
				substitution = sprintfWrapper.convert(matches[i]).toUpperCase();
			}
			else {
				substitution = matches[i].match;
			}

			newString += strings[i];
			newString += substitution;

		}
		newString += strings[i];

		return newString;

	},

	convert : function(match, nosign){
		if (nosign) {
			match.sign = '';
		} else {
			match.sign = match.negative ? '-' : match.sign;
		}
		var l = match.min - match.argument.length + 1 - match.sign.length;
		var pad = new Array(l < 0 ? 0 : l).join(match.pad);
		if (!match.left) {
			if (match.pad == "0" || nosign) {
				return match.sign + pad + match.argument;
			} else {
				return pad + match.sign + match.argument;
			}
		} else {
			if (match.pad == "0" || nosign) {
				return match.sign + match.argument + pad.replace(/0/g, ' ');
			} else {
				return match.sign + match.argument + pad;
			}
		}
	}
}

sprintf = sprintfWrapper.init;

$(document).ready(function(){
    $('#slider').slider({ animate: true, min:30, max: 50, value:35,
    change: function(event, ui)
    {
	$("#result").html(ui.value + "%");
    },
    slide: function(event, ui)
    {
	$("#result").html( ui.value + "%");
    }
    }
    );
	$("#bw").focus();
	$("#calc").click(
	function()
	{
		$(this).parents("form").find("input").blur();
		if( $(".formError").length > 0 )
			return;
		$("#calc").html("Re-Calculate");
		$("#net_result").animate(
			{"right" : -11 },
			1000,
			function()
			{
				$("#calc_download").animate({"right" : 0 },1000);
			});
		var a = parseInt($("#bw").val()) *  1.6;
		var b = parseInt($("#color").val()) *  3;
		var c = parseInt($("#photo").val()) * 0.35;
		//var d = ( a + b + c ) * 52;

		var annual = ( a + b ) * 52 * parseInt($("#coverage").val()) / 100;
		annual += (c * 52 /** parseInt($("#coverage").val()) / 100*/);
		//d * parseInt($("#coverage").val()) / 100;
		var savings = parseInt($("#slider").slider('option', 'value')) / 100;
		if (savings == 0)
		{
			savings = 0.3;
		}
		var club = parseInt($("input[@name='club']:checked").val()) / 100;
		if( isNaN(club)) club = 0;
		var e =  1 - savings - club;
		if( e < 0 )
		{
			e = 0;
		}
		var optimized = annual * e;
		optimized = Math.round(optimized*Math.pow(10,2))/Math.pow(10,2);
		var savings = annual - optimized;
		savings = sprintf("%.2f",Math.round(savings*Math.pow(10,2))/Math.pow(10,2));
		annual = sprintf("%.2f", Math.round(annual * Math.pow(10,2) ) / Math.pow(10,2));
		optimized = sprintf("%.2f",optimized);

		$("#annual").html("$" + annual);
		$("#optimized").html("$" + optimized);
		$("#savings").html("$" + savings);
		$("#ink_result").css({"color" : "red", "font-size" : 26}).html("You Overspent <span>$" + savings + "!</span>");
	});
	$("form").validationEngine({
		success :  false,
		allrules : { "percent" : { "regex" : "/^(100|[1-9]|[0-9]{2})\%{0,1}$/",
								   "alertText":"* Range: 1% to 100%"
								 },
					"required":  {
									"regex":"none",
									"alertText":"* This field is required",
									"alertTextCheckboxMultiple":"* Please select an option",
									"alertTextCheckboxe":"* This checkbox is required"
								 },
					 "number":{
						"regex":"/^[0-9]+$/",
						"alertText":"* Numbers only"}
					},
		failure : function() {}});
  });
