/*
Fancygallery (prototyp)
Knihovna pro zobrazovani galerii obrazku.
Vyuziva jQuery 1.4+, Fancybox 1.3+, Fancybox Shortcat Mod, jCarousel 0.2.4
Autor: Martin Michalek, michalek@shortcat.cz
*/


// ------------------------------------------------------------------------------------------------------------
// Nastaveni

// Debugovaci mod 
var fancygallery_debug = false && (window.console);

// Flickr API
var fancygallery_flickr_api_key = 'e1487167a8099ab5c03c9f03d675a784';

// Nastavujeme jazyk
// Umi 'cz', 'en' nebo false, kdyz prebirame texty z Flickru tak jak jsou
var fancygallery_language = fancygallery_get_HTML_language();    

// Zde budeme ukladat data z Flickru,
// kdyz je budeme chtit nacitat automaticky z URL odkazu
var fancygallery_flickr_auto_data = [];

// Odkud bereme titulky a popisky k fotkam z Flickru
// 'from_set' - ze setu
// 'from_photo' - z jednotlivych fotek
// 'from_photo_and_set' - nejdrive popisek setu a pak jednotlive fotky
// cokoliv jineho - z jednotlivych fotek 
// (TODO vzit v potaz taky jine zpusoby nez Flickr)
var fancygallery_titles = 'from_photo';

// Zahrnout do prohlizeni take primarni obrazek setu?
var fancygallery_show_primary = true;

// Zde budeme ukladat data z Flickru,
// kdyz je budeme chtit nacitat automaticky z URL odkazu
var fancygallery_flickr_auto_data = [];


// ------------------------------------------------------------------------------------------------------------
// Fancybox + jCarousel


/*   
Funkce, ktera vse inicializuje
fancygallery_start se vola pred vykreslenim jednotliveho obrazku ve FancyBoxu jako callback
@selectedIndex - sada vsech obrazku
@selectedOpts - cislo, ktere udava aktualni pozici obrazku (od nuly)
@selectedArray - aktualni obrazek
*/
function fancygallery_start(selectedIndex, selectedOpts, selectedArray) {

  if (fancygallery_debug)
    console.log('selectedOpts: ', selectedOpts);     
  
  // Pokud jeste neni vykresleny blok s thumbnaily, 
  // musime vse inicializovat a vykreslit
  // Provede se jen jednou
  if (!$('#fancybox-thumbnails').length) {     
  
  $("body").addClass('fancybox-active');
  
    // Zjistime, zda jsme v manualnim nebo automatickem modu FB
    var mode = get_mode(selectedIndex);
  
    // Zobrazime nahledy
    show_thumbnails(selectedIndex, mode);
  
    // Nahledy uzavreme do jCarouselu
    init_carousel(selectedOpts);
  
    // Hlidame kliknuti na polozku karuselu podle ni menime velky obrazek
    handle_carousel_click();
  
  // Po kazdem nacteni dalsi fotky
  } else {
  
    // Hlidame zmenu ve Fancyboxu a podle toho zvyraznime
    // odpovidajici prvek v jCarouselu
    handle_fancybox_change(selectedOpts);
  
  }
  
  // --------------------------------------------
  // Jednotlive funkce - Helpery
  
  /*
  Vraci mod - FB volame manualne javascriptem 
  nebo automaticky s daty z HTML
  */
  function get_mode(selectedIndex) {
    if (selectedIndex[0].orig)
     return 'manual';
    else
     return 'auto';
  }
  
  /*
  Zobrazujeme male verze obrazku podle modu, ktery je nastaveny
  TODO: 
  * pujde firstChild.getAttribute prepsat z DOM na jQuery?
  * pujde nekam ulozit selektory za selectedIndex[i], aby kod nebyl tak kostrbaty?
  * pujde funkci nejak vnorit, abychom nemuseli predavat promenne v parametru?
  * konfigurovat skin?
  * Mela by byt verejna metoda, abychom to mohli cinit zvenku
  */
  function show_thumbnails(selectedIndex, mode) {      
    $('#fancybox-title').after('<div id="fancybox-thumbnails"><ul id="fancybox-carousel" class="jcarousel-skin-shortcat"></ul></div>');
    $.each(selectedIndex, function(i) {
    create_carousel_item_HTML(selectedIndex, mode, i);
  });
  }
  
  /*
  Pro jednotlivy thumbnail vytvari HTML strukturu, 
  na kterou se pak da pustit jCarousel
  TODO: odkaz na # ?
  */
  function create_carousel_item_HTML(selectedIndex, mode, i) {
    if (mode == 'auto') {
      $('#fancybox-carousel')
        .append('<li><a href="#"><img src="'+selectedIndex[i].firstChild.getAttribute("src")+'"></a><span class="hover-image"><img src="'+selectedIndex[i].firstChild.getAttribute("src")+'" title="'+selectedIndex[i].title+'"></span></li>');
      } else if (mode == 'manual') {  
      $('#fancybox-carousel')
        .append('<li><a href="#"><img src="'+selectedIndex[i].orig+'"></a><span class="hover-image"><img src="'+selectedIndex[i].orig+'" title="'+selectedIndex[i].title+'"></span></li>');
    }
  }
  
  
  /*
  Na thumbnailech spustime karusel a oznacime zobrazovany prvek
  */
  function init_carousel(selectedOpts) {
    $('#fancybox-carousel').jcarousel({ 
      scroll: 10,
      animation: 'medium',
      itemLoadCallback: {
        onBeforeAnimation: carousel_before_scroll_callback,
        onAfterAnimation: carousel_after_scroll_callback
      }
    });
    handle_fancybox_change(selectedOpts);
  }     
  
  // Hlidame kliknuti na polozku karuselu podle ni menime velky obrazek
  function handle_carousel_click() {
    $('#fancybox-carousel li').click(function() {
      var position = parseInt($(this).attr('jcarouselindex')-1);
      $.fancybox.pos( position ); 
      $('#fancybox-carousel li')
        .removeClass('active');
      $(this)
        .addClass('active');
      return false;
    });
  }
  
  // Hlidame zmenu ve Fancyboxu a podle toho zvyraznime
  // odpovidajici prvek v jCarouselu
  function handle_fancybox_change(selectedOpts) {
    $('#fancybox-carousel li')
      .removeClass('active');
    $('#fancybox-carousel').find('li.jcarousel-item-' + parseInt(selectedOpts + 1))
      .addClass('active');
  }
  
  
  // Callbacky karuselu, ktery se spousti pred a po posunu karuselu. 
  // Pridavaji tridu, ktera meni pozici bloku s obrazky na relative
  // tak, aby ji slo posouvat a namisto CSS vlastnosti 'left' pro statickou pozici
  // pridava 'margin-left'.
  function carousel_before_scroll_callback() {
    $('#fancybox-thumbnails')
     .addClass('scrolling');
    $('#fancybox-thumbnails .jcarousel-list')
     .css('marginLeft', '0px');
  }
  
  function carousel_after_scroll_callback() {
    $('#fancybox-thumbnails')
     .removeClass('scrolling');
    $('#fancybox-thumbnails .jcarousel-list')
     .css('marginLeft', $('#fancybox-thumbnails .jcarousel-list').css('left'));
  }

} // fancygallery_start() 

