// JScript source code
//
// BM Mask Editor v 1.0.0.0
// Created by Shadow
//
// Comments translated by Fishlab 2006-08-16
//
//
//
// Using examples:
//
// Phone number mask:
//
// <script language="JavaScript" type="text/javascript" src="MaskEditor.js"></script>
//
// <asp:TextBox ID="phone" DataFieldName="phone" Runat="server" class="textbox" style="WIDTH: 200px"
// onmouseup="return me_CheckSelection(this);" oncontextmenu="return false;" onkeypress="return me_CheckLength(this);"
// onkeydown="return me_CheckInput(this);" ondragstart="return false;" ondragenter="return false;"
// onfocusin="return me_CheckSelection(this);" onselect="return me_CheckSelection(this);" value="(___)___-____"
// runat="server" mask="(___)___-____" caretPos="1" oldValue="(___)___-____" startPos="1" MaskType="None"></asp:TextBox>
//
// CC number mask:
//
// <script language="JavaScript" type="text/javascript" src="MaskEditor.js"></script>
//
// <asp:TextBox onmouseup="return me_CheckSelection(this);" class="textbox" oncontextmenu="return false;"
// onkeypress="return me_CheckLength(this);" id="cardno" onkeydown="return me_CheckInput(this);"
// ondragstart="return false;" ondragenter="return false;" onfocusin="return me_CheckSelection(this);"
// Runat="server" mask="xxxx-xxxx-xxxx-xxxx" caretPos="0" oldValue="xxxx-xxxx-xxxx-xxxx" startPos="1"
// MaskType="None" Width="200" value="xxxx-xxxx-xxxx-xxxx" onselect="return me_CheckSelection(this);"></asp:TextBox>
//
// Date mask:
//
// <script language="JavaScript" type="text/javascript" src="MaskEditor.js"></script>
//
// <input name="tabClientInfo:txtBirthDay" type="text" value="__/__/____" id="tabClientInfo_txtBirthDay" 
// onselect="return me_CheckSelection(this);" MaskType="Date" onkeyup="me_ChangeDateColor(this);" 
// oldValue="__/__/____" startPos="0" onmouseup="return me_CheckSelection(this);" caretPos="0" 
// ondragenter="return false;" mask="__/__/____" onfocusout="CheckDateCI(this, this.value);" 
// oncontextmenu="return false;" onkeypress="return me_CheckLength(this);" onkeydown="return me_CheckInput(this);" 
// ondragstart="return false;" onfocusin="return me_CheckSelection(this);" value="__/__/____" style="width:80px;" />




//Get cursor position (begin of selection)
function me_getSelectionStart()
{
  var range=document.selection.createRange().duplicate();
  var pos=0;
  while(range.moveStart('character', -1))
    pos++;
  return pos;
}

