///////////////////////////////////////////////////////////////////////////////////////////////////
// File: occurences.js
// Creator: Monjay Settro, Devbleue Inc.
// Purpose: library of calendar event occurence functions...
//////////
// This presumes that config.js:get_calendar_config_data(selected_subcategory) has already run successfully
// occurences.html contains the unique list of events related to subcategories
// get_calendar_occurence_data()...
// (a) pulls the file in via ajax
// (b) isolates the string portion that represents the calconf['selected_subcategory'] event list table
// (c) creates a small xhtml document
// (d) parses the tiny xhtml document as a XMLDOC
// (e) keeps the tds in the event table, which are the tds that describe the event list
// all in an effort to minimize memory usage in the browser for this application
// Note: (a) events.html all headers in the event table for a subcategory need to be <th> tags to distinguish them from <td> values
//       (b) style eventDetailSummaryLink no longer seems neccessary
///////////////////////////////////////////////////////////////////////////////////////////////////

function occurences_data()
{
   if (!calconf || !calconf['init'] || !calconf['selected_subcategory'])
   {
      calwait(false);
      return false;
   }
   if (!calconf['occurences'])
   {
      calconf['occurences'] = new Array();
      calconf['occurences']['data'] = new Array();
      calconf['occurences']['selected'] = new Array();
   }
   if (!calconf['occurences']['pipe'])
   {
      var url = ("data/occurences.html?" + new Date).replace(/ /g, '+');  //avoid browser caches
      calconf['occurences']['pipe'] = getXMLHttp();
      calconf['occurences']['pipe'].open("GET", url);
      calconf['occurences']['pipe'].onreadystatechange = occurences_data_handler;
      try
      {
         calconf['occurences']['pipe'].send(null);
      }
      catch (e)
      {
         calwait(false);
         calerror(509, "Looks like there is a problem [underline]getting[/underline] calendar occurence data.[newline]~~~ ~~~ ~~~ ~~~[newline]" + ((e.description) ? e.description : e))
      }
   }
   else
   {
      if (!calconf['occurences']['xml'])
      {
          calwait(false);
          calerror(508, "Looks like there was a previous problem [underline]getting[/underline] calendar occurence data.", "Try hitting your browser REFRESH button, then navigating back to this month.")
          return false;
      }
      occurences_data_handler_core(1, calconf['occurences']['responseText']);
   }
}

function occurences_data_handler()
{
   if ( calconf['occurences']['pipe'].readyState == 4 )
   {
      var text = calconf['occurences']['pipe'].responseText;
      if (!text || !text.length)
      {
         calwait(false);
         calerror(507, "Looks like there is a problem [underline]reading the content[/underline] of calendar occurence data.")
         return false;
      }
      return occurences_data_handler_core(2, text);
   }
   return false;
}

function occurences_data_handler_core(source, responseText)
{
   if (calconf['occurences']['selected']['category'])
   {
      if (calconf['selected_subcategory'] == calconf['occurences']['selected']['category'])
      {
         occurences_next_action(1)
         return true;
      }
   }

   var result = get_calconf_xml(responseText, calconf['selected_subcategory'])
   switch(result['error_code'])
   {
      case 1: 
               calwait(false)
               calconf['occurences']['xml'] = false
               return false
               break
      case 2:
               calwait(false)
               calerror(500, "Looks like there is a problem [underline]loading[/underline] calendar occurence data.")
               calconf['occurences']['xml'] = false
               return false
               break
      case 3:
               calwait(false);
               calerror(501, "Looks like there is a problem [underline]parsing[/underline] calendar occurence data.")
               calconf['occurences']['xml'] = false
               return false;
               break
      default:
               calconf['occurences']['xml'] = result['doc']
               calconf['occurences']['responseText'] = responseText
               calconf['occurences']['selected']['category'] = calconf['selected_subcategory']
               calconf['occurences']['data']['tds'] = calconf['occurences']['xml'].getElementsByTagName('td');
               if (calconf['occurences']['data']['tds'].length)
               {
                  return occurences_next_action(2);
               }
               calwait(false);
               calerror(502, "Looks like there is a problem [underline]confirming the content[/underline] of calendar occurence data.")
               calconf['occurences']['xml'] = false;
               return false;
   } //switch

   return false;
}

function occurences_next_action(source)
{
   var ok = true;
   if (ok)
   {
      ok = build_occurence_render_list()
   }
   if (ok)
   {
      ok = map_occurences_to_days()
   }
   if (ok)
   {   
      ok = render_occurences();
      calwait(false);
   }
   return true;
}

