
function checkDate(sDate, sLang){	
	var lang = 'spa';
	var sCharSeparator = "/";
	var bReturnIsDate
	//si no se indica el idioma, se asume que es español
	if (checkDate.arguments.length == 2) lang=sLang;
	
	if (sDate.indexOf("-",0)>0) sCharSeparator = "-"		
	if (sDate.indexOf(sCharSeparator, 0) < 1) return null	
	var vDate = sDate.split(sCharSeparator);	
	switch (lang){
		case 'spa':
			bReturnIsDate = isDate(vDate[2],vDate[1]-1, vDate[0])
			break;
		case 'eng':
			bReturnIsDate = isDate(vDate[2],vDate[0]-1, vDate[1])
			break;
	}
	
	if (bReturnIsDate){
		var DateInitial =  new Date(1900, 0, 1);
		var DateFinal = new Date (2079,5,1);
		var DateTest = new Date (vDate[2],vDate[0]-1, vDate[1])
		
		var DaysInitial = compareDate (DateInitial, DateTest);
		var DaysFinal = compareDate (DateInitial, DateFinal)
		
		if (( DaysInitial >= 0) && (DaysInitial<DaysFinal)) return true;
		else return false;
			
	}
	else return false
}
function isDate (year, month, day){   
		var daysInMonth = new Array(31,29,31,30,31,30,31,31,30,31,30,31);		
		
		function isInteger(s){
			var reInteger = /^\d+$/
			return reInteger.test(s)
		}
		
		function isIntegerInRange (s, a, b){		
			if (!isInteger(s)) return false;    
			var num = parseInt(s,10);
			return ((num >= a) && (num <= b));
		}
		
		function daysInFebruary (year){    
			return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );
		}
		
		function isDay(s){
			return isIntegerInRange(s, 1, 31)
		}
		
		function isMonth(s){
			return isIntegerInRange(s,0, 11)
		}
		
		function isYear(s){
			if (!isInteger(s)) return false;
			//return ((s.length == 2) || (s.length == 4));
			// only four digit years  &  greater than 0!!			
			return ((s.length == 4)&&(s>1899));
		}
		
		// aqui empieza la validación
    if (! (isYear(year) && isMonth(month) && isDay(day)) ) return false;
    
    var intYear = parseInt(year,10);
    var intMonth = parseInt(month,10);
    var intDay = parseInt(day,10);

		// para todos los meses menos Febrero    
    if (intDay > daysInMonth[intMonth]) return false; 

    if ((intMonth == 1) && (intDay > daysInFebruary(intYear))) return false;
    return true;
}
function dtDate(sLang){
	var lang = 'spa';
	sDate = this;
	var sCharSeparator = "/";
	//si no se indica el idioma, se asume que es español
	if ((arguments.length > 0)&&(arguments[0]!=null)) lang=sLang;
	
	if (! (checkDate(sDate, lang)) ) return null;
		
	if (sDate.indexOf("-",0)>0) sCharSeparator = "-"		
	if (sDate.indexOf(sCharSeparator, 0) < 1) return null	
	var vDate = sDate.split(sCharSeparator);	
	
	switch (lang){
		case 'spa':
			return new Date(vDate[2],vDate[1]-1, vDate[0])
		case 'eng':
			return new Date(vDate[2],vDate[0]-1, vDate[1])			
	}	  
}
function compareDate(d1, d2){
	if ((d1.constructor==Date)&&(d2.constructor==Date)){					
			var lDifference =  d2.getTime()-d1.getTime();
			var msInDay = (1000*60*60*24) //milisegundos en un dia
			var iDays = Math.round(lDifference/msInDay);
			return (iDays);		
	}else return null;
}
function spanishShortDate(){
	dtDate = this;
	if (dtDate.constructor==Date){
		with (dtDate){
			return  (getDate()+'/'+(parseInt(getMonth(),10)+1)+'/'+getFullYear());
		}		
	} else return null;
}
function spanishLongDate(){		
		function spanishMonth(dtDate){
			var vMonths = new Array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");
			var iMonth = dtDate.getMonth();
			return vMonths[iMonth];	
		}
		function spanishDay(dtDate){
			var vDays = new Array("Domingo","Lunes", "Martes", "Miércoles","Jueves", "Viernes", "Sábado");
			var iDay = dtDate.getDay();
			return vDays[iDay];
		}

	dtDate = this;
	if (dtDate.constructor==Date){
		var sDate = spanishDay(dtDate) + ' ' +
								dtDate.getDate() + 
								' de ' + 
								spanishMonth(dtDate) + 
								' de ' + 
								dtDate.getFullYear();
			return sDate;
	} else return null;		
}
Date.prototype.spanishLongDate = spanishLongDate;
Date.prototype.spanishShortDate = spanishShortDate;
String.prototype.toDate = dtDate;
