var bordeSup = "BORDER-TOP: #326699 1px solid;";
var bordeIzq = "BORDER-LEFT: #326699 1px solid;";
var bordeDch = "BORDER-RIGHT: #326699 1px solid;";
var bordeInf = "BORDER-BOTTOM: #326699 1px solid;";

/**
* Formato de las fechas
*/
var calFormat;

/**
* Variable que indica si estamos ante una labelFechaTag o inputFechaTag
*/
var isLabel;

/**
* Ancho de la tabla del calendario
*/
var width;

/**
* Alto de la tabla del calendario
*/
var height;

/**
* Color del calendario
*/
var color;

/**
*  Ancho de la ventana del calendario
*/
var calWidth

/**
*  Alto de la ventana del calendario
*/
var calHeight;

/**
* Posicion horizontal absoluta de la ventana del calendario
*/
var winX=0;

/**
* Posicion vertical absoluta de la ventana del calendario
*/
var winY=0;

/**
* Posicion horizontal relativa de la ventana del calendario
*/
var calOffsetX=-200;

/**
* Posicion vertical relativa de la ventana del calendario
*/
var calOffsetY=16;

/**
* Objeto que representa la ventana del calendario
*/
var calWin=null;

/**
* Array de calendarios creados
*/
var cals=new Array();

/**
* Objeto que representa el calendario actual
*/
var currentCal=null;

/**
* Array de los meses del año
*/
var yxMonths=new Array("enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre");

/**
* Array de los dias de la semana
*/
var yxDays=new Array("D", "L", "M", "X", "J", "V", "S", "D");

/**
* Array de los dias de la semana
*/
var yxDaysFull=new Array("domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado", "domingo");

/**
* Array de los enlaces del calendario
*/
var yxLinks=new Array("[cerrar]", "[limpiar]");

/**
* Inicializar los valores del objeto calendario
*
* @param isLabel
* @param name
* @param title
* @param field
* @param form
*/
function calOBJ(isLabel, name, title, field, form) {
  this.isLabel = isLabel;
  this.name = name;
  this.title = title;
  this.field = field;
  this.formName = form;
  this.form = null;
}

/**
* Crear un nuevo calendario
*
* @param isLabel
* @param name
* @param title
* @param field
* @param form
*/
function addCalendar(isLabel,name, title, field, form) {
  cals[cals.length] = new calOBJ(isLabel, name, title, field, form);
}

/**
* Encontrar si existe el calendario actual
*
* @param name
* @return cals[i]
*/
function findCalendar(name) {
  for (var i = 0; i < cals.length; i++) {
    if (cals[i].name == name) {
      if (cals[i].form == null) {
        if (cals[i].formName == "") {
          if (document.forms[0]) {
            cals[i].form = document.forms[0];
          }
        }
        else if (document.forms[cals[i].formName]) {
          cals[i].form = document.forms[cals[i].formName];
        }
      }

      return cals[i];
    }
  }

  return null;
}

/**
* Extraer el dia de la semana
*
* @param y
* @param m
* @param d
* @return yxDays[i]
*/
function getDayName(y,m,d) {
  var wd=new Date(y,m,d);
  return yxDaysFull[wd.getDay()].substring(0,3);
}

/**
* Extraer el indice del mes a partir del nombre
*
* @param m3
* @return i
*/
function getMonthFromName(m3) {
  for (var i = 0; i < yxMonths.length; i++) {
    if (yxMonths[i].toLowerCase().substring(0,3) == m3.toLowerCase()) {
      return i;
    }
  }

  return 0;
}

