//attenzione: dipendenze da script esterni
//TODO: elencare

//parametri di configurazione
var show_event_popup = false;
var show_channelpage_link = true;
var progressive_load = true;



var selected_date = new Date();//today
var selected_date_code = "no_date"; 
var selected_category = "meglio";
var channels = [];
var userChannelMap = {};
var noPageChannels = {};



var genreFilterMapping = {
  film:{toggled:false,genre:"__film",subgenre:["__drammatico", "__romantico", "__commedia", "__comico", "__thriller", "__horror", "__azione", "__fantascienza", "__western", "__fantastico", "__avventura", "__poliziesco", "__guerra", "__animazione", "__musicale", "__corto"]},
  serietv:{toggled:false,genre:"__intrattenimento",subgenre:["__telefilm", "__soapopera", "__telenovela", "__sitcom", "__fiction"]},
  show:{toggled:false,genre:"__intrattenimento",subgenre:["__show", "__talkshow", "__spettacolo", "__varieta", "__festival", "__quiz", "__gioco"]},
  calcio:{toggled:false,genre:"__sport",subgenre:["__calcio"]},
  altrisport:{toggled:false,genre:"__sport",subgenre:["__hockey", "__tennis", "__motori", "__rugby", "__basket", "__baseball", "__footballusa", "__wrestling", "__golf", "__nuoto", "__atletica", "__ciclismo", "__sci", "__boxe", "__altri"]},
  cartonianimati:{toggled:false,genre:"__ragazziemusica",subgenre:["__cartonianimati"]},
  primavisione:{toggled:false,genre:"",subgenre:["__primavisione"]}
}

/**
 * Date Management
 * 
 */  
function setDate(newdate){
  selected_date = newdate;
  selected_date_code = getDateCode(newdate);
}

/**
 * returns a date_code in format yy_mm_dd
 */
function getDateCode(date){
  var year_long = ""+date.getYear();
  var year_short = ""+year_long.substr(year_long.length-2); 
  var month = ""+(date.getMonth()+1);
  if(month.length<2)
	month = "0"+month;
  var day = ""+date.getDate();
  if(day.length<2)
	day = "0"+day;
  return year_short + "_" + month + "_" + day;
}


function changeDate(newdate){
  selected_date = newdate;
  selected_date_code = getDateCode(newdate);
  reload();
  
  //nielsen
  nielsenRefresh("http://guidatv.sky.it/guidatv/grid/giorno");
  sc_guidatv("http://guidatv.sky.it/guidatv/grid/giorno");
}  

/**
 * Time sliding management
 *
 */  
function slide_left() {
	var scroller = jQuery('.timeline_grid .timeline_time_scroller ul');
	var leftPos = scroller.position().left;
	var _left = "+=" + time_slide_step + "px";
	if (leftPos+time_slide_step >= time_slide_right_limit)
	   _left = "+=" + (time_slide_right_limit-leftPos) + "px";
	jQuery('.timeline_grid .timeline_time_scroller ul').animate( {left: _left}, 1000);
	jQuery('#planlisting').animate( {left: _left}, 1000);
	
  //nielsen
  nielsenRefresh("http://guidatv.sky.it/guidatv/grid/frecce");
  sc_guidatv("http://guidatv.sky.it/guidatv/grid/frecce");
}

function slide_right() {
	var scroller = jQuery('.timeline_grid .timeline_time_scroller ul');
	var leftPos = scroller.position().left;
	var _left = "-=" + time_slide_step + "px";
	if (leftPos-time_slide_step <= time_slide_left_limit)
	   _left = "-=" + (leftPos - time_slide_left_limit) + "px";
	jQuery('.timeline_grid .timeline_time_scroller ul').animate( {left: _left}, 1000);
	jQuery('#planlisting').animate( {left: _left}, 1000);
	
  //nielsen
  nielsenRefresh("http://guidatv.sky.it/guidatv/grid/frecce");
  sc_guidatv("http://guidatv.sky.it/guidatv/grid/frecce");	
}

var isSliderAlreadyCalled = false;

