dayname = new Array( 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag', 'Søndag' );
monthname = new Array( 'Januar', 'Februar', 'Mars', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Desember' );

font_2 = '<font face="helvetica" size="-2">';
font_1 = '<font face="helvetica" size="-1">';
font5  = '<font face="helvetica" size="5">';

FILTER_BERGENTANGO = "bergentango";
FILTER_JEKTEVIKEN = "Jekteviken";
filter = FILTER_BERGENTANGO;

viewVariable = "visning";

//-----------------------------------------------------------------------------

function s(text) { document.writeln(text); }
function sbr(text) { s(text + "<br>"); }
function lowercase(text) { var s = new String(text); return s.toLowerCase(); }

function splitString(str, sep)
{
   var result = new Array();
   while (str.length > 0)
   {
      var i = str.indexOf(sep);
      if (i == -1) i = str.length;
      result[result.length] = str.substring(0, i);
      str = str.substring(i + 1);
   }
   return result;
}

function html2text(h)
{
   var t = '';
   var insidetag = false;
   h = String(h);
   for (var i = 0; i < h.length; i++)
   {
      var c = h.substr(i,1);
      if (c == '<')
        insidetag = true;
      else if (c == '>')
        insidetag = false;
      else 
      {
         if (!insidetag) t += h.substr(i,1);
      }
   }
   return t;
}

function weekNumber(y, m, d)
{
   var first = new Date(y,0,1, 12,0,0); var wdfirst = (first.getDay()+6)%7;
   var date = new Date(y,m,d, 12,0,0); var wddate = (date.getDay()+6)%7;
   var last = new Date(y,11,31, 12,0,0); var wdlast = (last.getDay()+6)%7;

   var n = Math.floor( ((date-first) + 2*3600*1000) / 604800000);
   // correction 2*3600*1000 (=2hrs) is needed for summer time
   if (wddate < wdfirst) n++;
   if (wdfirst < 4) n++;
   if (n == 53 && wdlast < 3) n = 1;
   if (n == 0) n = weekNumber(y-1, 11, 31);
   return n;
}

function fullYear(date)
{
   var y = date.getYear();
   return (y < 1000) ? 1900 + y : y;
}

//-----------------------------------------------------------------------------

function dateString(dates, month, year, bold)
{
   var str = '';
   var t = splitString(String(dates), ',');
   for (var i = 0; i < t.length; i++)
   {
      var d = interpretInterval(t[i], month);
      if (i > 0) str += bold ? '</b>og<b> ' : 'og ';
      str += d[0] + '. ';
      if (d[1] != d[3])
      {
         str += lowercase(monthname[d[1]]) + ' - '
                + d[2] + '. ' + lowercase(monthname[d[3]]) + ' ';
      }
      else
      {
         if (d[0] != d[2]) str += '- ' + d[2] + '. ';
         if (i == t.length-1)
            str += lowercase(monthname[d[3]]) + ' ';
         else
         {
             var dd = interpretInterval(t[i+1], month);
             if (d[3] != dd[1] || d[3] != dd[3])
                str += lowercase(monthname[d[3]]) + ' ';
         }
      }
   }
   str += year;
   if (bold) str = '<b>' + str + '</b>'
   return str;
}

function interpretInterval(interval, month)
{ 
  var dash = interval.indexOf('-');
  var slash1 = interval.indexOf('/');
  var slash2 = interval.lastIndexOf('/');
  sd = ed = parseInt(interval);
  sm = em = (slash1 == -1) ? month : parseInt(interval.substring(slash1+1))-1;
  if (dash != -1)      ed = parseInt(interval.substring(dash+1));
  if (slash1 < slash2) em = parseInt(interval.substring(slash2+1))-1;
  return new Array(sd,sm,ed,em);
}

//-----------------------------------------------------------------------------

function makeDoubleArray(n)
{
   var array = new Array();
   for (var i = 0; i < n; i++)
   {
      array[i] = new Array();
   }
   return array;
}

function sameDate(a, b)
{
   return a.getDate() == b.getDate()
      && a.getMonth() == b.getMonth()
      && a.getYear() == b.getYear();
}

function isToday(date)
{
   return sameDate(new Date(), date);
}

function isMonday(date)
{
   return date.getDay() == 1;
}

function calendarTableHeader()
{
   s('<p><table width="100%" border=1 cellspacing=0 cellpadding=1><tr>');
   for (var i = 0; i < 7; i++)
     s('<th width="14%">' + font_1 + dayname[i] + '</font></th>');
   s('</tr>');
}

function dayHeader(date, month)
{
   if (isToday(date))
      s('<td width="14%" bgcolor="#cccccc">' + font_2);
   else
      s('<td width="14%">' + font_2);

   s('<table width="100%" cellpadding=0 cellspacing=0 border=0><tr>');
   s('<td align=left>' + font_2);

   if (isMonday(date))
      s('uke ' + weekNumber(fullYear(date), date.getMonth(), date.getDate()));

   s('&nbsp;</font></td>');

   if (typeof(month) == 'undefined' || date.getMonth() == month)
      s('<td align=right>' + font_2 + '<b>' + date.getDate() + '</b></font></td>');

   s('</tr></table>');
}

function writeEvents(events)
{
   if (events.length > 0)
   {
      for (var ie in events)
      {
         var e = events[ie];
         if (ie > 0) s('<hr width="50%" align=center>');
         s(e[viewVariable]);
      }
   }
   else
   {
      s('&nbsp;');
   }
}

function calendarThisWeek()
{
   var now = new Date();
   var w = weekNumber(fullYear(now), now.getMonth(), now.getDate());

   var relevant = makeDoubleArray(7);
   var events = filteredEvents();
   for (var ie in events)
   {
      var e = events[ie];
      if (weekNumber(e.year, e.month, e.day) == w)
      {
         var date = new Date(e.year, e.month, e.day);
         var day = (date.getDay() + 6) % 7;
         relevant[day][relevant[day].length] = e;
      }
   }

   calendarTableHeader();

   s('<tr valign=top>');
   var date = new Date();
   date.setDate(date.getDate() - (date.getDay() + 6) % 7);
   for (var i = 0; i < 7; i++)
   {
      dayHeader(date);
      writeEvents(relevant[i]);
      s('</font></td>');
      date.setDate(date.getDate() + 1);
   }
   s('</tr></table>');
}

function calendarNextDays(nDays)
{
   var now = new Date();
   var today = new Date(fullYear(now), now.getMonth(), now.getDate(), 12, 0, 0);
   var millisPerDay = 24 * 3600 * 1000;

   var relevant = makeDoubleArray(nDays);
   var events = filteredEvents();
   for (var ie in events)
   {
      var e = events[ie];
      var date = new Date(e.year, e.month, e.day, 12, 0, 0);
      var n = Math.round((date.getTime() - today.getTime()) / millisPerDay);
      if (n >= 0 && n < nDays)
      {
         relevant[n][relevant[n].length] = e;
      }
   }

   s('<table border=1 cellspacing=0 cellpadding=1>');
   for (var i = 0; i < nDays; i++)
   {
      var date = new Date();
      date.setTime(today.getTime() + i * millisPerDay);
      var day = (date.getDay() + 6) % 7;
      s('<tr><td align=left>' + font_2);
      s('<table width="100%" cellpadding=0 cellspacing=0 border=0><tr><td align=right><b>');
      s(dayname[day] + ' ' + date.getDate() + '. ' + monthname[date.getMonth()] + ' ' + fullYear(date));
      s('</b></td></tr></table>');
      writeEvents(relevant[i]);
      s('</font></td></tr>');
   }
   s('</table>');
}

function kalender()
{
   var search = new String(location.search);
   var page = location.href.substring(0, location.href.length - search.length);

   var offset = 0;
   //filter = 'X'; //FILTER_BERGENTANGO;

   var args = splitString(search.substring(1, search.length), '&');
   for (var ia in args)
   {
      var a = splitString(args[ia], '=');
      if (a.length != 2) continue;
      if (a[0] == "offset")
      {
         offset = parseInt(a[1]);
         if (isNaN(offset))
            offset = 0;
      }
      else if (a[0] == "filter")
      {
         filter = a[1];
      }
   }

   var thisMonth = new Date();
   thisMonth.setDate(1);
   thisMonth.setMonth(thisMonth.getMonth() + offset);
   var month = thisMonth.getMonth();
   var year = fullYear(thisMonth);

   var lastMonth = new Date(year, month - 1, 1);
   var nextMonth = new Date(year, month + 1, 1);

   var relevant = makeDoubleArray(32);
   var events = filteredEvents();
   for (var ie in events)
   {
      var e = events[ie];
      if (e.year == year && e.month == month && eventIsFuture(e))
      {
         relevant[e.day][relevant[e.day].length] = e;
      }
   }

   var calName = '';
   if (filter == FILTER_JEKTEVIKEN)
      calName = 'Jekteviken - ';

   var p = page + '?filter=' + filter + '&offset=';

   s('<p><table width="100%" cellpadding=0 cellspacing=0 border=0><tr>');
   s('<td align=left width="25%">' + font_1);
   s('<a href="' + p + (offset - 1) +  '">');
   s(monthname[lastMonth.getMonth()] + ' ' + fullYear(lastMonth));
   s('</a></font></td>');

   s('<td align=center width="50%">' + font5);
   s('<b>' + calName + monthname[month] + ' ' + year +'</b></font></td>');

   s('<td align=right width="25%">' + font_1);
   s('<a href="' + p + (offset + 1) +  '">');
   s(monthname[nextMonth.getMonth()] + ' ' + fullYear(nextMonth));
   s('</a></font></td>');
   s('</tr></table>');

   calendarTableHeader();

   var date = new Date(year, month, 1);
   date.setDate(date.getDate() - (date.getDay() + 6) % 7);
   while (date.getMonth() != nextMonth.getMonth())
   {
      s('<tr valign=top>');
      for (var i = 0; i < 7; i++)
      {
         dayHeader(date, month);
         if (date.getMonth() == month)
            writeEvents(relevant[date.getDate()]);
         else
            s('&nbsp;');
         s('</font></td>');
         date.setDate(date.getDate() + 1);
      }
      s('</tr>');
   }
   s('</table>');
}

function filteredEvents()
{
   var events = futureEvents();
   if (filter == FILTER_BERGENTANGO)
   {
      events = filterEventsUnequals(events, "type", "utleie");
   }
   else if (filter == FILTER_JEKTEVIKEN)
   {
      events = filterEventsIncludes(events, "sted", "Jekteviken");
   }
   else
   {
      events = new Array();
   }
   return events;
}

function nybegynnerkurs()
{
   var events = futureEvents();
   events = filterEventsEquals(events, "type", "nybegynnerkurs");
   var groups = makeGroups(events);
   groups = futureGroups(groups, false);

   if (groups.length == 0) return;

   var tdBegin = '<td>' + font_1;
   var tdCenterBegin = '<td align="center">' + font_1;
   var tdEnd = '</font></td>';

   s('<table border=1 cellspacing=3 cellpadding=5>');
   for (var ig in groups)
   {
      var g = groups[ig];

      s('<tr>');

      s(tdCenterBegin);
      var firstMonth = g[0].month;
      var lastMonth = g[g.length - 1].month;
      s(monthname[firstMonth]);
      if (firstMonth != lastMonth)
      {
         s("<br>" + monthname[lastMonth]);
      }
      s(tdEnd);

      s(tdBegin);
      for (var ie in g)
      {
         var e = g[ie];
         dayName = dayname[(new Date(e.year, e.month, e.day, 12, 0, 0).getDay() + 6) % 7];
         sbr("<nobr>" + dayName + " " + e.day + "/" + (e.month + 1) + "</nobr>");
      }
      s(tdEnd);

      s(tdBegin);
      for (var ie in g)
      {
         var e = g[ie];
         sbr("<nobr>" + e["start"] + "-" + e["slutt"] + "</nobr>");
      }
      s(tdEnd);

      s(tdBegin);
      for (var ie in g)
      {
         var e = g[ie];
         sbr("<nobr>" + e["sted"] + "</nobr>");
      }
      s(tdEnd);

      var e = g[0]
      s(tdBegin);
      if (e["layout"] == "avlyst")
      {
         s("<font color=red>Avlyst!</font>");
      }
      else
      {
         s(e["instruktører"]);
         if (typeof(e["påmelding"]) != 'undefined')
         {
            s("<br>" + e["påmelding"]);
         }
      }
      s(tdEnd);

      s('</tr>');
   }
   s('</table>');
}

function kursvk()
{
   var events = futureEvents();
   events = filterEventsEquals(events, "type", "videregående kurs");
   var groups = makeGroups(events);
   groups = futureGroups(groups, false);

   if (groups.length == 0) return;

   var tdBegin = '<td>' + font_1;
   var tdCenterBegin = '<td align="center">' + font_1;
   var tdEnd = '</font></td>';

   s('<table border=1 cellspacing=3 cellpadding=5>');
   for (var ig in groups)
   {
      var g = groups[ig];

      s('<tr>');

      s(tdCenterBegin);
      var firstMonth = g[0].month;
      var lastMonth = g[g.length - 1].month;
      s(monthname[firstMonth]);
      if (firstMonth != lastMonth)
      {
         s("<br>" + monthname[lastMonth]);
      }
      s(tdEnd);

      s(tdBegin);
      for (var ie in g)
      {
         var e = g[ie];
         dayName = dayname[(new Date(e.year, e.month, e.day, 12, 0, 0).getDay() + 6) % 7];
         sbr("<nobr>" + dayName + " " + e.day + "/" + (e.month + 1) + "</nobr>");
      }
      s(tdEnd);

      s(tdBegin);
      for (var ie in g)
      {
         var e = g[ie];
         sbr("<nobr>" + e["start"] + "-" + e["slutt"] + "</nobr>");
      }
      s(tdEnd);

      s(tdBegin);
      for (var ie in g)
      {
         var e = g[ie];
         sbr("<nobr>" + e["sted"] + "</nobr>");
      }
      s(tdEnd);

      var e = g[0]
      s(tdBegin);
      if (e["layout"] == "avlyst")
      {
         s("<font color=red>Avlyst!</font>");
      }
      else
      {
         s(e["instruktører"]);
         if (typeof(e["påmelding"]) != 'undefined')
         {
            s("<br>" + e["påmelding"]);
         }
      }
      s(tdEnd);

      s('</tr>');
   }
   s('</table>');
}

function nesteNybegynnerkurs()
{
   var events = futureEvents();
   events = filterEventsEquals(events, "type", "nybegynnerkurs");
   var groups = makeGroups(events);
   groups = futureGroups(groups, true);

   if (groups.length > 0)
   {
      var g = groups[0];
      var e = g[0];
      s('<a href="kurs.html">Neste nybegynnerkurs</a>: ');
      s(dateString(e.dates, e.month, e.year, false) + '.');
   }
}

function nyheter()
{
   var events = futureEvents();
   events = filterEventsEquals(events, "nyhet", "true");
   var groups = makeGroups(events);
   groups = futureGroups(groups, false);

   for (var ig in groups)
   {
      var g = groups[ig];
      var e = g[0];
      s(dateString(e.dates, e.month, e.year, true) + '<br>');
      s(e[viewVariable] + '<br><br>');
   }
}

function makeGroups(events)
{
   var groups = new Array();
   for (var ie in events)
   {
      var e = events[ie];
      var ig = e.eventGroup;
      if (typeof(groups[ig]) == 'undefined')
      {
         groups[ig] = new Array();
      }
      groups[ig][groups[ig].length] = e;
   }
   return groups;
}

function filterEventsIncludes(events, variable, value)
{
   var newEvents = new Array();
   for (var ie in events)
   {
      var e = events[ie];
      if (typeof(e[variable]) != 'undefined' && e[variable].indexOf(value) != -1)
      {
         newEvents[newEvents.length] = e;
      }
   }
   return newEvents;
}

function filterEventsEquals(events, variable, value)
{
   var newEvents = new Array();
   for (var ie in events)
   {
      var e = events[ie];
      if (typeof(e[variable]) != 'undefined' && e[variable] == value)
      {
         newEvents[newEvents.length] = e;
      }
   }
   return newEvents;
}

function filterEventsUnequals(events, variable, value)
{
   var newEvents = new Array();
   for (var ie in events)
   {
      var e = events[ie];
      if (typeof(e[variable]) == 'undefined' || e[variable] != value)
      {
         newEvents[newEvents.length] = e;
      }
   }
   return newEvents;
}

function debugEvents(events)
{
   for (var ie in events)
   {
      var e = events[ie];
      s("<p>");
      for (var iv in e)
      {
         sbr(ie + ", " + iv + ", " + e[iv]);
      }
   }
}

function eventIsFuture(event)
{
   var now = new Date();
   var msNow = Date.UTC(fullYear(now), now.getMonth(), now.getDate());
   var msEvent = Date.UTC(event.year, event.month, event.day);
   return msEvent >= msNow;
}

// strict means all events in a group must be future.
function groupIsFuture(group, strict)
{
   for (var ie in group)
   {
      var e = group[ie];
      if (strict)
      {
         return eventIsFuture(e); // need only check first event.
      }
      if (eventIsFuture(e))
      {
         return true;
      }
   }
   return false;
}

// strict means all events in a group must be future.
function futureGroups(groups, strict)
{
   var fg = new Array();
   for (var ig in groups)
   {
      var g = groups[ig];
      if (groupIsFuture(g, strict))
      {
         fg[fg.length] = g;
      }
   }
   return fg;
}
