
function Calendar(pWho,pPrefix,pYear,pMonth,pDay) {
	this.monthName = new Array
	("Januar","Februar","M&auml;rz","April","Mai","Juni","Juli",
	"August","September","Oktober","November","Dezember");
	this.name=pWho;
	this.prefix=pPrefix;
	this.day = Math.max(1,parseInt("0"+pDay,10));
	this.month = Math.max(1,parseInt("0"+pMonth,10));
	this.year = parseInt("0"+pYear,10);
	this.small = null;
	this.big = null;
	this.callback = null;
	if(this.year < 999) this.year+=this.year > 15?1900:2000;
	this.lastClick=null;
	//methods
	this.writeHead = writeHead;
	this.writeDays=writeDays;
	this.writeDay=writeDay;
	this.writeDate=writeDate;
	this.colorMe=colorMe;
	this.init=init;
	this.myDate=myDate;
	this.newDate=newDate;
	this.CustomChange=CustomChange;
	this.lastM=lastM;
	this.nextM=nextM;
	this.minDate=null;
	this.maxDate=null;
	this.maxLength=0;
	var elem = document.getElementById(this.prefix + "_lastMonth");
	var lClick=new Function (pWho+".lastM();");
	if(elem){elem.onclick=lClick;}
	elem = document.getElementById(this.prefix+ "_nextMonth");
	lClick=new Function (pWho+".nextM();");
	if(elem){elem.onclick=lClick;}
	lClick=new Function (pWho+".CustomChange();");
	elem = document.getElementById(this.prefix+"_hdnDay");
	if(elem){
		elem.onchange=lClick;
		elem.onclick=lClick;
		elem.onblur=lClick;
	 	elem.onkeyup=new Function ("onlyNumbers('"+this.prefix+"_hdnDay', this.value);");
		}
	elem = document.getElementById(this.prefix+"_hdnMonth");
	if(elem){
		elem.onchange=lClick;
		elem.onclick=lClick;
		elem.onblur=lClick;
	 	elem.onkeyup=new Function ("onlyNumbers('"+this.prefix+"_hdnMonth', this.value);");
		}
	elem = document.getElementById(this.prefix+"_hdnYear");
	if(elem){
		elem.onchange=lClick;
		elem.onclick=lClick;
		elem.onblur=lClick;
	 	elem.onkeyup=new Function ("onlyNumbers('"+this.prefix+"_hdnYear', this.value);this.focus();");
		}
}

function init(){
    //alert(this.minDate+ " -" + this.maxDate);
	this.writeHead();
	this.writeDays();
}

function myDate() {
		return(new Date(this.year,this.month-1,this.day ));
}

function newDate( mDate) {
	if(mDate!=null){
		this.year=mDate.getFullYear();
		this.month=mDate.getMonth()+1;
		this.day=mDate.getDate();
	}
}
	
function writeHead() {
	var monthHead = this.monthName[this.month-1] + " " + this.year;
	var mHead=document.getElementById(this.prefix+"CalendarHead");
	mHead.innerHTML=monthHead;
	var elem = document.getElementById(this.prefix+"_hdnMonth");
	if(elem)elem.value=this.month;
	elem = document.getElementById(this.prefix+"_hdnYear");
	if(elem)elem.value=this.year;
	var bSend;
	if(this.small!=null){
		if(this.year<this.small.year){this.small.year=this.year;this.small.month=this.month;bSend=true;}
		if(this.month<this.small.month && this.year==this.small.year){this.small.month=this.month;bSend=true;}
		
		if(this.maxLength!=0){	
				var chkDate=this.myDate();
				chkDate=new Date(Date.parse(chkDate)-(this.maxLength - 60000));
				if(this.small.myDate() < chkDate) {
					this.small.newDate(chkDate);
					
					bSend=true;
				}
		}/**/
		if(bSend)this.small.init();
	}
	if(this.big!=null){
		if(this.year>this.big.year){
			this.big.year=this.year;this.big.month=this.month;bSend=true;}
		if(this.month>this.big.month && this.year==this.big.year){this.big.month=this.month;bSend=true;}
		if(bSend)this.big.init();
	}
 }

function writeDays()
{
	var iMax=31;
	var iMin=1;
	var bClick=null;
	if(this.minDate!=null){
		if((this.minDate.getFullYear()==this.year) && (this.minDate.getMonth()+1==this.month)){
			iMin=this.minDate.getDate();
			this.day=Math.max(this.day,iMin);
		}
	}
	if(this.maxDate!=null){
		if((this.maxDate.getFullYear()==this.year) && (this.maxDate.getMonth()+1==this.month)){
			iMax=this.maxDate.getDate();
			this.day=Math.min(this.day,iMax);
		}
	}
	var Stop=31;
	var Zeit = new Date(this.year,this.month-1,1);
	var Start = Zeit.getDay();
	if(Start > 0) Start--;
	else Start = 6;
	if(this.month==4 ||this.month==6 || this.month==9 || this.month==11 ) Stop--;
	if(this.month==2) {
		Stop = Stop - 3;
		if(this.year%4==0) Stop++;
		if(this.year%100==0) Stop--;
		if(this.year%400==0) Stop++;
	}
	var Tageszahl = 1;
	for(var i=0;i<=5;i++) {
	  for(var j=0;j<=6;j++) {
	var mID=(i*7+j);
	    if((i==0)&&(j < Start)){
	     this.writeDay(mID,"&#160;",null);
	    }else{
	      if(Tageszahl > Stop){
		this.writeDay(mID,"&#160;",null);
	      }else{
	      	bClick=((Tageszahl>=iMin)&(Tageszahl<=iMax));
		if(Tageszahl==this.day){
			this.writeDay(mID,Tageszahl,bClick);
			if(bClick){
				this.colorMe(mID);
				this.writeDate(Tageszahl);
			}
		}else{
		 this.writeDay(mID,Tageszahl,bClick);
		}
		Tageszahl++;
	       }
	     }
	    }
	}

}

