// setup namespace for the side calendar
idw.sidecalendar = {};

idw.sidecalendar.cal_settings = {};
idw.sidecalendar.lang = "";

idw.sidecalendar.reset_calendar_settings = function()
{
    idw.sidecalendar.cal_settings.use_personal_portal = false;
    idw.sidecalendar.cal_settings.cal_year = new Date().getFullYear();
    idw.sidecalendar.cal_settings.cal_month = new Date().getMonth();
    idw.sidecalendar.cal_settings.cal_day = new Date().getDate();
    idw.sidecalendar.cal_settings.display_range = 1;
    idw.sidecalendar.cal_settings.country_id = null;
    idw.sidecalendar.cal_settings.province_id = null;
    idw.sidecalendar.cal_settings.field_id = null;
    idw.sidecalendar.cal_settings.audience_id = null;
    idw.sidecalendar.cal_settings.relevance_id = 3;
}

idw.sidecalendar.get_dayofweek_for_date = function(year, month, day)
{
    d = new Date(year, month, day);
    return d.getDay()
};

idw.sidecalendar.date_to_datetime_start = function(year, month, day)
{
    return year+"-"+(month<10 ? "0" : "")+month+"-"+(day<10 ? "0" : "")+day+" 00:00:00"
};

idw.sidecalendar.date_to_datetime_end = function(year, month, day)
{
    var end_date = new Date(year, month-1, (Number(day)+idw.sidecalendar.cal_settings.display_range-1));
    var d = end_date.getFullYear()+"-"+((end_date.getMonth()+1)<10 ? "0" : "")+(end_date.getMonth()+1)+"-"
        +(end_date.getDate()<10 ? "0" : "")+end_date.getDate()+" 23:59:59";
    return d;
};

idw.sidecalendar.increment_calendar = function(increment)
{
    // Handle the year wraparound reasonably
    idw.sidecalendar.cal_settings.cal_month += increment;
    // careful - month numbers start at 0!
    if (idw.sidecalendar.cal_settings.cal_month>11)
        {
        idw.sidecalendar.cal_settings.cal_month = 0;
        idw.sidecalendar.cal_settings.cal_year = Number(idw.sidecalendar.cal_settings.cal_year)+1;
        }
    else if (idw.sidecalendar.cal_settings.cal_month<0)
        {
        idw.sidecalendar.cal_settings.cal_month = 11;
        idw.sidecalendar.cal_settings.cal_year -= 1;
        }
};

