
/////////////////////////////////////////////////////////////////
//	Autor: Tomeu
//	Ultima revision: 07/03/2003
//	Ultimo en revisar: Joan Fullana
//	Descripcion:1.He anyadido la posibilidad de tener opcion null para 
//				 dias y meses. He anyadido la posibilidad de especificar
//				 funciones para el evento onChange del listbox de dia y mes
//				2.Opcion de de manipular anyos.
//				3.Incorporar mètode per retornar dia de sa 7mana.
/////////////////////////////////////////////////////////////////


function dateObject(name)
{
	this.name = name;
	this.day = null;
	this.month = null;
	this.year = null;

	this.daysObject = null;
	this.monthsObject = null;
	this.yearsObject = null;
	
	this.dayNullAble = false;
	this.dayNullText;
	this.dayNullValue;
	
	this.monthNullAble;
	this.monthNullText;
	this.monthNullValue;
	
	this.changed= false;
	// Metodos
	
	this.load = dte_load;
	this.add = dte_add;
	this.monthText = dte_monthText;
	this.takeDate = dte_takeDate;
	this.dayOfWeek = dte_dayOfWeek;
	this.getDate = dte_getDate;

	this.onChangeDay = null;
	this.onChangeMonth = null;
	this.onChangeFunction = null;
	
	// Inicializacion

	var today = new Date();
	this.tday = today.getDate();
	this.tmonth = today.getMonth()+1;
	this.tyear = today.getYear();
	this.yearsFrom = today.getYear();
	this.yearsTo = today.getYear();

	return;	
}

	
function dte_load()
{

	var maxDays = 31;
	if (this.monthsObject!=null)
	{

		var indice = 0;
		if (this.monthNullAble)
		{
			this.monthsObject.options[indice] = new Option(this.monthNullText, this.monthNullValue)
			indice++;
		}
		for (var i=1;i<=12;i++)
		{
			var name="";
			switch (i)
			{
				case 1: name= "Enero"; break;
				case 2: name= "Febrero"; if(i==this.month) maxDays = (this.year%4==0) ? 29 : 28; break;
				case 3: name= "Marzo"; break;
				case 4: name= "Abril"; if(i==this.month) maxDays = 30; break;
				case 5: name= "Mayo"; break;
				case 6: name = "Junio"; if(i==this.month) maxDays = 30; break;
				case 7: name = "Julio"; break;
				case 8: name = "Agosto"; break;
				case 9: name = "Septiembre"; if(i==this.month) maxDays = 30; break;
				case 10: name = "Octubre"; break;
				case 11: name = "Noviembre"; if(i==this.month) maxDays = 30; break;
				case 12: name = "Diciembre";
			}
			
			this.monthsObject.options[indice] = new Option(name,i);
			indice++;
		}
		
		if (this.monthNullAble)
			this.monthsObject.selectedIndex=this.month;
		else
			this.monthsObject.selectedIndex=this.month-1;
		if (this.onChangeFunction==null)
			 this.monthsObject.onchange = new Function("dte_changeMonth('" + this.name + "');");
		else
			 this.monthsObject.onchange = new Function("dte_changeMonth('" + this.name + "');" + this.onChangeFunction + ";"); 
				
	}
	
	if (this.daysObject!=null)
	{
		var indice = 0;
		if (this.dayNullAble)
		{
			this.daysObject.options[indice] = new Option(this.dayNullText, this.dayNullValue);
			indice++;
		}

		for (var i=1; i<=maxDays; i++)
		{
			this.daysObject.options[indice] = new Option((String(i).length==1) ? "0"+i: i,i);
			indice++;			
		}
		
		if (this.dayNullAble)
			this.daysObject.selectedIndex=this.day;
		else
			this.daysObject.selectedIndex=this.day-1;
		if (this.onChangeFunction==null)
			this.daysObject.onchange = new Function("dte_changeDay('" + this.name + "');");
		else
			this.daysObject.onchange = new Function("dte_changeDay('" + this.name + "');" + this.onChangeFunction + ";");	
				
	}
	if (this.yearsObject!=null)
	{
		for (var i=0;i<=(this.yearsTo-this.yearsFrom);i++){
			this.yearsObject.options[i] = new Option(this.yearsFrom+i,this.yearsFrom+i);
			if ((this.yearsFrom+i)==this.year){
				this.yearsObject.selectedIndex=i
			}
		}
		this.yearsObject.onchange = new Function("dte_changeYear('" + this.name + "')");
	}
		
	return;
}


