﻿        function getSelectionLength(ctrl)
        {
           var len = 0; 
           //IE Support 
           if (document.selection && document.selection.createRange)
             len = document.selection.createRange().text.length;
           //Firefox support
           else if ((ctrl.selectionEnd - ctrl.selectionStart) > 0 )
        		len = ctrl.selectionEnd - ctrl.selectionStart;
           return len		  
        } 
        
        function getCursorPosition (ctrl)
        {
        	var CaretPos = 0;	
        	// IE Support
        	if (document.selection)
        	{
        		ctrl.focus ();
        		var Sel = document.selection.createRange ();
        		Sel.moveStart ('character', -ctrl.value.length);
        		CaretPos = Sel.text.length;
        		
        		if (document.selection.createRange)
                    CaretPos -= document.selection.createRange().text.length;
        	}
        	// Firefox support
        	else if (ctrl.selectionStart || ctrl.selectionStart == '0')
        		CaretPos = ctrl.selectionStart;
        	return (CaretPos);
        }
                  					
        function setCursorPosition(ctrl, pos)
        {
            if(ctrl.setSelectionRange)
            {
            	ctrl.focus();
            	ctrl.setSelectionRange(pos,pos);
            }
            else if (ctrl.createTextRange)
            {
            	var range = ctrl.createTextRange();
            	range.collapse(true);
            	range.moveEnd('character', pos);
            	range.moveStart('character', pos);
            	range.select();
            }
        }
        
        function InputMask(type, ev, id, overwrite)
        {
            var tbBox = document.getElementById(id);
            var key = (ev.which) ? ev.which : event.keyCode;
            var bRet = false;
            
            var maskLen = 0;
            var verifyPat = null;
            
            var pos = getCursorPosition(tbBox);
            var selLen = getSelectionLength(tbBox);
            
            var pat = new RegExp("^(.{"+pos+"}).{"+selLen+"}(.*)");
            var sMask = tbBox.value.replace(pat, "$1%$2"); 
             
            sMask = sMask.replace(/[^0-9%]/g, "");   
            
            switch(type)
            {
                case "UsPhone":
                  maskLen = 14;
                  verifyPat = new RegExp("^(\\(\\d{3}\\))( )(\\d{3}-\\d{4})$");
                  //40=(, 41=), 32=space, 45=-
                  if (pos == 0 && key == 40 || pos == 4 && key == 41 || pos == 5 && key == 32 || pos == 9 && key == 45)
                  {
                      if (tbBox.value.length == pos || tbBox.value.charCodeAt(pos) != key)
                          bRet = true;
                      else
                          setCursorPosition(tbBox, pos+1);
                  }
                  sMask = "(" + sMask;
  	        	    sMask = sMask.replace(/^(.{4})(.)(.*)?/, "$1) $2$3");           	   
  	        	    sMask = sMask.replace(/^(.{9})(.)(.*)?/, "$1-$2$3");
                  break;
                case "UsDate":
                  maskLen = 10;
                  verifyPat = new RegExp("^(\\d{2}\\/\\d{2}\\/\\d{4})$");
                  //47=/
                  if (key == 47)
                  {
                      if (! tbBox.value.match(verifyPat) && (pos == 1 || pos == 4))
                      {
                          if (pos == 1)
                              sMask = sMask.replace(/(.)./, "0$1");
                          if (pos == 4)
                              sMask = sMask.replace(/(.{2})(.)./, "$10$2");
                           
                          sMask = sMask.replace(/^(.{2})/, "$1/");
                          sMask = sMask.replace(/^(.{2}\/.{2})/, "$1/");  
                          
                          tbBox.value = sMask;
                          setCursorPosition(tbBox, pos+2);        
                      }
                      
                      if (pos == 2 || pos == 5)
                      {
                          if (tbBox.value.length == pos || tbBox.value.charCodeAt(pos) != key)
                              bRet = true;
                          else
                              setCursorPosition(tbBox, pos+1);
                      }
                  } 
       	          sMask = sMask.replace(/^(.{2})(.)(.*)?/, "$1/$2$3");           	   
       	          sMask = sMask.replace(/^(.{5})(.)(.*)?/, "$1/$2$3");                 
                  break;
                case "SSN":
                  maskLen = 11;
                  verifyPat = new RegExp("^(\\d{3}-\\d{2}-\\d{4})$");
                  //45=-
                  if (key == 45 && (pos == 3 || pos == 6))
                  {
                      if (tbBox.value.length == pos || tbBox.value.charCodeAt(pos) != key)
                          bRet = true;
                      else
                          setCursorPosition(tbBox, pos+1);
                  }
                  sMask = sMask.replace(/^(.{3})(.)(.*)?/, "$1-$2$3");           	   
     	            sMask = sMask.replace(/^(.{6})(.)(.*)?/, "$1-$2$3");                  
                  break;                  
                   case "CreditCardNumber_Amex":
                        maskLen = 15;
                        break;
                    case "CreditCardNumber":
                        maskLen = 16;
                        break;
                    case "CreditCardSecurityCode_Amex":
                        maskLen = 4;
                        break;
                    case "CreditCardSecurityCode":
                        maskLen = 3;
                        break;
                    case "UsZip":
                        maskLen = 5;
                        break;
                    case "CheckRouting":
                        maskLen = 9;
                        break;
                    case "CheckAccount":
                        maskLen = 17;
                        break;
                    case "Numeric":
                        maskLen = 255;
                        break;           
                default: 
                  alert("Invalid mask type ["+type+"], please use: usphone, date, or ssn");
            }
           
            if (key != 8 && key >= 48 && key <= 57 && type != "")
            {
                bRet = true;
                
        			  if (selLen <= 0 && (pos == maskLen || (overwrite == false && tbBox.value.match(verifyPat))))
          		      bRet = false;
                  
        			  if (bRet == true)
        			  { 
                    var maxLen = (sMask.match(/%$/)) ? maskLen - 1 : maskLen;
    	        	   
    	        	    pat.compile("(.{"+maxLen+"}).*$");
    	        	    sMask = sMask.replace(pat, "$1");
    	        	   
    	        	    pos = sMask.indexOf("%") < 0 ? tbBox.value.length : sMask.indexOf("%");
    	   
    	        	    sMask = sMask.replace(/%/, "");
    	        	   
    	        	    tbBox.value = sMask;
    	        	    setCursorPosition(tbBox, pos);                                         
                }           
            } 
            
            return bRet;          
        }
        
        
        function UsPhoneMask(ev, id, overwrite)
        {
           
           var tbBox = document.getElementById(id);
           var key = (ev.which) ? ev.which : event.keyCode;
           var bRet = true;
		   
           if (key != 8 && key >= 48 && key <= 57)
           {
        	   var pos = getCursorPosition(tbBox);
        	   var selLen = getSelectionLength(tbBox);
			   
    			   if (pos == 14 || (overwrite == false && tbBox.value.match(/^(\(\d{3}\))( )(\d{3}-\d{4})$/)))
    			   {
      				   if (selLen <= 0)
                 {
      					     bRet = false;
                 }
    			   }
              
    			   if (bRet == true)
    			   {
	               var pat = new RegExp("^(.{"+pos+"}).{"+selLen+"}(.*)");
	               var sPhone = tbBox.value.replace(pat, "$1%$2");
  	        	   
  	        	   sPhone = sPhone.replace(/[^0-9%]/g, "");
  	       	   
  	        	   sPhone = "(" + sPhone;
  	    	   
  	        	   sPhone = sPhone.replace(/^(.{4})(.)(.*)?/, "$1) $2$3");           	   
  	        	   sPhone = sPhone.replace(/^(.{9})(.)(.*)?/, "$1-$2$3");
  	        	   
  	        	   var maxLen = (sPhone.match(/%$/)) ? 13 : 14;
  	        	   
  	        	   pat.compile("(.{"+maxLen+"}).*$");
  	        	   sPhone = sPhone.replace(pat, "$1");
  	        	   
  	        	   pos = sPhone.indexOf("%");
  	   
  	        	   if (pos > 0)
  	        	   {
  	        	       sPhone = sPhone.replace(/%/, "");
  	    	       }
  	    	       else
  	    	           pos = tbBox.value.length;
  	        	   
  	        	   tbBox.value = sPhone;
  	        	   setCursorPosition(tbBox, pos);
    			   }
           }
           else
           {
        	   bRet = false;
           }
		   
		       return bRet;
        }
        
        
        function DateMask(ev, id, overwrite)
        {
           var tbBox = document.getElementById(id);
           var key = (ev.which) ? ev.which : event.keyCode;
           var bRet = true;
		   
           if (key != 8 && key >= 48 && key <= 57)
           {
          	   var pos = getCursorPosition(tbBox);
          	   var selLen = getSelectionLength(tbBox);
  			   
      			   if (pos == 10 || (overwrite == false && tbBox.value.match(/^(\d{2}\/\d{2}\/\d{4})$/)))
      			   {
        				   if (selLen <= 0)
                   {
        					     bRet = false;
                   }
      			   }
                
      			   if (bRet == true)
      			   {
  	               var pat = new RegExp("^(.{"+pos+"}).{"+selLen+"}(.*)");
  	               var sMask = tbBox.value.replace(pat, "$1%$2");
    	        	   
    	        	   sMask = sMask.replace(/[^0-9%]/g, "");

    	        	   sMask = sMask.replace(/^(.{2})(.)(.*)?/, "$1/$2$3");           	   
    	        	   sMask = sMask.replace(/^(.{5})(.)(.*)?/, "$1/$2$3");
    	        	   
    	        	   var maxLen = (sMask.match(/%$/)) ? 9 : 10;
    	        	   
    	        	   pat.compile("(.{"+maxLen+"}).*$");
    	        	   sMask = sMask.replace(pat, "$1");
    	        	   
    	        	   pos = sMask.indexOf("%");
    	   
    	        	   sMask = sMask.replace(/%/, "");
                   
                   if (pos < 0)
                        pos = tbBox.value.length;
    	        	   
    	        	   tbBox.value = sMask;
    	        	   setCursorPosition(tbBox, pos);               
               }
           }
           else
           {
        	     bRet = false;
           }
		   
		       return bRet;        
        }
       
  
        function SSNMask(ev, id, overwrite)
        {
           var tbBox = document.getElementById(id);
           var key = (ev.which) ? ev.which : event.keyCode;
           var bRet = true;
		   
           if (key != 8 && key >= 48 && key <= 57)
           {
          	   var pos = getCursorPosition(tbBox);
          	   var selLen = getSelectionLength(tbBox);
  			   
      			   if (pos == 11 || (overwrite == false && tbBox.value.match(/^(\d{3}-\d{2}-\d{4})$/)))
      			   {
        				   if (selLen <= 0)
                   {
        					     bRet = false;
                   }
      			   }
                
      			   if (bRet == true)
      			   {
  	               var pat = new RegExp("^(.{"+pos+"}).{"+selLen+"}(.*)");
  	               var sMask = tbBox.value.replace(pat, "$1%$2");
    	        	   
    	        	   sMask = sMask.replace(/[^0-9%]/g, "");

    	        	   sMask = sMask.replace(/^(.{3})(.)(.*)?/, "$1-$2$3");           	   
    	        	   sMask = sMask.replace(/^(.{6})(.)(.*)?/, "$1-$2$3");
    	        	   
    	        	   var maxLen = (sMask.match(/%$/)) ? 10 : 11;
    	        	   
    	        	   pat.compile("(.{"+maxLen+"}).*$");
    	        	   sMask = sMask.replace(pat, "$1");
    	        	   
    	        	   pos = sMask.indexOf("%");
    	   
    	        	   sMask = sMask.replace(/%/, "");
                   
                   if (pos < 0)
                        pos = tbBox.value.length;
    	        	   
    	        	   tbBox.value = sMask;
    	        	   setCursorPosition(tbBox, pos);               
               }
           }
           else
           {
        	     bRet = false;
           }
		   
		       return bRet;        
        } 