///////////////////////////////////////////////////////////////////////////////////////////////////
// File: events.js
// Creator: Monjay Settro, Devbleue Inc.
// Purpose: library of calendar event functions...
//////////
// This presumes that config.js:get_calendar_config_data(selected_subcategory) has already run successfully
// events.html contains the unique list of events related to subcategories
// get_calendar_event_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: events.html all headers in the event table for a subcategory need to be <th> tags to distinguish them from <td> values
///////////////////////////////////////////////////////////////////////////////////////////////////

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

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

function events_data_handler_core(source, responseText)
{
   if (calconf['events']['selected']['category'])
   {
caldebug('events core ' + calconf['selected_subcategory'] + ' == ' + calconf['events']['selected']['category'])
      if (calconf['selected_subcategory'] == calconf['events']['selected']['category'])
      {
         events_next_action(1)
         return true;
      }
   }
   var result = get_calconf_xml(responseText, calconf['selected_subcategory'])
   switch(result['error_code'])
   {
      case 1: 
               calwait(false)
               calconf['events']['xml'] = false
               return false
               break
      case 2:
               calwait(false)
               calerror(300, "Looks like there is a problem [underline]loading[/underline] calendar event data.")
               calconf['events']['xml'] = false
               return false
               break
      case 3:
               calwait(false);
               calerror(301, "Looks like there is a problem [underline]parsing[/underline] calendar event data.")
               calconf['events']['xml'] = false
               return false;
               break
      default:
               calconf['events']['xml'] = result['doc']
               calconf['events']['responseText'] = responseText
               calconf['events']['selected']['category'] = calconf['selected_subcategory']
               calconf['events']['data']['tds'] = calconf['events']['xml'].getElementsByTagName('td')
               if (calconf['events']['data']['tds'].length)
               {
                  return events_next_action(2)
               }

               calwait(false);
               calerror(302, "Looks like there is a problem [underline]confirming the content[/underline] of calendar event data.")
               calconf['events']['xml'] = false;
               return false;
   } //switch

   return false;
}

function events_next_action(source)
{
   if (test_events_functions())
   {
caldebug('events next action() - finished - source = ' + source);
      occurences_data()
      return true;
   }
   return false;
}

function test_events_functions()
{
   // this is a hook to test the behavior of the below event functions
   // return true to continue with loading occurences (and other calendar operations)
   // return false to discontinue calendar operations.
   // in a production environment this function should remain empty
   return true;   
}

///////////////////////////////////////////////////////////////////////////////////////////////////

function get_event(keyName)
{
   // key names name matches are case insensitive
   if ((calconf) && (calconf['events']['data']['tds']))
   {
      for (var i = 0; i < calconf['events']['data']['tds'].length; i = i + 6)
      {
         var content = prep_calendar_data_value(calconf['events']['data']['tds'][i+0]);
         if (content.toLowerCase() == keyName.toLowerCase())
         {
            var Event                = new Array
                Event['key']         = content;
                Event['name']        = prep_calendar_data_value(calconf['events']['data']['tds'][i+1]);
                Event['descr']       = prep_calendar_data_value(calconf['events']['data']['tds'][i+2]);
                Event['color_bkgd']  = prep_calendar_data_value(calconf['events']['data']['tds'][i+3]);
                Event['color_text']  = prep_calendar_data_value(calconf['events']['data']['tds'][i+4]);

            if ((Event['color_bkgd']) && (pastel(Event['color_bkgd'])))
            {
               // might want to let the user select the level of opacity on the pastel
               Event['color_bkgd_off'] = pastel(Event['color_bkgd'])
            }

            Event['imgurl'] = prep_calendar_data_value(calconf['events']['data']['tds'][i+5]);
            if (!Event['imgurl'].match('[Jj][pP][gG]|[gG][iI][fF]|[pP][nN][gG]'))
            {
               Event['imgurl'] = '';
            }
            return Event;
         }
      }
   }
   return false;
}

function get_event_keynames()
{
   // 1. key names occur in the 0th position and every 5th position there after 
   // 2. this function should hop through the list of event_data_tds and land on
   //    a keyname. If this does not occur then the # of cols in the events table has 
   //    changed or some other error has occured...

   if (!calconf || !calconf['init'] || !calconf['events']['data']['tds'])
   {
      return false;
   }

   var names = new Array();
   for (var i = 0; i < calconf['events']['data']['tds'].length; i = i + 6)
   {
      var v = prep_calendar_data_value(calconf['events']['data']['tds'][i])
      if (v)
      {
         names[names.length] = v;
      }
   }
   return names;
}
