function makeDatePicker( input, YearFrom, YearTo, AllowNull ){
	
	
	YearFrom = YearFrom || new Date().getFullYear() - 15;
	YearTo = YearTo ||  new Date().getFullYear() + 5

	var id = input.id
	input.dateFormat = null
	input.hidden = input.cloneNode(false);
	input.hidden.name = input.name;
	input.name = "";
	input.hidden.id = "";
	input.id = id
	input.hidden.type = 'hidden';
	input.iframeWidth = null
	if(!input.value) input.date = new Date(input.value);
	//input.value = input.date = new Date()
	
	var spanFrame = document.createElement('DIV');
	spanFrame.style.position = "absolute";
	spanFrame.style.display = 'inline';
	//spanFrame.style.backgroundColor = 'red';
	input.parentNode.insertBefore( spanFrame, input );
	//input.parentNode.removeChild(input)
	//spanFrame.appendChild(input)

	input.iframe = document.createElement('IFRAME');
	input.iframe.name = input.iframe.id = "DatePicker" + makeDatePicker.id++;
	input.iframe.frameBorder = "0";
	input.iframe.style.position = 'absolute';
	input.iframe.style.border = 'outset 2px buttonface';
	input.iframe.style.top = (input.scrollHeight+6) + "px";
	input.iframe.style.height = "200px";
	input.iframe.style.backgroundColor = 'white';
	input.iframe.style.display = "none"
	input.iframe.src = "about:blank"

	spanFrame.appendChild( input.iframe );
	
	input.parentNode.insertBefore( input.hidden, input );

	// Create pointers to window
	input.win = input.iframe.contentWindow || document.frames[input.iframe.name];
	input.doc = input.iframe.contentDocument || input.win.document;
	
	// Enter basic info into iframe
	var basic_page_html = '<html><head><style>*{font-family: arial, helvetica, sans-serif;font-size:12px;}td{text-align:center;}td.fade a{color:inactivecaptiontext}a{-moz-border-radius: 12px 12px 12px 12px;text-decoration:none;color:buttontext;display:block;padding:1px;}a:hover{ background-color: highlight; color: highlighttext}table {margin-bottom:5px;	border-collapse: collapse; }tbody td{background-color:white;border-left: 1px solid #C0C0C0;border-bottom: 1px solid #C0C0C0}table{border-right: 1px solid #C0C0C0;border-top: 1px solid #C0C0C0}thead td{border-left: 1px solid #C0C0C0}body{margin:0px;padding:none;overflow:hidden;background-color:buttonface}select, button{font-size:11px;}</style><meta http-equiv="content-type" content="text/html; charset=utf-8" /></head><body></body></html>';
	input.doc.open();
	input.doc.write( basic_page_html );
	input.doc.close();


	input.changeDate = function(year,month,day, select){
		year = parseInt(year)
		month = parseInt(month)
		if(select){
			this.date = new Date(year,month,day);
			this.updateValue();
			if(input.iframe) input.iframe.style.display = "none";
		}else{
			this.date = new Date(year,month,day);
			this.updateView();
		}
	}

	input.updateValue = function(){
	
		// 01-jan-2000
		this.hidden.value = this.date.getDate() + "-" +
							Date._MonthNames[this.date.getMonth()].substring(0,3) + "-" +
							this.date.getFullYear()
	

	
		this.value = this.date.getFullDateFormat();
	}
	input.setNull = function(){
		this.date = new Date();
		this.hidden.value = "";
		this.value = "[ no date selected ]"
	}

	input.updateView = function(){
		if(!this.doc.getElementsByTagName('TBODY')[0]) this.init();

		var tbody = this.doc.getElementsByTagName('TBODY')[0]
		
		while(tbody.firstChild) tbody.removeChild(tbody.firstChild)
		
		var table = this.doc.getElementsByTagName('TABLE')[0]
		var tr, td
		// Days of month
		tr = this.doc.createElement('TR');
		var counter = new Date(this.date.valueOf())
		var today = new Date();
		var month = counter.getMonth()
		counter.setDate(1);
		var offset = (counter.getDay() % 7)

		input.doc.getElementById('year').value = this.date.getFullYear()
		if(input.doc.getElementById('year').selectedIndex == -1) input.doc.getElementById('year').selectedIndex = 0

		input.doc.getElementById('month').value = month

		counter.setDate(counter.getDate() - offset)
		for(var i=0;i<offset;i++){
			td = this.doc.createElement('TD');
			td.className = 'fade';
			var a = this.doc.createElement('A');
			a.href = "#"
			a.onclick = function(){
				input.changeDate( input.doc.getElementById('year').value, parseInt(input.doc.getElementById('month').value)-1, this.innerHTML, true )
				return false;
			}
			a.innerHTML = counter.getDate()
			td.appendChild(a);
			tr.appendChild(td);	
			counter.setDate(counter.getDate() + 1)
		}
		counter.setDate(1)

		while(month == counter.getMonth()){
			var day =  counter.getDate();
			if( counter.getDay()%7 == 0){
				tbody.appendChild(tr);
				tr = this.doc.createElement('TR');
			}

			td = this.doc.createElement('TD');
			var a = this.doc.createElement('A');
			a.href = "#"
			a.onclick = function(){
				input.changeDate( input.doc.getElementById('year').value, parseInt(input.doc.getElementById('month').value), this.innerHTML, true );
				return false;
			}
			// Highlight today
			if(day == today.getDate() && 
				month == today.getMonth() && 
				counter.getFullYear() == today.getFullYear()){
				a.style.color = 'blue';
				a.title = "Today";
			}
			// Highlight selected date
			if(this.avalue && day == this.avalue.getDate() && 
				month == this.avalue.getMonth() && 
				counter.getFullYear() == this.avalue.getFullYear()){
				a.style.border = '1px red solid';
				a.style.color = 'red'
				a.title = "Currently selected date";
			}

			a.innerHTML = day
			td.appendChild(a);
			td.className = 'current';
			tr.appendChild(td);
			counter.setDate(day+1);
		}

		var offset = 7 - (counter.getDay()%7)
		if(offset < 7){
			for(var i=0;i<offset;i++){
				td = this.doc.createElement('TD');
				td.className = 'fade';
				var a = this.doc.createElement('A');
				a.href = "#"
				a.onclick = function(){
					input.changeDate( input.doc.getElementById('year').value, parseInt(input.doc.getElementById('month').value)+1, this.innerHTML, true )
				return false;
					return false;
				}
				a.innerHTML = counter.getDate();
				td.appendChild(a);
				tr.appendChild(td);	
				counter.setDate(counter.getDate() + 1);
			}
		}
		tbody.appendChild(tr);

		// Display popup
		input.iframe.style.display = "block";
		//input.iframe.style.zIndex = 11;
		input.iframe.style.height = table.scrollHeight +'px'

		// Patch to prevent iframe resize on IE
		if(!input.iframeWidth) input.iframeWidth =  table.scrollWidth
		input.iframe.style.width = input.iframeWidth +'px'

	}



	input.init = function(){
		//this.doc.body.innerHTML = "";
		this.doc.onmousedown = 
		this.doc.onselectstart = 
		this.doc.oncontextmenu = function(e){
			return false
		}

		var table = this.doc.createElement('TABLE');
		var tbody = this.doc.createElement('TBODY');
		var tfoot = this.doc.createElement('TFOOT');
		var thead = this.doc.createElement('THEAD');
		var tr = this.doc.createElement('TR');
		var td = this.doc.createElement('TD');

		// Back a month button
		td = this.doc.createElement('TD');
		td.style.whiteSpace = 'nowrap'
		var buttonBack = this.doc.createElement('BUTTON');
		buttonBack.innerHTML = "&#9668;"
		buttonBack.onclick = function(){
			input.changeDate( input.doc.getElementById('year').value, parseInt(input.doc.getElementById('month').value)-1, 1 )
		}
		td.appendChild(buttonBack)
		//td.style.textAlign = "left"
		tr.appendChild(td);

		// Month Selector
		td = this.doc.createElement('TD');
		td.colSpan = 5
		var monthSelect = this.doc.createElement('SELECT');
		for(var i=0;i<Date.MonthNames.length;i++){
			var option = this.doc.createElement('OPTION');
			option.value = i;
			option.innerHTML = Date.MonthNames[i];
			monthSelect.appendChild(option)
		}
		monthSelect.id = "month"
		monthSelect.onchange = function(){
			input.changeDate( input.doc.getElementById('year').value, this.value, 1 )
		}
		td.appendChild(monthSelect)	
		//tr.appendChild(td);

		// Year selector
		var yearSelect = this.doc.createElement('SELECT');
		for(var i=YearFrom;i<=YearTo;i++){
			var option = this.doc.createElement('OPTION');
			option.value = 	option.innerHTML = i;
			yearSelect.appendChild(option)
		}
		yearSelect.selectedIndex = 0;
		yearSelect.id = "year"
		yearSelect.onchange = function(){
			input.changeDate( this.value, input.doc.getElementById('month').value , 1 )
		}
		
		td.appendChild(yearSelect)	
		tr.appendChild(td);
		
		// Forward a month button
		td = this.doc.createElement('TD');
		var buttonNext = this.doc.createElement('BUTTON');
		buttonNext.innerHTML = "&#9658;"
		buttonNext.onclick = function(){
			input.changeDate( input.doc.getElementById('year').value, parseInt(input.doc.getElementById('month').value)+1, 1 )
		}	
		td.appendChild(buttonNext)	
		//td.style.textAlign = "right"
		tr.appendChild(td);

		thead.appendChild(tr);

		// Days Of Week
		tr = this.doc.createElement('TR');
		var DaysOfWeek = ["s","m","t","w","t","f","s"];
		for(var i=0;i<DaysOfWeek.length;i++){
			td = this.doc.createElement('TD');
			td.width = "14.3%"
			td.innerHTML = Date.DaysOfWeekNames[i].charAt(0);//DaysOfWeek[i];
			tr.appendChild(td);
		}
		tr.style.backgroundColor = "#000066";
		tr.style.color = "white";
		thead.appendChild(tr);


		tr = this.doc.createElement('TR');
		td = this.doc.createElement('TD');
		td.colSpan = 7;
		td.padding = "3px"
		var todayButton = this.doc.createElement('BUTTON');
		todayButton.innerHTML = "Today"
		todayButton.style.marginRight = "10px"
		todayButton.onclick = function(){
			input.date = new Date()
			input.updateValue()
			input.iframe.style.display = "none";
		}
		var cancelButton = this.doc.createElement('BUTTON');
		cancelButton.innerHTML = "Cancel"
		cancelButton.onclick = function(){
			input.iframe.style.display = "none";
		}
		
		var noneButton = this.doc.createElement('BUTTON');
		noneButton.innerHTML = "Clear"
		noneButton.style.marginRight = "10px"

		noneButton.onclick = function(){
			input.setNull()
			input.iframe.style.display = "none";
		}
		
		//td.appendChild(todayButton) TODO: Need translation for today
		if(AllowNull) td.appendChild(noneButton)
		td.appendChild(cancelButton)
		tr.appendChild(td)
		tfoot.appendChild(tr);

		table.appendChild(thead);
		table.appendChild(tbody);
		table.appendChild(tfoot);
		this.doc.body.appendChild(table);
	}


	input.parseHidden = function( ){
		
		var value = this.hidden.value.toString()
	
		if(value){

			if(value.indexOf(',') != -1){
				this.date = new Date( value.split(',')[1] );
			}else{
				// Check for valid date tuesday, 12 march 2005
				// 12-May-2004
				value = value.split('-');
				var month = 0;
				var monthText = value[1].toLowerCase().substring(0,3)
				for(var i=0;i<Date._MonthNames.length;i++){
					if(Date._MonthNames[i].toLowerCase().indexOf(monthText) == 0){
						month = i;
						break;
					}
				}
				this.date = new Date( value[2], month, value[0] );	
			}
			this.updateValue();
			return
		}

		// no date found
		if(AllowNull){
			this.setNull();
		}else{
			// Not allowed null reset to today
			this.date = new Date();
			this.updateValue();
		}

	}

	input.onblur = function(){
		this.parseHidden()
	}

	input.onfocus = function(){
		this.parseHidden();

		this.updateView();

		try{this.win.focus()}catch(e){};
	}
	input.parseHidden( );
	input.style.visibility = 'visible';

	addEvent(document,'mousedown', function(){ 
			if(input.iframe.style.display == "block") 
				input.iframe.style.display = "none"; 
		}
	)
	addEvent(document,'keydown', function(e){ 
			if(e.keyCode == 9){
				input.iframe.style.display = "none"; 
			}
		}
	)
	return input
}
makeDatePicker.id = 0
