﻿/*************************************************************************************************/
/*************************************************************************************************/
/***
/*** Form Validation and Stylin'
/***
/*************************************************************************************************/
/*************************************************************************************************/

var ErrorPopups = new Array();
var ErrDialogIdPrefix = '_error_dialog_';
var ErrDialogClassName = 'errorDialog';

var E_BGC = '#DD2222'; // ctrl color in error
var D_BGC = '#000000'; // ctrl color default

function ValFldFormat(id, which, req)
{
	var ret = true;
	var obj = docObj(id);

	setControlError(obj,false)

	switch (which)
	{
	  case 'phone':
			if (req || obj.value.length > 0)
			{				 
				 var phoneREGEX = /^\d\d\d-\d\d\d-\d\d\d\d$/;
				 if (! obj.value.match(phoneREGEX))
				    ret = setControlError(obj,true);
			}			
			break;
	  case 'email':			
			if (req || obj.value.length > 0)
			{
				 var emailREGEX = /^([a-zA-Z0-9_\-]{2,})+([a-zA-Z0-9_\-\.]{1,})+\@(([a-zA-Z0-9\-]{3,})+\.)+([a-zA-Z0-9]{2,3})$/;
				 if (! obj.value.match(emailREGEX))
				    ret = setControlError(obj,true);
			}	
			break;
	  case 'select':
            if (req)
            {
			    var val = obj.options[obj.selectedIndex].value;
			    if (val.match(/^([0x])|(-1)$/))
				    ret = setControlError(obj,true);
    			
			    break;
            }
	  case 'address':
			if (req || obj.value.length > 0)
			{
				if (obj.value.length < 6)
					ret = setControlError(obj,true);
			}			
			break;	
	  case 'city':	
			if (req || obj.value.length > 0)
			{
				if (obj.value.length < 4)
					ret = setControlError(obj,true);
			}
			break;	
	  case 'zip':
			if (req || obj.value.length > 0)
			{
				if (!obj.value.match(/^(([0-9]{5})|([a-z0-9]{6}))$/i)) // if not a us/ca zip
					ret = setControlError(obj,true);
			}	
			break;	
	 case 'textarea':	
			if (req || obj.value.length > 0)
			{
				 if (obj.value.length < 10)
				 	ret = setControlError(obj,true);
			}
			break;
	 case 'name':
	 default:	
			if (req || obj.value.length > 0)
			{
				 if (obj.value.length < 3)
				 	ret = setControlError(obj,true);
			}	
			break;
	}

    if (!ret)
		ErrorPopups.push([obj,fillErrMsg(which)]);
	
	return ret;
}

function InitErrorDialogs()
{
    for (var i = 0; i < ErrorPopups.length; i++)
        var dialogId = createDomErrorNode(i,ErrorPopups[i]);

	if(ErrorPopups[0][0].type != "hidden")
		ErrorPopups[0][0].focus();
		
	if (docObj(ErrDialogIdPrefix + '0'))
		docObj(ErrDialogIdPrefix + '0').className = ErrDialogClassName + '_up'; 
}

function createDomErrorNode(index, arErrFlds)
{
    var objInErr = arErrFlds[0];
    var divErrDialog = document.createElement('div');  
    
    divErrDialog.id = ErrDialogIdPrefix + index;
    divErrDialog.className = ErrDialogClassName;
    
    var controlOffsetWidth;
	var controlLocLeft      = objInErr.style.left;
	var controlOffsetHeight = objInErr.offsetHeight;
	
	//var m = 50;
	
	if (navigator.appName == 'Microsoft Internet Explorer') //ms is screwy
    {
		controlOffsetWidth = parseInt(objInErr.offsetWidth);
		divErrDialog.style.marginLeft = '-' + controlOffsetWidth + 'px';
        divErrDialog.style.marginTop  = '-31px';
    }
    else
    {
		controlOffsetWidth = parseInt(objInErr.offsetLeft);
		divErrDialog.style.marginLeft = controlOffsetWidth + 'px';
        divErrDialog.style.marginTop  = '-' + (31 + controlOffsetHeight) + 'px';
    }
    
    divErrDialog.innerHTML = '<div align="left"><div>' + arErrFlds[1] + '</div></div>';

    // adding events to make navigation a little more friendlier
    divErrDialog.onclick = function() { this.className = ErrDialogClassName; };
 
	addThisEvent(objInErr, 'focus', doDialogFldFocusEventFunc(objInErr, divErrDialog, true), true);
    addThisEvent(objInErr, 'blur',  doDialogFldFocusEventFunc(objInErr, divErrDialog, false), true);
 
    objInErr.parentNode.insertBefore(divErrDialog, objInErr.nextSibling);

    return divErrDialog.id;
}

function doDialogFldFocusEventFunc(fldObj, dlgObj, bool)
{
	return function() { doDialogFldFocus(fldObj, dlgObj, bool); }
}

