var months=['Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'];
var weekdays=['Domingo','Lunes','Martes','Miercoles','Jueves','Viernes','Sabado'];
var channels = ["fox","sny","wb","uni","axn","fx","sat","liv"];
var horarios = [["20","00"],["20","30"],["21","00"],["21","30"],["22","00"],["22","30"],["23","00"],["23","30"]];
var possibleStatus = {'E':'Estreno','R':'Repetición','P':'Estreno de temporada', 'F':'Final de temporada', 'N':'Nueva serie', 'U':''};
var possibleType = {'E':'Esta información fue suministrada por el canal, pero es posible que sea incorrecta debido a que no coincide con el resto de las transmisiones o con el listado de capitulos de esta serie','S':'Esto es una suposición, ya que el canal no ha dado información de qué episodio va a transmitir','N':''};
var calendarTypes = ['monthly','weekly','daily'];
var today=new Date();
var currentCalendar;
var currentDay;
var currentmin=new Array; var currentmax=new Array;
var mouseX;
var mouseY;
var vmul=readCookie('expandv') || 1;
var hmul=readCookie('expandh') || 1;
var dateArray;
var isWaiting;
var currentAbsMin,currentAbsMax;
var BODY;
$(document).ready(
  function(){
	BODY=document.getElementsByTagName("body")[0];
	$("#topcontent,#calendar").show();
	$("#topcontent").css("width",Math.floor( Math.floor( $(window).width()-180 )/7) *7 - (vmul==1?0:15));
   switchTo(calendarTypes[settings.view]);
	 
	$().mousemove(function(e){
		mouseX=e.pageX;
		mouseY=e.pageY;
	});
	 
	$.ajaxSetup({error:function (XMLHttpRequest, textStatus, errorThrown) { ajaxError(XMLHttpRequest, textStatus,errorThrown); },timeout:30000, beforeSend:function(){ BODY.style.cursor="wait"; }, complete:function(){ BODY.style.cursor="auto"; } });
	 
	$(window).resize(function(){
		resize();
	});
	if($.browser.msie){
		if($.browser.version<=6) $(".ie6msg").show();
		else $(".iemsg").show();
	}
	
  }
);

function goTo(d){
   switch(currentCalendar){
      case "monthly": switchToMonth(currentYear,currentMonth+d); break;
      case "weekly": switchToWeek(currentYear,currentMonth,currentDay+(d*7)); break;
      case "daily": switchToDay(currentYear,currentMonth,currentDay+d); break;
   }
}
function reloadCalendar(){
	eventCache.clear();
	switchTo(currentCalendar);
}
function switchTo(type){
   switch(type){
      case "monthly": switchToMonth(currentYear,currentMonth); break;
      case "weekly": switchToWeek(currentYear,currentMonth,currentDay); break;
      case "daily": switchToDay(currentYear,currentMonth,currentDay); break;
   }
}
function switchToMonth(y,m,callback){
	$("#topcontent .tab").removeClass('current');
	$("#topcontent .tab-monthly").addClass('current');
	clear();
	isWaiting=false;
	var temp=new Date(y,m-1)
	currentMonth=temp.getMonth()+1;
	currentYear=temp.getFullYear();
	currentDay=(m-1==today.getMonth()?today.getDate():1);
	currentCalendar="monthly";
	message("Cargando eventos...","info");
	dateArray=buildDates(m,y);
	currentmin = dateArray[0];
	currentmax = dateArray[dateArray.length-1];
	drawCalendar(dateArray);
	reloadEvents(callback,true);
}
function switchToWeek(y,m,d){
	$("#topcontent .tab").removeClass('current');
	$("#topcontent .tab-weekly").addClass('current');
	clear();
	var temp=new Date(y,m-1,d)
	var temp2=new Date(temp.getFullYear(),temp.getMonth(),temp.getDate()-weekDay(temp.getDay()))
	var temp3=new Date(temp2.getFullYear(),temp2.getMonth(),temp2.getDate()+6)
	currentMonth=temp.getMonth()+1;
	currentYear=temp.getFullYear();
	currentDay=(temp.getWeek()==today.getWeek()?today.getDate():temp2.getDate());
	currentCalendar="weekly";
	dateArray=buildDates(temp2.getMonth()+1,temp2.getFullYear(),temp2,temp3);
	currentmin = dateArray[0];
	currentmax = dateArray[dateArray.length-1];
	drawCalendar(dateArray);
	reloadEvents(false,true);
}
function switchToDay(y,m,d){
	$("#topcontent .tab").removeClass('current');
	$("#topcontent .tab-daily").addClass('current');
	clear();
	var temp=new Date(y,m-1,d)
	currentMonth=temp.getMonth()+1;
	currentYear=temp.getFullYear();
	currentDay=temp.getDate();
	currentCalendar="daily";
	currentmin=currentmax=[currentYear,currentMonth,currentDay]
	message("Cargando eventos...","info");
	dateArray=buildDates(m,y);
	drawDayCalendar(temp);
	reloadEvents(false,true);
}

