var ContentDatePicker = {
	de: {
		close: "schliessen",
		day: ["Mo","Di","Mi","Do","Fr","Sa","So"],
		days: ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"],
		month: ["Jan", "Feb", "Mrz", "Apr","Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"],
		months: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],
		format: "F Y"
	},
	en: {
		close: "close",
		day: ["Mo","Tu","We","Th","Fr","Sa","So"],
		days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
		month: ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],
		months: ["January","February","March","April","May","June","July","August","September","October","November","December"],
		format: "y-m"
	},
	sp: {
		close: "cierre",
		day: ["Lu","Ma","Mi","Ju","Vi","Sa","Do"],
		days: ["lunes", "martes", "miércoles", "jueves", "viernes", "sábado", "dominical"],
		month: ["Ene","Feb","Mar","Ab","May","Jun","Jul","Aug","Sept","Oct","Nov","Dic"],
		months: ["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Augosto","Septiembre","Octubre","Novimbre","Diciembre"],
		format: "y-m"
	},
	fr: {
		close: "fermer",
		day: ["Lu","Ma","Me","Je","Ve","Sa","Di"],
		days: ["lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"],
		month: ["Jan","Fév","Mar","Avr","Mai","Jun","Jul","Août","Sep","Oct","Nov","Déc"],
		months: ["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],
		format: "y/m"
	},
	it: {
		close: "fine",
		day: ["Lu","Ma","Me","Gi","Ve","Sa","Do"],
		days: ["lunedì", "martedì", "mercoledì", "giovedì", "venerdì", "sabato", "domenica"],
		month: ["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"],
		months: ["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"],
		format: "y.m"
	},
	nl: {
		close: "sluiten",
		day: ["Ma","Di","Wo","Do","Vr","Za","Zo"],
		days: ["Mantag", "Dienstag", "Wottwoch", "Donnerstag", "Vreitag", "Zamstag", "Zonntag"],
		month: ["Jan","Feb","Maa","Apri","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],
		months: ["Januari","Februari","Maart","April","Mei","Juni","Juli","Augustus","September","Oktober","November","December"],
		format: "y.m"
	}
};
var DatePicker = Class.create({
	input: false,
	element: false,
	date: false,
	selected: {},
	start: {
		year: false,
		month: false
	},
	stop: {
		year: false,
		month: false
	},
	cssClasses: {
		head: {
			hover: "hover-head-cell"
		},
		body: {
			hover: "hover-body-cell",
			aktiv: "aktiv-body-cell"
		},
		foot: {
			hover: "hover-foot-cell"
		}
	},
	lang: ContentDatePicker.de,
	initialize: function(){
		this.date = new Date();
		this.start = {
			year:1900,
			month:0
		};
		this.stop = {
			year:2100,
			month:11
		};
		this.element = new Element("table",{
			"class": "datepicker",
			"cellpadding": "1px",
			"cellspacing": "1px"
		}).update(new Element("caption"));
		this.element.setStyle({
			"position": "absolute",
			"z-index": 9999,
			"width": "auto"
		});
		this.selected = {
			year: this.date.getFullYear(),
			month: this.date.getMonth(),
			day: this.date.getDate()
		};
	},
	setSelected: function(yValue, mValue, dValue){
		this.selected = {
			year: parseInt(yValue),
			month:parseInt(mValue),
			day: parseInt(dValue)
		};
	},
	setStart: function(y, m){
		this.start = {
			year: parseInt(y),
			month: parseInt(m)
		};
	},
	setStop: function(y, m){
		this.stop = {
			year: parseInt(y),
			month: parseInt(m)
		};
	},
/** TABLE **/
	create: function(){
		this.element.appendChild(this.createHead());
		this.element.appendChild(this.createBody());
		this.element.appendChild(this.createFoot());
		this.setDisplayValue();
		this.element.hide();
		this.input.observe("click",this.openDatePicker.bind(this));
//		document.body.appendChild(this.element);
		this.input.wrap("blank").appendChild(this.element);
	},
/** BODY **/
	createBody: function(){
		var value = 0;
		var values = this.getMonthValues();
		var body = new Element("tbody");
		var row = new Element("tr");
		for(var i = 0; i <= values.length; i++){
			if(i % 7 == 0 && i > 0){
				body.appendChild(row);
				var row = new Element("tr");
			}
			var cell = new Element("td",{
				"value":values[i]
			}).update("&nbsp;");
			if (values[i] > 0) {
				value = values[i].toPaddedString(2);
				cell.update(value);
				cell.observe("click", this.beforeClickDay.bind(this));
				cell.observe("click", this.onClickDay.bind(this));
				cell.observe("click", this.afterClickDay.bind(this));
				cell.observe("mouseover", function(e){
					e.element().addClassName(this.cssClasses.body.hover);
				}
.bind(this));
				cell.observe("mouseout", function(e){
					e.element().removeClassName(this.cssClasses.body.hover);
				}
.bind(this));
			}
			row.appendChild(cell);
		}
		if(values.length % 7 == 6){
			body.appendChild(row);
		}
		if(this.selected.year == this.date.getFullYear() && this.selected.month == this.date.getMonth()){
			body.select('[value="'+this.selected.day+'"]')[0].addClassName(this.cssClasses.body.aktiv);
		}
		return body;
	},
	beforeClickDay: function(){},
	afterClickDay:function(){},
	getMonthValues: function(){
		var values = [];
		var monday = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 12);
		var monday = (!monday.getDay()) ? 6 : monday.getDay() - 1;
		if (monday > 0) {
			var blanks = [0,0,0,0,0,0].splice(6-monday, monday);
			values.push(blanks);
		}
		var days = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31].splice(0,this.date.getDayInMonth());
		values.push(days);
		values = values.flatten();
		if (values.length % 7 > 0) {
			var blanks = [0,0,0,0,0,0].splice(values.length % 6, 7);
			values.push(blanks);
			values = values.flatten();
		}
		return values;
	},
	onClickDay: function(e){
		var cell = e.element();
		var value = cell.readAttribute("value");
		var cssClass = this.cssClasses.body.aktiv;
		this.element.select("."+cssClass).each(
			function(element){
				element.removeClassName(cssClass);
			}
		);
		cell.addClassName(cssClass);
		this.selected = {
			year: this.date.getFullYear(),
			month: this.date.getMonth(),
			day: value
		};
		var value = parseInt(value).toPaddedString(2) + "." + this.date.getFullMonth() + "." + this.date.getFullYear();
		this.input.setValue(value);
		this.closeDatePicker();
		return true;
	},
/** THEAD **/
	createHead: function(){
		var row = new Element("tr");
	// < MONAT
		var lMonth = new Element("th").update("&lsaquo;");
		lMonth.observe("click", this.setPreviousMonth.bind(this));
		lMonth.observe("mouseover", function(e){
			e.element().addClassName(this.cssClasses.head.hover);
		}.bind(this));
		lMonth.observe("mouseout", function(e){
			e.element().removeClassName(this.cssClasses.head.hover);
		}.bind(this));
		row.appendChild(lMonth);
	//	month
		var month = new Element("th",{
			"class": "display",
			"field": "display-month",
			"colspan": 5
		});
		row.appendChild(month);
	// > MONAT
		var rMonth = new Element("th").update("&rsaquo;");
		rMonth.observe("click", this.setNextMonth.bind(this));
		rMonth.observe("mouseover", function(e){
			e.element().addClassName(this.cssClasses.head.hover);
		}.bind(this));
		rMonth.observe("mouseout", function(e){
			e.element().removeClassName(this.cssClasses.head.hover);
		}.bind(this));
		row.appendChild(rMonth);
	//	DAY-NAME
		var days = new Element("tr",{
			"class": "date"
		});
		for(var i = 0; i < this.lang.day.length; i++){
			days.appendChild(new Element("th").update(this.lang.day[i]));
		}
	//	THEAD
		var head = new Element("thead");
		head.appendChild(row);
		head.appendChild(days);
		return head;
	},
/** TFOOT **/
	createFoot: function(){
		var cell = new Element("td",{
			"colspan": 7
		}).update(this.lang.close);
		cell.observe("click",this.closeDatePicker.bind(this));
		cell.observe("mouseover", function(e){
			e.element().addClassName(this.cssClasses.foot.hover);
		}.bind(this));
		cell.observe("mouseout", function(e){
			e.element().removeClassName(this.cssClasses.foot.hover);
		}.bind(this));
		var row = new Element("tr");
		row.appendChild(cell);
		var foot = new Element("tfoot");
		foot.appendChild(row);
		return foot;
	},
/** NEXT **/
	setNextYear: function(){
		this.date.setNextYear();
		if(this.date.getFullYear() > this.stop.year){
			this.date.setPreviousYear();
			return false;
		}
		if(this.date.getFullYear() == this.stop.year && this.date.getMonth() > this.stop.month){
			this.date.setPreviousYear();
			return false;
		}
		this.setDisplayValue();
		this.element.select("tbody").each(function(e){e.remove();});
		this.element.insertBefore(
			this.createBody(),
			this.element.getElementsByTagName("tfoot")[0]
		);
	},
	setNextMonth: function(){
		this.date.setNextMonth();
		if(this.date.getFullYear() > this.stop.year){
			this.date.setPreviousMonth();
			return false;
		}
		if(this.date.getFullYear() == this.stop.year && this.date.getMonth() > this.stop.month){
			this.date.setPreviousMonth();
			return false;
		}
		this.setDisplayValue();
		this.element.select("tbody").each(function(e){e.remove();});
		this.element.insertBefore(
			this.createBody(),
			this.element.getElementsByTagName("tfoot")[0]
		);
	},
/** PREVIOUS **/
	setPreviousYear: function(){
		this.date.setPreviousYear();
		if(this.date.getFullYear() < this.start.year){
			this.date.setNextYear();
			return false;
		}
		if(this.date.getFullYear() == this.start.year && this.date.getMonth() < this.start.month){
			this.date.setNextYear();
			return false;
		}
		this.setDisplayValue();
		this.element.select("tbody").each(function(e){e.remove();});
		this.element.insertBefore(
			this.createBody(),
			this.element.getElementsByTagName("tfoot")[0]
		);
	},
	setPreviousMonth: function(){
		this.date.setPreviousMonth();
		if(this.date.getFullYear() < this.start.year){
			this.date.setNextMonth();
			return false;
		}
		if(this.date.getFullYear() == this.start.year && this.date.getMonth() < this.start.month){
			this.date.setNextMonth();
			return false;
		}
		this.setDisplayValue();
		this.element.select("tbody").each(function(e){e.remove();});
		this.element.insertBefore(
			this.createBody(),
			this.element.getElementsByTagName("tfoot")[0]
		);
	},
/** OPEN **/
	openDatePicker: function(event){
		var position = this.input.positionedOffset();
		var style = {
			left : position[0] + "px",
			top: position[1] + this.input.getHeight() + "px" //.top + this.input.getHeight() + "px"
		};
		this.element.setStyle(style);
/**
		var style = {
			left: event.pointerX() + "px",
			top: event.pointerY() + event.element().getHeight() + "px"
		};
**/
/**
		this.input.disable();
		var height = parseInt(this.input.getHeight());
		var width = parseInt(this.input.getWidth());
		try{
			this.element.clonePosition(this.input);
			var style = {
				height: height + "px",
				width: width + "px",
				top: (parseInt(this.element.getStyle("top")) + parseInt(this.input.getHeight())) + "px",
				left: (parseInt(this.element.getStyle("left")) + (parseInt(this.input.getWidth()) - width)) + "px"
			};
			this.element.setStyle(style);
		}catch(e){}
**/
		this.element.show();
	},
/** CLOSE **/
	closeDatePicker: function(){
		this.input.enable();
		this.element.hide();
	},
/** SET DISPLAY **/
	setDisplayValue: function(){
		try{
			var value = this.lang.format;
			value = value.replace("d","%d%");
			value = value.replace("D","%D%");
			value = value.replace("j","%j%");
			value = value.replace("F","%F%");
			value = value.replace("m","%m%");
			value = value.replace("M","%M%");
			value = value.replace("n","%n%");
			value = value.replace("y","%y%");
			value = value.replace("Y","%Y%");
			var month = this.date.getMonth();
			value = value.replace("%d%", this.date.getFullDate());
			value = value.replace("%j%", this.date.getDate());
			value = value.replace("%m%", this.date.getFullMonth());
			value = value.replace("%n%", 1 + month);
			var day = this.date.getDate();
			day == 6 ? day = 0 : day--;
			value = value.replace("%D%", this.lang.day[day]);
			value = value.replace("%M%", this.lang.month[month]);
			value = value.replace("%F%", this.lang.months[month]);
			value = value.replace("%Y%", this.date.getFullYear());
			var year = String(this.date.getFullYear());
			value = value.replace("%y%", year.substring(1,2));
			var month = this.element.select("[field='display-month']")[0];
			month.update(value);
		}catch(e){}
		try{
			var year = this.element.select("[field='display-year']")[0];
			year.update(this.date.getFullYear());
		}catch(e){}
	}
});