// JavaScript Document

//Contiene la id de la combinacion, la fecha maxima de disponibilidad, y su precio final
//[posicion de la combi, fecha final de la combi]
var ar_precios = new Array();
//dias minimos de alquiler
var dias_minimos = 3;
//Contiene la id de la combinacion, la fecha maxima de disponibilidad, y su precio final
var combis = new Array();
$("#num_personas").val("null");


function initialize(){	
 $(".day").click(function () { 					
     update_day($(this));   
    });
}
 
 function update_day(dia){
	
	if($("#start_day").html()==""/* || ( $("#start_day").html()!="" && $("#end_day").html()!="")*/)
	{	
		if (! $(dia).hasClass("ocupado"))
		{
			//
			//   -> dia de llegada escogido
			//	
			if (dia_siguiente_ocupado(dia))
			{
				show_error("El dia siguiente esta ocupado, escoja otro dia de llegada.");
			}
			else
			{
				paso_transition("llegada", "salida");			
				$("#salida .modificar").hide();					
				$(dia).addClass("start_date");
				$("#start_day").html(id_to_date_format($(dia).attr("id")));
				$(".llegada_bis").html(id_to_date_format($(dia).attr("id")));
				var css = $(dia).attr("class");
				//quitamos las classes alta y normal para quedarse solo con las de ocupacion
				css = css.replace("alta ","").replace("normal ","").replace("day ","").replace("start_date","").split(" ");
				//quitamos los dias ocupados del piso por el cual empezamos
				$(".day:not(.ocupado)").addClass("possible");
				$(dia).removeClass("possible");
				var ind_css_ocupado=0;
				var id_next = "0";
				//$("#apartamentos_disponibles").html("<br />Llegando el "+id_to_date_format($(dia).attr("id"))+" tiene puede disfrutar de estos apartamentos:");
				
				for ( var z = 0; z < combis.length ; z++)
				{
					// Comentado: Sirve para que no ponga de inicio en el array de precios un piso que ya esta ocupado el primer dia
					// --> comentado para que se pueda ver el piso desactivado.
				/*	if(combis[z][0] == css[ind_css_ocupado])
					{
						
						ind_css_ocupado++;
					}
					else
					{	*/
						
						//TODO: Ver para que sirve find_next
						var id_tmp = find_next($(dia).attr("id"),combis[z][0]);
						
						//var id_tmp = "2011_12_31";
						
						ar_precios[z-ind_css_ocupado]= new Array(z,id_tmp,0);
											
						if (id_next.replace(/_/g,"")   < id_tmp.replace(/_/g,"") )
						{
							id_next = id_tmp;
						}
					/*}*/
				}
				
				
				
				
				/*if (id_next == 0)
				{
					id_next = $("td.day:last").attr("id");
				}*/
				
				//quitamos los dias anteriores a los dias de la fecha inicial	
				unselectable_days($("td.day:first").attr("id"), $(".start_date").attr("id"));
				
				//quitamos los dias posteriores al ultimo dia con disponibilidad possible
				unselectable_days( id_next ,$("td.day:last").attr("id"));
				$(".possible.unselectable").removeClass("possible");
				var fd = id_to_date($(dia).attr("id"));
				var fd_next = id_to_date(id_next);
								
				if (fd.getMonth()>=10 && fd_next.getFullYear()>fd.getFullYear() )
				{
					change_year(1);
				}
				
			}
			
			
		}
		else
		{
			show_error("No puede empezar por un dia ocupado");
		}
		
		
	}
	else
	{
		if ($(dia).hasClass("possible"))
		{
			//Dia llegada < dia salida
			if($(".start_date").attr("id").replace(/_/g,"")<$(dia).attr("id").replace(/_/g,""))
			{	
				if (minimo_dias(dia))
				{
					//Dia llegada <-> dia salida => Dias ocupados?
					if (libre($(".start_date").attr("id"),$(dia).attr("id")))
					{
						//
						//  --> dia de salida escogido
						//
						$(".salida_bis").html(id_to_date_format($(dia).attr("id")));	
						$("#end_day").html(id_to_date_format($(dia).attr("id")));
						paso_transition("salida", "posibilidades");
						$(dia).addClass("end_date");
						$(".possible").removeClass("possible");
						marcar_dias($(".start_date").attr("id"),$(dia).attr("id"));
						show_pasos ("Si le gusta su seleccion, apriete sobre el boton siguiente, sino vuelva a escoger un dia de llegada.");
						unselectable_days( $(dia).attr("id")  ,(new Number($("#calendar_year").html())+1)+"_01_01");
						$(".end_date").removeClass("unselectable");
						$(".start_date").removeClass("middle_date");
						$("div.month").hide();
						$("#leyenda").hide();
						$("#year").hide();
						$("#bt_toggle_legend").hide();
						$(".middle_date").parent().parent().parent().parent().show();
						$(".start_date").parent().parent().parent().parent().show();
						$(".end_date").parent().parent().parent().parent().show();
						show_precios();		
					}
					else
					{
						show_error("Hay dias ocupados en el rango de fechas escogido");
					}
				}
				else
				{
					show_error("El alquiler ha de ser de minimo "+	dias_minimos +" dias." );	
				}
				
			}
			else
			{				
				show_error("El dia de salida no puede ser anterior al dia de llegada");
			}
		}
		else
		{
			show_error("Este dia de salida no esta disponible para el apartamento. Los dias disponibles estan en negrita.");
		}
	}
}

