//************************************************************************************
// weeklycalendar
// Copyright (C) 2006, Massimo Beatini
//
// This software is provided "as-is", without any express or implied warranty. In
// no event will the authors be held liable for any damages arising from the use
// of this software.
//
// Permission is granted to anyone to use this software for any purpose, including
// commercial applications, and to alter it and redistribute it freely, subject to
// the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not claim
//    that you wrote the original software. If you use this software in a product,
//    an acknowledgment in the product documentation would be appreciated but is
//    not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
//    misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source distribution.
//
//************************************************************************************

//path variables

var iFrameDocumentTop;
var iFrameDocument;
var calData = "";
var FrameContent = "";
var mouseObject = "";
function intializeCalendar(pagetype)
{
	if(pagetype == "wizard")
	{
		iFrameDocumentTop = document.getElementById("SplakeContent");
  		iFrameDocument = iFrameDocumentTop.contentDocument;
  		if (iFrameDocument == undefined || iFrameDocument == null)
			iFrameDocument = iFrameDocumentTop.contentWindow.document;
	}
	else if(pagetype == "webpage")
	{
		iFrameDocumentTop = document;
  		iFrameDocument = iFrameDocumentTop;
  		FrameContent = iFrameDocument.getElementById("SplakeContent");
	}
}

function tellme()
{
	iFrameDocumentTop = document.getElementById("SplakeContent");
	iFrameDocument = iFrameDocumentTop.contentDocument;
	if (iFrameDocument == undefined || iFrameDocument == null)
		iFrameDocument = iFrameDocumentTop.contentWindow.document;
	FrameContent = iFrameDocument.getElementById("MainContent");

	/*
	//
	// handle mousemove
	//
	if ((navigator.appName.indexOf("Netscape") != -1) || (navigator.appName.indexOf("Opera") != -1))
	{
	    if (iFrameDocument.onmousemove == undefined)
	    {
	    	alert(iFrameDocument);
	    	alert(iFrameDocument.onmousemove);
		    iFrameDocument.onmousemove = w_funMouseMove;
		    alert(iFrameDocument.onmousemove);
		}
	}

	//alert("twe1 = " + FrameContent.innerHTML);
	*/
}


// variable declarations
var w_d = new Date()
var w_monthname=new Array("January","February","March","April","May","June","July","August","September","October","November","December");
var w_dayname = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
var w_StartOfWeek = 1; // Monday

// image title
var prev_month_title = "Previous month";
var next_month_title = "Next month";
var close_title = "Close";


// set the default position
// for the week end days (Staurday,Sunday)
var weekend_pos = new Array(6,0);


var w_min_year = 1940;
var w_max_year = 2030;

var gx = 0;
var gy = 0;

var w_linkedInputText_1;
var w_linkedInputText_2;


var HideWeekCol = false;

function test()
{
	alert("This is working");
}

//
//
//
function w_funMouseMove(evnt)
{
	alert("Event:" + evnt);
	gx = evnt.pageX;
	gy = evnt.pageY;

	return true;
}


//
//
//
function w_changeMonth(id)
{
    var box = iFrameDocument.getElementById(id);
    var mm = box.options[box.selectedIndex].value;
    w_d.setMonth(mm);
    w_renderCalendar(0);
}

//
//
//
function w_changeYear(id)
{
    var box = iFrameDocument.getElementById(id);
    var yy = box.options[box.selectedIndex].value;
    w_d.setFullYear(yy);
    w_renderCalendar(0);
}

//
//
//
function w_getWeek(year,month,day){
    //Find JulianDay
    month += 1; //use 1-12
    var a = Math.floor((14-(month))/12);
    var y = year+4800-a;
    var m = (month)+(12*a)-3;

    var jd = day + Math.floor(((153*m)+2)/5) +
                 (365*y) + Math.floor(y/4) - Math.floor(y/100) +
                 Math.floor(y/400) - 32045;      // (gregorian calendar)

/*
    var jd = (day+1)+Math.round(((153*m)+2)/5)+(365+y) +
                     Math.round(y/4)-32083;    // (julian calendar)
*/

    //now calc weeknumber according to JD
    var d4 = (jd+31741-(jd%7))%146097%36524%1461;
    var L = Math.floor(d4/1460);
    var d1 = ((d4-L)%365)+L;
    NumberOfWeek = Math.floor(d1/7) + 1;
    return NumberOfWeek;
}



