// Librería para la gestión del calendario

// Variables globales
var Fecha;
var Meses=['Ene','Feb','Mar','Abr','May','Jun','Jul','Ago','Sep','Oct','Nov','Dic'];
var DiasPorMes=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
IE4 = document.all ? 1:0;
NN6IE5 = document.getElementById ? 1:0;
NN4 = document.layers ? 1:0;

//	destino -> objeto del formulario donde se escribirá la fecha
function escribeDestinoFecha(dia, mes, agno, destino, capa) {
    var des=document.getElementById(destino);
    var anterior=des.value;
    if(dia < 10){
      dia = '0' + dia;
    }
    if(mes < 10) {
      mes = '0' + mes;
    }
    var valueFecha = dia+"/"+mes+"/"+agno;
    if (compruebaFechaValida(valueFecha)) { 
        des.value=valueFecha;

        mostrarSelects();

        if (NN4) {
            document.layers[capa].visibility='hide';
        } else if (NN6IE5) {
            document.getElementById(capa).style.visibility='hidden';
        } else if (IE4) {
            document.all[capa].style.visibility='hidden';
        }
    } else {
        alert(MSJ_FECHA_FORMATO);
        des.value='';
    }
    if (anterior!=valueFecha&&des.onchange){
        des.onchange();
    }
}

