﻿var diasActivos = new Array();
var utilizarActivos = true;

/** numMonth : numero de meses a mostrar - 1 */
function displayDatePicker(dateFieldName, displayBelowThisObject, dtFormat, dtSep, dataPickerFunction, minDate, maxDate, multiMonth, numMonth,diasActiv)
{
    // **********************************************************************************
    // Guardamos las variables que luego utilizaremos...
    // **********************************************************************************
    if (diasActiv != null) { diasActivos = diasActiv; } else { utilizarActivos = false }
    if ((diasActivos != null && diasActivos.length > 0) & (minDate == null || minDate == '') & (maxDate == null || maxDate == '')) {
       var fMin = new Date();
       var fMax = new Date();
       for (i=0;i<diasActivos.length;i++) {
          if (fMin>diasActivos[i] || i==0) fMin = diasActivos[i];
          if (fMax<diasActivos[i] || i==0) fMax = diasActivos[i];
      }
       if (minDate == null || minDate == '') {dateMinDate = getDateString(fMin); } else {dateMinDate = minDate};
       if (maxDate == null || maxDate == '') { dateMaxDate = getDateString(fMax); } else { dateMaxDate = maxDate };
    
    }else {
        dateMinDate=minDate;
        dateMaxDate = maxDate;
    }
    
    dataPickerFunctionClose=dataPickerFunction;
    var targetDateField = document.getElementById(dateFieldName);
    targetDateField.focus();
    if (displayBelowThisObject==null) { displayBelowThisObject = targetDateField; }
    if (dtSep) { dateSeparator = dtSep; } else { dateSeparator = defaultDateSeparator; }
    if (dtFormat) { dateFormat = dtFormat; } else { dateFormat = defaultDateFormat; }
    
    var x = displayBelowThisObject.offsetLeft;
    var y = displayBelowThisObject.offsetTop + displayBelowThisObject.offsetHeight ;
    var parent = displayBelowThisObject;
    while (parent.offsetParent) {
        parent = parent.offsetParent;
        x += parent.offsetLeft;
        y += parent.offsetTop ;
    }

    // **********************************************************************************
    // Creasmo el Calendario....
    // **********************************************************************************
    drawDatePicker(targetDateField, x, y , multiMonth, numMonth);
}

function drawDatePicker(targetDateField, x, y, multiMonth, numMonth)
{
    // **********************************************************************************
    // Si el div no existe lo creamos...
    // **********************************************************************************
    if (!document.getElementById(datePickerID)) {
        
        var newNodetbl = document.createElement("table");
        var newNodetbody = document.createElement("tbody"); 
        var newNodetr = document.createElement("tr");
        var newNodetd = document.createElement("td");
        var newNodediv = document.createElement("div");  
        
        newNodetbl.setAttribute("cellpadding", "0");
        newNodetbl.setAttribute("cellspacing", "0");
        newNodetbl.setAttribute("id", datePickerID);

        newNodetd.setAttribute("id", datePickerDivID);
        newNodetr.appendChild (newNodetd);
        newNodetbody.appendChild(newNodetr);
        newNodetbl.appendChild (newNodetbody); 
        document.body.appendChild(newNodetbl);
    }

    // **********************************************************************************
    // Pone los atributos al DIV Creado...
    // **********************************************************************************
    var picker = document.getElementById(datePickerID);
    var pickerDiv = document.getElementById(datePickerDivID);
    picker.style.left = x + "px";
    picker.style.top = y + "px";
    picker.style.visibility = "visible";
    picker.style.display = "block";
    
    picker.style.zIndex = 10000;

    // **********************************************************************************
    // Establece la fecha del campoFecha y el dia...
    // **********************************************************************************
    var dt = getFieldDateShortMonth(targetDateField.value);

    var dia_= dt.getDate(); //Aqui se especifica el día inicial seleccionado
    if (targetDateField.value == '') dia_ = null;

    
    // **********************************************************************************
    // Ya podemos mostrar el DIV...
    // **********************************************************************************
    refreshDatePicker(targetDateField.id, dt.getFullYear(), dt.getMonth(), dia_, multiMonth, numMonth);
}