//
//
//
function w_writeDayNumber(d)
{
	var dd = new Date(d);
	var temp = new Date(d);

	// reset data array
	for (i=0;i<6;i++)
	{
 		for (j=0;j<7;j++)
 		{
			//iFrameDocument.getElementById("w_c" +i+""+j).innerHTML= "";
			var tempvarhere = iFrameDocument.getElementById("w_c" +i+""+j);
			tempvarhere.innerHTML = "";
			iFrameDocument.getElementById("w_c" +i+""+j).className = "day_out";
 	    }
        //iFrameDocument.getElementById("week_" +i).innerHTML = '';
		var tempvarhere = iFrameDocument.getElementById("week_" +i);
		tempvarhere.innerHTML = '';
	}

	// set to the first day of the month
	dd.setDate(1);

	// fill data array
	i = 0;
	j = 0;

    // previous month's days
    j = dd.getDay() - w_StartOfWeek;
    if (j<0)
        j = 7 + j;

    if (j > 0)
    {
        temp.setDate(dd.getDate()-1);
        for (k=j-1; k>=0; k--)
        {
			iFrameDocument.getElementById("w_c" +i+""+k).innerHTML= temp.getDate();
		    if ((weekend_pos[0] == k) || (weekend_pos[1] == k))
		        iFrameDocument.getElementById("w_c" +i+""+k).className = "weekends_out";
		    else
			    iFrameDocument.getElementById("w_c" +i+""+k).className = "day_out";

            temp.setDate(temp.getDate()-1);
        }
    }

	var week = -1;
    var iStartWeek = -1;
    var iEndWeek = -1;
    var weekEl;
    var dayval;

	do
	{
	    // get the position according to
	    // StartOfWeek
	    j = dd.getDay() - w_StartOfWeek;
	    if (j<0)
	        j = 7 + j;

	    if (iStartWeek==-1)
	        iStartWeek = j;
        iEndWeek = j;

		dayval = dd.getDate();



	    // get the week number
	    if (week < 0)
	        week = w_getWeek(w_d.getFullYear(), w_d.getMonth(), dayval);
		iFrameDocument.getElementById("w_c" +i+""+j).innerHTML= dayval;

		// set week ends layout
		if ((weekend_pos[0] == j) || (weekend_pos[1] == j))
		    iFrameDocument.getElementById("w_c" +i+""+j).className = "weekends";
		else
		    iFrameDocument.getElementById("w_c" +i+""+j).className = "day";
        {
            // set today layout
            var today = new Date();

			if ((today.getDate() ==  dayval) && (today.getMonth() == w_d.getMonth()) && (today.getFullYear() == w_d.getFullYear()) )
				iFrameDocument.getElementById("w_c" +i+""+j).className = "today";
        }

        ////////
        // dynamically set the onclick event
        // only on the day of the selected month
        ////////

        var object = iFrameDocument.getElementById("w_c" +i+""+j);
        object.rownumber = i;
        object.colnumber = j;

        if(window.addEventListener){ // Mozilla, Netscape, Firefox
	        object.addEventListener('click', w_setDate, false);
        } else { // IE
	        object.attachEvent('onclick', w_setDate);
        }

        ///////


	    if (week < 0)
		{
			var tempvarhere = iFrameDocument.getElementById("week_" +i);
			tempvarhere.innerHTML = '';
	        //iFrameDocument.getElementById("week_" +i).innerHTML = '';
		}
	    else if (w_StartOfWeek != 1)
		{
	        //iFrameDocument.getElementById("week_" +i).innerHTML =
			var tempvarhere = iFrameDocument.getElementById("week_" +i);
			tempvarhere.innerHTML = "&lt;";
		}
	    else
		{
	        //iFrameDocument.getElementById("week_" +i).innerHTML =
			var tempvarhere = iFrameDocument.getElementById("week_" +i);
			tempvarhere.innerHTML =week;
		}

        weekEl = iFrameDocument.getElementById("week_" +i);

        // if HideWeekCol change the class
        // hide the week col and its header
        if (HideWeekCol)
        {
            weekEl.className = "weekhidden";
            iFrameDocument.getElementById("weekHeader").className = "weekhidden";
        }
        else
        {
            iFrameDocument.getElementById("weekHeader").className = "week";
            weekEl.className = "weeksel";
        }

		if (j == 6)
		{
            ////////
            // dynamically set the onclick event
            // on the week number
            ////////
            weekEl.startweek = iStartWeek;
            weekEl.endweek = iEndWeek;
            weekEl.rowweek = i;

            if(window.addEventListener){ // Mozilla, Netscape, Firefox
                weekEl.addEventListener('click', w_SetWeekDate, false);
            } else { // IE
                weekEl.attachEvent('onclick', w_SetWeekDate);
            }
            ///////

		    week = -1;
		    iStartWeek = -1;
		    iEndWeek = -1;
		    i++;
		}

		dd.setDate(dd.getDate() + 1);

	} while (dd.getDate() != 1);

	if ((iStartWeek!=-1) && (iEndWeek!=-1))
	{
        weekEl = iFrameDocument.getElementById("week_" +i);

        ////////
        // dynamically set the onclick event
        // on the week number
        ////////
        weekEl.startweek = iStartWeek;
        weekEl.endweek = iEndWeek;
        weekEl.rowweek = i;

        if(window.addEventListener){ // Mozilla, Netscape, Firefox
            weekEl.addEventListener('click', w_SetWeekDate, false);
        } else { // IE
            weekEl.attachEvent('onclick', w_SetWeekDate);
        }
        ///////
    }

    // next month's days
    if ((j < 7))
    {
        temp = dd;
        for (k=j+1; k<7; k++)
        {
			iFrameDocument.getElementById("w_c" +i+""+k).innerHTML= temp.getDate();
	        if ((weekend_pos[0] == k) || (weekend_pos[1] == k))
	            iFrameDocument.getElementById("w_c" +i+""+k).className = "weekends_out";
	        else
			    iFrameDocument.getElementById("w_c" +i+""+k).className = "day_out";
            temp.setDate(temp.getDate()+1);
        }
    }


}


