function monta_fecha(anio,mes,dia)
{
	s_anio = anio.toString();
	while(s_anio.length < 4)	{		s_anio='0'+s_anio;	}
	
	s_mes = mes.toString();
	while(s_mes.length < 2)	{		s_mes='0'+s_mes;	}
	
	s_dia = dia.toString();
	while(s_dia.length < 2)	{		s_dia='0'+s_dia;	}
	
	return s_anio + '-' + s_mes + '-' + s_dia;
}

function get_hoy()
{
	var currentTime = new Date()
	var month = currentTime.getMonth() + 1
	var day = currentTime.getDate()
	var year = currentTime.getFullYear()

	return monta_fecha(year,month,day);
}

function get_hora()
{
	var currentTime = new Date()
	
	var hora = currentTime.getHours()
	var minuto = currentTime.getMinutes()
	var segundo = currentTime.getSeconds()
	
	var s_hora = hora.toString();
	var s_minuto = minuto.toString();
	var s_segundo = segundo.toString();
	
	while(s_hora.length < 2)	{		s_hora='0'+s_hora;	}
	while(s_minuto.length < 2)	{		s_minuto='0'+s_minuto;	}
	while(s_segundo.length < 2)	{		s_segundo='0'+s_segundo;	}

	return s_hora + ":" + s_minuto + ":" + s_segundo;
}



function get_array_dias_descs(tipo)
{
	var a_return = new Array();

	if(tipo=="cortas")
	{
		a_return[1] = "Lun";
		a_return[2] = "Mar";
		a_return[3] = "Mié";
		a_return[4] = "Jue";
		a_return[5] = "Vie";
		a_return[6] = "Sáb";
		a_return[7] = "Dom";
	}
	else
	{
		a_return[1] = "Lunes";
		a_return[2] = "Martes";
		a_return[3] = "Miércoles";
		a_return[4] = "Jueves";
		a_return[5] = "Viernes";
		a_return[6] = "Sábado";
		a_return[7] = "Domingo";
	}

	return a_return;
}

/**
* @param tipo (posibles: "cortas","largas")
*/
function get_array_meses_descs(tipo)
{
	var a_return = new Array();

	if(tipo=="cortas")
	{
		a_return[1] = 'Ene';
		a_return[2] = 'Feb';
		a_return[3] = 'Mar';
		a_return[4] = 'Abr';
		a_return[5] = 'May';
		a_return[6] = 'Jun';
		a_return[7] = 'Jul';
		a_return[8] = 'Ago';
		a_return[9] = 'Sep';
		a_return[10] = 'Oct';
		a_return[11] = 'Nov';
		a_return[12] = 'Dic';
	}
	else
	{
		a_return[1] = 'Enero';
		a_return[2] = 'Febrero';
		a_return[3] = 'Marzo';
		a_return[4] = 'Abril';
		a_return[5] = 'Mayo';
		a_return[6] = 'Junio';
		a_return[7] = 'Julio';
		a_return[8] = 'Agosto';
		a_return[9] = 'Septiembre';
		a_return[10] = 'Octubre';
		a_return[11] = 'Noviembre';
		a_return[12] = 'Diciembre';
	}

	return a_return;
}

/**
* @param fecha (aaaa-mm-dd)
* @param tipo (posibles: "cortas","largas")
*/
function get_dia_desc(fecha,tipo)
{
	if(tipo!='cortas' && tipo!='largas') return "";

	var a_descs = get_array_dias_descs(tipo);

	var day = get_dia_semana(fecha) + 1;

	return a_descs[day];
}

function get_mes_desc_larga(mes)
{
	meses_largos = get_array_meses_descs("largas");
	return(meses_largos[1*(mes)]);
}

function get_mes_desc_corta(mes)
{
	meses_cortos = get_array_meses_descs("cortas");
	return(meses_cortos[1*(mes)]);
}

