var env = (function(){
    var b = navigator.userAgent.toLowerCase(), c = window.opera, d = {
        ie:/*@cc_on!@*/ false,
        opera: !!c && c.version,
        webkit: b.indexOf(' applewebkit/') > -1,
        air: b.indexOf(' adobeair/') > -1,
        mac: b.indexOf('macintosh') > -1,
        quirks: document.compatMode == 'BackCompat',
        isCustomDomain: function(){
            return this.ie && document.domain != window.location.hostname;
        }
    };
    d.gecko = navigator.product == 'Gecko' && !d.webkit && !d.opera;
    var e = 0;
    if (d.ie) {
        e = parseFloat(b.match(/msie (\d+)/)[1]);
        d.ie8 = !!document.documentMode;
        d.ie8Compat = document.documentMode == 8;
        d.ie7Compat = e == 7 && !document.documentMode || document.documentMode == 7;
        d.ie6Compat = e < 7 || d.quirks;
    }
    if (d.gecko) {
        var f = b.match(/rv:([\d\.]+)/);
        if (f) {
            f = f[1].split('.');
            e = f[0] * 10000 + (f[1] || 0) * (100) + +(f[2] || 0);
        }
    }
    if (d.opera) 
        e = parseFloat(c.version());
    if (d.air) 
        e = parseFloat(b.match(/ adobeair\/(\d+)/)[1]);
    if (d.webkit) 
        e = parseFloat(b.match(/ applewebkit\/(\d+)/)[1]);
    d.version = e;
    d.isCompatible = d.ie && e >= 7 || d.gecko && e >= 10900 || d.opera && e >= 9.5 || d.air && e >= 1 || d.webkit && e >= 531 || false;
    return d;
})();

var $j = jQuery.noConflict();

var cur_date;
var cur_minutes = [];
var cur_minutes_arr = [];
var idle_minute;
var searched_minute = 0;
var searched_minute_id = 0;
var searched_minute_hour = 0;
var searched_minute_minute = 0;
function initialize_calendar() {
    var work_date = new Date(cur_date.getTime());
    jQuery('#cal_month').text(months[work_date.getMonth()]);
    
    var year = work_date.getFullYear();
    jQuery('#cal_year').text(year);

    var current_line = 1;
    jQuery('#cal_days_line_1').html('');
    jQuery('#cal_days_line_2').html('');
    jQuery('#cal_calendarium').hide();

    work_date.setDate(1);
    var start_day = work_date.getDay();
    var margin_lines = [];
    var max_sundays_line_1 = 2;
    if (start_day && start_day < 3) {
        margin_lines[1] = (start_day - 1) * 35;
    } else {
        var max_sundays_line_1 = 3;
        if (start_day) {
            margin_lines[2] = (8 - start_day) * 35;
        } else {
            margin_lines[2] = 1 * 35;
        }
    }

    var day_count = days[work_date.getMonth()];
    if (day_count < 30 && is_leap_year(year)) {
        day_count += 1;
    }
    var sundays = 0;
    for (var i = 1; i <= day_count; i++) {
        work_date.setDate(i);
        var display_day = i;
        if (i < 10) {
            display_day = "0" + i.toString();
        }

        if (work_date.getDay() == 1 && sundays == max_sundays_line_1) {
            current_line++;
        }

        jQuery('#cal_days_line_' + current_line).append('<span class="cal_day_link" id="cal_' + display_day + '" onclick="return false;" day="' + i + '">' + display_day + '</span>');
        if (!is_preview) {
            jQuery('#cal_' + display_day).click(function() { change_day(this, jQuery(this).attr('day')) });
        }

        if (work_date.getDay() == 1 && sundays == max_sundays_line_1) {
            if (margin_lines[2]) {
                jQuery('#cal_' + display_day).css('margin-left', margin_lines[2] + 'px');
            }
        } else if (!work_date.getDay()) {
            sundays++;
            jQuery('#cal_' + display_day).addClass('sunday');
        }

        if (cur_date.getDate() == work_date.getDate()) {
            jQuery('#cal_' + display_day).addClass('active');
        }
    }

    if (margin_lines[1]) {
        jQuery('#cal_01').css('margin-left', margin_lines[1] + 'px');
    }

    jQuery('#cal_calendarium').fadeIn();
    load_day();
}