// ------------------------------------------------------------------------------------------------------------
// Flickr

// Musi byt zatim venku (tedy primo ve window :( ), protoze z HTML volame get_flickr_data_from_set() 
// pro ziskani dat -- to ale zmenime v tom pluginu 

// Zjistime, zda odkazujeme na Flickrovsky set a pokud ano, 
// vratime jeho id
function get_flickr_set_id(url) {
  var path = url.split('/');
  var is_flickr_set = ((path[2] == 'www.flickr.com') && (path[5] == 'sets'));
  var set_id = path[6];
  if (is_flickr_set) {
	  return set_id;
  } else {
	  // vyjimka?
	  return false;
  }
}  

// Natahneme data z Flickru a vracime je ve formatu, ktery ocekava FancyBox
// TODO: 
// * ohlidat jestli prisla OK odpoved
function get_flickr_data_from_set(set_id, api_key) {    
  var photos_rest_url = 'http://api.flickr.com/services/rest/?api_key='+api_key+'&method=flickr.photosets.getPhotos&photoset_id='+set_id+'&extras=url_sq,url_m,url_l,description&media=photos&format=json&jsoncallback=?';
  var set_rest_url = 'http://api.flickr.com/services/rest/?api_key='+api_key+'&method=flickr.photosets.getInfo&photoset_id='+set_id+'&format=json&jsoncallback=?';
  // TODO: Vytvarim jako pole, do ktereho budu davat objekty, ale je to blbe
  var return_data = [];
  $.getJSON(
    photos_rest_url, 
    function(data) {
      // Odstranime z prohlizeni primarni fotku setu (pokud je to nastaveno)
      if (!fancygallery_show_primary) {
        var primary_photo_index = $.each(data.photoset.photo, function(i,item) {
          if (item.isprimary == "1") 
            return i;
        });
        data.photoset.photo.splice(primary_photo_index, 1);
      }
      $.each(data.photoset.photo, function(i,item) {
          var item_title = get_flickr_photo_title(item.title) + fancygallery_mdash_if(get_flickr_photo_description(item.description._content)) + get_flickr_photo_description(item.description._content);
          var item_data = {
            'orig': item.url_sq,
            'href': get_flickr_large_photo(item.url_l, item.url_m),
            'title': item_title
          };
          return_data.push(item_data);
          if (fancygallery_debug)
            fancygallery_log_flickr_photos(i, item, item_title);
	});
	// Pokud chceme titulky a popisky k fotkam mit vsechny stejne ze setu nebo 
  // ze setu a zaroven z fotky
	if ((fancygallery_titles == 'from_set') || (fancygallery_titles == 'from_photo_and_set')) {
	  $.getJSON(
      set_rest_url, 
      function(data) {
        var set_title = get_flickr_photo_title(data.photoset.title._content);
        var set_description = get_flickr_photo_description(data.photoset.description._content);
        $('html').addClass('fancygallery-complete');
      $.each(return_data, function(i,item) {
        var item_title = '';
        if (fancygallery_titles == 'from_set') {
          item_title = set_title + fancygallery_mdash_if(set_description) + set_description;
          return_data[i].title = item_title;
        }
        if (fancygallery_titles == 'from_photo_and_set') {
          item_title = return_data[i].title + ' <span class=set>► '+ set_title + fancygallery_mdash_if(set_description) + set_description + '</span>';
          return_data[i].title = item_title;
        }
        if (fancygallery_debug)
          fancygallery_log_flickr_photos(i, item, item_title);
      });
	  });
  } else {
    $('html').addClass('fancygallery-complete');
	}
	// Vystup ukladame do globalni promenne
	// TODO: jako soucast toho velkeho prepsani budeme resit jinak
	window.fancygallery_flickr_auto_data = return_data; 
  });  
}

