/*
    LiveCalendar - http://jonabad.com/livecalendar/

    Originally based off of kcalendar by Kae Verens <kae@verens.com>
    this code has been modified, hacked, and otherwise defaced,
    morphing it into the WordPress plugin LiveCalendar.

    Object oriented code base was written by ste\/e (localsteve.net)
    You are free to use this code for non-commercial use as long
    as you keep this header in place.

    Version 1.9rc (download release for commented code)
    $Id: livecalendar.js 18 2006-03-18 02:16:58Z stevie $
*/
function LiveCalendar(sContainerID, sCalID, sSitePrefix, aMinDate, nWeekBegins, aRequestDate, sSpinnerImg, sPermaStruct, sMonthPermaStruct) {
    var self = this;        
    var site_prefix = sSitePrefix.replace(/\/$/,'');
    var livecal_path = site_prefix + '/wp-content/plugins/livecalendar/'; 
    var container_id = sContainerID;
    var calendar_id = sCalID;
    var permastruct = sPermaStruct;
    var month_permastruct = sMonthPermaStruct;
    var today = new Date;
    var entries_cache = new Array(); 
    var datehash;           
    var dayStrings;         
    var monthStrings;       
    var dayDisplayStrings;  
    var monthAbbreviations; 
    var archives;           
    var viewPostsFor_;      
    this.min_date = (aMinDate.length==0) ?
        today :                     
        new Date(aMinDate[0],aMinDate[1]-1,1);
    this.week_begins = nWeekBegins; 
    this.spinner_img = sSpinnerImg; 
    this.request_date = (aRequestDate.length==0) ?
        today :
        new Date(aRequestDate[0],aRequestDate[1]-1,1);
    this.fancyTooltips=false;       
    this.selectedWeek=false;         
    this.registerEvents = function() {
        if (typeof window.XMLHttpRequest!="undefined") {
            if (navigator.userAgent.indexOf('KHTML')>0) {
                setTimeout(self.refresh,2000);
            }
            else 
                addEvent(window,'load',self.refresh)
        }
    }
    this.localize = function( 
        sArchives, sViewPostsFor, aDayStrings, aDayDisplayStrings,
        aMonthStrings, aMonthAbbreviations ) {
        archives = sArchives;
        viewPostsFor_ = sViewPostsFor;
        dayStrings = aDayStrings;
        dayDisplayStrings = aDayDisplayStrings;
        monthStrings = aMonthStrings;
        monthAbbreviations = aMonthAbbreviations;
    }
    this.refresh = function(year,month) {
        if (isNaN(year)) {
            year=self.request_date.getFullYear();
            month=self.request_date.getMonth();
        }
        else {
            month--;
        }
        while (month<0 ) {
            month+=12;year--;
        }
        while (month>11) {
            month-=12;year++;
        }
        var min_year = self.min_date.getFullYear();
        var min_month = self.min_date.getMonth();
        var el=document.getElementById(container_id);
        if (!el) {
            var el2=document.getElementById(calendar_id);
            if (el2) {
                el=document.createElement('div');
                el.id=container_id;
                var el3=el2.parentNode;
                el3.insertBefore(el,el2);
                el3.removeChild(el2);
                el.appendChild(el2);
            }
        }
        if (!el) return;
        els=el.childNodes;
        for (i=el.childNodes.length-1;i>-1;i--)el.removeChild(els[i]);
        cal=build(year,month,1);
        el.appendChild(cal);
        if (entries_cache[datehash]) {
            create_links(entries_cache[datehash],year,month+1);
            el=document.getElementById('calendar_spin');
            if (el) el.parentNode.removeChild(el);
        }
        else {
            var req = new XMLHttpRequest();
            if (req) {
                req.onreadystatechange=function() {
                    if(req.readyState==4) {
                        if(req.status==200) {
                            if(req.responseText){
                                var lines = req.responseText.split(/\n/);
                                entries_cache[datehash] = {
                                    prev : lines.shift().replace('prev: ',''),
                                    next : lines.shift().replace('next: ',''),
                                    posts : lines[0]==''?[]:lines };
                            } else entries_cache[datehash] = {prev:null,next:null,posts:[]};
                            create_links(entries_cache[datehash],year,month+1);
                            el=document.getElementById('calendar_spin');
                            if(el) el.parentNode.removeChild(el);
                        }
                        else if( req.status==404 ) {
                            alert("LiveCalendar configuration error:\nCouldn't find :"+livecal_path +"livecal_posts.php\nPlease update the LIVECAL_PREFIX setting in livecalendar.php");
                            el=document.getElementById('calendar_spin');
                            if(el) el.parentNode.removeChild(el);
                        }
                    }
                }
                req.open('GET', livecal_path + 'livecal_posts.php?year='+shownDate.getFullYear()+'&month='+(shownDate.getMonth()+1)+'&min_year='+min_year+'&min_month='+min_month);
                if(navigator.userAgent.indexOf('KHTML')==-1)req.send(null);
                else req.send();
            }
        }
    }
    function addEvent(el,ev,fn) {
        if(el.attachEvent)el.attachEvent('on'+ev,fn);
        else if(el.addEventListener)el.addEventListener(ev,fn,false);
    }
    function daysInMonth(year,month) {
        if (month<0) {
            month+=12;year--;
        }
        if (month==3||month==5||month==8||month==10)return 30;
        if (month!=1)return 31;
        if (!(year%4))return 29;
        return 28;
    }
    function viewPostsFor(year,month) {
        return viewPostsFor_.replace("%1\$s",monthStrings[month]).replace("%2\$s",year);
    }
    function build(year,month,day) {
        shownDate=new Date(year,month,day);
        var cal=document.createElement('table');
        cal.id="wp-calendar";
        var caption=document.createElement('caption');
        caption.appendChild(document.createTextNode(monthStrings[shownDate.getMonth()]+' '+shownDate.getFullYear()));
        cal.appendChild(caption);
        caption.id="wp-calendar_caption";
        var cal_head = document.createElement('THEAD');
        cal.appendChild(cal_head); 
        var cal_row=cal_head.insertRow(0);
        for (i=0;i<7;i++) {
            var cal_cell = document.createElement('TH');
            cal_row.appendChild(cal_cell);
            var wd = dayDisplayStrings[(i+self.week_begins)%7];
            var wd_title = dayStrings[(i+self.week_begins)%7];
            cal_cell.appendChild(document.createTextNode(wd));
            cal_cell.abbr =wd;
            cal_cell.title=wd_title;
            cal_cell.scope="col";
        }
        var cal_foot = document.createElement('TFOOT');
        cal.appendChild(cal_foot);
        cal_row=cal_foot.insertRow(0);
        var cal_cell=cal_row.insertCell(0);
        cal_cell.colSpan=3;
        cal_cell.id = 'prev';
        cal_cell.className = 'pad';
        cal_cell=cal_row.insertCell(1);
        cal_cell.className = 'pad';
        var spinner = document.createElement("IMG");
        spinner.id="calendar_spin";
        spinner.src = livecal_path+self.spinner_img;
        cal_cell.appendChild(spinner);
        cal_cell=cal_row.insertCell(2);
        cal_cell.colSpan=3;
        cal_cell.id="next";
        cal_cell.className='pad';
        cal_row=cal_foot.insertRow(1);
        cal_cell=cal_row.insertCell(0);
        cal_cell.colSpan=3;
        cal_cell.id='prev_year';
        cal_cell.className='pad';
        cal_cell=cal_row.insertCell(1);
        cal_cell.className='pad';
        cal_cell=cal_row.insertCell(2);
        cal_cell.colSpan=3;
        cal_cell.id='next_year';
        cal_cell.className = 'pad';
        var cal_body = document.createElement('TBODY');
        cal.appendChild(cal_body);
        var firstcelldate=new Date(shownDate.getFullYear(),shownDate.getMonth(),1);
        var cellDate=1-firstcelldate.getDay()+self.week_begins;
        if (cellDate>1) cellDate-=7;
        var days_in_last_month=daysInMonth(shownDate.getFullYear(),shownDate.getMonth()-1);
        for (i=0;i<6;i++) {
            cal_row=cal_body.insertRow(i);
            for(j=0;j<7;j++) {
                cal_cell=cal_row.insertCell(j);
                var class_to_show='';
                var num_to_show;
                if (cellDate<1) {
                    class_to_show='pad';
                    num_to_show='';
                }
                else if (cellDate>daysInMonth(shownDate.getFullYear(),shownDate.getMonth())) {
                    class_to_show='pad';
                    num_to_show='';
                }
                else {
                    num_to_show=cellDate;
                    class_to_show='';
                    if (shownDate.getFullYear()==today.getFullYear() && shownDate.getMonth()==today.getMonth() && cellDate==today.getDate()) {
                        cal_cell.id='today';
                    }
                }
                cal_cell.appendChild(document.createTextNode(num_to_show));
                cal_cell.className=class_to_show;
                if( cal_cell.id != 'today' )
                    cal_cell.id="livecal_"+shownDate.getFullYear()+"_"+(shownDate.getMonth()+1)+"_"+String(cellDate).replace(/-/,'neg');
                cellDate++;
            }
        }
        datehash='livecal_'+(shownDate.getFullYear())+"_"+(shownDate.getMonth());
        return cal;
    }
    function create_links(cacheObj, shown_year, shown_month) {
        var prev = cacheObj.prev;
        var next = cacheObj.next;
        var posts = cacheObj.posts;
        var min_year = self.min_date.getFullYear();
        var min_month = self.min_date.getMonth()+1;
        var this_year = today.getFullYear();
        var this_month =today.getMonth()+1;
        if (prev != 'none') {
            var tmp = prev.split(/,/);
            var prev_year = Number(tmp[0]);
            var prev_month = Number(tmp[1]);
            var cell = document.getElementById('prev');
            if (cell.childNodes.length>0)
                cell.removeChild(cell.childNodes[0]);
            var link = document.createElement('a');
            link.appendChild(
                    document.createTextNode(String.fromCharCode(171)+" " +
                        monthAbbreviations[prev_month-1])
                    );
            addEvent(link,'click', function() {self.refresh(prev_year, prev_month)} );
            link.href='javascript:void(0)';
            link.title = viewPostsFor(prev_year,prev_month-1)
            cell.appendChild(link);
            cell.abbr=monthAbbreviations[prev_month-1];
            cell.className = '';
            if ((prev_year == shown_year && min_year < shown_year) || prev_year < shown_year ) {
                cell = document.getElementById('prev_year');
                var year = (prev_year < shown_year-1) ? prev_year : shown_year-1;
                var month = (year == min_year && shown_month < min_month) ? min_month : shown_month;
                if(cell.childNodes.length>0)
                    cell.removeChild(cell.childNodes[0]);
                link = document.createElement('a');
                link.appendChild(
                        document.createTextNode(String.fromCharCode(171)+" " + year)
                        );
                addEvent(link,'click',function() {self.refresh(year, month)} );
                link.href='javascript:void(0)';
                link.title = viewPostsFor(year,month-1);
                cell.appendChild(link);
                cell.className = '';
            }
        }
        if (next != 'none') {
            var cell = document.getElementById('next');
            var tmp = next.split(/,/);
            var next_year = Number(tmp[0]);
            var next_month = Number(tmp[1]);
            if (cell.childNodes.length>0)
                cell.removeChild(cell.childNodes[0]);
            var link = document.createElement('a');
            link.appendChild(
                    document.createTextNode(monthAbbreviations[next_month-1]+ " " +
                        String.fromCharCode(187))
                    );
            addEvent(link, 'click', function() {self.refresh(next_year, next_month)} );
            link.href='javascript:void(0)';
            link.title = viewPostsFor(next_year,next_month-1);
            cell.appendChild(link);
            cell.abbr=monthAbbreviations[next_month-1];
            cell.className = '';
            if ( (next_year == shown_year && this_year > shown_year) || next_year > shown_year ) {
                cell = document.getElementById('next_year');
                var year = (next_year > shown_year+1) ? next_year : shown_year+1;
                var month = (year == this_year && shown_month > this_month) ? this_month : shown_month;
                if (cell.childNodes.length>0)
                    cell.removeChild(cell.childNodes[0]);
                link = document.createElement('a');
                link.appendChild(
                        document.createTextNode(year + " " + String.fromCharCode(187))
                        );
                addEvent(link,'click',function() {self.refresh(year, month)} );
                link.href='javascript:void(0)';
                link.title = viewPostsFor(year,month-1)
                cell.appendChild(link);
                cell.className = '';
            }
        }
        if (posts.length == 0) return;
        var current_row = false;
        for (i=0;i<posts.length;i++) {
            var entries = posts[i].split(/: /);
            if(entries.length>2)
                entries = [entries.shift(), entries.join(': ')];
            var post_week = entries[0].replace(/[-\d]+\((\d+)\)/,'$1');
            var post_date = entries[0].replace(/\(.*/,'');
            var id='livecal_'+post_date.replace(/-/g,'_');
            id=id.replace(/_0/g,'_');
            var el=document.getElementById(id);
            if (!el) el=document.getElementById('today');
            if( el.parentNode != current_row && el.addEventListener ) {
                current_row = el.parentNode;
                if(post_week == self.selectedWeek && post_date.substr(0,4)==shown_year) {
                    el.parentNode.className = 'selectedWeek';
                    addEvent(current_row,'mouseover',function(){
                        this.className='selectedWeekHover';
                        }
                    );
                    addEvent(current_row,'mouseout',function(){
                        this.className='selectedWeek';
                        }
                    );
                }
                else {
                    addEvent(current_row,'mouseover',function(){
                        this.className='weekHover';
                        }
                    );
                    addEvent(current_row,'mouseout',function(){
                        this.className='';
                        }
                    );
                    current_row.week_link = site_prefix + '/?w='+post_week+'&y='+shown_year;
                    addEvent(current_row,'click', function() { window.location=this.week_link });
                }
            }
            var text=el.childNodes[0];
            var el2=document.createElement('a');
            el2.appendChild(text);
            el2.title=entries[1];
            var datenums = post_date.split(/-/);
            var link = site_prefix + permastruct;
            link = link.replace(/%year%/,datenums[0]);
            link = link.replace(/%monthnum%/,datenums[1]);
            link = link.replace(/%day%/,datenums[2]);
            el2.href=link;
            el.appendChild(el2);
        }
        el = document.getElementById('wp-calendar_caption');
        if (el) {
            text=el.childNodes[0];
            el2=document.createElement('a');
            el2.title= archives+' '+monthStrings[shown_month-1]+ ' ' +shown_year;
            el2.appendChild(text);
            var link = site_prefix + month_permastruct;
            link = link.replace(/%year%/,shown_year);
            link = link.replace(/%monthnum%/,shown_month);
            el2.href= link;
            el.appendChild(el2);
        }
        if ( self.fancyTooltips == true ) FancyTooltips.autoCreation();
    }
} 