function is_leap_year(year) {
    if (year % 4) {
        return 0;
    } else if (year % 4 == 0 && !(year % 100)) {
        return 1;
    } else if (year % 4 == 0 && year % 100 && year % 400) {
        return 1;
    } else {
        return 0;
    }
}

function next_month() {
    var cur_month = cur_date.getMonth();
    cur_month++;
    set_month(cur_month);
}

function set_month(cur_month) {
    if (cur_month > 11) {
        cur_month -= 12;
        cur_date.setFullYear(cur_date.getFullYear() + 1);
    } else if (cur_month < 0) {
        cur_month += 12;
        cur_date.setFullYear(cur_date.getFullYear() - 1);
    }
    cur_date.setMonth(cur_month);

    var now_date = new Date();
    if (cur_month == now_date.getMonth()) {
        cur_date.setDate(now_date.getDate());
    } else {
        cur_date.setDate(1);
    }

    jQuery('#cal_reset').fadeIn();
    initialize_calendar();
}

function prev_month() {
    var cur_month = cur_date.getMonth();
    cur_month--;
    set_month(cur_month);
}

function change_day(el, day) {
    jQuery('.cal_day_link').removeClass('active');
    jQuery(el).addClass('active');
    cur_date.setDate(day);
    jQuery('#cal_reset').fadeIn();
    load_day();
}

function load_day() {
    cur_minutes = [];
    cur_minutes_arr = [];
    jQuery('#cal_minute_container').fadeOut(50).delay(51).html('').fadeIn(1);
    jQuery('#cal_minute_container').addClass('loading');
    jQuery.get('/api/getminutes',
               { date: cur_date.getDate() + '-' + (cur_date.getMonth() + 1) + '-' + cur_date.getFullYear() },
               function(data) {
                    var preview_minute_set = 0;
                    jQuery(  '<div class="cal_small_minute" id="cal_min_search"><form id="current_minute_form" method="post" action="/" onsubmit="return false">'
                           + '<input type="image" id="submitimage" src="/static/images/suche_btn_small.png" /><div class="cal_current_minute_display">'
                           + '<input type="text" maxlength="2" name="time_day" id="time_day_choose" autocomplete="off" />.<input type="text" maxlength="2" name="time_month" id="time_month_choose" autocomplete="off" />.'
                           + '<input type="text" maxlength="4" name="time_year" id="time_year_choose" autocomplete="off" /><input type="text" maxlength="2" name="time_hour" id="time_hour_choose" autocomplete="off" />:'
                           + '<input type="text" maxlength="2" name="time_minute" id="time_minute_choose" autocomplete="off" /></form><div class="cal_minute_for">' + lex_minute_search + '</div></div>').appendTo('#cal_minute_container');
                    jQuery('#cal_min_search').fadeIn();
                    if (!is_preview) {
                        jQuery('#current_minute_form').submit(search_minute);
                    }

                    jQuery.each(data.minutes, function(index, minute) {
                        if (minute.minute_from) {
                            if (is_preview && !preview_minute_set && minute.timestamp > preview_minute.timestamp) {
                                preview_minute_set++;
                                _add_minute_to_list(preview_minute);
                            }
                            _add_minute_to_list(minute);
                        }
                    });
                    if (is_preview && !preview_minute_set) {
                        _add_minute_to_list(preview_minute);
                    }

                    jQuery(  '<div class="cal_small_minute" id="cal_min_search_all"><div class="cal_minute_for"><a href="/allminutes">'
                           + lex_all_minutes + '</a></div></div>').appendTo('#cal_minute_container');
                    jQuery('#cal_min_search_all').fadeIn();

                    if (!is_preview) {
                        cur_minutes[0] = data.idle_minute;
                    } else {
                        cur_minutes[0] = preview_minute;
                    }
                    jQuery('#cal_minute_container').removeClass('loading');
                    jQuery('#cal_current_minute').hide();
                    window.setTimeout("calculate_current_minute()", 100)
               }, "json"
              );
}

