
function fixDays(ym, d, keep) {

  // dela upp år och månad
  var part      = ym.options[ym.selectedIndex].value.split("-");
  var year      = part[0];
  var month     = parseInt(part[1], 10) - monthNoDiff +1 ;

  // spara markerad dag och trunkera
  var selDay = d.selectedIndex;

  var arr = rememberdDates[d.name];
  arr.length = 28;

  // ta bort alla options över datum 28
  for (var i=d.length-1; i>=0; i--)  {
    var date = parseInt(d.options[i].value, 10);
    if (date > 28) { 
     d.length = i;
    }
  }
  var index = d.length;
  if (month==4 || month==6 || month==9 || month==11) {
      d.options[d.length] = new Option("29", "29");
      d.options[d.length] = new Option("30", "30");
  } else if (month == 2) { // check for february 29th
      var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
      if (isleap) {
          d.options[d.length] = new Option("29", "29");
      }
  } else {  
      d.options[d.length] = new Option("29", "29");
      d.options[d.length] = new Option("30", "30");
      d.options[d.length] = new Option("31", "31");
  }
 
  // bevara valt datum första gången.
  if (keep) {
      d.selectedIndex = selDay;
  }
  for (var i=index; i<d.options.length; i++)
    arr[arr.length] = d.options[i];

  return true;
}

function returnMonthName(s)
{
  var m = parseInt(s, 10);
	switch(m)
	{
		case 0 : return "januari";break;
		case 1 : return "februari";break;
		case 2 : return "mars";break;
		case 3 : return "april";break;
		case 4 : return "maj";break;
		case 5 : return "juni";break;
		case 6 : return "juli";break;
		case 7 : return "augusti";break;
		case 8 : return "september";break;
		case 9 : return "oktober";break;
		case 10 : return "november";break;
		case 11 : return "december";break;
	}
}


// so we can translate months in this UserTemplate.
function translateMonth (oMonth) {
/*
    for (var j=0;j<oMonth.length;j++) {
        var part = oMonth.options[j].value.split("-");
        oMonth.options[j].text = returnMonthName(part[1]) + " " + part[0];
    }
*/
}


function getFormDate (oMonth, oDay) {
    oDate = oMonth.options[oMonth.selectedIndex].value.split("-");
    year  = oDate[0];
    month = parseInt(oDate[1], 10) - monthNoDiff;
    day   = oDay.options[oDay.selectedIndex].value;
    return new Date(year, month - 1, day);
}

function isValidDate(oMonth, oDay)
{
    oDate = oMonth.options[oMonth.selectedIndex].value.split("-");
    year  = oDate[0];
    month = parseInt(oDate[1], 10) - monthNoDiff;
    day   = oDay.options[oDay.selectedIndex].value;

    if ((month==4 || month==6 || month==9 || month==11) && day==31) {
        return false;
    }
    if (month == 2) { // check for february 29th
        var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
        if (day>29 || (day==29 && !isleap)) {
            return false;
        }
    }
    return true;
}


// diff från månadsnummer 0 - 11
var monthNoDiff = 1;

var journeyLength;
var rememberdDates = new Array();
var teForm;
var defaultHomeDate;
var defaultOutDate;

var monthnames;
var daynames;
var imgBack;
var imgForward;


