/**************************
         Calendar
**************************/
var CALENDAR_INPUT_CLASS_NAME = 'calendar-input';
var CALENDAR_CONTAINER_CLASS_NAME = 'calendar-container';
var CALENDAR_CELL_HOLIDAY_CLASS_NAME = 'calendar-holiday';
var CALENDAR_CELL_REGDAY_CLASS_NAME = 'calendar-regday';
var CALENDAR_CELL_CURDAY_CLASS_NAME = 'calendar-grid-current';
var CALENDAR_CELL_CLASS_NAME = 'calendar-grid';
var CALENDAR_GRID_CLASS_NAME = 'calendar-grid';
var CALENDAR_DATE_CONTAINER_CLASS_NAME = 'calendar-date-container';
var CALENDAR_GRID_CONTAINER_CLASS_NAME = 'calendar-grid-container';
var CALENDAR_SHEET_CLASS_NAME = 'calendar-sheet';

var CALENDAR_YEAR_FROM = '1996';
var CALENDAR_YEAR_TO = '2016';
var CALENDAR_MONTHS = new Array(
    'январь',
    'февраль',
    'март',
    'апрель',
    'май',
    'июнь',
    'июль',
    'август',
    'сентябрь',
    'октябрь',
    'ноябрь',
    'декабрь'
);
var CALENDAR_MONTHS_OF = new Array(
    'января',
    'февраля',
    'марта',
    'апреля',
    'мая',
    'июня',
    'июля',
    'августа',
    'сентября',
    'октября',
    'ноября',
    'декабря'
);
var CALENDAR_DAYS = [
    {'long_name': 'пн', 'short_name': 'пн', 'holiday': false},
    {'long_name': 'вт', 'short_name': 'вт', 'holiday': false},
    {'long_name': 'ср', 'short_name': 'ср', 'holiday': false},
    {'long_name': 'чт', 'short_name': 'чт', 'holiday': false},
    {'long_name': 'пт', 'short_name': 'пт', 'holiday': false},
    {'long_name': 'сб', 'short_name': 'сб', 'holiday': true},
    {'long_name': 'вс', 'short_name': 'вс', 'holiday': true}
];

var days_in_months = {1: 30, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31};

var hide_calendar = true;

function openCalendar(title, value)
{
    var container = document.createElement('DIV');

    document.body.appendChild(container);
    container.className = CALENDAR_CONTAINER_CLASS_NAME;

    container.onmouseover = function() {
        hide_calendar = false;
    }

    container.onmouseout = function() {
        hide_calendar = true;
    }

    var date_container = document.createElement('DIV');
    container.appendChild(date_container);
    date_container.className = CALENDAR_DATE_CONTAINER_CLASS_NAME;

    var grid_container = document.createElement('DIV');
    container.appendChild(grid_container);
    grid_container.className = CALENDAR_GRID_CONTAINER_CLASS_NAME;

    //date picker
    var select_month = document.createElement('SELECT');
    date_container.appendChild(select_month);

//    var input_year = document.createElement('INPUT');
//    date_container.appendChild(input_year);

    //create calendar
    var select_year = document.createElement('SELECT');
    for (var i = CALENDAR_YEAR_FROM; i <= CALENDAR_YEAR_TO; i ++) {
        var option = document.createElement('OPTION');
        option.value = i;
        option.innerHTML = i;
        select_year.appendChild(option);
    }
    date_container.appendChild(select_year);

    select_month.onchange = function() {
        var date_regexp = new RegExp('([0-9]{1,2})[\.\/-]([0-9]{1,2})[\.\/-]([0-9]{4})');
        if (date = date_regexp.exec(value.value)) {
            var day   = date[1] * 1;
            var month = date[2] * 1;
            var year  = date[3] * 1;
            year = (year.toString().length == 2) ? (year < 50 ? '20' : '19').toString() + year : year;
        } else {
            var today = new Date;
            var day   = today.getDate();
            var month = today.getMonth() + 1;
            var year  = today.getFullYear();
        }
        setGrid(container, day, this.value, select_year.value, title, value);
    }

    select_year.onchange = function() {
        var date_regexp = new RegExp('([0-9]{1,2})[\.\/-]([0-9]{1,2})[\.\/-]([0-9]{4})');
        if (date = date_regexp.exec(value.value)) {
            var day   = date[1] * 1;
            var month = date[2] * 1;
            var year  = date[3] * 1;
            year = (year.toString().length == 2) ? (year < 50 ? '20' : '19').toString() + year : year;
        } else {
            var today = new Date;
            var day   = today.getDate();
            var month = today.getMonth() + 1;
            var year  = today.getFullYear();
        }
        setGrid(container, day, select_month.value, this.value, title, value);
    }

    for (var i = 0; i < CALENDAR_MONTHS.length; i ++) {
        var option = document.createElement('OPTION');
        option.value = parseInt(i) + 1;
        option.innerHTML = CALENDAR_MONTHS[i];
        select_month.appendChild(option);
    }


//    input_year.type = 'text';
//    input_year.size = 4;
//    input_year.maxLenth = 4;

    var grid = document.createElement('TABLE');
    grid_container.appendChild(grid);

    grid.className = CALENDAR_GRID_CLASS_NAME;

    //calendar head
    var grid_head = grid.createTHead();

    var grid_head_row = document.createElement('TR');
    grid_head.appendChild(grid_head_row);

    for (var i = 0; i < CALENDAR_DAYS.length; i ++) {
        var grid_cell = document.createElement('TH');
        grid_head_row.appendChild(grid_cell);
        grid_cell.innerHTML = CALENDAR_DAYS[i].short_name;
        grid_cell.className = (CALENDAR_DAYS[i].holiday) ? CALENDAR_CELL_HOLIDAY_CLASS_NAME : CALENDAR_CELL_REGDAY_CLASS_NAME;
    }

    var grid_body = document.createElement('TBODY');
    grid.appendChild(grid_body);

    var date_regexp = new RegExp('([0-9]{1,2})[\.\/-]([0-9]{1,2})[\.\/-]([0-9]{4})');
    if (date = date_regexp.exec(value.value)) {
        var day   = date[1] * 1;
        var month = date[2] * 1;
        var year  = date[3] * 1;
        year = (year.toString().length == 2) ? (year < 50 ? '20' : '19').toString() + year : year;
    } else {
        var today = new Date;
        var day   = today.getDate();
        var month = today.getMonth() + 1;
        var year  = today.getFullYear();
    }

    setGrid(container, day, month, year, title, value);

    title.onblur = function() {
        if (hide_calendar) {
            remove(container);
        }
    }

    container.style.left = Positions.get_element(title).x + 'px';
    if (Positions.get_element(title).y + container.offsetHeight < Positions.get_client().height) {
        container.style.top = Positions.get_element(title).y + title.offsetHeight + 'px';
    } else {
        container.style.top = Positions.get_element(title).y - container.offsetHeight + 'px';
    }
    container.style.width = title.offsetWidth + 'px';
}

