
//
// Variables
//
var Language    = "de";

var DayNames    = new Array("Mo","Di","Mi","Do","Fr","Sa","So");
var DayNamesDE  = new Array("Mo","Di","Mi","Do","Fr","Sa","So");
var DayNamesIT  = new Array("Lu","Ma","Me","Gi","Ve","Sa","Do");
var DayNamesEN  = new Array("Mo","Tu","We","Th","Fr","Sa","Su");

var MonthNames  = new Array("Januar","Februar","Maerz","April","Mai","Juni","Juli",
                            "August","September","Oktober","November","Dezember");
                            
var MonthNamesDE= new Array("Januar","Februar","Maerz","April","Mai","Juni","Juli",
                            "August","September","Oktober","November","Dezember");
                            
var MonthNamesIT= new Array("Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio",
                            "Agosto","Settembre","Ottobre","Novembre","Dicembre");
                            
var MonthNamesEN= new Array("Janury","February","March","April","May","June","July",
                            "August","September","October","November","December");                        
                            
var DayInMonth  = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
var SiCalendar  = new SiCalendar();
var PositionY = 0;
var PositionX = 0;
    
var DateField;
 
//
// Class SiCalendar
//
function SiCalendar()
{
    //
    // Membervariables
    //
    this.Now    = new Date();
    this.Day    = this.Now.getDay();
    this.Date   = this.Now.getDate();
    this.Month  = this.Now.getMonth();
    this.Year   = this.Now.getYear();
    this.Active = false;
    //
    // Properties
    //
    // Set
    //
    this.SetDay = function( Value ) {
        this.Day = Value;
    }
    this.SetDate = function( Value ) {
        this.Date = Value;
    }
    this.SetMonth = function( Value ) {
        this.Month = Value;
    }
    this.SetYear = function( Value ) {
        this.Year = Value;
    }
    this.SetActive = function() {
        this.Active = true;
    }
    this.SetInactive = function() {
        this.Active = false;
    }
    //
    // Get
    //
    this.GetDay = function() {
        return this.Day;
    }
    this.GetDate = function() {
        return this.Date;
    }
    this.GetMonth = function() {
        return this.Month;
    }
    this.GetYear = function() {
        return this.Year;
    }
    this.GetActive = function() {
        return this.Active;
    }    
}
//
// End Class
//

function AddEvent( Object, EventType, Function, UseCaption)
{
    if ( Object.addEventListener )
    {
        Object.addEventListener( EventType, Function, UseCaption );
        return true;
    } 
    else if ( Object.attachEvent )
    {
        var Result = Object.attachEvent( "on" + EventType, Function );
        return Result;
    }
    else
        return false;
}

function CreateLink( Action, Text, AddEventListener )
{
    var Link = document.createElement("a");
    var LinkText  = document.createTextNode( Text );

        Link.href = Action;            
        Link.appendChild( LinkText );
        
        if( AddEventListener )
        {
            AddEvent( Link, "mouseover",function() { SiCalendar.SetActive();    }, false );
            AddEvent( Link, "mouseout", function() { SiCalendar.SetInactive();  }, false );
            AddEvent( Link, "blur",     function() { CloseCalendar();           }, false );
        } else {
            AddEvent( Link, "mousedown",function() { SiCalendar.SetActive();    }, false );
        } 
        
    return Link;
}