function teInit(frm, outdate, homedate, days, months, imgLeft, imgRight) {
  defaultOutDate = outdate;
  defaultHomeDate = homedate;
  journeyLength = Math.floor((defaultHomeDate.getTime() - defaultOutDate.getTime())/(24*3600*1000));
  teForm = frm;

  
  daynames   = days;
  monthnames = months;
  imgBack = imgLeft;
  imgForward = imgRight;


  var froms = new Array(teForm.departureYearMonth, teForm.homeYearMonth);

  for (var i=0; i<froms.length; i++) {
    var arr = new Array(froms[i].length);
    rememberdDates[froms[i].name] = arr;
    for (var j=0; j<froms[i].length; j++) 
     arr[j] = froms[i].options[j];
  }

  var a1 = rememberdDates[teForm.homeDay.name] = new Array();
  var a2 = rememberdDates[teForm.departureDay.name] = new Array();

  for (var i=1; i<32; i++) {
   a1[a1.length] = new Option(i, i);
   a2[a2.length] = new Option(i, i);
  }

  // change drop-down menus
  translateMonth(teForm.departureYearMonth);
  translateMonth(teForm.homeYearMonth);
  fixDays(teForm.departureYearMonth, teForm.departureDay, true);
  fixDays(teForm.homeYearMonth, teForm.homeDay, true);

  start(teForm.departureYearMonth, teForm.departureDay, teForm.homeYearMonth, teForm.homeDay, fixDays);
}

function displayCalender() {

 if(document.getElementById){
   var calDiv = document.getElementById('cal');
   calDiv.style.display = 'block';
 }

}

function hideCalender() {
   var calDiv = document.getElementById('cal');
   calDiv.style.display = 'none';
}



var homeleg = null;
var outleg = null;

var outMonthYear;
var outDay;
var homeMonthYear;
var homeDay;

var fixDays;

function start(monthYearOut, dayOut, monthYearHome, dayHome, theFixDays) {
  outMonthYear = monthYearOut;
  outDay = dayOut;
  homeMonthYear = monthYearHome;
  homeDay = dayHome;
  fixDays = theFixDays; // function


  writeMonth('out', defaultOutDate, true);
  
  writeMonth('home', defaultHomeDate, false);

  selectDayInout(outleg.thisdate);
}

function getAllowedDate(date) {
  var d = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);
  d.setMilliseconds(0);
  return d;
}

function setOutDate(date) {
  var monthYear = outMonthYear;
  var day = outDay;
  var writeDate = new Date(outleg.todayDate.getTime());
  day.length = 0;
  var arr = rememberdDates[day.name];

  for (var i=0; i<arr.length; i++) {
    writeDate.setDate(i+1);
    if (writeDate.getTime() >= defaultOutDate.getTime()) {
      day.options[day.length] = arr[i];
    }
  }
//   for (var i=0; i<day.length; i++) 
  setDate(date, monthYear, day);
}

function setHomeDate(date) {
  var monthYear = homeMonthYear;
  var day = homeDay;
  monthYear.length = 0;
  day.length = 0;
  var writeDate = new Date(homeleg.todayDate.getTime());
  var arr = rememberdDates[day.name];

  for (var i=0; i<arr.length; i++) {
    writeDate.setDate(i+1);
    if (writeDate.getTime() >= homeleg.allowedDate.getTime())
      day.options[day.length] = arr[i];
  }

  arr = rememberdDates[monthYear.name];
  for (var i=0; i<arr.length; i++) {
    var writeDate = parseMonth(arr[i].value, homeleg.allowedDate);
    var compareDate = new Date(homeleg.allowedDate);
    compareDate.setDate(1);
    if (writeDate.getTime() >= compareDate.getTime())
      monthYear.options[monthYear.length] = arr[i];
  }
  setDate(date, monthYear, day);
}

function setDate(date, monthYear, day) {
  fixDays(monthYear, day);
  var monthYearStr = date.getFullYear()+'-'+(date.getMonth()+monthNoDiff);
  for (var i=0; i<monthYear.options.length; i++) {
    if (monthYear.options[i].value == monthYearStr) {
      monthYear.selectedIndex = i;
    }
  }
  fixDays(monthYear, day);
  var dayStr = date.getDate();//(date.getDate() < 10 ? '0' : '')+date.getDate();
  for (var i=0; i<day.options.length; i++) {
    if (day.options[i].value == dayStr) {
      day.selectedIndex = i;
    }
  }
}

