/**
* Filename.......: calendar.js
* Project........: Popup Calendar
* Last Modified..: Date: 2002/07/22 18:17:05
* CVS Revision...: Revision: 1.2
* Copyright......: 2001, 2002 Richard Heyes
*/

/**
* Global variables
*/
    dynCalendar_layers          = new Array();
    dynCalendar_mouseoverStatus = false;
    dynCalendar_mouseX          = 0;
    dynCalendar_mouseY          = 0;

/**
* The calendar constructor
*
* @access public
* @param string elemName     Name of the form element displaying the date -- Sten Ilau 2004-05-02
* @param string objName      Name of the object that you create
* @param string callbackFunc Name of the callback function
* @param string OPTIONAL     Optional layer name
* @param string OPTIONAL     Optional images path
*/
    function dynCalendar(elemName, objName, callbackFunc)
    {
        /**
        * Properties
        */
        // Todays date
        this.today          = new Date();
        this.date           = this.today.getDate();
        this.month          = this.today.getMonth();
        this.year           = this.today.getFullYear();

        this.elemName       = elemName;
        this.objName        = objName;
        this.callbackFunc   = callbackFunc;
        this.imagesPath     = arguments[3] ? arguments[3] : 'img/dyncalendar/';
        this.layerID        = arguments[4] ? arguments[4] : 'dynCalendar_layer_' + dynCalendar_layers.length;

        this.offsetX        = 5;
        this.offsetY        = 5;

        this.useMonthCombo  = true;
        this.useYearCombo   = true;
        this.yearComboRange = 10;
        this.yearComboRangeMin = arguments[5] ? arguments[5][0] : new Date().getFullYear() - this.yearComboRange;
        this.yearComboRangeMax = arguments[5] ? arguments[5][1] : new Date().getFullYear() + this.yearComboRange;
        
        this.picAddon		= arguments[6] ? arguments[6] : '';
        
        this.todayName		= arguments[7] ? arguments[7] : 'TÄNA';

        this.currentMonth   = this.month;
        this.currentYear    = this.year;

        /**
        * Public Methods
        */
        this.show              = dynCalendar_show;
        this.writeHTML         = dynCalendar_writeHTML;

        // Accessor methods
        this.setOffset         = dynCalendar_setOffset;
        this.setOffsetX        = dynCalendar_setOffsetX;
        this.setOffsetY        = dynCalendar_setOffsetY;
        this.setImagesPath     = dynCalendar_setImagesPath;
        this.setMonthCombo     = dynCalendar_setMonthCombo;
        this.setYearCombo      = dynCalendar_setYearCombo;
        this.setCurrentMonth   = dynCalendar_setCurrentMonth;
        this.setCurrentYear    = dynCalendar_setCurrentYear;
        this.setYearComboRange = dynCalendar_setYearComboRange;

        /**
        * Private methods
        */
        // Layer manipulation
        this._getLayer         = dynCalendar_getLayer;
        this._hideLayer        = dynCalendar_hideLayer;
        this._showLayer        = dynCalendar_showLayer;
        this._setLayerPosition = dynCalendar_setLayerPosition;
        this._setHTML          = dynCalendar_setHTML;

        // Miscellaneous
        this._getDaysInMonth   = dynCalendar_getDaysInMonth;
        this._mouseover        = dynCalendar_mouseover;

        /**
        * Constructor type code
        */
        
        dynCalendar_layers[dynCalendar_layers.length] = this;
        this.writeHTML(1);  //write cal links with placeholders
    }