function _add_minute_to_list(minute) {
    jQuery(  '<div class="cal_small_minute" id="cal_min_' + minute.id + '"><div min-id="' + minute.id + '" id="cal_min_clickable_' + minute.id + '" class="cal_min_clickable">'
           + '<img src="' + minute.thumb_img_url + '" style="width: 79px; height: 53px" alt=""/><div class="cal_current_minute_display"><span class="time">' + minute.minute_from.day + '</span>.'
           + '<span class="time">' + minute.minute_from.month + '</span>.<span class="time time_year">' + minute.minute_from.year + '</span> <span class="time">' + minute.minute_from.hour + '</span>'
           + ':<span class="time">' + minute.minute_from.minute + '</span></div><div class="cal_minute_for">' + minute.recipient + '</div></div>').appendTo('#cal_minute_container');
    cur_minutes[minute.id] = minute;
    cur_minutes_arr.push(minute);
    if (!is_preview) {
        jQuery('#cal_min_clickable_' + minute.id).click(function() { show_minute(jQuery(this).attr('min-id')) });
    }
    jQuery('#cal_min_' + minute.id).fadeIn();
}

function calculate_current_minute() {
    if (is_preview) {
        show_minute(0);
        if (jQuery('#cal_min_clickable_0').position()) {
            var scroll_to = jQuery('#cal_min_clickable_0').position().top - 21;
            jQuery('#cal_minute_container').scrollTop(scroll_to);
        }
        return;
    }

    var chosen_minute_diff;
    var chosen_minute;
    if (searched_minute) {
        jQuery.each(cur_minutes_arr, function(index, minute) {
            if (searched_minute_id) {
                if (searched_minute_id == minute.id) {
                    chosen_minute = minute;
                }
            } else {
                if (!chosen_minute && minute.id > 0 && minute.minute_from.hour == searched_minute_hour && minute.minute_from.minute == searched_minute_minute) {
                    chosen_minute = minute;
                }
            }
        });
    } else {
        jQuery.each(cur_minutes_arr, function(index, minute) {
            if (   parseInt(cur_date.getMinutes()) == parseInt(minute.minute_from.minute)
                && parseInt(cur_date.getHours()) == parseInt(minute.minute_from.hour)) {
                chosen_minute = minute;
            }
        });
    }
    if (!chosen_minute_diff && !chosen_minute) {
        show_minute(0);
    } else {
        show_minute(chosen_minute.id);
        if (jQuery('#cal_min_clickable_' + chosen_minute.id).position()) {
            var scroll_to = jQuery('#cal_min_clickable_' + chosen_minute.id).position().top - 21;
            jQuery('#cal_minute_container').scrollTop(scroll_to);
        }
    }
    if (searched_minute) {
        searched_minute = 0;
        searched_minute_id = 0;
        searched_minute_hour = 0;
        searched_minute_minute = 0;
    }
}

function show_minute(minute_id) {
    if (!cur_minutes[minute_id]) { return; }

    jQuery('#cal_current_minute').hide();
    jQuery('#cal_current_minute').css('background-image', 'url(' + cur_minutes[minute_id].img_url + ')');
    if (minute_id == 326) {
        jQuery('#cal_current_minute').find('.video').show();
    } else {
        jQuery('#cal_current_minute').find('.video').hide();
    }
    jQuery('#cal_current_minute_text').html(cur_minutes[minute_id].text);
    jQuery('#cal_current_minute_for').html(cur_minutes[minute_id].recipient);
    jQuery('#cal_current_minute_for').html(cur_minutes[minute_id].recipient);
    if (minute_id != 0) {
        jQuery('#cal_current_minute_display').html(  '<span class="time">' + cur_minutes[minute_id].minute_from.day + '</span>.<span class="time">' + cur_minutes[minute_id].minute_from.month
                                                   + '</span>.<span class="time time_year">' + cur_minutes[minute_id].minute_from.year + '</span> <span class="time">'
                                                   + cur_minutes[minute_id].minute_from.hour + '</span>:<span class="time">' + cur_minutes[minute_id].minute_from.minute + '</span>');
    } else {
        var day = sprintf("%02d", cur_date.getDate());
        var month = sprintf("%02d", (cur_date.getMonth()+1));
        var year = sprintf("%02d", cur_date.getFullYear());
        var hours = sprintf("%02d", cur_date.getHours());
        var minutes = sprintf("%02d", cur_date.getMinutes());
        jQuery('#cal_current_minute_display').html(  '<span class="time">' + day + '</span>.<span class="time">' + month
                                                   + '</span>.<span class="time time_year">' + year + '</span> <span class="time">'
                                                   + hours + '</span>:<span class="time">' + minutes + '</span>');
    }
    if (cur_minutes[minute_id].minute_to) {
        jQuery('#cal_current_minute_display').append('<br/>&nbsp;&nbsp;' + lex_until + '&nbsp;&nbsp;');
        jQuery('#cal_current_minute_display').append(  '<span class="time">' + cur_minutes[minute_id].minute_to.day + '</span>.<span class="time">' + cur_minutes[minute_id].minute_to.month
                                                     + '</span>.<span class="time time_year">' + cur_minutes[minute_id].minute_to.year + '</span> <span class="time">'
                                                     + cur_minutes[minute_id].minute_to.hour + '</span>:<span class="time">' + cur_minutes[minute_id].minute_to.minute + '</span>');
    }
    jQuery('#cal_current_minute').fadeIn();
}

