﻿//************************************//
// ***  Mask function (s) *
//************************************//
var fldType = 'Numeric';

function ShowHideElm(elmId)
{
var elm=document.getElementById(elmId);

 if(elm!=null)
    {
       if(elm.style.display=='none')
         elm.style.display='block';
         else
         elm.style.display='none';

    }

}

function maskEdit_onclick(maskEdit)
{
	var selectionStart = getSelectionStart(maskEdit);
	putCaretPos(maskEdit,selectionStart);
	setupCaretPos(maskEdit);
}

///
//
///
function maskEdit_onGetFocus(maskEdit)
{
	displayMask(maskEdit);
	putCaretPos(maskEdit,0);
	setupCaretPos(maskEdit);
}
///
//
///
function maskEdit_onLostFocus(maskEdit)
{
	if(maskEdit.value==maskEdit.mask)
		maskEdit.value='';
}

//// ------------------------------
function maskEdit_onkeydown(maskEdit)
{
	
	var k=getKeyCode();
    if (k==-1)
	    return false;
	var selectionStart=getSelectionStart(maskEdit);
	if(k==8||k==37||k==39||k==46)
	{
		event.returnValue=false;
		if(k==8)
			keyBackspace(maskEdit,selectionStart);
		if(k==37)
			pushCaretPos(maskEdit,0);
		else if(k==39)
			pushCaretPos(maskEdit,1);
		else if(k==46)
			keyDelete(maskEdit,selectionStart);
	}
}


//// -------------------------------------
function maskEdit_keypress(maskEdit)
{
    fldType = event.srcElement.fldType;
	var keyCode=getKeyCode();
	if (keyCode==-1)
	    return false;
	var keyString=getKeyString(keyCode);
	var selectionStart=getSelectionStart(maskEdit);
	var controlID=new String(maskEdit.id);
	event.returnValue=false;
	
	switch(fldType.toLowerCase())
	{
	    case 'date':
	      maskDate(maskEdit,keyCode,keyString,selectionStart);  	    
	    break;
	    case 'numeric':
	        if(keyCode>=48&&keyCode<=57)
		        keyNumber(maskEdit,selectionStart,keyString);
	    break;
	}
//	if (fldType=='persian')
//	{
//	    if ((selectionStart ==0 || selectionStart==1)&& keyString==0)
//		    return false;
//		    
//	    if (selectionStart ==5 && keyString>1)
//		    return false;
//		    
//	    if (selectionStart==6)
//	    {
//		    var dateEnter=new String(maskEdit.value);
//		    var firstDigitMonth=Math.floor(dateEnter.substring(5,6));
//		    if (firstDigitMonth==1 && keyString>2 )
//			    return false;
//        }
//        
//	    if (selectionStart==8 && keyString>3)
//		    return false;
//		    
//	    if (selectionStart==9)
//	    {
//		    var charSection8=new String(maskEdit.value);
//		    charSection8=Math.floor(charSection8.substring(8,9));
//		    if (charSection8==3 && keyString>1)
//			    return false;
//	    }
//	}
//		
//	//if (fldType=='date' || fldType=='numeric')
//	{
//	    if( ( keyCode>=48 && keyCode<=57 && fldType=='numeric') || (fldType=='string') )
//	    {
//		    var txtDisplyId=new String(maskEdit.id);
//		    var calenderId =txtDisplyId.substring(3,txtDisplyId.length); 

//		    keyNumber(maskEdit,selectionStart,keyString);
//	    }
//	}
//	return true;
}

function maskDate(maskEdit,keyCode,keyString,selectionStart)
{
    if (selectionStart==0 && keyString!=1 ) 
		return false;
	if (selectionStart==1 && (keyString<2 | keyString>4))
		return false;	
	if (selectionStart==5) // Month Digit One
	{
		if (keyString>1)
			return false;
		var charSection6 = new String(maskEdit.value);
		charSection6 = Math.floor(charSection6.substring(6,7));
		if ((charSection6 >2 && keyString!=0) | (charSection6 ==0 && keyString==0))
			return	false; 	
	}	
	if (selectionStart==6) // Month Digit Two
	{
		var dateEnter=new String(maskEdit.value);
		var firstDigitMonth=Math.floor(dateEnter.substring(5,6));
		if ((firstDigitMonth==1 && keyString>2) |(firstDigitMonth == 0 & keyString==0) )
			return false;
	}	
	if (selectionStart==8)// Day Digit One
	{
		if (keyString>3)
			return false;
		var charSection9 = new String(maskEdit.value);
		charSection9 = Math.floor(charSection9.substring(9,10));
		if ((charSection9 >1 && keyString>2) | (charSection9 ==0 && keyString==0) )
			return	false;
		
	}
	if (selectionStart==9)// Day Digit Two
	{
		var charSection8 = new String(maskEdit.value);
		charSection8 = Math.floor(charSection8.substring(8,9));
		if ((charSection8==3 && keyString>1) | (charSection8==0 && keyString==0))
			return false;
	}
	if(keyCode>=48&&keyCode<=57)
	{
		var calenderId =maskEdit.id.substring(3,maskEdit.id.length); 
		if (document.getElementById("icon"+calenderId).selectIndex==1)
			closeCalnedar(calenderId);
		keyNumber(maskEdit,selectionStart,keyString);
	}
}