/**
* Shows the calendar, or updates the layer if
* already visible.
*
* @access public
* @param integer month Optional month number (0-11)
* @param integer year  Optional year (YYYY format)
*/
    function dynCalendar_show()
    {
        // Variable declarations to prevent globalisation
        var month, year, monthnames, numdays, thisMonth, firstOfMonth;
        var ret, row, i, cssClass, linkHTML, previousMonth, previousYear;
        var nextMonth, nextYear, prevImgHTML, prevLinkHTML, nextImgHTML, nextLinkHTML;
        var monthComboOptions, monthCombo, yearComboOptions, yearCombo, html;

        this.currentMonth = month = arguments[0] != null ? arguments[0] : this.currentMonth;
        this.currentYear  = year  = arguments[1] != null ? arguments[1] : this.currentYear;

//        monthnames = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
        monthnames = new Array('Jaanuar', 'Veebruar', 'M&auml;rts', 'Aprill', 'Mai', 'Juuni', 'Juuli', 'August', 'September', 'Oktoober', 'November', 'Detsember');
        numdays    = this._getDaysInMonth(month, year);

        thisMonth    = new Date(year, month, 1);
        firstOfMonth = (thisMonth.getDay() + 6) % 7;//alustame n2dalat esmasp2evast

        // First few blanks up to first day
        ret = new Array(new Array());
        for(i=0; i<firstOfMonth; i++){
            ret[0][ret[0].length] = '<td onclick="alert(this.parentNode.parentNode.parentNode.innerHTML);">&nbsp;</td>';
        }

        // Main body of calendar
        row = 0;
        i   = 1;
        while(i <= numdays){
            if(ret[row].length == 7){
                ret[++row] = new Array();
            }

            /**
            * Generate this cells' HTML
            */
            cssClass = (i == this.date && month == this.month && year == this.year) ? 'dynCalendar_today' : 'dynCalendar_day';
            linkHTML = '<a href="javascript: ' + this.callbackFunc + "('" + this.elemName + "', " + i + ', ' + (Number(month) + 1) + ', ' + year + '); ' + this.objName + '.writeHTML(); ' + this.objName + '._hideLayer() ">' + (i++) + '</a>';
            ret[row][ret[row].length] = '<td align="center" class="' + cssClass + '">&nbsp;&nbsp;' + linkHTML + '</td>';
        }

        // Format the HTML
        for(i=0; i<ret.length; i++){
//            alert(ret[i]);
            ret[i] = ret[i].join('\n') + '\n';
        }

        previousYear  = thisMonth.getFullYear();
        previousMonth = thisMonth.getMonth() - 1;
        if(previousMonth < 0){
            previousMonth = 11;
            previousYear--;
        }

        nextYear  = thisMonth.getFullYear();
        nextMonth = thisMonth.getMonth() + 1;
        if(nextMonth > 11){
            nextMonth = 0;
            nextYear++;
        }

        prevImgHTML  = '<img src="' + this.imagesPath + 'prev.gif" alt="<<" border="0" />';
        prevLinkHTML = '<a href="javascript: ' + this.objName + '.show(' + previousMonth + ', ' + previousYear + ')">' + prevImgHTML + '</a>';
        nextImgHTML  = '<img src="' + this.imagesPath + 'next.gif" alt="<<" border="0" />';
        nextLinkHTML = '<a href="javascript: ' + this.objName + '.show(' + nextMonth + ', ' + nextYear + ')">' + nextImgHTML + '</a>';

        /**
        * Build month combo
        */
        if (this.useMonthCombo) {
            monthComboOptions = '';
            for (i=0; i<12; i++) {
                selected = (i == thisMonth.getMonth() ? 'selected="selected"' : '');
                monthComboOptions += '<option value="' + i + '" ' + selected + '>' + monthnames[i] + '</option>';
            }
            monthCombo = '<select name="months" onchange="' + this.objName + '.show(this.options[this.selectedIndex].value, ' + this.objName + '.currentYear)">' + monthComboOptions + '</select>';
        } else {
            monthCombo = monthnames[thisMonth.getMonth()];
        }

        /**
        * Build year combo
        */
        if (this.useYearCombo) {
            yearComboOptions = '';
            for (i = this.yearComboRangeMin; i <=  this.yearComboRangeMax; i++) {
                selected = (i == thisMonth.getFullYear() ? 'selected="selected"' : '');
                yearComboOptions += '<option value="' + i + '" ' + selected + '>' + i + '</option>';
            }
            yearCombo = '<select style="border: 1px groove" name="years" onchange="' + this.objName + '.show(' + this.objName + '.currentMonth, this.options[this.selectedIndex].value)">' + yearComboOptions + '</select>';
        } else {
            yearCombo = thisMonth.getFullYear();
        }
        
        tblClass = 'dynCalendarIE';
        if (navigator.userAgent.indexOf('MSIE') < 0) { // firefoxi ja opera jaoks
        	tblClass = 'dynCalendarNotIE';
        }
		
		html = '';
        //html = '<iframe style="width: 210px; position: absolute; "></iframe>';
        //html += '<div style="width: 210px; position: absolute; background-color: #eeeeee;">';
        html += '<iframe style="width: 210px; height: 120px; position: absolute;"></iframe>';
        html += '<table class="' + tblClass + '">';
        html += '<tr>';
        html += '<td class="dynCalendar_header">' + prevLinkHTML + '</td>';
        html += '<td colspan="5" align="center" class="dynCalendar_header">' + monthCombo + ' ' + yearCombo + '</td>';
        html += '<td align="right" class="dynCalendar_header">' + nextLinkHTML + '</td>';
        html += '</tr>';
        html += '<tr>';
        html += '<td class="dynCalendar_dayname">&nbsp;&nbsp;E</td>';
        html += '<td class="dynCalendar_dayname">&nbsp;&nbsp;T</td>';
        html += '<td class="dynCalendar_dayname">&nbsp;&nbsp;K</td>';
        html += '<td class="dynCalendar_dayname">&nbsp;&nbsp;N</td>';
        html += '<td class="dynCalendar_dayname">&nbsp;&nbsp;R</td>';
        html += '<td class="dynCalendar_dayname">&nbsp;&nbsp;L</td>';
        html += '<td class="dynCalendar_dayname">&nbsp;&nbsp;P</td>';
        html += '</tr>';
        html += '<tr>' + ret.join('</tr>\n<tr>') + '</tr>';
        html += '</table>';
        //html += '</div>';
        
        this._setHTML(html);
        if ((!arguments[0] && !arguments[1]) || arguments[2]) {
            this._showLayer();
            this._setLayerPosition();
        }
    }

