var DAY_OF_WEEK_NAMES = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
var MON_NAMES = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

var SEL_DAY = null;

var cal_counter     = 0;
var cal_loader      = null;

function calendar(holder, year, month, params)
{

    SEL_DAY = null;
    var html = '<table class="calendar">';
    html += '<tr><td colspan="7"><table class="calheader"><tr>';
    var func = params['onChange'];
    var parstr = param_str(year, month, -1, 0);
    var f_onclick = year > 1991 ? func + "(" + parstr + ")" : 'javascript:void(0)';
    html += '<td class="ynav"><a class="cnav" href="javascript:void(0)" onclick="' + f_onclick + '"><img class="cnavimg" alt="Year back" title="Year back" src="' + params['icoYearBack'] + '"/></a></td>';
    parstr = param_str(year, month, 0, -1);
    f_onclick = year > 1991 || (year == 1991 && month > 0) ? func + '(' + parstr + ')' : 'javascript:void(0)';
    html += '<td class="mnav"><a class="cnav" href="javascript:void(0)" onclick="' + f_onclick + '"><img class="cnavimg" alt="Month back" title="Month back" src="' + params['icoMonthBack'] + '"/></a></td>';
    html += '<td class="curmon" nowrap="nowrap">' + format(month, year) + '</td>';
    parstr = param_str(year, month, 0, 1);
    f_onclick = year < 2037 || (year == 2037 && month < 11) ? func + '(' + parstr + ')' : 'javascript:void(0)';
    html += '<td class="mnav"><a class="cnav" href="javascript:void(0)" onclick="' + f_onclick + '"><img class="cnavimg" alt="Month forward" title="Month forward" src="' + params['icoMonthFwd'] + '"/></a></td>';
    parstr = param_str(year, month, 1, 0);
    var f_onclick = year < 2037 ? func + "(" + parstr + ")" : 'javascript:void(0)';
    html += '<td class="ynav"><a class="cnav" href="javascript:void(0)" onclick="' + f_onclick + '"><img class="cnavimg" alt="Year forward" title="Year forward"src="' + params['icoYearFwd'] + '"/></a></td>';
    html += '</tr></table></td></tr><tr>';
    var i;
    for (i = 0; i < DAY_OF_WEEK_NAMES.length; i++)
        html += '<td class="day_of_week">' + DAY_OF_WEEK_NAMES[i] + '</td>';
    html += '</tr><tr>';
    var dt = new Date();
    dt.setUTCDate(1);
    dt.setUTCMonth(month);
    dt.setUTCFullYear(year);
    var dow = dt.getUTCDay();
    for (i = 0; i < dow; i++)
        html += '<td class="day">&nbsp;</td>';
    var max_day = days_in_month(month, year);
    func = params['onSelect'];
    var clickable = params['clickable'];
    for (i = 1; i <= max_day; i++)
    {
        if ((dow + i - 1) % 7 == 0)
            html += '</tr><tr>';
        param = '' + i + ',' + month + ',' + year;
        var script = 'csel(' + i + ');';
        if (func)
            script += func + '(' + param + ');';
        html += '<td class="day" id="cd' + i + '">';
        if (clickable[i - 1])
        {
            var title = clickable[i - 1];
            if (clickable[i - 1] == 1)
                title += ' item';
            else
                title += ' items';
            html += '<a class="dnav" title="' + title + '" href="javascript:void(0)" onclick="' + script + '">' + i + '</a>';
        }
        else
            html += '<span class="ddis">' + i + '</span>';
        html += '</td>';
    }
    while ((dow + i - 1) % 7 != 0)
    {
        html += '<td class="day">&nbsp;</td>';
        i++;
    }
    while (i + dow - 1 < 42)
    {
       if ((dow + i - 1) % 7 == 0)
           html += '</tr><tr>'
        html += '<td class="day">&nbsp;</td>';
        i++;
    }

    html += '</tr></table>';
    get(holder).innerHTML = html;
}

function days_in_month(month, year)
{
    switch (month)
    {
        case 0: 
        case 2:
        case 4:          
        case 6: 
        case 7: 
        case 9: 
        case 11: 
            return 31;
        case 1:
            return is_leap(year) ? 29 : 28;
        default:
            return 30;
    }
}

