/* ------------------------------------------------------------
 * PROJECT        : Computer Recycling of Virginia, Inc.
 * FILENAME       : jqforms.js
 * ------------------------------------------------------------
 * DATE CREATED   : 30 Oct 2007
 * LAST UPDATED   : 20 Feb 2008
 * ------------------------------------------------------------
 * AUTHOR(S)      : Kevin Scholl (http://www.ksscholl.com/)
 * ------------------------------------------------------------ */

/* ------------------------------------------------------------
 * JQUERY PLUGINS
 * ------------------------------------------------------------ */

// toggle default value and coloring on form field focus/blur
// usage: $("#elementID").toggleActive(settings);
jQuery.fn.toggleActive = function(settings) {
	settings = jQuery.extend({
		focusBG: "#EEF",
		focusFG: "#000",
		blurBG:  "#FFF",
		blurFG:  "#666"
		}, settings);
	this.each(function() {
		$(this)
			.focus(function() {
				$(this).css({ backgroundColor: settings.focusBG, color: settings.focusFG });
				if (this.value == this.defaultValue) {
					this.value = "";
					}
				})
			.blur(function() {
				$(this).css({ backgroundColor: settings.blurBG, color: settings.blurFG });
				if (this.value == "") {
					this.value = this.defaultValue;
					}
				});
		});
	};

// attaches a character counter to each textarea element in the jQuery object
// usage: $("#elementID").charCounter(max, settings);
// copyright (c) 2007 Tom Deater (http://www.tomdeater.com)
jQuery.fn.charCounter = function(max, settings) {
	max = max || 255;
	settings = $.extend({
		container: "<span style=\"display: block\">",
		classname: "example",
		format: "(maximum " + max + " characters / %1 remaining)",
		pulse: true
		}, settings);
	var p;
	
	function count(el, container) {
		el = $(el);
		if (el.val().length > max) {
			el.val(el.val().substring(0, max));
			if (settings.pulse && !p) {
				pulse(container, true);
				};
			};
		container.html(settings.format.replace(/%1/, (max - el.val().length)));
		};
	
	function pulse(el, again) {
		if (p) {
			window.clearTimeout(p);
			p = null;
			};
		el.animate({ opacity: 0.1 }, 100, function() {
			$(this).animate({ opacity: 1.0 }, 100);
			});
		if (again) {
			p = window.setTimeout(function() { pulse(el) }, 200);
			};
		};
	
	return this.each(function() {
		var container = (!settings.container.match(/^<.+>$/)) 
			? $(settings.container) 
			: $(settings.container)
				.insertAfter(this)
				.addClass(settings.classname);
		$(this)
			.bind("keydown", function() { count(this, container); })
			.bind("keypress", function() { count(this, container); })
			.bind("keyup", function() { count(this, container); })
			.bind("focus", function() { count(this, container); })
			.bind("mouseover", function() { count(this, container); })
			.bind("mouseout", function() { count(this, container); })
			.bind("paste", function() { 
				var me = this;
				setTimeout(function() { count(me, container); }, 10);
				});
		if (this.addEventListener) {
			this.addEventListener('input', function() { count(this, container); }, false);
			};
		count(this, container);
		});
	
	};
		
/* ------------------------------------------------------------
 * 2 COLUMN FORMS
 * ------------------------------------------------------------ */

// toggle user option links
function toggleEditSave(thisLink) {
	$(thisLink)
	  .html($(thisLink).html() == "Edit Info" ? "Save App" : "Edit Info")
	  .attr("class",$(thisLink).attr("class") == "linkEdit" ? "linkSave" : "linkEdit");
	}
function toggleOptionalFields(thisLink) {
	$(thisLink)
	  .html($(thisLink).html() == "Hide Optional Fields" ? "Show Optional Fields" : "Hide Optional Fields")
		.parents("fieldset")
		  .find("ol:not(.actionBtns)")
			.find("li:not(:has(label.required))").toggle();
	}