/**
* Writes HTML to document for layer
*
* @access public
*/
    function dynCalendar_writeHTML(todo)
    {

//        if(typeof(eval('document.mainform.'+this.elemName+'_kuu')) != 'undefined'){


        if(typeof(document.getElementById(this.elemName)) != 'undefined'){

            var kuupaev = document.getElementById(this.elemName).value;
            var kuupaev_mas = kuupaev.split('.');
            if(kuupaev_mas.length==3){
                var meie_kuukene = kuupaev_mas[1]*1-1;
                var meie_aastakene = kuupaev_mas[2]*1;
            }else{
                var meie_kuukene = (this.currentMonth*1);
                var meie_aastakene = this.currentYear;
            }
        }else{
           var meie_kuukene = (this.currentMonth*1);
           var meie_aastakene = this.currentYear;
        }
           
        
 /*       //kuu paika
        eval('var s_kuu = document.mainform.'+elemName+'_kuu;');
        alert(s_kuu.options[s_kuu.selectedIndex].value);
        for (var i = 0; i < s_kuu.options.length; i++) {
            if(s_kuu.options[i].value == kuu){
                s_kuu.selectedIndex = i;
                break;
            }
        }

        //aasta paika
        eval('var s_aasta = document.mainform.'+prefix+'_aasta;');
        for (var i = 0; i < s_aasta.options.length; i++) {
            if(s_aasta.options[i].value == aasta){
                s_aasta.selectedIndex = i;
                break;
            }
        }*/

        //kontrollime kas on vaja ka tekitada koht kuhu kuvada cal pildike koos lingiga
        //seda on vaja vaid klassi initsialiseerimisel (lehekülje esmakordsel laadimisel)
        if(todo == 1){
            document.write('<span id="'+this.objName+'"></span>');
        }

//        if (is_ie5up || is_nav6up || is_gecko || is_opera5up) {
            //tyytav vers ilma rewriteta (vt.show fn.-is selle fn.-i uuesti väljakutsumist)
            //document.write('<a href="javascript: ' + this.objName + '.show('+meie_kuukene+','+meie_aastakene+',1)"><img src="' + this.imagesPath + 'dynCalendar.gif" border="0" /></a>');
            //document.write('<div class="dynCalendar" id="' + this.layerID + '" onmouseover="' + this.objName + '._mouseover(true)" onmouseout="' + this.objName + '._mouseover(false)"></div>');
             
            //ehitame (uuesti) lingi uute parameetritega
            var pic = 'dynCalendar';
            if (this.picAddon.length > 0) {
            	pic += '_' + this.picAddon;
            }
            
            my_text = '<a href="javascript: ' + this.objName + '.show(' + meie_kuukene + ',' + meie_aastakene + 
           			',1)"><img src="' + this.imagesPath + pic + '.gif" border="0" /></a>';
//            if(is_ie5up){
                my_text = my_text + '<div style="display:none; z-index:0; position:absolute;" id="' + 
                		this.layerID + '" onmouseover="' + this.objName + '._mouseover(true)" onmouseout="' + 
                		this.objName + '._mouseover(false)"></div>';
//            } else {
                    //selles versioonis tekiks ilus teiste elementide peale kalendri aken
                    //disabletud aga kuna ie kuvab elementide alla.
                    //kui teha normaalne detection siis võis selle taas enableda mitte ie browseritele
              //my_text = my_text + '<div class="dynCalendar" id="' + this.layerID + '" onmouseover="' + this.objName + '._mouseover(true)" onmouseout="' + this.objName + '._mouseover(false)"></div>';
//            }
//			my_text += '<div id="' + this.layerID + '" onmouseover="' + this.objName + 
//					'._mouseover(true)" onmouseout="' + this.objName + '._mouseover(false)"></div>';

            my_text += '<a href="javascript:callback_ISO1(\'' + this.elemName + '\', ' + 
            		this.date + ', ' + (this.month + 1) + ', ' + this.year + ');">['+this.todayName+']</a>&nbsp;';
            var my_span = document.getElementById(this.objName);
            my_span.innerHTML = my_text;

//        }
    }

