﻿function NPControlsNumberTextBox_TextBoxKeyDown(evt) {
    var e = evt ? evt : window.event;
    if (!e) return;
    var key = 0;
    if (e.keyCode) { key = e.keyCode; }
    else if (typeof (e.which) != 'undefined') { key = e.which; }

    if (!(e.shiftKey == true && key==45) && (((key < 48 || key > 57) && (key < 96 || key > 105)) && key != 8 && key != 37 && key != 39 && key != 46 && key != 9 && key != 17 && !(e.ctrlKey==true && key==86))) {
        return false;
    }
}

function NPControlsNumberTextBox_IsNumeric(val) {
    if (parseInt(val, 10).toString() == "NaN")
        return "";
    else
        return parseInt(val, 10).toString();
}



function NPControlsNumberTextBox_DelComma(str)
{
	str=str.replace(/,/g,"");
	str=str.replace(" ","");
	return str;
}

function NPControlsNumberTextBox_ThousandSeparator(e)    
{
    var decimalDigits = 0;
    Value = NPControlsNumberTextBox_IsNumeric(NPControlsNumberTextBox_DelComma(e.value));    
    var separatorLength = 3;       
    var OriginalValue=Value;      
    var TempValue = "" + OriginalValue;       
    var NewValue = "";       
    var pStr;      
    var dStr;       
    if (TempValue.indexOf(".")==-1){TempValue+="."}              
        dStr=TempValue.substr(0,TempValue.indexOf("."));     
    pStr=TempValue.substr(TempValue.indexOf("."))          
    while (pStr.length-1< decimalDigits){pStr+="0"}      
        if(pStr =='.') pStr ='';         
            if(dStr.length > separatorLength)        
            {            
                while( dStr.length > separatorLength)          
                {              
                    NewValue = "," + dStr.substr(dStr.length - separatorLength) + NewValue;                
                    dStr = dStr.substr(0,dStr.length - separatorLength);            
                }            
                NewValue = dStr + NewValue;                     
            }        
            else        
            {            
                NewValue = dStr;        
            }        
    NewValue = NewValue + pStr;
    e.value = NewValue;                
}    






function NPControlsDatePicker_onpaste(e)
{
    return false;
}
function NPControlsDatePicker_CreateNumber(e,position,keycode,Mindate,Maxdate)
{
    var number=-1;
    var str=e.value;
    if(keycode>=48 && keycode<=57) 
        number=keycode-48;
    else if(keycode>=96 && keycode<=105)
        number=keycode-96;
    var year=-1;
    var month=-1;
    var day=-1;
    if(position==0)
    {
        year = parseInt(number.toString()+str.substring(1,4),10);
        month  = parseInt(str.substring(5,7),10);
        day  = parseInt(str.substring(8,10),10);
        if(year>Maxdate)
            year=Maxdate;
        else if(year<Mindate)
            year=Mindate;
        e.value=NPControlsDatePicker_ValidateDate(year,month,day);
        NPControlsDatePicker_SetPosition(e,position+1);
    }  
    else if(position==1)
    {
        year = parseInt(str.substring(0,1)+number.toString()+str.substring(2,4),10);
        month  = parseInt(str.substring(5,7),10);
        day  = parseInt(str.substring(8,10),10);
        if(year>Maxdate)
            year=Maxdate;
        else if(year<Mindate)
            year=Mindate;
        e.value=NPControlsDatePicker_ValidateDate(year,month,day);
        NPControlsDatePicker_SetPosition(e,position+1);
    } 
    else if(position==2)
    {
        year = parseInt(str.substring(0,2)+number.toString()+str.substring(3,4),10);
        month  = parseInt(str.substring(5,7),10);
        day  = parseInt(str.substring(8,10),10);
        if(year>Maxdate)
            year=Maxdate;
        else if(year<Mindate)
            year=Mindate;
        e.value=NPControlsDatePicker_ValidateDate(year,month,day);
        NPControlsDatePicker_SetPosition(e,position+1);
    } 
    else if(position==3)
    {
        year = parseInt(str.substring(0,3)+number.toString(),10);
        month  = parseInt(str.substring(5,7),10);
        day  = parseInt(str.substring(8,10),10);
        if(year>Maxdate)
            year=Maxdate;
        else if(year<Mindate)
            year=Mindate;
        e.value=NPControlsDatePicker_ValidateDate(year,month,day);
        NPControlsDatePicker_SetPosition(e,position+1);
    } 
    else if(position==4)
    {
        month  = parseInt(number.toString()+str.substring(6,7),10);
        year = parseInt(str.substring(0,4),10);
        day  = parseInt(str.substring(8,10),10);
        if(year>Maxdate)
            year=Maxdate;
        else if(year<Mindate)
            year=Mindate;
        e.value=NPControlsDatePicker_ValidateDate(year,month,day);
        NPControlsDatePicker_SetPosition(e,position+2);
    }  
    else if(position==5)
    {
        month  = parseInt(number.toString()+str.substring(6,7),10);
        year = parseInt(str.substring(0,4),10);
        day  = parseInt(str.substring(8,10),10);
        e.value=NPControlsDatePicker_ValidateDate(year,month,day);
        NPControlsDatePicker_SetPosition(e,position+1);
    }     
    else if(position==6)
    {
        month  = parseInt(str.substring(5,6)+number.toString(),10);
        year = parseInt(str.substring(0,4),10);
        day  = parseInt(str.substring(8,10),10);
        e.value=NPControlsDatePicker_ValidateDate(year,month,day);
        NPControlsDatePicker_SetPosition(e,position+1);
    }    
    else if(position==7)
    {
        day  = parseInt(number.toString()+str.substring(9,10),10);
        month  = parseInt(str.substring(5,7),10);
        year = parseInt(str.substring(0,4),10);
        e.value=NPControlsDatePicker_ValidateDate(year,month,day);
        NPControlsDatePicker_SetPosition(e,position+2);
    }    
    else if(position==8)
    {
        day  = parseInt(number.toString()+str.substring(9,10),10);
        month  = parseInt(str.substring(5,7),10);
        year = parseInt(str.substring(0,4),10);
        e.value=NPControlsDatePicker_ValidateDate(year,month,day);
        NPControlsDatePicker_SetPosition(e,position+1);
    } 
    else if(position==9)
    {
        day  = parseInt(str.substring(8,9)+number.toString(),10);
        month  = parseInt(str.substring(5,7),10);
        year = parseInt(str.substring(0,4),10);
        e.value=NPControlsDatePicker_ValidateDate(year,month,day);
        NPControlsDatePicker_SetPosition(e,position+1);
    } 
}