//Fired on OnKeyDown() event
function me_CheckInput(t)
{
	if(!me_CheckValidKeys()) return false;

	var p=me_getSelectionStart();
	var k=t.mask.length;

	t.caretPos=p;

	if(event.keyCode==9)//Tab
	{
		event.returnValue=true;
		return true;
	}
	
	if(event.keyCode==35)//End
	{
		me_setSelectionRange(t, k-1, k);
			
		event.returnValue=false;
		return true;
	}
	
	if(event.keyCode==36)//Home
	{
		me_setSelectionRange(t, t.startPos, t.startPos+1);
			
		event.returnValue=false;
		return true;
	}
	
	if(event.keyCode==37)//cursor left
	{
		if(t.caretPos>t.startPos)
		{
			if(t.mask.charAt(t.caretPos-1)!='_')
				me_setSelectionRange(t, t.caretPos-2, t.caretPos-1);
			else
				me_setSelectionRange(t, t.caretPos-1, t.caretPos);
		}
			
		event.returnValue=false;
		return true;
	}
	
	if(event.keyCode==39)//cursor right
	{
		if(t.caretPos<k-1)
		{
			if(t.mask.charAt(t.caretPos+1)!='_')
				me_setSelectionRange(t, t.caretPos+2, t.caretPos+2+1);
			else
				me_setSelectionRange(t, t.caretPos+1, t.caretPos+2);
		}
			
		event.returnValue=false;
		return true;
	}
	
	if(event.keyCode==8)//Backspace
	{
		var n=0;
		
		if(t.mask.charAt(t.caretPos-1)!='_') n=1;
		
		//for correct working way disable standard handler
		event.returnValue=false;
		
		t.value=t.value.substr(0, t.caretPos-1-n)+t.mask.substring(t.caretPos-1-n, t.caretPos)+t.oldValue.substr(t.caretPos);

		if(t.mask.charAt(t.caretPos-1)!='_')
			me_setSelectionRange(t, t.caretPos-2, t.caretPos-1);
		else
			me_setSelectionRange(t, t.caretPos-1, t.caretPos);

		if((t.caretPos-1)<(t.startPos/1+1)) me_setSelectionRange(t, t.startPos, t.startPos/1+1);
		
		t.oldValue=t.value;
		
		return true;
	}
	
	if(event.keyCode==46)//Delete
	{
		event.returnValue=false;//for correct working way disable standard handler
		
		t.value=t.value.substr(0, t.caretPos)+t.mask.substring(t.caretPos, t.caretPos+1)+
			t.oldValue.substr(t.caretPos+1, k-t.caretPos+1);

		//set new position
		if(t.mask.charAt(t.caretPos+1)!='_')
			me_setSelectionRange(t, t.caretPos+2, t.caretPos+2+1);
		else
			me_setSelectionRange(t, t.caretPos+1, t.caretPos+2);
		
		if(t.caretPos+1>k-1) me_setSelectionRange(t, k-1, k);
	
		t.oldValue=t.value;
	
		return true;
	}

	var ch='';//symbol whish will be inserted
	
	//get key pressed by key code
	switch(event.keyCode)
	{
		case 48: ch='0'; break;//0
		case 96: ch='0'; break;//0
		
		case 49: ch='1'; break;//1
		case 97: ch='1'; break;//1

		case 50: ch='2'; break;//2
		case 98: ch='2'; break;//2

		case 51: ch='3'; break;//3
		case 99: ch='3'; break;//3

		case 52: ch='4'; break;//4
		case 100: ch='4'; break;//4

		case 53: ch='5'; break;//5
		case 101: ch='5'; break;//5
		
		case 54: ch='6'; break;//6
		case 102: ch='6'; break;//6

		case 55: ch='7'; break;//7
		case 103: ch='7'; break;//7

		case 56: ch='8'; break;//8
		case 104: ch='8'; break;//8

		case 57: ch='9'; break;//9
		case 105: ch='9'; break;//9
	}

	event.returnValue=false;//for correct working way disable standard handler

	//condition for date input only (MaskType="Date")
	if(t.MaskType=='Date')
	{
		var pd1=2;//position of delimiter 1 (from 0)
		var pd2=5;//position of delimiter 2 (from 0)
		
		if((t.caretPos==0)&&(ch>1)) return false;
		if((t.caretPos==pd1+1)&&(ch>3)) return false;
		if((t.caretPos==pd2+1)&&(ch<1)) return false;
	}
	
	t.value=t.value.substr(0, t.caretPos)+ch+t.oldValue.substr(t.caretPos+1);
	
	//set new position
	if(t.mask.charAt(t.caretPos+1)!='_')
		me_setSelectionRange(t, t.caretPos+2, t.caretPos+2+1);
	else
		me_setSelectionRange(t, t.caretPos+1, t.caretPos+2);
		
	if(t.caretPos+1>k-1) me_setSelectionRange(t, k-1, k);

	if(t.value.length>k) t.value=t.value.substring(0, k);

	if(t.value=='') t.value=mask;
	t.oldValue=t.value;

	return true;
}