/* ------------------------------------------------------------
 * FORM OPTIONS
 * ------------------------------------------------------------ */

function selectOption(selBox,textBox){
	var selBoxID = $(selBox).attr("id");
  $("#" + textBox).attr("value",$("#" + selBoxID + " :selected").text());
	}

function addOption(textBox,selBox){
	newOpt  = $("#" + textBox).attr("value");
	if (newOpt)
		// $("#" + selBox).prepend('<option value="' + newOpt + '">' + newOpt + '</option>'); // add to beginning of list
		$("#" + selBox).append('<option value="' + newOpt + '">' + newOpt + '</option>'); // add to end of list
	else {
	  alert("Please enter a new value to transfer...");
		$("#" + textBox).focus();
		}
	}

function removeOption(selBox){
	$("#" + selBox + " :selected").remove();
	}

function moveOption(selSrc,selDst){
  // if at least one option is selected...
  if ($('#' + selSrc)[0].selectedIndex != -1)
	  $('#' + selSrc + ' :selected').remove().appendTo('#' + selDst);
	// ...and if not, alert the user to select one
	else
	  alert("Please select an option from a list.");
	}
	
function moveAllOptions(selSrc,selDst){
	for (i = 0; i < $('#' + selSrc)[0].options.length; i++) {
	  $('#' + selSrc)[0].options[i].selected = "selected";
	  }
  moveOption(selSrc,selDst);
  }

function arrangeOption(selSrc,dir){
  var selList = $('#' + selSrc)[0];
	var selOption = selList.selectedIndex;
	if (selOption < 0)
	  alert("Please select an item in the list.");
	else {
		if(dir == "up" && selOption == 0)
			alert("Already at the top!");
		if(dir == "down" && selOption == selList.options.length - 1)
			alert("Already at the bottom!");
		var toMoveC = selList.options[selOption];
		var optC = new Option(toMoveC.text,toMoveC.value,false,false);
		if(dir == "up" && selOption > 0) {
			var toMoveP = selList.options[selOption - 1];
			var optP = new Option(toMoveP.text,toMoveP.value,false,false);
			selList.options[selOption] = optP;
			selList.options[selOption - 1] = optC;
			selList.selectedIndex = selOption - 1;
			}
		if(dir == "down" && selOption < selList.options.length - 1) {
			var toMoveN = selList.options[selOption + 1];
			var optN = new Option(toMoveN.text,toMoveN.value,false,false);
			selList.options[selOption] = optN;
			selList.options[selOption + 1] = optC;
			selList.selectedIndex = selOption + 1;
			}
		}
	}

/* ------------------------------------------------------------
 * FORM VALIDATION
 * ------------------------------------------------------------ */

String.prototype.trim = function () {
	return this.replace(/^\s*/, "").replace(/\s*$/, "");
	}

function jqTrimForm(frm) {
	$("#" + frm).find("input[type='text'], input[type='password'], textarea").each(function(){	
	if ($(this).val().length > 0)
		$(this).val(($(this).val()).trim());
		});
	}

function jqResetForm(frm) {
	$("input[type='text'], input[type='password'], textarea, select").css("borderColor","#7F9DB9");
	$("#vMessages p").remove();
	$("span.msgLevelError").remove();
	$("span.msgLevelWarn").remove();
	$("fieldset ol li, td").removeClass("errorRow warningRow");
	}