idw.sidecalendar.calendar_html = function()
{
    var today = new Date();
    var day_of_week = 0;
    var num_lines = 0;
    var cell_class = "";
    var bucket = '<table class="Calendar">\n';
    // title row of the calendar table
    bucket += "<tr>\n";
    for (var d = 0; d<=6; d++)
        {
        // Generate day names
        bucket += "<th>"+idw.translations.sidecalendar[idw.sidecalendar.lang].daynames[d]+"</th>";
        };
    bucket += "</tr>\n<tr>";
    
    // generate  "empty" cells (before the 1st of the month)
    var dow = idw.sidecalendar.get_dayofweek_for_date(idw.sidecalendar.cal_settings.cal_year,
        idw.sidecalendar.cal_settings.cal_month, 1);
    // Shove sunday to the end
    if (dow==0)
        {
        dow += 7;
        };
    // Build an empty cell per day that is before the current month starts
    for (var ed = 1; ed<dow; ed++)
        {
        bucket += "<td>&nbsp;</td>\n";
        }
    // Iterate through the month and generate the table entries
    for (var day = 1; day<=31; day++)
        {
        cell_class = "";
        day_of_week = idw.sidecalendar.get_dayofweek_for_date(idw.sidecalendar.cal_settings.cal_year,
            idw.sidecalendar.cal_settings.cal_month, day);

        // first figure out what CSS classes we need for this cell
        if ((day_of_week==0)||(day_of_week==6))
            {
            // weekend days get a different color/class
            if ((today.getDate()==day)&&(today.getMonth()==idw.sidecalendar.cal_settings.cal_month)
                &&(today.getFullYear()==idw.sidecalendar.cal_settings.cal_year))
                {
                // if the day is the current day then mark it as such
                cell_class += ' class="Link CurrentDay Weekend"';
                }
            else
                {
                cell_class += ' class="Link Weekend"';
                }
            }
        // non-weekend days
        else if ((today.getDate()==day)&&(today.getMonth()==idw.sidecalendar.cal_settings.cal_month)
            &&(today.getFullYear()==idw.sidecalendar.cal_settings.cal_year))
            {
            // if the day is the current day then mark it as such
            cell_class += ' class="Link CurrentDay"';
            }
        else
            {
            cell_class += ' class="Link"';
            }
        
        // Generate cell markup
        bucket += '<td'+cell_class+'><a onClick="idw.sidecalendar.set_calendar_day('+day+')">';
        // If this is displayed on the calendar page then highlight the date range that is displayed
        if ((location.pathname.split("/").reverse()[0]=='calendar')&&(idw.sidecalendar.cal_settings.cal_day<=day)
            &&(day<idw.sidecalendar.cal_settings.cal_day+idw.sidecalendar.cal_settings.display_range))
            {
            bucket += "<b>"+day+"</b>";
            }
        else
            {
            bucket += day;
            }
        bucket += '</a></td>\n';

        // figure out if this is the last day and if so, break out of the loop
        if (new Date(idw.sidecalendar.cal_settings.cal_year, idw.sidecalendar.cal_settings.cal_month,
            (day+1)).getMonth()!=idw.sidecalendar.cal_settings.cal_month)
            {
            var last_day_of_week = day_of_week;
            break;
            }
        // After sunday, start a new row
        if (day_of_week==0)
            {
            bucket += "</tr><tr>\n";
            num_lines += 1;
            }
        } // end for
    // add the cells that are required to complete the line
    if (day_of_week!=0)
        {
        for (ed = last_day_of_week; ed<=6; ed++)
            {
            bucket += "<td>&nbsp;</td>\n";
            }
        }
    // Fill in empty lines to not have the size of the calendar jump
    while (num_lines<5)
        {
        bucket
            += "</tr><tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>";
        num_lines += 1;
        }
    bucket += "</tr></table>\n";
    return bucket;
};

idw.sidecalendar.init_search_form = function()
{
    document.side_calendar_search.usepersonalportal.onchange = new Function('idw.sidecalendar.update_use_personal_portal()');
    document.side_calendar_search.month.onchange = new Function('idw.sidecalendar.update_calendar_month()');
    document.side_calendar_search.year.onchange = new Function('idw.sidecalendar.update_calendar_year()');
    document.side_calendar_search.country_id.onchange = new Function('idw.sidecalendar.update_calendar_country()');
    document.side_calendar_search.province_id.onchange = new Function('idw.sidecalendar.update_calendar_province()');
    document.side_calendar_search.audience_id.onchange = new Function('idw.sidecalendar.update_calendar_audience()');
    document.side_calendar_search.field_id.onchange = new Function('idw.sidecalendar.update_calendar_field()');
    document.side_calendar_search.relevance_id.onchange = new Function('idw.sidecalendar.update_calendar_relevance()');
    document.side_calendar_search.removeChild(document.side_calendar_search.search_submit);
    document.side_calendar_search.relevance_id.options[0] = null;
};

idw.sidecalendar.init_calendar = function(langin)
{
    idw.sidecalendar.lang = langin

    idw.sidecalendar.load_calendar_settings();

    if (document.getElementById('calendar_navline'))
        {
        var navline = '<a class="Link" onclick="idw.sidecalendar.change_month(-1)">< ' + 
                      idw.translations.sidecalendar[idw.sidecalendar.lang].prev_month + 
                      '</a> | <a class="Link" onclick="idw.sidecalendar.change_month(1)">' + 
                      idw.translations.sidecalendar[idw.sidecalendar.lang].next_month + ' ></a>';
        $('#calendar_navline').html(navline);
        }

    var servlet_name = location.pathname.split("/").reverse()[0];
    if (servlet_name=='calendar')
        {
        $('#current_events').html(idw.translations.sidecalendar[idw.sidecalendar.lang].range);
        idw.sidecalendar.init_search_form();
        };
    idw.sidecalendar.update_calendar();
};

