// Do generovanych HTML stranek, do jejich hlavicky je generovan JS kod
// s nasledujicimi promennymi:
//  * TOTAL_WORKS obsahujici pocet setu, ktere se na strance vykresluji v podobe thumbnailu
//    Tohle je treba znat pro vytvoreni gridu. Puvodne jsem toto cislo odhadoval z poctu
//    praci na strance (obsahu #thumbnails), ale to je spatne -- jejich pocet se meni podle
//    toho kde uzivatel je.
//  * HP_URLS obsahuje seznam URL, ktera vedou na varianty uvodni stranky. To je treba pro
//    obsluhu set_handler. Potrebuji mit tento seznam co nejdrive po ruce, protoze set_handler
//    je poveseny na load udalosti obrazku (ktery se muze objevit kdykoliv). Ziskavani
//    seznamu URL z HTML kodu bylo trochu problematicke kvuli pripadum, kdy momentalne na 
//    nejake HP jsem a jeji polozka je v menu zvyraznena a bez linku.

// Touto konstantou se ovlivnuje jak moc nahodne rozmisteni bude
// hodnoty > 3 jsou spise gridovejsi
// hodnoty < 2 jsou spise nahodne; dochazi k vetsimu nezadoucimu prekryvani praci pres sebe
var RATIO = 2; 

// Maximalni pocet pixelu, o kolik muze ctverecek "ujet" mimo vlastni grid
// dulezita konstanta pro zejmena pro sety umistovane na levy a dolni okraj 
// (nechceme, aby tyto sety vyjely z viewportu prohlizece)
// Poznamka: RATIO se musi jeste vynasobit nejakym cislem, jinak dochazi k presahum
// (zatim jsme experimentovali s hodnotami 1.1 az 1.8)
var MAX_SHIFT = Math.ceil(100 / RATIO * 2.2); 

// Stred obrazovky (z tadyma vylitavaji sety)
var MIDDLE = {};

// Pole s pozicemi v gridu (co polozka to pole [x, y])
var GRID_POS = [];

// Rychlost presunu setu ze stredu obrazovky do finalni pozice
var ANIMATION_SET_SPEED = 500;

// Rychlost vyjizdeni/zajizdeni vrstvy s textem
var ANIMATION_TEXTLAYER_SPEED = 200;

// "Nahodicka"
// Par slov: Na uvodni strance se prace rozhazuji nahodne. Potrebujeme ale, aby tato nahoda
// byla po nejakou dobu nemenna (tj. kdyz se mi prace nejak rozhodi, musi zustat rozhozene
// stale stejne po celou dobu, co se na hrosim webu pohybuju).
// Tzn. ze nepotrebujeme az tak nahodu, jako spis "pseudonahodu". A prave tu realizuji s pomoci 
// dvou random_XXX funkci a techto konstant...