function buildDates(m, y, from, to){
	var curr = new Date(y, m-1, 1);
	var res = new Array();
	var a=new Date(y,m-1,1-weekDay(curr.getDay()));
	while(a.getMonth()!=(curr.getMonth()+1)%12 || weekDay(a.getDay())!=0){
		  res.push( [a.getFullYear(),a.getMonth()+1,a.getDate()] );
		  a = new Date(a.getFullYear(),a.getMonth(),a.getDate()+1)
	}
	currentAbsMin=res[0];
	currentAbsMax=res[res.length-1];
	if(from && to){
		res = [];
		var a=from;
		while(a<=to){
			  res.push( [a.getFullYear(),a.getMonth()+1,a.getDate()] );
			  a = new Date(a.getFullYear(),a.getMonth(),a.getDate()+1)
		}
	}
	return res;
}

function weekDay(d){
	if(!settings.firstday) return d
   if(d==0) return 6;
   else return d-1;
}
function zeroFilledDate(arr,un){
   var res=arr[0];
   res+=un;
   if(arr[1]<10) res+="0";
   res+=arr[1];
   res+=un;
   if(arr[2]<10) res+="0";
   res+=arr[2];
   return res;
}

function drawCalendar(dateArray){
	drawMiniCalendar(currentYear,currentMonth);
	
	BODY.removeChild(document.getElementById("calendar"));
	var newEl = document.createElement("div");
	newEl.setAttribute("id","calendar");
	BODY.appendChild(newEl);
	
	var content="";
   for(var i = 0; i < dateArray.length; i++){
	   var y=dateArray[i][0]; var m=dateArray[i][1]; var d=dateArray[i][2];
   	  if(i%7==0) content+="<div class='weekselector' onClick='switchToWeek("+y+","+m+","+d+")'></div>";
      content+="<div id='"+zeroFilledDate([y,m,d],"")+"' class='day";
	  if(m==currentMonth && y==currentYear) content+=" dayOfMonth"; else  content+=" dayNotInMonth";
	  if(d==today.getDate() && m==(today.getMonth()+1) && y==today.getFullYear()) content+=" today";
	  content+="'>"
	  		+"<div class='daybar'>"
			+ (role=="admin" ? "<div class='daytools'><img src='imagenes/plus.png' onClick='addEvent("+y+","+m+","+d+")' /></div>" : "")
			+"<div class='daynum' onClick='switchToDay("+y+","+m+","+d+")'>"+d+"</div>"
			+"</div>"
	  		+"<div class='scrollbar hide'><div class='scrollbar-up scrollbar-up-off' onclick=\"scrollUp('"+zeroFilledDate([y,m,d],"")+"');\"></div>"
		 	+"<div class='scrollbar-down' onclick=\"scrollDown('"+zeroFilledDate([y,m,d],"")+"');\"></div></div>"
	  		+"<div class='content'></div>"
			+"</div>";
   }
	$("#calendar").html('<div id="weekdays">'+(settings.firstday?"":"<div>D</div>")+'<div>L</div><div>M</div><div>M</div><div>J</div><div>V</div><div>S</div>'+(settings.firstday?"<div>D</div>":"")+'</div><div id="days"></div>');
   $("#days").html(content);
	$(".day .content").mousewheel(function(e,direction){
		if($(this).get(0).scrollHeight<=$(this).get(0).clientHeight) return true;
		if(direction==-1) scrollDown($(this).parent().attr('id'));
		else scrollUp($(this).parent().attr('id'));
		return false;
	});
   $("#title").html(months[currentMonth-1]+" "+currentYear);
   $("#calendar").append("<a class='expandv expand-"+(vmul==1?"down":"up")+"' href='#' onclick='toggleExpand(this);return false;' onmouseout='this.style.backgroundColor=\"transparent\"' onmouseover='this.style.backgroundColor=\"#E9F2FB\"'></a>");
   $("#calendar").append("<a class='expandh expand-"+(hmul==1?"left":"right")+"' href='#' onclick='toggleExpand(this);return false;' onmouseout='this.style.backgroundColor=\"transparent\"' onmouseover='this.style.backgroundColor=\"#E9F2FB\"'></a>");
   resize();
}
function drawDayCalendar(day){
	drawMiniCalendar(currentYear,currentMonth);
 	$("#calendar").empty();
	$("#calendar").append("<div id='channels'></div>"
							+"<div id='horarios'></div>"
							+"<div id='grid'></div>");
	for(var i=0;i<channels.length;i++){
		$("#channels").append("<div class='channel'><img src='imagenes/logos/channel_"+channels[i]+".png' /></div>");
	}
	for(var i=0;i<horarios.length;i++){
		$("#grid").append("<div class='horario'>"+horarios[i][0]+":"+horarios[i][1]+"</div>");
		for(var j=0;j<channels.length;j++){
			$("#grid").append("<div class='cell"+((i%2==0)?" half":"")+"' id='"+channels[j]+horarios[i][0]+horarios[i][1]+"' dur='1'></div>");
		}
	}
   $("#title").html(weekdays[day.getDay()]+" "+day.getDate()+" de "+months[day.getMonth()]+" de "+day.getFullYear());
   $("#calendar").append("<a class='expandh expand-"+(hmul==1?"left":"right")+"' href='#' onclick='toggleExpand(this);return false;' onmouseout='this.style.backgroundColor=\"transparent\"' onmouseover='this.style.backgroundColor=\"#E9F2FB\"'></a>");
   resize();
}

