// [dFilter] - A Numerical Input Mask for JavaScript
// Written By Dwayne Forehand - March 27th, 2003
// Please reuse & redistribute while keeping this notice.

var dFilterStep;

function dFilterStrip (dFilterTemp, dFilterMask)
{
    dFilterMask = replace(dFilterMask,'#','');
    for (dFilterStep = 0; dFilterStep < dFilterMask.length++; dFilterStep++)
		{
		    dFilterTemp = replace(dFilterTemp,dFilterMask.substring(dFilterStep,dFilterStep+1),'');
		}
		return dFilterTemp;
}

function dFilterMax (dFilterMask)
{
 		dFilterTemp = dFilterMask;
    for (dFilterStep = 0; dFilterStep < (dFilterMask.length+1); dFilterStep++)
		{
		 		if (dFilterMask.charAt(dFilterStep)!='#')
				{
		        dFilterTemp = replace(dFilterTemp,dFilterMask.charAt(dFilterStep),'');
				}
		}
		return dFilterTemp.length;
}

function OnlyContainNumbers( dFilterMask )
{
	return dFilterMask == '(###) ###-####';	// temp
}

function dFilter (evt, textbox, dFilterMask)
{
	key = evt.keyCode || evt.charCode;

	switch ( key )
	{
		case 17:	// CTRL
		case 18:	// ALT
		case 37:	// Left Arrow
		case 39:	// Right Arrow
		case 36:	// Home
		case 35:	// End
		case 8:		// Backspace
		case 46:	// DEL
		case 9:		// TAB
	    return true;
	}
	
	dFilterNum = dFilterStrip(textbox.value, dFilterMask);
	
    if ( (key > 47 && key < 58) && (dFilterNum.length < dFilterMax(dFilterMask)) )
	{
        dFilterNum = dFilterNum + String.fromCharCode(key);
	}

	textbox.value = dFilterFormat(dFilterNum, dFilterMask);
    return false;
}

function dFilterFormat(text, dFilterMask)
{
    var dFilterFinal='';
    
    text = dFilterStrip(text, dFilterMask);
    dFilterNum = '';
    
    for (dFilterStep = 0; dFilterStep < text.length; dFilterStep++)
    {
        if (text.charCodeAt(dFilterStep) > 47 && text.charCodeAt(dFilterStep) < 58)
            dFilterNum = dFilterNum + text.charAt(dFilterStep);
    }    
    
    for (dFilterStep = 0; dFilterStep < dFilterMask.length; dFilterStep++)
	{
        if (dFilterMask.charAt(dFilterStep)=='#')
	    {
		    if (dFilterNum.length != 0)
			{
			    dFilterFinal = dFilterFinal + dFilterNum.charAt(0);
				dFilterNum = dFilterNum.substring(1, dFilterNum.length);
			}
			else
			{
			    dFilterFinal = dFilterFinal + "";
			}
	    }
		else
		{
		    dFilterFinal = dFilterFinal + dFilterMask.charAt(dFilterStep); 			
		}
	}
	
	return dFilterFinal;
}

function replace(fullString,text,by) {
// Replaces text with by in string
    var strLength = fullString.length, txtLength = text.length;
    if ((strLength == 0) || (txtLength == 0)) return fullString;

    var i = fullString.indexOf(text);
    if ((!i) && (text != fullString.substring(0,txtLength))) return fullString;
    if (i == -1) return fullString;

    var newstr = fullString.substring(0,i) + by;

    if (i+txtLength < strLength)
        newstr += replace(fullString.substring(i+txtLength,strLength),text,by);

    return newstr;
}

// Validates an e-mail address
function dIsValidEmail( email )
{
	if ( email.indexOf( ' ' ) != -1 )
		return false;
		
	var idx = email.indexOf( '@' );
	if ( idx < 1 )
		return false;
	
	var remmanent = email.substring( idx+1, email.length );
	
	if ( remmanent.indexOf( '.' ) <= 0 )
		return false;

	return dIsNotRepetitive( dAlphanumeric( remmanent ), 1 );
}