function refreshDatePicker(dateFieldName, year, month, day, multiMonth, numMonth)
{
    
     // **********************************************************************************
    // Establece si hemos pasado días activos
    // **********************************************************************************
    var activosFecha;
    if (diasActivos!=null) {
        activosFecha = diasActivosArrToString(diasActivos, dateFormat, " ");
    }
    
     
    // **********************************************************************************
    // Establece la fecha con la que trabajaremos, por defecto, el dia 1 del mes recibido
    // **********************************************************************************
    var daySelected = day;

    var thisDay = new Date();
    if ((month >= 0) && (year > 0)) {
        thisDay = new Date(year, month, 1);
    } else {
        day = thisDay.getDate();
        thisDay.setDate(1);
    }
  
    // **********************************************************************************
    // Aqui ponemos la fecha para cuando se mueve entre meses...
    // **********************************************************************************
    var objT=document.getElementById(dateFieldName);
    if ((objT) && (objT.value!=''))  {
        var dt = getFieldDate(objT.value);
        if ((thisDay.getMonth()==dt.getMonth()) && (thisDay.getFullYear()==dt.getFullYear())) {
            day=dt.getDate();
        } else {
            day='';
        }
    }

    // **********************************************************************************
    // Composición de las tabla... (TDs, Trs, Etc.)
    // **********************************************************************************
    var crlf = "\r\n";
    var DIV = "<div>";
    var DIV_main = "<div class='calendario'>";
    var DIV_calendariocab = "<div class='calMesCabecera'>"
    var DIV_headercontenedor = "<div class='calContenedorCabecera'>"
    var DIV_headerIzq = "<div class='calCabeceraIzq'>"
    var DIV_header = "<div class='calCabecera'>"
    var IFRAME = "<iframe></iframe>";
    var SPAN_prevmonth = "<span class='calPrevMonth'>"
    var SPAN_nextmonth = "<span class='calNextMonth'>"
    var SPAN_titulomes = "<span class='tituloMes'>";
    var SPAN_texto = "<span class='textoTituloCalendario'>"
    var DIV_month = "<div class='calMonth'>";
    var DIV_monthtitleLeft = "<div class='calMonthTitleLeft'>";
    var DIV_monthtitleRight = "<div class='calMonthTitleRight'>";
    var DIV_selected = "<div class='calDayHighlight'>";
    var DIV_clear = "<div style='clear:both'>";
    var DIV_buttonDivCerrar = "<div class='buttonDivCerrar'>";
    var DIV_buttonDivToday = "<div class='buttonDivToday'>";
    var DIV_lineaCalendarioTop = "<div class='lineaCalendarioTop'>";
    var DIV_lineaCalendarioBot = "<div class='lineaCalendarioBot'>";
    var DIV_titulomesIzq = "<div class='tituloMesRight'>";
    var DIV_nextmontIzq = "<div class='calNextMonthRight'>"

    var SPAN_ini="<span class='calFechaHoy'>";
    
    var TABLE = "<table cols=7 class='calTable' cellspacing='1' cellpadding='0'><tbody>" + crlf; 
    var TR = "<tr class='calTR'>";
    var TR_title = "<tr class='calTitleTR'>";
    var TR_days = "<tr class='calDayTR'>";
    var TR_todaybutton = "<tr class='calTodayButtonTR'>";
    // ** TD *****************************************************************************
    var TD = "<td class='calTD' onMouseOut='this.className=\"calTD\";' onMouseOver=' this.className=\"calTDHover\";' ";    // leave this tag open, because we'll be adding an onClick event
    var TDNoSeleccionable = "<td class='calTDNS' ";    // leave this tag open, because we'll be adding an onClick event
    var TD_selected = "<td class='calDayHighlightTD' onMouseOut='this.className=\"calDayHighlightTD\";' onMouseOver='this.className=\"calTDHover\";' ";    // leave this tag open, because we'll be adding an onClick event
    var TD_selectedNoSeleccionable = "<td class='calDayHighlightTDNS' ";    // leave this tag open, because we'll be adding an onClick event
    // ** TD *****************************************************************************
    var TD_title = "<td colspan=5 class='calTitleTD'>";
    var TD_buttons = "<td class='calButtonTD'>";
    var TD_todaybutton = "<td colspan=7 class='calTodayButtonTD'>";
    var TD_days = "<td class='calDayTD'>";
   
   
    var xTD = "</td>" + crlf;
    var xTR = "</tr>" + crlf;
    var xTABLE = "</tbody></table>" + crlf;         
    var xDIV = "</div>" + crlf;
    var xSPAN = "</span>" + crlf;
    var xIFRAME = "</iframe>" + crlf;
    var xSELECT = "</select>" + crlf;
 


    // **********************************************************************************
    // Ok, generamos el calendario...
    // **********************************************************************************
    var html = '';
    dateMinDate
    dateMaxDate
    var fechaTmp1 = StringToDate(dateMinDate, dateFormat);
    var fechaTmp2 = StringToDate(dateMaxDate, dateFormat);
    var DiasFaltantes = "<td>&nbsp;" + xTD;
    
    
    html += DIV_main;
    html += IFRAME;
    html += DIV;
    // ********************************************************************************
    // Row de los titulos y botones para avanzar y retroceder...
    // ********************************************************************************
    
    // ********************************************************************************
    // Row de los Dias...
    // ********************************************************************************
    var z = 0;
    if (multiMonth) z = numMonth;
    for (j = 0; j <= z; j++) {
    

        html += DIV_calendariocab
             
        html += DIV_headercontenedor;


        if (j == 0) {
            html += DIV_headerIzq;
            var tmp1 = new Date();
            tmp1.setTime(parseInt(thisDay.getTime() - (3600 * 24 *  1000)))
            if (fechaTmp1 < tmp1)
                html += SPAN_prevmonth + getButtonCode(dateFieldName, thisDay, -1, "&lt;", multiMonth, numMonth) + xSPAN;
        }

        if (j != 0) {
            html += DIV_header;
            if (j == z) {
                html += DIV_titulomesIzq + monthArrayLong[thisDay.getMonth()] + " " + thisDay.getFullYear() + xDIV;
            } else {
                html += SPAN_titulomes + monthArrayLong[thisDay.getMonth()] + " " + thisDay.getFullYear() + xSPAN;
            }
        } else {

            /**  SELECTOR DE MESES **/
            html += "<select id='monthsCalendar' class='selector_calendario' onChange='getSelectDataMonth(\"" + dateFieldName + "\"," + thisDay.getDate() + "," + thisDay.getMonth() + "," + thisDay.getFullYear() + ","  +  multiMonth + ", " + numMonth + " );'>";
            for (i = 0; i <= 11; i++) {

                if (thisDay.getMonth() == i) {
                    html += "<option value='" + i +  "'  selected>" + monthArrayShort[i] + "</option>";
                } else {
                html += "<option value='" + i + "'>" + monthArrayShort[i] + "</option>";
                }
            }
            html += xSELECT;

            /** SELECTOR DE AÑOS **/
            html += "<select id='yearsCalendar' class='selector_calendario' onChange='getSelectDataYear(\"" + dateFieldName + "\"," + thisDay.getDate() + "," + thisDay.getMonth() + "," + thisDay.getFullYear() + "," + multiMonth + ", " + numMonth + " );'>";
            for (i = fechaTmp1.getFullYear(); i <= fechaTmp2.getFullYear(); i++) {
                if (thisDay.getFullYear() == i) {
                    html += "<option value='" + i + "' selected onChange=''>" + i + "</option>";
                } else {
                    html += "<option value='" + i + "' onChange=''>" + i + "</option>";
                }
            }
            html += xSELECT;
        }
        if (j == z) {
            var tmp2 = new Date();
            tmp2.setTime(parseInt(thisDay.getTime() + (3600 * 24 * 31 * 1000)))
            if (tmp2 < fechaTmp2 )
                html += DIV_nextmontIzq + getButtonCode(dateFieldName, thisDay, 1, "&gt;", multiMonth, numMonth) + xDIV;
        }

        html += xDIV;
        html += xDIV;

        html += DIV_clear;
        html += xDIV;
        var diaspintados = 0;
        html += DIV_month;
        
        html += TABLE;
        html += TR_days;
            for(i = 0; i < dayArrayShort.length; i++) { 
                html += TD_days + dayArrayShort[i] + xTD; 
            }
            
        html += xTR;
        // ********************************************************************************
        // Calendario en sí...
        // ********************************************************************************
        html += TR;


        // ********************************************************************************
        // Pintamos los dias que van en blanco...
        // ********************************************************************************
        var dayW = thisDay.getDay();
        //Aqui cambiamos para que el lunes sea el primer dia de la semana y no el domingo
        //if (dayW==0) dayW=7;
        for (i = 0; i < dayW; i++) {

            // ********************************************************************************
            // Definimos el dia con el que vamos a trabajar.. (es un loop dia a dia)
            // ********************************************************************************
            var daySubstract = new Date();

            daySubstract.setYear(thisDay.getYear());
            daySubstract.setMonth(thisDay.getMonth());
            daySubstract.setDate(thisDay.getDate() - parseInt(dayW - i));
            dayNum = daySubstract.getDate();

            // ********************************************************************************
            // Preparamos el TD que pintaremos, y que el usuario podra clickear para elegir un dia...
            // ********************************************************************************
            //Pintar dia no seleccionable
            _TD = TDNoSeleccionable;

            html += _TD + '>' + dayNum + xTD;

            diaspintados += 1;
        }
        
        // ********************************************************************************
        // Pintamos los dias del calendario...
        // ********************************************************************************
        do {
            
                 /**** Pintamos los días correspondientes al mes actual */
                 diaspintados +=1;
                // ********************************************************************************
                // Definimos el dia con el que vamos a trabajar.. (es un loop dia a dia)
                // ********************************************************************************
                dayNum = thisDay.getDate();
                monthNum = thisDay.getMonth();
                yearNum = thisDay.getFullYear();
                // ********************************************************************************
                // Preparamos el TD que pintaremos, y que el usuario podra clickear para elegir un dia...
                // ********************************************************************************
                TD_onclick = " onclick=\"updateDateField('" + dateFieldName + "', '" + getDateStringMonthShort(thisDay) + "');\" "
                var _TD_selected=TD_selected;
                var _TD=TD;
                
                // ********************************************************************************
                // Establecemos si no es seleccionable debido al que esta fuera de rango...
                // Si no es un dia activo eliminamos la posibilidad de seleccionarlo...
                // ********************************************************************************
                var activo = true;

                var fecha_ = getDateString(thisDay, dateFormat);
   
                if (dateMinDate!=null) { if (thisDay<fechaTmp1) { activo=false; } };
                if (dateMaxDate != null) { if (thisDay > fechaTmp2) { activo = false; } };
                
                if (utilizarActivos && activo == true)
                {
                    if (activosFecha.indexOf(fecha_) == -1) {
                        activo = false;
                    }
                }

                if (!activo) {
                    TD_onclick = "";
                    _TD_selected=TD_selectedNoSeleccionable;
                    _TD=TDNoSeleccionable;
                }               
        
                // ********************************************************************************
                // Verificamos si es el dia de hoy, y lo marcamos...
                // ********************************************************************************
                var _span_ini= SPAN_ini;
                var _span_fin= xSPAN;

        
                // ********************************************************************************
                // Bien finalmente pintamos el dia...
                // ********************************************************************************
                TD_onclick += ">";

                if (dayNum == daySelected && monthNum == month && yearNum == year) {
                    html += _TD_selected + TD_onclick + DIV_selected + _span_ini + dayNum + _span_fin + xDIV + xTD;

                } else {
                    html += _TD + TD_onclick + _span_ini + dayNum + _span_fin + xTD;
                }

                // ********************************************************************************
                // Si es el ultimo dia de la semana, creamos una nueva fila...
                // ********************************************************************************
                if (thisDay.getDay() == 6) 
                {
                    html += xTR + TR;
                } 

                // ********************************************************************************
                // Ok, continuamos con el proximo dia...
                // ********************************************************************************
                thisDay.setDate(thisDay.getDate() + 1);
            } while (thisDay.getDate() > 1)
  
            // ********************************************************************************
            // Pintamos los dias en blanco al final...
            // ********************************************************************************
            var daySubstract = new Date();
            daySubstract.setYear(thisDay.getYear());
            daySubstract.setMonth(thisDay.getMonth());
            daySubstract.setDate(thisDay.getDate());
           
            // Esto es para que queden las dos tablas con el mismo tamaño
            var direct = true;
            while (diaspintados<42) {

                dayNum = daySubstract.getDate();


                if (42 - diaspintados == 7 || 42 - diaspintados == 14) {
                    if (direct) {
                        if (dayNum != 1) {
                            html += xTR + TR;
                        } 
                    } else {
                        html += xTR + TR;
                    }
                    direct = false;
                }
                
               

               // ********************************************************************************
               // Preparamos el TD que pintaremos, y que el usuario podra clickear para elegir un dia...
               // ********************************************************************************
               //Pintar dia no seleccionable
               _TD = TDNoSeleccionable;

               html += _TD + '>' + dayNum + xTD;

               daySubstract.setDate(daySubstract.getDate() + 1);
               diaspintados += 1;

            }
            
        html += xTR;
                
        html += xTABLE;
        html += xDIV;
        html += xDIV;

    }

    html += DIV_clear;
    html += xDIV;
    
    // ********************************************************************************
    // Pintamos los botones de "Hoy" y "Close"
    // ********************************************************************************
    html += DIV_lineaCalendarioTop + xDIV
    html += DIV_lineaCalendarioBot + xDIV

    html += DIV_buttonDivToday;
    var today = new Date();

    html += "<button class='calTodayButtonToday' onClick='refreshDatePicker(\"" + dateFieldName + "\", " + today.getFullYear() + ", " + today.getMonth() + "," + today.getDate() + "," + multiMonth + ", " + numMonth + " );'/>" + labelToday + "</button>";

    html += xDIV;

    html += DIV_buttonDivCerrar;
    html += "<button class='calTodayButtonClose' onClick='updateDateField(\"" + dateFieldName + "\");'>" + labelCerrar + "</button>";
    html += xDIV;

    html += "<div style='clear:both'></div>";

    html += xDIV;
    html += xDIV;

    
 
    document.getElementById(datePickerDivID).innerHTML = html;

    // ********************************************************************************
    // Ok, mostramos...
    // ********************************************************************************
    adjustiFrame();
}