// Mame k dispozici 10 sad nahodnych cisel; pri prvni navsteve webu se nahodne vybere jeden
// ze setu a po dobu COOKIE_EXPIRE dni se pracuje jen s nim
var RANDOM = [
    [10,30,1,82,48,30,40,86,80,9,78,99,25,63,54,0,86,24,3,44,61,74,64,60,82,86,4,82,26,93,88,78,41,19,44,80,6,31,15,27,23,76,96,80,74,65,44,0,24,59,61,52,98,38,13,48,83,32,55,39,58,44,87,63,51,4,6,62,22,30,81,22,16,71,88,27,16,22,68,84,24,82,42,31,60,22,0,3,86,21,85,74,20,25,9,13,55,19,24,65],
    [4,46,43,10,48,60,0,15,92,93,58,84,84,22,78,80,55,11,9,72,56,56,33,17,59,16,94,64,66,68,25,91,75,49,17,45,84,68,10,63,58,24,79,0,64,80,29,60,4,39,75,10,15,48,64,61,10,30,22,4,2,14,82,10,67,34,18,94,31,25,2,43,59,53,93,47,52,41,9,19,35,38,80,25,78,95,18,51,40,94,60,73,16,84,81,16,29,17,37,52],
    [41,55,94,44,53,59,83,34,93,21,7,68,59,90,66,17,66,63,7,10,54,64,87,2,65,28,91,7,44,97,9,20,63,23,25,71,48,12,53,52,73,10,22,28,85,85,53,98,22,81,62,63,91,87,40,31,68,79,86,93,72,56,61,70,76,71,63,20,85,28,30,64,94,29,0,60,97,80,28,2,75,44,47,55,92,20,59,62,45,17,26,99,56,27,88,7,59,28,10,50],
    [93,76,78,23,34,17,58,65,67,5,7,87,78,93,86,78,13,42,97,91,42,97,4,82,51,35,22,27,47,86,88,84,95,36,98,22,8,74,87,9,19,42,28,70,16,8,2,99,28,7,65,78,20,47,83,6,60,41,94,17,97,64,74,43,38,96,83,56,76,25,56,90,58,69,61,87,22,84,70,7,26,97,13,48,6,23,66,18,59,33,55,49,94,67,24,23,89,72,90,62],
    [16,2,78,3,9,94,87,10,88,9,78,79,93,3,42,91,52,61,68,41,33,88,76,58,40,64,75,66,54,87,20,82,85,13,11,57,68,55,23,24,9,1,40,42,64,58,54,38,51,19,66,96,28,96,61,32,55,64,76,59,98,56,18,20,7,25,15,71,8,78,52,9,98,22,61,41,25,47,80,46,70,51,77,27,67,78,36,89,56,14,2,21,80,68,36,43,75,21,8,41],
    [12,92,26,48,80,26,22,87,42,42,28,94,95,68,27,85,18,57,99,98,25,76,43,58,70,69,70,34,53,93,35,89,46,55,49,96,65,14,87,13,2,11,85,80,84,32,88,52,85,8,70,78,58,80,19,83,76,11,8,82,1,6,20,46,53,57,29,65,24,49,23,65,4,39,61,33,11,35,72,3,79,5,5,13,31,58,33,43,26,95,95,66,67,47,39,55,83,67,89,15],
    [30,62,91,15,60,54,92,80,62,9,87,98,43,82,52,46,56,17,63,50,16,91,4,81,63,20,15,43,48,48,20,96,64,67,20,60,9,46,97,51,44,7,48,6,87,42,95,0,72,52,86,42,20,77,79,23,61,89,21,40,74,10,16,50,97,31,56,59,39,53,31,2,23,1,19,0,18,6,16,34,74,92,97,15,54,3,77,51,98,11,76,52,19,0,46,53,46,23,29,31],
    [38,67,79,83,41,48,14,98,92,37,41,7,37,31,6,73,95,54,94,46,24,40,92,54,7,62,31,73,27,9,2,62,89,5,48,26,92,76,98,5,92,24,46,39,63,48,16,65,47,92,4,35,85,41,40,49,53,25,76,2,48,83,52,6,20,96,37,38,1,90,2,31,50,75,20,65,36,70,67,63,93,56,9,12,94,22,35,97,23,25,24,35,88,13,3,52,23,91,46,61],
    [20,93,52,5,39,71,10,73,56,68,87,0,52,55,89,49,54,41,5,65,90,55,54,92,83,48,57,43,54,60,45,29,81,51,14,67,79,57,42,90,18,46,11,64,8,23,77,12,40,12,7,21,1,70,89,6,88,57,22,90,44,61,12,79,2,33,17,93,21,8,0,79,46,63,82,82,20,7,64,42,65,4,39,34,0,43,74,30,33,97,9,22,70,26,89,89,63,84,25,64],
    [12,19,84,38,14,81,96,53,94,38,84,87,50,40,26,76,58,85,13,67,31,63,12,17,16,30,33,40,55,52,5,18,40,45,93,64,63,28,69,89,80,6,1,89,6,27,98,7,10,68,14,90,7,63,88,97,21,67,59,75,44,57,71,32,16,70,25,23,20,4,47,77,60,9,70,90,23,19,8,80,32,25,46,56,85,38,86,1,68,10,86,52,69,21,43,25,15,52,53,32]
];
// Vybrany set z pole RANDOM (0-9)
var RANDOM_SET = 0; 
// Aktualni pozice do vybraneho setu nahodnych cisel (pouziva fce my_random)
var RANDOM_IDX = -1;