idw.sidecalendar.get_index = function(options, value)
{
    var i = 0;

    for (var o = 0; o<options.length; o++)
        {
        if (options[o].value && options[o].value==value)
            {
            i = o;
            }
        }
    return i;
};

idw.sidecalendar.reset_calendar = function()
{
    idw.sidecalendar.reset_calendar_settings();
    idw.sidecalendar.update_calendar();
};

idw.sidecalendar.update_calendar_table_days = function()
{
    var servlet_name = location.pathname.split("/").reverse()[0];

    if (document.getElementById('calendar_month'))
    if (servlet_name=='calendar')
        {
        if (idw.sidecalendar.lang=='de_DE')
            {
            document.getElementById('calendar_month').innerHTML =
                "ab dem "+idw.sidecalendar.cal_settings.cal_day+"."+(idw.sidecalendar.cal_settings.cal_month+1)+"."
                +idw.sidecalendar.cal_settings.cal_year;
            }
        else
            {
            document.getElementById('calendar_month').innerHTML =
                "as of "+idw.translations.sidecalendar[idw.sidecalendar.lang].monthnames[idw.sidecalendar.cal_settings.cal_month]+" "
                +idw.sidecalendar.cal_settings.cal_year;
            }
        }
    else
        {
        if (idw.sidecalendar.lang=='de_DE')
            {
            document.getElementById('calendar_month').innerHTML =
                "im "+idw.translations.sidecalendar[idw.sidecalendar.lang].monthnames[idw.sidecalendar.cal_settings.cal_month]+" "
                +idw.sidecalendar.cal_settings.cal_year;
            }
        else
            {
            document.getElementById('calendar_month').innerHTML =
                "in "+idw.translations.sidecalendar[idw.sidecalendar.lang].monthnames[idw.sidecalendar.cal_settings.cal_month]+" "
                +idw.sidecalendar.cal_settings.cal_year;
            }
        }

    if (document.getElementById('calendar_table'))
    document.getElementById('calendar_table').innerHTML = idw.sidecalendar.calendar_html();
};

idw.sidecalendar.update_selectlists = function()
{
    //document.side_calendar_search.usepersonalportal.checked = idw.sidecalendar.cal_settings.use_personal_portal;
    $('form[name=side_calendar_search] input[name=usepersonalportal]').attr('checked', idw.sidecalendar.cal_settings.use_personal_portal)
    document.side_calendar_search.month.selectedIndex = idw.sidecalendar.cal_settings.cal_month;
    document.side_calendar_search.year.selectedIndex = idw.sidecalendar.cal_settings.cal_year-1998;
    document.side_calendar_search.country_id.selectedIndex = idw.sidecalendar.get_index(
        document.side_calendar_search.country_id.options,
            (idw.sidecalendar.cal_settings.country_id==null) ? 'any' : idw.sidecalendar.cal_settings.country_id);
    document.side_calendar_search.province_id.selectedIndex = idw.sidecalendar.get_index(
        document.side_calendar_search.province_id.options,
            (idw.sidecalendar.cal_settings.province_id==null) ? 'any' : idw.sidecalendar.cal_settings.province_id);
    document.side_calendar_search.field_id.selectedIndex = idw.sidecalendar.get_index(
        document.side_calendar_search.field_id.options,
            (idw.sidecalendar.cal_settings.field_id==null) ? 'any' : idw.sidecalendar.cal_settings.field_id);
    document.side_calendar_search.audience_id.selectedIndex = idw.sidecalendar.get_index(
        document.side_calendar_search.audience_id.options,
            (idw.sidecalendar.cal_settings.audience_id==null) ? 'any' : idw.sidecalendar.cal_settings.audience_id);
    document.side_calendar_search.relevance_id.selectedIndex = idw.sidecalendar.get_index(
        document.side_calendar_search.relevance_id.options,
            (idw.sidecalendar.cal_settings.relevance_id==null) ? '3' : idw.sidecalendar.cal_settings.relevance_id);
    document.display_range.range.selectedIndex = idw.sidecalendar.get_index(document.display_range.range.options,
        idw.sidecalendar.cal_settings.display_range);
};

