ČSFD Extended

Rozšíření profilů filmů na ČSFD o některé funkce jako jsou odkazy na Ulož.to či hodnocení IMDB.

目前为 2016-03-28 提交的版本。查看 最新版本

// ==UserScript==
// @name         ČSFD Extended
// @namespace    CSFD-E
// @version      0.5.9
// @description  Rozšíření profilů filmů na ČSFD o některé funkce jako jsou odkazy na Ulož.to či hodnocení IMDB.
// @author       Jakub Rychecký <[email protected]>
// @license      WTFPL 2
// @include      *csfd.cz/film/*
// ==/UserScript==











/**
 * Cache ukládá stažené údaje o hodnocení do local storage vašeho prohlížeče.
 * Každé opakované načtení profilu filmu je poté díky tomu výrazně rychlejší.
 * Na druhou stranu, zobrazované hodnocení je méně aktuální a u novějších filmů může zprvu chybět úplně.
 * Cache můžete proměnnými níže nastavit či zcela vypnout, v takovém případě ale počítejte s pomalejším
 * načítáním profilu filmu, protože skript se bude pokaždé dotazovat OMDb API a stahovat informace.
 */

var cache_allowed = true; // Vypnutí/zapnutí cache (true/false) (výchozí: true)
var cache_expire = 48; // Počet hodin, kolik je platná cache v localStorage. Nižší číslo = aktuálnější data hodnocení. (výchozí: 48)









var cache = new Cache(); // Objekt pro práci s cache

var csfd = new Csfd(); // Instance třídy pro práci s profilem filmu na ČSFD
var omdb = new OmdbApiWrapper(csfd.parseCsfdImdbCode()); // Instance třídy pro práci s API OMDB a stažení informací o filmu
var imdb = new Imdb(csfd.parseCsfdImdbCode()); // Instance třídy s informacemi z IMDB
var metacritic = new Metacritic(); // Instance třídy s informacemi z Metacritic
var rotten_tomatoes = new RottenTomatoes(); // Instance třídy s informacemi z RottenTomatoes

var box_office = new BoxOffice(); // Objekt celosvětových tržeb

var html = new Html(); // Instance třídy pro práci s HTML a úpravou profilu filmu dle získaných dat
var floating = new Floating(); // Instance třídy spravující plovoucí okno s náhledem posterů či fotek tvůrců



html.cssInit(); // Přidání externího CSS do stránky


csfd.parseCsfdNameYear(); // Parsuje název filmu z profilu ČSFD.
csfd.parseCsfdRating(); // Parsuje hodnocení ČSFDs

html.ratingTable(); // Předělání tabulky hodnocení na profilu filmu
html.toolbar(); // Vytvoření tlačítek pro rychlé vyhledávání na profilu filmu
html.myRatingDate(); // Zobrazení datumu mého hodnocení
html.plotExpand(); // Zobrazení delší verze popisu (je-li)

cache.btnClearBind(); // Bindování vyčištění cache na tlačítko

omdb.fetchOmdbData(); // Stažení dat z API OMDB


floating.init(); // Inicializace plovoucího okna
floating.bindPoster(); // Bindování eventu najetí kurzoru na poster
floating.bindCreator(); // Bindování eventu najetí kurzoru na odkaz na profil tvůrce











/**
 * @class Csfd
 * @classdesc Parsuje a zpracovává základní údaje z ČSFD profilu filmu.
 */

