/* Based on code (c) Fredrik Schultz 2005 */

var _calendar_template_header = "<img src=\"../gfx/puffar/calendar-head.gif\" alt=\"\" class=\"top\" />"+
                                  "<h2>@@MONTHNAME@@</h2>"+
								  "<div class=\"step-month\">"+
								  "		<a href=\"#\" onclick='prevMonth(myCal);return false;'>"+
								  "			<img src=\"/gfx/arrow/arrow-white-month-left.gif\" alt=\"\">"+ //F&ouml;reg&aring;ende m&aring;nad &lt;\">"+
								  "		</a>"+
								  "		<a href=\"#\" onclick=\"nextMonth(myCal);return false;\">"+
								  "			<img src=\"/gfx/arrow/arrow-white-month-right.gif\" alt=\"\">"+ //N&auml;sta m&aring;nad &gt;\">"+
								  "		</a>"+
								  "</div>"+
                                  "<table>"+
                                  "  <colgroup>"+
                                  "     <col style=\"width:20px;\" />"+
                                  "     <col style=\"border-right:1px #dc75ba solid; width:23px;\" />"+
                                  "     <col style=\"border-right:1px #dc75ba solid; width:23px;\" />"+
                                  "     <col style=\"border-right:1px #dc75ba solid; width:23px;\" />"+
                                  "     <col style=\"border-right:1px #dc75ba solid; width:23px;\" />"+
                                  "     <col style=\"border-right:1px #dc75ba solid; width:23px;\" />"+
                                  "     <col style=\"border-right:1px #dc75ba solid; width:23px;\" />"+
                                  "     <col style=\"border-right:1px #dc75ba solid; width:23px;\" />"+
                                  "  </colgroup>"+
                                  "  <tr class=\"top\">"+
                                  "    <td style=\"border:0;\"></td>"+
                                  "    <th>M&aring;</th>"+
                                  "    <th>Ti</th>"+
                                  "    <th>On</th>"+
                                  "    <th>To</th>"+
                                  "    <th>Fr</th>"+
                                  "    <th>L&ouml;</th>"+
                                  "    <th>S&ouml;</th>"+
                                  "  </tr>";
                                  

var _calendar_template_footer = "</table>"+
                                  "<img src=\"../gfx/puffar/calendar-btm.gif\" alt=\"\" class=\"calbottom\" />";


var _week_template_header     = "  <tr>"+
                                  "    <th><a href=\"#\" onclick=\"$('#todaytab').removeClass('selected');$('#weektab').addClass('selected');LoadCalenderContent('@@DATE@@','week');return false;\">@@WEEKNUMBER@@</a></th>";


var _week_template_footer     = "  </tr>";


var _day_template_empty       = "<td><span>&nbsp;</span></td>";


var _day_template_unavailable = "<td>@@DAY@@</td>";



function Calendar(objName,selectedDate,divTag,selectboxDay,selectboxMonth,enableD,firstAvailable,synch,tabindx,callBack)
{
	var today=new Date();
	this.todayDate=today;
	this.todayYear=today.getFullYear();
	this.todayMonth=today.getMonth();
	this.todayDay=today.getDate();

  if(!firstAvailable) { firstAvailable=today; }
  this.firstDate=firstAvailable;
  this.firstYear=firstAvailable.getFullYear();
  this.firstMonth=firstAvailable.getMonth();
  this.firstDay=firstAvailable.getDate();

  if(!selectedDate) { selectedDate=firstAvailable; }
  this.selectedDate=selectedDate;
  this.selectedYear=selectedDate.getFullYear();
  this.selectedMonth=selectedDate.getMonth();
  this.selectedDay=selectedDate.getDate();

  this.enabled=enableD;
	this.name=objName;
	this.divtag=divTag;
	this.selectboxday=selectboxDay;
	this.selectboxmonth=selectboxMonth;
  this.sync=synch;
  this.tabindx=tabindx;
	
	this.language="sv";
	
	this.paint=paintCalendar;
	this.getString=getDateString;
  this.disable=disableCalendar;
  this.enable=enableCalendar;
  this.callBack=callBack;
  this.setDate=setCalendarDate;
}

