var month_names=new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
var day_names=new Array("Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag");
var submit_text="OK";

var appInitialized=false;
var appField;
var appUpdate;
var appData={};

var inputEls=[];

function initApplications(){
	var div=new Element('div',{
		'id':'application',
		'morph':{
			'duration':1000,
			'transition':Fx.Transitions.Sine.easeOut,
			'link':'cancel'
		},
		'styles':{
			'opacity':0
		}
	});

	div.inject($$('body')[0]);

	$$('input.date').set('readonly',true);
	$$('input.datetime').set('readonly',true);

	$$('input.datetime').addEvents({
		'click':function(){
			initApplication('datetime',this,this.parentNode.get('html').substr(0,this.parentNode.get('html').indexOf('<')!=-1?this.parentNode.get('html').indexOf('<'):this.parentNode.get('html').length));
			openApplication();
		},
		'keydown':function(){
			this.fireEvent('click');
		}
	});

	$$('input.date').addEvents({
		'click':function(){
			initApplication('date',this,this.parentNode.get('html').substr(0,this.parentNode.get('html').indexOf('<')!=-1?this.parentNode.get('html').indexOf('<'):this.parentNode.get('html').length));
			openApplication();
		},
		'keydown':function(){
			this.fireEvent('click');
		}
	});
}

function openApplication(){
	$('application').morph({
		'opacity':1
	});
}

function closeApplication(){
	$('application').morph({
		'opacity':0
	});

	appField.focus();

	appInitialized=false;	
	appField=false;
	appUpdate=$clear(appUpdate);
	appData={};
}