//check selection
function me_CheckSelection(t)
{
	var p=me_getSelectionStart();
	var k=t.mask.length;
	var pd1=2;//position of delimiter 1 (from 0)
	var pd2=5;//position of delimiter 2 (from 0)

	t.caretPos=p;

	if(t.caretPos<k-1)
	{
		if(t.mask.charAt(t.caretPos)!='_')
			me_setSelectionRange(t, t.caretPos+1, t.caretPos+2);
		else
			me_setSelectionRange(t, t.caretPos, t.caretPos+1);
	}
	else
		me_setSelectionRange(t, k-1, k);

	event.returnValue=false;
	return false;
}

//check possible keys
/*
46 - Delete
8 - Backspace
48-57 - 0-9
96-105 0-9 (num pad)
37, 39 - cursor (37 - left, 39 - right)
35 - End
36 - Home
9 - Tab
*/
function me_CheckValidKeys()
{
	if((event.keyCode==46) || (event.keyCode==8) || ((event.keyCode>=48) && (event.keyCode<=57)) ||
		((event.keyCode>=96) && (event.keyCode<=105)) || ((event.keyCode>=35) && (event.keyCode<=37)) ||
		(event.keyCode==9) || (event.keyCode==39))
	{
		return true;
	}
	
	event.returnValue=false;
	return false;
}

//date validation
//return codes: 0 - all ok; 1- wrong month; 2 - wrong day; 3 - wrong year; 4 - wrong date; 5 - because magnet storm
function me_CheckValidDate(st)
{
	var mo, day, yr;
    var entry=st;
    var re=/\b\d{1,2}[\/-]\d{1,2}[\/-]\d{4}\b/;
	
	var delimChar=(entry.indexOf("/")!=-1) ? "/" : "-";
    var delim1=entry.indexOf(delimChar);
    var delim2=entry.lastIndexOf(delimChar);

    mo=entry.substring(0, delim1);
    day=entry.substring(delim1+1, delim2);
    yr=entry.substring(delim2+1);
	
	do {mo=mo.replace('_','');}
	while(mo.search('_')!=-1);

	do {day=day.replace('_','');}
	while(day.search('_')!=-1);

	do {yr=yr.replace('_','');}
	while(yr.search('_')!=-1);
	
	if(mo.length==0) mo=1;
	if(day.length==0) day=1;
	if(yr.length==0) yr=2000;

	do {entry=entry.replace('_','');}
	while(entry.search('_')!=-1);
	
	entry=mo+delimChar+day+delimChar+yr;

    if(re.test(entry))
	{
		delimChar=(entry.indexOf("/")!=-1) ? "/" : "-";
        delim1=entry.indexOf(delimChar);
        delim2=entry.lastIndexOf(delimChar);

        mo=parseInt(entry.substring(0, delim1), 10);
        day=parseInt(entry.substring(delim1+1, delim2), 10);
        yr=parseInt(entry.substring(delim2+1), 10);

        var testDate=new Date(yr, mo-1, day);
		
        if(testDate.getDate()==day)
		{
            if(testDate.getMonth()+1==mo)
			{
                if(testDate.getFullYear()==yr) {return 0;}
				else {return 3;}
            }
			else {return 2;}
        }
		else {return 1;}
    }
	else {return 4;}

    return 5;
}

//change color depended on date validation
function me_ChangeDateColor(t)
{
	if(me_CheckValidDate(t.value)>0) t.style.color='Red'; else t.style.color='Black';
}

//check length of date string
function me_CheckLength(t)
{
	if(me_getSelectionStart()==t.mask.length) return false;
}

//set cursor (actually selection)
function me_setSelectionRange(input, selectionStart, selectionEnd)
{
  if(input.setSelectionRange)
  {
    input.focus();
    input.setSelectionRange(selectionStart, selectionEnd);
  }
  else
   if(input.createTextRange)
   {
    var range=input.createTextRange();
    range.collapse(true);
    range.moveEnd('character', selectionEnd);
    range.moveStart('character', selectionStart);
    range.select();
   }
}