idw.sidecalendar.update_calendar_table = function()
{
    idw.sidecalendar.update_calendar_table_days();
    var servlet_name = location.pathname.split("/").reverse()[0]

    if (servlet_name=='calendar')
        {
        idw.sidecalendar.update_selectlists();
        };
};

idw.sidecalendar.change_month = function(increment)
{
    idw.sidecalendar.increment_calendar(increment);

    while (new Date(idw.sidecalendar.cal_settings.cal_year, idw.sidecalendar.cal_settings.cal_month,
        idw.sidecalendar.cal_settings.cal_day).getMonth()!=idw.sidecalendar.cal_settings.cal_month)
        {
        idw.sidecalendar.cal_settings.cal_day -= 1;
        }
    ;
    idw.sidecalendar.update_calendar();
};

idw.sidecalendar.build_request_parameters = function()
{
    var abucket = new Array()
    // add day
    abucket.push("start_datetime="+idw.sidecalendar.date_to_datetime_start(idw.sidecalendar.cal_settings.cal_year,
        (idw.sidecalendar.cal_settings.cal_month+1), idw.sidecalendar.cal_settings.cal_day));
    abucket.push("end_datetime="+idw.sidecalendar.date_to_datetime_end(idw.sidecalendar.cal_settings.cal_year,
        (idw.sidecalendar.cal_settings.cal_month+1), idw.sidecalendar.cal_settings.cal_day));

    // add search form parameters
    if (idw.sidecalendar.cal_settings.use_personal_portal) abucket.push("usepersonalportal=True");

    if (idw.sidecalendar.cal_settings.country_id) abucket.push("country_id="+idw.sidecalendar.cal_settings.country_id);

    if (idw.sidecalendar.cal_settings.province_id) abucket.push("province_id="
        +idw.sidecalendar.cal_settings.province_id);

    if (idw.sidecalendar.cal_settings.audience_id) abucket.push("audience_id="
        +idw.sidecalendar.cal_settings.audience_id);

    if (idw.sidecalendar.cal_settings.field_id) abucket.push("field_id="+idw.sidecalendar.cal_settings.field_id);

    if (idw.sidecalendar.cal_settings.relevance_id)
    abucket.push("relevance_id="+idw.sidecalendar.cal_settings.relevance_id);
    // return concatenated string
    return abucket.join("&");
};

idw.sidecalendar.update_use_personal_portal = function()
{
    idw.sidecalendar.cal_settings.use_personal_portal = document.side_calendar_search.usepersonalportal.checked;
    idw.sidecalendar.update_calendar();
};

idw.sidecalendar.update_calendar_country = function()
{
    idw.sidecalendar.cal_settings.country_id = (document.side_calendar_search.country_id.value!='any')
        ? Number(document.side_calendar_search.country_id.value) : null;
    idw.sidecalendar.update_calendar();
};

idw.sidecalendar.update_calendar_province = function()
{
    idw.sidecalendar.cal_settings.province_id = (document.side_calendar_search.province_id.value!='any')
        ? Number(document.side_calendar_search.province_id.value) : null;
    idw.sidecalendar.update_calendar();
};

idw.sidecalendar.update_calendar_audience = function()
{
    idw.sidecalendar.cal_settings.audience_id = (document.side_calendar_search.audience_id.value!='any')
        ? Number(document.side_calendar_search.audience_id.value) : null;
    idw.sidecalendar.update_calendar();
};

idw.sidecalendar.update_calendar_field = function()
{
    idw.sidecalendar.cal_settings.field_id = (document.side_calendar_search.field_id.value!='any')
        ? Number(document.side_calendar_search.field_id.value) : null;
    idw.sidecalendar.update_calendar();
};