/* MINI-CALENDAR */
function drawMiniCalendar(y,m){
	var mindate=new Date(currentmin[0],currentmin[1]-1,currentmin[2]);
	var maxdate=new Date(currentmax[0],currentmax[1]-1,currentmax[2]);
	var content = "<table cellspacing='0'><tr><td></td>"+(settings.firstday?"":"<td>D</td>")+"<td>L</td><td>M</td><td>M</td><td>J</td><td>V</td><td>S</td>"+(settings.firstday?"<td>D</td>":"")+"</tr>";
	   
	var curr = new Date(y, m-1, 1);
	var a=new Date(y,m-1,1-weekDay(curr.getDay()));

	while(a.getMonth()!=((curr.getMonth()+1)%12) || weekDay(a.getDay())!=0){
		if(weekDay(a.getDay())==0) content += "<tr><td class='weekselector' onclick='switchToWeek("+a.getFullYear()+","+(a.getMonth()+1)+","+a.getDate()+");'></td>";
		content += "<td class='day";
		
		if(a.getMonth()==curr.getMonth()) content += " dayInMonth";
		else content += " dayNotInMonth";
		if(a>=mindate && a<=maxdate) content += " current";
		if(a.getFullYear()==today.getFullYear() && a.getMonth()==today.getMonth() && a.getDate()==today.getDate()) content += " today";
		
		content += "'><a onClick='switchToDay("+a.getFullYear()+","+(a.getMonth()+1)+","+a.getDate()+");'>"+a.getDate()+"</a></td>";
		if(weekDay(a.getDay())==6) content += "</tr>";
		a = new Date(a.getFullYear(),a.getMonth(),a.getDate()+1)
	}
	$("#minicalendar .title").html("<a onclick='switchToMonth("+curr.getFullYear()+","+(curr.getMonth()+1)+");'>"+months[curr.getMonth()]+" de "+curr.getFullYear()+"</a>");
	$("#minicalendar .prev").html("<a onclick='drawMiniCalendar("+curr.getFullYear()+","+(curr.getMonth())+");'>&laquo;</a>");
	$("#minicalendar .next").html("<a onclick='drawMiniCalendar("+curr.getFullYear()+","+(curr.getMonth()+2)+");'>&raquo;</a>");
	$("#minicalendar .table").html(content);
}