function jqValidateForm(frm) {

	var HAS_ERRORS   = false;
	var HAS_WARNINGS = false;

  var FIELD_ID     = "";
	var RADIO_NAME   = "";
	
	var MSG_ERROR    = "<p class=\"frmFeedback\" style=\"color: #C33;\">Please address the errors noted below...</p>";
	var MSG_WARNING  = "<p class=\"frmFeedback\" style=\"color: #F93;\">Please address the warnings noted below...</p>";
	var MSG_REQUIRED = "<span class=\"msgLevelError\">ERROR: Required field</span>";
	var MSG_FORMAT   = "<span class=\"msgLevelWarn\">WARNING: Incorrect format</span>";
	
	// reset all error messages and indications
  jqResetForm(frm);

	// trim white space before and after value
  jqTrimForm(frm);

	// errors
	$("#" + frm).find("label.required").each(function(){
		
		FIELD_ID  = "#" + $(this).attr("for");
		
		// select boxes and text, password, and textarea fields
		if ($(FIELD_ID).attr("class") != "noValidation" && ($(FIELD_ID).val() == null || $(FIELD_ID).val() == "")) {
    	$(FIELD_ID).parent("li, td").addClass("errorRow").append(MSG_REQUIRED);
    	$(FIELD_ID).css("borderColor","#C33").siblings().not($(".noValidation")).css("borderColor","#C33");
			HAS_ERRORS = true;
			}
    
		// radio button sets
    if ($(FIELD_ID).attr("type") == "radio" && $(FIELD_ID).attr("name") != RADIO_NAME) {
		  RADIO_NAME   = $(FIELD_ID).attr("name");
			var rChecked = "";			
		  var radioObj = document.forms[frm][RADIO_NAME];
			for (var i=0; i < radioObj.length; i++) {
				if (radioObj[i].checked) {
				  rChecked = radioObj[i].value;
					}
				}
			if (rChecked == "") {
      	$(FIELD_ID).parent("li, td").addClass("errorRow").append(MSG_REQUIRED);
				HAS_ERRORS = true;
				}
			}
				
		})

	// warnings, e-mail format
	$("#" + frm).find("label:contains('E-mail'), label:contains('Email')").each(function(){
		FIELD_ID = "#" + $(this).attr("for");
		emailLegal = /[\(\)\<\>\,\;\:\\\/\"\[\]]/;
		emailValid = /^.+@.+\..{2,}$/;
		var emailStr = $(FIELD_ID).attr("value");
		if ((emailLegal.exec(emailStr) || !emailValid.exec(emailStr)) && emailStr != null && emailStr != "") {
			$(FIELD_ID).parent("li, td").addClass("warningRow").append("<span class=\"msgLevelWarn\">WARNING: Incorrect format or illegal characters</span>");
			$(FIELD_ID).css("borderColor","#FF8E00");
			HAS_WARNINGS = true;
			}
    })

	// warnings, social security number format
	$("#" + frm).find("label:contains('SS'), label:contains('Social Security')").each(function(){
		var ssn = "";
		FIELD_ID = "#" + $(this).attr("for");
		if ($(FIELD_ID).parent().children("input")[0].value != "")
			ssn = ssn + $(FIELD_ID).parent().children("input")[0].value;
		if ($(FIELD_ID).parent().children("input")[1].value != "")
			ssn = ssn + $(FIELD_ID).parent().children("input")[1].value;
		if ($(FIELD_ID).parent().children("input")[2].value != "")
			ssn = ssn + $(FIELD_ID).parent().children("input")[2].value;
		if (ssn != "" && ssn.length != 9 || isNaN(ssn))	{
			$(FIELD_ID).siblings("span.msgLevelError").remove(); // removes an existing error message
     	$(FIELD_ID).parent("li, td").addClass("warningRow").append(MSG_FORMAT);
     	$(FIELD_ID).css("borderColor","#FF8E00").siblings("input").css("borderColor","#FF8E00");
			HAS_WARNINGS = true;
			}
		else
			$(this).siblings("input")[3].value = ssn;
    })
	
	// warnings, telephone and fax number format
	$("#" + frm).find("label:contains('Telephone'), label:contains('Phone'), label:contains('Facsimile'), label:contains('Fax')").each(function(){
		var tel = "";
		FIELD_ID = "#" + $(this).attr("for");
		if ($(FIELD_ID).parent().children("input")[0].value != "")
			tel = tel + $(FIELD_ID).parent().children("input")[0].value;
		if ($(FIELD_ID).parent().children("input")[1].value != "")
			tel = tel + $(FIELD_ID).parent().children("input")[1].value;
		if ($(FIELD_ID).parent().children("input")[2].value != "")
			tel = tel + $(FIELD_ID).parent().children("input")[2].value;
		if (tel != "" && tel.length < 10 || isNaN(tel))	{
			$(FIELD_ID).siblings("span.msgLevelError").remove(); // removes an existing error message
     	$(FIELD_ID).parent("li, td").addClass("warningRow").append(MSG_FORMAT);
     	$(FIELD_ID).css("borderColor","#FF8E00").siblings("input").css("borderColor","#FF8E00");
			HAS_WARNINGS = true;
			}
		else
			$(FIELD_ID).parent().children("input")[4].value = tel + $(FIELD_ID).parent().children("input")[3].value;
    })

	// warnings, zip code format
	$("#" + frm).find("label:contains('Zip'), label:contains('Postal')").each(function(){
		var zip  = "";
		FIELD_ID = "#" + $(this).attr("for");
		if ($(FIELD_ID).parent().children("input")[0].value != "")
			zip = zip + $(FIELD_ID).parent().children("input")[0].value;
		if ($(FIELD_ID).parent().children("input")[1].value != "")
			zip = zip + $(FIELD_ID).parent().children("input")[1].value;
		if (zip != "" && zip.length != 5 && zip.length != 9 || isNaN(zip))	{
			$(FIELD_ID).siblings("span.msgLevelError").remove(); // removes an existing error message
     	$(FIELD_ID).parent("li, td").addClass("warningRow").append(MSG_FORMAT);
     	$(FIELD_ID).css("borderColor","#FF8E00").siblings("input").css("borderColor","#FF8E00");
			HAS_WARNINGS = true;
			}
		else
			$(this).siblings("input")[2].value = zip;
    })

	// warnings, password format and matching
	$("#" + frm).find("label:contains('Password')").each(function(){
		FIELD_ID = "#" + $(this).attr("for");
		var curr_pass = $(FIELD_ID).parent().children("input")[0].value;
		if (curr_pass != "" && curr_pass.length < 6)	{
     	$(FIELD_ID).parent("li, td").addClass("warningRow").append(MSG_FORMAT);
     	$(FIELD_ID).css("borderColor","#FF8E00");
			HAS_WARNINGS = true;
			}
		var prev_pass = curr_pass;
		if ($(this).parents("li, td").prev().find("label").html().indexOf("Password") != -1) {
			var FIELD_ID_PREV = "#" + $(this).parents("li, td").prev().find("label").attr("for");
		  prev_pass = $(FIELD_ID_PREV).val();
			}
		if (curr_pass != prev_pass) {
     	$(FIELD_ID).parent("li, td").addClass("warningRow").append("<span class=\"msgLevelWarn\">WARNING: Password entries must match</span>");
     	$(FIELD_ID).css("borderColor","#FF8E00").siblings("input").css("borderColor","#FF8E00");
			HAS_WARNINGS = true;
			}
    })

  // return or submit
	if (HAS_ERRORS) {
		$("#vMessages").append(MSG_ERROR);
		window.scrollTo(0,0);
		}
	if (HAS_WARNINGS) {
		$("#vMessages").append(MSG_WARNING);
		window.scrollTo(0,0);
		}
	if (!HAS_ERRORS && !HAS_WARNINGS) {
		// alert("Validation passed!");
		$("#" + frm).submit();
		}
	}

/* ------------------------------------------------------------
 * INITIALIZE
 * ------------------------------------------------------------ */

$(document).ready(function(){
													 
	// position radio buttons and checkboxes
	$("input[type='radio']").addClass("radioBtn");
	$("input[type='checkbox']").addClass("checkBox");

	// define the border for input elements
	$("fieldset ol li, table.dataTable, table.infoTable").each(function(){
  	$("input[type='text'], input[type='password'], textarea")
		  .css("border","1px solid #7F9DB9");
  	$("select")
		  .css({border: "1px solid #7F9DB9", padding: "1px"});
		});

	}); // end ready function