function is_leap(year)
{
    return year %4 ==0 && (year % 100 != 0 || year % 400 == 0);
}

function format(month, year)
{
    return MON_NAMES[month] + ' ' + year;
}

function param_str(year, month, ydiff, mdiff)
{
    year  = year + ydiff;
    month = month + mdiff;
    if (month < 0)
    {
        year = year - 1;
        month = 11;
    }
    else
    if (month > 11)
    {
        year = year + 1;
        month = 0;
    }
    return '' + month + ',' + year;
}

function csel(i)
{    
    var o;
    if (SEL_DAY)
    {        
        o = get('cd' + SEL_DAY);
        if (o)
            o.className="day";
    }
    o = get('cd' + i);
    if (o)
        o.className="daysel";
    SEL_DAY = i;
}

function is_month_cached(year, month)
{
    var id = 'cm' + year + '-' + pad(month + 1);
    var o = get(id);
    if (o)
        return true;
    var start = get('calstart').value;
    var s_y = parseInt(start.substr(0, 4), 10);
    var s_m = parseInt(start.substr(5, 7), 10);
    var end = get('calend').value;
    var e_y = parseInt(end.substr(0, 4), 10);
    var e_m = parseInt(end.substr(5, 7), 10);
    start = new Date();
    start.setUTCHours(0);
    start.setUTCMinutes(0);
    start.setUTCSeconds(0);
    start.setUTCDate(1);
    start.setUTCMonth(s_m - 1);
    start.setUTCFullYear(s_y);

    end = new Date();
    end.setUTCDate(1);
    if (e_m == 12)
    {
        end.setUTCMonth(1);
        end.setUTCFullYear(e_y + 1);
    }
    else
    {
        end.setUTCMonth(e_m);
        end.setUTCFullYear(e_y);
    }
    end.setUTCHours(0);
    end.setUTCMinutes(0);
    end.setUTCSeconds(0);

    var now = new Date();
    now.setUTCDate(1);
    now.setUTCMonth(month);
    now.setUTCFullYear(year);
    now.setUTCHours(0);
    now.setUTCMinutes(0);
    now.setUTCSeconds(0);

    return start.getTime() <= now.getTime() && end.getTime() > now.getTime();
}

function get_clickable_days(year, month)
{
    month++;
    var ret = new Array();
    for (var i = 0; i < 31; i++)
        ret[i] = 0;
    var o = get('cm' + year + '-' + pad(month));
    if (!o)
        return ret;
    var items = o.getElementsByTagName('div');
    if (!items)
        return ret;
    var i;
    for (i = 0; i < items.length; i++)
    {
        var d = items[i];
        var day = parseInt(d.id.substr(8), 10);
        if (day >= 1 && day <= 31)
            ret[day - 1]+= parseInt(d.innerHTML);
    }
    return ret;
}

function show_calendar()
{
    is_filter_by_date = false;
    var d = new Date();
    var m = d.getUTCMonth();
    var y = d.getUTCFullYear();
    onc(m, y);
}

function pad(val)
{
    if (val < 10)
        return '0' + val;
    return val;
}

function fetch_calendar_callback(rsp)
{
    if (rsp.argument[0] != cal_counter)
        return;
    get('calendar_content_loading').style.display = 'none';
    var o = get('calendar_content');
    o.style.display = '';
    o = get('ccontentdata');
    o.innerHTML = rsp.responseText;
    onc(rsp.argument[2], rsp.argument[1]);
}