function minimo_dias(dia){
	var start = id_to_date($(".start_date").attr("id")); 
	var end = id_to_date($(dia).attr("id"));
	start.setDate(start.getDate()+(dias_minimos-1));
	return start<end;
}


function get_leyenda(){
	var leyenda = "<span id=\"bt_toggle_legend\" onclick=\"javascript:view_legend()\">Ver precios</span><table><tr class=\"header\"><td>&nbsp;&nbsp;&nbsp;&nbsp;Leyenda:&nbsp;&nbsp;&nbsp;&nbsp;</td><td class=\"alta\">Temporada alta</td><td class=\"normal\">Temporada normal</td></tr>";
	for (var i = 0 ; i < combis.length; i++)
	{
		leyenda += "<tr ><td> Apartamento "+combis[i][0]+"</td><td class=\"alta\">"+combis[i][2]+" euros/dia</td><td class=\"normal\">"+combis[i][1]+" euros/dia</td></tr>";
	}
	leyenda += "</table>";
	return leyenda;
	
}


function dia_siguiente_ocupado(dia)
{
var d = id_to_date($(dia).attr("id"));
d.setDate(d.getDate()+1);
return $("#"+date_to_id(d)).hasClass("ocupado") ;

}

function change_year(s)
{	
	var year=new Number($("#calendar_year").html());
	if (year=="")
	{
		var d = new Date();
		year = d.getFullYear();
	}
	
	
	if( s<0 && year > (new Date()).getFullYear() )
	{
	year = year-1;
	}
	else if( s>0 )
	{
		year =year+1;
	} 
	var url_add ="";
	if($("#start_day").html()!="")
	{	
		url_add = "&hide_year=1";
	}
	 $.ajax({
  		url: 'calendar_maker.php',
		data: 'personas='+new Number($("#num_personas").val())+'&year='+year+url_add,
		beforeSend:function(data) {
			$("body").css("height","1500px");
			show_loader();
			if($("#start_day").html()=="")
			{	
				$("#llegada .paso_detalles").slideDown();
				$("#llegada").removeClass("disabled");
				$("#personas").addClass("disabled");
				$("#personas .paso_detalles").slideUp();
				$(".personas_bis").html($("#num_personas").val()+" personas");
				$("#year").slideDown();
				$("#full_calendar").fadeIn(1000);
				$("#personas .modificar").show();
				$("#llegada .modificar").hide();
				$("#salida .modificar").hide();
				//$("#availibility_calendar").html("<img src=\"http://www.nyweeks.com/images/ajax-loader.gif\" alt=\"Estamos cargando el calendario\"><span> Cargando el calendario.</span>");
				
			}
			},
			
		error : function(data) {
			show_error("Ha habido un problema con la carga del calendario. Vuelva a intentarlo en unos momentos. por favor.<br /> <br /> Si el problema persiste, no dude en utilizar <a onclick=\"javascript:openHelp()\">nuestro formulario de contacto</a>.");},
  		success: function(data) 
		{
			
			$("#loader").overlay().close();
			
			year=new Number($("#calendar_year").html());
			if (year=="")
			{
				var d = new Date();
				year = d.getFullYear();
			}
			if( s<0 && year > (new Date()).getFullYear() )
			{
				year = year-1;
			}
			else if( s>0 )
			{
				year =year+1;
			} 			
			$("#calendar_year").html(""+year); 
			
			
			if($("#start_day").html()=="")
			{	
				
				var datos = data.split("__SPLIT__");
				eval(datos[0]);
				$("#availibility_calendar").html(datos[1]);
				$("#leyenda").html(get_leyenda());
				//$("#leyenda").fadeIn(); 
			}
			else
			{
				var datos2 = data.split("__SPLIT__");
				$("#availibility_calendar").html($("#availibility_calendar").html()+datos2[1]);
				
				
			for ( var z = 0; z < ar_precios.length ; z++)
				{
					var id_tmp = find_next($(".start_date").attr("id"),combis[ar_precios[z][0]][0]);
					ar_precios[z][1] = id_tmp;
				}
				
				
				
				
			}

			if(year > (new Date()).getFullYear() )
			{
				$("#calendar_year_less").show();
			}
			else
			{
				$("#calendar_year_less").hide();
			}
			if($("td.day:last").attr("id") ==  (new Number($("#calendar_year").html()))+"_12_31")
			{
				$("#calendar_year_more").show();
			}
			else
			{
				$("#calendar_year_more").hide();
			}
			initialize();
			$('#leyenda tr:not(.header) td').hide();
			
  		}
	});
}