function getButtonCode(dateFieldName, dateVal, adjust, label, multiMonth, numMonth)
{
    // ********************************************************************************
    // Genera el boton de next y back...
    // ********************************************************************************
    var newMonth = (dateVal.getMonth () + adjust) % 12;
    var newYear = dateVal.getFullYear() + parseInt((dateVal.getMonth() + adjust) / 12);
    if (newMonth < 0) {
        newMonth += 12;
        newYear += -1;
    }
    if (label == "&lt;") {
        return "<image src='/calendar/prev_month.gif' class='calButtonLeft' onClick='refreshDatePicker(\"" + dateFieldName + "\", " + newYear + ", " + newMonth + ", undefined , " + multiMonth + ", " + numMonth + " );'/>";
    } else if (label == "&gt;") {
    return "<image src='/calendar/next_month.gif' class='calButtonRig' onClick='refreshDatePicker(\"" + dateFieldName + "\", " + newYear + ", " + newMonth + ", undefined , " + multiMonth + ", " + numMonth + " );'/>";
    }
}


function getSelectDataMonth(dateFieldName, day, month, year, multiMonth, numMonth) {

    var adjust = document.getElementById('monthsCalendar').value;

    newMonth = adjust;
    newYear = year ;

    refreshDatePicker(dateFieldName, newYear, newMonth, "undefined", multiMonth, numMonth);

}