function writeMonth(name, date, isOut) {
  var e = document.getElementById(name);

  if (isOut || outleg != null && outleg.id == name) {
    outleg = new MonthCalender(name, date, defaultOutDate);
    e.innerHTML = outleg.str;
  }
  else {
    var d = new Date(outleg.todayDate.getTime());
    d.setDate(outleg.selected);
    homeleg = new MonthCalender(name, date, d);
    e.innerHTML = homeleg.str;
  }
}


var beforeClass = 'before';
var laterClass = 'later';
var selectedClass = 'selected';

function parseMonth(val, allowedDate) {
  var date;
  if (typeof val == 'string') {
    var v = val.split('-');
    var year = parseInt(v[0], 10);
    var month = parseInt(v[1], 10) - monthNoDiff;
    date = new Date(year, month, 1);
  }
  else {
    date = new Date(outleg.todayDate.getTime());
    date.setMonth(val);
    date.setDate(1);
  }
  if (date.getFullYear() == allowedDate.getFullYear() &&
      date.getMonth() == allowedDate.getMonth()) {
    date.setDate(allowedDate.getDate());
  }
  return date;
}

function selectMonthYearInout(val) {
  var date = parseMonth(val, defaultOutDate);
  return setOut(date);
}


function selectDayInout(dayDate) {
  dayDate = parseInt(dayDate, 10);
  var date = new Date(outleg.todayDate.getTime());
  date.setDate(dayDate);
  
  return setOut(date);
}

function setOut(date) {
  if (date.getTime() < defaultOutDate.getTime()) {
    setOutDate(outleg.todayDate);
    return false;
  }
  outleg.select(date);
  setOutDate(date);
  homeleg.setAllowedDate(getAllowedDate(date));
  date.setTime(date.getTime()+journeyLength*24*3600*1000);
  setHome(date);
  return true;
}

function selectDayInhome(dayDate) {
  dayDate = parseInt(dayDate, 10);
  var date = new Date(homeleg.todayDate.getTime());
  date.setDate(dayDate);

  return setHome(date);
}

function selectMonthYearInhome(val) {
  var date = parseMonth(val, homeleg.allowedDate);
  return setHome(date);
}


function setHome(date) {
  if (date.getTime() < homeleg.allowedDate.getTime()) {
    setHomeDate(homeleg.todayDate);
    return false;
  }
  homeleg.select(date);
  setHomeDate(date);
  return true;
}

function setAllowedDate(date) {
  this.allowedDate = date;
  var writeDate = new Date(this.todayDate.getTime());

  var day=1; 
  writeDate.setDate(day);
  while (writeDate.getTime() <= this.allowedDate.getTime()) {
    this.set(day, 'before');
    writeDate.setDate(++day);
  }
  for (var i=day; i<=31; i++)
     this.set(i, 'later');
}


/*************************************/



function doWrite2(s) {
  this.str += s+'\n';
}

function select(date) {
  if (date.getMonth() != this.todayDate.getMonth() || date.getFullYear() != this.todayDate.getFullYear()) {
    writeMonth(this.id, date);
  }
  this.todayDate = new Date(date.getTime());
  this.unselect();

  this.set(date.getDate(), 'selected');
  this.selected = date.getDate();
}

function unselect() {
  var writeDate = new Date(this.todayDate);
  writeDate.setDate(this.selected);
  if (writeDate.getTime() < this.allowedDate.getTime())
    this.set(this.selected, 'before');
  else
    this.set(this.selected, 'later');
}

function set(dayDate, className) {
  var el = document.getElementById(this.id+dayDate);
  if (el == null)
    return;
  el.className=className;
  var a = null;
  for (var i=0; i<el.childNodes.length; i++) {
    if (el.childNodes[i].nodeName == 'A')
      a = el.childNodes[i];
  }
  if (a == null)
    return;
  a.className=className;
  return;
}