function disableCalendar() {
  this.enabled=false;
  this.paint();
}

function enableCalendar() {
  this.enabled=true;
  this.paint();
}

function getDateString() {
	return(this.selectedYear+"-"+(this.selectedMonth<9?'0'+(this.selectedMonth+1):this.selectedMonth+1)+"-"+(this.selectedDay<10?'0'+this.selectedDay:this.selectedDay));
}

function paintCalendar() {
	var days=getDaysInMonth(this.selectedMonth,this.selectedYear);
	var firstOfMonth=new Date(this.selectedYear,this.selectedMonth,1);
	var startingPos=firstOfMonth.getDay()-1;
	var txtOut;
	var counter=0;
	var currentDay=0;
  var currentMonth=((this.selectedYear==this.todayYear)&&(this.selectedMonth==this.todayMonth));
  var firstMonth=((this.selectedYear==this.firstYear)&&(this.selectedMonth==this.firstMonth));
  var olderMonth=((this.selectedYear<this.firstYear)||((this.selectedYear==this.firstYear)&&(this.selectedMonth<this.firstMonth)));
  var newDate;
  var txtWeek;

	if(startingPos==-1) { startingPos=6; }

	days+=startingPos;

//	txtOut="";
/*	txtOut+="<div class=\"div_calendar\">"+
		"<a href=\"#\" class=\"topnav\" style=\"margin:0 0px 0 2px;color:#bb6100;\" onClick=\"prevMonth("+this.name+");return false;\">&lt;&lt;</a><div class=\"topnav\">"+getMonthName(this.selectedMonth)+" -"+("-"+this.selectedYear).substring(3,5)+"</div><a href=\"#\" class=\"topnav\" style=\"margin:0px;color:#bb6100;\" onClick=\"nextMonth("+this.name+");return false;\">&gt;&gt;</a>"+
		"<table cellpadding=\"0\" cellspacing=\"0\" class=\"calendar\" id=\"calendar\"><tr><th scope=\"col\" class=\"lft\">M&aring;</th><th scope=\"col\">Ti</th><th scope=\"col\">On</th><th scope=\"col\">To</th><th scope=\"col\">Fr</th><th scope=\"col\">L&ouml;</th><th scope=\"col\" class=\"rght\">S&ouml;</th></tr><tr>";*/
		
  txtOut=_calendar_template_header;
  txtWeek=_week_template_header;

	for(i=0;i<startingPos;i++) { txtWeek+=_day_template_empty; counter++; }

	for(i=startingPos;i<days;i++) {
		currentDay++;
		if(counter==7) {
		  txtWeek+=_week_template_footer;
		  txtOut+=txtWeek.replace(/@@WEEKNUMBER@@/gi,getWeekNumber(this.selectedYear,this.selectedMonth,currentDay-1)).replace(/@@DATE@@/gi,(''+this.selectedYear + '-' + this.selectedMonth + '-' +(currentDay-1)));
		  //txtOut+=txtWeek.replace("@@WEEKNUMBER@@",getWeekNumber(this.selectedYear,this.selectedMonth,currentDay-1),"gi");
      txtWeek=_week_template_header;
		  counter=0; 
		}

		if((firstMonth&&(currentDay<this.firstDay))||olderMonth||!this.enabled) {
		    txtWeek+=_day_template_unavailable.replace(/@@DAY@@/,"<span>"+ currentDay +"</span>");
			//txtWeek+=_day_template_unavailable.replace("@@DAY@@",currentDay,"gi");
		}
		else if(currentDay==this.selectedDay) {
			txtWeek+="<td class=\"selected\" onmouseover=\"calMouseOver(this)\" onmouseout=\"calMouseOut(this)\"><a title=\"V&auml;lj dag\" href=\"#\" "+((currentMonth&&(currentDay==this.todayDay))?'class=\"today\"':'')+" onClick=\"setDay("+this.name+","+currentDay+");return false;\">"+currentDay+"</a></td>";
		}
		else {
			txtWeek+="<td class=\"avalible\" onmouseover=\"calMouseOver(this)\" onmouseout=\"calMouseOut(this)\"><a title=\"V&auml;lj dag\" href=\"#\" "+((currentMonth&&(currentDay==this.todayDay))?'class=\"today\"':'')+" onClick=\"setDay("+this.name+","+currentDay+");return false;\">"+currentDay+"</a></td>";
		}
		counter++;
	}

  // Add next months days..
	for (i=days; i<42; i++)  {
		if(counter==7) {
		  txtWeek+=_week_template_footer;
		  txtOut+=txtWeek.replace(/@@WEEKNUMBER@@/gi,getWeekNumber(this.selectedYear,this.selectedMonth,currentDay-1));
		  //txtOut+=txtWeek.replace("@@WEEKNUMBER@@",getWeekNumber(this.selectedYear,this.selectedMonth,currentDay-1),"gi");
      txtWeek=_week_template_header;
		  counter=0; 
		}
		txtWeek+=_day_template_empty;
		counter++;
	}

  // If any last row, add it..
  if(txtWeek.length!=_week_template_header.length) {
    txtWeek+=_week_template_footer;
	  //txtOut+=txtWeek.replace("@@WEEKNUMBER@@","","gi");
    txtOut+=txtWeek.replace(/@@WEEKNUMBER@@/gi,"");
  }

	txtOut+=_calendar_template_footer;

  //txtOut=txtOut.replace("@@MONTHNAME@@",getMonthName(this.selectedMonth),"gi").replace("@@YEAR@@",this.selectedYear,"gi");
  txtOut=txtOut.replace(/@@MONTHNAME@@/gi,getMonthName(this.selectedMonth)).replace(/@@YEAR@@/gi,this.selectedYear);
  txtOut=txtOut.replace(/@@DATE@@/gi,this.getString());
  //txtOut=txtOut.replace("@@DATE@@",this.getString(),"gi");


/*
	//skapa länkar
    txtOut+="<table width=\"150\" cellpadding=\"3\" cellspacing=\"0\"><tr>";
  	newDate=new Date(this.selectedYear,this.selectedMonth-1,1);
	if(((this.selectedYear==this.todayYear)&&(this.selectedMonth==this.todayMonth))||!this.enabled) {
		txtOut+="<td><div align=\"left\"><a href=\"#\" disabled>&laquo; "+getMonthName(newDate.getMonth())+"</a></div></td>";
	}
	else {
		txtOut+="<td><div align=\"left\"><a href=\"#\" onClick=\"prevMonth("+this.name+");return false;\">&laquo; "+getMonthName(newDate.getMonth())+"</a></div></td>";
	}

	newDate=new Date(this.todayYear,this.todayMonth+6,1);
	if(((this.selectedYear==newDate.getFullYear())&&(this.selectedMonth==newDate.getMonth()))||!this.enabled) {
		newDate=new Date(this.selectedYear,this.selectedMonth+1,1);
		txtOut+="<td><div align=\"right\"><a href=\"#\" disabled>"+getMonthName(newDate.getMonth())+" &raquo;</a></div></td>";
	}
	else {
		newDate=new Date(this.selectedYear,this.selectedMonth+1,1);
		txtOut+="<td><div align=\"right\"><a href=\"#\" onClick=\"nextMonth("+this.name+");return false;\">"+getMonthName(newDate.getMonth())+" &raquo;</a></div></td>";
	}
    txtOut+="</tr></table>";
*/
	
	this.divtag.innerHTML=txtOut;
  this.divtag.disabled=!this.enabled;

  if(this.sync) {
    var firstAvailable=new Date(this.selectedYear,this.selectedMonth,this.selectedDay);
    this.sync.firstDate=firstAvailable;
    this.sync.firstYear=firstAvailable.getFullYear();
    this.sync.firstMonth=firstAvailable.getMonth();
    this.sync.firstDay=firstAvailable.getDate();

    if(this.sync.selectedDate<firstAvailable) {
      this.sync.selectedDate=firstAvailable;
      this.sync.selectedYear=firstAvailable.getFullYear();
      this.sync.selectedMonth=firstAvailable.getMonth();
      this.sync.selectedDay=firstAvailable.getDate();
    }
    this.sync.paint();
    this.sync.callBack(true);
  }

}