function search_minute() {
    var day = jQuery('#time_day_choose').val();
    var month = jQuery('#time_month_choose').val() - 1;
    var year = jQuery('#time_year_choose').val();
    var hour = jQuery('#time_hour_choose').val();
    var minute = jQuery('#time_minute_choose').val();

    if (day && month >= 0 && year && hour && minute) {
        cur_date.setFullYear(year, month, day);
        cur_date.setHours(hour);
        cur_date.setMinutes(minute);

        searched_minute = 1;
        searched_minute_hour = hour;
        searched_minute_minute = minute;

        jQuery('#cal_reset').fadeIn();
        initialize_calendar();
    }
}

function cal_reset() {
    jQuery('#cal_reset').hide();
    cur_date = new Date();
    initialize_calendar();
}

function visit_buy_link() {
    if (jQuery('#cal_reset').css('display') == 'block') {
        window.top.location = buylink + parseInt(cur_date.getTime() / 1000);
    } else {
        window.top.location = buylink;
    }
}

function set_handlers() {
    jQuery('#cal_reset').click(cal_reset);
    jQuery('#cal_calendarium_rightarrow').click(next_month);
    jQuery('#cal_calendarium_leftarrow').click(prev_month);
};

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

/**
 * sprintf() for JavaScript v.0.4
 *
 * Copyright (c) 2007 Alexandru Marasteanu <http://alexei.417.ro/>
 * Thanks to David Baird (unit test and patch).
 *
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation; either version 2 of the License, or (at your option) any later
 * version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place, Suite 330, Boston, MA 02111-1307 USA
 */
function str_repeat(i, m){
    for (var o = []; m > 0; o[--m] = i) 
        ;
    return (o.join(''));
}

function sprintf(){
    var i = 0, a, f = arguments[i++], o = [], m, p, c, x;
    while (f) {
        if (m = /^[^\x25]+/.exec(f)) o.push(m[0]);
        else if (m = /^\x25{2}/.exec(f)) o.push('%');
        else if (m = /^\x25(?:(\d+)\$)?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(f)) {
            if (((a = arguments[m[1] || i++]) == null) || (a == undefined)) throw ("Too few arguments.");
            if (/[^s]/.test(m[7]) && (typeof(a) != 'number')) throw ("Expecting number but found " + typeof(a));
            switch (m[7]) {
                case 'b':
                    a = a.toString(2);
                    break;
                case 'c':
                    a = String.fromCharCode(a);
                    break;
                case 'd':
                    a = parseInt(a);
                    break;
                case 'e':
                    a = m[6] ? a.toExponential(m[6]) : a.toExponential();
                    break;
                case 'f':
                    a = m[6] ? parseFloat(a).toFixed(m[6]) : parseFloat(a);
                    break;
                case 'o':
                    a = a.toString(8);
                    break;
                case 's':
                    a = ((a = String(a)) && m[6] ? a.substring(0, m[6]) : a);
                    break;
                case 'u':
                    a = Math.abs(a);
                    break;
                case 'x':
                    a = a.toString(16);
                    break;
                case 'X':
                    a = a.toString(16).toUpperCase();
                    break;
            }
            a = (/[def]/.test(m[7]) && m[2] && a > 0 ? '+' + a : a);
            c = m[3] ? m[3] == '0' ? '0' : m[3].charAt(1) : ' ';
            x = m[5] - String(a).length;
            p = m[5] ? str_repeat(c, x) : '';
            o.push(m[4] ? a + p : p + a);
        } else throw ("Huh ?!");
        f = f.substring(m[0].length);
    }
    return o.join('');
}