function build_occurence_render_list()
{
   //function determines which occurences to render on the calendar...
   var render = new Array()
   var events = get_event_keynames()

   var today = new Array()
       today['MM']       = calconf['selected_month_number']
       today['YYYY']     = calconf['selected_year']
       today['YYYYMM']   = parseInt(today['YYYY'] + '' + two_digits(today['MM']), 10)

   for (var o = 0; o < calconf['occurences']['data']['tds'].length; o = o + 7)
   {
      var td_content = prep_calendar_data_value(calconf['occurences']['data']['tds'][o])
      if (td_content)
      {
         var Occurence = new Array
             Occurence['event_key_name'] = td_content
             Occurence['date_start']     = prep_calendar_data_value(calconf['occurences']['data']['tds'][o+1])
             Occurence['date_end']       = prep_calendar_data_value(calconf['occurences']['data']['tds'][o+3])

         if (!Occurence['date_end'])
         {
            Occurence['date_end'] = Occurence['date_start']
         }

         if ( is_date(Occurence['date_start']) && is_date(Occurence['date_end']) )
         {
            var start = new Array();
                start['MM']       = parseInt(Occurence['date_start'].split('/')[0], 10)
                start['DD']       = parseInt(Occurence['date_start'].split('/')[1], 10)
                start['YYYY']     = parseInt(Occurence['date_start'].split('/')[2], 10)
                start['YYYYMM']   = parseInt(start['YYYY'] + '' + two_digits(start['MM']), 10)
                start['YYYYMMDD'] = parseInt(start['YYYY'] + '' + two_digits(start['MM']) + '' + two_digits(start['DD']), 10)

            var end = new Array();
                end['MM']       = parseInt(Occurence['date_end'].split('/')[0], 10)
                end['DD']       = parseInt(Occurence['date_end'].split('/')[1], 10)
                end['YYYY']     = parseInt(Occurence['date_end'].split('/')[2], 10)
                end['YYYYMM']   = parseInt(end['YYYY'] + '' + two_digits(end['MM']), 10)
                end['YYYYMMDD'] = parseInt(end['YYYY'] + '' + two_digits(end['MM']) + '' + two_digits(end['DD']), 10)
//print_array(end);return;
            if (start['YYYYMMDD'] > end['YYYYMMDD'])
            {
               // problem: startdate > enddate
//monjay: add more information here to help
               var msg = '[important]problem: startdate > enddate[/important]'
               setCalVal('eventDetails', replace_markup(msg))
               return false;
            }
            else
            {
               if ((today['YYYYMM'] >= start['YYYYMM']) && (today['YYYYMM'] <= end['YYYYMM']))
               {
                  // dates Include can be MM/DD/YYYY, Mondays, Tuesdays
                  Occurence['dates_include'] = prep_calendar_data_value(calconf['occurences']['data']['tds'][o+5])

                  //normalize Mondays|Tuesdays|...|Sundays to a list of dates MM/DD/YYYY that occur within the selected month
                  Occurence['dates_include_normal'] = Occurence['dates_include'];
                  Occurence['dates_include_normal'] = Occurence['dates_include_normal'].replace(/ /g,      '');
                  Occurence['dates_include_normal'] = Occurence['dates_include_normal'].replace(/&nbsp;/g, '');

                  for (il = 0; il < Occurence['dates_include'].split(',').length; il++)
                  {
                     var v = Occurence['dates_include'].split(',')[il];
                     if (weekdaynamesdates_to_string(v))
                     {
                        Occurence['dates_include_normal'] = Occurence['dates_include_normal'].replace(v, weekdaynamesdates_to_string(v))
                     }
                  }

                  if (Occurence['dates_include_normal'].length >= 10) // MM/DD/YYYY is 10 chars
                  {
                     var o2 = 0;
                     for (il = 0; il < Occurence['dates_include_normal'].split(',').length; il++)
                     {
                        v = Occurence['dates_include_normal'].split(',')[il];
                        if (is_date(v))
                        {
                            var include = new Array();
                                include['id']       = 'include';
                                include['MM']       = parseInt(v.split('/')[0], 10)
                                include['DD']       = parseInt(v.split('/')[1], 10)
                                include['YYYY']     = parseInt(v.split('/')[2], 10)
                                include['YYYYMM']   = parseInt(include['YYYY'] + '' + two_digits(include['MM']), 10)
                                include['YYYYMMDD'] = parseInt(include['YYYY'] + '' + two_digits(include['MM']) + '' + two_digits(include['DD']), 10)

                            if ((include['YYYYMMDD'] >= start['YYYYMMDD']) && (include['YYYYMMDD'] <= end['YYYYMMDD']))
                            {
                               var is_duplicate = false;
                               if (o2 == 0)
                               {
                                  Occurence['dates_include_list'] = new Array;
                               }
                               for (var j=0; j < Occurence['dates_include_list'].length; j++)
                               {
                                  if (Occurence['dates_include_list'][j] == Occurence['dates_include_normal'].split(',')[il])
                                  {
                                     is_duplicate = true;
                                  }
                               }
                               if (!is_duplicate)
                               {
                                  Occurence['dates_include_list'][o2] = Occurence['dates_include_normal'].split(',')[il];
                                  Occurence['dates_include_list'][o2].replace(/( |&nbsp;)/g, '')
                                  Occurence['dates_include_list'][o2].trim();
                                  o2 = o2 + 1;
                               }
                            }
                        } // is the include date a valid date format?
                     } // for each normalized include date
                  } // if the normalized include date has a valid length...

//print_array(Occurence)
//print_array(Occurence['dates_include_list'].sort());

                  Occurence['dates_exclude'] = prep_calendar_data_value(calconf['occurences']['data']['tds'][o+6])

                  //normalize Mondays|Tuesdays|...|Sundays to a list of dates MM/DD/YYYY that occur within the selected month
                  Occurence['dates_exclude_normal'] = Occurence['dates_exclude'];
                  Occurence['dates_exclude_normal'] = Occurence['dates_exclude_normal'].replace(/ /g, '');
                  Occurence['dates_exclude_normal'] = Occurence['dates_exclude_normal'].replace(/&nbsp;/g, '');

                  for (il = 0; il < Occurence['dates_exclude'].split(',').length; il++)
                  {
                     var v = Occurence['dates_exclude'].split(',')[il];
                     if (weekdaynamesdates_to_string(v))
                     {
                        Occurence['dates_exclude_normal'] = Occurence['dates_exclude_normal'].replace(v, weekdaynamesdates_to_string(v))
                     }
                  }

                  if (Occurence['dates_exclude_normal'].length >= 10) // MM/DD/YYYY is at minimum 10 chars
                  {
                     var o2 = 0;
                     for (il = 0; il < Occurence['dates_exclude_normal'].split(',').length; il++)
                     {
                        v = Occurence['dates_exclude_normal'].split(',')[il];
                        if (is_date(v))
                        {
                            var exclude = new Array();
                                exclude['id']       = 'exclude';
                                exclude['MM']       = parseInt(v.split('/')[0], 10)
                                exclude['DD']       = parseInt(v.split('/')[1], 10)
                                exclude['YYYY']     = parseInt(v.split('/')[2], 10)
                                exclude['YYYYMM']   = parseInt(exclude['YYYY'] + '' + two_digits(exclude['MM']), 10)
                                exclude['YYYYMMDD'] = parseInt(exclude['YYYY'] + '' + two_digits(exclude['MM']) + '' + two_digits(exclude['DD']), 10)

                            if ((exclude['YYYYMMDD'] >= start['YYYYMMDD']) && (exclude['YYYYMMDD'] <= end['YYYYMMDD']))
                            {
                               var is_duplicate = false;
                               if (o2 == 0)
                               {
                                  Occurence['dates_exclude_list'] = new Array;
                               }
                               for (var j=0; j < Occurence['dates_exclude_list'].length; j++)
                               {
                                  if (Occurence['dates_exclude_list'][j] == Occurence['dates_exclude_normal'].split(',')[il])
                                  {
                                     is_duplicate = true;
                                  }
                               }
                               if (!is_duplicate)
                               {
                                  Occurence['dates_exclude_list'][o2] = Occurence['dates_exclude_normal'].split(',')[il];
                                  Occurence['dates_exclude_list'][o2].replace(/( |&nbsp;)/g, '')
                                  Occurence['dates_exclude_list'][o2].trim();
                                  o2 = o2 + 1;
                               }
                            } //is the exclude date in the range
                        } // if the exclude date is a valid date format
                     } //if normalized exclude value has a minimum value
                  } // MM/DD/YYYY is 10 chars

                  Occurence['time_start']       = prep_calendar_data_value(calconf['occurences']['data']['tds'][o+2])
                  Occurence['time_end']         = prep_calendar_data_value(calconf['occurences']['data']['tds'][o+4])
                  Occurence['parsed_startdate'] = start
                  Occurence['parsed_enddate']   = end
                  render[render.length]         = Occurence
//print_array(Occurence);
               }
            } // if start > enddate
         } //if (is_date(Occurence['date_start']))
      } // if start of an occurence row...
   } // for each td in the occurence table

   if ((render) && (render.length > 0))
   {
      calconf['occurrences_to_render'] = render;
//print_array(render);
      return true;
   }
   else
   {
      calwait(false)
//setCalVal('eventDetails', replace_markup('[important]No events occur for this subcategory![/important]'));
      return false;
   }
} // function build_occurence_list()