// --------------------------------------------------------------------------
// Pomocna funkce, ktera mi z aktualniho URL vrati budto jeho statickou 
// nebo AJAXovou cast. 
//
// Priklad: mejme URL ve tvaru "http://hippo.com/#/kontakt/"
// 
//  * staticka URL je "/"
//  * AJAXova je "/kontakt/"
// 
// Pokud je parametr `ajax` nastaven na true, vraci AJAXove URL,
// jinak staticke.
function get_url(ajax)
{
    var url = window.location;
    if (ajax) {
        return url.hash.replace('#', '');
    }
    else {
        return url.pathname;
    }
}


// --------------------------------------------------------------------------
// Funkce pro praci s "pseudonahodnymi" cisly.

// Reset generovani nahodnych cisel.
// (fce my_random vrati po resetu vzdy stejnou posloupnost "nahodnych" cisel)
function reset_random()
{
    RANDOM_IDX = -1;
}

// Vrati nahodne cislo v rozsahu 0-99.
function my_random()
{
    RANDOM_IDX = RANDOM_IDX + 1;
    return RANDOM[RANDOM_SET][RANDOM_IDX % RANDOM[RANDOM_SET].length] / 100.0;
}

// Nahodne promicha zadane pole.
function shuffle(o) {
	for(var j, x, i = o.length; i; j = parseInt(my_random() * i), x = o[--i], o[i] = o[j], o[j] = x);
	return o;
}


// --------------------------------------------------------------------------
// Analyza plochy, do ktere se umistuji sety.

// Plocha #thumbnails je virtualne rozdelena minimalne na tolik policek,
// kolik praci hrosi vytvorili. Kazda prace je pak do nektereho policka
// umistena (ne uplne presne, ale s urcitym nahodnym offsetem).
// Timto jednoduchym zpusobem dokazeme zajistit, ze se prace na strance
// rozprsknou rovnomerne a minimalizujeme moznost prekryti jednotlivych
// setu pres sebe.

// Pomocna funkce, ktera nalezne minimalni moznou velikost gridu
// (takovou, aby se do ni vlezly vsechny hrosi prace).
function find_grid_size(w, h, count, w_count, h_count, w_size, h_size)
{
    var delta = count - (w_count * h_count);
    if (delta < h_count) {
        h_count = h_count + 1;
    }
    else if (delta < w_count) {
        w_count = w_count + 1;
    }
    else {
        h_count = h_count + 1;
        w_count = w_count + 1;
    }
    w_size = Math.floor(w / w_count);
    h_size = Math.floor(h / h_count);
    return [w_count, h_count, w_size, h_size];
}


// Pripravi pole GRID_POS, ktere obsahuje konkretni pozice na obrazovce,
// do kterych se posleze umistuji sety.
function calc_grid_positions(w, h, count)
{
    // reset pseudonahodnych cisel
    reset_random();

    // vypocitame idealni velikost jednoho policka gridu
    var total_area = w * h; // celkova plocha mista, kde muzeme umistovat prace
    var set_area = total_area / count; // plocha pro jeden set
    var w_size = Math.floor(Math.sqrt(set_area)); // idealni delka strany plochy pro jeden set
    var h_size = w_size;
    var w_count = Math.floor(w / w_size);
    var h_count = Math.floor(h / h_size);

    // vypocitame minimalni moznou velikost gridu
    while ((w_count * h_count) < count) {
        var _x = find_grid_size(w, h, count, w_count, h_count, w_size, h_size);
        w_count = _x[0];
        h_count = _x[1];
        w_size = _x[2];
        h_size = _x[3];
    }

    // pole GRID_POS obsahuje nahodne pozice (x, y), na ktere se nasledne budou
    // umistovat jedlive sety
    GRID_POS=[];
    var offset_x;
    var offset_y;
    for (var y=0; y < h_count; y++) {
        for (var x=0; x < w_count; x++) {
            offset_x = my_random();
            offset_y = my_random();
            _x = x * w_size + Math.round(offset_x * w_size / RATIO);
            _y = y * h_size + Math.round(offset_y * h_size / RATIO);
            GRID_POS.push([_x, _y]);
        }
    }
    GRID_POS = shuffle(GRID_POS);
}