function dte_changeMonth(nameObject)
{
	thisObject = eval(nameObject)
	thisObject.month = thisObject.monthsObject.options[thisObject.monthsObject.selectedIndex].value;
	thisObject.changed=true;
	dte_changeYear(nameObject);
	
	if (thisObject.daysObject!=null)
	{
		var maxDays = 31;
		switch (String(thisObject.monthsObject.options[thisObject.monthsObject.selectedIndex].value))
		{
			case "2": maxDays = (thisObject.year%4==0) ? 29 : 28; break;
			case "4": case "6": case "9": case "11": maxDays = 30; break;
			case thisObject.monthNullValue: maxDays = 31; break;
		}

		if (thisObject.dayNullAble)
		{
			var tope = 29;
			var indice = 28;
		}
		else
		{
			var tope = 28;
			var indice = 27;
		}

		thisObject.daysObject.options.length = tope;

		for (var i=28;i<=maxDays;i++)
		{
			thisObject.daysObject.options[indice] = new Option((String(i).length==1) ? "0"+i: i, i);
			indice++;
		}
		
		if (thisObject.dayNullAble)
		{
			if (thisObject.day > maxDays)
			{
				thisObject.daysObject.selectedIndex= maxDays;
				thisObject.day = thisObject.daysObject.options[thisObject.daysObject.selectedIndex].value;
			}	
		}
		else
		{			
			if (thisObject.day > thisObject.daysObject.options.length)
				thisObject.daysObject.selectedIndex=thisObject.daysObject.options.length-1;
			else
				thisObject.daysObject.selectedIndex=thisObject.day-1;
				
			thisObject.day = thisObject.daysObject.options[thisObject.daysObject.selectedIndex].value;
		}
	}
	
	if (thisObject.onChangeMonth != null)
		thisObject.onChangeMonth();
	
	return;
}
	
	
function dte_changeDay(nameObject)
{
	thisObject = eval(nameObject)
	thisObject.day = thisObject.daysObject.options[thisObject.daysObject.selectedIndex].value;
	thisObject.changed=true;
	dte_changeYear(nameObject);

	if (thisObject.onChangeDay != null)
		thisObject.onChangeDay();

	return;
}


function dte_changeYear(nameObject)
{
	var Obj = eval(nameObject)
	if (Obj.yearsObject==null)
	{
		if ((Obj.month < Obj.tmonth))
			{
				if ((Obj.month == Obj.tmonth) && (Obj.day > Obj.tday))
					Obj.year = Obj.tyear;
				else
					Obj.year = Obj.tyear + 1;
			}
		else
			Obj.year = Obj.tyear;	
	}
	else
		Obj.year = Obj.yearsObject.options[Obj.yearsObject.selectedIndex].value;
	return;
}


function dte_add(numDays){
	this.day = parseInt(this.day) + numDays;
	var maxDays = 31;
	switch (this.month.toString())
		{
		case "2": maxDays = (this.year%4==0) ? 29 : 28; break;
		case "4": case "6": case "9": case "11": maxDays = 30;
		}
	if (this.day>maxDays)
		{
		this.month = parseInt(this.month) + 1;
		this.day = parseInt(this.day) - parseInt(maxDays);
		if (this.month==13)
			{
			this.month = 1;
			this.year = parseInt(this.year) + 1;
			}
		}
	return;
}

	
function dte_takeDate(format){
	//Modificat: J.Fullana (09/02/2004)
	
	//format --> (1) dd/mm/yyyy  
	//format --> (2) yyyymmdd  
	//format --> (3) dd-mmm-yyy

	switch (format){
	case 1:
		return dosDigits(this.day) +"/"+ dosDigits(this.month) +"/"+ this.year
	case 2:
		return this.year + dosDigits(this.month) + dosDigits(this.day);
	case 3:
		return dosDigits(this.day) +"-"+ getNombreMes(parseInt(this.month),2) +"-"+ this.year
	}
	return;
}

function dte_monthText(){
	return getNombreMes(parseInt(this.month),1)
}

function dte_dayOfWeek(){
	//***********
	// modifiat: 07/02/2003 - J. Fullana
	// retorna: DG -> 1
	//			DL -> 2
	//			DM -> 3
	//			DX -> 4
	//			DJ -> 5
	//			DV -> 6
	//			DS -> 7
	//***********
	
	var data = new Date(this.year,(this.month-1)%12,this.day)

	return data.getDay()+1;
}

function dte_getDate(){
	return new Date(this.year,this.month-1,this.day)
}