/**
* Sets the offset to the mouse position
* that the calendar appears at.
*
* @access public
* @param integer Xoffset Number of pixels for vertical
*                        offset from mouse position
* @param integer Yoffset Number of pixels for horizontal
*                        offset from mouse position
*/
    function dynCalendar_setOffset(Xoffset, Yoffset)
    {
        this.setOffsetX(Xoffset);
        this.setOffsetY(Yoffset);
    }

/**
* Sets the X offset to the mouse position
* that the calendar appears at.
*
* @access public
* @param integer Xoffset Number of pixels for horizontal
*                        offset from mouse position
*/
    function dynCalendar_setOffsetX(Xoffset)
    {
        this.offsetX = Xoffset;
    }

/**
* Sets the Y offset to the mouse position
* that the calendar appears at.
*
* @access public
* @param integer Yoffset Number of pixels for vertical
*                        offset from mouse position
*/
    function dynCalendar_setOffsetY(Yoffset)
    {
        this.offsetY = Yoffset;
    }

/**
* Sets the images path
*
* @access public
* @param string path Path to use for images
*/
    function dynCalendar_setImagesPath(path)
    {
        this.imagesPath = path;
    }

/**
* Turns on/off the month dropdown
*
* @access public
* @param boolean useMonthCombo Whether to use month dropdown or not
*/
    function dynCalendar_setMonthCombo(useMonthCombo)
    {
        this.useMonthCombo = useMonthCombo;
    }

/**
* Turns on/off the year dropdown
*
* @access public
* @param boolean useYearCombo Whether to use year dropdown or not
*/
    function dynCalendar_setYearCombo(useYearCombo)
    {
        this.useYearCombo = useYearCombo;
    }

/**
* Sets the current month being displayed
*
* @access public
* @param boolean month The month to set the current month to
*/
    function dynCalendar_setCurrentMonth(month)
    {
        this.currentMonth = month;
    }

/**
* Sets the current month being displayed
*
* @access public
* @param boolean year The year to set the current year to
*/
    function dynCalendar_setCurrentYear(year)
    {
        this.currentYear = year;
    }

/**
* Sets the range of the year combo. Displays this number of
* years either side of the year being displayed.
*
* @access public
* @param integer range The range to set
*/
    function dynCalendar_setYearComboRange(range)
    {
        this.yearComboRange = range;
        this.yearComboRangeMin = new Date().getFullYear() - range;
        this.yearComboRangeMax = new Date().getFullYear() + range;
    }

/**
* Returns the layer object
*
* @access private
*/
    function dynCalendar_getLayer()
    {
        var layerID = this.layerID;

        if (document.getElementById(layerID)) {

            return document.getElementById(layerID);

        } else if (document.all(layerID)) {
            return document.all(layerID);
        }
    }

/**
* Hides the calendar layer
*
* @access private
*/
    function dynCalendar_hideLayer()
    {
//        this._getLayer().style.visibility = 'hidden';
        this._getLayer().style.display = 'none';
    }

/**
* Shows the calendar layer
*
* @access private
*/
    function dynCalendar_showLayer()
    {
//        this._getLayer().style.visibility = 'visible';
        this._getLayer().style.display = 'block';
    }

/**
* Sets the layers position
*
* @access private
*/
    function dynCalendar_setLayerPosition()
    {
        this._getLayer().style.top  = (dynCalendar_mouseY + this.offsetY) + 'px';
        this._getLayer().style.left = (dynCalendar_mouseX + this.offsetX) + 'px';
    }

