﻿



//Inicializuje oEditDate
function oEditDate_Initialization(ID, fillZeros, separator, dateFormat, dayNames, showDayName, enableArithmetic, currentDate)
{
	var edit = document.getElementById(ID);	
	
	//Nastavení vlastností
	edit.ID = ID;
	edit.FillZeros = fillZeros*1;
	edit.Separator = separator+"";
	edit.DateFormat = dateFormat+"";
	edit.DayNames = dayNames;
	edit.ShowDayName = showDayName*1;
	edit.EnableArithmetic = enableArithmetic*1;
	edit.CurrentDate = currentDate+"";
	
	//Override metod
	edit.RefreshText = function(){return oEditDate_RefreshText(ID);};
	edit.TextToValue = function() { return oEditDate_TextToValue(ID); };

	//Steinemtz
	edit.SubtractDay = function(expression) { return oEditDate_SubtractDay(expression); };
	edit.AddDay = function(expression) { return oEditDate_AddDay(expression); };

	//
	
	
}


//Zkusí převést text v editu na datumovou hodnotu a vrátit ji jako výsledek. Při neúspěchu vyvolá výjimku.
function oEditDate_TextToValue(ID)
{
    //Příprava
    var edit = document.getElementById(ID);   
	var text = edit.GetText();
	var val = text + "";	
	if(val=="undefined" || val=="null")
	{
		val = "";
	}	
	
	//Přeformátování
	if(val!="")
	{
	    var fillZeros = edit.FillZeros;
	    var separator = edit.Separator;
	    var dateFormat = edit.DateFormat;
	    var dayNames = edit.DayNames;	
	    var showDayName = edit.ShowDayName;	  
	    var enableArithmetic = edit.EnableArithmetic;
	    var currentDate = edit.CurrentDate;
	       
	    //Vymazání názvů dnů
	    if(showDayName!="")
	    {
	        var dayArray = dayNames.split(";");
	        for(var i = 0; i<dayArray.length; i++)
	        {
	            while(val.indexOf(dayArray[i])!=-1)
	            {
	                val = val.replace(dayArray[i],"");
	            }
	        } 	        	        
	    } 
	
	    //Nahrazení separátorů
	    // Start Steinmetz
	    var i = 1;
	    while (val[i] != undefined) {
	        if (isNaN(Number(val[i])) || (val.charCodeAt(i) == 32)) {
	            val = val.replace(val[i], separator);
	        }
	        i++;
	    }	        
	    // End Steinmetz
	    //Vymazání mezer
	    while (val.indexOf(" ") != -1) {
	        val = val.replace(" ", "");
	    }  
	    
	    if(separator!=".")
	    {
	        while(val.indexOf(separator)!=-1)
	        {
	            val = val.replace(separator,".");
	        }
	    } 	    
	   	
	    //Aritmetické výrazy
	    if(enableArithmetic)
	    {	  
	        val = oEditDate_Arithmetic(val, currentDate, dateFormat);
	    }
	    else
	    {
	        //Doplnění podle CurrentDate
	        val = oEditDate_Complete(val, currentDate, dateFormat);
	    }	           
	    
	}//val!=""
   
	//Vrácení hodnoty
    return val; 
}