/* RESIZING */
function resize(){
	$("#calendar .day .content").attr('scrollTop', 0);
	$("#calendar").hide();
   $("#calendar,#topcontent").css("width",Math.floor( Math.floor( $(window).width()-(hmul*160)-18 )/7) *7 - (vmul==1?0:15)).css('left',(hmul*160)+8);
	if(hmul!=0) $("#minicalendar,#botones").show();
	else $("#minicalendar,#botones").hide();
   if(currentCalendar=="monthly" || currentCalendar=="weekly"){
      resizeCalendar();
   } else if (currentCalendar=="daily"){
      resizeGrid();
   }
	$("#calendar").show();
}
function resizeCalendar(){
   var dh = vmul*($(window).height()-125-8-12);
	if(dh < 250) dh = 250;
   $("#days").css("height",dh);
   var h=Math.floor(dh/($("#calendar .day").length/7))-2;
   var w = Math.floor(($("#calendar").width()-10)/7)-2; //-10->weekselector
   $("#calendar div.day").css("width",w);
   $("#calendar div.weekselector").css("height",h-16);
   $("#calendar div.day .content").css("height",h-28);
	setTimeout(function(){ makeScrollbars(); },0);
}
function resizeGrid(){
	var w = Math.floor(($("#calendar").width()-40)/channels.length)-1-8;
   $("#grid .cell").css("width",w);
   $("#channels .channel").css("width",w);
   var h = Math.floor(($(window).height()-100-8-25)/horarios.length)-1; //25 = channel height
   $("#grid .cell").each(function(i){
      $(this).css("height",h*$(this).attr('dur')-9);
		if($(this).attr('dur')>1) $(this).css("z-index",2);
      $(this).css("left",(w+9)*(i%channels.length)+40);
      $(this).css("top",h*Math.floor(i/channels.length));
   });
   $("#grid .horario").css("height",h);
}
function toggleExpand(me){
	if($(me).hasClass('expandv')){
		if(vmul==1){
			vmul=2;
			$(me).removeClass('expand-down').addClass('expand-up');
		} else {
			vmul=1;
			$(me).removeClass('expand-up').addClass('expand-down');
		}
		createCookie('expandv',vmul,90);
	} else {
		if(hmul==1){
			hmul=0;
			$(me).removeClass('expand-left').addClass('expand-right');
		} else {
			hmul=1;
			$(me).removeClass('expand-right').addClass('expand-left');
		}
		createCookie('expandh',hmul,90);
	}
	resize();
}

/* EVENT LOADING */
function reloadEvents(callback,cache){
	if(currentCalendar=="daily"){
		loadGridEvents(currentYear,currentMonth,currentDay,callback,cache);
	} else {
		loadEvents(currentmin,currentmax,callback,cache);
	}
	Popup.close();
}
function loadEvents(a,b,callback,cache){
	var ID = 0; var H = 1; var DUR = 2; var SID = 3; var EID = 4; var CID = 5; var STATUS = 6; var TYPE = 7; var SHOW = 8; var TITLE = 9;
	keepWaiting(0);
	getJSONcached(cache,function(data){
	 	$("#days div.content").empty();
		noevents = true;
		for(var i=0; i<dateArray.length;i++){
			var events=data[zeroFilledDate(dateArray[i],"")];
			if(events){
				noevents = false;
				var content="";
				for(var j=0; j<events.length;j++){
					content +="<div class='event status"+events[j][STATUS]+(role=="admin"&&(events[j][EID]==0||events[j][STATUS]=='U'||events[j][TYPE]!='N')?" notice":"")+"' etitle='"+events[j][TITLE]+"' cid='"+events[j][CID]+"' sid='"+events[j][SID]+"' status='"+events[j][STATUS]+"' type='"+events[j][TYPE]+"' hora='"+events[j][H]+"' evid='"+events[j][ID]+"'>"
					+(settings.hora?"<span class='hora'>"+events[j][H]+"</span>":"-")
					+"	<span class='show' onclick='showInfo(this.parentNode)'>"+events[j][SHOW]+"</span>"
					+(role=="admin"?"	<span class='edit' onClick='editEvent("+events[j][ID]+")'><img src='imagenes/pencil.png' /></span>":"")
					+"</div>";
				}
				var newEl = document.createElement("div");
				newEl.innerHTML = content;
				document.getElementById(zeroFilledDate(dateArray[i],"")).lastChild.appendChild(newEl);
			}
		}
		stopWaiting();
		$('#message').hide();
		if(noevents) message('No hay eventos cargados para este mes.', 'info');
		if(callback) callback();
		setTimeout(function(){
			makeScrollbars();
			Popup.init();
		},0);
	},0);
}
function loadGridEvents(y,m,d,callback,cache){
	var ID = 0; var H = 1; var DUR = 2; var SID = 3; var EID = 4; var CID = 5; var STATUS = 6; var TYPE = 7; var SHOW = 8; var TITLE = 9;
	keepWaiting(0);
	getJSONcached(cache,function(data){
	 	$(".cell").empty();
		var events=data[zeroFilledDate([y,m,d],"")] || [];
		for(var j=0; j<events.length;j++){
			if(events[j][H] >= "20:00" && events[j][H] <= "23:30" && channels.find(events[j][CID])){
				$("#"+events[j][CID]+events[j][H].split(":").join("")).append(
					"<div class='event status"+events[j][STATUS]+(role=="admin"&&(events[j][EID]==0||events[j][STATUS]=='U'||events[j][TYPE]!='N')?" notice":"")+" show"+events[j][SID]+"' etitle='"+events[j][TITLE]+"' cid='"+events[j][CID]+"' status='"+events[j][STATUS]+"' type='"+events[j][TYPE]+"'>"
					+"	<span class='show'>"+events[j][SHOW]+"</span>"
					+"	<span class='episode'>"+events[j][TITLE]+"</span>"
					+(role=="admin"?"	<span class='edit' onClick='editEvent("+events[j][ID]+")'><img src='imagenes/pencil.png' /></span>":"")
					+"</div>");
				document.getElementById(events[j][CID]+events[j][H].split(":").join("")).setAttribute("dur",events[j][DUR]/30);
			}
		}
		resizeGrid();
		stopWaiting();
		$('#message').hide();
		if(!events.length) message('No hay eventos cargados para este d&iacute;a.', 'info');
		if(callback) callback();
		Popup.init();
		$(".cell:not(:empty)").addClass('cell-notempty');
	});
}