function NPControlsDatePicker_ValidateDate(year,month,day)
{
    if(month>12)
        month=12;
    else if(month<1)
        month=1;
     
    if(day>31)
        day=31;
    else if(day<1)
        day=1;
            
    if(month<=6 && day>31)
        day=31;
    else if(month>6 && day>30)
        day=30;
    
    if(month == 12 && NPControlsDatePicker_IsKabise(year)==false && day>29)
        day=29;            
        
    return year.toString()+"/"+NPControlsDatePicker_ZInsert(month.toString())+"/"+NPControlsDatePicker_ZInsert(day.toString());
}
function NPControlsDatePicker_ZInsert(str)
{
    if(str.length==1)
        return "0"+str;
    return str;
}

function NPControlsDatePicker_SetPosition(e,newpos)
{
    if(e.createTextRange) {
        var range = e.createTextRange();
        range.collapse(true);
	    range.moveEnd('character', newpos);
	    range.moveStart('character', newpos);
	    range.select();
    }
    else {
        e.focus();
        e.setSelectionRange(newpos, newpos);
    }
}

function NPControlsDatePicker_TextBoxKeyDown(evt) {
    var Mindate = '1300';
    var Maxdate = '1400'
    var e = evt ? evt : window.event;
    if (!e) return;
    var key = 0;
    if (e.keyCode) { key = e.keyCode; }
    else if (typeof (e.which) != 'undefined') { key = e.which; }

    if (e.shiftKey == true || (((key < 48 || key > 57) && (key < 96 || key > 105)) && key != 8 && key != 37 && key != 39 && key != 46 && key != 9)) {
        return false;
    }
    else {
        var CursorPosition = -1;
        if (typeof this.selectionStart == "number") {
            i = this.selectionStart;
        }
        else if (document.selection && this.createTextRange) {
            sel = document.selection;
            if (sel) {
                r2 = sel.createRange();
                rng = this.createTextRange();
                rng.setEndPoint("EndToStart", r2);
                i = rng.text.length;
            }
        }
        else {
            this.onkeyup = null;
            this.onclick = null;
        }

        if (key == 37) {
            NPControlsDatePicker_SetPosition(this, i - 1);
        }
        else if (key == 39) {
            NPControlsDatePicker_SetPosition(this, i + 1);
        }
        else if (key == 8) {
            NPControlsDatePicker_CreateNumber(this, i - 1, 48, Mindate, Maxdate);
            NPControlsDatePicker_SetPosition(this, i - 1);
        }
        CursorPosition = i;
        if ((key >= 48 && key <= 57) || (key >= 96 && key <= 105)) {
            NPControlsDatePicker_CreateNumber(this, CursorPosition, key, Mindate, Maxdate);
        }
        return false;
    }
}