function slide_to(moment){
  jQuery("#fascia_butt span").text(jQuery("#fascia_menu ."+moment+" a").text());
  jQuery("#fascia_menu .sel span").text(jQuery("#fascia_menu ."+moment+" a").text());
  var _left = time_slide_moment[moment];
	if (_left <= time_slide_left_limit)
	   _left = time_slide_left_limit;
	_left+="px";
	jQuery('.timeline_grid .timeline_time_scroller ul').animate( {left: _left}, 1000);
	jQuery('#planlisting').animate( {left: _left}, 1000);

  //nielsen
  if(isSliderAlreadyCalled){
  nielsenRefresh("http://guidatv.sky.it/guidatv/grid/orario");
  sc_guidatv("http://guidatv.sky.it/guidatv/grid/orario");
  }
  isSliderAlreadyCalled = true;
}

/**
 * Genre filtering management
 * 
 */  
function toggleGenre(genreName){
  genreFilterMapping[genreName].toggled = !(genreFilterMapping[genreName].toggled);
  var filtergenres = genreFilterMapping[genreName];
  var filter = "";
  for(var i=0;i<filtergenres.subgenre.length;i++){
    if (filtergenres.genre != ""){
      filter = '.'+filtergenres.genre+'.'+filtergenres.subgenre[i];
    }else{
      filter = '.'+filtergenres.subgenre[i];
    }
    jQuery(filter).toggleClass(genreName);
  }
}

//serve durante il progressive loading
function applyToggledGenres(scope){
  for (genreName in genreFilterMapping){
    if (genreFilterMapping[genreName].toggled){
      var filtergenres = genreFilterMapping[genreName];
      var filter = "";
      for(var i=0;i<filtergenres.subgenre.length;i++){
        if (filtergenres.genre != ""){
          filter = scope+' .'+filtergenres.genre+'.'+filtergenres.subgenre[i];
        }else{
          filter = scope+' .'+filtergenres.subgenre[i];
        }
        jQuery(filter).toggleClass(genreName);
      }
    }
  }
}


/**
 * Category filtering managemenr
 * 
 */
function switchTo(category){
  selected_category = category;
  reload();
}  

/**
 * channel loading management
 * 
 */

function load_nopage_channels(){
  //$.getJSON(staticBaseURL+"/static/js/epg/nopage_channels.js&jsoncallback=?",function(data){
  //MM 20100916
  /*$.getJSON("http://static.sky.it/static/js/epg/nopage_channels.js&jsoncallback=?",function(data){
        noPageChannels = data;
      }
  );*/
}

//if called, it must precede other channels loading
//if immediately is not null, then the loaded channels must be immediately shown
function load_user_channels(category){
  if (isUserLogged()){
    var userChUrl = base_webapp_url+"channels.do";
	if (category == 'digitale') {
		userChUrl += "?digital=1";
	}
    else if (category != "user" && category != "meglio"){
      var categoryId = categoryMap[category];
      userChUrl += "?category="+categoryId;
    }
    jQuery.jsonSync(
        userChUrl,
        function(data){
          channels = data;
          if (channels != null){
            var newChannelsCode = "";
            var newPlansCode = "";
            for (i=0;i<channels.length;i++){
              newChannelsCode += create_channel_row(channels[i], true);
              newPlansCode += create_plan_row(channels[i]);
              channels[i].loaded = false; //metadata for progressive loading
              userChannelMap[channels[i].id] = i;
            }
            document.getElementById('planlisting').innerHTML = newPlansCode;
            document.getElementById('channellisting').innerHTML += newChannelsCode;

            //load_plan(userchannels);  //merged in load_channels
            if (category == 'user'){
              //no more channels to load, show them immediately
              if (progressive_load == true)
                start_progressive_load();
              else
                load_plan(0, channels.length);
            }
          }
        }
    );
  };
}