/* MESSAGES */
function showLoading(){
   message("Cargando...","info");
}
function hideLoading(){
   $('#message').hide();
}
function message(msg,type){
   document.getElementById('message').className=type;
   $('#message').show();
   $('#message .text').html(msg);
   $('#message').css("left",($("#topcontent").width()-$("#message").width())/2);
}
function hideMessage(){
   $('#message').hide();
}
function clear(){
   $('#message, #eventWindow, #eventWindowEdit').hide();
}
function ajaxError(XMLHttpRequest, textStatus, errorThrown){
	stopWaiting();
	clear();
	switch(textStatus){
		case "timeout":
		   message("Ha ocurrido un error de timeout. Por favor vuelve a intentarlo.","error");
		break;
		case "error":
		   message("Ha ocurrido un error "+XMLHttpRequest.status+". Por favor vuelve a intentarlo.","error");
		break;
		default:
		   if(XMLHttpRequest.responseText == "" || XMLHttpRequest.responseXML){
		      message("Ha ocurrido un error en el servidor. Por favor vuelve a intentarlo.","error");
		   } else {
		      message(textStatus+ " " +errorThrown + " " + XMLHttpRequest.status,"error");
		   }
		break;
	}
}
function keepWaiting(i){
	if(isWaiting){
		if(i==1) message("Cargando... todavìa","info");
		else if(i==2) message("Cargando todavìa, por favor espere","info");
	}
	isWaiting=setTimeout("keepWaiting("+(i+1)+")",10000);
}
function stopWaiting(){
	if(isWaiting){
		clearTimeout(isWaiting);
		isWaiting=false;
	}
}

/* FILTERS */
function loadFilterWindow(){
	InfoWindow.show({url: "ajax/filter.php", width: 700, callback: function(){
		$("#filter .shows").attr('scrollTop',0);
		$("#filter .selected input[type=checkbox]").attr("checked",true);
		$("#filter .selected input[type=checkbox]").bind("click",function(event){
			$(this).closest(".show").toggleClass("selected");
			$(this).closest(".show").removeClass("hover");
			event.stopPropagation();
		});
		$("#filter .show").bind("click",function(){
			$(this).toggleClass("selected");
			$(this).removeClass("hover");
			if($(this).hasClass("selected")) $(this).find("input[type=checkbox]").attr("checked",true);
			else $(this).find("input[type=checkbox]").attr("checked",false);
		});
		$("#filter .show").bind("mouseenter",function(){
			$(this).addClass("hover");
		});
		$("#filter .show").bind("mouseleave",function(){
			$(this).removeClass("hover");
		});
	}});
}
function submitFilters(){
   InfoWindow.hide();
   message("Cargando...","info");
   $.post("ajax/filter_save.php", $("#filter form").serialize(), function(data){
		eventCache.clear();
		reloadEvents(function(){ message(data.message,data.msg_type) },false);
	}, 'json');
}
function addToFilter(id){
   InfoWindow.hide();
   message("Cargando...","info");
	var filters=new Array();
   $.post("ajax/filter_add.php", {id: id}, function(data){
		eventCache.clear();
		reloadEvents(function(){ message(data.message,data.msg_type) },false);
	}, 'json');
}