//--------------------------------------PersianDate and DatePicker-----------------------------------------
function NPControlsDatePicker_docDatePicker()
{
    if(!NPControlsDatePicker_swDatePicker && !NPControlsDatePicker_swDatePickerControl)
        if(document.all("NPControlsDatePicker_DatePicker")!=null)
            document.all("NPControlsDatePicker_DatePicker").parentNode.innerHTML="";
}
function NPControlsDatePicker_String_Date(mm)
{
	return new Array((mm.substr(0,4)),(mm.substr(5,2)),(mm.substr(8,2)));
}

function NPControlsDatePicker_isDateValid(day, month, year)
{
    if( month>12 || month<1)
        return(false);
    if( day>31 || day<1)
        return(false);
    if(month > 6 && day==31)
        return(false);
    if(month == 12 && !NPControlsDatePicker_IsKabise(year) && day==30)
        return(false);
    return(true);
}
function NPControlsDatePicker_Date_String(year,month,day)
{
	if(month.toString().length==1)
		month="0"+month.toString();
	if(day.toString().length==1)
		day="0"+day.toString();
	return year+"/"+month+"/"+day;
}
function NPControlsDatePicker_Date_StringRTL(year,month,day)
{
	if(month.toString().length==1)
		month="0"+month.toString();
	if(day.toString().length==1)
		day="0"+day.toString();
	return day+"/"+month+"/"+year;
}
function NPControlsDatePicker_IsKabise(yea)
{
year=parseInt(yea,10);
if(NPControlsDatePicker_calcPersian(year,1,1)[3]==6 && NPControlsDatePicker_calcPersian(year+1,1,1)[3]==1)
	return true;
else if(NPControlsDatePicker_calcPersian(year,1,1)[3]==5 && NPControlsDatePicker_calcPersian(year+1,1,1)[3]==0)
	return true;
else if(NPControlsDatePicker_calcPersian(year,1,1)[3]+2==NPControlsDatePicker_calcPersian(year+1,1,1)[3])
	return true;
else 
	return false;	
}


//*********************************************************************************************
function NPControlsDatePicker_mod(a, b)
{
    return a - (b * Math.floor(a / b));
}

function NPControlsDatePicker_jwday(j)
{
    return NPControlsDatePicker_mod(Math.floor((j + 1.5)), 7);
}

var Weekdays = new Array( "Sunday", "Monday", "Tuesday", "Wednesday",
                          "Thursday", "Friday", "Saturday" );

//  LEAP_GREGORIAN  --  Is a given year in the Gregorian calendar a leap year ?

function NPControlsDatePicker_leap_gregorian(year)
{
    return ((year % 4) == 0) &&
            (!(((year % 100) == 0) && ((year % 400) != 0)));
}

//  GREGORIAN_TO_JD  --  Determine Julian day number from Gregorian calendar date

var GREGORIAN_EPOCH = 1721425.5;

function NPControlsDatePicker_gregorian_to_jd(year, month, day)
{
    return (GREGORIAN_EPOCH - 1) +
           (365 * (year - 1)) +
           Math.floor((year - 1) / 4) +
           (-Math.floor((year - 1) / 100)) +
           Math.floor((year - 1) / 400) +
           Math.floor((((367 * month) - 362) / 12) +
           ((month <= 2) ? 0 :
                               (NPControlsDatePicker_leap_gregorian(year) ? -1 : -2)
           ) +
           day);
}

//  JD_TO_GREGORIAN  --  Calculate Gregorian calendar date from Julian day

function NPControlsDatePicker_jd_to_gregorian(jd) {
    var wjd, depoch, quadricent, dqc, cent, dcent, quad, dquad,
        yindex, dyindex, year, yearday, leapadj;

    wjd = Math.floor(jd - 0.5) + 0.5;
    depoch = wjd - GREGORIAN_EPOCH;
    quadricent = Math.floor(depoch / 146097);
    dqc = NPControlsDatePicker_mod(depoch, 146097);
    cent = Math.floor(dqc / 36524);
    dcent = NPControlsDatePicker_mod(dqc, 36524);
    quad = Math.floor(dcent / 1461);
    dquad = NPControlsDatePicker_mod(dcent, 1461);
    yindex = Math.floor(dquad / 365);
    year = (quadricent * 400) + (cent * 100) + (quad * 4) + yindex;
    if (!((cent == 4) || (yindex == 4))) {
        year++;
    }
    yearday = wjd - NPControlsDatePicker_gregorian_to_jd(year, 1, 1);
    leapadj = ((wjd < NPControlsDatePicker_gregorian_to_jd(year, 3, 1)) ? 0
                                                  :
                  (NPControlsDatePicker_leap_gregorian(year) ? 1 : 2)
              );
    month = Math.floor((((yearday + leapadj) * 12) + 373) / 367);
    day = (wjd - NPControlsDatePicker_gregorian_to_jd(year, month, 1)) + 1;

    return new Array(year, month, day);
}

