//----------------------------------------------------------------------
// cms-genval.js - Generic client-side form validation
// Copyright (C) 2005 Active Interface, Inc. All Rights Reserved
// http://www.activeinterface.com
// $Header:  $
//----------------------------------------------------------------------

// validation object definition
function VO(regex, msg, opts)
{
	this.regexp = regex;
	this.message = msg;
	this.options = opts;
	return this;
}

// Constructor //
function GenVal() {}

new GenVal();

GenVal.initialize = GenVal_initialize;
GenVal.valForm = GenVal_valForm;
GenVal.stopDoubleSubmit = GenVal_stopDoubleSubmit;
GenVal.getLabel = GenVal_getLabel;
GenVal.setLabel = GenVal_setLabel;

//// Methods ////

// ==========================================================================
// prevent double submit
function GenVal_stopDoubleSubmit()
{
	if (GenVal.allowSubmit) {
		top.window.status = "Your information is being processed";
		GenVal.allowSubmit = false;
		return true;
	} else {
		return false;
	}
}

// ==========================================================================
// 
function GenVal_getExtValues(checkbox)
{
	var frm = document.getElementById("questions");
	var cb = document.getElementById(checkbox);

	for (var i = 0; i < frm.length; i++)
	{
		var e = frm.elements[i];

		if ( typeof(e.expvalue) != "undefined") {

			if (e.type == "select-one") {
				for (var j=0; j<e.options.length; j++) {
					var o = e.options[j];
					if (o.value == e.expvalue && cb.checked)
						o.selected = true;
					else
						o.selected = false;
				}
				if (cb.checked == false)
					e.selectedIndex = 0;
			} else if (e.type == "text") {
				if (cb.checked == true)
					e.value = e.expvalue;
				else
					e.value = "";
			}
		}
	}

}


// ==========================================================================
// 
function GenVal_getLabel(el)
{
	if (typeof(el.innerText) == "undefined")
		// Netscape
		label = el.textContent.replace(/\*/g,"");
	else
		label = el.innerText.replace(/\*/g,"");

	return label;
}

// ==========================================================================
// 
function GenVal_setLabel(el,label)
{
	if (typeof(el.innerText) == "undefined")
		// Netscape
		el.textContent = label;
	else
		el.innerText = label;

	return label;
}