/**
* Sets the innerHTML attribute of the layer
*
* @access private
*/
    function dynCalendar_setHTML(html)
    {
        this._getLayer().innerHTML = html;
    }

/**
* Returns number of days in the supplied month
*
* @access private
* @param integer month The month to get number of days in
* @param integer year  The year of the month in question
*/
    function dynCalendar_getDaysInMonth(month, year)
    {
        monthdays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
        if (month != 1) {
            return monthdays[month];
        } else {
            return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0 ? 29 : 28);
        }
    }

/**
* onMouse(Over|Out) event handler
*
* @access private
* @param boolean status Whether the mouse is over the
*                       calendar or not
*/
    function dynCalendar_mouseover(status)
    {
        dynCalendar_mouseoverStatus = status;
        return true;
    }

/**
* onMouseMove event handler
*/
    dynCalendar_oldOnmousemove = document.onmousemove ? document.onmousemove : new Function;

    document.onmousemove = function ()
    {
//        if (is_ie5up || is_nav6up || is_gecko || is_opera5up) {
            if (arguments[0]) {
                dynCalendar_mouseX = arguments[0].pageX;
                dynCalendar_mouseY = arguments[0].pageY;
            } else {
                if (event && document && document.body) {
                	dynCalendar_mouseX = event.clientX + document.body.scrollLeft;
                	dynCalendar_mouseY = event.clientY + document.body.scrollTop;
            	}
                arguments[0] = null;
            }

            dynCalendar_oldOnmousemove();
//        }
    }

/**
* Callbacks for document.onclick
*/
    dynCalendar_oldOnclick = document.onclick ? document.onclick : new Function;

    document.onclick = function ()
    {
//        if (is_ie5up || is_nav6up || is_gecko || is_opera5up) {
            if(!dynCalendar_mouseoverStatus){
                for(i=0; i<dynCalendar_layers.length; ++i){
                    dynCalendar_layers[i]._hideLayer();
                }
            }

            dynCalendar_oldOnclick(arguments[0] ? arguments[0] : null);
//        }
    }



    function callback_ISO1(elemId, date, month, year)
    {
        if (elem = document.getElementById(elemId)){
            if (String(month).length == 1) {
                month = '0' + month;
            }

            if (String(date).length == 1) {
                date = '0' + date;
            }
            elem.value = date + '.' + month + '.' + year;
        }
    }


    function callback_ISO1_prefixiga(prefix, paev, kuu, aasta)
    {

        //p2ev paika
        if(typeof(document.getElementById(prefix+'_paev')) != 'undefined'
            && document.getElementById(prefix+'_paev')){
            //eval('var s_paev = document.mainform.'+prefix+'_paev');
            var s_paev = document.getElementById(prefix+'_paev');
            if(s_paev.type == 'select-one' || s_paev.type == 'select-multiple'){
                for(var i = 0; i < s_paev.options.length; i++){
                    if(s_paev.options[i].value == paev){
                        s_paev.selectedIndex = i;
                        break;
                    }
                }
            } else if (s_paev.type == 'text'){
                s_paev.value = paev;
            }
        }

        //kuu paika
        if(typeof(document.getElementById(prefix+'_kuu')) != 'undefined'
            && document.getElementById(prefix+'_kuu')){
            //eval('var s_kuu = document.mainform.'+prefix+'_kuu;');
            var s_kuu = document.getElementById(prefix+'_kuu');
            if(s_kuu.type == 'select-one' || s_kuu.type == 'select-multiple'){
                for (var i = 0; i < s_kuu.options.length; i++) {
                    if(s_kuu.options[i].value == kuu){
                        s_kuu.selectedIndex = i;
                        break;
                    }
                }
            } else if(s_kuu.type == 'text'){
                s_kuu.value = kuu;
            }
        }

        //aasta paika
        //eval('var s_aasta = document.mainform.'+prefix+'_aasta;');
        var s_aasta = document.getElementById(prefix+'_aasta');
        if(s_aasta.type == 'select-one' || s_aasta.type == 'select-multiple'){
            for (var i = 0; i < s_aasta.options.length; i++) {
                if(s_aasta.options[i].value == aasta){
                    s_aasta.selectedIndex = i;
                    break;
                }
            }
        } else if (s_aasta.type == 'text'){
            s_aasta.value = aasta;
        }

    }