// capa -> capa destino donde se escribirá el calendario
function escribeCalendarioCapa(dia,mes,agno,diaSel,mesSel,agnoSel,destino,capa) {
    var cal = String();
    
    var fechaSel;
    if (diaSel!='' && mesSel!='' && agnoSel!=''){
        fechaSel=new Date();
        fechaSel.setDate(diaSel);
        fechaSel.setMonth(mesSel);
        fechaSel.setFullYear("" + agnoSel);
    }
    // Inicializamos la fecha
    var fechaCalendario = new Date();
    fechaCalendario.setDate(1);
    fechaCalendario.setMonth(mes);
    fechaCalendario.setFullYear("" + agno)
    // Calculamos si estamos en un año bisiesto y actualizamos los dias por mes
    var EsteAgno = fechaCalendario.getFullYear();
    if (((EsteAgno % 4 == 0) && (EsteAgno % 100 != 0)) || (EsteAgno % 400 == 0)){DiasPorMes[1] = 29;}
    else{DiasPorMes[1] = 28;}
    
    // Calculamos el día de la semana
    primerDia = fechaCalendario.getDay();
    
    if (primerDia == 0) primerDia = 6;	// Para nosotros el domingo será el último
    else primerDia = primerDia -1;
    
    // Calculamos el número de días que tiene el mes
    EsteMes = fechaCalendario.getMonth();
    numeroDias = DiasPorMes[EsteMes];
    
    // variables para el mes y año anterior y posterior
    var mesanterior = fechaCalendario.getMonth();
    var agnoanterior = agno;
    mesanterior--;
    if (mesanterior==-1) {
        mesanterior=11;
        agnoanterior--;
    } 
    var messiguiente = fechaCalendario.getMonth();
    var agnosiguiente = agno;
    messiguiente++;
    if (messiguiente==12) {
        messiguiente = 0;
        agnosiguiente++;
    }
    var agnomasuno=parseInt(agno)+1;
    var agnomenosuno=parseInt(agno)-1;
    var hayagnoanterior=true;
    if(agnomenosuno==0){hayagnoanterior=false;}
    var mesactual=fechaCalendario.getMonth();
    var haymesanterior=true;
    if(!hayagnoanterior&&mesactual==0){haymesanterior=false;}

    // Cabecera mes y año
    cal = cal + "<div class=\"fila_agenda_top\">";
    if(haymesanterior){
        cal = cal + "<a href='#BTN_" + destino +"' title='Mes anterior' style='border: none;' onclick='escribeCalendarioCapa(\""+dia+"\",\""+mesanterior+"\",\""+agnoanterior+"\",\""+diaSel+"\",\""+mesSel+"\",\""+parseInt(agnoSel,10)+"\",\"" + destino+ "\",\"" + capa +"\");return false;' onkeypress='escribeCalendarioCapa(\""+dia+"\",\""+mesanterior+"\",\""+agnoanterior+"\",\""+diaSel+"\",\""+mesSel+"\",\""+parseInt(agnoSel,10)+"\",\"" + destino+ "\",\"" + capa +"\");return false;'>";
        cal = cal + "<img border='0' src='" + CONTEXTO + "/imagenes/buscardor-menos.gif' alt='Mes anterior' />";
        cal = cal + "</a>";        
    }else{
        cal = cal + "&nbsp;";
    }
    cal = cal + "&nbsp;";
    cal = cal + Meses[fechaCalendario.getMonth()];
    cal = cal + "&nbsp;";
    cal = cal + "<a href='#BTN_" + destino + "' title='Mes posterior' style='border: none;' onclick='escribeCalendarioCapa(\""+dia+"\",\""+messiguiente+"\",\""+agnosiguiente+"\",\""+diaSel+"\",\""+mesSel+"\",\""+parseInt(agnoSel,10)+"\",\"" + destino+ "\",\"" + capa +"\");return false;' onkeypress='escribeCalendarioCapa(\""+dia+"\",\""+messiguiente+"\",\""+agnosiguiente+"\",\""+diaSel+"\",\""+mesSel+"\",\""+parseInt(agnoSel,10)+"\",\"" + destino+ "\",\"" + capa +"\");return false;'>";
    cal = cal + "<img border='0' src='" + CONTEXTO + "/imagenes/buscardor-mas.gif' alt='Mes posterior' />";
    cal = cal  + "</a>&nbsp;&nbsp;";
    if (hayagnoanterior){
        cal = cal + "<a href='#BTN_" + destino + "' title='Año anterior' style='border: none;' onclick='escribeCalendarioCapa(\""+dia+"\",\""+mesactual+"\",\""+agnomenosuno+"\",\""+diaSel+"\",\""+mesSel+"\",\""+parseInt(agnoSel,10)+"\",\"" + destino+ "\",\"" + capa +"\");return false;' onkeypress='escribeCalendarioCapa(\""+dia+"\",\""+mesactual+"\",\""+agnomenosuno+"\",\""+diaSel+"\",\""+mesSel+"\",\""+parseInt(agnoSel,10)+"\",\"" + destino+ "\",\"" + capa +"\");return false;'>";
        cal = cal + "<img border='0' src='" + CONTEXTO + "/imagenes/buscardor-menos.gif' alt='Año anterior' />";
        cal = cal + "</a>";
    }else{
        cal = cal + "&nbsp;";
    }
    cal = cal + "&nbsp;";
    cal = cal + parseInt(fechaCalendario.getFullYear(),10);
    cal = cal + "&nbsp;";
    cal = cal + "<a href='#BTN_" + destino +"' title='Año posterior' style='border: none;' onclick='escribeCalendarioCapa(\""+dia+"\",\""+mesactual+"\",\""+agnomasuno+"\",\""+diaSel+"\",\""+mesSel+"\",\""+parseInt(agnoSel,10)+"\",\"" + destino+ "\",\"" + capa +"\");return false;' onkeypress='escribeCalendarioCapa(\""+dia+"\",\""+mesactual+"\",\""+agnomasuno+"\",\""+diaSel+"\",\""+mesSel+"\",\""+parseInt(agnoSel,10)+"\",\"" + destino+ "\",\"" + capa +"\");return false;'>";
    cal = cal + "<img border='0' src='" + CONTEXTO + "/imagenes/buscardor-mas.gif' alt='Año posterior' />";
    cal = cal + "</a>";
    cal = cal + "</div>";
    cal = cal + "<br/>";
    
    // Cabecera días de la semana
    cal = cal + "<div class='fila_agenda_semana'>";
    cal = cal + "<span class='dia_semana'>L</span>";
    cal = cal + "<span class='dia_semana'>M</span>";
    cal = cal + "<span class='dia_semana'>X</span>";
    cal = cal + "<span class='dia_semana'>J</span>";
    cal = cal + "<span class='dia_semana'>V</span>";
    cal = cal + "<span class='dia_semana'>S</span>";
    cal = cal + "<span class='dia_semana'>D</span>";
    cal = cal + "</div>";
    cal = cal + "<br/>";
    
    // Escribimos los espacios en blanco en la primera fila
    cal = cal + "<div class='fila_agenda'>";
    columna = 0;
    for (i=0; i<primerDia; i++){
        cal = cal + "<span class='dia_semana_vacio'>&nbsp;</span>";
        columna++;
    }
    
    // Escribimos los días
    for (i=1; i<=numeroDias; i++) {
        var fechaHoy=new Date();
        fechaHoy.setDate(i);
        fechaHoy.setMonth(mes);
        fechaHoy.setFullYear("" + agno);
        var estilo="dias";
        if (fechaSel && fechaSel != null && fechaHoy.getFullYear()==fechaSel.getFullYear() && fechaHoy.getMonth()==fechaSel.getMonth() && fechaHoy.getDate()==fechaSel.getDate()){
            estilo="diasSelected";
        }
        cal = cal + "<a href='#BTN_" + destino + "' class='dia_semana' title='Ver día' onclick='escribeDestinoFecha(" + i + "," + (EsteMes+1) + "," + EsteAgno + ",\"" + destino + "\",\"" + capa + "\");return false;' onkeypress='escribeDestinoFecha(" + i + "," + (EsteMes+1) + "," + EsteAgno + ",\"" + destino + "\",\"" + capa + "\");return false;'>";
        cal = cal + '' + i;
        cal = cal + "</a>";
        columna++;
        if (columna==7 && i!=numeroDias){
            columna=0;
        }
    }
    cal = cal + "</div>";    
    cal = cal + "<div class='calendario_cerrar' ><a id='botonCerrar' href='#BTN_" + destino + "' onclick='cerrarCalendario(\""+capa+"\");return false;' onkeypress='cerrarCalendario(\""+capa+"\");return false;'>[Cerrar]</a></div>";
    
    // Mostramos la capa
    if (NN4) {
        document.layers[capa].document.open();
        document.layers[capa].document.write(cal);
        document.layers[capa].document.close();
        document.layers[capa].visibility = "show";
        document.layers[capa].display = "block";
    }else if (NN6IE5) {
        document.getElementById(capa).innerHTML=cal;
        document.getElementById(capa).style.visibility = "visible";
        document.getElementById(capa).style.display = "block";
    } else if (IE4) {
        document.all[capa].innerHTML = cal;
        document.all[capa].style.visibility = "visible";
        document.all[capa].style.display = "block";
    }
}

