if (typeof(trinary) != "object") { var trinary = window.trinary = {}; };
trinary.calendar = {};

trinary.calendar.Calendarium = function(options) {
    if (typeof options == 'undefined') { options = {}; };
    if (options.system == 'nonary') {
        this.formatter = Trinary.Calendar.formaterNonary;
        this.system = 'nonary';
    } else {
        this.formatter = Trinary.Calendar.formater;
        this.system = 'trinary';
    };
    this.style = options.style;
};
trinary.calendar.Calendarium.signNames = { '+' : 'plus', '-' : 'minus', '0' : 'zero' };
trinary.calendar.Calendarium.signToName = function(sign) {
    return trinary.calendar.Calendarium.signNames[sign];
};
trinary.calendar.Calendarium.highlightDays = function(days) {
    this.days = {}
    for (var i in days) {
        this.days[days[i]] = true;
    };    
};
trinary.calendar.Calendarium.highlightDays.prototype.isInclude = function(day) {    
    return this.days[day];
};
trinary.calendar.Calendarium.prototype = {};
trinary.calendar.Calendarium.prototype.renderMonth = function (year, month, highlightDays) {
    var i = trinary.locale.date.monthFullNames;
    var h = trinary.locale.date.dayShortNames;
    var hlDays = new trinary.calendar.Calendarium.highlightDays((highlightDays) ? highlightDays : []);    
    h = h.slice(1, 7).concat(h[0]);
    var out = '';
    var f = 6;
    var g = 0;
    var j = new Date(month + '/01/' + year);
    var k = j.getDay();
    out += '<div class="month ' + (month % 2 == 0 ? 'even' : 'odd') + '">';
    var l = this.formatter(month);
    out += '<div class="month-name">' + i[month-1] + '</div>';
    out += '<div class="day-names">';
    for (var d = 0; d < 7; d++) {
        var n = this.formatter(d + 1);
        var o = (d >= 5) ? ' holyday' : '';
        out += '<div class="day' + o + '">' + h[d] + '</div>'
    }
    out += '</div>';
    out += '<div class="week">';
    if (k == g) {
        k += 7
    }
    for (var d = g; d < (k - 1); d++) {
        out += '<div class="day of-prev-month"></div>'
    };
    for (var d = 1; d <= 31; d++) {
        j = new Date(month + '/' + d + '/' + year);
        if ((j.getMonth() + 1) > month) {
            break
        };
        k = j.getDay();
        var cssClass = 'day';
        cssClass += (k == 0 || k == 6) ? ' holyday' : '';
        cssClass += (hlDays.isInclude(j.getDate())) ? ' highlight' : '';
        out += '<div class="' + cssClass + '">';
        out += this.formatter(j.getDate(), 4);
        out += '</div>';
        if (k == g) {
            out += '</div><div class="week">';
        }
    };
    var p = new Date((month + 1) + '/01/' + year).getDay();
    if (k > 0) {
        for (var d = (k + 1); d <= 7; d++) {
            out += '<div class="day of-next-month"></div>';
        };
    };
    out += '</div>';
    out += '</div>';
    return out;
};
trinary.calendar.Calendarium.prototype.renderYear = function (year) {
    var a, b, c;
    if (typeof options == 'undefined') { options = {}; };
    if (typeof options.year != 'number') {
        a = new Date().getFullYear();
    } else {
        a = options.year;
    };
    var c;
    if (options.system == 'nonary') {
        c = Trinary.Calendar.formaterNonary;
        b = 'nonary'
    } else {
        c = Trinary.Calendar.formater;
        b = 'trinary'
    }
    var out = '';    
    out += '<div class="calendar ' + b + (typeof options.style == 'undefined' ? '' : ' ' + options.style) +'">';
    out += '<div class="year"><h2>' + c(a) + '</h2></div>';
    for (var m = 1; m <= 12; m++) {
        out += Trinary.Calendar.renderMonth(a, m, c);
        //if (m % 3 == 0) {
        //    out += '<div class="month-devider"></div>'
        //}
    };
    out += '</div>';
    return out;
};
trinary.calendar.Calendarium.prototype.wrap = function(content) {
    var out = '';    
    out += '<div class="calendar ' + this.system + (typeof this.style == 'undefined' ? '' : ' ' + options.style) +'">';    
    out += content;
    out += '</div>';
    return out;
};