//function que retorna un String de 2 digits
//creat: J.Fullana (09/02/2004)
function dosDigits(num){
	var str = num.toString();
	switch (str.length){
	case 1:
		return "0"+ str;
	case 2: 
		return str;
	default:
		return str.substring(0,2);
	}
}


//retorna el nom del mes en diferents formats
//creat: J.Fullana (09/02/2004)
function getNombreMes(mes,format){
	//format --> (1) "Enero, Febrero, ..."
	//format --> (2) "Jan, Feb, ..."
	switch(format){
	case 1:
		switch (mes){
		case 1: return "Enero"; 
		case 2: return "Febrero";
		case 3: return "Marzo"; 
		case 4: return "Abril";
		case 5: return "Mayo"; 
		case 6: return "Junio";
		case 7: return "Julio"; 
		case 8: return "Agosto"; 
		case 9: return "Septiembre";
		case 10: return "Octubre"; 
		case 11: return "Noviembre";
		case 12: return "Diciembre";
		}
	case 2:
		switch (mes){
		case 1: return "Jan"; 
		case 2: return "Feb";
		case 3: return "Mar"; 
		case 4: return "Apr";
		case 5: return "May"; 
		case 6: return "Jun";
		case 7: return "Jul"; 
		case 8: return "Aug"; 
		case 9: return "Sep";
		case 10: return "Oct"; 
		case 11: return "Nov";
		case 12: return "Dec";
		}
	}
}

/****************************************************************/

// ------------------------------------------------------------------
// These functions use the same 'format' strings as the 
// java.text.SimpleDateFormat class, with minor exceptions.
// The format string consists of the following abbreviations:
// 
// Field        | Full Form          | Short Form
// -------------+--------------------+-----------------------
// Year         | yyyy (4 digits)    | yy (2 digits), y (2 or 4 digits)
// Month        | MMM (name or abbr.)| MM (2 digits), M (1 or 2 digits)
//              | NNN (abbr.)        |
// Day of Month | dd (2 digits)      | d (1 or 2 digits)
// Day of Week  | EE (name)          | E (abbr)
// Hour (1-12)  | hh (2 digits)      | h (1 or 2 digits)
// Hour (0-23)  | HH (2 digits)      | H (1 or 2 digits)
// Hour (0-11)  | KK (2 digits)      | K (1 or 2 digits)
// Hour (1-24)  | kk (2 digits)      | k (1 or 2 digits)
// Minute       | mm (2 digits)      | m (1 or 2 digits)
// Second       | ss (2 digits)      | s (1 or 2 digits)
// AM/PM        | a                  |
//
// NOTE THE DIFFERENCE BETWEEN MM and mm! Month=MM, not mm!
// Examples:
//  "MMM d, y" matches: January 01, 2000
//                      Dec 1, 1900
//                      Nov 20, 00
//  "M/d/yy"   matches: 01/20/00
//                      9/2/00
//  "MMM dd, yyyy hh:mm:ssa" matches: "January 01, 2000 12:30:45AM"
// ------------------------------------------------------------------