function cerrarCalendario(capa) {
    mostrarSelects();
    
    if (NN4) {
        document.layers[capa].visibility='hide';
        document.layers[capa].display='none';
    }else if (NN6IE5) {
        document.getElementById(capa).style.visibility='hidden';
        document.getElementById(capa).style.display='none';
    } else if (IE4) {
        document.all[capa].style.visibility='hidden';
        document.all[capa].style.display='none';
    }
}

function calendario(destino,capa) {
    var fec = new Date();
    var d=document.getElementById(destino);
    var selected=false;
    if(d.value!="" && d.value.length==10 && d.value != "DD/MM/AAAA"){
        var trozos=d.value.split("/");
        if (trozos.length==3) {
            if (trozos[0].length==2 && trozos[0].charAt(0)=='0') {
                trozos[0] = trozos[0].substring(1);
            }
            if (trozos[1].length==2 && trozos[1].charAt(0)=='0') {
                trozos[1] = trozos[1].substring(1);
            }
            fec.setDate(parseInt(trozos[0]));
            fec.setMonth(parseInt(trozos[1]) - 1);
            fec.setYear(parseInt(trozos[2]));
            selected=true;
        }
    }
    var dia = fec.getDate();
    var mes = fec.getMonth();
    var ano = fec.getFullYear();
    if (selected){
        var str = escribeCalendarioCapa(dia,mes,ano,dia,mes,ano,destino,capa);
    }else{
        var str = escribeCalendarioCapa(dia,mes,ano,'','','',destino,capa);
    }
}

function verCalendario(campo, capa) {
    var divs=document.getElementsByTagName("div");
    for (var i=0;i<divs.length;i++){
        var name=divs[i].id;
        if(name.indexOf("cal__cal__")>=0){
            var visible=false;
            if (NN4&&divs[i].style.visibility=="show"){visible=true;}
            else if(NN6IE5&&divs[i].style.visibility=="visible"){visible=true;}
            else if(IE4&&divs[i].style.visibility=="visible"){visible=true;}
            if (visible){
                cerrarCalendario(name);
            }
        }
    }
    ocultarSelects();
    calendario(campo, capa);
}

// Función para validar fechas



// Valida número coma flotante
function isFloat(s){
    var i;
    var seenDecimalPoint=false;

    if (isEmpty(s)) 
       if (isFloat.arguments.length == 1) return true;
       else return (isFloat.arguments[1] == true);

    if (s == '.') return false;

    // Search through string's characters one by one
    // until we find a non-numeric character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);

        if ((c == '.') && !seenDecimalPoint) seenDecimalPoint = true;
        else if (!isDigit(c)) return false;
    }

    // All characters are numbers.
    return true;
}

function isEmpty(s){return s==null||s.length == 0}
function isDigit(c){return c>="0"&&c<="9"}