function getSelectDataYear(dateFieldName, day, month, year, multiMonth, numMonth) {

    var adjust = document.getElementById('yearsCalendar').value;

    newMonth = month;
    newYear = adjust;

    refreshDatePicker(dateFieldName, newYear, newMonth, "undefined", multiMonth, numMonth);

}


function getDateString(dateVal, format) {

    // ********************************************************************************
    // Devuelve la fecha en el formato especificado...
    // ********************************************************************************
    
    if (format == null) format = dateFormat;
    var dayString = "00" + dateVal.getDate();
    var monthString = "00" + (dateVal.getMonth() + 1);
    dayString = dayString.substring(dayString.length - 2);
    monthString = monthString.substring(monthString.length - 2);
    switch (format) {
        case "dd/MM/yyyy" :
            return dayString + dateSeparator + monthString + dateSeparator + dateVal.getFullYear();
        case "yyyy/MM/dd" :
            return dateVal.getFullYear() + dateSeparator + monthString + dateSeparator + dayString;
        case "MM/dd/yyyyy" :
        default :
            return monthString + dateSeparator + dayString + dateSeparator + dateVal.getFullYear();
    }
}




function getDateStringMonthShort(dateVal, format) {

    // ********************************************************************************
    // Devuelve la fecha en el formato especificado...
    // ********************************************************************************

    if (format == null) format = dateFormat;
    var dayString = "00" + dateVal.getDate();
    var monthString = dateVal.getMonth();
    dayString = dayString.substring(dayString.length - 2);
    switch (format) {
        case "dd/MM/yyyy":
            return dayString + dateSeparator + monthArrayShort[monthString] + dateSeparator + dateVal.getFullYear();
        case "yyyy/MM/dd":
            return dateVal.getFullYear() + dateSeparator + monthArrayShort[monthString] + dateSeparator + dayString;
        case "MM/dd/yyyyy":
        default:
            return monthArrayShort[monthString] + dateSeparator + dayString + dateSeparator + dateVal.getFullYear();
    }
}