var MONTH_NAMES=new Array('Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre','Ene','Feb','Mar','Abr','May','Jun','Jul','Ago','Sep','Oct','Nov','Dic');
var DAY_NAMES=new Array('Domingo','Lunes','Martes','Miercoles','Jueves','Viernes','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
function LZ(x) {return(x<0||x>9?"":"0")+x}

// ------------------------------------------------------------------
// isDate ( date_string, format_string )
// Returns true if date string matches format of format string and
// is a valid date. Else returns false.
// It is recommended that you trim whitespace around the value before
// passing it to this function, as whitespace is NOT ignored!
// ------------------------------------------------------------------
function isDate(val,format) {
	var date=getDateFromFormat(val,format);
	if (date==0) { return false; }
	return true;
	}

// -------------------------------------------------------------------
// compareDates(date1,date1format,date2,date2format)
//   Compare two date strings to see which is greater.
//   Returns:
//   1 if date1 is greater than date2
//   0 if date2 is greater than date1 of if they are the same
//  -1 if either of the dates is in an invalid format
// -------------------------------------------------------------------
function compareDates(date1,dateformat1,date2,dateformat2) {
	var d1=getDateFromFormat(date1,dateformat1);
	var d2=getDateFromFormat(date2,dateformat2);
	if (d1==0 || d2==0) {
		return -1;
		}
	else if (d1 > d2) {
		return 1;
		}
	return 0;
	}

// ------------------------------------------------------------------
// formatDate (date_object, format)
// Returns a date in the output format specified.
// The format string uses the same abbreviations as in getDateFromFormat()
// ------------------------------------------------------------------
function formatDate(date,format) {
	format=format+"";
	var result="";
	var i_format=0;
	var c="";
	var token="";
	var y=date.getYear()+"";
	var M=date.getMonth()+1;
	var d=date.getDate();
	var E=date.getDay();
	var H=date.getHours();
	var m=date.getMinutes();
	var s=date.getSeconds();
	var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
	// Convert real date parts into formatted versions
	var value=new Object();
	if (y.length < 4) {y=""+(y-0+1900);}
	value["y"]=""+y;
	value["yyyy"]=y;
	value["yy"]=y.substring(2,4);
	value["M"]=M;
	value["MM"]=LZ(M);
	value["MMM"]=MONTH_NAMES[M-1];
	value["NNN"]=MONTH_NAMES[M+11];
	value["d"]=d;
	value["dd"]=LZ(d);
	value["E"]=DAY_NAMES[E+7];
	value["EE"]=DAY_NAMES[E];
	value["H"]=H;
	value["HH"]=LZ(H);
	if (H==0){value["h"]=12;}
	else if (H>12){value["h"]=H-12;}
	else {value["h"]=H;}
	value["hh"]=LZ(value["h"]);
	if (H>11){value["K"]=H-12;} else {value["K"]=H;}
	value["k"]=H+1;
	value["KK"]=LZ(value["K"]);
	value["kk"]=LZ(value["k"]);
	if (H > 11) { value["a"]="PM"; }
	else { value["a"]="AM"; }
	value["m"]=m;
	value["mm"]=LZ(m);
	value["s"]=s;
	value["ss"]=LZ(s);
	while (i_format < format.length) {
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
			token += format.charAt(i_format++);
			}
		if (value[token] != null) { result=result + value[token]; }
		else { result=result + token; }
		}
	return result;
	}
	
// ------------------------------------------------------------------
// Utility functions for parsing in getDateFromFormat()
// ------------------------------------------------------------------
function _isInteger(val) {
	var digits="1234567890";
	for (var i=0; i < val.length; i++) {
		if (digits.indexOf(val.charAt(i))==-1) { return false; }
		}
	return true;
	}
function _getInt(str,i,minlength,maxlength) {
	for (var x=maxlength; x>=minlength; x--) {
		var token=str.substring(i,i+x);
		if (token.length < minlength) { return null; }
		if (_isInteger(token)) { return token; }
		}
	return null;
	}
	