//Doplní hodnoty do datumu
function oEditDate_Complete(expression, currentDate, dateFormat)
{
   expression = expression + "";
   if(expression.length==0){ return currentDate;}
   currentDate = currentDate + "";
   var cyear = currentDate.substr(0,4);
   var cmonth = currentDate.substr(4,2);
   var cday = currentDate.substr(6,2);
   
   if(expression.indexOf(".")==-1)
   {
        //Bez oddělovače
        if(expression.length<=2)
        {
            //D, DD
            var day = expression*1;           
            day = day + "";
            if(day == "NaN"){ throw "NaN";}         
            if(day.length == 1){ day = "0"+day;}
         
            expression = cyear+cmonth+day; 
        }
        else
        {
            if(expression.length==4)
            {
                //DDMM
                var day = expression.substr(0,2)*1;
                var month = expression.substr(2,2)*1;
                if((day+"") == "NaN"){ throw "NaN";}
                if((month+"") == "NaN"){ throw "NaN";}
                
                day = day + "";
                month = month + "";
                if(day.length == 1){ day = "0"+day;}
                if(month.length == 1){ month = "0"+month;}
                
                expression = cyear+month+day;               
            }
            else
            {
                if(expression.length==6)
                {
                    //DDMMYY
                    var day = expression.substr(0,2)*1;
                    var month = expression.substr(2,2)*1;
                    var year = expression.substr(4,2)*1;
                    if((day+"") == "NaN"){ throw "NaN";}
                    if((month+"") == "NaN"){ throw "NaN";}
                    if((year+"") == "NaN"){ throw "NaN";}
                    
                    if(year>80){year += 1900;}
                    else{year += 2000;}
                    
                    day = day + "";
                    month = month + "";
                    year = year + "";
                    if(day.length == 1){ day = "0"+day;}
                    if(month.length == 1){ month = "0"+month;}                    
                    
                    expression = year+month+day;                   
                } 
                else
                {
                    if(expression.length==8)
                    {
                        //DDMMYYYY
                        var day = expression.substr(0,2)*1;
                        var month = expression.substr(2,2)*1;
                        var year = expression.substr(4,4)*1;
                        if((day+"") == "NaN"){ throw "NaN";}
                        if((month+"") == "NaN"){ throw "NaN";}
                        if((year+"") == "NaN"){ throw "NaN";}
                                              
                        day = day + "";
                        month = month + "";
                        year = year + "";
                        if(day.length == 1){ day = "0"+day;}
                        if(month.length == 1){ month = "0"+month;}                    
                        
                        expression = year+month+day;                       
                    }
                    else
                    {
                        throw "Neplatný počet znaků v datumu.";
                    }
                }
            }  
        }     
   }
   else
   {
       if(expression.indexOf(".")==expression.lastIndexOf("."))
       {
            //Jeden oddělovač           
            var day = expression.substr(0,expression.indexOf("."))*1;
            var month = "";
            if(expression.indexOf(".")==(expression.length-1))
            {
                if((day+"") == "NaN"){ throw "NaN";}                
                day = day + "";                        
                if(day.length == 1){ day = "0"+day;}
                
                expression = cyear+cmonth+day;
            }
            else
            {
                month = expression.substring(expression.indexOf(".")+1, expression.length)*1;
                if((day+"") == "NaN"){ throw "NaN";}
                if((month+"") == "NaN"){ throw "NaN";}
                
                day = day + "";
                month = month + "";       
                        
                if(day.length == 1){ day = "0"+day;}
                if(month.length == 1){ month = "0"+month;} 
                
                expression = cyear+month+day; 
            }        
       }
       else
       {
            //Dva oddělovače
            var day = expression.substr(0,expression.indexOf("."))*1;
            var month = expression.substring(expression.indexOf(".")+1, expression.lastIndexOf("."))*1;
            
            var year = "";
            if(expression.lastIndexOf(".")==(expression.length-1))
            {
                if((day+"") == "NaN"){ throw "NaN";}
                if((month+"") == "NaN"){ throw "NaN";}               
                
                day = day + "";
                month = month + "";
                if(day.length == 1){ day = "0"+day;}
                if(month.length == 1){ month = "0"+month;}            
                
                expression = cyear+month+day;
            }
            else
            {
                year = expression.substring(expression.lastIndexOf(".")+1, expression.length)*1;
                
                if((day+"") == "NaN"){ throw "NaN";}
                if((month+"") == "NaN"){ throw "NaN";}
                if((year+"") == "NaN"){ throw "NaN";}

                if ((year + "").length == 2 || (year + "").length == 1)
                {
                    var currYearStr = new Date().getFullYear() + "";
                    var currYear = currYearStr.substr(2, 4);
                    year += ((year <= currYear * 1 + 10) ? 2000 : 1900);
                }
                    
                day = day + "";
                month = month + "";            
                year = year + "";   
                if(day.length == 1){ day = "0"+day;}
                if(month.length == 1){ month = "0"+month;}            
                
                expression = year+month+day; 
            }
                       
       }
   }
   
   
   
   //Zcheckování hodnoty  
   oEditDate_CheckDate(expression); 
   return expression;
   
}