function initApplication(type,field,head){
	if(appInitialized)
		return;

	appInitialized=true;

	$('application').getChildren().each(function(child){
		child.destroy();
	});

	var year,month,day,hour,minute,second;

	appField=field;
	var value=field.value;

	if(value){
		if(type=='datetime'||type=='date'){
			if(type=='datetime'){
				parts=value.split(' ');
				value=parts[0];

				if(parts[1]){
					time=parts[1].split(':');
					hour=parseInt(time[0],10);
					minute=parseInt(time[1],10);
					second=parseInt(time[2],10);
				}
			}

			date=value.split(".");
			day=parseInt(date[0],10);
			month=parseInt(date[1],10) - 1;
			year=parseInt(date[2],10);
		}else{
			year=parseInt(value.substr(6,4),10);
			month=parseInt(value.substr(2,2),10) - 1;
			day=parseInt(value.substr(0,2),10);
			hour=parseInt(value.substr(8,2),10);
			minute=parseInt(value.substr(10,2),10);
			second=parseInt(value.substr(12,2),10);
		}
	}

	dt=new Date();

	if(isNaN(year)||isNaN(month)||isNaN(day)||year<1||day==0){
		year=dt.getFullYear();
		month=dt.getMonth();
		day=dt.getDate();
	}

	if(isNaN(hour)||isNaN(minute)||isNaN(second)){
		hour=dt.getHours();
		minute=dt.getMinutes();
		second=dt.getSeconds();
	}

	var el=new Element('div',{
		'id':'app-container'
	});
	el.inject($('application'));
	var cnt=el;

	var el=new Element('h1',{
		'html':head
	});
	el.inject($('app-container'));

	var el=new Element('div',{
		'id':'app-win'
	});
	el.inject($('app-container'));

	var el=new Element('div',{
		'id':'app-calhelp'
	});
	el.inject($('app-win'));

	var el=new Element('div',{
		'id':'app-calendar',
		'morph':{
			'duration':1000,
			'transition':Fx.Transitions.Sine.easeOut,
			'link':'cancel'
		}
	});
	el.inject($('app-calhelp'));

	var div=new Element('div',{
		'id':'app-display'
	});
	div.inject($('app-container'));

	var el=new Element('input',{
		'id':'day',
		'type':'text',
		'size':'2',
		'maxlength':'2'
	});
	el.inject(div);
	inputEls.push(el);

	var text=new Element('text',{
		'html':'&nbsp;.&nbsp;'
	});
	text.inject(div);

	var el=new Element('input',{
		'id':'month',
		'type':'text',
		'size':'2',
		'maxlength':'2'
	});
	el.inject(div);
	inputEls.push(el);

	var text=new Element('text',{
		'html':'&nbsp;.&nbsp;'
	});
	text.inject(div);

	var el=new Element('input',{
		'id':'year',
		'type':'text',
		'size':'2',
		'maxlength':'4'
	});
	el.inject(div);
	inputEls.push(el);

	if(type!='date'){
		var text=new Element('text',{
			'html':'&nbsp;&nbsp;&nbsp;'
		});
		text.inject(div);

		var el=new Element('input',{
			'id':'hour',
			'type':'text',
			'size':'2',
			'maxlength':'2'
		});
		el.inject(div);
		inputEls.push(el);

		var text=new Element('text',{
			'html':'&nbsp;:&nbsp;'
		});
		text.inject(div);

		var el=new Element('input',{
			'id':'minute',
			'type':'text',
			'size':'2',
			'maxlength':'2'
		});
		el.inject(div);
		inputEls.push(el);

		var text=new Element('text',{
			'html':'&nbsp;:&nbsp;'
		});
		text.inject(div);

		var el=new Element('input',{
			'id':'second',
			'type':'text',
			'size':'2',
			'maxlength':'2'
		});
		el.inject(div);
		inputEls.push(el);
    }

	inputEls.each(function(el){
		el.addEvents({
			'mousewheel':function(e){
				this.focus();

				appUpdate=$clear(appUpdate);

				this.value-=-e.wheel;

				appUpdate=drawApplication.delay(1500,this,[type,{
					'year':$('year').value,
					'month':$('month').value-1,
					'day':$('day').value,
					'hour':$('hour')?$('hour').value:0,
					'minute':$('minute')?$('minute').value:0,
					'second':$('second')?$('second').value:0
				}]);
			},
			'keydown':function(e){
				appUpdate=$clear(appUpdate);

				switch(e.code){
					case 37:
					case 40:
						this.value--;
						break;
					case 38:
					case 39:
						this.value++;
						break;
				}

				if(e.code==13){
					$('app-submit').fireEvent('click');
					return;
				}

				appUpdate=drawApplication.delay(1500,this,[type,{
					'year':$('year').value,
					'month':$('month').value-1,
					'day':$('day').value,
					'hour':$('hour')?$('hour').value:0,
					'minute':$('minute')?$('minute').value:0,
					'second':$('second')?$('second').value:0
				}]);

				this.writlen=this.value.length;
			},
			'keyup':function(e){
				if(e.code==13)
					return;

				appUpdate=$clear(appUpdate);

				appUpdate=drawApplication.delay(1500,this,[type,{
					'year':$('year').value,
					'month':$('month').value-1,
					'day':$('day').value,
					'hour':$('hour')?$('hour').value:0,
					'minute':$('minute')?$('minute').value:0,
					'second':$('second')?$('second').value:0
				}]);

				if(this.value.length>=this.maxLength&&this.writlen!=this.value.length){
					for(i=0;i<inputEls.length;i++){
						if(this==inputEls[i])
							break;
					}

					this.writlen=this.value.length;

					if((i+1)<inputEls.length){
						inputEls[i+1].focus();
					}else{
						$('app-submit').focus();
					}
				}
			},
			'focus':function(){
				this.writlen=this.value.length;
				this.hasfocus=true;
			},
			'blur':function(){
				this.hasfocus=false;
			}
		});
	});

	var div=new Element('div',{
		'id':'app-finalize'
	});
	div.inject($('app-container'));

	var span=new Element('span',{
		'id':'app-cancel',
		'class':'link',
		'html':'Abbrechen'
	});
	span.inject(div);

	span.addEvents({
		'click':function(){
			appUpdate=$clear(appUpdate);

			closeApplication();
		}
	});

	var span=new Element('a',{
		'id':'app-submit',
		'class':'button',
		'href':'#'
	});
	span.inject(div);

	span.addEvents({
		'click':function(){
			appUpdate=$clear(appUpdate);

			drawApplication(type,{
				'year':$('year').value,
				'month':$('month').value-1,
				'day':$('day').value,
				'hour':$('hour')?$('hour').value:0,
				'minute':$('minute')?$('minute').value:0,
				'second':$('second')?$('second').value:0
			});

			if($('hour')){
				appField.set('value',$('day').value+"."+$('month').value+"."+$('year').value+" "+$('hour').value+":"+$('minute').value+":"+$('second').value);
			}else{
				appField.set('value',$('day').value+"."+$('month').value+"."+$('year').value);
			}

			closeApplication();

			return false;
		}
	});

	appData['years']=[];
	appData['months']=[];

	drawApplication(type,{
		'year':year,
		'month':month,
		'day':day,
		'hour':hour?hour:0,
		'minute':minute?minute:0,
		'second':second?second:0
	});
}

