/* 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';