// --------------------------------------------------------------------------
// Obsluzna funkce, ktera se vyvola po nacteni obrazku v setu.
// 
// Tohle je velice dulezite. Funkce set_handler zaridi, ze po nacteni obrazku
// setu se obrazek ocitne na te "spravne" pozici a to nekterym ze dvou zpusobu:
//
// * pokud je parametr anim nastaven na true, pak se obrazek do sve
//   budouci lokace presune ze stredu obrazovky; navic se meni jeho prusvitnost
//   z pruhledneho do zcela nepruhledneho
// * pokud je anim=false, pak se obrazek na sve pozici objevi rovnou, bez
//   pohybu; prolinacka je ale zachovana
//
// Pozor! Uvnitr kodu je jeste specialni podminka, ktera nekdy parametr anim 
// prebije na false Jde o pripady kdy uzivatel prichazi na AJAXovou URL
// (coz si interne vysvetlujeme tak, ze budto uz je na webu nejakou dobu a klika
// na vsechno co vidi, anebo ze uzivateli nekdo poslal odkaz na konkretni misto
// webu a on na nej primo prisel). V techto situacich NECHCEME, aby na uvodni 
// strance probehla animace, protoze by to otravovalo. Jinymi slovy, animace
// se spusti POUZE pokud uzivatel prijde na adresu http://www.hipposdesign.com/
function set_handler(set, anim)
{
    var ajax_url = get_url(true);
    if (ajax_url) {
        anim = false;
    }

    set = $(set);
    if (!set.hasClass('work')) {
        set = $(set).parent();
    }

    // id setu odpovida indexu v poli GRID_POS
    // (tj. umisteni prace do gridu a jeji offset je dan ID prace)
    idx = parseInt(set.attr('id').replace(/^th-/, '')) - 1;
    if (GRID_POS[idx] == undefined) {
        // Pojistka
        // **Teoreticky** se muze stat, ze obrazek bude do stranky nacten drive, nez bude 
        // pripraveno pole GRID_POS. Pokud by k tomu skutecne doslo, prace se zobrazi buhvi
        // kde (treba nikde). (workplace_init je povesen na DocumentReady, tj. na udalost,
        // ktera sugnalizuje nacteni HTML kodu, a nez se spusti, muze se nektery obrazek
        // do stranky jiz nacist).
        // Radeji to osetruji tak, ze za kratkou chvili vyvolam funkci znovu a se stejnymi
        // parametry. 
        setTimeout(function() {
            set_handler(set, anim);
        }, 200);
        return;
    }

    // posadime set na svou pozici v gridu
    // MM: nove musime pridavat odsazeni bloku s nahledy (#thumbnails), protoze 
    // .work ma pozici "fixed" namisto "absolute" a tedy nezavislou na pozici celeho bloku
    var x = GRID_POS[idx][0] + $('#thumbnails').offset().left;
    var y = GRID_POS[idx][1] + $('#thumbnails').offset().top; 
    if (anim) {
        // set se na budouci pozici presune (pohyb + prolinacka)
        set.css({
            'position': 'fixed',
            'display': 'block',
            'opacity': 0,
            'left':MIDDLE.x+'px',
            'top':MIDDLE.y+'px'
        }).animate({
            'left':x+'px',
            'top':y+'px',
            opacity:1
        }, ANIMATION_SET_SPEED);
    }
    else {
        // set se na budouci pozici objevi (prolinacka)
        set.css({
            'left':x+'px',
            'top':y+'px',
            'position': 'fixed',
            'display': 'block',
            'opacity': 0
        }).animate({
            opacity:1
        }, ANIMATION_SET_SPEED);
    }
    
    // CSS trida pro hover a prace uplne napravo
    if (x > WORKPLACE_WIDTH - 350) {
        set.addClass('reversed');
    }
}