function getFieldDate(dateString,format)
{
    var dateVal;
    var dArray;
    var d, m, y;
    
    if (format == null) format = dateFormat;
 
    // ********************************************************************************
    // Devuelve una fecha (date()) desde un string...
    // ********************************************************************************
    try {
            dArray = splitDateString(dateString);
            if (dArray) {
                switch (format) {
                    case "dd/MM/yyyy" :
                        d = parseInt(dArray[0], 10);
                        m = parseInt(dArray[1], 10) - 1;
                        y = parseInt(dArray[2], 10);
                        break;
                    case "yyyy/MM/dd" :
                        d = parseInt(dArray[2], 10);
                        m = parseInt(dArray[1], 10) - 1;
                        y = parseInt(dArray[0], 10);
                        break;
                    case "MM/dd/yyyy" :
                    default :
                        d = parseInt(dArray[1], 10);
                        m = parseInt(dArray[0], 10) - 1;
                        y = parseInt(dArray[2], 10);
                        break;
                }
                dateVal = new Date(y, m, d);
            } else if (dateString) {
                dateVal = new Date(dateString);
            } else {
                dateVal = new Date();
            }
        } catch(e) {
            dateVal = new Date();
        }
    return dateVal;
}



function funcionMes(m) {
    var mes;
    if (isNaN(parseInt(m))) {
        m = m.toLowerCase();
        switch (m) {

            case "Jan":
            case "jan":
            case "Ene":
            case "ene":

                mes = 1;
                break;

            case "Feb":
            case "feb":
                mes = 2;
                break;

            case "Mar":
            case "mar":
                mes = 3;
                break;

            case "Apr":
            case "apr":
            case "Abr":
            case "abr":
                mes = 4;
                break;

            case "May":
            case "may":
                mes = 5;
                break;

            case "Jun":
            case "jun":
                mes = 6;
                break;

            case "Jul":
            case "jul":
                mes = 7;
                break;

            case "Aug":
            case "aug":
            case "Ago":
            case "ago":
                mes = 8;
                break;

            case "sep":
            case "Sep":

                mes = 9;
                break;

            case "Oct":
            case "oct":
                mes = 10;
                break;

            case "Nov":
            case "nov":
                mes = 11;
                break;

            case "Dec":
            case "dec":
            case "Dic":
            case "dic":
                mes = 12;
                break;
            default:

                return false;
        }
    }
    else {
        mes = eval(m);
        if (mes >= 1 && mes <= 12) return mes;
        else return false;

    }

    return mes;
}