function CreateCalendarContainer()
{
    var Body = document.getElementsByTagName("body")[0];
    var RowCounter      = 0;
    var ColumnCounter   = 0;
    var ClassName       = "";
    var Container;
    var Table;
    var TableBody;
    var Column;
    var Row;
    var Link;
    var LinkText;
    var DayId           = "";
    var DayCounter      = 0;
    var DayText         = "";
    var MonthText       = "";
    
        // init Container
        Container = document.createElement("div");
        Container.id = "SiCalendar";
        Container.className = "Calendar";

        Body.appendChild( Container );        
    
        Table = document.createElement("table");
        Table.className = "Table";
        Table.cellPadding = 0;
        Table.cellSpacing = 0;
        TableBody = document.createElement("tbody");

        //
        // Month Header
        //
        Row = document.createElement("tr");
        //
        // <
        //
        Column = document.createElement("td");
        Column.className = "CellNavigation";
        Link = CreateLink( "javascript:PreviousMonth();", "<", true );
        Column.appendChild( Link )
        Row.appendChild( Column );
        
        //
        // Month Name
        //
        
        Column = document.createElement("td");
        Column.className = "CellInformation";
        Column.colSpan = 5;
        Link = document.createElement("span");
        Link.id = "MonthName";
        MonthText = document.createTextNode( "Month" );
        Link.appendChild( MonthText );
        Column.appendChild( Link );
        Row.appendChild( Column );
        
        //
        // >
        // 
        Column = document.createElement("td");
        Column.className = "CellNavigation";
        Link = Link = CreateLink( "javascript:NextMonth();", ">", true );
        Column.appendChild( Link );
        Row.appendChild( Column );
        
        TableBody.appendChild( Row );
        
        //
        // Day Header
        //
        Row = document.createElement("tr");
        
        for ( ColumnCounter = 0; ColumnCounter < 7; ColumnCounter ++ )
        {
            Column = document.createElement("td");
            if ( ColumnCounter == 5 ) { Column.className = "CellDayHeaderSaturday"; } else
            if ( ColumnCounter == 6 ) { Column.className = "CellDayHeaderSunday"; } else
                                      { Column.className = "CellDayHeader"; }
                                      
            Link = document.createElement("span");
            DayText = document.createTextNode( DayNames[ ColumnCounter ] );
            Link.id = "SiDay_Header_" + ColumnCounter;
            Link.appendChild( DayText );
            Column.appendChild( Link );
            Row.appendChild( Column );
        }
        
        TableBody.appendChild( Row );
        
        for( RowCounter = 0; RowCounter < 6; RowCounter ++ )
        {
            Row = document.createElement("tr");            
            for ( ColumnCounter = 0; ColumnCounter < 7; ColumnCounter ++ )
            {       
                Column = document.createElement("td");
                if ( ColumnCounter == 5 ) { Column.className = "CellDaySaturday"; } else
                if ( ColumnCounter == 6 ) { Column.className = "CellDaySunday"; } else
                                          { Column.className = "CellDay"; }
                    Link = CreateLink( "javascript:void(0);", "", false );

                    DayId = "SiDay_" + DayCounter;
                    Link.id = DayId;                  
                
                Column.appendChild( Link );
                            
                Row.appendChild( Column );
                DayCounter ++;
            }
            TableBody.appendChild( Row );    
        }
       
        Table.appendChild( TableBody );
        Container.appendChild( Table );
}