//
// render calendar accordint to the selected
// month (k)
//
function w_renderCalendar(k)
{
    var monthsel_html='';

	w_d.setMonth(w_d.getMonth() + k);

    monthsel_html += '<select class="nav" id="w_sel_month" onchange="w_changeMonth(\'w_sel_month\')">';
    for (im=0; im < 12; im++)
    {
        monthsel_html += '<option value="' + im + '" ' + ((im == w_d.getMonth())?'selected ':'')+ '>'+ w_monthname[im] + '</option>';
    }
    monthsel_html += '</select>';
    monthsel_html += ' ';


    monthsel_html += '<select class="nav" id="w_sel_year" onchange="w_changeYear(\'w_sel_year\')">';
    for (im = w_min_year; im <= w_max_year; im++)
    {
        monthsel_html += '<option value="' + im + '" ' + ((im == w_d.getFullYear())?'selected ':'')+ '>'+ im + '</option>';
    }
    monthsel_html += '</select>';
    monthsel_html += ' ';

	var tempvarhere = iFrameDocument.getElementById('w_month_year');
	tempvarhere.innerHTML = monthsel_html;

    // write days number
    w_writeDayNumber(w_d);
 }



//
// set clicked date
//
function w_setDate(evt)
{
	var m="";
	var g="";
	var mMonth;
	var mDay;
	var i,j;


	var e_out;
	var ie_var = "srcElement";
	var moz_var = "target";
	var prop_var = "rownumber";

	// "target" for Mozilla, Netscape, Firefox et al. ; "srcElement" for IE
	evt[moz_var] ? e_out = evt[moz_var][prop_var] : e_out = evt[ie_var][prop_var];
	i = e_out;
	prop_var = "colnumber";
	evt[moz_var] ? e_out = evt[moz_var][prop_var] : e_out = evt[ie_var][prop_var];
	j = e_out;

		mMonth = (w_d.getMonth()+1);
		mDay = iFrameDocument.getElementById("w_c"+i+j).innerHTML;

		if(mMonth<10)
			m = "0" + mMonth
		else
			m = mMonth

		if (mDay<10)
			g = "0" + mDay
		else
			g = mDay

        // set the selected date
        try
        {
		iFrameDocument.getElementById(w_linkedInputText_1).value = m + "/" + g + "/" + w_d.getFullYear();
        iFrameDocument.getElementById(w_linkedInputText_2).value = '';
 		}
 		catch(e){}

	    w_hiddenCalendar();
}

