/*
 * Gallery
 * Description: This plugin targets the small photo thumbs to bigger viewer 
 * Author: Lukas Pesl
 * 
 */   

(function($){
	$.fn.extend({ 
		gallery: function(options) {

			var defaults = {
        'info'  : '.info',			 
        'prev'  : '.prev',			 
        'next'  : '.next',			 
        'count' : '.count',
        'counterDelimiter' : ' z ',			 
        'thumbTitle' : '.thumb-title',
        'thumbAuthor' : '.thumb-author',
        'thumbDescription' : '.photoDescription',
        'firstPhotoIndex' : 0,
        'hidableInfo' : false,
        'installDragger' : false,
        'installSlideshow' : false,
        'slideshowLink' : '.slideshow',
        'slideshowSpeed' : 3400,
        'bigGallery' : false
			};

			var options = $.extend(defaults, options);
  		var rootEl = options.rootEl || this.parent().parent().parent().parent().parent();
  		var viewerO = $(options.viewer, rootEl);
  		var viewer = viewerO; 
      //viewer.css('border', '2px solid purple');
  		var viewerLinkO = viewer.parent();
  		var viewerLink = viewerLinkO; 

  		var info = $(options.info, rootEl);				
  		var prev = $(options.prev, rootEl);				
  		var next = $(options.next, rootEl);				
  		//var count = $(options.count, info);
  		var count = $(options.count, rootEl);
  		var thumbTitle = $(options.thumbTitle, info);
  		var thumbAuthor = $(options.thumbAuthor, info);
  		var thumbDescription = $(options.thumbDescription, rootEl);
  		var slideshowLink = $(options.slideshowLink, rootEl);
  		var slideshowTimer = null;
  		
  		var length = this.length;

  		var infoCache = [];
  		var fMiddle = 299;
      
      var thumbsLinks = this;
  		var thumbs = $('.thumbs', rootEl);
  		var actualPhoto = rootEl.data('actualPhoto');

      var scrollTo = function(o) {
        if (thumbs.data('jsp'))
          thumbs.data('jsp').scrollToElement(o, false, true);
      }
      
      var setDraggedDescription = function() {
        var tIndex = (fMiddle <= 299) ? 1 : 0;
        thumbTitle.html(infoCache[tIndex]['title']);
        thumbAuthor.html('Foto: ' + infoCache[tIndex]['foto']);
        thumbDescription.html(infoCache[tIndex]['description']);
      }
      
      var stopSlideshow = function() {
         clearInterval(slideshowTimer);
         slideshowTimer = null;
			   slideshowLink.removeClass('stop');
      }

      var playSlideshow = function() {
         if (actualPhoto == length-1)
            return false;
         var fn = function(){
           next.click();
           if (actualPhoto == length-1)
           {
             stopSlideshow();
           }
         }
         slideshowTimer = setInterval(fn, options.slideshowSpeed);
  		   slideshowLink.addClass('stop');
      }

      var installSlideshow = function() {
        slideshowLink.click(function(){

           if (slideshowTimer)
           {
             stopSlideshow();
           }
           else
           {
             playSlideshow();
           }
          return false;
        });
      }
      
      var installDragger = function(i) {

        length = length / 2;
        var f_middle=299; //325-1
        var f_width=598; //650-2  
        var f_notstarted=true;
        var f_mx_s,f_mx_a;
        var f_move=false;
        

     		$('#f-hlp', rootEl).show();
    		$('.ml-right', rootEl).css('width',(f_width-f_middle + 1));
    		$('.ml-left', rootEl).css('width',f_middle);
    		$('.ml-left .dragspan', rootEl).css('left',(f_middle-29));

        $('.fg-pict', rootEl).mousemove(function(e){
        	if (f_move){
        		f_mx_a=e.pageX;
        		f_middle+=(f_mx_a-f_mx_s);
        		if (f_middle<0) f_middle=0;
        		if (f_middle>f_width) f_middle=f_width;

        		$('.ml-right', rootEl).css('width',(f_width-f_middle + 1));
        		$('.ml-left', rootEl).css('width',f_middle);
        		$('.ml-left .dragspan', rootEl).css('left',(f_middle-29));
        		f_mx_s=f_mx_a;
        	}
        });

        $('.ml-left .dragspan', rootEl).parent()[0].ondragstart = function(){
          return false;
        }
        $('.ml-right .dragspan', rootEl).parent()[0].ondragstart = function(){
          return false;
        }

        $('.ml-left .dragspan', rootEl).click(function(){
          return false;
        });


        $('.ml-left', rootEl).click(function(e){
          if (e.srcElement && e.srcElement.toString && e.srcElement.toString().indexOf('http') != '-1')
          {
           	e.stopImmediatePropagation();
          }
        	return false;
        });

        $('.ml-right .dragspan', rootEl).click(function(){
          return false;
        });


        $('.ml-right', rootEl).click(function(e){
          if (e.srcElement && e.srcElement.toString && e.srcElement.toString().indexOf('http') != '-1')
          {
           	e.stopImmediatePropagation();
          }
        	return false;
        });

        $('.ml-left .dragspan', rootEl).mousedown(function(e){
        	$('.ml-right .dragspan', rootEl).css('background-image','url("/img/0/0O/sipka-vlevo-opacity.png")');
        	$('.ml-left .dragspan', rootEl).css('background-image','url("/img/0/0O/sipka-vpravo.png")');
        	f_move=true; f_mx_s=e.pageX;
        	//e.preventDefault();
          //return false;
        });

        $('.ml-right .dragspan', rootEl).mousedown(function(e){
        	$('.ml-left .dragspan', rootEl).css('background-image','url("/img/0/0O/sipka-vpravo-opacity.png")');
        	$('.ml-right .dragspan', rootEl).css('background-image','url("/img/0/0O/sipka-vlevo.png")');
        	f_move=true; f_mx_s=e.pageX;
        	e.preventDefault();
          return false;
        });
        
        $('.ml-left, .ml-right, .fg-pict', rootEl).mouseup(function(e){

          fMiddle = f_middle;
          setDraggedDescription();

        	f_move=false;
        	$('.ml-left .dragspan', rootEl).css('background-image','url("/img/0/0O/sipka-vpravo-opacity.png")');
        	$('.ml-right .dragspan', rootEl).css('background-image','url("/img/0/0O/sipka-vlevo-opacity.png")');
        	return false;
        });
        
        $('.fg-pict', rootEl).mouseover(function(){
        	if (f_notstarted) {
        		f_notstarted=false;
        		$('#f-hlp', rootEl).fadeOut("slow");
        	}
        });
        
        $('.fg-pict', rootEl).mouseleave(function(e){

          fMiddle = f_middle;
          setDraggedDescription();

          f_move=false;
        	$('.ml-left .dragspan', rootEl).css('background-image','url("/img/0/0O/sipka-vpravo-opacity.png")');
        	$('.ml-right .dragspan', rootEl).css('background-image','url("/img/0/0O/sipka-vlevo-opacity.png")');
          //return false;
        });

        $('.ml-left .dragspan', rootEl).mouseout(function(){
        	if (!f_move) $(this).css('background-image','url("/img/0/0O/sipka-vpravo-opacity.png")');
        });
        $('.ml-right .dragspan', rootEl).mouseout(function(){
        	if (!f_move) $(this).css('background-image','url("/img/0/0O/sipka-vlevo-opacity.png")');
        });
        
        $('.ml-left .dragspan', rootEl).mouseover(function(){
        	$(this).css('background-image','url("/img/0/0O/sipka-vpravo.png")');
        	$('.ml-right .dragspan', rootEl).css('background-image','url("/img/0/0O/sipka-vlevo-opacity.png")');
        });
        $('.ml-right .dragspan', rootEl).mouseover(function(){
        	$(this).css('background-image','url("/img/0/0O/sipka-vlevo.png")');
        	$('.ml-left .dragspan', rootEl).css('background-image','url("/img/0/0O/sipka-vpravo-opacity.png")');
        });
      }

      var setPhoto = function(i, second) {

				if (second)
				{
          var viewer = viewerO.eq(1);
          var viewerLink = viewerLinkO.eq(1);
        } else
        {
          var viewer = viewerO.eq(0);
          var viewerLink = viewerLinkO.eq(0);
        }
        
        noRotation = true;
				 
        if (typeof i == 'object')
        {
          if (options.installDragger && !second)
          {
            i = index = thumbsLinks.filter(':even').index(i);
          } else
          {
            i = index = thumbsLinks.index(i);
          }
        } else
        {
          i = index = parseInt(i);
          if (second) i = (i * 2) -1; 
        }
        
        if (!second)
         actualPhoto = i;

        if (options.installDragger && !second)
        {
          var link = $(thumbsLinks.filter(':even').get(i));
        } else
        {
          var link = $(thumbsLinks.get(i));
        }

        var linkImg = $('img', link);
        scrollTo(link);

        if (typeof options.viewingMethod == 'function')
        {
          if (!second)
            options.viewingMethod(link, index);
          else
            options.viewingMethod(link, index - 1);
        }
        
        var viewerLinkWidth = viewerLink.data('width') ? parseInt(viewerLink.data('width')) : viewerLink.width();
        var viewerLinkHeight = viewerLink.data('height') ? parseInt(viewerLink.data('height')) : viewerLink.height();
        var resizedHeight = viewerLinkWidth / (link.attr('normalWidth') / link.attr('normalHeight'));
        var resizedWidth = viewerLinkHeight * (link.attr('normalWidth') / link.attr('normalHeight'));
				
				var ie6 = 1 || ($.browser.msie == true)/* && ($.browser.version == 6)*/;

				// resizing
        if (!options.bigGallery && link.attr('normalWidth') == link.attr('largeWidth') &&
				    link.attr('normalHeight') == link.attr('largeHeight'))
				{
          var width = link.attr('normalWidth');
          var height = link.attr('normalHeight'); 
				} else
        if (link.attr('normalWidth') > link.attr('normalHeight'))
        {
          if (false && link.attr('normalWidth') / link.attr('normalHeight') <= 1.9)
          {
            var width = '100%';
            var height = '100%'; 
          } else
          {
						if (resizedHeight <= viewerLinkHeight)
            {
							var width = ie6 ? (viewerLinkWidth - 2) + 'px' : '100%'; // var width = '100%';
	            var height = ie6 ? resizedHeight + 'px' : 'auto'; // auto
            } else
            {
		          var width = ie6 ? resizedWidth + 'px' : 'auto'; // auto
		          var height = viewerLinkHeight + 'px'; // 100%
            }
          }
        } else
        {
					if (resizedWidth <= viewerLinkWidth)
          {
	          var width = ie6 ? resizedWidth + 'px' : 'auto'; // auto
	          var height = viewerLinkHeight + 'px'; // 100%
          } else
          {
  					var width = ie6 ? (viewerLinkWidth - 2) + 'px' : '100%'; // var width = '100%';
	          var height = ie6 ? resizedHeight + 'px' : 'auto'; // auto
          }
        }
        // resizing

        if (!second)
        {
          thumbsLinks.animate({'opacity' : 1.0}, 0);
          link.animate({opacity : 0.20}, 0 /* 300 */);
        }

        if (!viewerLink.attr('href')) return false;
        viewerLink.attr('href', link.attr('href')).attr('rel', link.attr('rel').replace('!', ''));
        
        if (options.bigGallery)
        {
          viewerLink.attr('href', '#');
        }

/*
        if (slideshowTimer && i != length-1)
          viewer.fadeOut(900);
*/

        var loadFunc = function(){  
          viewer.css({width: Math.floor(parseInt(width)), height: parseInt(height)}); 

          if (slideshowTimer)
            viewer.fadeIn(300);

          if (options.installDragger)
          {
          	var vlw = parseInt(viewerLinkWidth);
          	var vlh = parseInt(viewerLinkHeight);
            var halfHDiff = (vlw - $(this).width()) / 2;  
            var halfVDiff = (vlh - $(this).height()) / 2;  

            if (!second)
              $('.ml-left img', rootEl).css('margin', (halfVDiff-0) + 'px 0 0 ' + (halfHDiff-0) + 'px');
            else              
              $('.ml-right img', rootEl).css('margin', (halfVDiff-0) + 'px ' + (halfHDiff-0) + 'px 0 0');
          }
        };

        viewer.unbind('load').bind('load', loadFunc).show();

        if (slideshowTimer && i != length-1)
        {
          viewer.fadeOut(300, function(){
    				viewer.attr('src', linkImg.attr('rel'));
          });
        } else
        {
  				viewer.attr('src', linkImg.attr('rel'));
  			}

        //loadFunc();

  	    if ($.browser.msie == true && $.browser.version <= 7)
  				viewer.css('marginTop', '-1px');

        if (!second)
        {
          count.html((index+1) + options.counterDelimiter + length);
          thumbTitle.html(link.attr('title'));
          thumbAuthor.html('Foto: ' + link.attr('author'));
          thumbDescription.html(link.attr('description'));
          infoCache[0] = {title: link.attr('title'), foto: link.attr('author'), description: link.attr('description')};
        } else
        {
          infoCache[1] = {title: link.attr('title'), foto: link.attr('author'), description: link.attr('description')};
          setDraggedDescription();
        }

        if (i == 0) prev.hide(); else prev.show();
        if (i == length-1) next.hide(); else next.show();

        firstClick = false;
        
        if (options.installDragger && !second)
        {
          setPhoto(i+1, true);
        }
      }
      
      if (options.installSlideshow) 
      {
        viewerLink.click(function(){
          stopSlideshow();
        });
        installSlideshow();
      }
      if (options.installDragger) installDragger();
      setPhoto(options.firstPhotoIndex);

      rootEl.data('gallery', {'setPhoto' : setPhoto, 'stopSlideshow' : stopSlideshow, 'playSlideshow' : playSlideshow});
      
      if (options.hidableInfo)
      {
        info.css('marginBottom', '-43px');
        rootEl.hover(function(){
          info.clearQueue().animate({marginBottom : '0px'}, {});
        }, function(){
          info.clearQueue().animate({marginBottom : '-43px'}, {});
        });
      }
      
      next.click(function(){
        if (actualPhoto != length-1)
        setPhoto(++actualPhoto);
        return false; 
      });
      prev.click(function(){
        if (actualPhoto != 0)
        setPhoto(--actualPhoto);
        return false; 
      });

  		return this.each(function() {
				var link = $(this);				
				var obj = $('img', link);

				link.click(function(e) { 
				   setPhoto(link);
           return false;
				});
				
  		});

  	} // MF
	});
})(jQuery);



