        $(document).ready(function() {
								   
            // Quick Form Summary stuff
            $('form#quick input[type=text]').change(function() {
                $('span#selected_' + this.id).text($(this).val());
                toggle_summary();
            });
			
			//creating the summary text
            $('form#quick input[type=text]').keypress(function() { setTimeout("$('form#quick input[type=text]').change()", 100); });
            $('form#quick input[type=radio]').change(function() {
                var value = $('form#quick label[for=' + this.id + ']').text();
                $('span#selected_' + this.name).text(value);
                toggle_summary();
            });
            if (jQuery.browser.msie)
                $('form#quick input[type=radio]').click(function() { $(this).change(); });


            // initialize jquery.ui.sliders
            $('div.slider').slider({
                animate: true,
                min: 1,
                max: 500,
                slide: function(event, el) {
                    // update hidden form and trigger copycat
                    $('form#order input[name=channels]').val(el.value).change();
                }
            });

			// update hidden field "channels" in wizard based on servers/cores
			$('select.htt, select.hst').live($.browser.msie?'click':'change', function() {
				var channels = parseInt($('#fancy_div select.hst').val(), 10) * parseInt($('#fancy_div select.htt').val(), 10);			
				$('#fancy_div span.yellow2').html(channels + ' Channels');
				$('#channels').val(channels);
				store_recalc();
				
			});

            // update sliders when the channel count changes - TODO/copycat:callback
            $('input[name=channels]').change(function() {
                $('div.slider').slider('option', 'value', this.value);
            });

            // update prices when anything changes (slight timeout to ensure copycat has finished) - TODO/hacky
            $('input, select').change(function() {
						
				var form = $('form#quick');
				var price = parseInt(form.find('input[name=channels]').val());						   														
				//check if multplie of 10 and is a number
				//if(hasWhiteSpace(price) && IsNumeric(price)){
	                setTimeout("store_recalc()", 100);
				//}else{
					//do nothing
				//}
				
            });

            // copycat all forms (this will update hidden form#order accordingly)
            $('form').copycat({names: ['channels', 'license', 'platform']});

			// stop all forms from submitting and submit the real (hidden) form#order
			$('form:not(#order)').submit(function(event) {						  
				//event.preventDefault();
				if($(this).attr('id')!='quick'){

						var name = 'howlet-';
						name += $('form#quick input[name=platform]:checked').val();	
						name += '-g729a-';
						name += $('form#quick input[name=license]:checked').val();

						if($(this).attr('id')==='quick2a') {
							$('form#order input[name=custom_channels]').val(50);
							$('form#order input[name=channels]').val(50);
						 } else {
							$('form#order input[name=custom_channels]').val(100);
							$('form#order input[name=channels]').val(100);
						}

				                $('form#order input[name=productname]').val(name);
						
						$.post('/store/cart/add/ajax/', $('form#order').serialize(), function() {
							document.location.href = '/store/checkout';					
						});
					
				}else{

		                	$('form#order').submit();					

				}
									
                return false;
            });

            // prepare the final form data to be what satchmo expects
            $('form#order').submit(function() {
											
                $('form#order input[name=custom_channels]').val(
                $('form#order input[name=channels]').val());
				
                var name = 'howlet-';
				name += $('form#quick input[name=platform]:checked').val();	
                name += '-g729a-';
                name += $('form#quick input[name=license]:checked').val();
				
                $('form#order input[name=productname]').val(name);
                $.post('/store/cart/add/ajax/', $('form#order').serialize(), function() {
                    document.location.href = '/store/checkout';
                });
                return false;
            });

            // only show one platform slider at once
            $('div#sliders_wrapper input[type=checkbox]').change(function() {
                $('div.store_product div[id$=data]:not([id=' + this.id + '-data])').slideUp();
                $('div.store_product div[id=' + this.id + '-data]').slideDown();
            });
        });

        function toggle_summary() {
            var form_complete = false;
            $('form#quick input').each(function() {
                    if (this.type == 'submit' || this.type == 'button' || this.type == 'image')
                            return true;
                    var el = $('form#quick span#selected_' + this.name);
                    form_complete = (el.length && el.text() != '');
                    return form_complete;
            });
            if (form_complete)
                $('form#quick p#order_summary').show();
            else
                $('form#quick p#order_summary').hide();
        };

        function store_recalc() {
            //var form = $('form#quick');
            var price = parseInt($('form#quick input[name=channels]').val());
            
            	$('form#order input[name=license]').val('floating');
            	//Taking the discount into account
            	if(price < 50){
            		price *= 5.99;
					$('#channel').html('$8.99/channel');
            	}else if(price > 49 && price < 100){
            		price *= 5.89;
					$('#channel').html('$8.49/channel');
            	} else if(price > 99){
            	   	price *= 5.79;
					$('#channel').html('$8.19/channel');
            	}else{
					price *= 5.99;
					$('#channel').html('$8.99/channel');
				}
				
            price = sprintf("%.2f", Math.round(price*Math.pow(10,2))/Math.pow(10,2));
            $('span[id$=-total]').text('$' + price);
			$('#price_3').text('$' + price);
            return price;
        }
		
		function updateFirstTime(){
				var channels = parseInt($('#fancy_div select.hst').val(), 10) * parseInt($('#fancy_div select.htt').val(), 10);			
				//alert(channels);
				$('#fancy_div span.yellow2').html(channels + 'Channels');
		}
		
		function IsNumeric(sText) {
		   var ValidChars = "0123456789";
		   var IsNumber=true;
		   var Char;
		 
		   for (i = 0; i < sText.length && IsNumber == true; i++) 
			  { 
			  Char = sText.charAt(i); 
			  if (ValidChars.indexOf(Char) == -1) 
				 {
				 IsNumber = false;
				 }
			  }
		   return IsNumber;
		   
		}
		
		
		//function hasWhiteSpace(s) {
			//return s.indexOf('\s') >= 0;
	//	}
		
		//function hasWhiteSpace(s) {
			//return /\s/g.test(s);
		//}
		
		function sprintf() {
    // Return a formatted string  
    // 
    // version: 909.322
    // discuss at: http://phpjs.org/functions/sprintf
    // +   original by: Ash Searle (http://hexmen.com/blog/)
    // + namespaced by: Michael White (http://getsprink.com)
    // +    tweaked by: Jack
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: Paulo Ricardo F. Santos
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: sprintf("%01.2f", 123.1);
    // *     returns 1: 123.10
    // *     example 2: sprintf("[%10s]", 'monkey');
    // *     returns 2: '[    monkey]'
    // *     example 3: sprintf("[%'#10s]", 'monkey');
    // *     returns 3: '[####monkey]'
    var regex = /%%|%(\d+\$)?([-+\'#0 ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([scboxXuidfegEG])/g;
    var a = arguments, i = 0, format = a[i++];

    // pad()
    var pad = function (str, len, chr, leftJustify) {
        if (!chr) {chr = ' ';}
        var padding = (str.length >= len) ? '' : Array(1 + len - str.length >>> 0).join(chr);
        return leftJustify ? str + padding : padding + str;
    };

    // justify()
    var justify = function (value, prefix, leftJustify, minWidth, zeroPad, customPadChar) {
        var diff = minWidth - value.length;
        if (diff > 0) {
            if (leftJustify || !zeroPad) {
                value = pad(value, minWidth, customPadChar, leftJustify);
            } else {
                value = value.slice(0, prefix.length) + pad('', diff, '0', true) + value.slice(prefix.length);
            }
        }
        return value;
    };

    // formatBaseX()
    var formatBaseX = function (value, base, prefix, leftJustify, minWidth, precision, zeroPad) {
        // Note: casts negative numbers to positive ones
        var number = value >>> 0;
        prefix = prefix && number && {'2': '0b', '8': '0', '16': '0x'}[base] || '';
        value = prefix + pad(number.toString(base), precision || 0, '0', false);
        return justify(value, prefix, leftJustify, minWidth, zeroPad);
    };

    // formatString()
    var formatString = function (value, leftJustify, minWidth, precision, zeroPad, customPadChar) {
        if (precision != null) {
            value = value.slice(0, precision);
        }
        return justify(value, '', leftJustify, minWidth, zeroPad, customPadChar);
    };

    // doFormat()
    var doFormat = function (substring, valueIndex, flags, minWidth, _, precision, type) {
        var number;
        var prefix;
        var method;
        var textTransform;
        var value;

        if (substring == '%%') {return '%';}

        // parse flags
        var leftJustify = false, positivePrefix = '', zeroPad = false, prefixBaseX = false, customPadChar = ' ';
        var flagsl = flags.length;
        for (var j = 0; flags && j < flagsl; j++) {
            switch (flags.charAt(j)) {
                case ' ': positivePrefix = ' '; break;
                case '+': positivePrefix = '+'; break;
                case '-': leftJustify = true; break;
                case "'": customPadChar = flags.charAt(j+1); break;
                case '0': zeroPad = true; break;
                case '#': prefixBaseX = true; break;
            }
        }

        // parameters may be null, undefined, empty-string or real valued
        // we want to ignore null, undefined and empty-string values
        if (!minWidth) {
            minWidth = 0;
        } else if (minWidth == '*') {
            minWidth = +a[i++];
        } else if (minWidth.charAt(0) == '*') {
            minWidth = +a[minWidth.slice(1, -1)];
        } else {
            minWidth = +minWidth;
        }

        // Note: undocumented perl feature:
        if (minWidth < 0) {
            minWidth = -minWidth;
            leftJustify = true;
        }



        if (!isFinite(minWidth)) {
            throw new Error('sprintf: (minimum-)width must be finite');
        }

        if (!precision) {
            precision = 'fFeE'.indexOf(type) > -1 ? 6 : (type == 'd') ? 0 : undefined;
        } else if (precision == '*') {
            precision = +a[i++];
        } else if (precision.charAt(0) == '*') {
            precision = +a[precision.slice(1, -1)];
        } else {
            precision = +precision;
        }

        // grab value using valueIndex if required?
        value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++];

        switch (type) {
            case 's': return formatString(String(value), leftJustify, minWidth, precision, zeroPad, customPadChar);
            case 'c': return formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad);
            case 'b': return formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
            case 'o': return formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
            case 'x': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
            case 'X': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad).toUpperCase();
            case 'u': return formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
            case 'i':
            case 'd':
                number = parseInt(+value, 10);
                prefix = number < 0 ? '-' : positivePrefix;
                value = prefix + pad(String(Math.abs(number)), precision, '0', false);
                return justify(value, prefix, leftJustify, minWidth, zeroPad);
            case 'e':
            case 'E':
            case 'f':
            case 'F':
            case 'g':
            case 'G':
                number = +value;
                prefix = number < 0 ? '-' : positivePrefix;
                method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())];
                textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2];
                value = prefix + Math.abs(number)[method](precision);
                return justify(value, prefix, leftJustify, minWidth, zeroPad)[textTransform]();
            default: return substring;
        }
    };

    return format.replace(regex, doFormat);
}
