function calDaysInMonth(m,y) {
	var dt = new Date(y, m, 0);
	return dt.getDate();
}

function calGetNameOfMonth(mon) {
	while(mon < 1)
		mon += 12;
	while(mon > 12)
		mon -= 12;

	var names = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"];
	return names[mon-1]; //-1 because mon not zero based
}

function calGetShortNameOfWeekDay(nr) {
	while(nr < 0)
		nr += 7;
	while(nr > 6)
		nr -= 6;
	var names = ["S", "M", "D", "M", "D", "F", "S"];
	return names[nr];
}

function calGetPreDaysStart(m, y) {
	var dt = new Date(y, m, 0);
	dt.setDate(1);
	return (calDaysInMonth(m-1,y) - dt.getDay() +1);
}

function calGetFirstWeekDay(m, y) {
	var dt = new Date(y, m, 0);
	dt.setDate(1);
	return dt.getDay();
}

function calGetLastWeekDay(m, y) {
	var dt = new Date(y, m, 0);
	dt.setDate(calDaysInMonth(m,y));
	return dt.getDay();
}

function calMixColors() {
	var cols = new Array();
	for(var i = 0; i < calMixColors.arguments.length; i++){
		if((typeof(calMixColors.arguments[i]) == "object") && (typeof(calMixColors.arguments[i].length) != "undefined"))
		{
			for(var j = 0; j < calMixColors.arguments[i].length; j++){
				calMixColors.arguments[i][j] = calMixColors.arguments[i][j].toUpperCase();
				if(calMixColors.arguments[i][j].match("#") != false) {
					var c = calMixColors.arguments[i][j].replace("#", "");
					var c_a = new Array();
					c_a[0] = parseInt(c.slice(0,2),16);
					c_a[1] = parseInt(c.slice(2,4),16);
					c_a[2] = parseInt(c.slice(4,6),16);
					cols.push(c_a);
				}
				else if(calMixColors.arguments[i][j].match("RGB") != false) {
					var c = calMixColors.arguments[i][j].slice(4,-1);
					c = c.replace(/ /g,"");
					var c_a = c.split(",");
					cols.push(c_a);
				}
			}
		}
		else if(calMixColors.arguments[i].match("#") != false){
			var c = calMixColors.arguments[i].replace("#", "");
			var c_a = new Array();
			c_a[0] = parseInt(c.slice(0,2),16);
			c_a[1] = parseInt(c.slice(2,4),16);
			c_a[2] = parseInt(c.slice(4,6),16);
			cols.push(c_a);
		}
		else if(calMixColors.arguments[i].toUpperCase().match("RGB") != false) {
			var c = calMixColors.arguments[i].slice(4,-1);
			c = c.replace(/ /g,"");
			var c_a = c.split(",");
			cols.push(c_a);
		}
	}

	var rgb = new Object();
	rgb.r = 0; rgb.g = 0; rgb.b = 0;

	for(var i = 0; i < cols.length; i++) {
		rgb.r += parseInt(cols[i][0]);
		rgb.g += parseInt(cols[i][1]);
		rgb.b += parseInt(cols[i][2]);
	}
	rgb.r = Math.round(rgb.r/cols.length);
	rgb.g = Math.round(rgb.g/cols.length);
	rgb.b = Math.round(rgb.b/cols.length);
	return "#"+myToString(rgb.r,16)+myToString(rgb.g,16)+myToString(rgb.b,16);
}