// --------------------------------------------------------------------------
// Inicializacni skripty.

// Promenna, do ktere je ulozena sirka pracovni plochy, do ktere se umistuji
// sety (thumbnaily).
var WORKPLACE_WIDTH;

// Nalezeni stredu obrazovky.
function find_center()
{
    var out = {}
    out.x = Math.round(($('#thumbnails').width() / 2));
    out.y = Math.round(($('#thumbnails').height() / 2));
    return out;
}

// Zakladni inicializace, urci "pseudonahodu" pro tohle sezeni a schova sety
// (protoze se s nimi bude za chvili neco dit, viz set_handler).
function basic_init()
{
    RANDOM_SET = $.cookie('RANDOM_SET');
    if (!RANDOM_SET) {
        RANDOM_SET = Math.round(Math.random() * (RANDOM.length - 1));
        $.cookie('RANDOM_SET', RANDOM_SET, {path:'/'});
    }

    $('#thumbnails .work').css({
        'position': 'fixed',
        'top':'0',
        'left':'0',
        'display':'none'
    });
}

// Nastavi velikost pracovni plochy, do ktere se umistuji sety (thumbnaily).
function set_workplace_size()
{
    // zjistime rozmery viewportu, viewportHeight obsahuje hack na Operu
    var viewport_width = $(window).width();  
    var viewport_height = window.innerHeight ? window.innerHeight : $(window).height();
    
    // odecteme rozmery ostatnich prvku, abychom zjistili rozmery pro #thumbnails
    WORKPLACE_WIDTH = viewport_width - parseInt($('#thumbnails').css('margin-left')) - 30;
    var workplace_height = viewport_height - $('#head').height() - parseInt($('body').css('margin-top')) - $('#foot').height(); 

    $('#thumbnails').css({
        'width': WORKPLACE_WIDTH+'px',
        'height': workplace_height+'px',
        'background-color': '#fff'
    });
}

// Pripravi plochu, na kterou se umistuji sety 
// a ceka na mouseovery nebo kliknuti na praci
function workplace_init()
{
    if ($('#thumbnails').length) {
        set_workplace_size();
        MIDDLE = find_center();
        var w = $('#thumbnails').width() - MAX_SHIFT;
        var h = $('#thumbnails').height() - MAX_SHIFT;
        calc_grid_positions(w, h, TOTAL_WORKS);        
        $('.work').hover(function () {
          $(this).addClass('active');
        }, function () {
          $(this).removeClass('active');
        });        
    }
}

// Inicializace FancyBoxu.
function initialize_fancybox()
{ 
    // vypocitame vysku dokumentu
    var D = document;
    var height = 100 + Math.max( // Proc musime pridavat 100? 
        Math.max(D.body.scrollHeight, D.documentElement.scrollHeight),
        Math.max(D.body.offsetHeight, D.documentElement.offsetHeight),
        Math.max(D.body.clientHeight, D.documentElement.clientHeight)
    );

    // nakopneme fancybox
    $('#fake_detail a.work').fancybox({
        'padding': 0,
        'overlayOpacity': 0.9,
        'zoomOpacity': true,
        'callbackOnStart': function() { 
            $('#fancy_overlay').css('height', height); 
            Cufon.replace('#fancy_paging');
        },
        'callbackOnShow': function() { 
            $('#fancy_title a').click(function() {
              window.open($(this).attr('href')); 
              return false;                  
            });                       
        }, 
        'callbackOnClose': function() { 
            $('#thumbnails a.active').removeClass('active');
            var url = URL_CACHE[1] || URL_CACHE[0];
            if (URL_CACHE[1]) {
                reset('static');
            }
            else {
                if ($('#thumbnails').length) {
                    reset('thome');
                }
                else {
                    reset('ihome');
                }
            }
            $.history.load(url);
        }
    });
}