function split_fecha(s_fecha)
{
	var fecha_temp = new Array();
	var tmp_fechas = new Array();

	if(trim(s_fecha) == "")
	{
		return false;
	}

	if(s_fecha.match(/^[0-9]{1,2}-[0-9]{1,2}-([0-9]{2}){1,2}$/))
	{
		fecha_temp = s_fecha.split("-");
	}
	else if(s_fecha.match(/^[0-9]{1,2}\/[0-9]{1,2}\/([0-9]{2}){1,2}$/))
	{
		fecha_temp = s_fecha.split("/");
	}
	else if(s_fecha.match(/^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$/))
	{
		tmp_fechas = s_fecha.split("-");

		fecha_temp[2] = tmp_fechas[0];
		fecha_temp[1] = tmp_fechas[1];
		fecha_temp[0] = tmp_fechas[2];
	}
	else if(s_fecha.match(/^[0-9]{4}\/[0-9]{1,2}\/[0-9]{1,2}$/))
	{
		tmp_fechas = s_fecha.split("-");

		fecha_temp[2] = tmp_fechas[0];
		fecha_temp[1] = tmp_fechas[1];
		fecha_temp[0] = tmp_fechas[2];
	}
	else
	{
		return false;
	}

	///////////////////////////////////////////////////////////////
	// correccion del año:
	fecha_temp[2] = 1*(fecha_temp[2]);

	if(fecha_temp[2] < 69) { fecha_temp[2] += 2000; }
	else if(fecha_temp[2] < 100) { fecha_temp[2] += 1900; }

	if (!checkdate(fecha_temp[1],fecha_temp[0],fecha_temp[2]))
	{
		return false;
	}

	return fecha_temp;
}

function parse_input_fecha(s_fecha)
{
	var fecha_temp = new Array();
	var tmp_fechas = new Array();

	if(trim(s_fecha) == "")
	{
		return(new Array(1,"0000-00-00"));
	}

	if(s_fecha.match(/^[0-9]{1,2}-[0-9]{1,2}-([0-9]{2}){1,2}$/))
	{
		fecha_temp = s_fecha.split("-");
	}
	else if(s_fecha.match(/^[0-9]{1,2}\/[0-9]{1,2}\/([0-9]{2}){1,2}$/))
	{
		fecha_temp = s_fecha.split("/");
	}
	else if(s_fecha.match(/^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$/))
	{
		tmp_fechas = s_fecha.split("-");

		fecha_temp[2] = tmp_fechas[0];
		fecha_temp[1] = tmp_fechas[1];
		fecha_temp[0] = tmp_fechas[2];
	}
	else if(s_fecha.match(/^[0-9]{4}\/[0-9]{1,2}\/[0-9]{1,2}$/))
	{
		tmp_fechas = s_fecha.split("-");

		fecha_temp[2] = tmp_fechas[0];
		fecha_temp[1] = tmp_fechas[1];
		fecha_temp[0] = tmp_fechas[2];
	}
	else
	{
		return(new Array(2,"0000-00-00"));
	}

	///////////////////////////////////////////////////////////////
	fecha_temp[2] = 1*(fecha_temp[2]);

	if(fecha_temp[2] < 69) { fecha_temp[2] += 2000; }
	else if(fecha_temp[2] < 100) { fecha_temp[2] += 1900; }


	if (!checkdate(fecha_temp[1],fecha_temp[0],fecha_temp[2]))
	{
		return(new Array(2,"0000-00-00"));
	}
	else
	{
		var fecha_return = fecha_temp[2] + '-' + fecha_temp[1] + '-' + fecha_temp[0];
	}

	var fecha_return = fecha_temp[2] + '-' + fecha_temp[1] + '-' + fecha_temp[0];

	var a_return = new Array();
	a_return[0] = 0;
	a_return[1] = fecha_return;

	return a_return;
}

