/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//
// VALIDATION/ERROR METHODS
//
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////

var ErrorPopups = new Array();

function valFields(arFlds)
{
	var ret      = true;
	var cust_msg = false;
	var obj      = docObj(arFlds[0]);
	var objVal   = arFlds[1];
	var isReq    = arFlds[2];
	if (obj && !obj.ReadOnly)
	{    	
	    resetObjErrorFlags(obj);

	    switch (objVal)
	    {
	      case 'phone':

			    parsePhone(obj);
			    if (isReq || obj.value.length > 0)
			    {
				     var phoneREGEX = /^\d\d\d-\d\d\d-\d\d\d\d$/; ///\d{10}/;
				     if (! obj.value.match(phoneREGEX))
				     {
					      setControlError(obj);					      
					      ret = false;
				     }
			    }
    			
			    break;

	      case 'email':
    			
			    if (isReq || obj.value.length > 0)
			    {
				     var emailREGEX = /^([a-zA-Z0-9_\-]{2,})+([a-zA-Z0-9_\-\.]{1,})+\@([a-zA-Z0-9\-\.]{2,})+(([a-zA-Z0-9_\-]{1,})+\.)+([a-zA-Z0-9]{2,3})$/;
				     if (! obj.value.match(emailREGEX))
				     {
					      setControlError(obj);
					      ret = false;   
				     }
			    }
    	
			    break;

	      case 'select':

			    var val = obj.options[obj.selectedIndex].value;
			    if (val.match(/^(x)|(-1)$/) || val.length == 0)
			    {
				     setControlError(obj);
				     ret = false;
			    }
    			
			    break;

		  case 'multiple':
	
				ret = false;
				for (i=0; i<obj.options.length; i++)
				{							
					if (obj.options[i].selected)
					{
						if (! obj.options[i].value.match(/^([0x])|(-1)$/))
							ret = true;
					}
					
				}

				obj.style.backgroundColor = (!ret ? ErrBgc : DefaultBgc);
				
				break;

	      case 'address':
    	
			    if (isReq || obj.value.length > 0)
			    {
				    if (obj.value.length < 6 || !obj.value.match(/[0-9]/g))
				    {
					    setControlError(obj);
					    ret = false;
				    }
			    }
    			
			    break;
    	
	      case 'name':
	      case 'city':
    	
			    if (isReq || obj.value.length > 0)
			    {
				    if (obj.value.length < 2 || obj.value.match(/[0-9]/g))
				    {
					    setControlError(obj);
					    ret = false;
				    }
			    }
    	
			    break;
    	
	      case 'zip':

			    if (isReq || obj.value.length > 0)
			    {
				    ///^(([0-9]{5})|(\w\d\w \d\w\d)|(\w\d\w\d\w\d))$/i
				    if (!obj.value.match(/^([0-9]{5})$/i)) // if not a us zip
				    {
					    setControlError(obj);              
					    ret = false;
				    }
			    }
    	
			    break;
			    
	      case 'key':
    	
			    if (! obj.readOnly)
			    {
			        if (isReq || obj.value.length > 0)
			        {
				        if (obj.value.length < 5)
				        {
					        setControlError(obj);
					        ret = false;
				        }
			        }			        
			    }
    	
			    break;
    	
	     case 'varied_name':
	     case 'textarea':

			    if (isReq || obj.value.length > 0)
			    {
				     if (obj.value.length < 8)
				     {
					      setControlError(obj);
					      ret = false;
				     }
			    }
    	
			    break;
    	
	     case 'date':
    			
			    if (isReq || obj.value.length > 0)
			    {
				     parseDate(obj);
				     var dateREGEX = /^([0-9]{1,2})+\/+([0-9]{1,2})+\/+20([0-9]{2})$/;
				     if (! obj.value.match(dateREGEX) || ! isValidDate(obj.value))
				     {
					      setControlError(obj);
					      ret = false;   
				     }
			    }
    	 		
			    break;
    	 
	     case 'date_range_today':
    			
			    if (isReq || obj.value.length > 0)
			    {
                    parseDate(obj);
                    var dateREGEX = /^([0-9]{1,2})+\/+([0-9]{1,2})+\/+20([0-9]{2})$/;
                    if (! obj.value.match(dateREGEX) || ! isValidDate(obj.value))
                    {
                        setControlError(obj);
                        ret = false;   
                    }
                    else if (dateDiffCheck(obj.value, getCurrentDate(), "<"))
                    {
                        setControlError(obj);
                        ret = false;  
                    }
			    }
    	 		
			    break; 

	     case 'time':
    			
			    if (isReq || obj.value.length > 0)
			    {
				     var timeREGEX = /^(0[1-9]|1[0-2]|[1-9]{1}):[0-5][0-9]\s+(AM|PM)$/;
				     if (! obj.value.match(timeREGEX))
				     {
					      setControlError(obj);
					      ret = false;
				     }
			    }
    	 		
			    break;
			    
    	   case 'creditcard':
    	   
                if (!validateCCNum(obj.value))
                {
                    setControlError(obj);
                     ret = false;  
                }
                
    	        break;
    	        
    	   case 'ccsec':
    	   
                if (! obj.value.match(/[0-9]{3}/))
                {
                    setControlError(obj);
                    ret = false;  
                }
    	        break;
    	        
           case 'decimal':

                parseDecimal(obj);
                if (isReq || obj.value.length > 0)
                {
                    var parsedDec = obj.value.replace('/.','');
                    if (isNaN(parsedDec) || parsedDec.length < 1)
                    {
                        setControlError(obj);
                        ret = false;   
                    }
                 }
      
                break;
                
            case 'number':
            
                parseInteger(obj);
                if (isReq || obj.value.length > 0)
                {
                    if (isNaN(obj.value))
                    {
                        setControlError(obj);
                        ret = false;
                    }
                 }
      
                break;
     
            case 'username':
                if (! obj.readOnly) //making sure this is a first time entry (add new)
                {                
                    if ('' == obj.value.replace(/ /g,''))
					{
                         setControlError(obj);
                         ret = false;
					}
					/* AWAITING USERNAME STUFF
					var strString2Count = 'x' + obj.value.replace(/[0-9]{2,}/g, '0x0') + 'x';
                    var numRE_SEARCH = /([0-9]|[0-9]{2,})/;
                    var arNumerics = strString2Count.split(numRE_SEARCH);

                    if (!obj.value.match(/\w/gi) || arNumerics.length < 3 || obj.value.length < 8)
                    {
                        setControlError(obj);
                        ret = false;
                    }
					*/
                }                      
                break;

            case 'password':

                if (! obj.readOnly) //making sure this is a first time entry (add new)
                {   
                    if ('' == obj.value.replace(/ /g,''))
					{
                         setControlError(obj);
                         ret = false;
					}
					
					/* AWAITING PASSWORD STUFF
					var passRE_Match = /[a-zA-Z0-9]{6,}/gi; //alpha numeric 6 character password
                    if (!obj.value.match(passRE_Match) || !obj.value.match(/\d{1,}/g) || !obj.value.match(/\w{1,}/gi))
                    {
                         setControlError(obj);
                         ret = false;
                    }
                    else
                    {
                        if (obj.value == docObj('txtUserName').value)
                        {
                            cust_msg = 'password_username';
                            setControlError(obj);
                            ret = false;
                        }
                    }
					*/
                }
     
                break;
                
            case 'password_confirm':

                if (! obj.readOnly) //making sure this is a first time entry (add new)
                { 
                    if (obj.value != docObj('txtPassword1').value)
                    {
                        setControlError(obj);
                        ret = false;
                    }
                    else if (obj.value.length < 6)
                    {
                        cust_msg = 'password';
                        setControlError(obj);
                        ret = false;
                    }
                }
     
                break;
            case 'title':            
    	        if (isReq && obj.value.length == 0)
			    {
					      setControlError(obj);
					      ret = false;
			    }    	
			    break;
	     default:
    	
			    if (isReq || obj.value.length > 0)
			    {
				     if (obj.value.length < 3)
				     {
					      setControlError(obj);
					      ret = false;
				     }
			    }
    	
			    break;
	    }
	    
	    if (!ret)
	        ErrorPopups.push([obj,fillErrMsg((!cust_msg ? objVal : cust_msg))]);
    }

    return ret;
}

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);
		var newPhoneMask = newPhone.substr(0,3) + '-' + newPhone.substr(3,3) + '-' + newPhone.substr(6,4);
		obj.value = newPhoneMask;
	}
}
function parseLink(obj)
{
    //replacing none-url specific (or in the case of this site)
	var httpREGEX_rep = /(http\:\/\/)|([\@\#\$\%\^\*\(\)\'\"\:\;\<\>\, ])/gi;
	obj.value = obj.value.replace(httpREGEX_rep,'');
}
function parseDate(obj)
{
	var regEx_Replace = /[a-z_ \;\:\\\`\~\!\@\#\$\%\^\&\*\(\)\+\=\?\>\<\,\"\'\}\]\{\[\|\=]/gi;
	    obj.value = obj.value.replace(regEx_Replace, '');
	var arDateParts = obj.value.split(/\/|\.|\-| /);

	if (arDateParts.length == 3)
	{
		arDateParts[0] = arDateParts[0].replace(/^0/,'');
		arDateParts[1] = arDateParts[1].replace(/^0/,'');

		if (!isNaN(arDateParts[0]) && !isNaN(arDateParts[1]) && !isNaN(arDateParts[2]))
		{
		    if (arDateParts[2].length == 2)
    			arDateParts[2] = '20'+arDateParts[2];

		    obj.value = arDateParts[0] + '/' + arDateParts[1] + '/' + arDateParts[2];
		}
		else
		    return false;
	}
	else
	    return false;
}


function dateDiffCheck(start_date, end_date, opr)
{
	var arStartDateParts = start_date.split('/');
    var arEndDateParts = end_date.split('/');	

	var startDate = new Date (arStartDateParts[2],arStartDateParts[0]-1,arStartDateParts[1],0,0,0);
	var endDate   = new Date (arEndDateParts[2],arEndDateParts[0]-1,arEndDateParts[1],0,0,0);

	switch (opr)
	{
		case  '<': ret = (startDate.getTime() <  endDate.getTime() ? true : false); break;
		case '<=': ret = (startDate.getTime() <= endDate.getTime() ? true : false); break;
		case  '>': ret = (startDate.getTime() >  endDate.getTime() ? true : false); break;
		case '>=': ret = (startDate.getTime() >= endDate.getTime() ? true : false); break;
		case  '=': ret = (startDate.getTime() == endDate.getTime() ? true : false); break;
		case '!=': ret = (startDate.getTime() != endDate.getTime() ? true : false); break;
	}
	
	return ret;
}

function isValidDate(dt)
{
    var returnType = true;
    var arDateParts = dt.split('/');
    var m = parseInt(arDateParts[0].replace(/^0/,''));
    var d = parseInt(arDateParts[1].replace(/^0/,''));

    switch (m)
    {
        case 2: //february
            returnType = (d > 0 && d <= 28 ? true : false);
            break;
        case 1: case 3: case 5: case 7: case 8: case 10: case 12: // 31 day months
            returnType = (d > 0 && d <= 31 ? true : false);
            break;
        case 4: case 6: case 9: case 11: // 30 days have sept.. apr, june.. and novemba'
            returnType = (d > 0 && d <= 30 ? true : false);
            break;
        default: // invalid month
            returnType = false;
    }

    return returnType;
}

function getCurrentDate()
{
	var date = new Date();
	var m = date.getMonth() + 1;
	var d = date.getDate();
	var y = date.getFullYear();
	return m+'/'+d+'/'+y;
}

var ErrDialogIdPrefix = '_error_dialog_';
var ErrDialogClassName = 'errorDialog';

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 'multiple': retMsg = "Please make at least one or more selections"; 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;
        case     'date': retMsg = "Please enter a valid date."; break;
        case     'time': retMsg = "Please enter a valid time."; break;
        case   'number': retMsg = "Please make a valid numerical entry."; break;
        case   'username': retMsg = "Please enter a valid username."; break;
		//case 'username': retMsg = "Username must be at least eight (8) characters in length and have at least two (2) numeric characters."; break;
 		case 'password': retMsg = "Please enter a valid password."; break;
		//case 'password': retMsg = "Password must contain at least six (6) alpha-numeric characters and cannot be the same as your username."; break;
        case 'password_confirm': retMsg = "The two passwords you entered do not match."; break;
        case 'password_username': retMsg = "Password cannot be the same as your username."; break;
        case 'date_range_today': retMsg = "You may not enter a date in the past."; break;
        case 'date_range':
            // I usually preset all my controls with the same names, which is why I hardcoded the txtStartDate, 'cause it's all over the app
            retMsg = "You have entered an invalid date range. Please enter a date later than " + docObj('txtDateStart').value + '.'; break;
        case 'creditcard': retMsg = "The credit card number you entered is not valid."; break;
        case 'ccsec': retMsg = "You entered an invalid security code. Locate the three (3) digit number on the back of your card."; break;
        case 'cc_exp_date': retMsg = "The expiration date you provided has already expired."; break;
        case 'varied_name': retMsg = "Please enter a more descriptive name."; break;
        case         'key': retMsg = "Please enter a valid ID.  This ID must be at least five (5) characters in length."; break;
        case 'title': retMsg = "Please enter a title."; break;
        default: retMsg = "Please enter valid data."; break;
    }
    
    return retMsg;
}

function initErrorDialogs()
{
    for (var i = 0; i < ErrorPopups.length; i++)
    {       
        var dialogId = createNodeDeLaDOM(i,ErrorPopups[i]);
        //alert(dialogId);
    }
    if(ErrorPopups[0][0].type != "hidden")
    {
        ErrorPopups[0][0].focus(); 
    }    
    docObj(ErrDialogIdPrefix + '0').className = ErrDialogClassName + '_up';  
}

function createNodeDeLaDOM(index, arErrFlds)
{
    var objInErr = arErrFlds[0];
    var divErrDialog = document.createElement('div');  
    
    divErrDialog.id = ErrDialogIdPrefix + index;
    divErrDialog.className = ErrDialogClassName;
    
    var controlOffsetWidth = parseInt(objInErr.offsetLeft);
	var controlOffsetHeight = objInErr.offsetHeight;
	
	var m = 230;
	
	if (navigator.appName == 'Microsoft Internet Explorer') //ms is screwy
    {
        divErrDialog.style.marginLeft = '-' + m + 'px';
        divErrDialog.style.marginTop  = '-30px';
    }
    else
    {        
        divErrDialog.style.marginLeft = parseInt(objInErr.style.width) + controlOffsetWidth - m + 'px';
        divErrDialog.style.marginTop  = '-' + (30 + controlOffsetHeight) + 'px';		
    }
    
    divErrDialog.innerHTML = '<div align="left">' + arErrFlds[1] + '</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 (bool)
        dlgObj.className = ErrDialogClassName + '_up';
    else
        dlgObj.className = ErrDialogClassName;
}

function hideAllOtherDialogs()
{
    var arDivs = document.getElementsByTagName('div');
    for (var i = 0; i < arDivs.length; i++)
    {
        if (arDivs[i].className)
        {
            if (arDivs[i].className == ErrDialogClassName + '_up')
                arDivs[i].className = ErrDialogClassName;
        }
    }
}

function throwCustomDialog(obj, objVal)
{
    ErrorPopups.push([obj,fillErrMsg(objVal)]);
    setControlError(obj);
    initSweetErrorDialogs();
}

function setControlError(obj,b)
{
	if (b)
    {
        obj.style.border = '1px solid #ccc';  
    }
    else
    {
        obj.style.border = '1px solid #ac3344';
    }
}

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,true);
}

if (document.captureEvents)
	document.captureEvents(Event.ONKEYPRESS);
	
function numericOnly(obj, e)
{
	var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
	if (key == 13)
		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;
}