//Zcheckování hodnoty (počet dnů v měsíci), správná délka výstupního řetězce.
//Při chybě vyhodí výjimku
function oEditDate_CheckDate(expression)
{
    expression = expression + "";
    if(expression.length!=8){ return true;}//throw "Špatná délka řetězce";}
    
    var year = expression.substr(0,4)*1;
    var month = expression.substr(4,2)*1;
    var day = expression.substr(6,2)*1;    
    
    if((day+"") == "NaN"){ throw "NaN";}
    if((month+"") == "NaN"){ throw "NaN";}
    if((year+"") == "NaN"){ throw "NaN";}    
    
    if((month<1)||(month>12)){throw "Neplatný měsíc"}
    if(year<1000){throw "Neplatný rok"}    
    if(day<1){throw "Neplatný den"}
    
    var daysInMonth = [31,29,31,30,31,30,31,31,30,31,30,31];
    if(day>daysInMonth[month-1]){throw "Neplatný den"}
    
    if((day==29)&&(month==2))
    {
        //1980,2000
        if(((year - 1980)%4)!=0)
        {
            throw "Neplatný den"
        }        
    }
    
    return true;
}






//Přičte k danému datumu 1 den
function oEditDate_AddDay(expression)
{    
    var daysInMonth = [31,29,31,30,31,30,31,31,30,31,30,31];
    var year = expression.substr(0,4)*1;    
    var month = expression.substr(4,2)*1;
    var day = expression.substr(6,2)*1;
    
    day = day + 1;
    
    if(month == 2)
    {
        if(((year - 1980)%4)!=0)
        {
            if(day == 30)
            {
                day = 1;
                month += 1;
                
                if(month>12)
                {
                    month = 1;
                    year += 1;
                }
            }            
        } 
        else
        {
            if(day==29)
            {
                day = 1;
                month += 1;
                
                if(month>12)
                {
                    month = 1;
                    year += 1;
                }
            }
        }
    
    }
    else
    {
        if(day>daysInMonth[month-1])
        {
            day = 1;
            month += 1;
            
            if(month>12)
            {
                month = 1;
                year += 1;
            }
        }
    } 
   
    day = day + "";
    month = month + "";
    year = year + "";
    if(day.length == 1){ day = "0"+day;}
    if(month.length == 1){ month = "0"+month;}                    
    
    expression = year+month+day; 
    return expression;
}









//Odečte od danému datumu 1 den
function oEditDate_SubtractDay(expression)
{    
    var daysInMonth = [31,29,31,30,31,30,31,31,30,31,30,31];
    var year = expression.substr(0,4)*1;    
    var month = expression.substr(4,2)*1;
    var day = expression.substr(6,2)*1;
    
    day = day - 1;
    
    if(day==0)
    {
        month = month-1;
        if(month==0)
        {
            month = 12;
            year = year -1;
        }
        day = daysInMonth[month-1];
    }   
    
   
    day = day + "";
    month = month + "";
    year = year + "";
    if(day.length == 1){ day = "0"+day;}
    if(month.length == 1){ month = "0"+month;}                    
    
    expression = year+month+day; 
    return expression;
}




//Přičte k danému datumu daný počet dní
function oEditDate_AddDays(expression, days)
{
    var days = days*1;
    if(days<0)
    {
        days = days*(-1);      
        for(var i = 0; i<days; i++)
        {
            expression = oEditDate_SubtractDay(expression);
        }
    }
    else
    {
        for(var i = 0; i<days; i++)
        {
            expression = oEditDate_AddDay(expression);
        }
    }    
    return expression;
}





