var Cards = new makeArray(8);
Cards[0] = new CardType("MasterCard", "51,52,53,54,55", "16");
var MasterCard = Cards[0];
Cards[1] = new CardType("VisaCard", "4", "13,16");
var VisaCard = Cards[1];
Cards[2] = new CardType("AmExCard", "34,37", "15");
var AmExCard = Cards[2];
Cards[3] = new CardType("DinersClubCard", "30,36,38", "14");
var DinersClubCard = Cards[3];
Cards[4] = new CardType("DiscoverCard", "6011", "16");
var DiscoverCard = Cards[4];
Cards[5] = new CardType("enRouteCard", "2014,2149", "15");
var enRouteCard = Cards[5];
Cards[6] = new CardType("JCBCard", "3088,3096,3112,3158,3337,3528", "16");
var JCBCard = Cards[6];
var LuhnCheckSum = Cards[7] = new CardType();

/*************************************************************************\
  CheckCardNumber(form)
  function called when users click the "check" button.
\*************************************************************************/

function CheckCardNumber(form) {
  var tmpyear;
  if (form.CardNumber.value.length == 0) {
    alert("Please, enter card number.");
    form.CardNumber.focus();
    return;
  }
  if (form.ExpYear.value.length == 0) {
    alert("Please, enter expiration year.");
    form.ExpYear.focus();
    return;
  }
  if (form.ExpYear.value > 96)
    tmpyear = "19" + form.ExpYear.value;
  else if (form.ExpYear.value < 21)
    tmpyear = "20" + form.ExpYear.value;
  else {
    alert("Incorrect year.");
    return;
  }
  tmpmonth = form.ExpMon.options[form.ExpMon.selectedIndex].value;
  // The following line doesn't work in IE3, you need to change it
  // to something like "(new CardType())...".
  // if (!CardType().isExpiryDate(tmpyear, tmpmonth)) {
  if (!(new CardType()).isExpiryDate(tmpyear, tmpmonth)) {
    alert("The expiration date has passed.");
    return;
  }
  card = form.CardType.options[form.CardType.selectedIndex].value;
  var retval = eval(card + ".checkCardNumber(\"" + form.CardNumber.value +
        "\", " + tmpyear + ", " + tmpmonth + ");");

  cardname = "";
  if (retval)
    // The cardnumber has the valid luhn checksum and matches the
    // cardtype's rule.
    //alert("ĄCorrecto!");
	return true;
  else {
    // The cardnumber has the valid luhn checksum, but we want to know which
    // cardtype it belongs to.
    for (var n = 0; n < Cards.size; n++) {
      if (Cards[n].checkCardNumber(form.CardNumber.value, tmpyear, tmpmonth)) {
        cardname = Cards[n].getCardType();
        break;
      }
    }
    if (cardname.length > 0) {
      alert("This is " + cardname + " number, no " + card + " number.");
    }
    else {
      alert("This is not a card number.");
    }
  }
}

/*************************************************************************\
   Object CardType([String cardtype, String rules, String len, int year, 
					int month])
    cardtype    : type of card, eg: MasterCard, Visa, etc.
    rules       : rules of the cardnumber, eg: "4", "6011", "34,37".
    len         : valid length of cardnumber, eg: "16,19", "13,16".
    year	: year of expiry date.
    month	: month of expiry date.
    eg:
    var VisaCard = new CardType("Visa", "4", "16");
    var AmExCard = new CardType("AmEx", "34,37", "15");
\*************************************************************************/
function CardType() {
  var n;
  var argv = CardType.arguments;
  var argc = CardType.arguments.length;

  this.objname = "object CardType";

  var tmpcardtype = (argc > 0) ? argv[0] : "CardObject";
  var tmprules = (argc > 1) ? argv[1] : "0,1,2,3,4,5,6,7,8,9";
  var tmplen = (argc > 2) ? argv[2] : "13,14,15,16,19";

  // set CardNumber method.
  this.setCardNumber = setCardNumber;

  // setCardType method.
  this.setCardType = setCardType;

  // setLen method.
  this.setLen = setLen;

  // setRules method.
  this.setRules = setRules;

  // setExpiryDate method.
  this.setExpiryDate = setExpiryDate;
  this.setCardType(tmpcardtype);
  this.setLen(tmplen);
  this.setRules(tmprules);
  if (argc > 4)
    this.setExpiryDate(argv[3], argv[4]);
  // checkCardNumber method.
  this.checkCardNumber = checkCardNumber;

  // getExpiryDate method.
  this.getExpiryDate = getExpiryDate;

  // getCardType method.
  this.getCardType = getCardType;

  // isCardNumber method.
  this.isCardNumber = isCardNumber;

  // isExpiryDate method.
  this.isExpiryDate = isExpiryDate;

  // luhnCheck method.
  this.luhnCheck = luhnCheck;

  return this;
}