function show_loader(){
	$("#loader").overlay({ 
		  top: 272, 
		  expose: { 
			  color: '#000', 
			  loadSpeed: 200, 
			  closeSpeed: 0,
			  opacity: 0.5 
		  }, 
		  closeOnClick: false, 
		  api: true 
	  }).load();
}


function show_error(str){


	//$("#error").html("<div class=\"close\"></div><div> <span>Lo lamentamos</span><br /><span>"+str+"</span></div><br class=\"clear\" />");
	//$("#loader").overlay().close();
	$("#error").html("<div><div class=\"close\"></div> <h2>Lo lamentamos,</h2><span>"+str+"</span></div>");
	
	  $("#error").overlay({ 
		  top: 272, 
		  mask: { 
			  color: '#000', 
			  loadSpeed: 200,
			  closeSpeed: 0, 
			  opacity: 0.5 
		  }, 
		  closeOnClick: false, 
		  api: true ,
		  load:true
	  });
	//$.mask.load();
}

function find_next( idRalla , classe )
{
	var id=idRalla.replace(/_/g,"");
	/* Cogemos todos los dias que tengan la classe en cuestion */
	var ar_sol=$("."+classe);
	var i = 0;
	var id_res = (new Number($("#calendar_year").html())+1)+"_01_01";
	while ( i<ar_sol.length  && id > $(ar_sol[i]).attr("id").replace(/_/g,"") )
	{
		i++;
	}
	if (i<ar_sol.length)
	{
		id_res =($(ar_sol[i]).attr("id"))
	}
	return id_res ;
}

function libre(start,end)
{

	var start_date = id_to_date(start);	
	var end_date = id_to_date(end);
	
	var empty = true;
	
	while (empty && !(start_date.getDate()==end_date.getDate() && start_date.getMonth()==end_date.getMonth() &&start_date.getFullYear()==end_date.getFullYear()  ))
	{
		if ($("#"+date_to_id(start_date)).hasClass("ocupado") )		
		{
			empty = false;
			
		}
		start_date.setDate(start_date.getDate()+1);
	}
	
	return empty;
}

function search_last_available_day(start)
{	
	var start_date = id_to_date(start);
	
	var end_date = new Date();
	end_date.setMonth(11,31);
	end_date.setFullYear(start_date.getFullYear());
	
	while (  $("#"+date_to_id(start_date)).hasClass("possible") && !$("#"+date_to_id(start_date)).hasClass("unselectable") && (start_date < end_date)   )
	{
		start_date.setDate(start_date.getDate() + 1);	
	}
	return date_to_id(start_date);
}

