/*
 * All script logic for input field replacement.  Certain fields
 * are replaced in order to add CCS styles consistently across
 * different browsers.
 *
 * The code relies on the jQuery JS library to be also loaded.
 *
 * The logic extends the JS namespace app.*
 */

(function(app){
	if (app) {
		/* 
		 * app.inputfield
		 *  
		 * The base code containing all input field replacement
		 * functions.
		 *  
		 */
		app.inputfield = {
				
				/*
				 * app.inputfield.initialize()
				 * 
				 * Starts the input replacement function. 
				 * 
				 */
				initialize: function() {
					jQuery("input, a, button, body").focus(function() {
						app.inputfield.selectbox.blurSelectBoxes();
						app.inputfield.selectbox.hideDropdowns();
					});
					app.inputfield.replaceAll();
				},
				// end initialize: function()

				/*
				 * app.inputfield.initialize(parentContainerId)
				 * 
				 * Starts the input replacement function. 
				 * 
				 */
				initialize: function(parentContainerId) {
					jQuery("#" + parentContainerId).find("input, a, button, body").focus(function() {
						app.inputfield.selectbox.blurSelectBoxes();
						app.inputfield.selectbox.hideDropdowns();
					});
					app.inputfield.replace(parentContainerId);
				},
				// end initialize: function()
				
			/*
			 * app.inputfield.replaceAll()
			 * 
			 * Replaces all valid input fields. 
			 * 
			 */
			replaceAll: function() {
				app.inputfield.replace(null);
			},
			// end replaceAll: function()
			
			/*
			 * app.inputfield.replace(parentContainerId)
			 * 
			 * Replaces all valid input fields within a specific
			 * section of the DOM. 
			 * 
			 */
			replace: function(parentContainerId) {
				if ((navigator.userAgent.indexOf('iPhone') != -1) || (navigator.userAgent.indexOf('iPod') != -1) || (navigator.userAgent.indexOf('iPad') != -1) || (navigator.userAgent.indexOf('Android ') != -1) || (navigator.userAgent.indexOf('BlackBerry') != -1) || (navigator.userAgent.indexOf("MSIE 6")!=-1 ) ) {
					return true;
				}
				
				var selectBoxIDCtr = 0;
				var checkBoxIDCtr = 0;
				var radioIDCtr = 0;
				var spinnerIDCtr = 0;
				var parentContainer = null;
				
				// Get parent container
				if (parentContainerId == null) {
					parentContainer = jQuery("body");
				}
				else {
					parentContainer = jQuery("#" + parentContainerId);
				}
				
				// Replace all select boxes
				parentContainer.find("select").each(function() {
					var selectBox = jQuery(this);

					// Get ID or create a new one
					var selectBoxID = "select-" + selectBox.attr("id");
					if (selectBoxID == "select-") {
						selectBoxID = "select-" + selectBoxIDCtr++;
					}

					// Create the markup for new component
					selectBox.after(
						'<div title="' + selectBox.attr("title") + '" id="' + selectBoxID + '" class="css-select"><div class="input" tabindex="' +  selectBox.attr("tabindex") + '"></div><div class="button"></div><div class="listbutton"></div><ul></ul>' 
					);

					// Copy data and bind events
					var newSelectBox = jQuery("#" + selectBoxID);
					app.inputfield.selectbox.copyInfo(selectBox, newSelectBox);
					app.inputfield.selectbox.bindEvents(selectBox, newSelectBox);

					// Hide original component
					selectBox.hide();
				});
				// end jQuery("select").each

				// Replace all checkboxes
				parentContainer.find('input[type="checkbox"]').each(function() {
					var checkBox = jQuery(this);

					// Get ID or create a new one
					var checkBoxID = "check-" + checkBox.attr("id");
					if (checkBoxID == "check-") {
						checkBoxID = "check-" + checkBoxIDCtr++;
					}
					
					// Create the markup for new component
					checkBox.after(
						'<div title="' + checkBox.attr("title") + '" id="' + checkBoxID + '" class="css-check" tabindex="0"><div class="button"></div><div class="fill"></div></div>' 
					);

					// Copy data and bind events
					var newCheckBox = jQuery("#" + checkBoxID);
					app.inputfield.checkbox.copyInfo(checkBox, newCheckBox);
					app.inputfield.checkbox.bindEvents(checkBox, newCheckBox);

					// Hide original component
					checkBox.hide();
				});
				// end jQuery(input[type="checkbox"]').each

				// Replace all radio buttons
				parentContainer.find('input[type="radio"]').each(function() {
					var radio = jQuery(this);

					// Get ID or create a new one
					var radioID = "radio-" + radio.attr("id");
					if (radioID == "radio-") {
						radioID = "radio-" + radioIDCtr++;
					}
					
					// Create the markup for new component
					radio.after(
						'<div title="' + radio.attr("title") + '" id="' + radioID + '" class="css-radio" tabindex="0"><div class="button"></div><div class="fill"></div></div>' 
					);

					// Copy data and bind events
					var newRadio = jQuery("#" + radioID);
					app.inputfield.radio.copyInfo(radio, newRadio);
					app.inputfield.radio.bindEvents(radio, newRadio);

					// Hide original component
					radio.hide();
				});
				// end jQuery('input[type="radio"]').each				

				// Replace all spinner input fields
				parentContainer.find('input[class="spinner"]').each(function() {
					var spinner = jQuery(this);

					// Get ID or create a new one
					var spinnerID = "spinner-" + spinner.attr("id");
					if (spinnerID == "spinner-") {
						spinnerID = "spinner-" + spinnerIDCtr++;
					}
					
					// Create the markup for new component
					spinner.wrap(
						'<div id="' + spinnerID + '" class="css-spinner" />'	
					);					
					spinner.after(
						'<div class="spinnercontrols"><div class="spinner-up" title="' + spinner.attr("uplabel") + '">' + spinner.attr("uplabel") + '</div><div class="spinner-down" title="' + spinner.attr("downlabel") + '">' + spinner.attr("downlabel") + '</div></div>' 
					);
					
					// Bind events
					var newSpinner = spinner.parent();
					app.inputfield.spinner.copyInfo(newSpinner, spinner);
					app.inputfield.spinner.bindEvents(newSpinner, spinner);
				});
				// end jQuery('input[class="spinner"]').each			
			},
			// end replace: function(parentContainerId)
			
			/*
			 * app.inputfield.selectbox
			 * 
			 * Contains all selectbox replacement functions 
			 * and events. 
			 * 
			 */
			selectbox: {
				/*
				 * app.inputfield.selectbox.blurSelectBoxes()
				 * 
				 * Blurs the input for all selectbox 
				 * replacement fields.
				 * 
				 */
				blurSelectBoxes: function() {
					jQuery(".css-select").each(function() {
						var select = jQuery(this);
						select.removeClass("focus");
					});
				},
				// end blurSelectBoxes: function()

				/*
				 * app.inputfield.selectbox.displayText(selectBox, originalText)
				 * 
				 * Assigns the given text as display text of the given  
				 * selectbox replacement field.  Trims the text 
				 * 
				 */
				displayText: function(selectBox, originalText) {
					var input = selectBox.find(".input");
					var textLength = selectBox.data("textLength");
					if ((textLength == 0) || (originalText.length < textLength)) {
						input.html(originalText);
					}
					else {
						var str = new String(originalText);
						input.html(jQuery.trim(str.substring(0, textLength - 1)) + selectBoxTrimSuffix);
					}
					input.attr("title", originalText);
				},
				// end blurSelectBoxes: function()
				
				/*
				 * app.inputfield.selectbox.hideDropdowns()
				 * 
				 * Hides the dropdown list of all selectbox 
				 * replacement fields.
				 * 
				 */
				hideDropdowns: function() {
					jQuery(".css-select").each(function() {
						var select = jQuery(this);
						select.removeClass("dropdown");
						
						select.find("ul").each(function() {
							var selectList = jQuery(this);
							selectList.hide();
						});						
					});
				},
				// end hideDropdowns: function()
				
				/*
				 * app.inputfield.selectbox.copyInfo(selectBox, newSelect)
				 * 
				 * Copies the <select> info to the replacement 
				 * input field.
				 * 
				 */
				copyInfo: function(selectBox, newSelect) {
					//var component = newSelect.find(".component"); 
					var input = newSelect.find(".active");
					//var button = newSelect.find(".button");
					var listbutton = newSelect.find(".listbutton");
					var list = newSelect.find("ul");

					// Initialize contents
					input.html("");
					list.html("");
					
					list.append('<optgroup style="display:none;" label="' + selectBox.attr("title") + ' Options">');
					
					newSelect.removeData("index");
					
					var textLength = selectBox.attr("textlength")
					if (textLength) {
						newSelect.data("textLength", textLength);
					}
					else {
						newSelect.data("textLength", 0);
					}
					
					var listIndex = new Array();
					
					var selected = false;
					var selectedPos = 0;
					var currentPos = 0;
	                selectBox.children("option").each(function() {
						var option = jQuery(this);
						
						if (option.attr("selected")) {
							selected = true;
							if (option.val() != null && option.val() != '') {							
							 list.append('<li class="selected" val="' + option.val() + '">' + option.html() + '</li>');							 
							}
							app.inputfield.selectbox.displayText(newSelect, option.text());
							selectedPos = currentPos;
						}
						else {
							if (option.val() != null && option.val() != '') {
								list.append('<li val="' + option.val() + '">' + option.html() + '</li>');
							}
						}
						var currentVal = new String(option.text());
						listIndex[currentPos] = currentVal.substring(0,1).toUpperCase();
						currentPos++;
					});
					
					list.append('</optgroup>');
					
					if (!selected) {
						var option =   selectBox.children("option").children("option:first");
						list.children("li:first").attr("class", "selected");
						app.inputfield.selectbox.displayText(newSelect, option.text());
					}

					var listItems = newSelect.find("ul li");
					
					newSelect.data("index", listIndex);
					newSelect.data("selectedPos", selectedPos);
					newSelect.data("length", listItems.length);
					newSelect.find(".input").attr("tabindex", selectBox.attr("tabindex"));
					//selectBox.removeAttr("tabindex");
					listbutton.css("margin-left", (list.width() - listbutton.width()) + "px");
					
				},
				// end copyInfo: function(selectBox, newSelect)
				
				/*
				 * app.inputfield.selectbox.bindEvents(selectBox, newSelect)
				 * 
				 * Binds the <select> events to the replacement 
				 * input field. 
				 * 
				 */
				bindEvents: function(selectBox, newSelect) {
					var form = newSelect.closest("form");
					//var component = newSelect.find(".component"); 
					var input = newSelect.find(".input");
					var button = newSelect.find(".button");
					var listbutton = newSelect.find(".listbutton");
					var list = newSelect.find("ul");
					var listItems = newSelect.find("ul li");

					selectBox.change(function() {
						newSelect.removeClass("dropdown");
						list.hide();
						var currentVal = selectBox.find("option:selected");
						app.inputfield.selectbox.displayText(newSelect, currentVal.text());
						listItems.removeClass("selected");
						var selected = list.find("li[val=\"" + currentVal.attr("value") + "\"]");
						selected.addClass("selected");
						newSelect.data("selectedPos", listItems.index(selected));
					});

					jQuery("body").focus(function() {
						app.inputfield.selectbox.blurSelectBoxes();
						app.inputfield.selectbox.hideDropdowns();
					});
					
					jQuery("body").click(function() {
						//newSelect.removeClass("focus");
						//newSelect.removeClass("dropdown");
						//list.hide();
						app.inputfield.selectbox.blurSelectBoxes();
						app.inputfield.selectbox.hideDropdowns();
					});
					
					listbutton.click(function(event) {
						event.preventDefault();
						event.stopPropagation();
						app.inputfield.selectbox.hideDropdowns();
						if (!jQuery.browser.msie) {
							input.focus();
							newSelect.addClass("focus");						
						} 
						else {
							app.inputfield.selectbox.blurSelectBoxes();
						}
						return false;
					});

					button.click(function(event) {
						event.preventDefault();
						event.stopPropagation();
						app.inputfield.selectbox.hideDropdowns();
						//component.focus();
						if (!jQuery.browser.msie) {
							input.focus();
						} 
						else {
							app.inputfield.selectbox.blurSelectBoxes();
						}
						list.show();
						//alert("C");
						newSelect.addClass("focus");
						newSelect.addClass("dropdown");
						return false;
					});
					
					//component.click(function(event) {
					input.click(function(event) {
						event.preventDefault();
						event.stopPropagation();
						app.inputfield.selectbox.hideDropdowns();
						//component.focus();
						if (!jQuery.browser.msie) {
							input.focus();
						}
						else {
							app.inputfield.selectbox.blurSelectBoxes();
						}
						list.show();
						newSelect.addClass("focus");//DG
						newSelect.addClass("dropdown");
						return false;
					});
					
					//component.focus(function() {
					input.focus(function() {
						app.inputfield.selectbox.blurSelectBoxes();
						app.inputfield.selectbox.hideDropdowns();
						newSelect.addClass("focus");
					});

					//DG commented this blur function to make the dropdown select work.
					//component.blur(function() {
					input.blur(function() {
						newSelect.removeClass("focus");
						//newSelect.removeClass("dropdown");
					});

					//component.keyup(function(event) {
					input.keyup(function(event) {
						switch(event.keyCode)
				        {
							case 9: // tab
								return true;
								break;
				            case 40: //down
				            case 39: //right
								app.inputfield.selectbox.event.selectNext(newSelect, listItems);
				                break;
				            case 38: //up
				            case 37: //left
				            	app.inputfield.selectbox.event.selectPrev(newSelect, listItems);
				                break;
				            case 33: //page up
				            case 36: //home
				            	app.inputfield.selectbox.event.selectFirst(newSelect, listItems);
				                break;
				            case 34: //page down
				            case 35: //end
				            	app.inputfield.selectbox.event.selectLast(newSelect, listItems);
				                break;
				            case 13:
				            case 27:
				                list.hide();
				                break;
				            default:
				            	var indexFound = false;
				            	var selectedPos = newSelect.data("selectedPos");
				            	var index = newSelect.data("index");
				            	var currentPos = selectedPos + 1;
				            	var currentChar = String.fromCharCode(event.which);
				            	
				            	if (currentPos >= index.length) {
				            		currentPos = 0;
				            	}
				            	
				            	while (currentPos != selectedPos) {
				            		if (index[currentPos] == currentChar) {
				            			indexFound = true;
				            			break;
				            		}
				            		currentPos++;
				            		if (currentPos >= index.length) {
				            				currentPos = 0;				       
				            		}
				            		if (currentPos == selectedPos) {
				            			break;
				            		}
				            	}
				            	
				            	if (indexFound) {
				            		app.inputfield.selectbox.event.selectIndex(newSelect, listItems, currentPos);
				            	}
				            	break;
				        }
						newSelect.addClass("focus");
						event.preventDefault();
				        event.stopPropagation();
				        return false;
					});

					//component.keydown(function(event) {
					input.keydown(function(event) {
						if (event.keyCode == 9) {
							// tab
							newSelect.removeClass("focus");
							return true;
						}

						//if (event.keyCode < 97 || event.keyCode > 122){
						//	list.show();
						//	newSelect.addClass("focus");//DG
						//	newSelect.addClass("dropdown");
		            	//}
		            	
						event.preventDefault();
					    event.stopPropagation();
					    return false;
					});

					//component.keypress(function(event) {
					input.keypress(function(event) {
						if (event.keyCode == 9) {
							// tab
							newSelect.removeClass("focus");
							return true;
						}						
						event.preventDefault();
					    event.stopPropagation();
					    return false;
					});
					
					newSelect.click(function(event) {
						event.preventDefault();
						event.stopPropagation();
						app.inputfield.selectbox.hideDropdowns();
						//component.focus();
						if (!jQuery.browser.msie) {
							input.focus();
						}
						else {
							app.inputfield.selectbox.blurSelectBoxes();
						}
						list.show();
						newSelect.addClass("focus");//DG
						newSelect.addClass("dropdown");
						return false;
					});
					
					newSelect.find("li").each(function() {
						var listItem = jQuery(this);
						listItem.hover(
							function() {
								listItem.addClass("active");
							},
							function() {
								listItem.removeClass("active");
							}
						);
						listItem.click(function(event) {
							event.preventDefault();
							event.stopPropagation();
							
							selectBox.val(listItem.attr("val"));
							selectBox.change();
							//component.focus();
							if (!jQuery.browser.msie) {
								input.focus();
								newSelect.addClass("focus");
							}
							else {
								newSelect.removeClass("focus");
							}							
							return false;
						});
					});					
				},
				// end bindEvents: function(selectBox, newSelect)

				/*
				 * app.inputfield.selectbox.update(originalSelectID)
				 * 
				 * Refreshes the data and the events of the given
				 * original selectbox.
				 * 
				 */				
				update: function(originalSelectID) {
					// <![CDATA[
					if ((navigator.userAgent.indexOf('iPhone') != -1) || (navigator.userAgent.indexOf('iPod') != -1) || (navigator.userAgent.indexOf('iPad') != -1)) {
						return true;
					} // ]]>
					var originalSelect = jQuery("#" + originalSelectID);
					var newSelect = jQuery("#select-" + originalSelectID);
					
					app.inputfield.selectbox.copyInfo(originalSelect, newSelect);
					app.inputfield.selectbox.bindEvents(originalSelect, newSelect);					
				},
				// end update: function(originalSelectID)
				
				/*
				 * app.inputfield.selectbox.event
				 * 
				 * Contains all select box replacement events. 
				 * 
				 */
				event: {
					selectPrev: function(selectBox, listItems) {
						var length = selectBox.data("length");
						if (length < 0) { return; }
						var currentPos = selectBox.data("selectedPos");
						if (currentPos - 1 < 0) { return; }
						listItems.eq(currentPos - 1).click();					
					},
					// end selectPrev: function(selectBox, listItems)
					
					selectNext: function(selectBox, listItems) {
						var length = selectBox.data("length");
						if (length < 0) { return; }
						var currentPos = selectBox.data("selectedPos");
						if (currentPos + 1 == length) { return; }
						listItems.eq(currentPos + 1).click();						
					},
					// end selectNext: function(selectBox, listItems)
					
					selectFirst: function(selectBox, listItems) {
						var length = selectBox.data("length");
						if (length < 0) { return; }
						var currentPos = selectBox.data("selectedPos");
						if (currentPos == 0) { return; }
						listItems.eq(0).click();
					},
					// end selectFirst: function(selectBox, listItems)
					
					selectLast: function(selectBox, listItems) {
						var length = selectBox.data("length");
						if (length < 0) { return; }
						var currentPos = selectBox.data("selectedPos");
						if (currentPos == length - 1) { return; }
						listItems.eq(length - 1).click();
					},
					// end selectLast: function(selectBox, listItems)

					selectIndex: function(selectBox, listItems, index) {
						listItems.eq(index).click();
					}
					// end selectIndex: function(selectBox, listItems, index)
				}
				// end app.inputfield.selectbox.event
			},
			// end app.inputfield.selectbox
			
			/*
			 * app.inputfield.checkbox
			 * 
			 * Contains all check box replacement functions 
			 * and events. 
			 * 
			 */
			checkbox: {
				/*
				 * app.inputfield.checkbox.copyInfo(checkBox, newCheck)
				 * 
				 * Copies the <input type="checkbox"> info to the
				 * replacement input field.
				 * 
				 */
				copyInfo: function(checkBox, newCheck) {
					if (checkBox.attr("checked")) {
						newCheck.addClass("checked");
					} else {
						newCheck.removeClass("checked");
					}
					newCheck.attr("tabindex", checkBox.attr("tabindex"));
					checkBox.removeAttr("tabindex");
				},				
				// end copyInfo: function (checkBox, newCheck)
				
				/*
				 * app.inputfield.checkBox.update(originalCheckboxID)
				 * 
				 * Refreshes the data and the events of the given
				 * original checkbox.
				 * 
				 */				
				update: function(originalCheckboxID) {
					var originalCheck = jQuery("#" + originalCheckboxID);
					var newCheck = jQuery("#check-" + originalCheckboxID);
					
					app.inputfield.checkbox.copyInfo(originalCheck, newCheck);
					//app.inputfield.checkbox.bindEvents(originalCheck, newCheck);					
				},
				/*
				 * app.inputfield.checkbox.bindEvents(checkBox, newCheck)
				 * 
				 * Binds the <input type="checkbox"> events to the
				 * replacement input field. 
				 * 
				 */
				bindEvents: function(checkBox, newCheck) {
					var form = newCheck.closest("form");
					var button = newCheck.find(".button");

					checkBox.change(function() {
						if (checkBox.attr("checked")) {
							newCheck.addClass("checked");
						}
						else {
							newCheck.removeClass("checked");
						}
					});

					newCheck.keyup(function(event) {
						switch(event.keyCode)
				        {
				            case 32: //space
				            	button.click();
				                break;
				        }
						event.preventDefault();
				        event.stopPropagation();
				        return false;
					});

					button.click(function() {
						checkBox.click();
						checkBox.change();
						newCheck.focus();
					});

					newCheck.focus(function() {
						newCheck.addClass("focus");
					});

					newCheck.blur(function() {
						newCheck.removeClass("focus");
					});
				}
				// end bindEvents: function(checkBox, newCheck)
			},
			// end app.inputfield.checkbox
			
			/*
			 * app.inputfield.radio
			 * 
			 * Contains all radio button replacement functions 
			 * and events. 
			 * 
			 */
			radio: {
				/*
				 * app.inputfield.radio.copyInfo(radio, newRadio)
				 * 
				 * Copies the <input type="radio"> info to the
				 * replacement input field.
				 * 
				 */
				copyInfo: function(radio, newRadio) {
					if (radio.attr("checked")) {
						newRadio.addClass("selected");
					}
					
					radio.data("newradio", newRadio);
					newRadio.attr("name", radio.attr("name"));
					newRadio.attr("tabindex", radio.attr("tabindex"));
					radio.removeAttr("tabindex");
				},
				// end copyInfo: function (radio, newRadio)
	
				/*
				 * app.inputfield.radio.bindEvents(radio, newRadio)
				 * 
				 * Binds the <input type="radio"> events to the
				 * replacement input field. 
				 * 
				 */
				bindEvents: function(radio, newRadio) {
					var form = newRadio.closest("form");
					var button = newRadio.find(".button");
					
					radio.change(function() {
						
						var selectedID = jQuery('input[name=' + radio.attr("name") + ']:checked').attr("id");
						
						jQuery('.css-radio').each(function(){
							if(jQuery(this).attr("name") == radio.attr("name")) {
								if(jQuery(this).attr("id") == ("radio-" + selectedID)) {
									jQuery(this).addClass("selected");
								} else {
									jQuery(this).removeClass("selected");
								}
							}
						});
						
					});

					newRadio.keyup(function(event) {
						switch(event.keyCode)
				        {
				            case 32: //space
				            	button.click();
				                break;
				        }
						event.preventDefault();
				        event.stopPropagation();
				        return false;
					});

					button.click(function() {
						radio.click();
						radio.change();
						newRadio.focus();
					});	

					newRadio.focus(function() {
						newRadio.addClass("focus");
					});

					newRadio.blur(function() {
						newRadio.removeClass("focus");
					});	
				}
				// end bindEvents: function(radio, newRadio)
			},
			// end app.inputfield.radio	
			
			/*
			 * app.inputfield.spinner
			 * 
			 * Contains all spinner input field replacement functions 
			 * and events. 
			 * 
			 */
			spinner: {	
				/*
				 * app.inputfield.spinner.copyInfo(spinner, inputField)
				 * 
				 * Copies the <input type="checkbox"> info to the
				 * replacement input field.
				 * 
				 */
				copyInfo: function(spinner, inputField) {
					if (inputField.attr("min") == "") {
						app.inputfield.spinner.setMin(inputField, 0);
					}
					else {
						app.inputfield.spinner.setMin(inputField, parseInt(inputField.attr("min")));
					}
					
					if (inputField.attr("max") == "") {
						app.inputfield.spinner.setMax(inputField, 99999);
					}
					else {
						app.inputfield.spinner.setMax(inputField, parseInt(inputField.attr("max")));
					}
				
				},				
				// end copyInfo: function (spinner, inputField)

				/*
				 * app.inputfield.spinner.bindEvents(newSpinner, inputField)
				 * 
				 * Binds the <input class="spinner"> events to the
				 * replacement input field. 
				 * 
				 */
				bindEvents: function(spinner, inputField) {
					var upButton = spinner.find(".spinner-up");
					var downButton = spinner.find(".spinner-down");
					var minValue = app.inputfield.spinner.getMin(inputField);
					var maxValue = app.inputfield.spinner.getMax(inputField);
					
					upButton.click(function() {
						app.inputfield.spinner.event.increment(inputField, maxValue);
					});	

					downButton.click(function() {
						app.inputfield.spinner.event.decrement(inputField, minValue);
					});	
					
					inputField.focus(function(event) {
						app.inputfield.spinner.saveValue(inputField, inputField.val());
						spinner.addClass("focus");
					});
					
					inputField.blur(function(event) {
						var originalVal = inputField.val();
						var valCheck = /^[0-9]+$/;
						var minValue = app.inputfield.spinner.getMin(inputField);
						var maxValue = app.inputfield.spinner.getMax(inputField);
						var newValue;
						
						if (originalVal.match(valCheck)) {
							newValue = parseInt(originalVal); 
						}
						else {
							newValue = parseInt(app.inputfield.spinner.loadValue(inputField));
						}
						
						if (newValue < minValue) {
							newValue = minValue;
						}
						
						if (newValue > maxValue) {
							newValue = maxValue;
						}
						
						inputField.val(newValue);
						app.inputfield.spinner.saveValue(inputField, newValue);
						spinner.removeClass("focus");
					});
					
					inputField.keypress(function(event) {
						switch(event.keyCode)
				        {
							case 8: // backspace
							case 9: // tab
				            case 37: // left
				            case 39: // right
								return true;
								break;
				            case 40: // down
				            	app.inputfield.spinner.event.decrement(inputField, minValue);
				                break;
				            case 38: // up
								app.inputfield.spinner.event.increment(inputField, maxValue);
				                break;
				            case 33: // page up
				            case 35: // end
				            	app.inputfield.spinner.event.setMax(inputField, maxValue);
				                break;
				            case 34: // page down
				            case 36: // home
				            	app.inputfield.spinner.event.setMin(inputField, minValue);
				            	break;
				            default:
				            	return true;
				        }
						event.preventDefault();
				        event.stopPropagation();
				        return false;
					});					
				},
				// end bindEvents: function(spinner, inputField)

				/*
				 * app.inputfield.spinner.setMin(inputField, newMin)
				 * 
				 * Stores the minimum value of the spinner input field.
				 * 
				 */
				setMin: function(inputField, newMin) {
					inputField.data("spinMin", newMin);
				},

				/*
				 * app.inputfield.spinner.getMin(inputField)
				 * 
				 * Retrieves the minimum value of the spinner input field.
				 * 
				 */
				getMin: function(inputField) {
					return inputField.data("spinMin");
				},
				
				/*
				 * app.inputfield.spinner.setMax(inputField, newMax)
				 * 
				 * Stores the maximum value of the spinner input field.
				 * 
				 */
				setMax: function(inputField, newMax) {
					inputField.data("spinMax", newMax);
				},

				/*
				 * app.inputfield.spinner.getMax(inputField)
				 * 
				 * Retrieves the maximum value of the spinner input field.
				 * 
				 */
				getMax: function(inputField) {
					return inputField.data("spinMax");
				},
				
				/*
				 * app.inputfield.spinner.saveValue(inputField, newValue)
				 * 
				 * Stores the value of the spinner input field.
				 * 
				 */
				saveValue: function(inputField, newValue) {
					inputField.data("spinValue", newValue);
					inputField.val(newValue);
				},

				/*
				 * app.inputfield.spinner.loadValue(inputField)
				 * 
				 * Retrieves the value of the spinner input field.
				 * 
				 */
				loadValue: function(inputField) {
					return inputField.data("spinValue");
				},
				
				/*
				 * app.inputfield.spinner.event
				 * 
				 * Contains all spinner input field replacement events. 
				 * 
				 */
				event: {
					increment: function(inputField, maxValue) {
						var value = parseInt(inputField.val()) + 1;
						if (value > maxValue) {
							value = maxValue;
						}
						inputField.val(value);
						inputField.focus();
					},
					// end increment: function(inputField, maxValue)

					decrement: function(inputField, minValue) {
						var value = parseInt(inputField.val()) - 1;
						if (value < minValue) {
							value = minValue;
						}
						inputField.val(value);
						inputField.focus();
					},
					// end decrement: function(inputField, minValue)

					setMin: function(inputField, minValue) {
						inputField.val(minValue);
						inputField.focus();
					},
					// end setMin: function(inputField, minValue)
					
					setMax: function(inputField, maxValue) {
						inputField.val(maxValue);
						inputField.focus();
					}
					// end setMax: function(inputField, maxValue)
				}
				// end app.inputfield.spinner.event
			}
			// end app.inputfield.spinner				
		}
		// end app.inputfield
	} else {
		// namespace has not been defined yet
		alert("cssinputfield.js: app namespace is not loaded yet!");
	}
	// end if (app) 
})(app);
