/* 
  CGCL.RU Core Style Sheet
  The creator of the file 3D-GRAF @ CGCL.RU
*/
var space = "http://cgcl.ru/images/space.gif";

function makeDateSelector(input_id, date_min, date_max, date_format) {
	var input = document.getElementById(input_id);
	if (!input) return false;
	
	input.readOnly = true;
	addEvent(input, "click", showhide_calendar);
	
	var conf = new Array();
	conf['closed'] = true;
	conf['date_min'] = date_min;
	conf['date_max'] = date_max;
	conf['date_format'] = date_format;
	
	var selected_date = input.value;
	var month = parseDate(selected_date).month * 1;
	var year = parseDate(selected_date).year * 1;
	
	create_table(input, month, year, conf);
}

function showhide_calendar(event) {
	var evt = window.event || event;
  	var target = evt.srcElement || evt.target;
  	
  	if (target.getAttribute("close_link") != null) target.id = target.getAttribute("close_link");
  	var calendar = cal_table[target.id];
  	if (!calendar) return false;
  	
  	if (calendar.style.display == "none") {
  		calendar.style.display = "block";
  	} else if (calendar.style.display == "block" | calendar.style.display == "") {
  		calendar.style.display = "none";
  	}
}

function select_date(event) {
	var evt = window.event || event;
  	var target = evt.srcElement || evt.target;
  	if (target.getAttribute("selectable") != "true") return false;
  	
  	var table = findParentNode("inputid", target);
  	var input = document.getElementById(table.getAttribute("inputid"));
  	var selected_date = input.value;
  	
  	var mksecs = mktime(0, 0, 0, parseInt(table.getAttribute("month")), target.innerHTML, parseInt(table.getAttribute("year")));
  	input.value = date("d.m.Y", mksecs);
  	
  	if (table.getAttribute("selected_day") != "false") {
  		cal_col[table.getAttribute("selected_day")].className = "calendar-day";
  		if (cal_col[table.getAttribute("selected_day")].getAttribute("today") == "true") cal_col[table.getAttribute("selected_day")].className = "calendar-day-today";
  	}
  	target.className = "calendar-day-selected";
  	table.setAttribute("selected_day", target.getAttribute("colnum"));
}

function mouseover_date(event) {
	var evt = window.event || event;
  	var target = evt.srcElement || evt.target;
  	if (target.getAttribute("selectable") != "true") return false;
  	
  	if (target.className != "calendar-day-selected") target.className = "calendar-day-hover";
}

function mouseout_date(event) {
	var evt = window.event || event;
  	var target = evt.srcElement || evt.target;
  	if (target.getAttribute("selectable") != "true") return false;
  	
  	if (target.className != "calendar-day-selected") {
  		target.className = "calendar-day";
  		if (target.getAttribute("today") == "true") target.className = "calendar-day-today";
  	}
}

function mouseover_nav(event) {
	var evt = window.event || event;
  	var target = evt.srcElement || evt.target;
  	target.className = "calendar-nav-"+target.getAttribute("nav")+"-hover";
}

function mouseout_nav(event) {
	var evt = window.event || event;
  	var target = evt.srcElement || evt.target;
  	
  	target.className = "calendar-nav-"+target.getAttribute("nav");
}

function previous_month(event) {
	var evt = window.event || event;
  	var target = evt.srcElement || evt.target;
  	
  	var table = findParentNode("inputid", target);
  	var input = document.getElementById(table.getAttribute("inputid"));
	
	var conf = new Array();
	conf['closed'] = false;
	
	var month = parseInt(table.getAttribute("month")) - 1;
  	create_table(input, month, parseInt(table.getAttribute("year")), conf);
}

function next_month(event) {
	var evt = window.event || event;
  	var target = evt.srcElement || evt.target;
  	
  	var table = findParentNode("inputid", target);
  	var input = document.getElementById(table.getAttribute("inputid"));
  	
  	var conf = new Array();
	conf['closed'] = false;
	
	var month = parseInt(table.getAttribute("month")) + 1;
  	create_table(input, month, parseInt(table.getAttribute("year")), conf);
}

function addEvent(obj, name, func, arg) {
	if (obj.addEventListener) {
		obj.addEventListener(name, func, false);
	} else if (obj.attachEvent) {
		obj.attachEvent('on'+name, func); 
	} else { throw "Error" };
}

function absPosition(obj) { 
	var x = 0;
	var y = 0;
	while(obj) {
		x += obj.offsetLeft;
		y += obj.offsetTop;
		obj = obj.offsetParent;
	}
	
	return {x:x, y:y};
}