idw.sidecalendar.update_calendar_relevance = function()
{
    idw.sidecalendar.cal_settings.relevance_id = (document.side_calendar_search.relevance_id.value!='any')
        ? Number(document.side_calendar_search.relevance_id.value) : 3;
    idw.sidecalendar.update_calendar();
};

idw.sidecalendar.set_calendar_day = function(newday)
{
    idw.sidecalendar.load_calendar_settings();
    idw.sidecalendar.cal_settings.cal_day = Number(newday);
    idw.sidecalendar.save_calendar_settings();
    var servlet_name = location.pathname.split("/").reverse()[0];
    if (servlet_name!='calendar')
        {
        location = "calendar";
        }
    idw.sidecalendar.update_calendar();
};

idw.sidecalendar.update_calendar_year = function()
{
    idw.sidecalendar.cal_settings.cal_year = Number(document.side_calendar_search.year.value)

    while (new Date(idw.sidecalendar.cal_settings.cal_year, idw.sidecalendar.cal_settings.cal_month,
        idw.sidecalendar.cal_settings.cal_day).getMonth()!=idw.sidecalendar.cal_settings.cal_month)
        {
        idw.sidecalendar.cal_settings.cal_day -= 1;
        }
    idw.sidecalendar.update_calendar();
};

idw.sidecalendar.update_calendar_month = function()
{
    idw.sidecalendar.cal_settings.cal_month = document.side_calendar_search.month.selectedIndex;

    while (new Date(idw.sidecalendar.cal_settings.cal_year, idw.sidecalendar.cal_settings.cal_month,
        idw.sidecalendar.cal_settings.cal_day).getMonth()!=idw.sidecalendar.cal_settings.cal_month)
        {
        idw.sidecalendar.cal_settings.cal_day -= 1;
        }
    idw.sidecalendar.update_calendar();
};

idw.sidecalendar.update_display_range = function()
{
    idw.sidecalendar.cal_settings.display_range = Number(document.display_range.range.value);
    idw.sidecalendar.update_calendar()
};

idw.sidecalendar.save_calendar_settings = function()
    {
    document.cookie = "cal_settings="+JSON.stringify(idw.sidecalendar.cal_settings);
    };

idw.sidecalendar.parse_cookies = function()
{
    var cookies = {};
    var cookie;
    var c_s = document.cookie.split("; ");

    for (c in c_s)
        {
        cookie = c_s[c].split('=');
        cookies[cookie[0]] = cookie[1];
        };
    return cookies;
};

idw.sidecalendar.load_calendar_settings = function()
{
    if (idw.sidecalendar.parse_cookies().cal_settings)
        {
        idw.sidecalendar.cal_settings = JSON.parse(idw.sidecalendar.parse_cookies().cal_settings);
        };
};

idw.sidecalendar.update_calendar = function()
{
    idw.sidecalendar.update_calendar_table();
    var servlet_name = location.pathname.split("/").reverse()[0];
    if ((servlet_name=='calendar')&&(location.search.length==0))
        {
        idw.sidecalendar.reload_calendar();
        };
    idw.sidecalendar.save_calendar_settings();
    idw.sidecalendar.load_calendar_settings();
};

idw.sidecalendar.reload_calendar_success = function(txt)
{
    if (!txt||txt.length==0)
        {
        txt = idw.translations.sidecalendar[idw.sidecalendar.lang].noresult;
        };
    $('#content').html(txt);
};

idw.sidecalendar.reload_calendar = function()
    {
    $.ajax({
        'url': "calendarcontent?"+idw.sidecalendar.build_request_parameters(),
        'success': idw.sidecalendar.reload_calendar_success,
        'type': 'POST',
        'dataType': 'html'
        });
    };

idw.sidecalendar.initfunction = function()
{
    idw.sidecalendar.reset_calendar_settings();
    idw.sidecalendar.init_calendar(idw_lang);
};

$().ready(idw.sidecalendar.initfunction);