function SetDateTo( Year, Month )
{   
    if ( document.getElementById("SiCalendar") == null ) { CreateCalendarContainer(); }
        
    var Now = new Date();
        if( Year == 0 && Month == 0 ) {
            Year = Now.getFullYear();
            Month = Now.getMonth();
        }
        
    if( Month > 11 ) {Year ++; Month = 0;}
    else if( Month < 0 ) {Year --; Month = 11;}

        SiCalendar.SetYear ( Year  );
        SiCalendar.SetMonth( Month );
        
        document.getElementById("MonthName").firstChild.data = MonthNames[ Month ] + " " + Year;
        
    var DaysInMonth = DayInMonth[ Month ] + LeapYear( Year, Month );
    var Counter  = 0;
    var WeekDay  = (new Date( Year, Month, 0)).getDay();
    var DayCount = 0;
    var CurrentDay;
    var CurrentDate;
    var NewMonthCounter = 0;
    var OldMonthCounter = 0;
    var Active = true;
    var Today = false;
    var CurrentClassName;
    var CurrentMonth;
    var CurrentYear;
    
        
        for( Counter = 0; Counter < 42; Counter ++ )
        {
            Today = false;
            CurrentDay = document.getElementById("SiDay_" + Counter);
            CurrentMonth = Month;
            CurrentYear = Year;
            if( (DayCount < DaysInMonth) && (Counter >= WeekDay ) )
            {              
                CurrentDay.firstChild.data = DayCount + 1;
                CurrentDay.href = "javascript:WriteDate(" + (DayCount + 1) + "," + (Month + 1) + "," + Year + ")";
                if( (DayCount + 1) == Now.getDate() && Month == Now.getMonth() && Year == Now.getFullYear() )
                    Today = true;
                Active = true;
                DayCount ++;             
            }
            else if ( Counter < WeekDay )
            {
                CurrentMonth = Month - 1;
                if( CurrentMonth > 11 ) {CurrentYear ++; CurrentMonth = 0;}
                else if( CurrentMonth < 0 ) {CurrentYear --; CurrentMonth = 11;}
                OldMonthCounter = GetDays( Month - 1, Year ) - ( WeekDay - Counter );
                CurrentDay.firstChild.data = OldMonthCounter + 1;
                CurrentDay.href = "javascript:WriteDate(" + (OldMonthCounter + 1) + "," + (CurrentMonth + 1) + "," + CurrentYear + ")";
                if( (OldMonthCounter + 1) == Now.getDate() && CurrentMonth == Now.getMonth() && CurrentYear == Now.getFullYear() )
                    Today = true;
                Active = false;
            }
            else
            {
                CurrentMonth = Month + 1;
                if( CurrentMonth > 11 ) {CurrentYear ++; CurrentMonth = 0;}
                else if( CurrentMonth < 0 ) {CurrentYear --; CurrentMonth = 11;}
                CurrentDay.firstChild.data = NewMonthCounter + 1;
                CurrentDay.href = "javascript:WriteDate(" + (NewMonthCounter + 1) + "," + (CurrentMonth + 1) + "," + CurrentYear + ")";
                if( (NewMonthCounter + 1) == Now.getDate() && CurrentMonth == Now.getMonth() && CurrentYear == Now.getFullYear() )
                    Today = true;
                NewMonthCounter ++;
                Active = false;
            }
     
            // Change classes if inactive || today
            CurrentClassName = CurrentDay.parentNode.className; 
                     
            if( (Today) && ( CurrentClassName.indexOf( " CellToday" ) < 0 ) ) 
                CurrentClassName += " CellToday";
            else if ( ( CurrentClassName.indexOf( " CellToday" ) > 0 ) )
                CurrentClassName = CurrentClassName.replace( " CellToday", "" );     
                
            if( (Active) && (CurrentClassName.indexOf("Inactive") > 0 ) )
                CurrentClassName = CurrentClassName.replace( "Inactive", "" );                
            else if( (CurrentClassName.indexOf("Inactive") < 0) && (!Active) )
                CurrentClassName += "Inactive";              
            
            CurrentDay.parentNode.className = CurrentClassName;
        }    
}

function GetDays( Month, Year )
{   
    var Result;
        if( Month > 11 ) { Year ++; Month = 0;}
        else if( Month < 0 ) { Year --; Month = 11;}
        Result = DayInMonth[ Month ] + LeapYear( Year, Month );
    return ( Result );
}