function parseDate(date, format) {
	var reg = /(\d+).(\d+).(\d+)/
	var arr = reg.exec(date);
	return {day:arr[1], month:arr[2], year:arr[3]};
}

function findParentNode(parentAttribute, childObj) {
    var testObj = childObj.parentNode;
    var count = 1;
    
    while(testObj.getAttribute(parentAttribute) == null) {
        testObj = testObj.parentNode;
        count++;
    }
    
    return testObj;
}

function parseDateDiff(string) {
	if (string == 0) return string;
	
	var reg = /(\+|\-)(\d+)(.+)/
	var arr = reg.exec(string);
	var multiplier = 1;
	var result = arr[2];
	
	if (arr[3] == "Y") multiplier = 60 * 60 * 24 * 365;
	if (arr[3] == "M") multiplier = 60 * 60 * 24 * 30;
	if (arr[3] == "D") multiplier = 60 * 60 * 24;
	
	result = parseInt(result) * multiplier;
	if (arr[1] == "-") result = result * (-1);
	
	return result;
}

function create_table(input, month, year, conf) {
	var container = document.getElementsByTagName("BODY")[0];
	var selected_date = input.value;
	var montharray = new Array();
	
	if (month > 12) {
		var multiplier = Math.floor(month / 12);
		month = month - multiplier * 12;
		year = year + multiplier;
	}
	
	if (month < 1) {
		var multiplier = Math.floor((month + 13) / 12);
		month = (month - multiplier * 12) * (-1);
		year = year - multiplier;
	}
	
	if (document.getElementById("calendar_"+input.id)) {
		if (!conf) var conf = new Array();
		if (conf['closed'] == undefined) conf['closed'] = true;
		if (conf['date_min'] == undefined) conf['date_min'] = document.getElementById("calendar_"+input.id).getAttribute("date_min");
		if (conf['date_max'] == undefined) conf['date_max'] = document.getElementById("calendar_"+input.id).getAttribute("date_max");
		if (conf['date_format'] == undefined) conf['date_format'] = document.getElementById("calendar_"+input.id).getAttribute("date_format");
		container.removeChild(document.getElementById("calendar_"+input.id));
	}
	
	montharray['firstday'] = mktime(0, 0, 0, month, 1, year);
	montharray['firstday_dayofweek'] = date("w", montharray['firstday']);
	if (montharray['firstday_dayofweek'] == 0) montharray['firstday_dayofweek'] = 7;
	montharray['firstweek'] = mktime(0, 0, 0, month, (2 - montharray['firstday_dayofweek']), year);
	montharray['overallweeks'] = count_weeks(month, year);
	
	cal_table = new Array();
	cal_row = new Array();
	cal_col = new Array();
	
	cal_table[input.id] = document.createElement("table");
	cal_tbody = document.createElement("tbody");
	
	cal_table[input.id].id = "calendar_"+input.id;
	cal_table[input.id].cellSpacing = 3;
	cal_table[input.id].cellPadding = 0;
	cal_table[input.id].className = "calendar-maintable";
	if (conf['closed']) cal_table[input.id].style.display = "none";
	cal_table[input.id].style.position = "absolute";
	cal_table[input.id].style.left = absPosition(input).x;
	cal_table[input.id].style.top = absPosition(input).y + input.offsetHeight + 1;
	cal_table[input.id].setAttribute("inputid", input.id);
	cal_table[input.id].setAttribute("month", month);
	cal_table[input.id].setAttribute("year", year);
	cal_table[input.id].setAttribute("selected_day", "false");
	cal_table[input.id].setAttribute("date_min", conf['date_min']);
	cal_table[input.id].setAttribute("date_max", conf['date_max']);
	cal_table[input.id].setAttribute("date_format", conf['date_format']);
	
	container.appendChild(cal_table[input.id]);
	cal_table[input.id].appendChild(cal_tbody);
	
	var cal_nav_line = document.createElement("tr");
	var cal_nav = document.createElement("td");
	cal_tbody.appendChild(cal_nav_line);
	cal_nav_line.appendChild(cal_nav);
	cal_nav.colSpan = 7;
	
	var cal_nav_table = document.createElement("table");
	var cal_nav_tbody = document.createElement("tbody");
	var cal_nav_row = document.createElement("tr");
	var cal_nav_col_left = document.createElement("td");
	var cal_nav_col_center = document.createElement("td");
	var cal_nav_col_right = document.createElement("td");
	cal_nav.appendChild(cal_nav_table);
	cal_nav_table.appendChild(cal_nav_tbody);
	cal_nav_tbody.appendChild(cal_nav_row);
	cal_nav_row.appendChild(cal_nav_col_left);
	cal_nav_row.appendChild(cal_nav_col_center);
	cal_nav_row.appendChild(cal_nav_col_right);
	
	var month_name = month;
	
	if (month_name == "1") month_name = "ßíâàðü";
	if (month_name == "2") month_name = "Ôåâðàëü";
	if (month_name == "3") month_name = "Ìàðò";
	if (month_name == "4") month_name = "Àïðåëü";
	if (month_name == "5") month_name = "Ìàé";
	if (month_name == "6") month_name = "Èþíü";
	if (month_name == "7") month_name = "Èþëü";
	if (month_name == "8") month_name = "Àâãóñò";
	if (month_name == "9") month_name = "Ñåíòÿáðü";
	if (month_name == "10") month_name = "Îêòÿáðü";
	if (month_name == "11") month_name = "Íîÿáðü";
	if (month_name == "12") month_name = "Äåêàáðü";
	
	cal_nav_table.width = "100%";
	cal_nav_table.className = "calendar-navigation";
	cal_nav_col_left.className = "calendar-nav-left";
	cal_nav_col_center.className = "calendar-currentmonth";
	cal_nav_col_right.className = "calendar-nav-right";
	
	cal_nav_col_left.innerHTML = "<img src='"+space+"' alt=''>";
	cal_nav_col_center.innerHTML = month_name+" "+cal_table[input.id].getAttribute("year")+" ã.";
	cal_nav_col_right.innerHTML = "<img src='"+space+"' alt=''>";
	
	cal_nav_col_left.setAttribute("nav", "left");
	cal_nav_col_right.setAttribute("nav", "right");
	
	addEvent(cal_nav_col_left, "mouseover", mouseover_nav);
	addEvent(cal_nav_col_left, "mouseout", mouseout_nav);
	addEvent(cal_nav_col_right, "mouseover", mouseover_nav);
	addEvent(cal_nav_col_right, "mouseout", mouseout_nav);
	
	addEvent(cal_nav_col_left, "click", previous_month);
	addEvent(cal_nav_col_right, "click", next_month);
	
	cal_row[0] = document.createElement("tr");
	cal_tbody.appendChild(cal_row[0]);
	
	var cal_daysofweek = new Array("Ïí", "Âò", "Ñð", "×ò", "Ïò", "Ñá", "Âñ");
	for(var i=0; i<cal_daysofweek.length; i++) {
		cal_col[i] = document.createElement("td");
		cal_col[i].className = "calendar-dayofweek";
		cal_row[0].appendChild(cal_col[i]);
		cal_col[i].innerHTML = cal_daysofweek[i];
	}
	
	var week = 0;
	var colnum = cal_col.length;
	
	while(++week <= montharray['overallweeks']) {
		cal_row[week] = document.createElement("tr");
		cal_tbody.appendChild(cal_row[week]);
		
		dayofweek = 0;
		weekstart = mktime(0, 0, 0, date("n", montharray['firstweek']), parseInt(date("j", montharray['firstweek'])) + 7 * (week - 1), year);
		
		while(++dayofweek <= 7) {
			cal_col[colnum] = document.createElement("td");
			cal_col[colnum].className = "calendar-day";
			cal_col[colnum].setAttribute("selectable", "true");
			cal_col[colnum].setAttribute("colnum", colnum);
			cal_col[colnum].setAttribute("today", "false");
			
			cal_row[week].appendChild(cal_col[colnum]);
			
			currentday = weekstart + 60 * 60 * 24 * (dayofweek - 1);
			
			cal_col[colnum].innerHTML = date("d", currentday);
			
			addEvent(cal_col[colnum], "click", select_date);
			addEvent(cal_col[colnum], "mouseover", mouseover_date);
			addEvent(cal_col[colnum], "mouseout", mouseout_date);
			
			if (conf['date_max'] != "false") var date_max = time() + parseDateDiff(conf['date_max']);
			if (conf['date_min'] != "false") var date_min = time() + parseDateDiff(conf['date_min']);
			
			if (date("n", currentday) != month | (conf['date_max'] != "false" & currentday > date_max) | (conf['date_min'] != "false" & currentday < date_min)) {
				cal_col[colnum].className = "calendar-day-unselectable";
				cal_col[colnum].setAttribute("selectable", "false");
			} else {
				cal_col[colnum].style.cursor = "pointer";
			}
			
			if (date("j", time()) == date("j", currentday) & date("n", time()) == date("n", currentday) & date("Y", time()) == date("Y", currentday)) {
				cal_col[colnum].className = "calendar-day-today";
				cal_col[colnum].setAttribute("today", "true");
			}
			
			if (parseInt(parseDate(selected_date).day) == date("j", currentday) & parseInt(parseDate(selected_date).month) == date("n", currentday) & parseInt(parseDate(selected_date).year) == date("Y", currentday)) {
				cal_col[colnum].className = "calendar-day-selected";
				cal_table[input.id].setAttribute("selected_day", colnum);
			}
			
			colnum++;
		}
	}
	
	var cal_sub_line = document.createElement("tr");
	var cal_sub = document.createElement("td");
	cal_tbody.appendChild(cal_sub_line);
	cal_sub_line.appendChild(cal_sub);
	cal_sub.colSpan = 7;
	
	var close_link = document.createElement("a");
	cal_sub.appendChild(close_link);
	cal_sub.align = "right";
	
	close_link.href = "javascript://";
	close_link.className = "calendar-close-link";
	close_link.innerHTML = "» Çàêðûòü";
	close_link.setAttribute("close_link", input.id);
	addEvent(close_link, "click", showhide_calendar);
}

