


var forms = {
	keyPressed: false,
	maxValue: 1000000,
	
	activateFocus: function(form) {
		$(form).find("textarea, :text, :password")
			.bind("focus.forms", function() { $(this).parents('.control').addClass('hasfocus') })
			.bind("blur.forms", function() { $(this).parents('.control').removeClass('hasfocus') });
	},
	
	customSelect: function(form) {
		$(form).not('.calculator').find('.customselect').custombox({
			boxType: 'select',
			containerClass: 'custombox-wrapper',
			boxClass: 'custombox',
			contextMenuDisabled: true,
			openOnTab: false,
			debug: false
		});
	},
	
	clean: function(form) {
		$(form)
			.find("input,select,textarea").bind("focus.forms", function() {
				var ctl = $(this).parents(".control");
				$(form).find(".control.hasfocus").not(ctl).removeClass("hasfocus");
			}).end()

			.find("input[name=omniture]").each( function() {
				if ($(this).val() != "") {
					// Set up the omniture interaction (first time changing the form).
					//
					var inputs = $(this).val().split(",");
					for (var i = 0; i < inputs.length; i++) {
						$(form).find("[name=" + inputs[i] + "]").bind("change.omniture", function() {
							forms.omniture(form);
						});
					}
					
				}
			}).end()

			.find(".item.dollar").addClass("numeric").end()
			
			.find(".item.numeric .control input").bind("change.forms", function() {
				var $parent = $(this).closest(".item");

				if (!$(form).data("initialized")) return true;

				var nopunct = $(this).val().replace(/[\.|,]/g,""),
					nochars = nopunct.replace(/[^0-9]/g,""),
					currval = forms.stringToHundreds( $(form).data( $(this).attr("name") ) ),
					newval = forms.stringToHundreds( $(this).val() ),
					shakeit = false;
					
				if (newval != currval) $(this).val( newval );

				if ( nopunct != nochars ) {
					$(this).val( newval );
					shakeit = true;
				}
				
				if ( ( parseFloat( newval ) == 0 && $parent.hasClass("gtzero") ) ) {
					$(this).val( currval );
					shakeit = true;
				}

				if (shakeit) forms.shake(this, 2);
				
			}).bind("keydown.forms", function(e) {
				var returnPress = false;
				switch (e.keyCode) {
					case 10:
					case 13:
						returnPress = true;
					break;
				}

				if (returnPress) {
					e.preventDefault();
					$(this).trigger("change");
				}
			}).end()
			
			.find(".item.dollar .control input").bind("blur.forms", function() {
				$(this).val( forms.dollarsToHundreds( $(this).val() ) ).formatCurrency( { "symbol" : "" } );

			}).bind("keyup.forms", function(e) {
				if (e.keyCode == 16) this.keyPressed = false;
				
			}).unbind("keydown.forms").bind("keydown.forms", function(e) {
				// Check for plus or minus, up arrow or down, then adjust the value by +/- 100.
				//
				var currval = parseFloat( forms.stringToHundreds( $(this).val() ) ),
					prevval = currval;

				// If we're dealing with non-numeric values, don't try to increment or decrement them.
				//
				if (isNaN(currval)) return true;

				// Handle pressing SPACE bar.
				//
				if (e.keyCode == 16) {
					this.keyPressed = true;
					return false;
				}

				switch (e.keyCode) {
					case 38:
					case 107:
						currval += 100;
					break;
					
					case 187:
						if (this.keyPressed) {
							currval += 100;
						}
					break;
					
					case 40:
					case 189:
					case 109:
						currval -= 100;
					break;
				}
				
				if (currval != prevval) {
					if ( currval < 0 ) currval = 0;
					if ( currval > forms.maxValue ) currval = forms.maxValue;
					currval = forms.fixFP(currval);
					
					if (currval == 0 && $(this).closest(".item").hasClass("gtzero")) currval = prevval;

					e.preventDefault();
					
					currval = $("<div></div>").text(currval).formatCurrency( { "symbol" : "" } ).text();
					$(this).val(currval).trigger("change").trigger("focus");
				}
				
			}).bind("keydown.forms", function(e) {
				// Check for the ENTER key being pressed.
				//
				switch (e.keyCode) {
					case 10:
					case 13:
						// Handle a return-key press to force the value to reset.
						//
						$(this).trigger("change").trigger("blur"); // .formatCurrency( {"symbol":""} )
					break;
				}

			}).end()
			
			.find(".item.percent .control input").bind("blur.forms", function() {
				forms.fixPercent(form, this);
			}).end();
	},
	dirty: function(form) {
		// Check to see if the form has been dirtied (i.e. a value has changed).
		//
		$(form).find("input,select,textarea").filter(".pref").bind("change.forms", function() {
			var fieldname = $(this).attr("name"),
				oldvalue = $(form).data( fieldname ),
				newvalue = $(this).val();

			if ( $(this).closest(".item").hasClass(".numeric") ) {
				newvalue = parseFloat( forms.stringToHundreds( newvalue ) );
				oldvalue = parseFloat( forms.stringToHundreds( oldvalue ) );
			}

			if ( newvalue != oldvalue ) {
				$(form).data("dirty", true);
			}
		});
	},
	clearDirty: function(form, interval) {
		setTimeout( function() { $(form).data("dirty", false); }, (interval*1000) );
	},
	
	save: function(form, interval) {
		if (typeof interval == "undefined") {
			interval = 10;
		} else {
			interval = parseInt(interval);
		}
		
		var categoryCode = $(form).attr("id");
		$(form).find("[name=pref-target]").each( function() { categoryCode = $(this).val(); });
		ALLY.prefs.set(form, "categoryCode", categoryCode );

		var prefs = $(form).find(".pref").serialize().replace(/&/g, "|").replace(/=/g, ":");
		ALLY.prefs.set(form, "sitePreference", prefs, interval );

		forms.clearDirty(form, interval);
	},
	
	disable: function(fields) {
		for (var i = 0; i < fields.length; i++) {
			$(fields[i]).parents(".control").addClass("disabled");
		}
	},
	
	loading: function(options) {
		var defaults = {
			form: null,
			action: "remove",
			title: "Populating Calculator..."
		},
		options = $.extend(defaults, options);

		if (!defaults.form) return true;

		$(defaults.form).find(".loading").remove();
		
		switch(defaults.action) {
			case "add":
				var height = ($(defaults.form).height() + 65) + "px";
				var width  = $(defaults.form).width() + "px";
				$(defaults.form).filter(".calc_flash").each( function() { width = $(defaults.form).css("width"); } );
				
				var $load = $(defaults.form).find(".loading").length > 0 ?
						$(defaults.form).find(".loading") :
						$(defaults.form).append("<div class='loading'></div>").find(".loading")
							.append("<img src='" +  contextPath + "/docroot/ally-storefront/images/ajax-loader.gif' alt='" + defaults.title + "' />")
							.append("<h3>" + defaults.title + "</h3>");
				$load.css( { width: width, height: height } );

				$(defaults.form).css({ visibility: "visible" });
			break;
			
			case "remove":
				$(defaults.form).addClass("loaded");
			break;

			default:

			break;
		}
	},
		
	setUnload: function(form) {
		$(form).parents(".tabs")
			.bind("tabsselect.store_" + $(form).attr("id") , function(event, ui) {
				if ( $(form).data("dirty") ) forms.save(form, 0);
				$(form).data("dirty", false);

				$(this).unbind("tabsselect.store_" + $(form).attr("id") )
			});
			
		$(window).bind("beforeunload", function(e) { 
			if ( $(form).data("dirty") ) forms.save(form, 0); 
		});
	},

	strip: function(str) {
		return (str+"").replace(/[^0-9.]/g, "");
	},
	numericHundreds: function(str) {
		var val = forms.stringToHundreds(str);
		return val;
	},
	stringToHundreds: function(str) {
		return forms.stringToNumber(str, 2);
	},
	dollarsToHundreds: function(str) {
		var arr = str.split(".");
		if (arr.length > 2) {
			arr[arr.length] = arr[arr.length-1];
			arr[arr.length-2] = ".";
			str = arr.join();
		}
		return forms.stringToHundreds(str);
	},
	stringToNumber: function(str, precision) {
		if (typeof str == "string") 
			if (str.substr(0,1) == ".") 
				str = "0" + str;

		var newval = forms.strip(str);

		var arr_vals = newval.split(".");
		var whole = parseInt(arr_vals[0]);
		var fract = 0;
		if (arr_vals.length > 1) {
			for (var i = 0; i < precision; i++) {
				if (arr_vals[1].length > i) {
					fract += parseInt( arr_vals[1].substr(i,1) ) * Math.pow(10, precision - i - 1);
				}
			}
		}
		newval = ( (whole * 100 + fract ) / 100 ).toFixed(precision);

		if (isNaN(newval)) newval = 0;
		return newval;
	},
	fixFP: function(val) {
		return parseFloat(val).toFixed(2);
	},
	
	checkShorthand: function(input) {
		// Check for the following in the value "M" "K" or "MM"
		// If these are the only non-numeric characters *and* they're at the end of the field, then treat them as numeric values.
		// M/K = 1000, MM = 1000000
		//
		var newVal = $(input).val().replace(/,/g,'').toLowerCase(),
			curVal = newVal,
			oldVal = $(input).closest("form").data( $(input).attr("name") ),
			stripped = parseFloat( forms.strip(newVal) );

		if (/^[0-9.]*mm$/.test(newVal) ) newVal = stripped * 1000000;
		if (/^[0-9.]*(k|m)$/.test(newVal) ) newVal = stripped * 1000;

		if (newVal != curVal) $(input).val(newVal);
		
		return true;
	},
	
	fixPercent: function(form, inp) {
		var val = forms.numericHundreds ( $(inp).val() ),
			valname = $(inp).attr("name"),
			maxrate = 20;

		if (typeof $(form).data("old"+valname) == "undefined") $(form).data("old"+valname, $(inp).val() );

		if ( val > maxrate || val == 0 ) {
			if ( val == 0 ) { val = parseFloat( $(form).data("old"+valname) ); }
			if ( val > maxrate ) val = maxrate;
	
			if ( $(form).data("initialized") ) forms.shake(inp, 1);
		}
		if (val > 0) {
			$(inp).val( forms.stringToHundreds( val ) );
		}
		
		$(form).data("old"+valname, $(inp).val() );
	},

	omniture: function(form) {
		if (typeof s_gi == "undefined") return true;
		
		var s = s_gi(s_account);
		s.prop12 = s.pageName;
		s.linkTrackVars = "eVar24,eVar29,prop12,events";
		s.linkTrackEvents = "event11";
		s.tl(this, 'o', s.pageName);

		// Remove listener and event information.
		//
		s.events = "";
		s.prop12 = "";
		s.eVar24 = "";

		$(form).find("input,select,textarea").unbind("change.omniture");
	},
	
	shake: function(obj, degree) {
		
		// Do not shake if the load is related to an AJAX update.
		//
		$(obj).closest("form").each( function() {
			if ( !$(this).data("initialized") || !$(this).data("ajax-loaded") ) return true;
		});
		
		var padleft = parseInt( $(obj).css("padding-left").replace("px","") ),
			padright = parseInt( $(obj).css("padding-right").replace("px","") );
			
		if (padleft + padright == 0 || padleft < degree || padright < degree) return true;

		var origpos  = { paddingLeft : padleft + "px", paddingRight : padright + "px" },
			leftpos  = { paddingLeft : (padleft - degree) + "px", paddingRight : (padright + degree) + "px" },
			rightpos = { paddingLeft : (padleft + degree) + "px", paddingRight : (padright - degree) + "px" };
		
		$(obj)
			.animate( leftpos, 15).animate( rightpos, 40)
			.animate( leftpos, 65).animate( rightpos, 30)
			.animate( leftpos, 35).animate( origpos, 20);
	}
}

$(function() {
	$("form").each( function() {
		forms.activateFocus(this);
		forms.customSelect(this);
	});			
	
	(new Image()).src = contextPath + "/docroot/ally-storefront/images/ajax-loader.gif";
});