//
// Controls
//
function OpenCalendar( _Language, _DateField, _Opener, _SetDefault )
{
    //
    // Language
    //
    SetLanguageTo( _Language );
    //
    // Positions & Co
    //    
    if ( _SetDefault )
    {
        var Now = new Date()
        SetDateTo( Now.getFullYear(), Now.getMonth() );
    }
    
    var ScreenHeight = (window.innerHeight)? window.innerHeight : screen.availHeight - window.screenTop;
    var ScreenWidth  = (window.innerWidth)? window.innerWidth : screen.availWidth;

        DateField = _DateField;
    var Opener = document.getElementById(_Opener)
    
    // if opener is null take position of the mouse
    if ( Opener != null )
    {
        PositionX = GetLeft( Opener );  
        PositionY = GetTop( Opener ) + Opener.offsetHeight;        
    } 
    else
    {       
        //MousePosition();
    }

    var Calendar = document.getElementById( "SiCalendar" );       
        Calendar.style.visibility = "visible";
        Calendar.style.display = "block";
        
        if (Calendar.offsetHeight + PositionY > ScreenHeight)
            PositionY -= Calendar.offsetHeight + Opener.offsetHeight;
            
        if (( PositionX - Calendar.offsetWidth < ScreenWidth) && ( PositionX - Calendar.offsetWidth > 0))
            PositionX -= Calendar.offsetWidth - Opener.offsetWidth;
        
        Calendar.style.left = PositionX + 'px';
        Calendar.style.top = PositionY + 'px';
        
    // Reset the language spans if language is different
    ResetLanguage( _Language );
}
function CloseCalendar()
{
    if( !SiCalendar.GetActive() )
    {
    var Calendar = document.getElementById( "SiCalendar" );
        Calendar.style.visibility = "hidden";
        Calendar.style.display = "none";
    }
}

function PreviousMonth()
{
    SetDateTo( SiCalendar.GetYear(), SiCalendar.GetMonth() - 1 );
}
function NextMonth()
{
    SetDateTo( SiCalendar.GetYear(), SiCalendar.GetMonth() + 1 );
}

//
// write date in the text box
//
function WriteDate( Day, Month, Year )
{
    var WriteField;
    if ( document.getElementById( DateField ).id == DateField )
    {
        WriteField = document.getElementById( DateField );
    } else
    {
        for(var i=1;i<document.all[DateField].length;i++)
        {
              if(document.all[DateField][i].id == DateField)
              {
                    WriteField = document.all[DateField][i];
              }
        }
    }
    WriteField.value = ((Day < 10)? "0" + Day : Day) + "." + ((Month < 10)? "0" + Month : Month) + "." + Year;
    SiCalendar.SetInactive();
    CloseCalendar();
}

//
// Helper
//

function LeapYear( Year, Month )
{
    var IsLeapYear = 0;
    
    if( Month == 1 )
    {
      if (Year % 4 == 0)
            IsLeapYear = 1;
      if (Year % 100 == 0)
            IsLeapYear = 1;
      if (Year % 400 == 0)
            IsLeapYear = 1;
    }     
    return IsLeapYear;
}

function GetLeft(Object) {
    return (Object.offsetParent)? Object.offsetLeft + GetLeft(Object.offsetParent) : Object.offsetLeft;
}

function GetTop(Object) {
    return (Object.offsetParent)? Object.offsetTop + GetTop(Object.offsetParent) : Object.offsetTop;
}

function SetLanguageTo( _Language )
{
    if ( _Language == "" )
        return false;
    else if ( _Language == "de" )
    {
        DayNames = DayNamesDE;
        MonthNames = MonthNamesDE;   
    }
    else if ( _Language == "it" )
    {
        DayNames = DayNamesIT;
        MonthNames = MonthNamesIT;        
    }
    else if ( _Language == "en" )
    {
        DayNames = DayNamesEN;
        MonthNames = MonthNamesEN;        
    }
}
function ResetLanguage( _Language )
{
    var NewLanguage = _Language;
    var DayCounter = 0;
    var Span;
    if ( NewLanguage != Language )
    {
        Language = NewLanguage;
        for ( DayCounter = 0; DayCounter < 7; DayCounter ++ )
        {
            Span = document.getElementById("SiDay_Header_" + DayCounter );
            Span.firstChild.data = DayNames[ DayCounter ];
        }
        document.getElementById("MonthName").firstChild.data = MonthNames[ SiCalendar.GetMonth() ] + " " + SiCalendar.GetYear();
    }
}


function MousePosition(e)
{
	if (!e) var e = window.event;
	if (e.pageX || e.pageY) 	{
		PositionX = e.pageX;
		PositionY = e.pageY;
	}
	else if (e.clientX || e.clientY) 	{
		PositionX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
		PositionY = e.clientY + document.body.scrollTop	+ document.documentElement.scrollTop;
	}
}