function unselectable_days(start, end)
{
	var start_date = id_to_date(start);
	var end_date = id_to_date(end);
	
	while (start_date<end_date)
	{
		$("#"+date_to_id(start_date)).addClass("unselectable");
		start_date.setDate(start_date.getDate()+1);
	}
	chivato ( "unselectable_days salgo "+start+"/"+end);
	
}
	

function marcar_dias(start,end)
{
	var start_date= id_to_date(start);
	
	var end_date = id_to_date(end);
	start_date.setDate(start_date.getDate());
	end_date.setDate(end_date.getDate());
	
	while ( start_date < end_date)
	{
		$("#"+date_to_id(start_date)).addClass("middle_date");
		update_price(start_date);
		start_date.setDate(start_date.getDate()+1);
	}	
}

function show_precios()
{
	var numero = 0;
	for(var i = 0 ; i<ar_precios.length;i++)
	{
		var posit = ar_precios[i][0];
		//Si la fecha final del alquiler escogido es menor al primer dia no disponible de ese piso, se puede reservar
		if (id_to_date($(".end_date").attr("id")) <= id_to_date(ar_precios[i][1]))
		{
			write_option(numero,combis[posit][0],combis[posit][5],combis[posit][3],combis[posit][4],ar_precios[i][2]);	
			numero ++;
		}
		else
		{
			write_option_disabled(combis[posit][0],combis[posit][5],combis[posit][3],combis[posit][4],ar_precios[i][2]);	
		}
	}
	
}

function write_option(numero,opcion,personas,habitaciones,banos,precio)
{

var str ="<div class=\"opcion\"><div class=\"numero\"><span>"+(numero+1)+"</span></div>    <div class=\"imagen\"><img src=\"http://nyweeks.com/images/apt_"+opcion+"_1.png\" alt=\"Foto del apartamento "+opcion+"\" /></div>    <div class=\"descripcion\"><span class=\"tipo\">Apartamento "+personas+" personas</span><br /><br /><span>- "+habitaciones+" habitaciones</span><br />      <span>- "+banos+" cuarto de ba&ntilde;o</span><br /><br />      <span> <a  href=\"/apartamento/#"+opcion+"\">+ Ver mas detalles</a></span></div>    <div class=\"precio\"><span class=\"por\">Por</span>      <span class=\"precio\">"+precio+" &euro;</span><br />      <a  class=\"reservar_new\" href=\"/reservas/datos.php?start="+ $("#start_day").html() +"&amp;end="+$("#end_day").html() +"&amp;option="+opcion+"&amp;personas="+$("#num_personas").val()+"\">Reservar esta opcion</a> </div>  </div><br class=\"clear\" />";

$("#apartamentos_precios").html($("#apartamentos_precios").html()+str);
}

function write_option_disabled(opcion,personas,habitaciones,banos,precio)
{

var str ="<div class=\"opcion no_disponible\"><div class=\"numero\"><span>&nbsp;&nbsp;</span></div><div class=\"imagen\"><img src=\"http://nyweeks.com/images/apt_"+opcion+"_1.png\" alt=\"Foto del apartamento "+opcion+"\" /></div>    <div class=\"descripcion\"><span class=\"tipo\">Apartamento "+personas+" personas</span><br /><br /><span>- "+habitaciones+" habitaciones</span><br />      <span>- "+banos+" cuarto de ba&ntilde;o</span><br /><br />      <span> <a  href=\"/apartamento/#"+opcion+"\">+ Ver mas detalles</a></span></div>    <div class=\"precio\"><span class=\"por\">Por</span>      <span class=\"precio\">"+precio+" &euro;</span><br /><br /><br /><br /> <span class=\"no_disponible\">No disponible estas fechas</span> </div>  </div><br class=\"clear\" />";

$("#apartamentos_precios").html($("#apartamentos_precios").html()+str);
}