//
// set week start and end date
// in the selected month
//
function w_SetWeekDate(evt)
{
	var m="";
	var g="";
	var mMonth;
	var mDay;
	var result = '';
	var startW = '';
	var endW = '';


	var e_out;
	var ie_var = "srcElement";
	var moz_var = "target";
	var prop_var = "startweek";
    var istartWeek, iendWeek;
    var rowWeek;

	// "target" for Mozilla, Netscape, Firefox et al. ; "srcElement" for IE
	evt[moz_var] ? e_out = evt[moz_var][prop_var] : e_out = evt[ie_var][prop_var];
	istartWeek = e_out;
	prop_var = "endweek";
	evt[moz_var] ? e_out = evt[moz_var][prop_var] : e_out = evt[ie_var][prop_var];
	iendWeek = e_out;

	prop_var = "rowweek";
	evt[moz_var] ? e_out = evt[moz_var][prop_var] : e_out = evt[ie_var][prop_var];
	rowWeek = e_out;


    mMonth = (w_d.getMonth()+1);

    if(mMonth<10)
        m = "0" + mMonth
    else
        m = mMonth

    mDay = iFrameDocument.getElementById("w_c"+rowWeek+istartWeek).innerHTML;
    if (mDay<10)
	    g = "0" + mDay
    else
	    g = mDay

    startW = m + "/" + g + "/" + w_d.getFullYear();

    mDay = iFrameDocument.getElementById("w_c"+rowWeek+iendWeek).innerHTML;
    if (mDay<10)
	    g = "0" + mDay
    else
	    g = mDay

    endW = m + "/" + g + "/" + w_d.getFullYear();

    // set the selected date
    try
    {
    iFrameDocument.getElementById(w_linkedInputText_1).value = startW;
    iFrameDocument.getElementById(w_linkedInputText_2).value = endW;
    }
    catch(e)
    {};

    w_hiddenCalendar();
}

//
// display date picker
// hide the col week
//
function w_displayDatePicker(linkedId1, eventObj)
{
	mouseObject = eventObj;

	w_linkedInputText_1 = linkedId1;
	w_linkedInputText_2 = null;

	HideWeekCol = true;
    w_displayCal();
}

//
// display calendar
//
function w_displayCalendar(linkedId1, linkedId2)
{
	w_linkedInputText_1 = linkedId1;
	w_linkedInputText_2 = linkedId2;

    HideWeekCol = false;
    w_displayCal();
}


function w_displayCal()
{
	w_renderCalendar(0);
	var weeklyCalendar = iFrameDocument.getElementById('weeklyCalendar');
	//alert("w_displayCal");
	if(navigator.userAgent.indexOf("MSIE") != -1)
	{
		weeklyCalendar.style.left=mouseObject.x + Math.max(document.body.scrollLeft, document.documentElement.scrollLeft) + 5 + 'px';
		weeklyCalendar.style.top=mouseObject.y + Math.max(document.body.scrollTop, document.documentElement.scrollTop) + 5 + 'px';
	}
	else if ((navigator.appName.indexOf("Netscape") != -1) || (navigator.appName.indexOf("Opera") != -1))
	{

		weeklyCalendar.style.left=mouseObject.pageX + 5 + 'px';
		weeklyCalendar.style.top=mouseObject.pageY + 5 + 'px';

	}
	weeklyCalendar.style.visibility = "visible";
}