function writeDay(who,Inhalt,click) {
    var elem = document.getElementById(this.prefix+who);
    if(elem){
        var retVal=click?'<a href="javascript:'+this.name+'.colorMe(\''+who+'\');'+this.name+'.writeDate('+Inhalt+');">':" ";
        retVal+=Inhalt;
        if(click){
            retVal+="<\/a>";
            elem.className ="calDay";
        }else{
            elem.className ="calDis";
        }
        elem.innerHTML=retVal
    }else{
    }
}

function writeDate(id)
{
	this.day=id;
	var elem = document.getElementById(this.prefix+"_hdnDay");
	if(elem)elem.value=id
	var mDate =this.myDate();
	elem = document.getElementById(this.prefix+"_hdnDate");
    	if(elem){
		elem.value=getDDMMYY(mDate);
	//alert("!");
	    if(this.callback != null)this.callback(mDate);
	}
	if(this.small!=null){
		if(mDate<new Date(this.small.year,this.small.month-1,this.small.day ) ){this.small.colorMe(""+this.lastClick);this.small.writeDate(id);}
		if(this.maxLength!=0){	
			mDate =new Date(Date.parse(mDate)-(this.maxLength - 60000));
			var chkDate = this.small.myDate();
			chkDate.setMilliseconds(0);
			if(chkDate < mDate) {
				this.small.newDate(mDate);
				this.small.init();
			}
		
		}/**/
	}
	if(this.big!=null){
		if(mDate>new Date(this.big.year,this.big.month-1,this.big.day )){this.big.colorMe(""+this.lastClick);this.big.writeDate(id);}
		if(this.big.maxLength!=0){	
			mDate =new Date(Date.parse(mDate) +this.big.maxLength + (60000*60));/* Stunde */
			var chkDate = this.big.myDate();
			chkDate.setMilliseconds(0);
			if(this.big.myDate() > mDate) {
				this.big.newDate(mDate);
				this.big.init();
			}
		}/**/
	}
}

function colorMe(id)
{
	var elem = document.getElementById(this.prefix+this.lastClick);
   	if(elem && elem.className !="calDis")elem.className ="calDay";
	this.lastClick=id;
	elem = document.getElementById(this.prefix+this.lastClick);
   	 if(elem)elem.className ="calAct";

}

function CustomChange()
{
	var change=0;
	var elem = document.getElementById(this.prefix+"_hdnYear");
	if(elem){
		if(parseInt(elem.value,10)!=this.year){
			this.year=parseInt(elem.value,10);
			change=2;
		}
	}
	elem = document.getElementById(this.prefix+"_hdnMonth");
	if(elem){
		if(parseInt(elem.value,10)!=this.month){
			this.month=parseInt(elem.value,10);
			change=2;
		}
	}
	elem = document.getElementById(this.prefix+"_hdnDay");
	if(elem){
		if(parseInt(elem.value,10)!=this.day){
			this.day=parseInt(elem.value,10);
			change+=1;
		}
	}

	if(change==2||change==3)this.init();
	if(change==1)this.writeDays();
}

function lastM()
{
	if(this.minDate!=null){
		if((this.minDate.getFullYear()>=this.year) && (this.minDate.getMonth()>=this.month-1)){
			return;
		}
	}
	this.month--;
	if(this.month==0)
	{
		this.month=12;
		this.year--;
	}
	this.init();
}

function nextM()
{
	if(this.maxDate!=null){
		if((this.maxDate.getFullYear()<=this.year) && (this.maxDate.getMonth()<this.month)){
			return;
		}
	}
	this.month++;
	if(this.month==13)
	{
		this.month=1;
		this.year++;
	}
	
		if(this.maxLength!=0){
	    	if(this.small!=null){
			    var chkDate=this.small.myDate();
			    chkDate=new Date(Date.parse(chkDate)+(this.maxLength));
			    if(this.month!=chkDate.getMonth()+1){
			        if((((this.year%100)*100)+this.month)>(((chkDate.getFullYear()%100)*100)+chkDate.getMonth())+1){
			           this.day=1;
			        }else{
		                if(this.myDate() > chkDate) {
			                this.newDate(chkDate);					
		                }
			        }
			    }else{
			        if(this.myDate() > chkDate) {
			                this.newDate(chkDate);					
		                }
			    }
			}
		}/**/
	this.init();
}
