﻿



//Inicializuje oEditNumber
function oEditNumber_Initialization(ID, decimalPlaces, separateNumberGroups, decimalPlaceSeparator, numberGroupsSeparator, enableArithmetic, unit, unitMarkOnBeginning)
{
	var edit = document.getElementById(ID);	
	
	//Nastavení vlastností
	edit.ID = ID;
	edit.DecimalPlaces = decimalPlaces*1;
	edit.SeparateNumberGroups = separateNumberGroups*1;
	edit.DecimalPlaceSeparator = decimalPlaceSeparator;
	edit.NumberGroupsSeparator = numberGroupsSeparator;
	edit.EnableArithmetic = enableArithmetic*1;
	edit.Unit = unit;
	edit.UnitMarkOnBeginning = unitMarkOnBeginning;
		
	//Override metod
	edit.RefreshText = function(){return oEditNumber_RefreshText(ID);};
	edit.TextToValue = function(){return oEditNumber_TextToValue(ID);}
}





//Zkusí převést text v editu na číselnou hodnotu a vrátit ji jako výsledek. Při neúspěchu vyvolá výjimku.
function oEditNumber_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 decimalPlaces = edit.DecimalPlaces;
	    var separateNumberGroups = edit.SeparateNumberGroups;
	    var decimalPlaceSeparator = edit.DecimalPlaceSeparator;
	    var numberGroupsSeparator = edit.NumberGroupsSeparator;	
	    var enableArithmetic = edit.EnableArithmetic;
	    var unit = edit.Unit;	    
	   
	    //Vymazání unit
	    if(unit!="")
	    {
	        while(val.indexOf(unit)!=-1)
	        {
	            val = val.replace(unit,"");
	        } 	        	        
	    } 
	
	    //Vymazání mezer
	    while(val.indexOf(" ")!=-1)
	    {
	        val = val.replace(" ","");
	    } 
	   
	    //Vymazání oddělovačů číslic	    
	    while(val.indexOf(numberGroupsSeparator)!=-1)
	    {
	        val = val.replace(numberGroupsSeparator,"");
	    }
	    
	    //Nahrazení decimal separátorů
	    if(decimalPlaceSeparator!=".")
	    {
	        while(val.indexOf(decimalPlaceSeparator)!=-1)
	        {
	            val = val.replace(decimalPlaceSeparator,".");
	        }
	    } 	   	
	   	   	  
	    //Aritmetické výrazy
	    if(enableArithmetic)
	    {	  
	        val = oEditNumber_Arithmetic(val);
	    }
	   
	    //Přetypování
	    val = val*1;	    
	    if((val+"")=="NaN")
	    {
	        throw "NaN";    
	    }
	    
        //Korekce desetinných míst
        val = oEditNumber_DecimalPlaces(val,decimalPlaces)+"";	
        
        //Nastavení neformátovaného textu po výpočtu
        if(enableArithmetic)
	    {
	        var tempval = (val+"").replace(".",decimalPlaceSeparator);
	        edit.SetText(tempval);
	    }
	   
	}//val!=""
   
	//Vrácení hodnoty
    return val; 
}









//Vyhodnotí aritmetický výraz
function oEditNumber_Arithmetic(expression)
{
    try
    {
        expression = expression+"";        
        var leftOperand = 0;
        var rightOperand = 0;
        var res = expression*1;
        
        if(expression.indexOf("+")!=-1)
        {            
            leftOperand = expression.substring(0,expression.indexOf("+"))*1;
            rightOperand = expression.substring(expression.indexOf("+")+1,expression.length)*1;
            res = leftOperand+rightOperand;
        }
        else
        {        
            if(expression.indexOf("*")!=-1)
            {            
                leftOperand = expression.substring(0,expression.indexOf("*"))*1;
                rightOperand = expression.substring(expression.indexOf("*")+1,expression.length)*1;
                res = leftOperand*rightOperand;
            }
            else
            {
                if(expression.indexOf("/")!=-1)
                {            
                    leftOperand = expression.substring(0,expression.indexOf("/"))*1;
                    rightOperand = expression.substring(expression.indexOf("/")+1,expression.length)*1;
                    res = leftOperand/rightOperand;
                }
                else
                {
                    if(expression.indexOf("-",1)!=-1)
                    {           
                        if(expression.indexOf("-")==0)
                        {
                            expression = expression.substring(1,expression.length);
                            leftOperand = ("-"+expression.substring(0,expression.indexOf("-")))*1;
                            rightOperand = expression.substring(expression.indexOf("-")+1,expression.length)*1;
                            res = leftOperand-rightOperand;
                        }
                        else
                        {
                            leftOperand = expression.substring(0,expression.indexOf("-"))*1;
                            rightOperand = expression.substring(expression.indexOf("-")+1,expression.length)*1;
                            res = leftOperand-rightOperand;
                        }
                    }
                }
            }
        }
        
        return res;
    }
    catch(e)
    {
        return "NaN";
    }        
}