function getFieldDateShortMonth(dateString, format) {
    var dateVal;
    var dArray;
    var d, m, y;

    if (format == null) format = dateFormat;

    // ********************************************************************************
    // Devuelve una fecha (date()) desde un string...
    // ********************************************************************************
    try {
        dArray = splitDateString(dateString);
        if (dArray) {
            switch (format) {
                case "dd/MM/yyyy":
                    d = parseInt(dArray[0], 10);
                    m = funcionMes(dArray[1]) - 1;
                    y = parseInt(dArray[2], 10);
                    break;
                case "yyyy/MM/dd":
                    d = parseInt(dArray[2], 10);
                    m = funcionMes(dArray[1]) - 1;
                    y = parseInt(dArray[0], 10);
                    break;
                case "MM/dd/yyyy":
                default:
                    d = parseInt(dArray[1], 10);
                    m = funcionMes(dArray[0]) - 1;
                    y = parseInt(dArray[2], 10);
                    break;
            }
            dateVal = new Date(y, m, d);
        } else if (dateString) {
            dateVal = new Date(dateString);
        } else {
            dateVal = new Date();
        }
    } catch (e) {
        dateVal = new Date();
    }
    return dateVal;
}


function splitDateString(dateString)
{
    // ********************************************************************************
    // Parte un string de fecha, con el separador seleccionado...
    // ********************************************************************************
    var dArray;
    if (dateString.indexOf("/") >= 0)
        dArray = dateString.split("/");
    else if (dateString.indexOf(".") >= 0)
        dArray = dateString.split(".");
    else if (dateString.indexOf("-") >= 0)
        dArray = dateString.split("-");
    else if (dateString.indexOf("\\") >= 0)
        dArray = dateString.split("\\");
    else
        dArray = false;

    return dArray;
}
 