///
//
///
function displayMask(maskEdit)
{
	if(maskEdit.value=='')
	maskEdit.value=maskEdit.mask;
}
///
//
///
function setupCaretPos(maskEdit)
{
	var selectionStart = getSelectionStart(maskEdit);
	
	var charMask = maskEdit.charMask;
	
	var existData = false;
	var oP   = selectionStart;
	while(selectionStart<maskEdit.value.length-1 && existData==false)
	{
		var y=charAtCaretPos(maskEdit,selectionStart);
		if(isData(maskEdit,selectionStart)||y==charMask)
		{
			putCaretPos(maskEdit,selectionStart);
			existData=true;
		}
		selectionStart++;
	}
	if(!existData)
	{
		while(selectionStart>=0&&existData==false)
		{
			var y=charAtCaretPos(maskEdit,selectionStart);
			if(isData(maskEdit,selectionStart)||y==charMask)
			{
				putCaretPos(maskEdit,selectionStart);
				existData=true;
			}
			selectionStart--;
		}
	}
}
///
//
///
function putCaretPos(maskEdit,selectionStart)
{
	if(selectionStart<=0)
		selectionStart = 0;
//	if(selectionStart>=maskEdit.value.length-1)
//		$j = maskEdit.value.length-1;
	if(maskEdit.createTextRange)
	{
		var r= maskEdit.createTextRange();
		r.moveStart('character',selectionStart);
		r.moveEnd('character',selectionStart+1-maskEdit.value.length);
		r.select();
	}
}
///
//
///
function pushCaretPos(maskEdit,$d)
{
	var k=getSelectionStart(maskEdit);
	
	var charMask = maskEdit.charMask;
	
	var x=charAtCaretPos(maskEdit,k);
	do
	{
		if($d==0)
		{
			if(k>0)
				putCaretPos(maskEdit,--k);
		}
		else
		{
			if(k<maskEdit.value.length-1)
				putCaretPos(maskEdit,++k);
		}
		x=charAtCaretPos(maskEdit,k)
	}
	while(x!=charMask && k<maskEdit.value.length-1&&k!=0&&!isData(maskEdit,k))
		setupCaretPos(maskEdit);
}
///
//
///
function charAtCaretPos(maskEdit,selectionStart)
{
	var arrCharMaskEdit = maskEdit.value.split('');
	if(selectionStart>=0 && selectionStart<arrCharMaskEdit.length)
		return arrCharMaskEdit[selectionStart];
	else
	{
		return '';
	}
}
///
//
///
function keyNumber(maskEdit,$b,keyString)
{
	cutMask(maskEdit,$b,1);
	insertChar(maskEdit,keyString,$b);
	putCaretPos(maskEdit,$b);
	pushCaretPos(maskEdit,1);
}
///
//
///
function keyDelete(maskEdit,selectionStart)
{
	cutMask(maskEdit,selectionStart,1);
	
	var charMask = maskEdit.charMask;
	
	insertChar(maskEdit,charMask,selectionStart);
	putCaretPos(maskEdit,selectionStart);
}
///
//maskEdit,selectionStart
///
function keyBackspace(maskEdit,selectionStart)
{
	var $z = false;
	var oP = selectionStart;
	
	var charMask = maskEdit.charMask;
	
//	if ((selectionStart+1) == maskEdit.value.length)
//	    selectionStart ++;
	while($z==false && selectionStart>0)
	{
		var currentChar = charAtCaretPos(maskEdit,selectionStart-1);
		if(isData(maskEdit,selectionStart-1))
		{
			cutMask(maskEdit,selectionStart,0);
			insertChar(maskEdit,charMask,selectionStart-1);
			$z=true;
			
//			if ((selectionStart+1) == maskEdit.value.length)
//			    keyDelete(maskEdit,selectionStart);
//			else
			    putCaretPos(maskEdit,selectionStart-1);
			        
			    
		}
		else if(currentChar == charMask)
		{
			$z=true;
			putCaretPos(maskEdit,selectionStart-1);
		}
		selectionStart--;
	}
	if(!$z)
		putCaretPos(maskEdit,oP);
}
///
//
///
function insertChar(maskEdit,keyString,$b)
{
	var x=maskEdit.value;
	var $e=x.substring(0,$b);
	var $f=x.substring($b,x.length);
	maskEdit.value=$e+keyString+$f;
}
///
//
///
function cutMask(maskEdit,selectionStart,$d)
{
	var x=maskEdit.value;
	if($d==0)
	{
		var $e=x.substring(0,selectionStart-1);
		var $f=x.substring(selectionStart,x.length);
	}
	else
	{
		var $e=x.substring(0,selectionStart);
		var $f=x.substring(selectionStart+1,x.length);
	}
	maskEdit.value=$e+$f;
}
///
//
///
function getKeyCode()
{
	fldType = event.srcElement.fldType;
	var ek = getUnicode(event.keyCode);
	var k;
	var $g = (document.layers)?$h.which:event.keyCode;
	if (fldType=='persian')
	{
	    ek = GetUnicode($g);
	    if (ek>0)
	    {
	        return ek;
	    }
	    else
	    {
	        return -1;
	    }
	}
	    
	return $g;
	//var $g=(document.layers)?$h.which:event.keyCode;return $g;
}
///
//
///
function getKeyString($g)
{
	var x=String.fromCharCode($g);
	return x;
}
///
//
///
function getSelectionStart(maskEdit)
{
	if(maskEdit.createTextRange)
	{
		$k=document.selection.createRange().duplicate();
		$k.moveEnd('character',maskEdit.value.length);
		$b=maskEdit.value.lastIndexOf($k.text);
		if($k.text=='')
			$b=maskEdit.value.length;
		return $b;
	}
	else
	{
		return maskEdit.selectionStart;
	}
}
///
//
///
function isData(maskEdit,$b)
{
	if($b>=0)
	{
		var x=maskEdit.value.charCodeAt($b);
		if(x>=48&&x<=57)
			return true;
		else
		{
			return false;
		}
	}
	else
	{
		return false;
	}
}

