var date_helper = new Class({
	
	repairDate:function(value, format ){
		
		/* replace splitting chars in format and date string */
		var v = value.replace (/[\D]+/g, ":"); //all non numbers are delimiters
		var f = format.replace(/[\W]+/g, ":"); //all non alphanum  chats are delimiters 
		
		/* split format and value */
		var v_parts = v.split(':');
		var f_parts = f.split(':');

		/* default = now */
		var now   = new Date();
		now.setMilliseconds(0);
		now.setSeconds(0);
		now.setMinutes(0);
		now.setHours(0);
		
		/* empty values */
		var year  = Number.NaN;
		var month = Number.NaN;
		var day   = Number.NaN;
				
		for ( var key = 0; key< f_parts.length ; key ++){
			
			var p_value  = "" + v_parts[key];
			var p_format = "" + f_parts[key];
				
			if ( p_value ){
				
					// remove leading zeros
				p_value = p_value.replace (/^[0]+/g, '' );
	
				switch (p_format ){
					case 'yyyy':
						year  = parseInt(p_value);
						break;
					case 'mm':
						month = parseInt(p_value);
						break;
					case 'dd':
						day   = parseInt(p_value);
						break;
				}
			}
		}
		
		/* fix date value */
		if ( isNaN(day) || day > 31 ){
			day = now.getDate();
		}
		
		/* fix month value */
		if ( isNaN(month) || month > 12 ) {
			if (day >= now.getDate() ) {
				month = 1 + now.getMonth(); // this month
			} else {
				month = 2 + now.getMonth(); // next month
			}		
		}
		
		/* fix present year values */
		if ( !isNaN(year) ) {
			if (year < 100 ) year = 2000 + year;
			if  ( year < now.getFullYear() || year > now.getFullYear() + 5 ) {
				if ( (month > now.getMonth() + 1) || ( month == now.getMonth() + 1 && day > now.getDate() ) ){
					year = now.getFullYear();				
				} else {
					year = now.getFullYear() + 1;
				}
			}
		}
		
		/* guess empty year values */
		if  ( isNaN(year) ) {
			if ( (month > now.getMonth() + 1 || ( month == now.getMonth() +1 && day >= now.getDate() ) ) ) {
				year = now.getFullYear();
			} else {
				year = now.getFullYear() + 1 ;
			} 
		}
		
		/* format value */
		var corrected_date = new Date(year, ( month-1 ), day);
		
		if (corrected_date < now){
			return now;
		} else {
			return corrected_date;
		}
	},
	
			/* Convert Date-Str to JS-Timestamp */
	date2ts:function(dateStr,format){

			// default value
		var now = new Date();  
		var year   = now.getFullYear()  ;
		var month  = now.getMonth() ;
		var day    = now.getDate();

			// extract y m d from date-str
		var dd = this.extractDatePart(format, dateStr, 'dd');
		while (dd.substr(0,1) == '0') dd = dd.substr(1);			
		if (dd)	 day = parseInt(dd);

		var mm = this.extractDatePart(format, dateStr, 'mm' );
		while (mm.substr(0,1) == '0') mm = mm.substr(1);	
		if (mm)	 month =  parseInt(mm) -1;

		var yyyy = this.extractDatePart(format, dateStr, 'yyyy' );
		while (yyyy.substr(0,1) == '0') yyyy = yyyy.substr(1);	
		if (yyyy)  year =  parseInt(yyyy);
		
			// convert values
		var date = new Date( year, month, day);
		
		return ( date.getTime() );
	},
	
	ts2date:function(ts,format){
	
		var date = new Date();
		date.setTime(ts);
		
		var year   = date.getFullYear()  ;
		var month  = date.getMonth() + 1 ;
		var day    = date.getDate() ;
		
		if (day < 10) day = '0' + day;
		if (month < 10) month = '0' + month;
		var dateStr = format.replace( /dd/i, day ).replace( /mm/i, month ).replace( /yyyy/i, year );
		
		return dateStr;
	},
	
	extractDatePart:function(format, string, pattern){
		var result = "";
		var start = format.indexOf(pattern);
		var len   = pattern.length; 
		if (start > -1 && len > 0 ){
			result = string.substr(start, len);
		}
		return result;
	}
	
});

window.addEvent('domready', function()	{
		// gobal var
	date_helper = new date_helper();
});