/*************************************************************************\
   boolean checkCardNumber([String cardnumber, int year, int month])
   return true if cardnumber pass the luhncheck and the expiry date is
   valid, else return false.
\*************************************************************************/
function checkCardNumber() {
  var argv = checkCardNumber.arguments;
  var argc = checkCardNumber.arguments.length;
  var cardnumber = (argc > 0) ? argv[0] : this.cardnumber;
  var year = (argc > 1) ? argv[1] : this.year;
  var month = (argc > 2) ? argv[2] : this.month;

  this.setCardNumber(cardnumber);
  this.setExpiryDate(year, month);

  if (!this.isCardNumber())
    return false;

  if (!this.isExpiryDate())
    return false;

  return true;
}

/*************************************************************************\
   String getCardType()
   return the cardtype.
\*************************************************************************/
function getCardType() {
  return this.cardtype;
}

/*************************************************************************\
   String getExpiryDate()
   return the expiry date.
\*************************************************************************/
function getExpiryDate() {
  return this.month + "/" + this.year;
}

/*************************************************************************\
   boolean isCardNumber([String cardnumber])
   return true if cardnumber pass the luhncheck and the rules, else return
   false.
\*************************************************************************/
function isCardNumber() {
  var argv = isCardNumber.arguments;
  var argc = isCardNumber.arguments.length;
  var cardnumber = (argc > 0) ? argv[0] : this.cardnumber;
  if (!this.luhnCheck())
    return false;
  for (var n = 0; n < this.len.size; n++)
    if (cardnumber.toString().length == this.len[n]) {
      for (var m = 0; m < this.rules.size; m++) {
        var headdigit = cardnumber.substring(0, this.rules[m].toString().length);
        if (headdigit == this.rules[m])
          return true;
      }
      return false;
    }
  return false;
}

/*************************************************************************\
  boolean isExpiryDate([int year, int month])
  return true if the date is a valid expiry date,
  else return false.
\*************************************************************************/
function isExpiryDate() {
  var argv = isExpiryDate.arguments;
  var argc = isExpiryDate.arguments.length;

  year = argc > 0 ? argv[0] : this.year;
  month = argc > 1 ? argv[1] : this.month;

  if (!isNum(year+""))
    return false;
  if (!isNum(month+""))
    return false;
  today = new Date();
  expiry = new Date(year, month);
  if (today.getTime() > expiry.getTime())
    return false;
  else
    return true;
}

/*************************************************************************\
  boolean isNum(String argvalue)
  return true if argvalue contains only numeric characters,
  else return false.
\*************************************************************************/
function isNum(argvalue) {
  argvalue = argvalue.toString();

  if (argvalue.length == 0)
    return false;

  for (var n = 0; n < argvalue.length; n++)
    if (argvalue.substring(n, n+1) < "0" || argvalue.substring(n, n+1) > "9")
      return false;

  return true;
}