function Csfd(){
  
  /** 
   * Originální název filmu
   * @type {String}
   */
  this.name;

  /**
   * Rok vzniku filmu
   * @type {Integer}
   */
  this.year;

  /**
   * Hodnocení ČSFD v procentech
   * @type {Integer}
   */
  this.rating;

  /**
   * Počet hodnocení na ČSFD
   * @type {Integer}
   */
  this.votes;    
  
  
  
  
  
  /**
   * Parsuje název filmu z profilu ČSFD.
   * @return {undefined}
   */
    
  this.parseCsfdNameYear = function(){
    var title = $('meta[property=\'og:title\']').attr('content'); // Získání popisu ČSFD profilu z metatagu Open Graph (OG) http://ogp.me/
    title = title.replace(/\(TV seriál\)/, ''); // Odstranění označení TV seriálů z názvu
    title = title.replace(/\(TV film\)/, ''); // Odstranění označení TV filmů z názvu
    var title_regex = title.match(/(.+)\((\d{4})\)/); // Rozdělení na název a rok v závorce
     
     
    this.name = title_regex[1]; // Název filmu
    this.name = this.name.replace(/.+\//, ''); // Získání čehokoliv před lomítkem (= originální název)
    this.name = $.trim(this.name); // Oříznutí mezer názvu filmu
    
    
    this.year = parseInt(title_regex[2]); // Rok názvu jako integer
  }
    
  
  
  
    
  /**
   * Parsuje procentuální hodnocení a počet hlasů z profilu ČSFD.
   * @return {undefined}
   */
  
  this.parseCsfdRating = function(){
    this.rating = $('meta[itemprop="ratingValue"]').attr('content'); // Získání procentuálního hodnocení z metatagů
    this.rating = parseInt(this.rating); // Hodnocení v procentech jako integer
    
    this.votes = $('meta[itemprop="ratingCount"]').attr('content'); // Získání počtu hlasů z metatagů
    this.votes = parseInt(this.votes); // Počet hlasů jako integer
  }
    
    
    
    
 
  /**
   * Parsuje kód filmu na IMDB z tlačítka IMDB na profilu filmu na ČSFD.
   * @return {String} Kód filmu na IMDB
   */
    
  this.parseCsfdImdbCode = function(){
    var imdb_url =  $('#sidebar a[href*="imdb.com/title"]').attr('href'); // Získání odkazu z tlačítka IMDB
    
    var imdb_code = imdb_url.match(/(tt\d+)/); // Extrahování kódu filmu na IMDB
    
    return imdb_code[1]; // Vrací extrahovaný kód IMDB
  }
  
  
  
  
  
  /**
   * Získává barevné ladění ČSFD profilu filmu z boxu hodnocení. 
   * @returns {jQuery} CSS barva profilu filmu. Červená pro kvalitní filmy, modrá po průměrné a černá pro Ulici. :)
   */
  
  this.color = function(){
    return $('#rating').css('background'); // Barva profilu filmu na ČSFD
  }
};











/**
 * @class OmdbApiWrapper
 * @classdesc Stahuje, parsuje a zpracovává údaje o filmu staženém z OMDB API http://www.omdbapi.com/
 * @param {String} imdb_code IMDB kód filmu
 */

function OmdbApiWrapper(imdb_code){
  
  /**
   * IMDB kód filmu
   * @type {String}
   */
  this.imdb_code = imdb_code;
  
  /**
   * Objekt odpovědí OMDb API s údaji o filmu
   * @type {object}
   */
  this.response;
  
  /**
   * Jé. :)
   * @type OmdbApiWrapper
   */
  var parent = this;
 
 
 
 
    






  /**
   * Snaží se získat údaje z cache, při neúspěchu stahuje údaje z OMDb API.
   * @returns {undefined}
   */
 
  this.fetchOmdbData = function(){
    var cache_data = cache.get(this.imdb_code); // Cache miss nebo hit?
           
    if(!cache_allowed || !cache_data){ // Pokud je cache zakázána, nebo údaje z cache nejsou dostupné...
      var request = $.ajax({ // AJAXový dotaz
        method: 'GET',
        url: 'http://www.omdbapi.com/',
        data: { // Dotaz pro OMDb API
          i: this.imdb_code,
          tomatoes: 'true',
          r: 'json'
        }
      });

      request.done(function(response){ // Po stažení odpovědi...
          response.timestamp = $.now(); // Přidání aktuálního unixového času do objektu odpovědi
          parent.response = response; // Nastavení odpovědi do tohoto objektu
          parent.processOmdbData(); // Zpracování stažené odpovědi
          
          if(cache_allowed && response.imdbRating > 0){ // Pokud je cache povolená a zároveň se podařilo stáhnout alespoň nějaké hodnocení IMDB...
            cache.set(parent.imdb_code, response); // Uloží odpověď do cache (local storage) s klíčem jako kódem filmu na IMDB
          }
      });   
    }else{ // ...pokud se podařilo získat odpověď z cache...
      this.response = cache_data; // Nastavení odpovědi jako objektu získaného z cache
      this.processOmdbData(); // Zpracování odpovědi z cache
    }
  }
 
 
 
 
 
  /**
   * Zpracovává odpověď z OMDb API, ať už staženou nebo získanou z cache.
   * @returns {undefined}
   */
 
  this.processOmdbData = function(){
    var response = this.response; // Objekt odpovědi

    imdb.rating = parseFloat(response.imdbRating); // Hodnocení na IMDB
    imdb.votes = response.imdbVotes.replace(/\,/g,''); // Počet hlasů IMDB (odstranění čárek v řádů tisíců)
    imdb.votes = parseInt(imdb.votes); // Počet hlasů IMDB (číslo)

    metacritic.metascore = parseInt(response.Metascore); // Metascore z Metacritic

    rotten_tomatoes.criticRating = parseInt(response.tomatoMeter); // Rotten Tomatoes: hodnocení kritiků
    rotten_tomatoes.criticReviews = parseInt(response.tomatoReviews); // Rotten Tomatoes: počet recenzí
    rotten_tomatoes.userRating = parseInt(response.tomatoUserMeter); // Rotten Tomatoes: hodnocení diváků
    rotten_tomatoes.userReviews = parseInt(response.tomatoUserReviews); // Rotten Tomatoes: počet hodnocení diváků
    rotten_tomatoes.url = response.tomatoURL; // Rotten Tomatoes: URL adresa

    box_office.box_office = response.BoxOffice; // Nastavení tržeb dle objektu odpovědi 
    box_office.insertBoxOfficeHtml(); // Vložení celosvětových tržeb na profil filmu
      
    html.addWebsiteToToolbar(response.Website); // Přidání oficiálního webu do toolbaru
    html.fillRatingTable(); // Vyplnění tabulky hodnocení ČSFD Extended
  }
};











/**
 * @class Imdb
 * @classdesc Udržuje a zpracovává všechny údaje o filmu na webu IMDB: http://imdb.com/
 * @param {String} imdb_code IMDB kód filmu
 */

function Imdb(imdb_code){
  
  /**
   * IMDB kód filmu
   * @type {String}
   */
  this.imdb_code = imdb_code; 

  /**
   * Číselné hodnocení filmu na IMDB
   * @type {Float}
   */
  this.rating;
  
  /**
   * Počet hlasů na IMDB
   * @type {Integer}
   */
  this.votes;
    




  /**
   * Vyplňuje údaje z IMDB do tabulky hodnocení ČSFD Extended.
   * @returns {undefined}
   */
 
  this.insertRatingHtml = function(){
    if(this.rating > 0){ // Pouze pokud je film na IMDB hodnocený...
      $('#csfd-e-rating .imdb').show(); // Zobrazení řádku IMDB
      
      $('#csfd-e-rating .imdb .rating').html(imdb.rating.toLocaleString().replace('.', ',')); // Vložení hodnocení IMDB (nahrazení desetinné tečky desetinnou čárkou)
      $('#csfd-e-rating .imdb .votes').html(imdb.votes.toLocaleString()+'&nbsp;hlasů'); // Vložení počtu hlasů z IMDB

      $('#csfd-e-rating .imdb a').attr('href', this.link()); // Vložení odkazu na IMDB
    }
  }
 
 
 
  /**
   * Generuje odkaz na IMDB profil filmu.
   * @returns {String} URL na IMDB profil filmu
   */
  
  this.link = function(){
    return 'http://www.imdb.com/title/'+this.imdb_code+'/'; // URL na IMDB profil filmu
  }
};











/**
 * @class Metacritic
 * @classdesc Udržuje a zpracovává všechny údaje o filmu na webu Metacritic: http://metacritic.com/
 */

function Metacritic(){
  
  /**
   * Metascore z Metacritic (agregované z profesionálních recenzí)
   * @type {Integer}
   */
  this.metascore;





  /**
   * Vyplňuje údaje z Metacritic do tabulky hodnocení ČSFD Extended.
   * @returns {undefined}
   */

  this.insertRatingHtml = function(){
    if(this.metascore > 0){ // Pouze pokud je získáno nějaké Metascore...
      $('#csfd-e-rating .metacritic').show(); // Zobrazení řádku Metacritic
      
      $('#csfd-e-rating .metacritic .rating').html(this.metascore); // Nastavneí hodnoty Metascore
      $('#csfd-e-rating .metacritic a').attr('href', this.link()); // Nastavení odkazu na profil IMDB s přehledem Metacritic recenzí
    }
  }
 
 
 
 
 
  /**
   * Generuje odkaz na IMDB stránku s přehledem Metacritic recenzí filmu.
   * @returns {String} URL IMDB stránky s přehledem Metacritic recenzí filmu
   */
  
  this.link = function(){
    return 'http://www.imdb.com/title/'+imdb.imdb_code+'/criticreviews'; // URL IMDB stránky s přehledem Metacritic recenzí filmu
  }
};











/**
 * @class RottenTomato
 * @classdesc Udržuje a zpracovává všechny údaje o filmu na webu Rotten Tomatoes (RT): http://rottentomatoes.com/
 */

function RottenTomatoes(){
  
  /**
   * Hodnocení kritiků na Rotten Tomatoes
   * @type {Integer}
   */
  this.criticRating;
  
  /**
   * Počet recenzí kritiků na Rotten Tomatoes
   * @type {Integer}
   */
  this.criticReviews;
  
  /**
   * Hodnocení diváků na Rotten Tomatoes
   * @type {Integer}
   */
  this.userRating;
  
  /**
   * Počet hodnocení diváků na Rotten Tomatoes
   * @type {Integer}
   */
  this.userReviews;
  
  /**
   * URL profilu filmu na Rotten Tomatoes
   * @type {String}
   */
  this.url;
    
 
 
 
 
  /**
   * Vyplňuje údaje z Rotten Tomatoes do tabulky hodnocení ČSFD Extended.
   * @returns {undefined}
   */
 
  this.insertRatingHtml = function(){
    if(this.criticRating > 0){ // Pouze pokud má film hodnocení kritiků z Rotten Tomatoes...
      $('#csfd-e-rating .tomato').show(); // Zobrazení řádku Rotten Tomatoes
     
      $('#csfd-e-rating .tomato-critic .rating').html(this.criticRating+'&nbsp;%'); // Nastavení hodnocení kritiků RT
      $('#csfd-e-rating .tomato-critic .votes').html(this.criticReviews.toLocaleString()+'&nbsp;recenzí'); // Nastavení počtu recenzí kritiků RT

      $('#csfd-e-rating .tomato-audience .rating').html(this.userRating+'&nbsp;%'); // Nastavení hodnocení diváků RT
      $('#csfd-e-rating .tomato-audience .votes').html(this.userReviews.toLocaleString()+'&nbsp;hodnocení'); // Nastavení počtu hodnocení diváků RT

      $('#csfd-e-rating .tomato a').attr('href', this.link()); // Nastavení URL profilu filmu na Rotten Tomatoes
    }
  }
       
  
  
  
  
  /**
   * Generuje odkaz na profil filmu na Rotten Tomatoes.
   * @returns {String} URL profilu filmu na RT
   */   
       
  this.link = function(){
    return this.url; // URL už je uložené v objektu, získané z OMDb API  
  } 
};











/**
 * @class Html
 * @classdesc Základní třída, která generuje toolbar, šablonu tabulky hodnocení ČSFD Extended a nějaké další serepetičky.
 */

function Html(){
  
  /**
   * jQuery objekt toolbaru ČSFD Extended
   * @type {jQuery}
   */
  this.toolbar;

  /**
   * jQuery objekt tabulky hodnocení ČSFD Extended
   * @type {jQuery}
   */
  this.table;





  /**
   * Inicializuje CSS pro skript ČSFD Extended.
   * @returns {undefined}
   */
  
  this.cssInit = function(){
    var css_url = 'http://csfd-extended.rychecky.cz/css/csfd-extended.css'; // URL adresa externího CSS
    var css_html = '<link rel="stylesheet" type="text/css" href="'+css_url+'" />';  // HTML kód pro vložení CSS
    
    $('head').append(css_html); // Vložení CSS do hlavičky HTML kódu
  }
    
 
 
 
 
  /**
   * Stará se o vyplnění potřebných údajů do šablony tabulky hodnocení ČSFD Extended.
   * @returns {undefined}
   */
 
  this.fillRatingTable = function(){
    imdb.insertRatingHtml(); // Vyplnění údajů IMDB
    metacritic.insertRatingHtml(); // Vypnění údajů Metacritic
    rotten_tomatoes.insertRatingHtml(); // Vyplnění údajů Rotten Tomatoes

    this.table.slideDown(); // Animované zobrazení tabulky :3
  }





  /**
   * Generuje a vkládá do profilu filmu šablonu tabulky hodnocení ČSFD Extended pro IMDB, Metacritic a Rotten Tomatoes.
   * @returns {undefined}
   */
 
  this.ratingTable = function(){
    var html = '';
            
    html += '<div id="csfd-e-rating" class="ct-related" style="display: none;">'; // Začátek tabulky hodnocení ČSFD Extended

      html += '<div class="header"><h3>ČSFD Extended</h3></div>'; // Nadpis ČSFD-like


      html += '<div class="content">'; 

        html += '<table>'; // Tabulkáá    

          html += '<tr class="imdb" style="display: none;">'; // Řádek údajů IMDB
            html += '<td class="favicon"><img src="http://www.google.com/s2/favicons?domain=imdb.com" alt="" /></td>';
            html += '<td class="title"><a href="" class="link" title="Otevřít profil na IMDB">IMDB</a></td>';
            html += '<td class="rating"></td>';
            html += '<td class="votes"></td>';
          html += '</tr>';

          html += '<tr class="metacritic" style="display: none;">'; // Řádek údajů Metacritic
            html += '<td class="favicon"><img src="http://www.google.com/s2/favicons?domain=metacritic.com" alt="" /></td>';
            html += '<td class="title"><a href="" class="link" title="Otevřít seznam recenzí Metacritic">Metacritic</a></td>';
            html += '<td class="rating help" title="Agregované skóre z profesionálních recenzí periodik a webů zapojených do Metacritic"></td>';
          html += '</tr>';

          html += '<tr class="tomato tomato-critic" style="display: none;">'; // Řádek údajů Rotten Tomatoes (kritici)
            html += '<td class="favicon"><img src="http://www.google.com/s2/favicons?domain=rottentomatoes.com" alt="" /></td>';
            html += '<td class="title"><a href="" class="link" title="Otevřít profil na Rotten Tomatoes">RT: kritici</a></td>';
            html += '<td class="rating help" title="Poměr kritiků, kteří dali tomuto filmu pozitivní verdikt"></td>';
            html += '<td class="votes"></td>';
          html += '</tr>';

          html += '<tr class="tomato tomato-audience" style="display: none;">';  // Řádek údajů Rotten Tomatoes (diváci)
            html += '<td class="favicon"><img src="http://www.google.com/s2/favicons?domain=rottentomatoes.com" alt="" /></td>';
            html += '<td class="title"><a href="" class="link" title="Otevřít profil na Rotten Tomatoes">RT: diváci</a></td>';
            html += '<td class="rating help" title="Poměr diváků, kteří dali filmu hodnocení 3,5 hvězdičky nebo vyšší z maximálního počtu 5 hvězdiček"></td>';
            html += '<td class="votes"></td>';
          html += '</tr>'; 

        html += '</table>';
     
     
        html += '<div class="footer">'; // Drobné zápatí
        html += '<a href="javascript:void(0)" id="csfd-e-cache-clear" title="Jednorázově vymaže již stažené informace o hodnocení">Vyčistit cache</a> | '; // Tlačítko na vyčištění cache
        html += 'by <a href="http://www.csfd.cz/uzivatel/99999-jacube/">jaCUBE</a> via <a href="https://gf.qytechs.cn/cs/scripts/15784-%C4%8Csfd-extended">Greasy Fork镜像</a>';
        html += '</div>';
    
      html += '</div>';
     
    html += '</div>';


    $('#rating').after(html); // Vložení do profilu filmu na ČSFD hned pod tabulku hodnocení vpravo nahoře
    
    this.table = $('#csfd-e-rating'); // jQuery objekt tabulky hodnocení
  }
 
 
 
 
 
  /**
   * Generuje HTML kód toolbaru ČSFD Exteded s rozličnými užitečnými odkazy.
   * @returns {undefined}
   */
 
  this.toolbar = function(){
    var name_url = encodeURIComponent(csfd.name); // Ošetřený název filmu

    var html = '';
    html += '<div id="csfd-e-toolbar">';

      html += '<a href="https://www.google.cz/search?q='+name_url+'" target="_blank">Google</a>'; // Tlačtíko Google
      html += '<a href="https://www.youtube.com/results?search_query='+name_url+'" target="_blank">YouTube</a>'; // Tlačítko YouTube
      html += '<a href="https://www.reddit.com/search?q='+name_url+'+subreddit%3Amovies+OR+subreddit%3Atelevision+OR+subreddit%3Atrailers&sort=relevance&t=all" target="_blank">Reddit</a>'; // Omezeno na r/movies, r/television a r/trailers
      html += '<a href="https://www.facebook.com/search/pages/?q='+name_url+'" target="_blank">Facebook</a>'; // Tlačítko Facebook
      html += '<a href="http://www.titulky.com/?Fulltext='+name_url+'" target="_blank">Titulky.com</a>'; // Tlačtíko Titulky.com
      html += '<a href="http://www.uloz.to/hledej?media=video&protected=notPassword&redir=0&q='+name_url+'" target="_blank">Ulož.to</a>'; // Tlačítko Ulož.to
      html += '<a href="https://www.google.cz/search?q='+name_url+' site:yify-movies.net OR site:yify-movie.com" target="_blank">YIFY</a>'; // Tlačítko vyhledávání YIFY releasů přes Google
      html += '<a href="https://torrentz.eu/search?q='+name_url+'" target="_blank">Torrentz</a>'; // Vyhledávání torrentů přes agregátor Torrentz.eu

    html += '</div>';

    $('#profile div.content').prepend(html); // Připojení toolbaru nad ČSFD profil filmu 

    this.toolbar = $('#csfd-e-toolbar'); // jQuery objekt toolbaru

    this.colourToolbar(); // Obarvení toolbaru
  }
  
  
  
  
  
  /**
   * Přidává do toolbaru odkaz na oficiální web filmu, jeho URL byla stažena z OMDb.
   * @param {String} www URL filmu/seriálu
   * @returns {undefined}
   */
  
  this.addWebsiteToToolbar = function(www){
    if(www != '' && www != 'N/A'){ // Pokud je uveden nějaký web...
      var html = '<a href="'+www+'" target="_blank" title="Oficiální web filmu/seriálu">WWW</a>'; // HTML kód tlačítka
      this.toolbar.prepend(html); // Přidání tlačítka na začátek toolbaru

      this.colourToolbar(); // Opětovné obarvení toolbaru (včetně nového tlačítka)
    }
  }
  
  
  
  
  
  /**
   * Obarvuje tlačítka toolbaru dle barvy filmu na ČSFD (červená, modrá, černá, šedá) tak, aby toolbar zapadl. :)
   * @returns {undefined}
   */
  
  this.colourToolbar = function(){
    this.toolbar.find('a').css({background: csfd.color()}); // Obarvení tlačítek toolbaru barvou filmu ČSFD
  }
  
  
  
  
  
  /**
   * Vytahuje a zviditelňuje datum vložení vlastního hodnocení filmu.
   * @returns {undefined}
   */
  
  this.myRatingDate = function(){
    var title = $('.my-rating > span').attr('title'); // Získání atributu title hvězdiček 
    
    if(typeof title != 'undefined'){ // Pokud byl tento film už mnou hodnocen...
      title = title.replace('vloženo ', ''); // Odstranění slova "vloženo"

      var html = '<div id="csfd-e-rating-date" title="Datum přidání mého hodnocení">'+title+'</div>'; // HTML kód datumu přidání mého hodnocení

      $('#my-rating .content').append(html); // Přidání mého hodnocení pod hvězdičky
   }
  }
    
   
  
  
  
  /**
   * Automaticky otevírá rozšířený popis filmu, je-li takový.
   * @returns {undefined}
   */  
  this.plotExpand = function(){
    $('#plots .content a').click(); // Pokud je tam tlačítko (více)... KLIK!
  }
};











/**
 * @class Html
 * @classdesc Základní třída, která generuje toolbar, šablonu tabulky hodnocení ČSFD Extended a nějaké další serepetičky.
 */

function Floating(){
  
  /**
   * jQuery objekt plovoucího rámečku
   * @type {jQuery}
   */
  this.floating;  
  
  /**
   * jQuery objekt AJAX dotazu na obrázek tvůrce
   * @type {jQuery}
   */
  this.request;
    
  /**
   * Jé :)
   * @type Floating
   */
  var parent = this;

    
    
  
  
  
  
  
  
  
  
  /**
   * Inicializace plovoucího rámečku ČSFD Extended.
   * @returns {undefined}
   */  
    
  this.init = function(){
    var html = '<img id="csfd-e-floating" src="" alt="" />'; // HTML plovoucího obrázku
     
    $('body').append(html); // Přidání na konec těla stránky
     
    this.floating = $('#csfd-e-floating'); // HTML objekt plovoucího obrázku
  }
 
 
 
 
 
  /**
   * Obnovuje polohu plovoucího okna s tím, jak se kurzor myši pohybuje po objektu, který je v parametru této metody.
   * @param {jQuery} obj jQuery objekt, po kterém se pohybuje kurzor
   * @returns {undefined}
   */
  
  this.refresh = function(obj){      
    obj.mousemove(function(e){ // Při každém pohybu kurzoru...
      parent.floating.css({'top': e.pageY - 120, 'left': e.pageX + 20, 'display': 'inline'}); // Opětovné nastavení polohy plovoucího rámečku vůči kurzoru myši  
    });
     
     
    obj.mouseout(function(){ // Při opuštění kurzoru z objektu...
      parent.floating.hide(); // Skrytí plovoucího rámečku
      parent.floating.attr('src', ''); // Nastavneí obrázku na... nic
      parent.request.abort(); // Přerušení AJAXového dotazu
    });  
  }
 
  
 
 
 
  /**
   * Zajišťuje zvětšený plovoucí náhled posteru filmu na profilu ČSFD.
   * @returns {undefined}
   */
 
  this.bindPoster = function(){
    var poster = $('#poster img, #posters img'); // Všechny postery...


    $('#show-all-posters').click(function(){ // Kliknutí na tlačítko "všechny plakáty" je stahuje AJAXem...
      parent.bindPoster(); // ...je třeba tedy kvůli selektroru tuto metodu znovu zavolat
    });


    poster.mouseenter(function(e){ // Najetí kurzorem na náhled posteru...
      var poster_url = $(this).attr('src'); // Získání URL obrázku
      poster_url = poster_url.replace(/\?.+/, ''); // Odstranění GET z URL

      parent.floating.attr('src', poster_url); // Nastavení obrázku plného posteru do plovoucího rámečku
    });

    this.refresh(poster); // Obnovování polohy s tím, jak jezdí kurzor po náhledu posteru
  }
 
 
 
 
 
  /**
   * Zajišťuje náhled profilové fotky tvůrce při najetí na jeho jméno na profilu filmu.
   * @returns {undefined}
   */
 
  this.bindCreator = function(){
    var links = $('.creators a'); // Odkaz na tvůrce (herci, režiséři...)


    links.mouseenter(function(e){ // V okamžiku, kdy kurzor na jeden z odkazů vjede...
      var href = $(this).attr('href'); // Získání URL profilu 

      parent.request = $.ajax({ // AJAXový dotaz pro získání HTML ze stránky tvůrce...
        method: 'GET',
        url: href // Adresa profilu tvůrce
      });


      parent.request.done(function(response){ // Po úspěšném stažení HTML celé stránky tvůrce...
        var img =  $(response).find('#profile .image img').attr('src'); // Nalezení URL profilového obrázku

        parent.floating.attr('src', img); // Nastavení URL obrázku do plovoucího rámečku
        parent.refresh(links); // Obnovování polohy s tím, jak jezdí kurzor po odkazu na tvůrce
      });
    });
  }
};











/**
 * @class Cache
 * @classdesc Třída pro práci s cache v podobě local storage.
 */

function Cache(){

  /**
   * Jé :)
   * @type Cache
   */
  var parent = this;
    
    
    
  

  /**
   * Nastavuje objekt (odpověď OMDb) do cache pod určitým kódem.
   * @param {String} key Název klíče pro uložení do cache
   * @param {Object} object Objekt pro uložení do cache
   * @returns {undefined}
   */
    
  this.set = function(key, object){
    localStorage.setItem(key, JSON.stringify(object)); // Nastavení JSON objektu do cache
  }
 
 
 
 
 
  /**
   * Získává objekt z cache.
   * @param {String} key Název klíče pro získání z cache
   * @returns {Boolean} Byly nalezeny informace z cache?
   */
 
  this.get = function(key){
    var response = localStorage.getItem(key); // Získání údajů z cache tam, kde by měly být   
    response = $.parseJSON(response); // Snaha naparsovat JSON obsah cache

    if(response == null || response.timestamp <= $.now() - cache_expire * 60 * 60){ // Pokud nebylo nic nalezeno, či pokud je to starší než limit...
      return false; // Cache miss!
    }else if(cache_allowed){ // ...avšak když je povolená cache...
      return response; // Cache hit - vrací uložený objekt
    }else{ 
      return false; // Cache miss!   
    }
  }
    
    
    
    
 
  /**
   * Vyčitění cache ČSFD Extended.
   * @returns {undefined}
   */
  
  this.clear = function(){
    for (var i = 0; i < localStorage.length; i++){ // Procházení jednotlivých krámů uložených v local storage...
      var key = localStorage.key(i); // Aktuální klíč

      if(key.match(/tt\d+/)){ // Pokud odpovídá IMDB kódu (tt\d+)...
        localStorage.removeItem(key); // ...vymazání itemu
      }
    }
  }
  
  
  
  
  
  /**
   * Binduje funkci při kliknutí na tlačítko pro vymazání údajů z cache.
   * @returns {undefined}
   */
  
  this.btnClearBind = function(){
    $('#csfd-e-cache-clear').click(function(){ // Kliknutí na tlačítko...
      parent.clear(); // Vymazání cache ČSFD Extended
      location.reload(); // Refresh stránky  
    });
  }
}











/**
 * @class BoxOffice
 * @classdesc Spravuje informace o celosvětových tržbách filmu.
 */

function BoxOffice(){
  
  /**
   * Hodnota celosvětových tržeb
   * @type {String} 
   */
  var box_office;
    
  
  
  
    
  /**
   * Nastavuje hodnotu tržeb v HTML kódu ČSFD profilu filmu.
   * @returns {undefined}
   */  
    
  this.insertBoxOfficeHtml = function(){
    if(typeof this.box_office != 'undefined' && this.box_office != 'N/A'){ // Pokud jsou nastavené nějaké celosvětové tržby...
      var html = ', <span class="help" title="Celosvětové tržby">'+this.box_office.replace('.', ',')+'</span>'; // HTML kód zobrazující tržby
      $('#profile .genre').append(html); // Připojení HTML kódu tržeb za žánry filmu
    }
  }
}











/*
console.log(csfd);
console.log(omdb);
console.log(imdb);
console.log(metacritic);
console.log(rotten_tomatoes);
console.log(box_office);
console.log(html);
*/

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址