function setDay(obj,day) {
	obj.selectedDay=day;
	obj.paint();
	obj.callBack();
}

function setCalendarDate(date) {
  this.selectedDate=date;
  this.selectedYear=date.getFullYear();
  this.selectedMonth=date.getMonth();
  this.selectedDay=date.getDate();
}

function nextMonth(obj) {
	var newDate=new Date(obj.selectedYear,obj.selectedMonth+1,1)
	var maxdays=getDaysInMonth(newDate.getMonth(),newDate.getFullYear());
	if(obj.selectedDay>maxdays) { obj.selectedDay=maxdays; }
	
	newDate=new Date(obj.selectedYear,obj.selectedMonth+1,obj.selectedDay)
	obj.selectedYear=newDate.getFullYear();
	obj.selectedMonth=newDate.getMonth();
	obj.selectedDay=newDate.getDate();
	obj.paint();
}

function prevMonth(obj) {
	var newDate=new Date(obj.selectedYear,obj.selectedMonth-1,1)
	var maxdays=getDaysInMonth(newDate.getMonth(),newDate.getFullYear());
	if(obj.selectedDay>maxdays) { obj.selectedDay=maxdays; }
	
	newDate=new Date(obj.selectedYear,obj.selectedMonth-1,obj.selectedDay)

	if(newDate<obj.firstDate) { newDate=obj.firstDate; }
	obj.selectedYear=newDate.getFullYear();
	obj.selectedMonth=newDate.getMonth();
	obj.selectedDay=newDate.getDate();
	obj.paint();
}