/*************************************************************************\
  boolean luhnCheck([String CardNumber])
  return true if CardNumber pass the luhn check else return false.
  Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl
\*************************************************************************/
function luhnCheck() {
  var argv = luhnCheck.arguments;
  var argc = luhnCheck.arguments.length;

  var CardNumber = argc > 0 ? argv[0] : this.cardnumber;

  if (! isNum(CardNumber)) {
    return false;
  }

  var no_digit = CardNumber.length;
  var oddoeven = no_digit & 1;
  var sum = 0;

  for (var count = 0; count < no_digit; count++) {
    var digit = parseInt(CardNumber.charAt(count));
    if (!((count & 1) ^ oddoeven)) {
      digit *= 2;
      if (digit > 9)
	digit -= 9;
    }
    sum += digit;
  }
  if (sum % 10 == 0)
    return true;
  else
    return false;
}

/*************************************************************************\
  ArrayObject makeArray(int size)
  return the array object in the size specified.
\*************************************************************************/
function makeArray(size) {
  this.size = size;
  return this;
}

/*************************************************************************\
   CardType setCardNumber(cardnumber)
   return the CardType object.
\*************************************************************************/
function setCardNumber(cardnumber) {
  this.cardnumber = cardnumber;

  return this;
}

/*************************************************************************\
   CardType setCardType(cardtype)
   return the CardType object.
\*************************************************************************/
function setCardType(cardtype) {
  this.cardtype = cardtype;

  return this;
}

/*************************************************************************\
   CardType setExpiryDate(year, month)
   return the CardType object.
\*************************************************************************/
function setExpiryDate(year, month) {
  this.year = year;
  this.month = month;

  return this;
}

/*************************************************************************\
   CardType setLen(len)
   return the CardType object.
\*************************************************************************/
function setLen(len) {
  // Create the len array.
  if (len.length == 0 || len == null)
    len = "13,14,15,16,19";

  var tmplen = len;
  n = 1;
  while (tmplen.indexOf(",") != -1) {
    tmplen = tmplen.substring(tmplen.indexOf(",") + 1, tmplen.length);
    n++;
  }
  this.len = new makeArray(n);
  n = 0;
  while (len.indexOf(",") != -1) {
    var tmpstr = len.substring(0, len.indexOf(","));
    this.len[n] = tmpstr;
    len = len.substring(len.indexOf(",") + 1, len.length);
    n++;
  }
  this.len[n] = len;

  return this;
}

/*************************************************************************\
   CardType setRules()
   return the CardType object.
\*************************************************************************/
function setRules(rules) {
  // Create the rules array.
  if (rules.length == 0 || rules == null)
    rules = "0,1,2,3,4,5,6,7,8,9";
  
  var tmprules = rules;
  n = 1;
  while (tmprules.indexOf(",") != -1) {
    tmprules = tmprules.substring(tmprules.indexOf(",") + 1, tmprules.length);
    n++;
  }
  this.rules = new makeArray(n);
  n = 0;
  while (rules.indexOf(",") != -1) {
    var tmpstr = rules.substring(0, rules.indexOf(","));
    this.rules[n] = tmpstr;
    rules = rules.substring(rules.indexOf(",") + 1, rules.length);
    n++;
  }
  this.rules[n] = rules;

  return this;
}


var eldia=0;
function objetoAjax(){
	var xmlhttp=false;
	try {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
		   xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			xmlhttp = false;
  		}
	}

	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
		xmlhttp = new XMLHttpRequest();
	}
	return xmlhttp;
}

function LlamadaAjax(datos,divi,noasincrono){
	if(!noasincrono)
		noasincrono=false;
	asincrono=!noasincrono;
  //alert(consulta);
	divCuerpo = document.getElementById(divi);
	//divCuerpo.disabled=true;
	divCuerpo.innerHTML="<table width=100% height=100%><tr><td align=center valign=middle><img border=0 src=ajax/cargando_barra.gif><br><font color=004284>processing...</font></td></tr></table>";
	ajax=objetoAjax();
	miFecha = new Date() 
	hora='&h=' + miFecha.getTime();
	ajax.open("GET", datos + hora, asincrono);
	
	ajax.onreadystatechange=function() {
		if (ajax.readyState==4) {
			divCuerpo.innerHTML = ajax.responseText;
			divCuerpo.disabled=false;
		}
	}
	ajax.send(null);
	
}