function setGrid(calendar, day, month, year, title, value)
{
    var grid = calendar.getElementsByTagName('TABLE')[0];

    var day_of_week = weekday(1, month, year);
    var days_in_month = (month == 2) ? (leap_year(year) ? 29 : 28) : days_in_months[month];

    if (!day_of_week) {
        //for sunday
        day_of_week = 8;
    } else {
        day_of_week ++;
    }

    var select_month = calendar.getElementsByTagName('SELECT')[0];
    select_month.value = month;

    var select_year = calendar.getElementsByTagName('SELECT')[1];
    select_year.value = year;

    //calendar body
    var grid_body = grid.tBodies[0].cloneNode(false);
    grid.replaceChild(grid_body, grid.tBodies[0]);

    var grid_body_row = grid_body.insertRow(0)

    for (var i = 1; i < day_of_week - 1; i ++) {
        var grid_body_cell = grid_body_row.insertCell(grid_body_row.cells.length);
        grid_body_cell.innerHTML = '&nbsp;';
        grid_body_cell.className = CALENDAR_CELL_CLASS_NAME;
    }

    var today = new Date;
    var t_day   = today.getDate();
    var t_month = today.getMonth() + 1;
    var t_year  = today.getFullYear();

    for (var i = 1; i <= days_in_month; i ++) {
        if ((i + day_of_week - 2) % 7 == 1) {
            delete(grid_body_row);
            var grid_body_row = grid_body.insertRow(grid.rows.length - 1);
        }

        var grid_body_cell = grid_body_row.insertCell(grid_body_row.cells.length);
        grid_body_cell.innerHTML = i;
        grid_body_cell.className = CALENDAR_CELL_CLASS_NAME;
        grid_body_cell.onmouseover = function () {CssClasses(this).add('hover')};
        grid_body_cell.onmouseout = function () {CssClasses(this).remove('hover')};
        if (t_year == year && t_month == month && t_day == i) {
            CssClasses(grid_body_cell).add('today');
//            grid_body_cell.style.borderColor = 'red';
//            grid_body_cell.style.borderWidth = '2px';
//            grid_body_cell.style.borderStyle = 'solid';
        }

        if (day == i) {
            CssClasses(grid_body_cell).add('current');
//            grid_body_cell.style.borderColor = '#2b79a5';
//            grid_body_cell.style.borderWidth = '2px';
//            grid_body_cell.style.borderStyle = 'solid';
        }

        grid_body_cell.onclick = function (event) {
            title.value = format_date_title(this.innerHTML, select_month.value, select_year.value);
            value.value = format_date_value(this.innerHTML, select_month.value, select_year.value);
            remove(calendar);
        };
    }

    i = (days_in_month + day_of_week - 1) % 7;
    if (!i) {
        i = 7;
    }

    if (i > 1) {
        for (; i < 7; i ++) {
            var grid_body_cell = grid_body_row.insertCell(grid_body_row.cells.length);
            grid_body_cell.innerHTML = '&nbsp;';
            grid_body_cell.className = CALENDAR_CELL_CLASS_NAME;
        }
    }
}

function weekday(d, m, y)
{
    var date = new Date(y, m - 1, d);
    return date.getDay();
}

function leap_year(year)
{
    return year % 4 ? false : (year % 100 ? true : (year % 400 ? false : true));
}

function format_date_value(day, month, year)
{
    if (day.toString().length == 1) {
        day = '0' + day;
    }

    if (month.toString().length == 1) {
        month = '0' + month;
    }

    if (year.toString().length == 2) {
        year = ((parseInt(year) < 50 ) ? '20' : '19') + year;
    }

    return day + '.' + month + '.' + year;
    //return year + '-' + month + '-' + day;
}

function format_date_title(day, month, year)
{
    if (year.toString().length == 2) {
        year = ((parseInt(year) < 50 ) ? '20' : '19') + year;
    }

    //return day + '/' + month + '/' + year;
    return day + ' ' + CALENDAR_MONTHS_OF[month - 1]  + ' ' + year;
}