function time() {
    return Math.round(new Date().getTime()/1000);
}

function count_weeks(f_month, f_year) {
	var weeks = 0;
	day_stamp = mktime(0, 0, 0, f_month, 1, f_year);
	day = date("j", day_stamp) - 1;
	overalldays = date("t", day);
	
	while(++day <= overalldays) {
		day_stamp = mktime(0, 0, 0, f_month, day, f_year);
		dayofweek = date("w", day_stamp);
		if (dayofweek == 0) dayofweek = 7;
		if (weeks == 0 || dayofweek == 1) weeks++;
	}
	
	return weeks;
}

function mktime () {
	var no=0, i = 0, ma=0, mb=0, d = new Date(), dn = new Date(), argv = arguments, argc = argv.length;
	
	var dateManip = {
		0: function (tt){ return d.setHours(tt); },
		1: function (tt){ return d.setMinutes(tt); },
		2: function (tt){ var set = d.setSeconds(tt); mb = d.getDate() - dn.getDate(); d.setDate(1); return set;},
		3: function (tt){ var set = d.setMonth(parseInt(tt, 10)-1); ma = d.getFullYear() - dn.getFullYear(); return set;},
		4: function (tt){ return d.setDate(tt+mb);},
		5: function (tt){
			if (tt >= 0 && tt <= 69) {
				tt += 2000;
			} else if (tt >= 70 && tt <= 100) {
				tt += 1900;
			}
			return d.setFullYear(tt+ma);
		}
    };
	
	for (i = 0; i < argc; i++){
		no = parseInt(argv[i]*1, 10);
		if (isNaN(no)) {
			return false;
		} else {
			if (!dateManip[i](no)){
				return false;
			}
		}
	}
	
	for (i = argc; i < 6; i++) {
		switch (i) {
			case 0:
				no = dn.getHours();
				break;
			case 1:
				no = dn.getMinutes();
				break;
			case 2:
				no = dn.getSeconds();
				break;
			case 3:
				no = dn.getMonth()+1;
				break;
			case 4:
				no = dn.getDate();
				break;
			case 5:
				no = dn.getFullYear();
				break;
		}
		dateManip[i](no);
	}
	
	return Math.floor(d.getTime()/1000);
}