function getUnicode(asciiCode)
{
    switch (asciiCode)
    {
        case 113: return 1590; /* ض q  */ case  81: return 1611;
        case 119: return 1589; /* ص w  */ case  87: return 1612;
        case 101: return 1579; /* ث e  */ case  69: return 1613;
        case 114: return 1602; /* ق r  */ case  82: return 1604;
        case 116: return 1601; /* ف t  */ case  84: return 1548;
        case 121: return 1594; /* غ y  */ case  89: return 1563;
        case 117: return 1593; /* ع u  */ case  85: return   44;
        case 105: return 1607; /* ه i  */ case  73: return   93;
        case 111: return 1582; /* خ o  */ case  79: return   91;
        case 112: return 1581; /* ح p  */ case  80: return   92;
        case  91: return 1580; /* ج [  */ case 123: return  125;
        case  93: return 1670; /* چ ]  */ case 125: return  123;
        case  92: return 1662; /* پ \  */ case 124: return  124;
        
        case  97: return 1588; /* ش a  */ case 65: return 1614;
        case 115: return 1587; /* س s  */ case 83: return 1615;
        case 100: return 1740; /* ی d  */ case 68: return 1616;
        case 102: return 1576; /* ب f  */ case 70: return 1617;
        case 103: return 1604; /* ل g  */ case 71: return 1728;
        case 104: return 1575; /* ا h  */ case 72: return 1570;
        case 106: return 1578; /* ت j  */ case 74: return 1600;
        case 107: return 1606; /* ن k  */ case 75: return  171;
        case 108: return 1605; /* م l  */ case 76: return  187;
        case  59: return 1705; /* ک ;  */ case 58: return   58;
        case  39: return 1711; /* ک ;  */ case 34: return   34;
        
        case 122: return 1592; /* م z  */ case 90: return  1577;
        case 120: return 1591; /* ط x  */ case 88: return  1610;
        case  99: return 1586; /* ز c  */ case 67: return  1688;
        case 118: return 1585; /* ر v  */ case 86: return  1572;
        case  98: return 1584; /* ذ b  */ case 66: return  1573;
        case 110: return 1583; /* د n  */ case 78: return  1571;
        case 109: return 1574; /* ئ m  */ case 77: return  1569;
        case  44: return 1608; /* و ,  */ case 60: return    60;
        
        case  46: return   46; /* . .  */ case 62: return    62;
        case  47: return   47; /* / /  */ case 63: return  1576;
        case  96: return  247; /* ÷ `  */ case 126: return  215;
        
        case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 48:case 45:case 61: // numbers
            return asciiCode;
        case 33:case 64:case 35:case 36:case 37:case 94:case 38:case 42:case 40:case 41:case 95:case 43: // shift numbers
            return asciiCode;
        default:  return -1;
    }
}