// ------------------------------------------------------------------
// getDateFromFormat( date_string , format_string )
//
// This function takes a date string and a format string. It matches
// If the date string matches the format string, it returns the 
// getTime() of the date. If it does not match, it returns 0.
// ------------------------------------------------------------------
function getDateFromFormat(val,format) {
	val=val+"";
	format=format+"";
	var i_val=0;
	var i_format=0;
	var c="";
	var token="";
	var token2="";
	var x,y;
	var now=new Date();
	var year=now.getYear();
	var month=now.getMonth()+1;
	var date=1;
	var hh=now.getHours();
	var mm=now.getMinutes();
	var ss=now.getSeconds();
	var ampm="";

//alert(val+"**"+format)	

	while (i_format < format.length) {
		// Get next token from format string
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
			token += format.charAt(i_format++);
			}
		// Extract contents of value based on format token
		if (token=="yyyy" || token=="yy" || token=="y") {
			if (token=="yyyy") { x=4;y=4; }
			if (token=="yy")   { x=2;y=2; }
			if (token=="y")    { x=2;y=4; }
			year=_getInt(val,i_val,x,y);
			if (year==null) { return 0; }
			i_val += year.length;
			if (year.length==2) {
				if (year > 70) { year=1900+(year-0); }
				else { year=2000+(year-0); }
				}
			}
		else if (token=="MMM"||token=="NNN"){
			month=0;
			for (var i=0; i<MONTH_NAMES.length; i++) {
				var month_name=MONTH_NAMES[i];
				if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()) {
					if (token=="MMM"||(token=="NNN"&&i>11)) {
						month=i+1;
						if (month>12) { month -= 12; }
						i_val += month_name.length;
						break;
						}
					}
				}
			if ((month < 1)||(month>12)){return 0;}
			}
		else if (token=="EE"||token=="E"){
			for (var i=0; i<DAY_NAMES.length; i++) {
				var day_name=DAY_NAMES[i];
				if (val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()) {
					i_val += day_name.length;
					break;
					}
				}
			}
		else if (token=="MM"||token=="M") {
			month=_getInt(val,i_val,token.length,2);
			if(month==null||(month<1)||(month>12)){return 0;}
			i_val+=month.length;}
		else if (token=="dd"||token=="d") {
			date=_getInt(val,i_val,token.length,2);
			if(date==null||(date<1)||(date>31)){return 0;}
			i_val+=date.length;}
		else if (token=="hh"||token=="h") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<1)||(hh>12)){return 0;}
			i_val+=hh.length;}
		else if (token=="HH"||token=="H") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<0)||(hh>23)){return 0;}
			i_val+=hh.length;}
		else if (token=="KK"||token=="K") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<0)||(hh>11)){return 0;}
			i_val+=hh.length;}
		else if (token=="kk"||token=="k") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<1)||(hh>24)){return 0;}
			i_val+=hh.length;hh--;}
		else if (token=="mm"||token=="m") {
			mm=_getInt(val,i_val,token.length,2);
			if(mm==null||(mm<0)||(mm>59)){return 0;}
			i_val+=mm.length;}
		else if (token=="ss"||token=="s") {
			ss=_getInt(val,i_val,token.length,2);
			if(ss==null||(ss<0)||(ss>59)){return 0;}
			i_val+=ss.length;}
		else if (token=="a") {
			if (val.substring(i_val,i_val+2).toLowerCase()=="am") {ampm="AM";}
			else if (val.substring(i_val,i_val+2).toLowerCase()=="pm") {ampm="PM";}
			else {return 0;}
			i_val+=2;}
		else {
			if (val.substring(i_val,i_val+token.length)!=token) {return 0;}
			else {i_val+=token.length;}
			}
		}
	// If there are any trailing characters left in the value, it doesn't match
	if (i_val != val.length) { return 0; }
	// Is date valid for month?
	if (month==2) {
		// Check for leap year
		if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) { // leap year
			if (date > 29){ return 0; }
			}
		else { if (date > 28) { return 0; } }
		}
	if ((month==4)||(month==6)||(month==9)||(month==11)) {
		if (date > 30) { return 0; }
		}
	// Correct hours value
	if (hh<12 && ampm=="PM") { hh=hh-0+12; }
	else if (hh>11 && ampm=="AM") { hh-=12; }
	var newdate=new Date(year,month-1,date,hh,mm,ss);
	return newdate.getTime();
	}

// ------------------------------------------------------------------
// parseDate( date_string [, prefer_euro_format] )
//
// This function takes a date string and tries to match it to a
// number of possible date formats to get the value. It will try to
// match against the following international formats, in this order:
// y-M-d   MMM d, y   MMM d,y   y-MMM-d   d-MMM-y  MMM d
// M/d/y   M-d-y      M.d.y     MMM-d     M/d      M-d
// d/M/y   d-M-y      d.M.y     d-MMM     d/M      d-M
// A second argument may be passed to instruct the method to search
// for formats like d/M/y (european format) before M/d/y (American).
// Returns a Date object or null if no patterns match.
// ------------------------------------------------------------------
function parseDate(val) {
	//var preferEuro=(arguments.length==2)?arguments[1]:false;
	generalFormats=new Array('d-M-y','d MMM y','d MMM,y','d-MMM-y','d MMM','d M y','d/MMM/y','d/MMM','dMy','dMMMy','d.M.Y','d.MMM.y');
	monthFirst=new Array('M/d/y','M-d-y','M.d.y','MMM-d','M/d','M-d','M d','Md','M.d');
	dateFirst =new Array('d/M/y','d-M-y','d.M.y','d-MMM','d/M','d-M','d M','dM','d.M');
	var checkList=new Array('generalFormats','dateFirst','monthFirst');
	var d=null;
	for (var i=0; i<checkList.length; i++) {
		var l=window[checkList[i]];
		for (var j=0; j<l.length; j++) {
			d=getDateFromFormat(val,l[j]);
			if (d!=0) { return new Date(d); }
			}
		}
	return null;
	}
	
/////////////////////////////////////////////////////////////////	

function estandarizaFecha(dia,mes,any){
	if (dia.toString().length==1)
		d = "0" + dia.toString();
	else
		d = dia.toString();
	if (mes.toString().length==1)
		m = "0" + mes.toString();
	else
		m = mes.toString();
	y = any;

	return (d + "/" + m + "/" + y)
}	