function LlamadaAjaxB(datos,divi){
  //alert(consulta);
	divCuerpo = document.getElementById(divi);
	//divCuerpo.disabled=true;
	//divCuerpo.innerHTML="<table width=100% height=100%><tr><td align=center valign=middle><img border=0 src=ajax/cargando_barra.gif><br><font color=004284>processing...</font></td></tr></table>";
	ajax=objetoAjax();
	miFecha = new Date() 
	hora='&h=' + miFecha.getTime();
	ajax.open("GET", datos + hora);
	
	ajax.onreadystatechange=function() {
		if (ajax.readyState==4) {
			divCuerpo.innerHTML = ajax.responseText;
			divCuerpo.disabled=false;
		}
	}
	ajax.send(null);
	
}

function LlamadaAjax2(datos,divi){
  //alert(consulta);
	divCuerpo = document.getElementById(divi);
	divCuerpo.disabled=true;
	//divCuerpo.innerHTML="<table width=100% height=100%><tr><td align=center valign=middle><img border=0 src=ajax/cargando_barra.gif><br><font color=004284>processing...</font></td></tr></table>";
	ajax=objetoAjax();
	miFecha = new Date() 
	hora='&h=' + miFecha.getTime();
	ajax.open("GET", datos + hora);
	
	ajax.onreadystatechange=function() {
		if (ajax.readyState==4) {
			divCuerpo.innerHTML = ajax.responseText;
			divCuerpo.disabled=false;
		}
	}
	ajax.send(null);
	document.getElementById('div_loading1').style.visibility='hidden';
	document.getElementById('div_loading2').style.visibility='hidden';
}



function ComandoAjax(datos,dia,mes,ano){
  //alert(consulta);
	//divCuerpo = document.getElementById('cuerpo');
	ajax=objetoAjax();
	miFecha = new Date() 
	hora='&h=' + miFecha.getTime();
	ajax.open("GET", datos + hora,0);
	
	ajax.onreadystatechange=function() {
		if (ajax.readyState==3) {
			//LlamadaAjax('sub_calendario.php?ano=' + ano + '&mes=' + mes);
		}
	}
	ajax.send(null);
}

function instruccion_ajax(dia,ultimo_dia,ano,mes,thab,libres,precio){
	libres=document.getElementById('libre_' + thab + '_' + dia);
	precio=document.getElementById('precio_' + thab + '_' + dia);
	datos='actualiza.php?fecha=' + ano + '-' + mes + '-' + dia + '&thab=' + thab + '&libres=' + libres + '&precio=' + precio;
	ajax=objetoAjax();
	miFecha = new Date() 
	hora='&h=' + miFecha.getTime();
	ajax.open("GET", datos + hora);
	ajax.onreadystatechange=function() {
		if (ajax.readyState==4) {
			
		}
	}
	
	ajax.send(null);
}
function llama_guardar(thab,ultimo_dia) {
	document.getElementById('div_loading1').style.visibility='visible';
	document.getElementById('div_loading2').style.visibility='visible';	
	funcion='guardar(' + thab + ',' + ultimo_dia + ')';
	setTimeout(funcion,2000);
}
function guardar(thab,ultimo_dia)
{
	div=document.getElementById('cuerpo');
	div.disabled=true;

	ano=document.getElementById('ano');
	mes=document.getElementById('mes');
	for (i=1;i<=ultimo_dia;i++){
		libres=document.getElementById('libre_' + thab + '_' + i);
		precio=document.getElementById('precio_' + thab + '_' + i);
		ComandoAjax('actualiza.php?fecha=' + ano.value + '-' + mes.value + '-' + i + '&thab=' + thab + '&libres=' + libres.value + '&precio=' + precio.value,i,mes.value,ano.value);
	}
	div.disabled=false;
	//while (eldia!=ultimo_dia){ }
	LlamadaAjax2('sub_calendario.php?ano=' + ano.value + '&mes=' + mes.value,'cuerpo');
}