// --------------------------------------------------------------------------
// Resetovaci funkce, ktere se staraji o to, aby stranka byla pripravena
// na budouci obsah (volaji se tesne pred zobrazenim typovych stranek, napr.
// pred zobrazenim detailu setu, pred zobrazenim staticke stranky, apod.)

// Pomocne fce.
function _reset_loading()
{
    if (!$('#loading').length) {
        $('body').append('<p id="loading"><span>Loading...</span></p>');
    }
}

function _reset_text_layer_out()
{
    if ($('#text_content').length) { 
        $('#text_content, #we_are_hippos, #studio_navigation').animate({
            marginLeft: '-600px'
        }, ANIMATION_TEXTLAYER_SPEED, false, function(){ 
            $('#text_content').remove();
            $('#we_are_hippos').css('margin-left','0');
        });  
        $('#studio_navigation').hide();
    }          
}

function _reset_text_layer_in()
{
    if (!$('#text_content').length) {
        $('#head').after('<div id="text_content"></div>');            
        $('#text_content').css('margin-left','-600px');
        $('#text_content').animate({ marginLeft: '0px' }, ANIMATION_TEXTLAYER_SPEED);
    }
}

function _reset_close_fancybox()
{
    var fc = $('#fancy_close');
    if (fc.length && (fc.css('display') != 'none')) {
        $.fn.fancybox.close(null, true); // parametry: ev=null, ignore_close_callback=true
    }
}

// Pripravi prvky v HTML strance do pozadovaneho stavu.
// Reset fce je volana PRED tim, nez se do stranky nalije novy obsah,
// tj. pripravuje zivnou pudu pro veci budouci.
function reset(to_state)
{
    workplace_init();

    // zjistime, jakou jazykovou verzi prave servirujeme
    var lang = $('html').attr('lang');
    if (lang == 'cs') {
        lang = 'lang_cz';
    }
    else {
        lang = 'lang_en';
    }

    if (to_state == 'thome') {
        // homepage s thumbnail nahledy praci
        _reset_loading();
        $('body').attr({'class': 'page_thumbnails has_ajax loading ' + lang});
        _reset_text_layer_out();
        $('#project_title, #index_view').remove();      
        _reset_close_fancybox();
        if (!$('#thumbnails').length) {
            $('#head').after('<div id="thumbnails"></div>');
        }
    }
    else if (to_state == 'ihome') {
        // homepage s textovym prehledem praci
        _reset_loading();
        $('body').attr({'class': 'page_index_view has_ajax loading ' + lang});
        _reset_text_layer_out();
        $('#project_title, #thumbnails').remove();
        _reset_close_fancybox();
        if (!$('#index_view').length) {
            $('#head').after('<div id="index_view"></div>');
        }
    }
    else if (to_state == 'static') {
        // otevrena staticka vrstva s textem
        _reset_loading();
        $('body').attr({'class': 'page_text has_ajax loading ' + lang});
        $('#project_title').remove();
        _reset_close_fancybox();
        _reset_text_layer_in();
    }
    else if (to_state == 'work') {
        // rozkliknuty detail nektere prace
        _reset_loading();
        $('body').attr({'class': 'page_detail has_ajax loading ' + lang});
        if (!$('#project_title').length) {
            $('#we_are_hippos').after('<strong id="project_title"></strong>');
        }
        if (!$('#fake_detail').length) {
            $('body').append('<div id="fake_detail" style="display:none"></div>');
        }
    }
}


