﻿var Calendars = [];
var click = false;


// Funkce konstruktoru pro zjištění prohlížeče.
function oCalendar_getNav()
{
	this.ver=navigator.appVersion;	
	this.dom=document.getElementById ? 1:0;

	this.ns4 = (document.layers && !this.dom) ? 1:0;
	this.ns6 = (this.dom && parseInt(this.ver) >= 5) ?1:0;
	this.minIE4 = (document.all) ? 1 : 0;
}

var oCalendar_nav = new oCalendar_getNav() //Nový objekt pro zjištění prohlížeče


//Zinicializuje kalendář
function Initialize_Calendar(inputID, tableID, CssClass)
{
    var cal = new Object();
    cal.MainElem = document.getElementById(tableID);
    cal.MainInput = document.getElementById(inputID);   
    cal.Calendar = null;
    
    cal.MainElem.IsDisplayed = false;
    var calID = inputID + "_CalendarControl"; 
    
    var code = calID + ".OnEscape = oCalendar_OnEscape;";
    eval(code);
    
    code = calID + ".OnEnter = oCalendar_OnEnter";
    eval(code);
    
    if(cal.MainElem.attachEvent)
    {
        //cal.MainElem.attachEvent('onkeydown', oCalendar_OnKeyDown);
        
        cal.MainElem.attachEvent('onmousedown', oCalendar_OnMouseDown);
        document.attachEvent('onmousedown', oCalendar_OnBlur);
    }
    else
    {
        //cal.MainElem.addEventListener('keydown', oCalendar_OnKeyDown, false);
        
        cal.MainElem.addEventListener('mousedown', oCalendar_OnMouseDown, false);
        document.addEventListener('mousedown', oCalendar_OnBlur, false);
    }
    
    Calendars.push(cal);
    cal.MainInput.Calendar = cal;   
    
}

//Skryje kalendář
function oCalendar_Hide(inputID, ID)
{   
	var box = document.getElementById(ID);        

	if(box.style.display != "")
	{
	    box.style.display = "";	   
	    box.IsDisplayed = false;
	         
	    var wrapperID = ID+"Wrapper";
        var wrapper = document.getElementById(wrapperID); 
        wrapper.style.border = "0";           
        //wrapper.style.visibility = "hidden";          
        wrapper.style.display = "none";
        
        var inp = document.getElementById(inputID);
	    inp.FunctionsOpened = (inp.FunctionsOpened*1) - 1;
	    if(inp.FunctionsOpened==0)
	    {
	        inp.ValidationStopped = false;
	    }
        inp.RefreshValue();
	    inp.FocusNoSelect();
	}	
}







//Zobrazí kalendář
function oCalendar_Show(inputID, ID)
{ 
	var box = document.getElementById(ID); 
	var edit = document.getElementById(inputID);
	
	var closed = false;
	for(var i = 0; i < Calendars.length; i++)
	{
	    if(Calendars[i].MainElem.IsDisplayed == true)
	    {
	        oCalendar_Hide(Calendars[i].MainInput.id, Calendars[i].MainElem.id);
	        closed = true;
	    }
	}
	
	if(closed)
	{
	    edit.FocusNoSelect();
	    document.LockFocusID = inputID;
	}
	
	if(box==null)
	{	    
	    return;
	}
    var hinpID = ID+"_HINP";
    		
    if((!document.LockFocus)||(document.LockFocusID==inputID))
    {        
        if(((edit.FunctionsOpened+"")=="")||
	    ((edit.FunctionsOpened+"")=="null")||
	    ((edit.FunctionsOpened+"")=="undefined")||
	    (edit.FunctionsOpened==null))
	    {
	        edit.FunctionsOpened = 1;
	    }
	    else
	    {
	        edit.FunctionsOpened = (edit.FunctionsOpened*1) + 1;
	    }
        
        edit.ValidationStopped = true;
        edit.Validators.Hide();
        
        //tady natáhnout value   
        
        if(window.navigator.appName=="Opera")
        {
            box.style.display = "table-cell";
        }
        if(window.navigator.appName=="Netscape")
        {
            box.style.display = "table-cell";
        }
        if(window.navigator.appName=="Microsoft Internet Explorer")
        {
            box.style.display = "block";
        }
        
        box.IsDisplayed = true;      
        
        var wrapperID = ID+"Wrapper";
        var wrapper = document.getElementById(wrapperID); 
        wrapper.style.display = "block";
        
        //Pozicování wrapperu
        var container = document.getElementById(inputID + "_TableWrapper");
        var iPos = oCalendar_getPosition(container);                        
        var iH = parseInt(container.offsetHeight);
        var iW = parseInt(container.offsetWidth);
        var wrapW = parseInt(wrapper.offsetWidth);
        var wrapH = parseInt(wrapper.offsetHeight);
        var wndW = parseInt(document.documentElement.clientWidth);
        var wndH = parseInt(document.documentElement.clientHeight);
        //alert(wndH);
        
        wrapper.style.position = "absolute";
        var cmp = new Number(iPos.y - document.documentElement.scrollTop  + wrapH);
        var posWidth = new Number(iPos.x - document.documentElement.scrollLeft + wrapW);

        if (posWidth > wndW) {// nevejde se do prava?
            var newPosWidth = iPos.x + iW - wrapW; //posun od prava
            if (newPosWidth < 0) {
                newPosWidth = iPos.x - (wrapH / 2) + (iW / 3);
            }
            iPos.x = newPosWidth;
        }
        if(cmp > wndH)//nevejde se pod?
        {
            var cmp = new Number(iPos.y - document.documentElement.scrollTop - wrapH);
            if(cmp > 0)//vejde se nad?
            {
                wrapper.style.left = iPos.x + "px";
                wrapper.style.top = iPos.y - wrapH + 5 + "px";
            }
            else
            {
                wrapper.style.left = iPos.x + "px";
                wrapper.style.top = iPos.y - (wrapH/2) + (iH/2) + "px";
            }
        }
        else
        {
            wrapper.style.left = iPos.x + "px";
            wrapper.style.top = iPos.y + iH + "px";
        }
        
      
        var dt = new Date();
        var val = edit.GetValue();
        if(val != "")
        {
            dt.setDate(val.substring(6));
            
            var mon = new Number(val.substring(4,6));
            mon--;
            
            dt.setMonth(mon);
            
            dt.setFullYear(val.substring(0,4));
        }
        
        var calID = inputID + "_CalendarControl";  
        var code = calID+ ".Focus();"
        eval(code);        
        code = calID + ".SetSelectedDate(dt);";
        eval(code);
        
        code = calID + ".SetVisibleDate(dt);";
        eval(code);
        //box.focus();
	}	
}