function LibreTodas(n,ultimo_dia,thab){
	for (i=1;i<=ultimo_dia;i++){
		libres=document.getElementById('libre_' + thab + '_' + i);
		libres.value=n;
	}
}

function PrecioTodas(n,ultimo_dia,thab){
	for (i=1;i<=ultimo_dia;i++){
		precio=document.getElementById('precio_' + thab + '_' + i);
		precio.value=n;
	}
}

function format_number(pnumber,decimals){
	if (isNaN(pnumber)) { return '0,00'};
	if (pnumber=='') { return '0,00'};
	
	var snum = new String(pnumber);
	var sec = snum.split(',');
	var whole = parseFloat(sec[0]);
	var result = '';
	
	if(sec.length > 1){
		var dec = new String(sec[1]);
		dec = String(parseFloat(sec[1])/Math.pow(10,(dec.length - decimals)));
		dec = String(whole + Math.round(parseFloat(dec))/Math.pow(10,decimals));
		var dot = dec.indexOf(',');
		if(dot == -1){
			dec += ','; 
			dot = dec.indexOf(',');
		}
		while(dec.length <= dot + decimals) { dec += '0'; }
		result = dec;
	} else{
		var dot;
		var dec = new String(whole);
		dec += ',';
		dot = dec.indexOf(',');		
		while(dec.length <= dot + decimals) { dec += '0'; }
		result = dec;
	}	
	return result;
}


function EjecucionAjax(datos,asincrono,retorno){
	ajax=objetoAjax();
	miFecha = new Date() 
	hora='&h=' + miFecha.getTime();
	ajax.open("GET", datos + hora,asincrono);
	ajax.send(null);
	
	if (retorno>0)
		return ajax.responseText;
}

function RealizarReserva(cuenta,noches,fecha){
	form=document.getElementById('formulario');
	if(IsNumeric(reserva=EjecucionAjax('registrareserva.php?nombre='+form.nombre.value.replace(" ","%20")+'&apellidos='+form.apellidos.value.replace(" ","%20")+'&pais='+form.pais.value.replace(" ","%20")+'&telefono='+form.telefono.value.replace(" ","%20")+'&email='+form.email.value.replace(" ","%20")+'&hora='+form.hora.value.replace(" ","%20")+'&titular_tjt='+form.titular_tjt.value.replace(" ","%20")+'&ntjt='+form.CardNumber.value.replace(" ","%20")+'&tipo_tjt='+form.CardType.value.replace(" ","%20")+'&mes_tjt='+form.ExpMon.value.replace(" ","%20")+'&ano_tjt='+form.ExpYear.value.replace(" ","%20")+'&cvv2='+form.cvv2.value.replace(" ","%20")+'&fecha_res='+fecha+'&noches='+noches+'&total='+form.total.value,0,1))==true){
		for (i=1;i<=cuenta;i++){
			if (document.getElementById('nhab_'+i)){
				if (document.getElementById('nhab_'+i).value>0){
					EjecucionAjax('registrareserva_tipohabitacion.php?reserva='+reserva+'&thab='+i+'&nhab='+document.getElementById('nhab_'+i).value+'&noches='+noches+'&precio='+document.getElementById('precio_noche_'+i).value+'&fecha='+fecha,0,0);
				}
			}
		}
		document.getElementById('div_reserva').innerHTML=EjecucionAjax('confirmacion.php?reserva='+reserva,0,1);
	}
	else {
		alert ("An error has occurred and has not been able to make the reservation.\n Verify that all data are correct and try again.");
	document.getElementById('div_loading1').style.visibility='hidden';
	document.getElementById('div_loading2').style.visibility='hidden';
	}
}