function map_occurences_to_days()
{
   var days = new Array();

//print_array(calconf);
//print_array(calconf['occurrences_to_render'][0])
//alert(calconf['occurrences_to_render'].length)

   // for each day in the month...
   for (d = 1; d <= calconf['selected_month_last_day_number']; d++)
   {
      days[d] = '';

      var current = new Array();
          current['MM']       = calconf['selected_month_number']
          current['DD']       = d
          current['YYYY']     = calconf['selected_year']
          current['YYYYMM']   = parseInt(current['YYYY'] + '' + two_digits(current['MM']), 10)
          current['YYYYMMDD'] = parseInt(current['YYYY'] + '' + two_digits(current['MM']) + '' + two_digits(current['DD']), 10)

      if ((calconf['occurrences_to_render']) && (calconf['occurrences_to_render'].length))
      {
          for (o = 0; o < calconf['occurrences_to_render'].length; o++)
          {
               var Occurence = calconf['occurrences_to_render'][o];
               var start     = Occurence['parsed_startdate'];
               var end       = Occurence['parsed_enddate'];
   
               Occurence['o'] = o;
   
               Occurence['current'] = current['YYYYMMDD'];
               
               //////
   
               Occurence['current_is_in_range'] = false;
               if ((current['YYYYMMDD'] >= start['YYYYMMDD']) && (current['YYYYMMDD'] <= end['YYYYMMDD']))
               {
                  //////
                  // basic date match, current is on or between start_date and end_date

                  Occurence['current_is_in_range'] = true;

                  //////
                  // if any normalized include dates have been specified, then only use include dates

                  if (Occurence['dates_include_normal'].length >= 10) // MM/DD/YYYY is 10 chars
                  {
                     Occurence['current_is_in_range'] = false;
                  }

                  //////
                  // by this point, Occurence['dates_include_list'] is the list of valid dates between start_date and end_date
                  // however, the current calendar day may or may not occur in the list of include dates

                  if (Occurence['dates_include_list'] && Occurence['dates_include_list'].length)
                  {
                     Occurence['included'] = false;
                     for(il = 0; il < Occurence['dates_include_list'].length; il++)
                     {
                        var include = new Array();
                         include['MM']       = parseInt(Occurence['dates_include_list'][il].split('/')[0], 10)
                         include['DD']       = parseInt(Occurence['dates_include_list'][il].split('/')[1], 10)
                         include['YYYY']     = parseInt(Occurence['dates_include_list'][il].split('/')[2], 10)
                         include['YYYYMM']   = parseInt(include['YYYY'] + '' + two_digits(include['MM']), 10)
                         include['YYYYMMDD'] = parseInt(include['YYYY'] + '' + two_digits(include['MM']) + '' + two_digits(include['DD']), 10)
                        
                        if (current['YYYYMMDD'] == include['YYYYMMDD'])
                        {
                           Occurence['included'] = true;
                        }
                     }
                     if (!Occurence['included'])
                     {
                        Occurence['current_is_in_range'] = false;
                     }
                     else
                     {
                        Occurence['current_is_in_range'] = true;
                     }
                  } // if there is an include list
   
                  //////
                  // by this point, Occurence['dates_exclude_list'] is the list of valid dates between 
                  // start_date and end_date however, the current calendar day (perhaps already included) 
                  // may now be exclude
   
                  if (Occurence['dates_exclude_list'] && Occurence['dates_exclude_list'].length)
                  {
                     Occurence['excluded'] = false;
                     for(el = 0; el < Occurence['dates_exclude_list'].length; el++)
                     {
                        var exclude = new Array();
                        exclude['MM']       = parseInt(Occurence['dates_exclude_list'][el].split('/')[0], 10)
                        exclude['DD']       = parseInt(Occurence['dates_exclude_list'][el].split('/')[1], 10)
                        exclude['YYYY']     = parseInt(Occurence['dates_exclude_list'][el].split('/')[2], 10)
                        exclude['YYYYMM']   = parseInt(exclude['YYYY'] + '' + two_digits(exclude['MM']), 10)
                        exclude['YYYYMMDD'] = parseInt(exclude['YYYY'] + '' + two_digits(exclude['MM']) + '' + two_digits(exclude['DD']), 10)
                        
                        if (current['YYYYMMDD'] == exclude['YYYYMMDD'])
                        {
                           Occurence['excluded'] = true;
                        }
                     }
                     if (Occurence['excluded'])
                     {
                        Occurence['current_is_in_range'] = false;
                     }
                  } // if there is an exclude list
               
                  if (Occurence['current_is_in_range'])
                  {
                     if (days[d].length)
                     {
                        days[d] = '' + days[d] + ',' + o;
                     }
                     else
                     {
                        days[d] = '' + o;
                     }
                  }

            } // if within range...
          } //for each occurence
      } // if occurences for this month exist...
   } // for each day in the month...

//print_array(days);

   calconf['occurences_per_days'] = days;
   return true;
}