function doDialogFldFocus(fldObj, dlgObj, bool)
{
    if (dlgObj.parentNode)
	{
		if (bool)
			dlgObj.className = ErrDialogClassName + '_up';
		else
		{
			// rather than showing/hiding the dialog each time the field has focus, I'm switching to
			// just showing it once, then removing it from the dom.. that way it's less annoying.
			dlgObj.parentNode.removeChild(dlgObj);
			//dlgObj.className = ErrDialogClassName;
		}
	}
}
function setControlError(obj,b)
{
	if (b)
	{
        obj.style.background = '#ffffff url(App_Themes/Main/images/eb.gif) no-repeat top right';
    	return false;
	}
	else
        obj.style.background = '#ffffff';
		
	return true;
}
function resetObjErrorFlags(obj)
{
    if (obj.parentNode)
    {
        var arTdDivs = obj.parentNode.getElementsByTagName('div');
    	
        if (arTdDivs.length > 0)
        {
            for (var i = 0; i < arTdDivs.length; i++)
            {
                if (arTdDivs[i].id)
                {
                    if (arTdDivs[i].id.indexOf(ErrDialogIdPrefix) != -1)
                        obj.parentNode.removeChild(arTdDivs[i]);
                }
            }
        }
	}
	
	if (obj)
        setControlError(obj,false);
}

function fillErrMsg(msgArg)
{
    var retMsg = '';
    
    switch (msgArg)
    {
        case     'name': retMsg = "Please enter a valid name."; break;
        case    'phone': retMsg = "Please enter a valid phone number."; break;
        case    'email': retMsg = "Please enter a valid email address."; break;
        case   'select': retMsg = "Please make a valid selection."; break;       
        case  'address': retMsg = "Please enter a valid address."; break;
        case     'city': retMsg = "Please enter a valid city."; break;
        case      'zip': retMsg = "Please enter a valid postal code."; break;
        case    'state': retMsg = "Please enter a valid state."; break;
        case 'textarea': retMsg = "Please make a valid entry."; break;
        default: retMsg = "Please enter valid data."; break;
    }
    
    return retMsg;
}

if (document.captureEvents)
	document.captureEvents(Event.ONKEYPRESS);

function watchChar(type, obj, e)
{
	var key = 0;
	if (!e) var e = window.event;
	if (e.keyCode) key = e.keyCode;
	else if (e.which) key = e.which;
	
	if ("email" == type)
	{
	    /* enter || at-symbol || period || dash || underscore */
	    if (key == 13 || key == 64 || key == 46 || key == 45 || key == 95)
	        return true;
	    else if (key >= 97 && key <= 122 || key >= 65 && key <= 90) //a-Z
	        return true;
	}
	if ("date" == type)
	{
	    /* enter || forwardslash || dash */
	    if (key == 13 || key == 47 || key == 45)
		    return true;
    }
    else if ("phone" == type)
    {
	    if (key == 13 || key == 45)
		    return true;
    }
    else if ("numeric" == type)
    {
	    if (key == 13 || (key >=96 && key <= 105))
		    return true;
    }
    else if ("decimal" == type)
    {
        if (key == 13 || key == 46)
            return true;
    }
    
	var allow = false;
    
	// if a number was not pressed
	if(key < 48 || key > 57)
	{
		// check for other keys that have special purposes
		if( key != 8  /* backspace */ && key != 9  /* tab */  && key != 13 /* enter */ &&
			key != 35 /* end */       && key != 36 /* home */ && key != 37 /* left */  &&
			key != 39 /* right */     && key != 46 /* del */
		   )
			allow = false;
		else
		{
			// for detecting special keys (listed above)
			// IE does not support 'charCode' and ignores them in keypress anyway
			if(typeof e.charCode != "undefined")
			{
				// special keys have 'keyCode' and 'which' the same (e.g. backspace)
				if(e.keyCode == e.which && e.which != 0)
					allow = true;
					
				// or keyCode != 0 and 'charCode'/'which' = 0
				else if(e.keyCode != 0 && e.charCode == 0 && e.which == 0)
					allow = true;
			}
		}
	}
	else
		allow = true;

	return allow;
}
function parsePhone(obj)
{
 	var phoneREGEX_Replace = /[a-zA-Z_\- \.\(\)\;\:]/g
 	obj.value = obj.value.replace(phoneREGEX_Replace, '');
 	var newPhone = obj.value;
 	
 	if (newPhone.length == 10 || newPhone.length == 11) //go ahead and attempt to parse
 	{
		if (newPhone.length == 11) // in case they do a little 1 + xxx-xxx-xxxx
 			newPhone = newPhone.substr(1,10);
 			
 		var newPhoneMask = newPhone.substr(0,3) + '-' + newPhone.substr(3,3) + '-' + newPhone.substr(6,4);
 		obj.value = newPhoneMask;
 	}
}
function doZeroDefault(obj)
{
    obj.value = obj.value.replace(' ','');
    if (obj.value.length == 0 || isNaN(obj.value))
        obj.value = '0';
}
function doInjectionProtection()
{
	if (! docObj('InjectionFree'))
	{
	    var hdn = document.createElement('input');
		    hdn.setAttribute('name','InjectionFree'); hdn.setAttribute('id', 'InjectionFree');
		    hdn.setAttribute('type', 'hidden');
		    document.forms[0].appendChild(hdn); 
	}
}