/* SETTINGS */
function loadSettingsWindow(){
	InfoWindow.show({url: "ajax/settings.php", width: 450});
}
function submitSettings(){
   InfoWindow.hide();
   message("Guardando...","info");
   $.post("ajax/settings_save.php", $("#settings form").serialize(), function(data){
		settings = data.settings;
		reloadCalendar();
		drawMiniCalendar(currentYear, currentMonth);
		//reloadEvents(function(){ message(data.message,"success") },false);
	}, 'json');
}

/* LOGIN */
function login(){
	clear();
	InfoWindow.show({selector: "#loginbox", width: 200, callback: function(){
		$("#loginbox input[name=username]").get(0).focus();
	}});
}
function submitLogin(){
   InfoWindow.hide();
	closeBalloonSignup();
   message("Ingresando...","info");
   $.post("ajax/login.php",$('#loginbox form').serialize(),function(data, textStatus){
      if(data.success==1){
			role=data.role;
			$("#toplinks .login").html(data.username+" [<a href='#' onclick='logout(); return false;'>Logout</a>] | <a href='#' onclick='loadSettingsWindow(); return false;'>Configuraci&oacute;n</a>");
			if(role=='admin'){
				$("#toplinks .admin").html("<a href='admin'>Admin</a> | ");
				$.getScript('javascript/admin.js');
			}
			settings = data.settings;
			if(data.empty_filter==1) openBalloonFilter();
			else closeBalloonFilter();
			currentCalendar = calendarTypes[settings.view];
			reloadCalendar();
		} else {
			message(data.message,"error");
		}
   }, 'json');
}
function logout(){
   message("Cargando...","info");
   $.post("ajax/logout.php",{},function(data, textStatus){
      if($("login",data).find("success").text()==1){
			$("#toplinks .admin").empty();
			$("#toplinks .login").html("<a href='#' onclick='login(); return false;'>Login</a> | <a href='#' onclick='signup(); return false;'>Registrarse</a>");
   		if(role=='admin') switchToMonth(currentYear, currentMonth, function(){ message("Hasta luego, "+$("login",data).find("username").text(),"info") });
			else message("Hasta luego, "+$("login",data).find("username").text(),"info");
			role="";
		}
   });
}
function signup(){
	clear();
	InfoWindow.show({selector: "#signup", width: 250});
}
function submitSignUp(){
   InfoWindow.hide();

   message("Registrandote...","info");
   $.post("ajax/signup.php",$('#signup form').serialize(),function(data, textStatus){
      if($("signup",data).find("success").text()==1){
	  	message($("signup",data).find("message").text(),"info");
	  } else {
	  	message($("signup",data).find("message").text(),"error");
	  }
   });
}

/* SCROLLBARS */
function makeScrollbars(){
	for(var i=0; i<dateArray.length;i++){
		var id = zeroFilledDate([ dateArray[i][0], dateArray[i][1], dateArray[i][2] ],"");
		var contenido = document.getElementById(id).lastChild;
		var scrollbars = contenido.previousSibling;
      if(contenido.scrollHeight<=contenido.clientHeight){
			scrollbars.className="scrollbars hide";
		} else {
			scrollbars.className="scrollbars";
		}
	}
}
function scrollUp(elem){
   $("#"+elem+" .content").get(0).scrollTop-=14;
   $("#"+elem+" .scrollbar-down").removeClass("scrollbar-down-off");
   if($("#"+elem+" .content").get(0).scrollTop==0) $("#"+elem+" .scrollbar-up").attr("class","scrollbar-up scrollbar-up-off");
   else $("#"+elem+" .scrollbar-up").attr("class","scrollbar-up");
}
function scrollDown(elem){
   var lastscroll=$("#"+elem+" .content").get(0).scrollTop;
   $("#"+elem+" .content").get(0).scrollTop+=14;
   $("#"+elem+" .scrollbar-up").removeClass("scrollbar-up-off");
   if(lastscroll==$("#"+elem+" .content").get(0).scrollTop){
      $("#"+elem+" .scrollbar-down").attr("class","scrollbar-down scrollbar-down-off");
	  $("#"+elem+" .content").get(0).scrollTop=$("#"+elem+" .content").get(0).scrollHeight-$("#"+elem+" .content").height();
   } else {
      $("#"+elem+" .scrollbar-down").attr("class","scrollbar-down");
   }
}