//  LEAP_PERSIAN  --  Is a given year a leap year in the Persian calendar ?

function NPControlsDatePicker_leap_persian(year)
{
    return ((((((year - ((year > 0) ? 474 : 473)) % 2820) + 474) + 38) * 682) % 2816) < 682;
}

//  PERSIAN_TO_JD  --  Determine Julian day from Persian date

var PERSIAN_EPOCH = 1948320.5;
var PERSIAN_WEEKDAYS = new Array("í˜ÔäÈå", "ÏæÔäÈå",
                                 "Óå ÔäÈå", "åÇÑÔäÈå",
                                 "äÌ ÔäÈå", "ÌãÚå", "ÔäÈå");

function NPControlsDatePicker_persian_to_jd(year, month, day)
{
    var epbase, epyear;

    epbase = year - ((year >= 0) ? 474 : 473);
    epyear = 474 + NPControlsDatePicker_mod(epbase, 2820);

    return day +
            ((month <= 7) ?
                ((month - 1) * 31) :
                (((month - 1) * 30) + 6)
            ) +
            Math.floor(((epyear * 682) - 110) / 2816) +
            (epyear - 1) * 365 +
            Math.floor(epbase / 2820) * 1029983 +
            (PERSIAN_EPOCH - 1);
}

//  JD_TO_PERSIAN  --  Calculate Persian date from Julian day

function NPControlsDatePicker_jd_to_persian(jd)
{
    var year, month, day, depoch, cycle, cyear, ycycle,
        aux1, aux2, yday;


    jd = Math.floor(jd) + 0.5;

    depoch = jd - NPControlsDatePicker_persian_to_jd(475, 1, 1);
    cycle = Math.floor(depoch / 1029983);
    cyear = NPControlsDatePicker_mod(depoch, 1029983);
    if (cyear == 1029982) {
        ycycle = 2820;
    } else {
        aux1 = Math.floor(cyear / 366);
        aux2 = NPControlsDatePicker_mod(cyear, 366);
        ycycle = Math.floor(((2134 * aux1) + (2816 * aux2) + 2815) / 1028522) +
                    aux1 + 1;
    }
    year = ycycle + (2820 * cycle) + 474;
    if (year <= 0) {
        year--;
    }
    yday = (jd - NPControlsDatePicker_persian_to_jd(year, 1, 1)) + 1;
    month = (yday <= 186) ? Math.ceil(yday / 31) : Math.ceil((yday - 6) / 30);
    day = (jd - NPControlsDatePicker_persian_to_jd(year, month, 1)) + 1;
    return new Array(year, month, day);
}

function NPControlsDatePicker_calcPersian(year,month,day)
{
    var NPControlsDatePicker_date,j;

    j = NPControlsDatePicker_persian_to_jd(year,month,day);
    NPControlsDatePicker_date = NPControlsDatePicker_jd_to_gregorian(j);
    weekday = NPControlsDatePicker_jwday(j);
    return new Array(NPControlsDatePicker_date[0], NPControlsDatePicker_date[1], NPControlsDatePicker_date[2],weekday);
}

//  NPControlsDatePicker_calcGregorian  --  Perform calculation starting with a Gregorian date
function NPControlsDatePicker_calcGregorian(year,month,day)
{
    month--;

    var j, weekday;

    //  Update Julian day

    j = NPControlsDatePicker_gregorian_to_jd(year, month + 1, day) +
           (Math.floor(0 + 60 * (0 + 60 * 0) + 0.5) / 86400.0);

    //  Update Persian Calendar
    perscal = NPControlsDatePicker_jd_to_persian(j);
    weekday = NPControlsDatePicker_jwday(j);
    return new Array(perscal[0], perscal[1], perscal[2],weekday);
}

function NPControlsDatePicker_getTodayGregorian()
{
    var t = new Date();
    var today = new Date();

    var y = today.getYear();
    if (y < 1000) {
        y += 1900;
    }

    return new Array(y, today.getMonth() + 1, today.getDate(),t.getDay());
}

function NPControlsDatePicker_getTodayPersian()
{
    var t = new Date();
    var today = NPControlsDatePicker_getTodayGregorian();

    var persian = NPControlsDatePicker_calcGregorian(today[0],today[1],today[2]);
    return new Array(persian[0],persian[1],persian[2],t.getDay());
}