//Vyhodnotí aritmetický výraz
function oEditDate_Arithmetic(expression, currentDate, dateFormat)
{
    expression = expression+"";        
    var leftOperand = 0;
    var rightOperand = 0;
    var res = "";
    
    if(expression.indexOf("+")!=-1)
    {            
        leftOperand = expression.substring(0,expression.indexOf("+"))+"";
        rightOperand = expression.substring(expression.indexOf("+")+1,expression.length)*1;
        res = oEditDate_AddDays(oEditDate_Complete(leftOperand, currentDate, dateFormat), rightOperand);
    }
    else
    {
        if(expression.indexOf("-",1)!=-1)
        {           
            leftOperand = expression.substring(0,expression.indexOf("-"))+"";
            rightOperand = expression.substring(expression.indexOf("-")+1,expression.length)*1;
            res = oEditDate_AddDays(oEditDate_Complete(leftOperand, currentDate, dateFormat), ((-1)*rightOperand));
        }   
        else
        {          
            res = oEditDate_Complete(expression, currentDate, dateFormat);
        }       
    }
    
    
    return res;
}







//Převezme hodnotu editačního pole, přeformátuje ji a zobrazí jako text
function oEditDate_RefreshText(ID)
{
    var edit = document.getElementById(ID);
    
	//Přeformátování
    var val = edit.GetValue() + "";

	var text = val+"";
	if(text=="undefined" || text=="null")
	{
		text = "";
	}	
	
	if(text!="")
	{
	    var fillZeros = edit.FillZeros;
	    var separator = edit.Separator;
	    var dateFormat = edit.DateFormat;
	    var dayNames = edit.DayNames;	
	    var showDayName = edit.ShowDayName;	  
	    var enableArithmetic = edit.EnableArithmetic;	
	    var currentDate = edit.CurrentDate;

	    //alert(text);
	    //Nahradí separátor
	    
	    //20080807 -> 7.8.2008	    
	    text = oEditDate_FormatDate(val, fillZeros, separator, dateFormat);
	    //alert(text);
	    //Přidat název dne
	    if(showDayName=="1")
	    {	        
	        var date = new Date();
            var year = val.substr(0,4)*1;
            var month = val.substr(4,2)*1;
            var day = val.substr(6,2)*1;
                    
            date.setFullYear(year);
            date.setMonth(month-1);
            date.setDate(day);
            
            var dayOfWeek = date.getDay()+"";
            
            var dArray = dayNames.split(";");
            var dayName = "";
            if(dayOfWeek==0){dayName = dArray[6];}
            else
            {
                dayName = dArray[(dayOfWeek*1)-1];
            }
                        
	        text = dayName+" "+text;	               
	    }
	}

	//Zapsání hodnoty a zobrazení
	edit.SetText(text);
}

//Zformátuje datumovou hodnotu do požadovaného textového tvaru
function oEditDate_FormatDate(val, fillZeros, separator, dateFormat)
{
    val = val + "";
    var text = "";
    var year = val.substr(0,4);    
    var month = val.substr(4,2);
    var day = val.substr(6,2);
    
    
    if(fillZeros=="0")
    {
        day = (day*1)+"";
        month = (month*1)+"";        
    }
    
    dateFormat = dateFormat + "";
    if(dateFormat == "DMY"){ text = day + separator + month + separator + year; }
    if(dateFormat == "DYM"){ text = day + separator + year + separator + month; }
    if(dateFormat == "MDY"){ text = month + separator + day + separator + year; }
    if(dateFormat == "MYD"){ text = month + separator + year + separator + day; }
    if(dateFormat == "YMD"){ text = year + separator + month + separator + day; }
    if(dateFormat == "YDM"){ text = year + separator + day + separator + month; }    
    
    return text;    
}