function load_channels(category){
  jQuery.jsonSync(
    base_channel_data_url+"grid_"+category+"_channels.js",
    function(data){
      var newChannelsCode = "";
      var newPlansCode = "";
      for (i=0;i<data.length;i++){
        if (userChannelMap[data[i].id] == null){
          newChannelsCode += create_channel_row(data[i], false);
          newPlansCode += create_plan_row(data[i]);
          data[i].loaded = false; //metadata for progressive loading
          channels.push(data[i]);
        }//else just discard it because already processes as user channel
      }
      document.getElementById('planlisting').innerHTML += newPlansCode;
      document.getElementById('channellisting').innerHTML += newChannelsCode;

      if (progressive_load == true)
        start_progressive_load();
      else
        load_plan(0, channels.length);
    }
  );
}

function create_channel_row(channel, isMyChannel){
    var newChannel = '<li id="ch_'+channel.id;
    newChannel += '" class="channel_head_row" _sky_number="'+channel.number+'"> <div class="channel_head"><span class="channel_number">';
	
	if (selected_category == 'digitale') {}
	else if ( (selected_category == 'meglio' || selected_category == 'user') && parseInt(channel.number) > 5000 ) {}
	else { newChannel += channel.number; }
	
    newChannel += '</span><a class="';
    if (!isUserLogged()){
      //if not logged, cannot load user channels anyway, so they are all off
      newChannel += 'supernote-click-loginrequired star off" title="Aggiungi ai miei preferiti" ';
    }else{
      if (isMyChannel){
        newChannel += 'supernote-click-addedremovedchannel star on" title="Rimuovi dai miei preferiti" ';
      }else{
        newChannel += 'supernote-click-addedremovedchannel star off" title="Aggiungi ai miei preferiti" ';
      }
    }
    newChannel += 'href="javascript:void(0);" onclick="toggleMyChannels(\''+ channel.id +'\')" onfocus="this.blur()">Aggiungi</a>';
    newChannel += '<h4><a class="channel_name" style="background: transparent url('+base_channel_img_url+'grid/'+channel.number+'_grid.gif) no-repeat scroll 0% 0%" title="';
    newChannel += channel.name+'"';
    if (show_channelpage_link == true && noPageChannels[channel.id] == null){
      newChannel += ' href="'+getChannelUrl(channel)+'"';
    }
    newChannel += '>'+channel.name+'</a></h4></div></li>';
    return newChannel;
}

function create_plan_row(channel){
    return '<li id="chplan_'+channel.id+'" class="channel_plan_row"><ul class="channel"><li class="dsmall" style="visibility:hidden"></li></ul></li>';
}

var channel_base_top = 0;
var channel_old_top = 0;
function start_progressive_load(){
  channel_base_top = jQuery("#grid_body").offset().top;
  channel_old_top = channel_base_top;
  load_plan(0, 15);
  setTimeout("progressive_loader()", 600);//warning: recursive through a timeout
}

//load_visible_plan based on UL vertical offset
function progressive_loader(){
  channel_current_top = jQuery("#channellisting").offset().top;
  if (channel_current_top != channel_old_top){
    channel_old_top = channel_current_top;
    start_visible_index = Math.round((channel_base_top - channel_current_top) / 35);  //warning: depends on css
    load_plan(start_visible_index, 16);
  }
  setTimeout("progressive_loader()", 600);
}

/**
 * loads the plans for the specified range of channels in the channels array
 * parameters: startIndex, length
 */
function load_plan(startIndex, length){
  var endCondition = Math.min(startIndex+length,channels.length);
  var counter = 0;
  for (i=startIndex; i<endCondition; i++){
		var start = new Date().getTime();
    if ((channels[i]!=null) && (channels[i].loaded == false)) {
    	channels[i].loaded = true; //evito di ricaricarlo
    	// delay lineare (consigliato tra 100 e 200)
	    setTimeout("load_channel("+channels[i].id+")", counter*250);
	    counter++;
	  }
  }
};

function load_channel(id) {
//  jQuery('#chplan_' + id).load(base_channel_data_url+selected_date_code+"/ch_"+id+".html");
  jQuery.getJSON(
	  base_channel_data_url+selected_date_code+"/ch_"+id+".js",
	  function(data){
	    show_channel_plan(data.channel, data.plan, data.banned);
	  }
	);
};