function writeCalender() {
  this.doWrite('<table border=0 cellpadding="3" cellspacing="0" style="width:167; margin: 0 0 0 0; padding:0 0 0 0;">');
  this.doWrite('<tr class="beige"><td><a class="calenderStepButton" onClick="selectMonthYearIn'+this.id+'('+(this.thismonth-1)+');return false" href="#">&laquo;</a></td><td colspan=5 align="center">' 
	  + monthnames[this.thismonth] + " " + this.thisyear 
	  + '</td><td><a class="calenderStepButton" onClick="selectMonthYearIn'+this.id+'('+(this.thismonth+1)+');return false" href="#"">&raquo;</td></tr>');
  this.doWrite('<tr><td colspan="7"><hr color="#ffffff" size="1"></td></tr>');

  this.doWrite('<tr class="rubrik3">');
  for (var i=0; i<daynames.length; i++)
    this.doWrite('<td width="25" align=center>'+daynames[i]+'</td>');
  this.doWrite('</tr>');
  this.doWrite('<tr>');

  for (s=0;s<this.startspaces;s++) {
    this.doWrite("<td> </td>");
  }
  var noOfLines = 0;
  var count=1;
  var writeDate = new Date(this.todayDate.getTime());
  while (count <= this.monthdays[this.thismonth]) {
    if (noOfLines > 0)
      this.doWrite("<tr>");    
    this.doWrite('<!-- -->');
    for (b = this.startspaces;b<7;b++) {
      writeDate.setDate(count);
      var classname = 'before';

      if (writeDate.getTime() >= this.allowedDate.getTime()) {
	classname = 'later';
      }
      this.doWrite('<td align="center" class="'+classname+'" id='+this.id+count+'>');

      if (count <= this.monthdays[this.thismonth]) {
	if (classname == 'before')
	  this.doWrite(count);
	else
	  this.doWrite('<a class="'+classname+'" href="#" onClick="selectDayIn'+this.id+'('+count+'); return false">'+count+'</a>');
      }
      else {
	this.doWrite(" ");
      }
      this.doWrite("</td>");
      count++;
    }
    this.doWrite("</tr>");

    this.startspaces=0;
    noOfLines++;
  }
  if (noOfLines < 6)
    this.doWrite('<tr><td colspan="7" class="rubrik3">&nbsp;</td></tr>');
  
  
  this.doWrite("</table>");
}



function MonthCalender(name, todayDate, allowedDate) {
  this.str = '';

  this.linkdays = new Array();
  this.monthdays = new Array(12);
  this.monthdays[0]=31;
  this.monthdays[1]=28;
  this.monthdays[2]=31;
  this.monthdays[3]=30;
  this.monthdays[4]=31;
  this.monthdays[5]=30;
  this.monthdays[6]=31;
  this.monthdays[7]=31;
  this.monthdays[8]=30; 
  this.monthdays[9]=31;
  this.monthdays[10]=30;
  this.monthdays[11]=31;

  this.todayDate = todayDate;
  this.allowedDate = getAllowedDate(allowedDate);
    
  this.thisday=this.todayDate.getDay();
  this.thismonth=this.todayDate.getMonth();
  this.thisdate=this.todayDate.getDate();
  this.thisyear=this.todayDate.getYear();
  this.thisyear = this.thisyear % 100;
  this.thisyear = ((this.thisyear < 50) ? (2000 + this.thisyear) : (1900 + this.thisyear));
  if (((this.thisyear % 4 == 0) 
       && !(this.thisyear % 100 == 0))
      ||(this.thisyear % 400 == 0)) this.monthdays[1]++;

  this.startspaces=this.thisdate;
  while (this.startspaces > 7) this.startspaces-=7;
  this.startspaces = this.thisday - this.startspaces;
  this.id = name;

  this.selected = this.thisdate;

  if (this.startspaces < 0) this.startspaces+=7;
  
  this.write = writeCalender;
  this.doWrite = doWrite2;
  this.unselect = unselect;
  this.select = select;
  this.setAllowedDate = setAllowedDate;
  this.set = set;

  this.write();
}