function MuestraDivs(cuenta,noches,fecha){

	divl1=document.getElementById('div_loading1');
	divl2=document.getElementById('div_loading2');
	document.getElementById('div_confirmacion').style.visibility='hidden';
	//document.getElementById('div_titular').style.visibility='hidden'	
	divl1.style.visibility='visible';
	divl2.style.visibility='visible';
	divl2.innerHTML="<table width=100% height=100%><tr><td align=center valign=middle><img border=0 src=ajax/cargando_barra.gif><br><font color=004284>processing...</font></td></tr></table>";
	divl1.style.width='101%';
	divl2.style.width='101%';
	divl1.style.height='100%';
	divl2.style.height='100%';
	funcion='RealizarReserva(' + cuenta + ',' + noches + ',\'' + fecha + '\')';
	setTimeout(funcion,2000);
}

function total(cuenta){
	var total=0;
	for (i=1;i<=cuenta;i++){
		if (document.getElementById('precio_noche_'+i))
			total+=document.getElementById('precio_noche_'+i).value * document.getElementById('nhab_'+i).value;
	}
	document.getElementById('total').value=total;
	document.getElementById('div_total').innerHTML=format_number(total,2)+'&euro;';
	return total;
}

function ConfirmarReserva(form,cuenta,noches,fecha){
	for (i=1;i<form.length;i++){
		if (!form.elements[i].value){
			alert ("You must complete all the fields that are marked with an (*)");
			return;
		}
	}
	if (form.email.value!=form.email2.value){
		alert ("Fields of E-Mail mismatch.");
		return;
	}
	else if (!(form.email.value.indexOf('@')>0) || !(form.email.value.indexOf('.')>0)) {
		alert ("E-Mail is not correct");
		return;
	}
	if (CheckCardNumber(form))
		MuestraDivs(cuenta,noches,fecha);
}

function IsNumeric(sText)
{
   var ValidChars = "0123456789.";
   var IsNumber=true;
   if (sText.length<=0)
   	IsNumber=false;
   var Char;
   for (i = 0; i < sText.length && IsNumber == true; i++) 
      { 
      Char = sText.charAt(i); 
      if (ValidChars.indexOf(Char) == -1) 
         {
         IsNumber = false;
         }
      }
   return IsNumber;
}

function muestra_confirmar() {
	for (i=1;i<=6;i++) {
		if(document.getElementById('nhab_'+i))
			document.getElementById('nhab_'+i).style.visibility='hidden';
	}
	document.getElementById('div_confirmacion').style.visibility='visible';
}

function oculta_confirmar() {
	for (i=1;i<=6;i++) {
		if(document.getElementById('nhab_'+i))
			document.getElementById('nhab_'+i).style.visibility='visible';
	}
	document.getElementById('div_confirmacion').style.visibility='hidden';
	document.getElementById('div_titular').style.visibility='hidden';
}

function muestra_calendario_ajax() {
	div=document.getElementById('div_cal');
	//div.style.left=window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
	//div.style.top=window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;

	div.style.left=posX;
	div.style.top=posY;
	div.style.visibility='visible';
	document.getElementById('div_loading').style.visibility='visible';
	LlamadaAjaxB('calendario_ajax.php?o=p','div_cal');
}
	document.onmousemove = function(evt) {
		if (typeof evt == 'undefined') {
			myEvent = window.event;
		} else {
			myEvent = evt;
		}
		if(myEvent.clientX){
			posX = myEvent.clientX+document.body.scrollLeft;
			posY = myEvent.clientY+document.body.scrollTop;
		}
		else if(myEvent.pageX){
			posX = myEvent.pageX+window.pageXOffset;
			posY = myEvent.pageY+window.pageYOffset;
		}
	}