function updateDateField(dateFieldName, dateString)
{
    // ********************************************************************************
    // Recogemos el campo donde debemos pintar el dia seleccionado, y escondemos el DIV
    // ********************************************************************************
    var targetDateField = document.getElementById(dateFieldName);
    if (dateString) targetDateField.value = dateString;
    var pickerDiv = document.getElementById(datePickerID);
    pickerDiv.style.visibility = "hidden";
    pickerDiv.style.display = "none";
    adjustiFrame();
    targetDateField.focus();

    // ********************************************************************************
    // Si tenemos function de retorno la llamamos...
    // ********************************************************************************
  if ((dateString) && (typeof(dataPickerFunctionClose) == "function")) {
    dataPickerFunctionClose(targetDateField);
  }
}

function verificarFechaInChange(min, max, campoFecha, funcionOnClose) {

    var fechaOk=false;
    if (campoFecha.value!='') {
        var fechaMin_=null;
        var fechaMax_=null;
        var fechaSel_=null;

        if (min) fechaMin_= getFieldDate(min);
        if (max) fechaMax_= getFieldDate(max);
        fechaSel_= getFieldDate(campoFecha.value);

        // Sin rango Definido...
        if ((fechaMin_==null) && (fechaMax_==null)) { fechaOk=true; } 
        
        // Sin fecha Fin... (OK)
        if ((fechaMin_!=null) && (fechaMax_==null)) {
            if (fechaSel_>=fechaMin_) { fechaOk=true; }
        } 

        // Sin Fecha Ini... (OK)
        if ((fechaMin_==null) && (fechaMax_!=null)) {
            if (fechaSel_<=fechaMax_) { fechaOk=true; }
        } 

        // En rango X... (OK)
        if ((fechaMin_!=null) && (fechaMax_!=null)) {
            if ((fechaSel_>=fechaMin_) && (fechaSel_<=fechaMax_)) { fechaOk=true; }
        } 

    } else { fechaOk=true; }
    
    if (fechaOk) { 
        
        if (typeof(funcionOnClose) == "function") { funcionOnClose(campoFecha); }
    } else {
        if (typeof(mostrarError) == "function") { mostrarError(labelFechaIncorrecta); } else { alert(labelFechaIncorrecta); }
    }
}

function adjustiFrame(pickerDiv, iFrameDiv)
{
    // ********************************************************************************
    // Ajustamos el DIV, segun sea el caso...
    // ********************************************************************************
    var is_opera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1);
    if (is_opera) return;
    try {
  
        if (!pickerDiv) pickerDiv = document.getElementById(datePickerID);
        if (!iFrameDiv) iFrameDiv = document.getElementById(iFrameDivID);
    

        
    } catch (ee) {}
}



/*Funciones de conversion*/

function diasActivosToArray(strDiasActivos, formato, separador) {
   strDiasAct = new String();
   var arrDiasAct = new Array();
   var arrDiasActToDate = new Array();
   if (strDiasActivos !=null && strDiasActivos !='') 
   {
       strDiasAct = strDiasActivos;
       arrDiasAct = strDiasAct.split(separador);
       for (i = 0; i < arrDiasAct.length; i++) {
           if (arrDiasAct[i] !="")  arrDiasActToDate.push(getFieldDate(arrDiasAct[i],formato));
       }
   }
   return arrDiasActToDate;
}

function diasActivosArrToString(arrDiasActivos, formato, separador) {
    var strDiasAct = new String();
    for (i = 0; i < arrDiasActivos.length; i++) {
        strDiasAct = strDiasAct + getDateString(StringToDate(arrDiasActivos[i], "yyyy/MM/dd")) + separador;
    }
   return strDiasAct;
}

function hideDatePicker() {
    if (document.getElementById(datePickerID)) {
        document.getElementById(datePickerID).style.display = 'none';
    }
}
