/***********************************************************************************************************************/
// Routines for generating an events calendar
// (c) 2008 3legs ltd.
// This really should have been an object, I did not realise how complex it was going to get
/***********************************************************************************************************************/

var month_names = ['January', 'Feburary', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
var day_names = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
var start_day = 0;
var styles = {  'event' : 'event_style',
                'weekday' : 'weekday_style',
                'other' : 'other_style'};
var num_months_avail = 15;
var cal_div;
var cal_nav_div;

/***********************************************************************************************************************/

function init (in_cal_div, in_cal_nav_div) {
    
    cal_div = in_cal_div;
    cal_nav_div = in_cal_nav_div;
    
    start_generate_calendar();
    
}

/***********************************************************************************************************************/

function start_generate_calendar (month, year) {
    
    if (document.getElementById(cal_div).firstChild) {
        document.getElementById(cal_div).removeChild(document.getElementById(cal_div).firstChild);
    }
    
    if (! (month | year)) {
        var today = Date.today();
        month = today.getMonth();
        year = today.getFullYear();
    }

    var start_date = new Date(year, month, 1);

    generate_navigation(cal_nav_div, start_date);
    
    var table = document.createElement('table');
    var tblBody = document.createElement("tbody");
   
    //attch the body 
    table.appendChild(tblBody);

    //Put in the day name header
    var row = tblBody.appendChild(document.createElement('tr'));
    for (var i=0; i<day_names.length; i++) {
        var cell = row.appendChild(document.createElement('td'));
        cell.appendChild(document.createTextNode(day_names[i]));
    }

    var cell_count = 0;
    var current_row;
    var current_day_num = 0;
    var in_day_add_loop;
    while (start_date.getMonth() == month) {

        current_day_num = cell_count % 7;
        
        if (cell_count % 7 == 0) {
            //add a new row to the table           
            current_row = document.createElement('tr');
            tblBody.appendChild(current_row);
        }
        
        cell_count++;
        
        var yesterday = start_date.clone().addDays(-1);
        if (current_day_num == yesterday.getDay()) {
            in_day_add_loop = true;
        }

        if (current_row) {
            //add a cell
            var current_cell = document.createElement('td');
            current_row.appendChild(current_cell);
            current_cell.setAttribute('CAL_date', start_date.clone());
            if (in_day_add_loop) {
                current_cell.appendChild(document.createTextNode( start_date.getDate() ));
            }
        }

        if (in_day_add_loop) {
            cell_date_callback(current_cell, start_date);
        }
            
        if (in_day_add_loop) {
            start_date.addDays(1);
        }

    }

    //Attach the table to the cal_div
    document.getElementById(cal_div).appendChild(table);    

}

/***********************************************************************************************************************/

function cell_date_callback (cell, date) {
    
    //pick a style based upon these conditions (in this order)
    //Is there an event
    //Is it a weekday
    //all others (will style a weekend)
    
    var style = 'other';
    
    var event_id = find_event(date);
    if (event_id) { 
        style = 'event';
        //bind an onclick handler to this cell
        cell.title = 'Click to view events';
        cell.setAttribute('CAL_event_id', event_id);
        cell.onclick = event_onclick_hander;
    }
    
    if (style == 'other') { //only override the other style
        if (date.isWeekday()) {
            style = 'weekday';
        }
    }
    
    cell.className = styles[style];
    
}

/***********************************************************************************************************************/

function find_event (date) {
    
    var date_str = date.toString('dd-MM-yyyy');
    
    if (events[date_str]) {
        return(events[date_str]);
    }
    
    return(false);
                
}

/***********************************************************************************************************************/

function event_onclick_hander (e) {
	if (!e) var e = window.event;   //bullshit to handle ie
	// e gives access to the event in all browsers
    
    var target = get_target_element(e);
    
    display_event( target.getAttribute('CAL_event_id') );
    display_day( target.getAttribute('CAL_date') );

}


/***********************************************************************************************************************/

function get_target_element (e) {    //code from http://www.quirksmode.org/js/events_properties.html#target
    
    var targ;
    
    if (e.target) targ = e.target;
	else if (e.srcElement) targ = e.srcElement;
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
    return(targ);
}

/***********************************************************************************************************************/

function cal_move_by_months (num_months) {
       
    var current_sel_month = document.getElementById('cal_nav_select');
    var split_value = current_sel_month.value.split(" ");
    
    var date = new Date(split_value[1], split_value[0], 1);
    
    date.addMonths(num_months);
    
    var month_start = new Date.today().setDate(1);
    
    if (date >= month_start) {
        start_generate_calendar(date.getMonth(), date.getFullYear());
    }
    
}

/***********************************************************************************************************************/

function move_calendar (target_element) {
    
    var split_value = target_element.value.split(" ");
    
    start_generate_calendar(split_value[0], split_value[1]);
    
}

/***********************************************************************************************************************/

function generate_navigation (target_div, date) {
    
    var working_date = new Date.today();
    
    document.getElementById(target_div).innerHTML =
        '<div id="cal_nav_prev" onClick="javascript:cal_move_by_months(-1)">Prev</div>' +
        '<div id="cal_nav_sel_month"><select id="cal_nav_select" onChange="javascript:move_calendar(this)"></select></div>' +
        '<div id="cal_nav_next" onClick="javascript:cal_move_by_months(1)">Next</div>';
    
    
    var select = document.getElementById('cal_nav_select');
    
    for (i=0; i<num_months_avail; i++) {
        
        var option = document.createElement('option');

        option.text = month_names[working_date.getMonth()] + ' ' + working_date.getFullYear();
        option.value = working_date.getMonth() + ' ' +  working_date.getFullYear();
        

        try {
            select.add(option, null); // standards compliant
        }
        catch(ex) { // IE only
            select.add(option, 0);
        }

              
        if (working_date.getMonth() == date.getMonth() & working_date.getFullYear() == date.getFullYear()) {
            option.selected = true;
        }
        
        working_date.addMonths(1);
    }
    
    document.getElementById('cal_nav_sel_month').appendChild(select);
    
}

/***********************************************************************************************************************/