//Převezme hodnotu editačního pole, přeformátuje ji a zobrazí jako text
function oEditNumber_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 decimalPlaces = edit.DecimalPlaces;
	    var separateNumberGroups = edit.SeparateNumberGroups;
	    var decimalPlaceSeparator = edit.DecimalPlaceSeparator;
	    var numberGroupsSeparator = edit.NumberGroupsSeparator;
	    var unit = edit.Unit;
	    var unitMarkOnBeginning = edit.UnitMarkOnBeginning;
	    
	    text = oEditNumber_FormatNumber(val,decimalPlaces,separateNumberGroups,decimalPlaceSeparator,numberGroupsSeparator);	    	    
	    
	    if(unit!="")
	    {
	        if(unitMarkOnBeginning=="1")
	        {
	            text = unit+" "+text;
	        }
	        else
	        {
	            text = text+" "+unit;
	        }
	    }
	}

	//Zapsání hodnoty a zobrazení
	edit.SetText(text);
}








//Zformátuje část čísla před desetinným oddělovačem (po trojicích čísel)
function oEditNumber_SeparateNumberGroups(val, numberGroupsSeparator)
{
    var text = val+"";
    var newtext = "";
    var sepn = 0;
    
    for(var i = text.length-1; i>-1; i--)
    {        
        sepn += 1;
        if(sepn==4)
        {
            sepn = 1;
            newtext = numberGroupsSeparator+newtext;
        }        
        newtext = text.substr(i,1)+newtext;
    }
    
    return newtext;    
}







//Zformátuje číselnou hodnotu do požadovaného textového tvaru
function oEditNumber_FormatNumber(val, decimalPlaces, separateNumberGroups, decimalPlaceSeparator, numberGroupsSeparator)
{
    val = val*1;

    //znaménko
    var signMinus = false;
    if(val<0){ signMinus = true; }
    
    
    //část před a za desetinnou tečkou
    var intVal = "";	 
    var sufVal = ""; 
      
    var text = val+"";   
    if(signMinus){ val = (text.substring(1,text.length))*1;}
    text = val+"";
    if(text.indexOf(".")==-1)
    {	        
        intVal = text;
    }
    else
    {
        intVal = text.substring(0,text.indexOf("."));
        sufVal = text.substring(text.indexOf(".")+1,text.length);
    }      
    
    //sestavení textu    
	text = "";
	
	//znaménko
	if(signMinus){ text = "- ";}
	
	//část před oddělovačem
	if(separateNumberGroups=="1")
	{
	    text += oEditNumber_SeparateNumberGroups(intVal, numberGroupsSeparator)
	}
	else
	{
	    text += intVal;
	}
	
	
	//část za desetinnou čárkou
	if(decimalPlaces>0)
	{
	    text += decimalPlaceSeparator;
	    if(sufVal.length>=decimalPlaces)
	    {
	        text += sufVal;	        
	    }
	    else
	    {	        
	        //doplnění nulami na požadovaný počet desetinných míst
	        while(sufVal.length!=decimalPlaces)
	        {
	            sufVal += "0";
	        }
	        text += sufVal;
	    }
	}
	else
	{
	    //neomezený počet desetinných míst
	    if(decimalPlaces==-1)
	    {
	        if(sufVal!="")
	        {
	            text += decimalPlaceSeparator;
	            text += sufVal;
	        }
	    }
	}
    
    return text;    
}







//Vezme hodnotu a zaokrouhlí ji na daný počet desetinných míst
function oEditNumber_DecimalPlaces(val, decimalPlaces)
{
    val = val*1;
    decimalPlaces = decimalPlaces*1;
    
    if(decimalPlaces>=0)
    {       
        //znaménko
        var signMinus = false;
        if(val<0){ signMinus = true; }
        
        
        //část před a za desetinnou tečkou
        var intVal = "";	 
        var sufVal = ""; 
          
        var text = val+"";   
        if(signMinus){ text = (text.substring(1,text.length))*1;}  
        text = text+"";      
        if(text.indexOf(".")==-1)
        {  
            return val;
        }
        else
        {
            intVal = text.substring(0,text.indexOf("."));
            sufVal = text.substring(text.indexOf(".")+1,text.length);
        }  
    
    
        if(decimalPlaces<sufVal.length)
        {	
            //Ořezání a zaokrouhlení    
            var roundNumber = 0;        
            if(decimalPlaces==0)
            {
                roundNumber = sufVal.substring(0,1)*1;
                sufVal = "";
                if(roundNumber>=5)
                {                    
                    intVal = (intVal*1)+1;    
                    intVal = intVal+"";               	          
                }          
            }
            else
            {
                var newSufVal = sufVal.substring(0,decimalPlaces);
                roundNumber = sufVal.substring(decimalPlaces,decimalPlaces+1)*1;
                sufVal = newSufVal;	
                
                sufVal = sufVal*1;
                if(roundNumber>=5)
                {
                    var sufValLength = (sufVal+"").length;
                    sufVal += 1;	                    	                    
                    if(sufValLength != (sufVal+"").length)
                    {
                        intVal = intVal*1;
                        intVal += 1;
                        intVal = intVal+"";
                        sufVal = sufVal+"";
                        sufVal = sufVal.substring(1,sufVal.length);	                        
                    }
                }
                sufVal = sufVal+"";
            }	
            	                
        }       
        
        
        //Sestavení čísla
        text = "";
        if(signMinus){text = "-";}
        text += intVal;
        text += ".";        
        text += sufVal;
        
        val = text*1;
        return val;        
                  
    }
    else
    {
        //Neomezený počet
        return val;
    }
}