function show_channel_plan(channelid, plan, banned){
  if (banned == null)
    banned = false;

  var newEventHtml = "";
    
  for (i=0;i<plan.length;i++){  
    var obj = plan[i];
    var fixedGenre = fixGenre(obj.genre);
    var fixedSubgenre = fixGenre(obj.subgenre);
    var fixedTitle = fixTitle(obj.title);
    var eventClass = '__'+fixedGenre;
    eventClass += ' __'+fixedSubgenre;
    if (obj.prima==true)
      eventClass += ' __primavisione';
    var eventWidth = -1;
    
    if (obj.dur<=30 && obj.dur>=5) {
      //eventClass = eventClass + ' d'+obj.dur;
      eventClass = eventClass + ' dsmall';
      eventWidth = Math.round((obj.dur/5)*12)-7;
    }else if(obj.dur>=5){
      eventWidth = Math.round((obj.dur/5)*12)-15;
    }
    else{
    	eventClass = eventClass + ' dsmall';
    	eventWidth = 2;
    }
    
    newEventHtml += "<li class='"+eventClass+"' style='";

    if (eventWidth != -1){
      newEventHtml += "width:"+eventWidth+"px;";
    }
    if (obj.id == -1){
      newEventHtml += " visibility:hidden;";
    }else if (obj.dur == 0){
      newEventHtml += " display:none;"
    }
	newEventHtml += "'";
    newEventHtml += ' title="'+fixedTitle+'">';

    if (obj.id.indexOf("FP")==-1){//non e' un 'Alle XX:XX'
      if (show_event_popup){
         var eventPageUrl = getProgrammeUrl(obj,fixedGenre, fixedSubgenre, false);
        //showGridEvent(eventUrl, channelId, starttime)
        newEventHtml += "<a href='javascript:void(0);'"+
          "onclick='showGridEvent("+
            channelid+",\""+
            obj.starttime+"\",\""+
            eventPageUrl+"\",\""+
            banned+"\",\""+
            obj.id+"\",\""+
			obj.title.replace(/\'/g, "").replace(/\"/g, "")+
          "\")'>";
      }else{
        var eventUrl = getProgrammeUrl(obj,fixedGenre, fixedSubgenre, false);
        newEventHtml += "<a href='"+eventUrl+"'>";
      }
    }else{
        newEventHtml += "<a href='javascript:void(0)'>";
    }

    newEventHtml += "<span class='titolo'>" + obj.title
                  + "</span></a><span class='descriz'>" + obj.desc
                  + "</span><span class='block_right'></span></li>"
  }
  
  document.getElementById('chplan_' + channelid).innerHTML = "<ul class='channel'>" + newEventHtml + "</ul>";
  applyToggledGenres('#chplan_' + channelid);
}

function reload(){
	
  //clear existing channels and plans
  channels = [];
  userChannelMap = {};
  
  $('#genere_menu input[type=checkbox]').removeAttr('checked'); // resetta filtri genere
  
  // non usare jquery peRCHE JQUERY CACHA TUTTO QUELLO IL "removed()"
  //jQuery('#channellisting li').remove();
  //jQuery('#planlisting li').remove();
  document.getElementById('channellisting').innerHTML = '';
  document.getElementById('planlisting').innerHTML = '';
  
  //load user channels and plans for this category
  load_user_channels(selected_category);
  //load channels and plans for this category
  if (selected_category != "user"){
    load_channels(selected_category);
  }
}


/**
 *MyChannels Managment
 *
 */
function toggleMyChannels(channelid){
  if (isUserLogged()){
    var channel_li = jQuery('#ch_'+channelid);
    var channelName = channel_li.find('a.channel_name').html();
    var star = jQuery("#ch_"+channelid+" .star");
    if (star.hasClass('off')){
      star.removeClass('off').addClass('on')
          .attr('title','Rimuovi dai tuoi preferiti');
      jQuery('#addedremovedChannelResp p').html("Il canale "+channelName+" &egrave; stato aggiunto alla tua guida personale.");
      jQuery.get(base_webapp_url+"channel/add.do?cid="+channelid);
      //alert(channelName+" e' stato aggiunto ai tuoi canali preferiti.");
    }else{
      star.removeClass('on').addClass('off')
          .attr('title','Aggiungi ai tuoi preferiti');
      jQuery('#addedremovedChannelResp p').html("Il canale "+channelName+" &egrave; stato rimosso alla tua guida personale.");
      jQuery.get(base_webapp_url+"channel/remove.do?cid="+channelid);
      //alert(channelName+" è stato rimosso dai tuoi canali preferiti.");
    }
  }else{
    //just do nothing, a supernote message is already displayed
  }
  return false;
}  

/**
 *Event click management
 *
 */
function showGridEvent(channelid, starttime, programmePageUrl, banned, eventId, objTitle){
  //open a popup ajaxing the content from the event mini-page Url
  //inject in the popup the channel icon (service key and name)
  //inject in the popup the start date and time
  
  var programmeMiniUrl = programmePageUrl.replace(".shtml","_MINI.shtml");
  //recupera le info del canale
  var channel_li = jQuery('#ch_'+channelid);
  var skyNumber = channel_li.attr('_sky_number');//aggiunto in fase di costruzione
  var channelName = channel_li.find('a.channel_name').html();
  //jQuery("#preview_head span").removeClass().addClass("genere").addClass(fixGenre(genre)).html(genre);
  jQuery("#preview_container").innerHTML = '';

  jQuery("#preview").animate({opacity: 'show'}, "slow" );
  jQuery("#preview_container").load(programmeMiniUrl, {}, function(responseText, textStatus, XMLHttpRequest){
	 //remove function fb_share()
  jQuery('div#preview_body div span a:eq(0)').removeAttr('onclick');
  $('div#preview_body div span a:eq(0)').removeAttr('onclick');
  $('div#preview_body div span a:eq(0)').unbind('click').click(function(e){
    e.preventDefault();
    addfb();
  });
  
	if(channelName != null){
		jQuery("#preview_container .canale")
			.html('<a href="'+getChannelUrlByChannelName(channelName)+'"><img border="0" alt="" src="'+base_channel_img_url+'visore/'+skyNumber+'_visore.gif"/></a>');
	}
	else{
		jQuery("#preview_container .canale")
			.html('<img border="0" alt="" src="'+base_channel_img_url+'visore/'+skyNumber+'_visore.gif"/>');
	}
	//
	var my_date = new Date(selected_date.getTime());
	if(parseInt(jQuery("li.timeline_time_scroller ul").css('left'))<-2000){
		if(parseInt(starttime.substring(0,2))<8)
			my_date.setTime(selected_date.getTime() + 86400000);
	}
	//
    jQuery("#preview_container .programmazione").html(getDateLabel(my_date)+" h."+starttime);
    jQuery("#preview_container .tvmemoBox").attr("eventId",eventId);
	if ( selected_category == 'digitale' || ( (selected_category == 'meglio' || selected_category == 'user') && skyNumber > 5000 ) ) {
		jQuery("#preview_container .recBox").hide();
	}
	else {
		jQuery("#preview_container .recBox").attr("eventId",eventId);
		jQuery("#preview_container .recBox").attr("titolo",objTitle.replace(/\'/g, "").replace(/\"/g, ""));
		jQuery("#preview_container .recBox").attr("canale",channelName);
		jQuery("#preview_container .recBox").attr("passaggio",getDateLabel(my_date)+" h."+starttime);
		jQuery("#preview_container .recBox").show();
	}
    jQuery("#preview_container .addBox").attr("eventId",eventId);
    initialize_baloons();
    if (textStatus!='error'){
		$('#preview_body a img[class=foto]').parent().attr('href', programmePageUrl);
		jQuery("#preview_body h3 a").attr('href',programmePageUrl);
		//jQuery("#preview_body .description a").attr('href',programmePageUrl);
		jQuery("#preview_body .due a").attr('href',programmePageUrl);
		$('div#preview_body div div span a:eq(0)').removeAttr('onclick');
		$('div#preview_body div div span a:eq(0)').unbind('click').click(function(e){
			e.preventDefault();
			addfb();
	   });
		load_event_pilat_description(eventId, programmePageUrl);
    }
	else{
		jQuery("#preview_body").remove();
		$("#preview_container").html('<div id="preview_body"><h3>'+objTitle+'</h3><p class="description">Scheda non disponibile</p></div>');
		
		jQuery("#preview_body h3 a").attr('href','javascript:void(0);');
		//jQuery("#preview_body .description a").remove();
		jQuery("#preview_body .due a").remove();
		load_event_pilat_description(eventId, null);//no anchor
    }
  });
}

function load_event_pilat_description(idevento, linkProgramma){
	//var html_loader = "<p><img src="+loading_animation+"/></p>";
	//$(".programmazione1").html(html_loader);
	//$(".prog").html(html_loader);
  jQuery.ajax({
      url: "/EpgBackend/event_description.do?eid="+idevento,
      dataType : 'json',
      data : {},
      success : function(data, textStatus){
        var desc = data.description;
        if (desc.length>115) desc=desc.substr(0,115)+"..."; //160
        if (linkProgramma != null){
          desc = desc+'<br/><a href="'+linkProgramma+'"> Continua</a>';
        }
        jQuery("#preview_body .description").html(desc);
        jQuery("#preview_body .description").show();
      },
      error : function(x, txt, e){
        //mostro la descrizione generata dallo script
        jQuery("#preview_body .description").show();
      }
  });
}


/**
 * Support methods and functions
 * 
 */

//extending ajaxSync for supporting json calls
jQuery.jsonSync = function(url, callback){ 
  //(url.indexOf('?')>=0)?url=url+"&":url=url+"?";
  //url = url=staticBaseURL+url+"jsoncallback=?";
  jQuery.ajaxSync({type:"GET",url:url,data:null,success:callback,dataType:"json"});
}

function fixGenre(genreName){
  var fix = genreName.replace(/ /g, "").replace(/\xE0/g, "a").toLowerCase();
  return (fix.length>0)?fix:'generico';
}

function fixTitle(title){
  //apice e virgolette
  return title.replace(/\x2F/g," ").replace(/\x2F/g, " ");
}

function getProgrammeUrl(progevent, fixedGenre, fixedSubgenre, mini){
  //guidatv/programma/genere/sottogenere/titolo_id.shtml?eventid=12345

  var result = base_programme_page_url+
    fixedGenre+"/"+
    fixedSubgenre+"/"+
    progevent.normalizedtitle+"_"+progevent.pid;
  if (mini) {
    result += "_MINI.shtml";
  /*}else if (progevent.genre == "intrattenimento" &&
      ( progevent.subgenre == "fiction" ||
        progevent.subgenre == "sit com" ||
        progevent.subgenre == "telefilm" ||
        progevent.subgenre == "soap opera" ||
        progevent.subgenre == "telenovela"
      )){*/
  }else if(progevent.genre != "Sport" && progevent.genre != "Film"){
    result+=".shtml?eventid="+progevent.id;
  } else{
    result+=".shtml";
  }
  return result;
}


function getChannelUrl(channel){
  //guidatv/canale/nome_id.shtml
  return base_channel_page_url+escape((channel.name).replace(/ /g,"-").toLowerCase())+".shtml";
}

function getChannelUrlByChannelName(channel_name){
  return base_channel_page_url+escape((channel_name).replace(/ /g,"-").toLowerCase())+".shtml";
}

function getDateLabel(date){
  var weekday = weekdays[date.getDay()];
  var day_in_month = date.getDate();
  var month = (date.getMonth()+1)+"";
  if (month.legth<2) {month="0"+month;};
  return weekday+" "+day_in_month+"/"+month;
}

function isUserLogged(){
  // check the existence of PETERWITT cookie
  return (document.cookie.search("PETERWITT")!=-1);
}