function update_price(start_date)
{
	var ind_precio = 2;
	if($("#"+date_to_id(start_date)).hasClass("normal"))
	{
		ind_precio = 1;
	}
	for(var i = 0 ; i<ar_precios.length;i++)
	{
		ar_precios[i][2]+= new Number(combis[i][ind_precio]);
		//alert (combis[i][ind_precio]);
	}
	
	
}

function date_to_id(d)
{
	var dia=d.getDate();
	var mes=(d.getMonth())+1;
	if (mes<10)
	{
		mes="0"+mes;
	}
	if (dia<10)
	{
		dia="0"+dia;
	}
	
	return d.getFullYear()+"_"+mes+"_"+dia;
}

function id_to_date(d)
{
	var d_date = new Date();
	var d_ar = d.split("_");
	d_date.setFullYear(new Number (d_ar[0]));
	d_date.setMonth(new Number (d_ar[1])-1,new Number (d_ar[2]));
//	d_date.setDate(new Number (d_ar[2]));


	return d_date;
}

function id_to_date_format(d)
{
	var d_ar = d.split("_");
	return new Number (d_ar[2])+"/"+ new Number (d_ar[1])+"/"+new Number (d_ar[0]);
}



function show_pasos(str){
	$("#pasos").html(str);
}

function paso_transition(from,to){
	move_calendar(to);
	$("#"+to+" ").removeClass("disabled");
	$("#"+to+" ").fadeIn(1000);
	$("#"+from+"").addClass("disabled");
	$("#"+from+" .paso_detalles").slideUp(2000,function(){$("#"+from+" .modificar").show();	});	 
	$("#"+to+" .paso_detalles ").slideDown(1000);
	}
	
function move_calendar(to){
	$("#full_calendar").appendTo("#"+to);
	$("#full_calendar").show();
}


function chivato(str){
	//alert(str);
}

function reset_ar_precios()
{
	for ( var i=0;i<ar_precios.length;i++){
		ar_precios[i][2]=0;
	}
}


function modify(c,rst){
	$("#apartamentos_disponibles").html("");
	$("#apartamentos_precios").html("");	
	$(".modificar").show();	
	switch (c)
	{
		case 'personas':
			$(".personas_bis").html("");
			$("#personas .modificar").hide();	
			$("#num_personas").val("null");
		case 'llegada':
			
			$(".start_date").removeClass("start_date");			
			$("#start_day").html("");
			$(".llegada_bis").html("");
			$("#llegada .modificar").hide();	
		case 'salida':
			$(".day:not(.ocupado)").addClass("possible");
			$(".unselectable").removeClass("unselectable");
			$(".middle_date").removeClass("middle_date");
			$(".end_date").removeClass("end_date");
			$("#end_day").html("");
			$(".salida_bis").html("");
			$("#salida .modificar").hide();	
			$("div.month").show();
			//$("#leyenda").show();
			$("#year").show();
			$("#bt_toggle_legend").show();
			
		break;
	}
	if (rst)
	{	
		$("#personas").addClass("disabled");	
		$("#llegada").addClass("disabled");
		$("#salida").addClass("disabled");
		$("#posibilidades").addClass("disabled");
		move_calendar("llegada");		
		switch (c)
		{
			case 'personas':			
				$("#personas").removeClass("disabled");	
				$("#personas .paso_detalles ").slideDown(1000);
				$("#full_calendar").hide();
				break;
			case 'llegada':	
				$("#llegada").removeClass("disabled");			
				$("#llegada .paso_detalles ").slideDown(1000);				
				break;
			case 'salida':	
				$("#salida").removeClass("disabled");
				$("#salida .paso_detalles ").slideDown(1000);
				move_calendar("salida");
				unselectable_days($("td.day:first").attr("id"), $(".start_date").attr("id"));
				$(".possible.unselectable").removeClass("possible");
				reset_ar_precios();
				break;
		}
	}
		
	
}

function view_legend(){
	if ($('#bt_toggle_legend').html() == "Ver precios")
	{
		$('#leyenda tr:not(.header) td').fadeIn();
		$('#bt_toggle_legend').html("Esconder precios");
	}
	else{
		$('#bt_toggle_legend').html("Ver precios");
		$('#leyenda tr:not(.header) td').fadeOut();
	}

}