/* POPUP */
var Popup = {};
Popup.timeout = false;
Popup.init = function(){
	for(var i=0; i<dateArray.length;i++){
		var id = zeroFilledDate([ dateArray[i][0], dateArray[i][1], dateArray[i][2] ],"");
		var events = $(currentCalendar=="daily"?"#grid":"#"+id).find(".event");
		for(var j=0; j<events.length;j++){
			Popup.bind(events[j]);
		}
	}
}
Popup.set = function(params, e){
	if(Popup.timeout) clearTimeout(Popup.timeout);
	Popup.timeout = setTimeout(function(){ Popup.open(params); }, 300);
}
Popup.open = function(params){
	$("#popup .header").html(params.show+(params.show&&params.etitle?' - ':'')+params.etitle);
	$("#popup .content").html(params.type ? possibleType[params.type] : "");
	$("#popup .footer").html("<table width='100%'><tr><td>"+possibleStatus[params.status]+"</td><td align='right'>"+(settings.hora?"":params.hora+"hs ")+(params.channel?"por</td><td width='5'><img src='imagenes/logos/channel_"+params.channel+".png' />":"")+"</td></tr></table>");
	$(window).unbind('mousemove.popup');
	$(window).bind('mousemove.popup', function(){
		var popup = $("#popup");
		var w = popup.width();
		var h = popup.height();
		var left=mouseX+15;
		var top=mouseY+10;
		if(left+w>=$(window).width()) left=mouseX-w-10;
		if(top+h>=$(window).height()) top=mouseY-h-10;
		popup.css("left",left).css("top",top);
	}).trigger('mousemove.popup');
	$("#popup").show();
}
Popup.close = function(){
	if(Popup.timeout) clearTimeout(Popup.timeout);
	$(window).unbind('mousemove.popup');
	$("#popup").hide();
}
Popup.bind = function(element){
	$(element).mouseenter(function(){
		Popup.set({show: $(this).find('.show').text(), etitle: $(this).attr('etitle'), type: $(this).attr('type'), status: $(this).attr('status'), channel: $(this).attr('cid'), hora: $(this).attr('hora')});
	});
	$(element).mouseleave(function(){
		Popup.close();
	});
}

/* SHOW INFO */
function showInfo(what){
	InfoWindow.show({url: "ajax/showinfo.php", get: {show:what.getAttribute("sid")}, width: 570, callback: function(){
		$("#proximas .event[evid="+what.getAttribute("evid")+"]").addClass("selected");
		$('#proximas .event').each(function(){
			Popup.bind($(this).get(0));
		});
	}});
}

/* BALLOONS */
function openBalloonFilter(){
	$("#filterBalloon").show();
}
function closeBalloonFilter(){
	$("#filterBalloon").hide();
}
function openBalloonSignup(){
	$("#signupBalloon").show();
}
function closeBalloonSignup(){
	$("#signupBalloon").hide();
}

/* CACHE */
var eventCache = {};
eventCache.cache = {};
eventCache.months = [];
eventCache.isInCache=function(a,b){
	for(var i=0; i<this.months.length;i++){
		if(this.months[i][0]==zeroFilledDate(a,"") && this.months[i][1]==zeroFilledDate(b,"")) return true;
	}
	return false;
}
eventCache.clear = function(){
	eventCache.months = [];
	eventCache.cache = {};
}

function getJSONcached(cache,callback,n){
	if(eventCache.isInCache(currentAbsMin,currentAbsMax) && cache){
		callback(eventCache.cache);
	} else {
		$.ajax({ url:"ajax/eventsjson.php",data:{start:zeroFilledDate(currentAbsMin,""), end:zeroFilledDate(currentAbsMax,"")}, success:function(data){
			mergeObjects(eventCache.cache,data);
			eventCache.months.push([zeroFilledDate(currentAbsMin,""),zeroFilledDate(currentAbsMax,"")]);
			callback(eventCache.cache);
		}, dataType:"json", error:function (XMLHttpRequest, textStatus, errorThrown){
			if(n<=1){
				message("Ha ocurrido un error. Intentando de vuelta...","info");
				keepWaiting(0);
				getJSONcached(cache,callback,n+1);
			} else {
				stopWaiting();
				ajaxError(XMLHttpRequest, textStatus,errorThrown);
			}
		}
		});
	}
}