function render_occurences()
{
   var day_number = 0;
   var start_numbering = false;
   var cellname
   var content = "";
   var bkgd_id = 0;
   var bkgd_id_name = ''
   var cmd = new Array();
   var cache = new Array()

   var details_cmd = ''
   var highlight_cmd = ''

   calconf['bkgds_off'] = '';

   for (w = 1; w < 7; w++)
   {
      for (d = 1; d < 8; d++)
      {
         cellname = 'dataEventWeek' + w + 'Day' + d

         setCalVal(cellname, '');  // initialize this...

         start_numbering = ((w == 1) && (d == calconf['selected_month_start_Week1Day'])) ? true : start_numbering;
         start_numbering = (day_number == calconf['selected_month_last_day_number']) ? false : start_numbering;
         if (start_numbering)
         {
            day_number = day_number + 1;
            var days_events = calconf['occurences_per_days'][day_number];
            if (days_events == '')
            {
               continue
            }
            for (e = 0; e < days_events.split(',').length; e++)
            {
               if (e == 0)
               {
                  content = ''
               }
               var o = days_events.split(',')[e];
               if (o)
               {
                  var Occurence = calconf['occurrences_to_render'][o];
                  var Event
                  if (!cache[Occurence['event_key_name']])
                  {
                     Event = get_event(Occurence['event_key_name'])
                     cache[Occurence['event_key_name']] = Event;
                  }
                  else
                  {
                     Event = cache[Occurence['event_key_name']]
                  }
                  bkgd_id = bkgd_id + 1;
                  bkgd_id_name = 'bkgdEvent' + bkgd_id;
                  cmd['details'] = "show_occurence(this," + o +"," + day_number + ");"

                  cmd['bkgd_on'] = ''
                  if (Event['color_bkgd'])
                  {
                     cmd['bkgd_on']  = "highlight_occurence('" + bkgd_id_name + "', '" + Event['color_bkgd'] + "', '" + Event['color_text'] + "', true);"
                  }
                  if (Event['color_bkgd_off'])
                  {
                     calconf['bkgds_off'] = calconf['bkgds_off'] + ((calconf['bkgds_off']) ? ',' : '')
                     calconf['bkgds_off'] = calconf['bkgds_off'] + bkgd_id_name + ":" + Event['color_bkgd_off']
                  }

                  content = content + '<div'
                  content = content + ' '
                  content = content + ' id="' + bkgd_id_name + '"'
                  content = content + ' '
                  content = content + 'style='
                  content = content + '"'
                  content = content + 'padding:2px;'
// content = content + 'color:' + Event['color_text'] + ';'
                  content = content + 'color: black;'
                  if (Event['color_bkgd_off'])
                  {
                     content = content + 'background-color:' + Event['color_bkgd_off'] + ';'
                  }
                  content = content + 'cursor:pointer;'
                  content = content + '"'
                  content = content + ' '
                  content = content + 'onclick="javascript:' + cmd['bkgd_on'] + cmd['details'] + 'return false;">';
                  if (Event['imgurl'])
                  {
                     content = content + '<img class="eventDetailsImageThumb" src="' + Event['imgurl'] + '">';
                     content = content + '<br />';
                  }
                  content = content + Occurence['time_start'];
                  content = content + add_dash(Occurence['time_start'], Occurence['time_end']);
                  content = content + Occurence['time_end'];
                  content = content + '<br />';
                  content = content + Event['name'];

                  content = content + '</a>';
                  content = content + '</div>'
                  if (e < days_events.split(',').length -1)
                  {
                     content = content + '<hr class="eventDetailsSeparator" />';
                  }
               } //if o
            } // for each event on day d

            setCalVal(cellname, content);

         } // if (start_numbering)
      } // for (d = 1; d < 8; d++)
   } // for (w = 1; w < 7; w++)
}