function get_formato_fecha(s_formato,s_fecha)
{

	s_fecha = s_fecha.replace(/^([0-9]+-[0-9]+-[0-9]+)[^0-9]+.*$/,"\\1");

	if(s_fecha=="")
	{
		s_fecha = new Date("Y-m-d");
	}

	if(s_formato=="") { s_formato = "basic"; }

	if(s_fecha=="0000-00-00") { return "-"; }

	var tmp_fecha = s_fecha.split('-');
	var anyo 			= tmp_fecha[0];
	var mes  			= tmp_fecha[1];
	var dia  			= tmp_fecha[2];


	switch (s_formato)
	{
		case "short1": return(dia+" " + get_mes_desc_corta(1*(mes)) + " " + anyo);
		case "short2": return(dia+" - " + get_mes_desc_corta(1*(mes)) + " - " + anyo);
		case "short3": return(dia+" de " + get_mes_desc_corta(1*(mes)) + " de " + anyo);
		case "short4": return(dia+"-" + get_mes_desc_corta(1*(mes)) + "-" + anyo);

		case "num1": return(dia+"/"+mes+"/"+anyo);
		case "num2": return(dia+"-"+mes+"-"+anyo);

		case "shortdialong1": return(get_dia_desc(s_fecha,"cortas")+" "+dia+" "+get_mes_desc_larga(1*(mes))+" "+anyo);
		case "shortdialong2": return(get_dia_desc(s_fecha,"cortas")+" - "+dia+" - "+get_mes_desc_larga(1*(mes))+" - "+anyo);
		case "shortdialong2": return(get_dia_desc(s_fecha,"cortas")+", "+dia+" de "+get_mes_desc_larga(1*(mes))+" de "+anyo);

		case "dialong1": return(get_dia_desc(s_fecha,"largas")+" "+dia+" "+get_mes_desc_larga(1*(mes))+" "+anyo);
		case "dialong2": return(get_dia_desc(s_fecha,"largas")+" - "+dia+" - "+get_mes_desc_larga(1*(mes))+" - "+anyo);
		case "dialong2": return(get_dia_desc(s_fecha,"largas")+", "+dia+" de "+get_mes_desc_larga(1*(mes))+" de "+anyo);

		case "long1": return(1*(dia)+" "+get_mes_desc_larga(1*(mes))+" "+anyo);
		case "long2": return(1*(dia)+" - "+get_mes_desc_larga(1*(mes))+" - "+anyo);
		case "long3": return(1*(dia)+" de "+get_mes_desc_larga(1*(mes))+" de "+anyo);

		case "sin_dia_short1": return(get_mes_desc_corta(1*(mes))+". "+anyo);
		case "sin_dia_long1": return(get_mes_desc_larga(1*(mes))+" "+anyo);
		default: return($fecha);
	}
}

function diferencia_fechas(fecha_inicio,fecha_fin)
{
	var tmp_input_fecha = parse_input_fecha(fecha_inicio);

	if(tmp_input_fecha[0] > 0)
	{
		//alert("error_inicio" + fecha_inicio + ' ' + fecha_fin);
		return 0;
	}

	var tmp_fecha = tmp_input_fecha[1];

	var tmp_fecha = tmp_fecha.split('-');
	var anyo 			= tmp_fecha[0];
	var mes  			= tmp_fecha[1];
	var dia  			= tmp_fecha[2];

	var  date_fecha_inicio = new Date(anyo,mes - 1,dia)


	var tmp_input_fecha = parse_input_fecha(fecha_fin);
	if(tmp_input_fecha[0] > 0)
	{
		//alert("error_fin" + fecha_inicio + ' ' + fecha_fin);
		return 0;
	}

	var tmp_fecha = tmp_input_fecha[1];

	var tmp_fecha = tmp_fecha.split('-');
	var anyo 			= tmp_fecha[0];
	var mes  			= tmp_fecha[1];
	var dia  			= tmp_fecha[2];

	var  date_fecha_fin = new Date(anyo,mes - 1,dia)


	var diferencia = date_fecha_fin - date_fecha_inicio;
	var diferenciaSegundos = diferencia / 1000;

	return diferenciaSegundos;
}

