sb.include("String.prototype.toNumber");
/**
@Description: 
@Param:  ele an element repfrence
@Param:  args configuration object
@Example
<code>
	var myDatePicker = new tc.forms.date('#mydatepick', { 
		startYear : 2006,
		yearSpan : 10,
		labelText : 'Pick the date you\'d like to have and stuff'
	});
</code>
*/
tc.forms.date = function(ele, args){
	
	//don't redo this
	if(sb.typeOf(ele) == 'tc.forms.date'){ 
	 return ele;
	}
	
	
	ele = $(ele);
	
	
	if(ele.nodeName && ele.nodeName == 'SPAN'){			
		//start em up
		tc.importProperties(this, ele);	
		if(typeof(args) == 'object'){
			for(var i in args){
				if(ele.publicProps.inArray(i)){
					ele[i] = args[i];
				}
			}
		}
		ele.init();
		return ele;
	}else{
		//alert('something is wrong');
	}
		
};

tc.forms.date.prototype = {

	checkDate : function(sChange){ 
		switch(sChange){
			case 'month':
			
				//feb
				if(this.month.value == 1){					
					this.fillDay(1);					
				}
								
				if(this.only30.inArray(this.month.value.toNumber())){
					if(this.day.options.length != 31){						
						this.fillDay(1);
					}
				}else{		
					if(this.day.options.length != 32){					
						this.fillDay(1);
					}
				}	
			break;
			
			case 'year':
				if(this.month.value == 1){
					this.fillDay(1);		
				}			
			break;
		}
	},
	
	
	clean : function(){
		this.innerHTML = '';		
	},
		
	createLists : function(){
		var that = this;
		
		//label
			this.label = new sb.element({ 
				nodeName : 'LABEL',
				tag : 'LABEL',
				innerHTML : this.labelText,
				className : 'tc_forms_date label'
			}).appendTo(this);
			
		//datespan
			this.datespan = new sb.element({ 
				nodeName : 'SPAN',
				tag : 'SPAN',
				className : 'tc_forms_date groupspan'
			}).appendTo(this);
		 	
		//day
			this.day =new sb.element({ 
				nodeName : 'SELECT',
				tag : 'SELECT',
				className : 'tc_forms_date day ',
				id : this.id + '_day',
				name : this.id + '[d]',
				events : { 
					change : function(e){ 
						that.checkDate('day');
					}
				}
			});
		//month
			this.month = new sb.element({ 
				nodeName : 'SELECT',
				tag : 'SELECT',
				className : 'tc_forms_date month',
				id : this.id + '_month',
				name : this.id + '[m]',
				events : { 
					change : function(e){ 
						that.checkDate('month');
					}
				}
			});
		//year
			this.year = new sb.element({ 
				nodeName : 'SELECT',
				tag : 'SELECT',
				className : 'tc_forms_date year',
				id : this.id + '_year',
				name : this.id + '[y]',
				events : { 
					change : function(e){ 
						that.checkDate('year');
					}
				}
			});
			
			this.month.appendTo(this.datespan);
			this.day.appendTo(this.datespan);
			this.year.appendTo(this.datespan);
	},
	
	date : new Date(),
	
	/**
	*
	*
	* @return integer 1 = empty, 0 = full, -1 = partial
	*/
	empty : function(){ 
		//filled
		var ret = 0;

		//partial
		ret = ((this.day.value === '') || (this.month.value === '') || (this.year.value === ''))?-1:ret;
		
		//blank	
		ret = ((this.day.value === '') && (this.month.value === '') && (this.year.value === ''))?1:ret;

		return ret;
	
	},
		
	fillAll : function(){
		this.fillDay();
		this.fillMonth();
		this.fillYear();	
	},
	
	fillDay : function(bClean){
		var maxDays = (this.only30.inArray(this.month.value.toNumber()))?30:31;
		var textDay;
		var keepDay;
		
		bClean = bClean || 0;
		
		
		if(bClean){	
			keepDay = this.day.value;
			do{
				this.day.options[0] = null;
			}while (this.day.options.length !== 0);
		}
		
		//february
		if(this.month.value == 1){
			if(this.year.value.toNumber() % 4 === 0){
				maxDays = 29;
			}else{
				maxDays = 28;
			}
		}
		
		
		this.day.options[this.day.options.length] = new Option('DAY', '');
		for(var i = 1;i<maxDays+1;i++){			
			this.day.options[this.day.options.length] = new Option(i.toString().numpad(), i);
		}
		
		this.day.value = (bClean && (keepDay < this.day.options.length))?keepDay:this.day.value;
				
	},
	
	fillMonth : function(){
		var that = this;
		var aShort = ['Jan', 'Feb', 'Mar',
					   'Apr', 'May', 'Jun', 
					   'Jul', 'Aug', 'Sep',
					   'Oct', 'Nov', 'Dec'];
					   
		var aLong = ['January', 'February', 'March',
					   'April', 'May', 'June', 
					   'July', 'August', 'September',
					   'October', 'November', 'December'];
					   
		var aUsing = (this.longMonths)?aLong:aShort;	

			that.month.options[that.month.options.length] = new Option('MON', '');
			aUsing.forEach(function(v, k){ 
				that.month.options[that.month.options.length] = new Option(v, k);
			});
		
	}, 
	
	fillYear : function(){
		var temp;
		
		this.year.options[this.year.options.length] = new Option('YEAR', '');
		for(var i = 0; i<this.yearSpan;i++){
			temp = this.startYear + i;
			this.year.options[this.year.options.length] = new Option(temp, temp);
		}
	},

	
	init : function(){
		this.clean();
		this.createLists();
		this.fillAll();
		this.setDate();	
	},
	
	
	labelText : 'Choose a date',
	
	longMonths : 0,
		
	only30 : [3, 5, 8, 10],
	
	publicProps : ['date', 'startYear', 'yearSpan', 'labelText', 'startOnDate', 'longMonths'],
	
	startYear : new Date().getFullYear(),	
	
	yearSpan : 5,
	
	setDate : function(oNewDate){				
		
		this.date = (oNewDate && (typeof(oNewDate.setDate) == 'function'))?oNewDate:this.date;
		
		if(this.startOnDate){
			this.day.value = this.date.getDate();
			this.month.value = this.date.getMonth();
			this.year.value = this.date.getFullYear();
		}
		
	},

	startOnDate : (tc.forms.date.startOnDateDefault)?tc.forms.date.startOnDateDefault:1,
	
	/**
	* Returns a string representation of the date showing on this objectss
	*
	*/
	toString : function(){
	
		return (this.empty() === 0)?this.toDate().toString():'NaD';

	},
	
	toDate : function(){
		return new Date(this.year.value, this.month.value, this.day.value,0,0,0,0);
	},
	
	typeOf : function(){
		return 'tc.forms.date';
	},
	
	yearSpan : 5
	
};