// Validates a phone number
function dIsValidPhoneNumber( phoneNumber10 )
{
	var areaCode = phoneNumber10.substring( 0, 3 );
	if (eval( areaCode ) < 200)
		return false;

	if ( "|111|000|999|555|800|888|866|877|900|555|976|211|311|411|511|611|811|911|999|".indexOf( areaCode ) != -1 )
		return false;

	return dIsNotRepetitive( dAlphanumeric( phoneNumber10.substring( 3, phoneNumber10.length ) ), 0 );
}

// Event validator for alpha numeric values
function dIsValidName( nameValue )
{
    nameValue = nameValue.replace(/^\s+|\s+$/g,"");
    return  /^[a-zA-z\-\ ]+$/.test(nameValue);
}

// Returns true if not a repetitive pattern (e.g. "11111" or "123456" or "dcba" or "abcdef", etc)
function dIsNotRepetitive( valueStr, maximumDifferenceAllowed )
{
	return true;
	/*
	if ( valueStr.length <= 1 )
		return false;
		
	var diff = valueStr.charCodeAt(0) - valueStr.charCodeAt(1);
	if ( Math.abs( diff ) > maximumDifferenceAllowed )
		return true;
		
	for ( var i=1; i< valueStr.length-1; i++)
	{
		var diffNext = valueStr.charCodeAt(i) - valueStr.charCodeAt( i+1 );
		if ( ( diffNext != diff ) || ( Math.abs( diffNext ) > maximumDifferenceAllowed ) )
			return true;
	}
	return false;
	*/
}

// Returns the alphanumeric portion of a string
function dAlphanumeric(alphane)
{
	var result = "";
	for(var j=0; j<alphane.length; j++)
	{
		var hh = alphane.charCodeAt(j);
		if ( (hh > 47 && hh<59) || (hh > 64 && hh<91) || (hh > 96 && hh<123) )
			result = result + alphane.charAt( j );
	}
	return result;
}

function isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}

function dIsValidDate(dtStr, format)
{
    var isValid = false;

    if (dtStr != "" && dtStr.length == 10 && format != "")
    {
        var year = 0;
        var month = 0;
        var day = 0;
        var base = 10;

        var values = dtStr.split("/");

        if (format.toLowerCase() == 'mm/dd/yyyy')
        {
            month = parseInt(values[0], base);
            day = parseInt(values[1], base);
            year = parseInt(values[2], base);
        } 
        else if (format.toLowerCase() == 'dd/mm/yyyy')
        {
            day = parseInt(values[0], base);
            month = parseInt(values[1], base);
            year = parseInt(values[2], base);
        }
        else if (format.toLowerCase() == 'yyyy/mm/dd')
        {
            year = parseInt(values[0], base);
            month = parseInt(values[1], base);
            day = parseInt(values[2], base);
        } 
        
        isValid = dIsValidDateValue(year, month, day, true);
    }
    
    return isValid;
}

function dIsValidDateValue(year, month, day, silent){
	var daysInMonth = DaysArray(12);
	
	if (month<1 || month>12)
	{
		if (!silent) alert( DATE_MONTH_INVALID );
		return false;
	}
	if (day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month])
	{
		if (!silent) alert( DATE_DAY_INVALID );
		return false;
	}
	if (year==0)
	{
		if (!silent) alert( DATE_YEAR_INVALID );
		return false;
	}
    return true;
}

function dIsValidSSN( valueSSN ) 
{
    if ( valueSSN == "")
        return true;

    if ( valueSSN.length != 11 )
    {
		alert( SSN_INVALID );
		return false;
    }

    var ssnCh= "-";
	var pos1=valueSSN.indexOf(ssnCh);
	var pos2=valueSSN.indexOf(ssnCh,pos1+1);
	var strFirst=valueSSN.substring(0,pos1);
	var strMiddle=valueSSN.substring(pos1+1,pos2);
	var strLast=valueSSN.substring(pos2+1);
	var first=parseInt(strFirst)
	var middle=parseInt(strMiddle)
	var last=parseInt(strLast)

	if (pos1==-1 || pos2==-1 || isNaN(first) || isNaN(middle) || isNaN(last))
	{
		alert( SSN_FORMAT_INVALID );
		return false;
	}

    return true;
}