/* InfoWindow */
var InfoWindow = {};
$(document).ready(function(){
	$('#infowindow-bg').click(InfoWindow.hide);
});
InfoWindow.putBack = false;
InfoWindow.event = false;
InfoWindow.show = function(params){
	InfoWindow.params = params;
	if(!params.height){
		params.auto = true;
		params.height = 250;
	}
	$("#infowindow-bg, #infowindow").show();
	InfoWindow.event = $(window).bind('resize.infowindow',function(){ InfoWindow.resize(); });
	if(params.url){
		$("#infowindow .content").html("<img src='imagenes/loading.gif' class='loading'>");
		$("#infowindow .loading").css({left: (params.width-126)/2, top: (params.height-126)/2});
		InfoWindow.resize(true);
		if(!params.get) params.get = {};
		$.get(params.url,params.get,function(data){
			$('#infowindow .content').html("<div>"+data+"</div>").attr('scrollTop',0);
			InfoWindow.onload();
		});
	} else if(params.selector) {
		InfoWindow.putBack = true;
		$('#infowindow .content').html($(params.selector).show()).attr('scrollTop',0);
		InfoWindow.onload();
	}
}
InfoWindow.hide = function(){
	if(InfoWindow.event) $(window).unbind('resize.infowindow');
	$('#infowindow-bg, #infowindow').hide();
	if(InfoWindow.putBack){
		$(BODY).append($("#infowindow .content").children(0).hide());
		InfoWindow.putBack = false;
	}
}
InfoWindow.onload = function(){
	var params = InfoWindow.params;
	InfoWindow.resize();
	if(params.callback) params.callback();
}
InfoWindow.resize = function(noauto){
	var params = InfoWindow.params;
	if($("#infowindow .content").children(0).height() < $(window).height()-200 && params.auto && !noauto){
		params.height = $("#infowindow .content").children(0).height();
	} else if(params.height < $(window).height()-200 && params.auto && !noauto){
		params.height = $(window).height()-200;
	}
	$('#infowindow-bg').css("height",$(document).height());
	$("#infowindow .content").css({width: params.width, height: params.height});
	var top = ($(window).height()-params.height-70)/2;
	$("#infowindow").css({left: ($(window).width()-params.width-70)/2, top: (top<5?5:top)});
}

function loadFAQ(){
	InfoWindow.show({url: "ajax/faq.php", width: 750 });
}
function proxEstrenos(){
	InfoWindow.show({url: "ajax/estrenos.php", width: 650 });
}
function proxFinales(){
	InfoWindow.show({url: "ajax/finales.php", width: 650 });
}

/* COOKIES */
function createCookie(name,value,days) {
   if (days) {
      var date = new Date();
      date.setTime(date.getTime()+(days*24*60*60*1000));
      var expires = "; expires="+date.toGMTString();
   }
   else var expires = "";
   document.cookie = name+"="+value+expires+"; path=/";
}
function readCookie(name) {
   var nameEQ = name + "=";
   var ca = document.cookie.split(';');
   for(var i=0;i < ca.length;i++) {
      var c = ca[i];
      while (c.charAt(0)==' ') c = c.substring(1,c.length);
      if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
   }
   return null;
}
function eraseCookie(name) {
   createCookie(name,"",-1);
}

/* UTILS */
Array.prototype.compare = function(testArr) {
    if (this.length != testArr.length) return false;
    for (var i = 0; i < testArr.length; i++) {
        if (this[i].compare) { 
            if (!this[i].compare(testArr[i])) return false;
        }
        if (this[i] !== testArr[i]) return false;
    }
    return true;
}
Array.prototype.find = function(searchStr) {
	var returnArray = false;
	for (i=0; i<this.length; i++) {
		if (typeof(searchStr) == 'function') {
			if (searchStr.test(this[i])) {
				if (!returnArray) { returnArray = [] }
				returnArray.push(i);
			}
		} else {
			if (this[i]===searchStr) {
				if (!returnArray) { returnArray = [] }
				returnArray.push(i);
			}
		}
	}
	return returnArray;
}
function mergeObjects(obj1,obj2){
	for(var key in obj2){
		obj1[key]=obj2[key];
	}
}
Date.prototype.getWeek = function() {
	var onejan = new Date(this.getFullYear(),0,1);
	return Math.ceil((Math.floor((this - onejan) / 86400000) + onejan.getDay() - settings.firstday + 1)/7);
} 