function drawApplication(type,values,marker){
	if(marker)
		alert(marker);

	var year=values['year'];
	var month=values['month'];
	var day=values['day'];
	var hour=values['hour'];
	var minute=values['minute'];
	var second=values['second'];

	var cd=new Date();

	cd.setFullYear(year);
	cd.setMonth(month);
	cd.setDate(day);
	cd.setHours(hour);
	cd.setMinutes(minute);
	cd.setSeconds(second);
	
	year=cd.getFullYear();
	month=cd.getMonth();
	day=cd.getDate();
	hour=cd.getHours();
	minute=cd.getMinutes();
	second=cd.getSeconds();

	var dt=new Date();

	for(yindex=0;yindex<appData['years'].length;yindex++){
		if(appData['years'][yindex]==year)
			break;
	}

	if(appData['years'][yindex]!=year){
		for(zindex=0;zindex<appData['years'].length;zindex++){
			if(appData['years'][zindex]>=year)
				break;
		}

		if(zindex)
			zindex--;

		var yeardiv=new Element('div',{
			'id':'app-year'+year,
			'class':'app-year'
		});

		for(draw_month=-1;draw_month<13;draw_month++){
			if(draw_month<0){
				var draw_year=year-1;
			}else if(draw_month>11){
				var draw_year=year+1;
			}else{
				draw_year=year;
			}

			var table=new Element('table',{
				'cellpadding':0,
				'cellspacing':0
			});
			table.inject(yeardiv);

			table.addEvents({
				'mousewheel':function(e){
					appUpdate=$clear(appUpdate);

					for(i=0;i<inputEls.length;i++){
						if(inputEls[i].hasfocus)
							break;
					}

					if(i<inputEls.length&&inputEls[i].hasfocus){
						inputEls[i].value-=-e.wheel;
					}else{
						$('month').value-=-e.wheel;
						$('month').focus();
					}

					drawApplication(type,{
						'year':$('year').value,
						'month':$('month').value-1,
						'day':$('day').value,
						'hour':$('hour')?$('hour').value:0,
						'minute':$('minute')?$('minute').value:0,
						'second':$('second')?$('second').value:0
					});
				}
			});

			var tr=new Element('tr');
			tr.inject(table);

			var th=new Element('th',{
				'colspan':7,
				'html':month_names[draw_month>=0?draw_month<12?draw_month:draw_month-12:draw_month+12]+" "+draw_year,
				'class':'month month'+(draw_month>=0?draw_month<=11?year:year+1:year-1)+((draw_month>=0?draw_month<=11?draw_month:draw_month-12:draw_month+12)+1)
			});
			th.inject(tr);

			th.setStyle('cursor','pointer');
			th.data={
				'year':year,
				'month':draw_month,
				'day':day,
				'hour':hour,
				'minute':minute,
				'second':second
			};

			th.addEvent('click',function(){
				appUpdate=$clear(appUpdate);

				drawApplication(type,this.data);
			});

			var tr=new Element('tr');
			tr.inject(table);

			for(i=0;i<7;i++){
				var th=new Element('th',{
					'width':'14%',
					'html':day_names[i].substr(0,2)
				});
				th.inject(tr);
			}

			var firstDay=new Date(year,draw_month,1).getDay();
			var lastDay=new Date(year,draw_month+1,0).getDate();

			var tr=new Element('tr',{
				'class':'odd'
			});
			tr.inject(table);

			week=0;
			dayInWeek=0;
			for(i=0;i<(firstDay-1);i++){
				var td=new Element('td');
				td.inject(tr);

				if(dayInWeek>=5){
					td.addClass('celeb');
				}

				dayInWeek++;
			}

			for(i=1;i<=lastDay;i++){
				if(dayInWeek==7){
					var tr=new Element('tr');
					tr.inject(table);

					tr.addClass(week&1?'odd':'even');

					week++;
					dayInWeek=0;
				}

				dispmonth=1+draw_month;

				var td=new Element('td');
				td.inject(tr);

				var span=new Element('span',{
					'html':i
				});

				if(draw_year==year){
					span.set('id','calspan'+year+formatNum2(draw_month+1,'month')+i);
				}

				span.data={
					'year':year,
					'month':draw_month,
					'day':i,
					'hour':hour,
					'minute':minute,
					'second':second
				};

				span.inject(td);

				span.addEvents({
					'click':function(){
						drawApplication(type,this.data);
						$('day').focus();
					}
				});

				if(dayInWeek>=5){
					td.addClass('celeb');
				}

				if(
					year<dt.getFullYear()||
					year==dt.getFullYear()&&draw_month<dt.getMonth()||
					year==dt.getFullYear()&&draw_month==dt.getMonth()&&i<dt.getDate()
				){
					span.addClass('gone');
				}

				dayInWeek++;
			}

			for(i=dayInWeek;i<7;i++){
				var td=new Element('td');
				td.inject(tr);

				if(i>=5){
					td.addClass('celeb');
				}
			}

			for(y=week;y<5;y++){
				var tr=new Element('tr');
				tr.inject(table);

				for(i=0;i<7;i++){
					var td=new Element('td',{
						'html':'&nbsp;'
					});
					td.inject(tr);

					if(i>=5){
						td.addClass('celeb');
					}
				}
			}
		}

		if(appData['years'][zindex]>year){
			yeardiv.inject($('app-year'+appData['years'][zindex]),'before');
		}else{
			yeardiv.inject($('app-calendar'));
		}

		appData['years'].push(year);
		appData['years'].sort();

		for(yindex=0;yindex<appData['years'].length;yindex++){
			if(appData['years'][yindex]==year)
				break;
		}
	}

	$('day').set('value',formatNum2(day,'day'));
	$('month').set('value',formatNum2(month+1,'month'));
	$('year').set('value',formatNum4(year));

	if(type!='date'){
		$('hour').set('value',formatNum2(hour,'hour'));
		$('minute').set('value',formatNum2(minute,'minute'));
		$('second').set('value',formatNum2(second,'second'));

		$('app-submit').set('html',submit_text+", "+$('day').value+". "+month_names[month]+" "+$('year').value+", "+$('hour').value+":"+$('minute').value+":"+$('second').value+" übernehmen");
	}else{
		$('app-submit').set('html',submit_text+", "+$('day').value+". "+month_names[month]+" "+$('year').value+" übernehmen");
	}

	if(appData['selected']){
		$(appData['selected']).removeClass('selected');

		$('app-calendar').setStyles({
			'left':'-'+(month*190)+'px',
			'top':'-'+(yindex*192)+'px'
		});
	}else{
		$('app-calendar').setStyles({
			'left':'-'+(month*190)+'px',
			'top':'0px'
		});
	}

	$('calspan'+year+formatNum2(month-(-1),'month')+day).addClass('selected');
	appData['selected']='calspan'+year+formatNum2(month+1,'month')+day;

	$$('th.diff-1').removeClass('diff-1');
	$$('th.nodiff').removeClass('nodiff');
	$$('th.diff1').removeClass('diff1');

	for(i=month-1;i<=month+1;i++){
		mark_year=i>=0?i<=11?year:year+1:year-1;
		mark_month=(i>=0?i<=11?i:i-12:i+12)+1;


		switch(i-month){
			case -1:
				var cl='diff-1';
				break;
			case 1:
				var cl='diff1';
				break;
			default:
				var cl='nodiff';
				break;
		}

		$$('th.month'+mark_year+mark_month).addClass(cl);
	}
}

function formatNum2(i,valtype){
	i=Math.floor(i);
    f=(i<10?'0':'')+i;

    if(valtype&&valtype!=''){
        switch(valtype){
            case 'month':
                f=(f>12?12:f);
                break;
            case 'day':
                f=(f>31?31:f);
                break;
            case 'hour':
                f=(f>23?23:f);
                break;
            default:
            case 'second':
            case 'minute':
                f=(f>59?59:f);
                break;
        }
    }

    return f;
}

function formatNum4(i){
    i=parseInt(i,10);
    return (i<1000?i<100?i<10?'000':'00':'0':'')+i;
}