function has_date(prefix, year, month, day)
{
    var start = get(prefix + 'startdate');
    if (!start)
        return false;
    var end = get(prefix + 'enddate');
    if (!end)
        return false;
    start = start.value;
    end   = end.value;

    var tokens = start.split('-');
    var shortformat = tokens.length <= 2;
    var s_y = parseInt(tokens[0], 10);
    var s_m = parseInt(tokens[1], 10);
    var s_d = tokens.length > 2 ? parseInt(tokens[2], 10) : 1;
    tokens = end.split('-');
    var e_y = parseInt(tokens[0], 10);
    var e_m = parseInt(tokens[1], 10);
    if (shortformat)
        e_m++;
    var e_d = tokens.length > 2 ? parseInt(tokens[2], 10) : 1;

    start = new Date();
    start.setUTCHours(0);
    start.setUTCMinutes(0);
    start.setUTCSeconds(0);
    start.setUTCDate(s_d);
    start.setUTCMonth(s_m - 1);
    start.setUTCFullYear(s_y);

    end = new Date();
    end.setUTCDate(e_d);
    if (e_m == 12)
    {
        end.setUTCMonth(1);
        end.setUTCFullYear(e_y + 1);
    }
    else
    {
        end.setUTCMonth(e_m - 1);
        end.setUTCFullYear(e_y);
    }
    end.setUTCHours(0);
    end.setUTCMinutes(0);
    end.setUTCSeconds(0);

    var now = new Date();
    now.setUTCDate(day);
    now.setUTCMonth(month);
    now.setUTCFullYear(year);
    now.setUTCHours(0);
    now.setUTCMinutes(0);
    now.setUTCSeconds(0);

    return start.getTime() <= now.getTime() && (shortformat ? end.getTime() > now.getTime() : end.getTime() >= now.getTime());
}

function filter_by_date(objs, id)
{
    var ret = new Array();
    if (!id)
        id = 3;
    var dt = '' + cur_year + '-' + datepad(cur_month + 1) + '-' + datepad(cur_day);
    for (var i = 0; i < objs.length; i++)
    {
        var d = objs[i][id];
        if (d == dt)
            ret[ret.length] = objs[i];
    }
    return ret;
}

function show_date(suffix, year, month, day)
{                  
    var o = get('ttp' + suffix);
    if (!o)
        return;
    get('ttp' + suffix).style.display = '';
    get('tts' + suffix).style.display = '';
    get('ttn' + suffix).style.display = 'none';
    get('ttr' + suffix).style.display = 'none';
    get('ttcd' + suffix).style.display = '';
    get('ttsd' + suffix).style.display = '';

    var now =  year + '-' + (month + 1) + '-' + day;
    get('ttsd' + suffix).innerHTML = '<b>' + now + '</b>';
}

function get_clickable_days_ex(year, month, id)
{
    var ret = new Array();
    for (var i = 0; i < 31; i++)
        ret[i] = 0;

    if (!id)
        id = 3;

    var dt = '' + year + '-' + datepad(month + 1) + '-';

    if ((typeof IMAGES != 'undefined') && IMAGES)
    {
        for (var i = 0; i < IMAGES.length; i++)
        {
            var d = IMAGES[i][id];
            if (d.indexOf(dt) == 0)
            {
                var idx = parseInt(d.substring(dt.length));
                ret[idx - 1]++;
            }
        }
    }
    if ((typeof SHOWS != 'undefined') && SHOWS)
    {
        for (var i = 0; i < SHOWS.length; i++)
        {
            var d = SHOWS[i][id];
            if (d.indexOf(dt) == 0)
            {
                var idx = parseInt(d.substring(dt.length));
                ret[idx - 1]++;
            }
        }
    }
    if ((typeof VIDEOS != 'undefined') && VIDEOS)
    {
        for (var i = 0; i < VIDEOS.length; i++)
        {
            var d = VIDEOS[i][id];
            if (d.indexOf(dt) == 0)
            {
                var idx = parseInt(d.substring(dt.length));
                ret[idx - 1]++;
            }
        }
    }
    return ret;
}

function render_calendar(y, m, days)
{
    calendar('calendar_content', y, m, 
    {
        onChange: 'onc', 
        onSelect: 'ons', 
        icoYearBack: CAL_ICO_FIRST, 
        icoYearFwd: CAL_ICO_LAST,
        icoMonthBack: CAL_ICO_PREV, 
        icoMonthFwd: CAL_ICO_NEXT,
        clickable: days
    });
}

function make_date(s)
{
    return s.substring(0, 10);
}

function datepad(d)
{
    if (d < 10)
        return '0' + d;
    return d;
}