// --------------------------------------------------------------------------
// Vyvolani AJAX dotazu. Krome ocekavane funkcnosti se kazda odpoved uklada
// manualne do cache (tj. kazdy dalsi dotaz na stejne URL se neprovadi,
// ale vytahuje z cache). Mam castecne osetrenu i situaci, kdy se Ajax 
// nepovede --v tom pripade se to zkusi celkem MAX_AJAX_ATTEMPTS krat.
// Na devel serveru se totiz stavalo, ze na nektere Ajax dotazy nebylo
// odpovezeno (tj. kliknulo se nekde do menu ci na praci a nic se nestalo).
// Toto osetreni pomohlo, ale neni to uplne koser. Idealne by se pocitadlo
// pokusu melo po nejake dobe smazat, prip. by mela byt osetrena ze se
// Ajax nepovede.

// Interni cache s Ajax odpovedmi ze serveru
var CACHE = {};

// Pocitadlo spatnych Ajax odpovedi
var AJAX_ERROR = {};

// Pocet pokusu, kolikrat se na jedno URL podava Ajax dotaz
var MAX_AJAX_ATTEMPTS = 3;

function call_ajax(url)
{
    if (CACHE[url]) {
        var data = CACHE[url];
        $.globalEval(data);
    }
    else {
        $.ajax({
            type: "GET",
            data: {ajax: '1'},
            url: url,
            cache: true,
            dataType: "script",
            success: function(data, textStatus) {
                CACHE[url] = data;
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                if (AJAX_ERROR[this.url] == undefined) {
                    AJAX_ERROR[this.url] = 0;
                }
                AJAX_ERROR[this.url] += 1;
                if (AJAX_ERROR[this.url] < MAX_AJAX_ATTEMPTS) {
                    call_ajax(url);
                }
/*
                else {
                    $('body').append('<div style="background:red;color:white;font-weight:900;width:300px;height:100px;position:absolute;top:0;left:0;padding:5px;z-index:10000;">ERROR</div>');
                }
*/
            }
        });
    }
}


// --------------------------------------------------------------------------
// Obsluhy kliknuti na nejruznejsi mista stranky, ktere se postaraji o
// ulozeni stavu, pripravu stranky do ocekavaneho stavu a vyvolani Ajaxu.

// V promenne URL_CACHE si uchovavam naposledy navstivenou adresu,
// pricemz index odpovida urovni zanoreni: 0=homepage (jeji varianty),
// 1=staticke stranky, 2=detail prace.
// Potrebuji to k tomu, abych napr. po zavreni detailu prace vedel, jestli
// se uzivatel vraci na statickou stranku (kterou), nebo homepage (kterou).
var URL_CACHE = {
    0: undefined,
    1: undefined,
    2: undefined
};
URL_CACHE[0] = get_url(false);

// v promenne LUT (Look-up table) se uchovava slovnik, kde klic je URL
// a hodnota obsluzna funkce handle_XXX (viz nize).
var LUT = {};

function handle_static(url)
{
    URL_CACHE[1] = url;
    URL_CACHE[2] = undefined;
    reset('static');
    call_ajax(url);
}

function handle_homepage(url)
{
    URL_CACHE[0] = url;
    URL_CACHE[1] = undefined;
    URL_CACHE[2] = undefined;
    if (url == '/index/') {
        reset('ihome');
    }
    else {
        reset('thome');
    }
    call_ajax(url);
}

function handle_work(url)
{
    URL_CACHE[2] = url;
    reset('work');
    call_ajax(url);
}