/**
* Extraer el formato de fecha escogido
*
* @return RegExp(calF)
*/
function getFormat() {
  var calF = calFormat;

  calF = calF.replace(/\\/g, '\\\\');
  calF = calF.replace(/\//g, '\\\/');
  calF = calF.replace(/\[/g, '\\\[');
  calF = calF.replace(/\]/g, '\\\]');
  calF = calF.replace(/\(/g, '\\\(');
  calF = calF.replace(/\)/g, '\\\)');
  calF = calF.replace(/\{/g, '\\\{');
  calF = calF.replace(/\}/g, '\\\}');
  calF = calF.replace(/\</g, '\\\<');
  calF = calF.replace(/\>/g, '\\\>');
  calF = calF.replace(/\|/g, '\\\|');
  calF = calF.replace(/\*/g, '\\\*');
  calF = calF.replace(/\?/g, '\\\?');
  calF = calF.replace(/\+/g, '\\\+');
  calF = calF.replace(/\^/g, '\\\^');
  calF = calF.replace(/\$/g, '\\\$');

  calF = calF.replace(/dd/i, '\\d\\d');
  calF = calF.replace(/MMM/i, '\\w\\w\\w');
  calF = calF.replace(/MM/i, '\\d\\d');
  calF = calF.replace(/yyyy/i, '\\d\\d\\d\\d');
//-  calF = calF.replace(/day/i, '\\w');
//+
  calF = calF.replace(/EEE/i, '\\w\\w\\w');
//+


  return new RegExp(calF);
}

/**
* Formatea la fecha dada segun el formato escogido
*
* @param date
* @return Array(y,m,d)
*/
function getDateNumbers(date) {
  var y, m, d;
  var yIdx = calFormat.search(/yyyy/i);
  var m3Idx = calFormat.search(/MMM/i);
  var mIdx = -1;
  if (m3Idx == -1)
  	var mIdx = calFormat.search(/MM/i);
  var dIdx = calFormat.search(/dd/i);

  y=date.substring(yIdx,yIdx+4)-0;
  if (mIdx != -1) {
    m=date.substring(mIdx,mIdx+2)-1;
  }
  else {
    var m = getMonthFromName(date.substring(m3Idx,m3Idx+3));
  }
  d=date.substring(dIdx,dIdx+2)-0;

  return new Array(y,m,d);
}

/**
* Oculta la ventana del calendario
*/
function hideCal() {
  calWin.close();
  calWin = null;
  window.status = "";
}

/**
* Consigue el ultimo dia del mes de la fecha
*
* @param d
* @return i
*/
function lastDay(d) {
  var yy=d.getFullYear(), MM=d.getMonth();
  for (var i=31; i>=28; i--) {
    var nd=new Date(yy,MM,i);
    if (MM == nd.getMonth()) {
      return i;
    }
  }
}

/**
* Consigue el primer dia del mes de la fecha
*
* @param d
* @return Date
*/
function firstDay(d) {
  var yy=d.getFullYear(), MM=d.getMonth();
  var fd=new Date(yy,MM,1);
  return fd.getDay();
}

/**
* Representa la fila del titulo de la tabla del calendario
*
* @param d
* @return s
*/
function calTitle(d) {
  var yy=d.getFullYear(), MM=yxMonths[d.getMonth()];
  var s;

  s="<tr align='center'>";
  s+="<td colspan='7'>";
  s+="<table cellpadding='0' cellspacing='0' border='0'>";
  s+="<tr align='center' valign='middle'>";
  s+="<td width=\"6\"  height=\""+height+"\">";
 s+="</td>";
  s+="<td height=\""+height+"\" align=\"center\">";
  s+="&nbsp;<a href='javascript:if(window.opener && !window.opener.closed && window.opener.moveYear) window.opener.moveYear(-1)'>";
  s+="<b><font face=\"Verdana, Arial, Helvetica\" color=\"#6A6C7B\" size=\"2\">&#171;</font></b>";
  s+="</a>&nbsp;";
  s+="<a href="+"'javascript:if (window.opener && !window.opener.closed && window.opener.prepMonth) window.opener.prepMonth("+d.getMonth()+")'>";
  s+="<font face=\"Verdana, Arial, Helvetica\" color=\"#6A6C7B\" size=\"2\">&#139;</font></b>";
  s+="</a>&nbsp;";
  s+="</td>";
  s+="<td width=\""+width+"\" height=\""+height+"\" align=\"center\">";
  s+="<b><font face=\"Verdana, Arial, Helvetica\" color=\"#6A6C7B\" size=\"1\" >"+MM+" "+yy+"";
  s+="</font></b></td>";
  s+="<td height=\""+height+"\" align=\"center\" >";
  s+="&nbsp;<a href="+"'javascript:if (window.opener && !window.opener.closed && window.opener.nextMonth) window.opener.nextMonth("+d.getMonth()+")' >";
  s+="<b><font face=\"Verdana, Arial, Helvetica\" color=\"#6A6C7B\" size=\"2\" >&#155;</font></b>";
  s+="</a>&nbsp;";
  s+="&nbsp;<a href="+"'javascript:if(window.opener && !window.opener.closed && window.opener.moveYear) window.opener.moveYear(1)' >";
  s+="<b><font face=\"Verdana, Arial, Helvetica\" color=\"#6A6C7B\" size=\"2\" >&#187;</font></b>";
  s+="</a>&nbsp;";
  s+="</td>";
  if (color == "azul")
	  s+="<td width=\"6\" height=\""+height+"\"></td>";
  else
	  s+="<td width=\"6\" height=\""+height+"\"></td>";
  s+="</tr></table></td></tr>";
  s+="<tr><td>&nbsp;</td><td colspan='5'>&nbsp;</td><td>&nbsp;</td></tr>";
  s+="<tr align='center'>";

  for (var i=1; i<8; i++) {
  	if (i==1)
  		s+="<td><b><font face=\"Verdana, Arial, Helvetica\" color=\"#6A6C7B\" size=\"1\" >"+yxDays[i]+"</font></b></td>";
	else if (i==7)
  		s+="<td ><b><font face=\"Verdana, Arial, Helvetica\" color=\"#6A6C7B\" size=\"1\" >"+yxDays[i]+"</font></b></td>";
  	else
    		s+="<td><b><font face=\"Verdana, Arial, Helvetica\" color=\"#6A6C7B\" size=\"1\" >"+yxDays[i]+"</font></b></td>";

  }
  s+="</tr>";

  return s;
}

/**
* Representa el titulo de la ventana del calendario
*
* @return s
*/
function calHeader() {
   var s="";
   s +="<head><title>"+currentCal.title+"</title>";
   s += "</head>";
   s += "<body>";
   s += "<table width=\""+width+"\" align=\"center\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
   s += "<tr><td>\n<table cellspacing='0' cellpadding='0' border='0'>";
  return s;
}

/**
* Representa la fila de enlaces de la tabla del calendario
*
* @return s
*/
function calFooter() {
  var s="";
  s+= "<tr><td>&nbsp;</td>";
  s+="<td colspan='5' align='center'><a href="+"'javascript:if (window.opener && !window.opener.closed && window.opener.hideCal) window.opener.hideCal()'>";
  s+="<b><font face=\"Verdana, Arial, Helvetica\" color=\"#6A6C7B\" size=\"1\" >"+yxLinks[0]+"</a>&nbsp;&nbsp;";
  s+="<a href='javascript:if (window.opener && !window.opener.closed && window.opener.clearDate) window.opener.clearDate()'>";
  s+="<b><font face=\"Verdana, Arial, Helvetica\" color=\"#6A6C7B\" size=\"1\" >"+yxLinks[1]+"</a></td><td>&nbsp;</td></tr>";
  s+="<tr><td>&nbsp;</td><td colspan='5'>&nbsp;</td><td>&nbsp;</td></tr>";
  s+="</table></td></tr></table></body>";
  return s;
}

/**
* Representa la tabla de los dias del calendario
*
* @return s
*/

function calBody(d,day) {
  var s="", dayCount=1, fd=firstDay(d), ld=lastDay(d);

  if (fd == 0) {
    fd = 7;
  }

  for (var i=0; i<6; i++) {
    s+="<tr align='center'>";
    for (var j=1; j<8; j++) {
      if (i*7+j<fd || dayCount>ld)
      {
      	if (j==1)
        	s+="<td>&nbsp;</td>";
        else if (j==7)
        	s+="<td>&nbsp;</td>";
        else
        	s+="<td>&nbsp;</td>";
      }
      else {
        var fgTag="day";
        var fgTagA="daya";
        if (dayCount==day) {
          fgTag="currentDay";
          fgTagA="currenta";

        }

        if (j==1)
        	s+="<td>";
        else if (j==7)
        	s+="<td>";
        else
        	s+="<td>";
        s+="<a href="+"'javascript: if (window.opener && !window.opener.closed && window.opener.pickDate) window.opener.pickDate("+dayCount+")'>";
        if (j==6 || j==7)
        	s+="<font face=\"Verdana, Arial, Helvetica\" color=\"#8F1B29\" size=\"1\">";
        else
		s+="<font face=\"Verdana, Arial, Helvetica\" color=\"#6A6C7B\" size=\"1\">";

        s+=""+(dayCount++)+"</font></a></td>";
      }
    }
    s+="</tr>";
  }

  return s;
}

/**
* Cambia el año del calendario al pinchar en los enlaces correspondientes
*
* @param dy
*/
function moveYear(dy) {
  cY+=dy;
  var nd=new Date(cY,cM,1);
  changeCal(nd);
}

/**
* Cambia el mes del calendario al mes anterior
* al pinchar en el enlace correspondiente
*
* @param m
*/
function prepMonth(m) {
  cM=m-1;
  if (cM<0) { cM=11; cY--; }
  var nd=new Date(cY,cM,1);
  changeCal(nd);
}

/**
* Cambia el mes del calendario al mes siguiente
* al pinchar en el enlace correspondiente
*
* @param m
*/
function nextMonth(m) {
  cM=m+1;
  if (cM>11) { cM=0; cY++;}
  var nd=new Date(cY,cM,1);
  changeCal(nd);
}

/**
* Cambia la representacion del calendario si se ha cambiado el mes o el año
* pinchando en alguno de los enlaces
*
* @param d
*/
function changeCal(d) {
  var dd = 0;

  if (currentCal != null) {
    var calRE = getFormat();
    if (currentCal.form[currentCal.field].value!="" && calRE.test(currentCal.form[currentCal.field].value)) {
      var cd = getDateNumbers(currentCal.form[currentCal.field].value);
      if (cd[0] == d.getFullYear() && cd[1] == d.getMonth()) {
        dd=cd[2];
      }
    }
    else {
      var cd = new Date();
      if (cd.getFullYear() == d.getFullYear() && cd.getMonth() == d.getMonth()) {
        dd=cd.getDate();
      }
    }
  }

  var calendar=calHeader()+calTitle(d)+calBody(d,dd)+calFooter();

  calWin.document.open();
  calWin.document.write(calendar);
  calWin.document.close();
}

/**
* Establece el punto donde sucedio un evento
*
* @param e
* @return true
*/
function markClick(e) {
    winX=event.screenX;
    winY=event.screenY;

  event.cancelBubble=false;

  return true;
}

/**
* Establece los atributos de tamaño, color y formato de fecha del calendario
* y llama a las funciones que representan el calendario
*
* @param name
* @param cFormat
* @param tWidth
* @param tHeight
* @param col
* @param cWidth
* @param cHeight
*/
function showCal(name,cFormat, tWidth, tHeight, col, cWidth, cHeight) {
  var lastCal=currentCal;

  var d=new Date(), hasCal=false;
  if(cFormat != null)
	  calFormat = cFormat;
  if(tWidth != null)
	  width = tWidth;
  if(tHeight != null)
	  height = tHeight;
  if(col != null)
	  color = col;
  if(cWidth != null)
	  calWidth = cWidth;
  if(cHeight != null)
	  calHeight = cHeight;

  currentCal = findCalendar(name);
  if (currentCal != null && currentCal.form != null && currentCal.form[currentCal.field]) {
    var calRE = getFormat();
    if (currentCal.form[currentCal.field].value!="" && calRE.test(currentCal.form[currentCal.field].value)) {
      var cd = getDateNumbers(currentCal.form[currentCal.field].value);
      d=new Date(cd[0],cd[1],cd[2]);

      cY=cd[0];
      cM=cd[1];
      dd=cd[2];
    }
    else {
      cY=d.getFullYear();
      cM=d.getMonth();
      dd=d.getDate();
    }

    var calendar=calHeader()+calTitle(d)+calBody(d,dd)+calFooter();

    if (calWin != null && !calWin.closed) {
      hasCal=true;
      calWin.moveTo(winX+calOffsetX,winY+calOffsetY);
    }

    if (!hasCal) {
        calWin=window.open("","cal","toolbar=0,width="+calWidth+",height="+calHeight+",left="+(winX+calOffsetX)+",top="+(winY+calOffsetY));
    }

    calWin.document.open();
    calWin.document.write(calendar);
    calWin.document.close();

    calWin.focus();
  }
  else {
    if (currentCal == null) {
      window.status = "Calendar ["+name+"] not found.";
    }
    else if (!currentCal.form) {
      window.status = "Form ["+currentCal.formName+"] not found.";
    }
    else if (!currentCal.form[currentCal.field]) {
      window.status = "Form Field ["+currentCal.formName+"."+currentCal.field+"] not found.";
    }

    if (lastCal != null) {
      currentCal = lastCal;
    }
  }
}

/**
* Añade un cero delante de una cifra menor que 10
*
* @param n
* @return 0n
*/
function get2Digits(n) {
  return ((n<10)?"0":"")+n;
}

/**
* Resetea el valor el campo de texto
*/
function clearDate() {
  currentCal.form[currentCal.field].value="";
  hideCal();
}

/**
* Asigna un valor al campo de texto o a la etiqueta
* cuando se pincha en un dia del calendario
*
* @param d
*/
function pickDate(d) {
  hideCal();
  window.focus();

  var date=calFormat;
  date = date.replace(/yyyy/i, cY);
//+
  date = date.replace(/MMM/i, yxMonths[cM].substring(0,3));
//+
  date = date.replace(/MM/i, get2Digits(cM+1));
//-  date = date.replace(/MON/, yxMonths[cM].substring(0,3).toUpperCase());
//-  date = date.replace(/Mon/i, yxMonths[cM].substring(0,3));
  date = date.replace(/dd/i, get2Digits(d));
//-  date = date.replace(/DAY/, getDayName(cY,cM,d).toUpperCase());
//-  date = date.replace(/day/i, getDayName(cY,cM,d));
//+
  date = date.replace(/EEE/i, getDayName(cY,cM,d));
//+
  currentCal.form[currentCal.field].value=date;

  if (currentCal.isLabel == "true")
	document.getElementById(currentCal.field).innerHTML =  date;
}

document.onclick=markClick;