function get_dias_entre(fecha_inicio,fecha_fin)
{
	return diferencia_fechas(fecha_inicio,fecha_fin) / (3600 * 24);
}

function checkdate(m,d,y)
{
  if (m<1 || m>12)  return(false);
  if (d<1 || d>31)  return(false);
  if (m==4 || m==6 || m==9 || m==11)
    if (d==31) return(false);

  if (m==2)
  {
    if (d>29)     return(false);
    if (d==29 && !is_bisiesto(y)) return(false);
  }
  return(true);
}

function is_bisiesto(anyo)
{
	if( (anyo % 4 == 0) && (anyo % 100 != 0 || anyo % 400 == 0) ) return true;

	return false;
}


/**
* Devuelve la fecha trascurridos X dias desde la fecha origen
* @return fecha trascurridos X dias desde la fecha origen
* @param fecha origen
* @param dias a sumar
*/
function get_fecha_tras_dias(fecha,dias)
{
	var tmp_input_fecha = parse_input_fecha(fecha);
	var tmp_fecha = tmp_input_fecha[1].split('-');

	var date_obj = new Date(tmp_fecha[0]*1,tmp_fecha[1]*1 - 1,tmp_fecha[2]*1 + dias*1);

	i_year  = date_obj.getFullYear();
	i_month = date_obj.getMonth() + 1;
	i_day   = date_obj.getDate();

	i_month < 10 ? i_month = '0'+i_month : '';
	i_day   < 10 ? i_day   = '0'+i_day   : '';

	return i_year + '-' + i_month + '-' + i_day;
}

/**
* Devuelve la fecha trascurridos X meses desde la fecha origen
* @return fecha trascurridos X meses desde la fecha origen
* @param fecha origen
* @param meses a sumar
*/

function get_fecha_tras_meses(fecha,meses)
{
	var tmp_input_fecha = parse_input_fecha(fecha);
	var tmp_fecha = tmp_input_fecha[1].split('-');

	var date_obj = new Date(tmp_fecha[0]*1,(tmp_fecha[1]*1 - 1)+ (meses*1),tmp_fecha[2]*1);

	i_year  = date_obj.getFullYear();
	i_month = date_obj.getMonth() + 1;
	i_day   = date_obj.getDate();

	i_month < 10 ? i_month = '0'+i_month : '';
	i_day   < 10 ? i_day   = '0'+i_day   : '';

	return i_year + '-' + i_month + '-' + i_day;
}

/**
* Devuelve la fecha trascurridos X dias desde la fecha origen
* @return fecha trascurridos X dias desde la fecha origen
* @param fecha origen
* @param dias a sumar
*/
function get_fecha_tras_dias_solo_laborables(fecha,dias)
{
	var tmp_input_fecha = parse_input_fecha(fecha);
	var tmp_fecha = tmp_input_fecha[1].split('-');

	var old_date_obj = new Date(tmp_fecha[0]*1,tmp_fecha[1]*1 - 1,tmp_fecha[2]*1);

	dias = dias*1;

	var offset_semana = ((old_date_obj.getDay()+6)%7);
	var signo = (dias>0?1:-1);
	var dias_abs = signo*dias;

	dias_extras = 0;
	offset_bis = 0;
	if(offset_semana>4) // sabado o domingo
	{
		dias_extras = (signo>0?7-offset_semana:offset_semana-4); // si sabado o domingo, +1 o +2 / +2 o +1
	}
	else
	{
		offset_bis = (signo>0?offset_semana:4-offset_semana); // de Lunes a Viernes, sumando: de 0->4 restando: de 4->0
	}

	num_weekends = parseInt(1*((dias_abs+offset_bis)) / 5);

	$dias += $signo*(2*$num_weekends+$dias_extras);

	return get_fecha_tras_dias(tmp_input_fecha[1],dias);
}