// --------------------------------------------------------------------------
// Callback funkce volana pluginem history.
// Postara se o spusteni obsluzne funkce pro zadanou adresu.
function pageload(url) {
    // Tato podminka je trochu Hack...
    // Stavaji se totiz 2 veci:
    // 1) fce pageload je pri prvnim nacteni stranky zavolana s prazdnym
    //    parametrem url; zrejme jde o nejakou anomalii pluginu history
    // 2) uplne stejne (s prazdnym url) je zavolana i v pripade ze uzivatel
    //    z uvodni stranky klikne napr. na statickou stranku /#/kontakt/
    //    a pak klikne na zpet v prohlizeci (dostane se na /) 
    // Zatimco v prvnim pripade nesmim udelat nic, v druhem chci, aby 
    // se aplikace zachovala jakoby by parametr url byl nastaven na hodnotu
    // "/", tj. jako by uzivatel navstivil adresu /#/
    // Jediny zpusob jak podobnou situaci detekovat je mozne s pomoci pole
    // CACHE, do ktereho se ukladaji jiz navstivene adresy a AJAXove odpovedi
    // na ne (jinymi slovy: svedci o uzivatelove aktivite).
    // Pokud tedy v tomto poli neco najdu, prebijim prazdny url za "/".
    if (!url) {
        for (var i in CACHE) {
            url = '/';
            break;
        }
    }
    // podle url nalezneme obsluznou funkci a spustime ji
    if (LUT[url]) {
        LUT[url](url);
    }
}


// Vrati atribut href bez jmena domeny (napr. /studio/ apod.)
function get_href(obj) 
{
    var href = $(obj).attr('href');
    if (href.search(/http:\/\/[^\/]+/) != -1) {
        href = href.replace(/http:\/\/[^\/]+/, '');
    }
    return href;
}


// ==========================================================================
$(document).ready(function() { 
    $(document).keyup(function(event){ 
        // zmacknuto ESC, je otevrena staticka vrstva, neni otevreny detail prace
        if ((event.keyCode == 27) && (URL_CACHE[1]) && (!URL_CACHE[2])) { 
            $('#text_content #closing_cross').click();
        }
    });

    // kliknuti v titulku a menu na varianty homepage (filtry)
    $('#head h1 a, #navigation a.hp').livequery(function(){
        var href = get_href(this);
        LUT[href] = handle_homepage;
        $(this).click(function() {
            $.history.load(href);
            return false;
        });
    });

    // kliknuti v menu na staticke stranky
    $('#navigation a.sp').livequery(function(){
        var href = get_href(this);
        LUT[href] = handle_static;
        $(this).click(function() {
            $.history.load(href);
            return false;
        });
    });

    // HACK: v menu je vzdy nektera z polozek oznacena jako aktivni,
    // tj. neexistuje okolo ni tag <a></a>. Pokud bych to nechal tak, pak by
    // se do 'LUT' tabulky nedostal zaznam o danem URL a jeho obsluzne funkci
    // Proto tuto situaci musim osetrit zvlast.
    // TODO: tohle by mozna slo prepsat s pouzitim HP_URLS
    var url = get_url(false);
    if ($('#navigation strong').length) {
        // v menu je zvyraznena staticka stranka
        LUT[url] = handle_static;
    }
    else if (url == '/index/') {
        LUT[url] = handle_homepage;
    }

    // kliknuti na praci (thumbnail nebo polozku v indexu)
    $('#thumbnails a.work, #index_view ul a').livequery(function(){
        var href = get_href(this);
        LUT[href] = handle_work;
        $(this).click(function() {
            if ($(this).parents('#index_view').length) {
                $(this).addClass('visited');
            }
            $.history.load(href);
            return false;
        });
    });

    // kliknuti na zaviraci krizek statickych stranek
    $('#text_content #closing_cross').livequery('click', function(){
        var url = URL_CACHE[0];
        $.history.load(url);
        return false;
    });

    // init AJAX historie (driv ne!)
    $.history.init(pageload);

    // inicializace nahodneho rozmisteni praci na strance
    basic_init();
    workplace_init();    


    // otevirani odkazu z Fancyboxu a z Twitteru do noveho okna
    $('#fancy_title a, .news_content a, #people a').click(function() {
      window.open($(this).attr('href')); 
      return false;                  
    });

    // spustime nahradu fontu Cufónem 
    Cufon.set('hover', 'true');
    Cufon.replace
      ('#we_are_hippos')
      ('#what_we_like')
      ('.page_detail #project_title')
      ('#text_content .cufonize')
      ('.page_error h1')   
      ('#studio_navigation')
      ('#fancy_paging');      
}); 