function oCalendar_SelectedChanged(e)
{   
    //status.innerHTML += "  selected changed";
    var curCal = oCalendar_GetCalendarByID(e.mainElement);
    if(curCal.Calendar == null)
    {
        curCal.Calendar = e;
    }
    
    if(click)
    {
        var dt = new Date(e.GetSelectedDate());    
        var month = (dt.getMonth()*1+1)+"";
        if(month.length == 1){ month = "0" + month;}
        var day = dt.getDate()+""
        if(day.length == 1){ day = "0" + day;}
        var dtString = dt.getFullYear()+"" + month + day;
        curCal.MainInput.SetValue(dtString);
        oCalendar_Hide(curCal.MainInput.id, curCal.MainInput.id + "_Calendar");
    }
    
    
    return false;
}


function oCalendar_OnEnter(e)
{    
    
    var curCal = oCalendar_GetCalendarByID(this.mainElement);
    var dt = new Date(this.GetSelectedDate());    
    var month = (dt.getMonth()*1+1)+"";
    if(month.length == 1){ month = "0" + month;}
    var day = dt.getDate()+""
    if(day.length == 1){ day = "0" + day;}
    var dtString = dt.getFullYear()+"" + month + day;
    curCal.MainInput.SetValue(dtString);
    oCalendar_Hide(curCal.MainInput.id, curCal.MainInput.id + "_Calendar");
    
    return true;
}

function oCalendar_OnMouseDown(ev)
{
    click = true;
    var code = "oCalendar_CheckSelected()";
    setTimeout(code, 500);
    return true;
}

function oCalendar_CheckSelected()
{
    if(click == true)
    {
        click = false;
    }
}

function oCalendar_GetCalendarByID(mainElem)
{
    var curCal = null;
    var prnt = mainElem;
    while(prnt != null && print != undefined && curCal == null)
    {
        for(var i = 0; i < Calendars.length; i++)
        {
            if(prnt == Calendars[i].MainElem)
            {
                curCal = Calendars[i];
                break;
            }
        }
        prnt = prnt.parentNode;
    }   
    
    return curCal;
}

function oCalendar_OnBlur(ev)
{
    var mousePos = oCalendar_mouseCoords(ev);
    var curCal = null;
    for(var i = 0; i < Calendars.length; i++)
    {
        var curObj = Calendars[i].MainElem;
        var curPos = oCalendar_getPosition(curObj);
        var curWidth = parseInt(curObj.offsetWidth);
        var curHeight = parseInt(curObj.offsetHeight);
        if((mousePos.x < curPos.x || mousePos.x > curPos.x + curWidth) ||
        (mousePos.y < curPos.y || mousePos.y > curPos.y + curHeight))
        {
            if(Calendars[i].MainElem.IsDisplayed == true)
            {
                curCal = Calendars[i];
                break;
            }            
        }
    }
    
    if(curCal != null && curCal != undefined)
    {
        oCalendar_Hide(curCal.MainInput.id, curCal.MainInput.id + "_Calendar");
    }
}

function oCalendar_OnEscape(e)
{
    var curCal = oCalendar_GetCalendarByID(this.mainElement);
    oCalendar_Hide(curCal.MainInput.id, curCal.MainInput.id + "_Calendar");
    
    return false;
}

function oCalendar_getPosition(e)//Výpočet pozice elementu
{
	var left = 0;
	var top  = 0;
    
    if(e != null)
    {
	    while (e.offsetParent){
		    left += e.offsetLeft;
		    top  += e.offsetTop;
		    e     = e.offsetParent;
	    }

	    left += e.offsetLeft;
	    top  += e.offsetTop;	
	}
	else
	{
	    return null;
	}

	return {x:left, y:top};
}



function oCalendar_mouseCoords(ev)//Odchycení pozice myši
{
	if (oCalendar_nav.ns4 | oCalendar_nav.ns6)
    {
        return {x:ev.pageX, y:ev.pageY};
    }
    if (oCalendar_nav.minIE4)
    {
        return {
		x:ev.clientX + document.documentElement.scrollLeft,
		y:ev.clientY + document.documentElement.scrollTop
	    };        
    }    
}