function calMixBackground() {
	var cols = new Array();
	for(var i = 0; i < calMixBackground.arguments.length; i++){
		if(typeof(calMixBackground.arguments[i].length) != "undefined")
		{
			for(var j = 0; j < calMixBackground.arguments[i].length; j++){
				if(calGetCssRule(calMixBackground.arguments[i][j]) != false)
					cols.push(calGetCssRule(calMixBackground.arguments[i][j]).style.backgroundColor.toUpperCase());
			}
		}
		else if(calGetCssRule(calMixBackground.arguments[i]) != false)
			cols.push(calGetCssRule(calMixBackground.arguments[i]).style.backgroundColor.toUpperCase());
		else
			alert("calMixBackground: failure");
	}

	var sum = new Object();
	sum.r = 0;
	sum.g = 0;
	sum.b = 0;

	for(var i = 0; i < cols.length; i++) {
		var rgb = null;
		if(cols[i].match("RGB")) {	//RGB(234,19,9)
			rgb = cols[i].slice(4,-1);
			rgb = rgb.replace(/ /g,"");
			rgb = rgb.split(",");
		}
		else if(cols[i].match("#")) {	//#FE177E
			rgb = new Array();
			var col = cols[i].replace(/#/g,"");
			rgb[0] = parseInt(col.slice(0,2), 16);
			rgb[1] = parseInt(col.slice(2,4), 16);
			rgb[2] = parseInt(col.slice(4,6), 16);
		}
		else
			alert("calMixBackground: error defining rgb value for: " +cols[i]);

		if(rgb != null) {
			sum.r += parseInt(rgb[0]);
			sum.g += parseInt(rgb[1]);
			sum.b += parseInt(rgb[2]);
		}
	}

	var mix = new Object();
	mix.r = Math.round(sum.r / cols.length);
	mix.g = Math.round(sum.g / cols.length);
	mix.b = Math.round(sum.b / cols.length);

	return "#"+myToString(mix.r,16)+myToString(mix.g,16)+myToString(mix.b,16);
}

function calDecodeDate(str){
	if(str == "")
		return false;
	var temp = str.split(" ");			//temp[0] = date, temp[1] = time

	var d = new Array();	var t = new Array();
	if(typeof(temp[0]) != "undefined")
		d = temp[0].split("-");
	if(typeof(temp[1]) != "undefined")
		t = temp[1].split(":");


	var obj = new Object();

	if(d.length == 3) {
		obj.year = parseInt(d[0], 10);
		obj.month = parseInt(d[1], 10);
		obj.day = parseInt(d[2], 10);
	}
	else {
		obj.year = 0; obj.month = 0; obj.day = 0;
	}

	if(t.length == 2){
		obj.hour = parseInt(t[0]);
		obj.minute = parseInt(t[1]);
	}
	else {
		obj.hour = 0; obj.minute = 0;
	}

	return obj;
}

function myToString(value, type)
{
	var str = "00" + value.toString(type);
	return str.substr(str.length-2, str.length); //display 2 digits with leading zeros !
}

function myIntToHex(intVal)
{
	var decToHex="";
	var hexArray = new Array( "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F" );
	var code1 = Math.floor(intVal / 16);
	var code2 = intVal - code1 * 16;
	decToHex += hexArray[code1];
	decToHex += hexArray[code2];
	return decToHex;
}

function calGetBackground(name){
	var rule = calGetCssRule(name);
	if(rule == false)
		return false;

	var bg = rule.style.backgroundColor.toUpperCase();

	if(bg.match("RGB")) {	//RGB(234,19,9)
		bg = bg.slice(4,-1);
		bg = bg.replace(/ /g,"");
		var bg_a = bg.split(",");
		return "#"+myToString(myIntToHex(bg_a[0]),16)+myToString(myIntToHex(bg_a[1]),16)+myToString(myIntToHex(bg_a[2]),16);
	}
	else if(bg.match("#") != false)	//#F54A89
		return bg;


	alert("calGetBackground: Unbekanntes Format");
}

function calGetCssRule(name) {
	name = name.toLowerCase();
	if (document.styleSheets) {
		for (var i = 0; i < document.styleSheets.length; i++) {
			var styleSheet = document.styleSheets[i];
			var j = 0;
			var rule = false;
			do {
				if (styleSheet.cssRules) {
					rule = styleSheet.cssRules[j];
				} else {
					rule = styleSheet.rules[j];
				}
				if (rule)  {
					if(typeof(rule.selectorText) == "undefined")
					{
					}
					else if (rule.selectorText.toLowerCase() == name) {
						return rule;
					}
				}
				j++;
			} while (rule)
		}
	}
	return false;
}