function setMonth(obj,month) {
	month=parseInt(month,10);
	var newDate=new Date(obj.todayYear,obj.todayMonth+month,1)
	var maxdays=getDaysInMonth(newDate.getMonth(),newDate.getFullYear());
	if(obj.selectedDay>maxdays) { obj.selectedDay=maxdays; }
	
	newDate=new Date(obj.todayYear,obj.todayMonth+month,obj.selectedDay)

	if(newDate<obj.todayDate) { newDate=obj.todayDate; }
	obj.selectedYear=newDate.getFullYear();
	obj.selectedMonth=newDate.getMonth();
	obj.selectedDay=newDate.getDate();
	obj.paint();
}

function getDaysInMonth(month,year) {
	switch(month) {
		case 3: case 5: case 8: case 10:
			return(30);
		case 1:
			return(isLeapYear(year)?29:28);
		default:
			return(31)
	}
}

function isLeapYear(year) {
	return(((year%4)==0)&&((year%100)!=0)||((year%400)==0));
}



function getWeekNumber(year,month,day) {
  var when = new Date(year,month,day);
  var newYear = new Date(year,0,1);
  var modDay = newYear.getDay();
  if (modDay == 0)
    modDay=6;
  else
    modDay--;

  var daynum = ((Date.UTC(year,when.getMonth(),when.getDate(),0,0,0) - Date.UTC(year,0,1,0,0,0)) /1000/60/60/24) + 1;

  if (modDay < 4 ) {
    var weeknum = Math.floor((daynum+modDay-1)/7)+1;
  } 
  else {
    var weeknum = Math.floor((daynum+modDay-1)/7);
    if (weeknum == 0) {
      year--;
      var prevNewYear = new Date(year,0,1);
      var prevmodDay = prevNewYear.getDay();
      if (prevmodDay == 0) prevmodDay = 6; else prevmodDay--;
      if (prevmodDay < 4) weeknum = 53; else weeknum = 52;
    }
  }

  return weeknum;
}

function getDayOfYear(year, month, day) {
  return Math.floor((new Date(year,month,day).getTime() - new Date(year,0,1).getTime()) / 86400000); // divided by seconds of a day
}

dayNames_sv = new Array("S&ouml;","M&aring;","Ti","On","To","Fr","L&ouml;");
monthNames_sv = new Array("Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December");

function getMonthName(month) {
	return monthNames_sv[month];
}

function calMouseOver(obj) { obj.className = obj.className.replace('avalible', 'hover'); }
function calMouseOut(obj)  { obj.className = obj.className.replace('hover', 'avalible'); }