function highlight_occurence(bkgd_id, color, color_text, reset)
{
   var o;

   if (reset)
   {
      if (calconf['bkgds_off'].length)
      {
         var map = new Array();
         for (var i=0; i < calconf['bkgds_off'].split(',').length; i++)
         {
            map['map']     = calconf['bkgds_off'].split(',')[i]
            map['bkgd_id'] = map['map'].split(':')[0];
            map['color']   = map['map'].split(':')[1];
         
            o = document.getElementById(map['bkgd_id']);
            o.style.backgroundColor = map['color'];
            o.style.color = '#000';
         }
      }
   }

   o = document.getElementById(bkgd_id);
   o.style.backgroundColor = color;
   if (reset)
   {
      o.style.color = color_text;
   }
}

function show_occurence(obj, o, day_number)
{
   var Occurence = calconf['occurrences_to_render'][o];
   var Event = get_event(Occurence['event_key_name'])

   var html = '';

   // calc height of vertical spacer...
   // (a) determine which week associates with day_number
   var week = ''
   for (var w = 1; w < calconf['days_in_week'].length; w++)
   {
      var s = ',' + calconf['days_in_week'][w] + ','
      if (s.match(',' + day_number + ','))
      {
          week = w
      }
   }
   // (b) determine which week day_number belongs to
   if (week)
   {
      var pos = new Array
          pos['selected_element'] = findPos(obj)
   
          pos['week']             = findPos(document.getElementById('week' + week));   //destination
          pos['eventDetails']     = findPos(document.getElementById('eventDetails'));  //starting top position

      if ((pos['week']['top'] - pos['eventDetails']['top']) > 0)
      {
          pos['offset']   = (navigator.userAgent.match('MSIE')) ? 16 : 6
          pos['adjusted'] = pos['week']['top'] - pos['eventDetails']['top'] - pos['offset']
          html = html + '<div style="border:0px solid #000;margin:0px;padding:0px;width:10px;height:' + pos['adjusted'] + 'px;"></div>'
      }
   }

   html = html + '<span class="eventDetailsHeaderDate">'
   html = html + '<hr class="eventDetailsSeparator" />';
   html = html + calconf['selected_month'] + ' ' + two_digits(day_number) + ', ' + calconf['selected_year']
   html = html + '</span>';
   html = html + '<hr class="eventDetailsSeparator" />';

   if (Event['imgurl'])
   {
      html = html + '<img class="eventDetailsImage" src="' + Event['imgurl'] + '">';
      html = html + '<br />';
   }

   html = html + '<span class="eventDetailsStartTime">' + Occurence['time_start'] + '</span>'
               + add_dash(Occurence['time_start'], Occurence['time_end'])
               + '<span class="eventDetailsEndTime">' + Occurence['time_end'] + '</span>';
   html = html + '<br />';
   html = html + '<span class="eventDetailsName">' + Event['name'] + '</span>';
   html = html + '<br />';
   html = html + Event['descr'];
   html = html + '<hr class="eventDetailsSeparator" />';
   
   if (calconf['subcategory_event_note'])
   {
      html = html + calconf['subcategory_event_note']
      html = html + '<hr class="eventDetailsSeparator" />';
   }

   setCalVal('eventDetails', html);
}

function remove_occurences()
{
   setCalVal('eventDetails', '');
   for (w = 1; w < 7; w++)
   {
      for (d = 1; d < 8; d++)
      {
          setCalVal('dataEventWeek' + w + 'Day' + d, '');
          setCalClass('dataEventWeek' + w + 'Day' + d, "eventIndicatorOff event eventWeek" + w + " eventWeek" + w + "Day" + d);
          setCalClick('dataEventWeek' + w + 'Day' + d, function (){ } );
      }
   }
}
