web/wp-content/plugins/event-calendar/ec3.js
changeset 136 bde1974c263b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/event-calendar/ec3.js	Wed Feb 03 15:37:20 2010 +0000
@@ -0,0 +1,439 @@
+/* EventCalendar. Copyright (C) 2005-2007, Alex Tingle.  $Revision: 284 $
+ * This file is licensed under the GNU GPL. See LICENSE file for details.
+ */
+
+// Set in HTML file:
+//   var ec3.start_of_week
+//   var ec3.month_of_year
+//   var ec3.month_abbrev
+//   var ec3.myfiles
+//   var ec3.home
+//   var ec3.hide_logo
+//   var ec3.viewpostsfor
+
+/** Register an onload function. */
+function WindowOnload(f)
+{
+  var prev=window.onload;
+  window.onload=function(){ if(prev)prev(); f(); }
+}
+
+// namespace
+function ec3()
+{
+  WindowOnload( function()
+  {
+    // Overwrite the href links in ec3_prev & ec3_next to activate EC3.
+    var prev=document.getElementById('ec3_prev');
+    var next=document.getElementById('ec3_next');
+    if(prev && next)
+    {
+      // Check for cat limit in month link
+      var xCat=new RegExp('&cat=[0-9]+$');
+      var match=xCat.exec(prev.href);
+      if(match)
+        ec3.catClause=match[0];
+      // Replace links
+      prev.href='javascript:ec3.go_prev()';
+      next.href='javascript:ec3.go_next()';
+      // Pre-load image.
+      ec3.imgwait=new Image(14,14);
+      ec3.imgwait.src=ec3.myfiles+'/ec_load.gif';
+      // Convert strings from PHP into Unicode
+      ec3.viewpostsfor=unencode(ec3.viewpostsfor);
+      for(var i=0; i<ec3.month_of_year.length; i++)
+        ec3.month_of_year[i]=unencode(ec3.month_of_year[i]);
+      for(var j=0; j<ec3.month_abbrev.length; j++)
+        ec3.month_abbrev[j]=unencode(ec3.month_abbrev[j]);
+    }
+  } );
+
+  /** Converts HTML encoded text (e.g. "&copy Copyright") into Unicode. */
+  function unencode(text)
+  {
+    if(!ec3.unencodeDiv)
+      ec3.unencodeDiv=document.createElement('div');
+    ec3.unencodeDiv.innerHTML=text;
+    return (ec3.unencodeDiv.innerText || ec3.unencodeDiv.firstChild.nodeValue);
+  }
+
+  function get_child_by_tag_name(element,tag_name)
+  {
+    var results=element.getElementsByTagName(tag_name);
+    if(results)
+      for(var i=0; i<results.length; i++)
+        if(results[i].parentNode==element)
+          return results[i];
+    return 0;
+  }
+  ec3.get_child_by_tag_name=get_child_by_tag_name;
+
+
+  function calc_day_id(day_num,month_num,year_num)
+  {
+    if(ec3.today_day_num==day_num &&
+       ec3.today_month_num==month_num &&
+       ec3.today_year_num==year_num)
+    {
+      return 'today';
+    }
+    else
+    {
+      return 'ec3_'+year_num+'_'+month_num+'_'+day_num;
+    }
+  }
+
+
+  /** Replaces the caption and tbody in table to be the specified year/month. */
+  function create_calendar(table_cal,month_num,year_num)
+  {
+    // Take a deep copy of the current calendar.
+    var table=table_cal.cloneNode(1);
+
+    // Calculate the zero-based month_num
+    var month_num0=month_num-1;
+
+    // Set the new caption
+    var caption=get_child_by_tag_name(table,'caption');
+    if(caption)
+    {
+      var c=get_child_by_tag_name(caption,'a');
+      var caption_text=ec3.month_of_year[month_num0] + ' ' + year_num;
+      if(c && c.firstChild && c.firstChild.nodeType==ec3.TEXT_NODE )
+      {
+	if(month_num<10) 
+	{
+	  c.href=ec3.home+'/?m='+year_num+'0'+month_num;
+	}
+	else
+	{
+	  c.href=ec3.home+'/?m='+year_num+month_num;
+	}
+        if(ec3.catClause)
+           c.href+=ec3.catClause; // Copy cat' limit from original month link.
+        c.title=ec3.viewpostsfor;
+        c.title=c.title.replace(/%1\$s/,ec3.month_of_year[month_num0]);
+        c.title=c.title.replace(/%2\$s/,year_num);
+        c.firstChild.data=caption_text;
+      }
+    }
+
+    if(caption && caption.firstChild && caption.firstChild.nodeType==ec3.TEXT_NODE)
+      caption.firstChild.data=ec3.month_of_year[month_num0] + ' ' + year_num;
+
+    var tbody=get_child_by_tag_name(table,'tbody');
+
+    // Remove all children from the table body
+    while(tbody.lastChild)
+      tbody.removeChild(tbody.lastChild);
+
+    // Make a new calendar.
+    var date=new Date(year_num,month_num0,1, 12,00,00);
+
+    var tr=document.createElement('tr');
+    var td,div;
+    tbody.appendChild(tr);
+    var day_count=0
+    var col=0;
+    while(date.getMonth()==month_num0 && day_count<40)
+    {
+      var day=(date.getDay()+7-ec3.start_of_week)%7;
+      if(col>6)
+      {
+        tr=document.createElement('tr');
+        tbody.appendChild(tr);
+        col=0;
+      }
+      if(col<day)
+      {
+        // insert padding
+        td=document.createElement('td');
+        td.colSpan=day-col;
+        td.className='pad';
+        tr.appendChild(td);
+        col=day;
+      }
+      // insert day
+      td=document.createElement('td');
+      td.appendChild(document.createTextNode(date.getDate()));
+      td.id=calc_day_id(date.getDate(),month_num,year_num);
+      tr.appendChild(td);
+      col++;
+      day_count++;
+      date.setDate(date.getDate()+1);
+    }
+    // insert padding
+    if(col<7)
+    {
+      td=document.createElement('td');
+      td.colSpan=7-col;
+      td.className='pad';
+      tr.appendChild(td);
+    }
+
+    // add the 'dog'
+    if((7-col)>1 && !ec3.hide_logo)
+    {
+      a=document.createElement('a');
+      a.href='http://blog.firetree.net/?ec3_version='+ec3.version;
+      a.title='Event Calendar '+ec3.version;
+      td.style.verticalAlign='bottom';
+      td.appendChild(a);
+      div=document.createElement('div');
+      div.className='ec3_ec';
+      div.align='right'; // keeps IE happy
+      a.appendChild(div);
+    }
+
+    // set table's element id
+    table.id='ec3_'+year_num+'_'+month_num;
+
+    return table;
+  } // end create_calendar()
+
+
+  /** Dispatch an XMLHttpRequest for a month of calendar entries. */
+  function loadDates(month_num,year_num)
+  {
+    var req=new XMLHttpRequest();
+    if(req)
+    {
+      ec3.reqs.push(req);
+      req.onreadystatechange=process_xml;
+      req.open("GET",
+        ec3.home+'/?ec3_xml='+year_num+'_'+month_num,true);
+      set_spinner(1);
+      req.send(null);
+    }
+  }
+  
+
+  /** Obtain an array of all the calendar tables. */
+  function get_calendars()
+  {
+    var div=document.getElementById('wp-calendar');
+    var result=new Array();
+    for(var i=0; i<div.childNodes.length; i++)
+    {
+      var c=div.childNodes[i];
+      if(c.id && c.id.search('ec3_[0-9]')==0 && c.style.display!='none')
+        result.push(div.childNodes[i]);
+    }
+    if(result.length>0)
+      return result;
+    else
+      return 0;
+  }
+  ec3.get_calendars=get_calendars;
+
+
+  /** Changes the link text in the forward and backwards buttons.
+   *  Parameters are the 0-based month numbers. */
+  function rewrite_controls(prev_month0,next_month0)
+  {
+    var prev=document.getElementById('ec3_prev');
+    if(prev && prev.firstChild && prev.firstChild.nodeType==ec3.TEXT_NODE)
+      prev.firstChild.data='\u00ab\u00a0'+ec3.month_abbrev[prev_month0%12];
+    var next=document.getElementById('ec3_next');
+    if(next && next.firstChild && next.firstChild.nodeType==ec3.TEXT_NODE)
+      next.firstChild.data=ec3.month_abbrev[next_month0%12]+'\u00a0\u00bb';
+  }
+
+
+  /** Turn the busy spinner on or off. */
+  function set_spinner(on)
+  {
+    var spinner=document.getElementById('ec3_spinner');
+    var publish=document.getElementById('ec3_publish');
+    if(spinner)
+    {
+      if(on)
+      {
+        spinner.style.display='inline';
+        if(publish)
+          publish.style.display='none';
+      }
+      else
+      {
+        spinner.style.display='none';
+        if(publish)
+          publish.style.display='inline';
+      }
+    }
+  }
+
+
+  /** Called when the user clicks the 'previous month' button. */
+  function go_prev()
+  {
+    var calendars=get_calendars();
+    if(!calendars)
+      return;
+    var pn=calendars[0].parentNode;
+
+    // calculate date of new calendar
+    var id_array=calendars[0].id.split('_');
+    if(id_array.length<3)
+      return;
+    var year_num=parseInt(id_array[1]);
+    var month_num=parseInt(id_array[2])-1;
+    if(month_num==0)
+    {
+      month_num=12;
+      year_num--;
+    }
+    // Get new calendar
+    var newcal=document.getElementById('ec3_'+year_num+'_'+month_num);
+    if(newcal)
+    {
+      // Add in the new first calendar
+      newcal.style.display=ec3.calendar_display;
+    }
+    else
+    {
+      newcal=create_calendar(calendars[0],month_num,year_num);
+      pn.insertBefore( newcal, calendars[0] );
+      loadDates(month_num,year_num);
+    }
+    // Hide the last calendar
+    ec3.calendar_display=calendars[calendars.length-1].style.display;
+    calendars[calendars.length-1].style.display='none';
+
+    // Re-write the forward & back buttons.
+    rewrite_controls(month_num+10,month_num+calendars.length-1);
+  }
+  ec3.go_prev=go_prev;
+
+
+  /** Called when the user clicks the 'next month' button. */
+  function go_next()
+  {
+    var calendars=get_calendars();
+    if(!calendars)
+      return;
+    var pn=calendars[0].parentNode;
+    var last_cal=calendars[calendars.length-1];
+
+    // calculate date of new calendar
+    var id_array=last_cal.id.split('_');
+    if(id_array.length<3)
+      return;
+    var year_num=parseInt(id_array[1]);
+    var month_num=1+parseInt(id_array[2]);
+    if(month_num==13)
+    {
+      month_num=1;
+      year_num++;
+    }
+    // Get new calendar
+    var newcal=document.getElementById('ec3_'+year_num+'_'+month_num);
+    if(newcal)
+    {
+      // Add in the new last calendar
+      newcal.style.display=ec3.calendar_display;
+    }
+    else
+    {
+      newcal=create_calendar(calendars[0],month_num,year_num);
+      if(last_cal.nextSibling)
+        pn.insertBefore(newcal,last_cal.nextSibling);
+      else
+        pn.appendChild(newcal);
+      loadDates(month_num,year_num);
+    }
+    // Hide the first calendar
+    ec3.calendar_display=calendars[0].style.display;
+    calendars[0].style.display='none';
+
+    // Re-write the forward & back buttons.
+    rewrite_controls(month_num-calendars.length+11,month_num);
+  }
+  ec3.go_next=go_next;
+
+
+  /** Triggered when the XML load is complete. Checks that load is OK, and then
+   *  updates calendar days. */
+  function process_xml()
+  {
+    var busy=0;
+    for(var i=0; i<ec3.reqs.length; i++)
+    {
+      var req=ec3.reqs[i];
+      if(req)
+      {
+        if(req.readyState==4)
+        {
+          ec3.reqs[i]=0;
+          if(req.status==200)
+            update_days(req.responseXML.documentElement);
+        }
+        else
+          busy=1;
+      }
+    }
+    if(!busy)
+    {
+      // Remove old requests.
+      while(ec3.reqs.shift && ec3.reqs.length && !ec3.reqs[0])
+        ec3.reqs.shift();
+      set_spinner(0);
+    }
+  }
+
+
+  /** Adds links to the calendar for each day listed in the XML. */
+  function update_days(month_xml)
+  {
+    var days=month_xml.getElementsByTagName('day');
+    if(!days)
+      return;
+    for(var i=0; i<days.length; i++)
+    {
+      var td=document.getElementById(days[i].getAttribute('id'));
+      if(td && td.firstChild && td.firstChild.nodeType==ec3.TEXT_NODE)
+      {
+        td.className='ec3_postday';
+        var txt=td.removeChild(td.firstChild);
+        var a=document.createElement('a');
+        a.href=days[i].getAttribute('link');
+        a.title=days[i].getAttribute('titles');
+        if(days[i].getAttribute('is_event'))
+        {
+          td.className+=' ec3_eventday';
+          a.className='eventday';
+        }
+        a.appendChild(txt);
+        td.appendChild(a);
+      }
+    }
+    if(typeof ec3_Popup != 'undefined')
+    {
+      var month=
+        document.getElementById(month_xml.childNodes[0].getAttribute('id'));
+      if(month)
+        ec3_Popup.add_tbody( get_child_by_tag_name(month,'tbody') );
+    }
+  }
+
+
+} // end namespace ec3
+
+// Export public functions from ec3 namespace.
+ec3();
+
+// Set up static variables in namespace 'ec3'.
+
+// Get today's date.
+// Note - DO THIS ONCE, so that the value of today never changes!
+ec3.today=new Date();
+ec3.today_day_num=ec3.today.getDate();
+ec3.today_month_num=1+ec3.today.getMonth();
+ec3.today_year_num=ec3.today.getFullYear();
+
+// Holds ongoing XmlHttp requests.
+ec3.reqs=new Array();
+
+ec3.ELEMENT_NODE=1;
+ec3.TEXT_NODE=3;
+
+ec3.version='3.1.4';