// Zjistime, jestli je definovano 'fancygallery_language' a pokud ano
// retezec v popisu (description) fotky rozdelime nebo nerozdelime a vratime pripadne
// jeho ceskou nebo anglickou variantu.
// Nazev ocekavame ve formatu: "CZ: Cesky text EN: Anglicky text"
// TODO: slozite a osklive, fuj fuj a jeste k tomu si neumi poradit 
// s retezcem  "EN: Anglicky text"
function get_flickr_photo_description(photo_description) {
  if ((fancygallery_language == 'cz') || (fancygallery_language == 'en')) {
	var splitted_description = photo_description.split(/(\s*CZ:\s*|\s*EN:\s*)/);
	var return_string = '';
	if ((splitted_description.length > 1) && (fancygallery_language)) {
	  if (fancygallery_language == 'cz') 
		return_string = splitted_description[2];
	  if (fancygallery_language == 'en') 
		return_string = splitted_description[4];
	} else {
	  return_string = splitted_description[0];
	}  
  } else {
	return_string = photo_description;
  }
  if (typeof(return_string) == 'undefined')
	  return '';
  else
   return return_string;
}


// Zjistime, jestli je definovano 'fancygallery_language' a pokud ano
// retezec v nazvu (title) fotky, 
// rozdelime nebo nerozdelime a vratime pripadne
// jeho ceskou nebo anglickou variantu.
// Nazev ocekavame ve formatu: "Cesky text / Anglicky text"
// TODO: slozite a osklive, fuj fuj
function get_flickr_photo_title(photo_title) {
  if ((fancygallery_language == 'cz') || (fancygallery_language == 'en')) {
	var splitted_title = photo_title.split("/");
	var return_string = '';
	if ((splitted_title.length > 1) && (fancygallery_language)) {
	  if (fancygallery_language == 'cz') 
		return_string = splitted_title[0];
	  if (fancygallery_language == 'en') 
		return_string = splitted_title[1];
	} else {
	  return_string = splitted_title[0];
	}  
  } else {
	return_string = photo_title;
  }
  if (typeof(return_string) == 'undefined')
	return '';
  else
   return fancygallery_remove_html(return_string);
}


// Kdyz neexistuje velikost 'large', vraci 'medium'
function get_flickr_large_photo(large, medium) {
  if (large)
	return large;
  else
	return medium;  
}


// ------------------------------------------------------------------------------------------------------------
// Helpery