// ==========================================================================
// validate a form against validation types
function GenVal_valForm(frm)
{

	var e = null;
	var ann = null;
	var elabel;
	var vtype;
	var vopt;
	var spa;

	// go through the forms elements
	for (var i = 0; i < frm.length; i++)
	{

		elabel = "";
		vtype = "";
		spa = null;
		// the form element
		e = frm.elements[i];

		if (e.type == "hidden" || e.type == "submit" || e.type == "reset") continue;
//TODO
		if (e.type == "checkbox") continue;

		// get the annotated element
		ann = document.getElementById("ff-"+e.name);

// may not need above checks with this
		if (ann == null) continue;

		// the the label
		elabel = ann.title;
		// parse vtype
		vtype = ann.getAttribute("vtype");
		if (vtype != null && vtype != "") {
			var iof = vtype.indexOf("(");
			if (iof > 0) {
				vtype = vtype.substring(0, iof);
				// get the parameters
				spa = vtype.substring(iof+1, vtype.indexOf(")")).split(",");
			}
		}

		// get vopt
		vopt = ann.getAttribute("vopt") != "false";

		// handle selectone validation type here
		if (e.tagName == "SELECT") {
			if (vopt == false) {
				var si = e.selectedIndex;
				if (si == -1 || e.options[si].value == "vselect" || e.options[si].value == "") {
					// Failed test -  set focus to field in question
					e.focus();
					alert ( "In field '" + elabel + "' : please select from list" );
					return false;
				} else {
					continue;
				}
			}
		} else if (vtype == "selectmany" && vopt == false && e.value == "") {
				alert ( "In field '" + elabel + "' : please select from list" );	
				e.parentNode.parentNode.children(0).children(1).click();
				return false;
		} else if (e.type == "text" || e.type == "textarea") {		
			// This is a text input object
			var sOld = e.value;
			var sNew = 0;
			// Start by triming leading spaces.
			for (var j = 0; j < sOld.length; j++) {
				if (sOld.charAt(j) == " ")
					sNew = j+1;
				else
					break;
			}

			e.value = sOld.substr(sNew);

			switch (vtype) {
				case "anmaxlen":
					if (e.value.length > parseInt(spa[0])) {
						e.focus();
						alert ( "In field '" + elabel + "': Please enter a string of at most " + spa[0] + " characters" );
						return false;
					}
					break;
				case "valmin":
					if (parseInt(e.value) <= parseInt(spa[0])) {
						e.focus();
						alert ( "In field '" + elabel + "': value must be at least " + spa[0] );
						return false;
					}
					break;
				case "valmax":
					if (parseInt(e.value) >= parseInt(spa[0])) {
						e.focus();
						alert ( "In field '" + elabel + "': value must be at most " + spa[0] );
						return false;
					}

					break;
				case "valminmax":
					if (parseInt(e.value) <= parseInt(spa[0]) && parseInt(e.value) >= parseInt(spa[1])) {
						e.focus();
						alert ( "In field '" + elabel + "': value must be between " + spa[0] + " and " + spa[1]);
						return false;
					}
					break;

			}

			if (e.value.length == 0 && vopt == true) {
				continue;
			} else {
				if (e.value == "") {
					e.focus();
					alert ( "In field '" + elabel + "': Please enter a value" );
					if (e.vtype == "date4digit")
						e.nextSibling.click();
					return false;
				}
			}

		} // else if (e.type == "text") {

		var vo = GenVal.valObjs[vtype];
		var tvo = typeof(vo);

		// apply any non-notice trasform types

		if (vtype == "uppercase")
		{
			var ev = e.value;
			e.value = ev.toUpperCase();
		}


		// If we have a validation object associated with the field
		if ((vo != null) && (tvo != "undefined"))
		{
			var ns1, ns2
			// if a field length was specified, insert it into the regular expression
			// and message string
			if ((vtype == "numlen") || (vtype == "anlen") || (vtype == "anminlen") || (vtype == "anmaxlen") || (vtype == "anminmaxlen") )
			{
				ns1 = vo.regexp;
				ns2 = vo.message;

				for (var k = 0; k<spa.length; k++) {
					ns1 = ns1.replace(/#/, spa[k]);
					ns2 = ns2.replace(/#/, spa[k]);
				}
			} else {
				ns1 = vo.regexp;
				ns2 = vo.message;
			}

			if (vtype == "statecode")
			{
				var ev = e.value;
				e.value = ev.toUpperCase();
			}

			// set up the RegExp object for the current object
 
			template = new RegExp( ns1, vo.options )
			// and test the value - return true if there is a match
			if (template.test(e.value) != true )
			{
				// Failed test -  set focus to field in question
				e.focus();
				// and give corresponding error message to viewer
				alert ( "In field '" + elabel + "' : " + ns2 );
				return false;
			}
		} // if ((vo != null) && (tvo != "undefined"))

	} // 	for (var i = 0; i < frm.length; i++)

   return this.stopDoubleSubmit();
}

// ==========================================================================
function GenVal_initialize()
{

	var msg;

	GenVal.allowSubmit = true;

	GenVal.valObjs = new Array();

	msg = "Please enter a # digit number";
	GenVal.valObjs["numlen"]= new VO("^\\d{#}$",msg,"");

	msg = "Please enter a # digit string";
	GenVal.valObjs["anlen"]= new VO("^\\w{#}$",msg,"");

	msg = "Please enter at least a # digit string";
	GenVal.valObjs["anminlen"]= new VO("^\\w{#,}$",msg,"");

	msg = "Please enter at least # characters but not more than #";
	GenVal.valObjs["anminmaxlen"]= new VO("^\\w{#,#}$",msg,"");

	msg = "Please enter an all digits value";
	GenVal.valObjs["alldigits"]= new VO("^\\d+$",msg,"");

	msg = "Please enter only letters, spaces, hyphens, & apostrophes";
	GenVal.valObjs["allletters"]= new VO("^[a-zA-Z \'\-]+$",msg,"");

	msg = "Please enter price as $dddd.cc";
	GenVal.valObjs["money"]= new VO("^\\$\\d*\\.\\d{2}$",msg,"");

	msg = "Please enter credit card as xxxx-xxxx-xxxx-xxxx or xxxx-xxxxxx-xxxxx";
	GenVal.valObjs["creditcard"]= new VO("^\\d{4}\-\\d{4}\-\\d{4}\-\\d{4}$|^\\d{4}\-\\d{6}\-\\d{5}$",msg,"");

	msg = "Please enter social security as xxx-xx-xxxx";
	GenVal.valObjs["ssn"]= new VO("^\\d{3}\-\\d{2}\-\\d{4}$",msg,"");

	msg = "Please enter phone as xxx-xxx-xxxx";
	GenVal.valObjs["naphone"]= new VO("^\\d{3}\-\\d{3}\-\\d{4}$",msg,"");

	msg = "Please enter a 5 digit zip code";
	GenVal.valObjs["zip5"]= new VO("^\\d{5}$",msg,"");

	msg = "Please enter a 5 digit US zip code or 7 character Canadian postal code";
	GenVal.valObjs["zip"]= new VO("^\\d{5}$|^[a-zA-Z]\\d[a-zA-Z]\\s*\\d[a-zA-Z]\\d",msg,"");

	msg = "Please enter a valid 2 letter state or province code";
	GenVal.valObjs["statecode"]= new VO("^AL|AK|AR|AZ|CA|CO|CT|DC|DE|FL|GA|IA|ID|IN|IL|HI|KS|KY|LA|MA|MD|ME|MI|MN|MO|MS|MT|NC|ND|NE|NH|NJ|NM|NV|NY|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VA|VT|WA|WI|WV|WY|AB|BC|MB|NB|NF|NT|NS|ON|PE|QC|SK|YT$",msg,"");

	msg = "Please enter 9 digit zip as xxxxx-xxxx";
	GenVal.valObjs["zip9"]= new VO("^\\d{5}\-\\d{4}$",msg,"");

	msg = "Please enter your email in format 'name@company.com' ";
	pattern = "^[0-9a-zA-Z\\_\\-\\.]+@[0-9a-zA-Z\\_\\-\\.]+$";
	GenVal.valObjs["email"]  = new VO(pattern,msg,"i");

	msg = "Please enter a date in format 'MM/DD/YY' ";
	pattern = "^[0-1]{0,1}[0-9]\\/[0-3]{0,1}[0-9]\\/[0-9][0-9]$";
	GenVal.valObjs["date2digit"] = new VO(pattern, msg, "");

	msg = "Please enter a date in format 'MM/DD/YYYY' ";
	pattern = "^[0-1]{0,1}[0-9]\\/[0-3]{0,1}[0-9]\\/[0-9]{4}$";
	GenVal.valObjs["date4digit"] = new VO(pattern, msg, "");
	
	msg = "Please enter a time in format 'hour:minuteAM|PM' ";
	pattern = "[0-9]{1,2}:[0-9]{1,2}[AM|PM|am|pm|Am|Pm|aM|pM]$";
	GenVal.valObjs["validtime"] = new VO(pattern, msg, "");
}

// ==========================================================================
// Don't allow submission of markup/script
function scrubhtml(control)
{
  var outtext;
  var intext;
  var link;
  var lttag;
  var gttag;
  var mail;

  RegExp.multiline = true;
  intext = control.value;
  lttag = /\</g
  gttag = /\>/g
//  link = /(http:\/\/[\w|\.|-|\/\]*)/
  link = /(http:\/\/\S*)/
  mail = /(mailto:[\w|\.|\@|\/]*)/
  crtn = /\r\n/g
  outtext = intext.replace(lttag, "&lt;");
  outtext = outtext.replace(gttag, "&gt;");
  outtext = outtext.replace(crtn, "<br>");
  outtext = outtext.replace(link, "<a href='$1'>$1</a>");
  control.value = outtext.replace(mail, "<a href='$1'>$1</a>");
}

// ==========================================================================
function shortscrubhtml(control)
{
  var outtext;
  var intext;
  var lttag;
  var gttag;

  RegExp.multiline = true;
  intext = control.value;
  lttag = /\</g
  gttag = /\>/g
  outtext = intext.replace(lttag, "&lt;");
  control.value = outtext.replace(gttag, "&gt;");
}

// ==========================================================================
// Show user the original
function unscrubhtml(control)
{
  var outtext;
  var intext;

  RegExp.multiline = true;
  intext = control.value
  outtext = intext.replace(/<br>/g, "\r\n");
  outtext = outtext.replace(/<a href='http:\/\/[^<^>.*]'>([^>^<.*])<\/a>/, "$1");
// alert("after <http> - " + outtext);
  outtext = outtext.replace(/<a href='.*'>(.*)<\/a>/, "$1");
// alert("after <mailto> - " + outtext);
  outtext = outtext.replace(/\&lt\;/g, "<");
  outtext = outtext.replace(/\&gt\;/g, ">");
  control.value = outtext;
}


function addCommas(nStr)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}

function myDecodeURI(uri)
{
  return uri.replace(/&amp;/g,"&");
}


var classReplace = function(cn, wordToRemove, wordToAdd) {
  var result;

  if (cn) {
    if (typeof(cn) == "string") {
      if ((cn.length == 0) || (cn == wordToRemove)) {
        result = wordToAdd;
      } else {
        var regex = new RegExp("(^| )(" + wordToRemove + ")( |$)", "g");
        result = cn.replace(regex, wordRemover);

        if (!classContains(result, wordToAdd)) {
          result = result + " " + wordToAdd;
        }
      }
    } else {
      if (cn.className && (cn.className.length > 0)) {
        result = classReplace(cn.className, wordToRemove, wordToAdd);
      } else {
        result = wordToAdd;
      }
      if (cn.className != result) {
        cn.className = result;
      }
    }
  }
  return result;
};

var classAppend = function(cn, word) {
  var result;

  if (cn) {
    if (typeof(cn) == "string") {
      if ((cn.length == 0) || (cn == word)) {
        result = word;
      } else if (!classContains(word)) {
        result = cn + " " + word;
      }
    } else {
      if (cn.className) {
        cn.className = classAppend(cn.className, word);
      } else {
        cn.className = word;
      }
      result = cn.className;
    }
  }
  return result;
};

var classRemove = function(cn, word) {
  var result;

  if (cn) {
    if (typeof(cn) == "string") {
      if (cn.length < word.length) {
        result = cn;
      } else {
        var regex = new RegExp("(^| )(" + word + ")( |$)", "g");
        result = cn.replace(regex, wordRemover);
      }
    } else {
      if (cn.className) {
        cn.className = classRemove(cn.className, word);
      }
      result = cn.className;
    }
  }
  return result;
};

var classContains = function(cn, word) {
  var result = false;
  if (cn) {
    if (typeof(cn) != "string") {
      cn = cn.className;
    }
    result = (cn && (new RegExp("(^| )" + word + "( |$)").test(cn)));
  }
  return result;
};


var wordRemover = function(str, p1, p2, p3, offset, s) {
  return (((p1 == " ") && (p3 == " ")) ? " " :"" );
};

function getQuerystring(key, def)
{
  if (def==null) def="";
  key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regex = new RegExp("[\\?&]"+key+"=([^&#]*)");
  var qs = regex.exec(window.location.href);
  if(qs == null)
    return def;
  else
    return qs[1];
}