function date(format, timestamp) {
	var a, jsdate = new Date(timestamp ? timestamp * 1000 : null);
	var pad = function(n, c) {
		if( (n = n + "").length < c ) {
			return new Array(++c - n.length).join("0") + n;
		} else {
			return n;
		}
	};
	
    var txt_weekdays = ["Sunday","Monday","Tuesday","Wednesday",
        "Thursday","Friday","Saturday"];
    var txt_ordin = {1:"st",2:"nd",3:"rd",21:"st",22:"nd",23:"rd",31:"st"};
    var txt_months =  ["", "January", "February", "March", "April",
        "May", "June", "July", "August", "September", "October", "November",
        "December"];
 
    var f = {
        // Day
            d: function(){
                return pad(f.j(), 2);
            },
            D: function(){
                t = f.l(); return t.substr(0,3);
            },
            j: function(){
                return jsdate.getDate();
            },
            l: function(){
                return txt_weekdays[f.w()];
            },
            N: function(){
                return f.w() + 1;
            },
            S: function(){
                return txt_ordin[f.j()] ? txt_ordin[f.j()] : 'th';
            },
            w: function(){
                return jsdate.getDay();
            },
            z: function(){
                return (jsdate - new Date(jsdate.getFullYear() + "/1/1")) / 864e5 >> 0;
            },
 
        // Week
            W: function(){
                var a = f.z(), b = 364 + f.L() - a;
                var nd2, nd = (new Date(jsdate.getFullYear() + "/1/1").getDay() || 7) - 1;
 
                if(b <= 2 && ((jsdate.getDay() || 7) - 1) <= 2 - b){
                    return 1;
                } else{
 
                    if(a <= 2 && nd >= 4 && a >= (6 - nd)){
                        nd2 = new Date(jsdate.getFullYear() - 1 + "/12/31");
                        return date("W", Math.round(nd2.getTime()/1000));
                    } else{
                        return (1 + (nd <= 3 ? ((a + nd) / 7) : (a - (7 - nd)) / 7) >> 0);
                    }
                }
            },
 
        // Month
            F: function(){
                return txt_months[f.n()];
            },
            m: function(){
                return pad(f.n(), 2);
            },
            M: function(){
                t = f.F(); return t.substr(0,3);
            },
            n: function(){
                return jsdate.getMonth() + 1;
            },
            t: function(){
                var n;
                if( (n = jsdate.getMonth() + 1) == 2 ){
                    return 28 + f.L();
                } else{
                    if( n & 1 && n < 8 || !(n & 1) && n > 7 ){
                        return 31;
                    } else{
                        return 30;
                    }
                }
            },
 
        // Year
            L: function(){
                var y = f.Y();
                return (!(y & 3) && (y % 1e2 || !(y % 4e2))) ? 1 : 0;
            },
            //o not supported yet
            Y: function(){
                return jsdate.getFullYear();
            },
            y: function(){
                return (jsdate.getFullYear() + "").slice(2);
            },
 
        // Time
            a: function(){
                return jsdate.getHours() > 11 ? "pm" : "am";
            },
            A: function(){
                return f.a().toUpperCase();
            },
            B: function(){
                // peter paul koch:
                var off = (jsdate.getTimezoneOffset() + 60)*60;
                var theSeconds = (jsdate.getHours() * 3600) +
                                 (jsdate.getMinutes() * 60) +
                                  jsdate.getSeconds() + off;
                var beat = Math.floor(theSeconds/86.4);
                if (beat > 1000) beat -= 1000;
                if (beat < 0) beat += 1000;
                if ((String(beat)).length == 1) beat = "00"+beat;
                if ((String(beat)).length == 2) beat = "0"+beat;
                return beat;
            },
            g: function(){
                return jsdate.getHours() % 12 || 12;
            },
            G: function(){
                return jsdate.getHours();
            },
            h: function(){
                return pad(f.g(), 2);
            },
            H: function(){
                return pad(jsdate.getHours(), 2);
            },
            i: function(){
                return pad(jsdate.getMinutes(), 2);
            },
            s: function(){
                return pad(jsdate.getSeconds(), 2);
            },
            //u not supported yet
 
        // Timezone
            //e not supported yet
            //I not supported yet
            O: function(){
               var t = pad(Math.abs(jsdate.getTimezoneOffset()/60*100), 4);
               if (jsdate.getTimezoneOffset() > 0) t = "-" + t; else t = "+" + t;
               return t;
            },
            P: function(){
                var O = f.O();
                return (O.substr(0, 3) + ":" + O.substr(3, 2));
            },
            //T not supported yet
            //Z not supported yet
 
        // Full Date/Time
            c: function(){
                return f.Y() + "-" + f.m() + "-" + f.d() + "T" + f.h() + ":" + f.i() + ":" + f.s() + f.P();
            },
            //r not supported yet
            U: function(){
                return Math.round(jsdate.getTime()/1000);
            }
    };
 
    return format.replace(/[\\]?([a-zA-Z])/g, function(t, s){
        if( t!=s ){
            // escaped
            ret = s;
        } else if( f[s] ){
            // a date function exists
            ret = f[s]();
        } else{
            // nothing special
            ret = s;
        }
 
        return ret;
    });
}