//
// hidden calendar
//
function w_hiddenCalendar()
{
	iFrameDocument.getElementById('weeklyCalendar').style.visibility='hidden';


    // remove the attached events
    var i, j;
    var week;
    var daycol;

    for (i = 0; i < 7; i++)
    {
        // detach event from week element
        try
        {
            week = iFrameDocument.getElementById("week_" +i);
            if(window.removeEventListener()){ // Mozilla, Netscape, Firefox
	            week.removeEventListener('click', w_SetWeekDate, false);
            } else { // IE
	            week.detachEvent('onclick', w_SetWeekDate);
            }
        }
        catch(e){};

        // detach event from each day col
        try
        {
            for (j=0; j <7; j++)
            {
                daycol = iFrameDocument.getElementById("w_c" +i+""+j);
                if(window.removeEventListener()){ // Mozilla, Netscape, Firefox
	                daycol.removeEventListener('click', w_setDate, false);
                } else { // IE
	                daycol.detachEvent('onclick', w_setDate);
                }
            }
        }
        catch(e){};
    }

}


function w_writeDayname()
{
    var mDay;
    calData +='<tr>';
    for(wd =0; wd < 7; wd++)
    {
        mDay = wd + w_StartOfWeek;

        if (mDay > 6)
            mDay = mDay-7;
        calData +='<td class="wd">' + w_dayname[mDay] + '</td>';

        // set week ends postion
        if (w_dayname[mDay] == 'Sat')
            weekend_pos[0] = wd;
        if (w_dayname[mDay] == 'Sun')
            weekend_pos[1] = wd;

    }

    calData += '<td class="week" id="weekHeader">Week</td>';

    calData += '</tr>';

}

///
///
///
function buildWeeklyCalendar(WeekStart)
{
    if (WeekStart != undefined)
        w_StartOfWeek = WeekStart;

    calData += '<div id="weeklyCalendar" name="weeklyCalendar" class="calendar">';
    calData += '<table class="calendar" >';
    calData += '<tr><td colspan="8">';
    // header table
    calData += '<table width="100%" cellpading="0" cellspacing="0">';

    calData += '<tr class="firstrow"><td width="8px" onClick="w_renderCalendar(-1);" align="right" ><img src="Images/arrow_left.gif" title="' + prev_month_title + '" border="0"></td>';
    calData += '<td width="8px" onClick="w_renderCalendar(1);" align="left" ><img src="Images/arrow_right.gif" title="' + next_month_title + '" border="0"></td>';
    calData += '<td colspan="4" id="w_month_year" align="center">';

    calData += '<select id="w_sel_month">';

    for (im=0; im < 12; im++)
    {
        calData += '<option value="' + im + '" ' + ((im == w_d.getMonth())?'selected ':'')+ '>'+ w_monthname[im] + '</option>';
    }
    calData += '</select>';
    calData += ' ';
    calData += '<select id="w_sel_year">';

    for (im = w_min_year; im <= w_max_year; im++)
    {
        calData += '<option value="' + im + '" ' + ((im == w_d.getFullYear())?'selected ':'')+ '>'+ im + '</option>';
    }
    calData += '</select>';

    calData += '</td>';

    calData += '<td align="center" onClick="w_hiddenCalendar()"><img src="Images/close.gif" title="' + close_title + '" border="0"></td>';

    calData += '</tr>';

    calData += '</table>';
    // end header table

    calData += '</td></tr>';

    w_writeDayname();

    // init day/week number
    for (i=0;i<6;i++)
    {
	    calData += '  <tr>';

	    for (j=0;j<7;j++)
	    {
//	            calData += '<td onClick="w_setDate('+i+','+j+')" class="day_out" id="w_c' + i + j + '">&nbsp;</td>');
	            calData += '<td  class="day_out" onmouseover="return escape(\'This is area 1\')" id="w_c' + i + j + '">&nbsp;</td>';
	    }

//	    calData += '<td class="weeksel" id="week_'+ i + '" onClick="w_SetWeekDate(' + i + ')">&nbsp;Select&nbsp;</td>');
	    calData += '<td class="weeksel" id="week_'+ i + '">&nbsp;Select&nbsp;</td>';
	    calData += '  </tr>';
    }
    calData += '</table></div>';

	FrameContent.innerHTML += calData;
	w_hiddenCalendar();
	//alert("FUNNY: " + FrameContent.innerHTML);
}