var Trinary = {};
Trinary.Calendar = {

    sign_names : { '+' : 'plus', '-' : 'minus', '0' : 'zero' },

    signToName : function(sign) {
        return Trinary.Calendar.sign_names[sign];
    }
};
Trinary.Calendar.formater = function (a, b, c) {
    //var d = /0/g;
    a = trinary.core.decimalToTrinary(a);
    var name = a;
    if (c == true) {
        a = trinary.core.trinaryToNonary(a, 'lat');
    };
    if (typeof b != 'undefined') {
        a = trinary.core.align(a, b);
    };
    //return a.replace(d, '<em>0</em>');
    var out = [];
    symbols = a.split('');
    for (var i in symbols) {
        var s = symbols[i];
        out.push('<var class="'+Trinary.Calendar.signToName(s)+'">'+s+'</var>');
    };
    return out.join('');
};
Trinary.Calendar.formaterNonary = function (a, b) {
    if (typeof b != 'undefined') {
        b = 2
    }
    return Trinary.Calendar.formater(a, b, true)
};
Trinary.Calendar.renderMonth = function (a, m, c) {
    var i = trinary.locale.date.monthFullNames;
    var h = trinary.locale.date.dayShortNames;
    h = h.slice(1, 7).concat(h[0]);
    var out = '';
    var f = 6;
    var g = 0;
    var j = new Date(m + '/01/' + a);
    var k = j.getDay();
    out += '<div class="month ' + (m % 2 == 0 ? 'even' : 'odd') + '">';
    var l = c(m);
    out += '<div class="month-name">' + i[m-1] + '</div>';
    out += '<div class="day-names">';
    for (var d = 0; d < 7; d++) {
        var n = c(d + 1);
        var o = (d >= 5) ? ' holyday' : '';
        out += '<div class="day' + o + '">' + h[d] + '</div>'
    }
    out += '</div>';
    out += '<div class="week">';
    if (k == g) {
        k += 7
    }
    for (var d = g; d < (k - 1); d++) {
        out += '<div class="day of-prev-month"></div>'
    };
    for (var d = 1; d <= 31; d++) {
        j = new Date(m + '/' + d + '/' + a);
        if ((j.getMonth() + 1) > m) {
            break
        };
        k = j.getDay();
        var o = (k == 0 || k == 6) ? ' holyday' : '';
        out += '<div class="day' + o + '">';
        out += c(j.getDate(), 4);
        out += '</div>';
        if (k == g) {
            out += '</div><div class="week">';
        }
    };
    var p = new Date((m + 1) + '/01/' + a).getDay();
    if (k > 0) {
        for (var d = (k + 1); d <= 7; d++) {
            out += '<div class="day of-next-month"></div>';
        };
    };
    out += '</div>';
    out += '</div>';
    return out;
};
Trinary.Calendar.render = function (options) {
    var a, b, c;
    if (typeof options == 'undefined') { options = {}; };
    if (typeof options.year != 'number') {
        a = new Date().getFullYear();
    } else {
        a = options.year;
    };
    var c;
    if (options.system == 'nonary') {
        c = Trinary.Calendar.formaterNonary;
        b = 'nonary'
    } else {
        c = Trinary.Calendar.formater;
        b = 'trinary'
    }
    var out = '';    
    out += '<div class="calendar ' + b + (typeof options.style == 'undefined' ? '' : ' ' + options.style) +'">';
    out += '<div class="year"><h2>' + c(a) + '</h2></div>';
    for (var m = 1; m <= 12; m++) {
        out += Trinary.Calendar.renderMonth(a, m, c);
        //if (m % 3 == 0) {
        //    out += '<div class="month-devider"></div>'
        //}
    };
    out += '</div>';
    return out;
};