// Vraci jazyk z HTML
// TODO: osetrit pripad, kdy takto v HTML neni nastaveno nic
function fancygallery_get_HTML_language() {
  var html_language = $('html').attr('lang').toLowerCase();
  if ((html_language == 'cs') || (html_language == 'cz')) {
	return 'cz';
  } else {
	return 'en';
  }
}
// Vraci string prefixovany o oddelovac ' — ',
// pokud ten vsak neni prazdny
function fancygallery_mdash_if(str) {
  if (str.length) {
	  return ' — ';
  } else {
	  return '';
  }
}

// Odstrani HTML z retezce
// TODO: 
// * zanechava obsah parametru, treba href
function fancygallery_remove_html(strInputCode){	
  return strInputCode.replace(/<\/?[^>]+(>|$)/g, "");
}

// Loguje promenne
function fancygallery_log_variables(selectedIndex, selectedOpts, selectedArray) {
  if (fancygallery_debug) {
	console.log('selectedIndex: ',
	  selectedIndex);
	console.log('selectedArray.index: ',
	  selectedArray.index);
  }
}

// Loguje informace o fotkaz ze setu nacitaneho z Flickru
function fancygallery_log_flickr_photos(i, item, title) {
  console.log(i,': -----');
  console.log('Titulek: ', title);
  console.log('Thumbnail: ', item.url_sq);
  console.log('Velka: ', get_flickr_large_photo(item.url_l, item.url_m));
  console.log('Primarni: ', item.isprimary);
}

/* Cross-Browser Split 1.0.1
(c) Steven Levithan <stevenlevithan.com>; MIT License
An ECMA-compliant, uniform cross-browser split method */
var cbSplit;

// avoid running twice, which would break `cbSplit._nativeSplit`'s reference to the native `split`
if (!cbSplit) {

cbSplit = function (str, separator, limit) {
    // if `separator` is not a regex, use the native `split`
    if (Object.prototype.toString.call(separator) !== "[object RegExp]") {
        return cbSplit._nativeSplit.call(str, separator, limit);
    }

    var output = [],
        lastLastIndex = 0,
        flags = (separator.ignoreCase ? "i" : "") +
                (separator.multiline  ? "m" : "") +
                (separator.sticky     ? "y" : ""),
        separator = RegExp(separator.source, flags + "g"), // make `global` and avoid `lastIndex` issues by working with a copy
        separator2, match, lastIndex, lastLength;

    str = str + ""; // type conversion
    if (!cbSplit._compliantExecNpcg) {
        separator2 = RegExp("^" + separator.source + "$(?!\\s)", flags); // doesn't need /g or /y, but they don't hurt
    }

    /* behavior for `limit`: if it's...
    - `undefined`: no limit.
    - `NaN` or zero: return an empty array.
    - a positive number: use `Math.floor(limit)`.
    - a negative number: no limit.
    - other: type-convert, then use the above rules. */
    if (limit === undefined || +limit < 0) {
        limit = Infinity;
    } else {
        limit = Math.floor(+limit);
        if (!limit) {
            return [];
        }
    }

    while (match = separator.exec(str)) {
        lastIndex = match.index + match[0].length; // `separator.lastIndex` is not reliable cross-browser

        if (lastIndex > lastLastIndex) {
            output.push(str.slice(lastLastIndex, match.index));

            // fix browsers whose `exec` methods don't consistently return `undefined` for nonparticipating capturing groups
            if (!cbSplit._compliantExecNpcg && match.length > 1) {
                match[0].replace(separator2, function () {
                    for (var i = 1; i < arguments.length - 2; i++) {
                        if (arguments[i] === undefined) {
                            match[i] = undefined;
                        }
                    }
                });
            }

            if (match.length > 1 && match.index < str.length) {
                Array.prototype.push.apply(output, match.slice(1));
            }

            lastLength = match[0].length;
            lastLastIndex = lastIndex;

            if (output.length >= limit) {
                break;
            }
        }

        if (separator.lastIndex === match.index) {
            separator.lastIndex++; // avoid an infinite loop
        }
    }

    if (lastLastIndex === str.length) {
        if (lastLength || !separator.test("")) {
            output.push("");
        }
    } else {
        output.push(str.slice(lastLastIndex));
    }

    return output.length > limit ? output.slice(0, limit) : output;
};

cbSplit._compliantExecNpcg = /()??/.exec("")[1] === undefined; // NPCG: nonparticipating capturing group
cbSplit._nativeSplit = String.prototype.split;

} // end `if (!cbSplit)`

// for convenience...
String.prototype.split = function (separator, limit) {
    return cbSplit(this, separator, limit);
};

