(function($){
  var $$;
  $$=$.fn.galleria=function($options){
    if(!$$.hasCSS()){
      return false;
    }
    $.historyInit($$.onPageLoad);
    var $defaults={
    insert:'.galleria_container',history:true,clickNext:true,onImage:function(image,caption,thumb){
      },onThumb:function(thumb){
      }};
    var $opts=$.extend($defaults,$options);
    for(var i in $opts){
      if(i){
	$.galleria[i]=$opts[i];
      }}var _insert=($($opts.insert).is($opts.insert))?$($opts.insert):jQuery(document.createElement('div')).insertBefore(this);
    var _div=$(document.createElement('div')).addClass('galleria_wrapper');
    var _span=$(document.createElement('span')).addClass('caption');
    _insert.addClass('galleria_container').append(_div).append(_span);
    return this.each(function(){
	$(this).addClass('galleria');
	$(this).children('li').each(function(i){
	    var _container=$(this);
	    var _o=$.meta?$.extend({
	      },$opts,_container.data()):$opts;
	    _o.clickNext=$(this).is(':only-child')?false:_o.clickNext;
	    var _a=$(this).find('a').is('a')?$(this).find('a'):false;
	    var _img=$(this).children('img').css('display','none');
	    var _src=_a?_a.attr('href'):_img.attr('src');
	    var _fulllink=_a.attr('fulllink');
	    var _width = parseFloat(_a.attr('width')) + 100;
	  var _height = parseFloat(_a.attr('height')) + 100;
	    var _title=_a?_a.attr('title'):_img.attr('title');
	    var _description=_a?_a.attr('description'):_img.attr('description');
	    _img.attr('fulllink', _fulllink);
	    var _loader=new Image();
	    if(_o.history&&(window.location.hash&&window.location.hash.replace(/\#/,'')==_src)){
	      _container.siblings('.active').removeClass('active');
	      _container.addClass('active');
	    }
	    $(_loader).load(function(){
		$(this).attr('alt',_img.attr('alt'));
		var _thumb=_a?_a.find('img').addClass('thumb noscale').css('display','none'):_img.clone(true).addClass('thumb').css('display','none');
		if(_a){
		  _a.replaceWith(_thumb);
		}if(!_thumb.hasClass('noscale')){
		  var w=Math.ceil(_img.width()/_img.height()*_container.height());
		  
		  var h=Math.ceil(_img.height()/_img.width()*_container.width());
		  if(w<h){
		    _thumb.css({
		      height:'auto',width:_container.width(),marginTop:-(h-_container.height())/2});
		  }else{
		    _thumb.css({
		      width:'auto',height:_container.height(),marginLeft:-(w-_container.width())/2});
		  }}else{
		  window.setTimeout(function(){
		      _thumb.css({
			marginLeft:-(_thumb.width()-_container.width())/2,marginTop:-(_thumb.height()-_container.height())/2});
		    },1);
		}_thumb.attr('rel',_src);
		_thumb.attr('title',_title);
		_thumb.attr('description',_description);
		_thumb.click(function(){
		    $.galleria.activate(_src, _fulllink, _width, _height);
		  });
		_thumb.hover(function(){
		    $(this).addClass('hover');
		  },function(){
		    $(this).removeClass('hover');
		  });
		_container.hover(function(){
		    _container.addClass('hover');
		  },function(){
		    _container.removeClass('hover');
		  });
		_container.prepend(_thumb);
		_thumb.css('display','block');
		_o.onThumb(jQuery(_thumb));
		if(_container.hasClass('active')){
		  $.galleria.activate(_src, _fullink, _width, _height);
		}_img.remove();
	      }).error(function(){
		  _container.html('<span class="error" style="color:red">Error loading image: '+_src+'</span>');
		}).attr('src',_src);
	  });
      });
  };
  $$.nextSelector=function(selector){
    return $(selector).is(':last-child')?$(selector).siblings(':first-child'):$(selector).next();
  };
  $$.previousSelector=function(selector){
    return $(selector).is(':first-child')?$(selector).siblings(':last-child'):$(selector).prev();
  };
  $$.hasCSS=function(){
    $('body').append($(document.createElement('div')).attr('id','css_test').css({
	width:'1px',height:'1px',display:'none'}));
    var _v=($('#css_test').width()!=1)?false:true;
    $('#css_test').remove();
    return _v;
  };
  $$.onPageLoad=function(_src, _fulllink, _width, _height){
    var _wrapper=$('.galleria_wrapper');
    var _thumb=$('.galleria img[@rel="'+_src+'"]');
    if(_src){
      if($.galleria.history){
	window.location=window.location.href.replace(/\#.*/,'')+'#'+_src;
      }_thumb.parents('li').siblings('.active').removeClass('active');
      _thumb.parents('li').addClass('active');
      var _img=$(new Image()).attr('src',_src).addClass('replaced');
      _wrapper.empty().append(_img);
      _wrapper.siblings('.caption').text(_thumb.attr('title'));
      jQuery('#main_description').text(_thumb.attr('description'));
      $.galleria.onImage(_img,_wrapper.siblings('.caption'),_thumb);
      if($.galleria.clickNext){
	_img.css('cursor','pointer').click(function(){
	    leftVal = (screen.width - _width ) / 2;
	    topVal = (screen.height - _height) / 2;
	    
	    var attributes = 'menubar=no,status=no,directories=no,location=no,toolbar=no,scrollbars=yes,width='+_width+',height='+_height+',left='+leftVal+',top='+topVal;
	    var link = _fulllink;
	    var newwin = window.open(link, _thumb.attr('title'), attributes);
	  });
      }}else{
      _wrapper.siblings().andSelf().empty();
      $('.galleria li.active').removeClass('active');
    }
    $.galleria.current=_src;
  };
  $.extend({
    galleria:{
      current:'',onImage:function(){
	},activate:function(_src, _fulllink, _width, _height ){
	  if($.galleria.history){
	    $.historyLoad(_src);
	  }else{
	    $$.onPageLoad(_src, _fulllink, _width, _height);
	  }},next:function(){
	  var _next=$($$.nextSelector($('.galleria img[@rel="'+$.galleria.current+'"]').parents('li'))).find('img').attr('rel');
	  $.galleria.activate(_next);
	},prev:function(){
	  var _prev=$($$.previousSelector($('.galleria img[@rel="'+$.galleria.current+'"]').parents('li'))).find('img').attr('rel');
	  $.galleria.activate(_prev);
	}}});
 })(jQuery);
jQuery.extend({
  historyCurrentHash:undefined,historyCallback:undefined,historyInit:function(callback){
      jQuery.historyCallback=callback;
      var current_hash=location.hash;
      jQuery.historyCurrentHash=current_hash;
      if(jQuery.browser.msie){
	if(jQuery.historyCurrentHash===''){
	  jQuery.historyCurrentHash='#';
	}
	$("body").prepend('<iframe id="jQuery_history" style="display: none;"></iframe>');
	var ihistory=$("#jQuery_history")[0];
	var iframe=ihistory.contentWindow.document;
	iframe.open();
	iframe.close();
	iframe.location.hash=current_hash;
      }else if($.browser.safari){
	jQuery.historyBackStack=[];
	jQuery.historyBackStack.length=history.length;
	jQuery.historyForwardStack=[];
	jQuery.isFirst=true;
      }jQuery.historyCallback(current_hash.replace(/^#/,''));
      setInterval(jQuery.historyCheck,100);
    },historyAddHistory:function(hash){
      jQuery.historyBackStack.push(hash);
      jQuery.historyForwardStack.length=0;
      this.isFirst=true;
    },historyCheck:function(){
      if(jQuery.browser.msie){
	var ihistory=$("#jQuery_history")[0];
	var iframe=ihistory.contentDocument||ihistory.contentWindow.document;
	var current_hash=iframe.location.hash;
	if(current_hash!=jQuery.historyCurrentHash){
	  location.hash=current_hash;
	  jQuery.historyCurrentHash=current_hash;
	  jQuery.historyCallback(current_hash.replace(/^#/,''));
	}}else if($.browser.safari){
	if(!jQuery.dontCheck){
	  var historyDelta=history.length-jQuery.historyBackStack.length;
	  if(historyDelta){
	    jQuery.isFirst=false;
	    var i;
	    if(historyDelta<0){
	      for(i=0;i<Math.abs(historyDelta);
		  i++){
		jQuery.historyForwardStack.unshift(jQuery.historyBackStack.pop());
	      }}else{
	      for(i=0;
		  i<historyDelta;
		  i++){
		jQuery.historyBackStack.push(jQuery.historyForwardStack.shift());
	      }}var cachedHash=jQuery.historyBackStack[jQuery.historyBackStack.length-1];
	    if(cachedHash!==undefined){
	      jQuery.historyCurrentHash=location.hash;jQuery.historyCallback(cachedHash);}}else if(jQuery.historyBackStack[jQuery.historyBackStack.length-1]===undefined&&!jQuery.isFirst){
	    if(document.URL.indexOf('#')>=0){
	      jQuery.historyCallback(document.URL.split('#')[1]);}else{
	      current_hash=location.hash;jQuery.historyCallback('');}jQuery.isFirst=true;}}}else{
	current_hash=location.hash;if(current_hash!=jQuery.historyCurrentHash){
	  jQuery.historyCurrentHash=current_hash;jQuery.historyCallback(current_hash.replace(/^#/,''));}}},historyLoad:function(hash){
      var newhash;if(jQuery.browser.safari){
	newhash=hash;}else{
	newhash='#'+hash;location.hash=newhash;}jQuery.historyCurrentHash=newhash;if(jQuery.browser.msie){
	var ihistory=$("#jQuery_history")[0];var iframe=ihistory.contentWindow.document;iframe.open();iframe.close();iframe.location.hash=newhash;jQuery.historyCallback(hash);}else if(jQuery.browser.safari){
	jQuery.dontCheck=true;this.historyAddHistory(hash);var fn=function(){
	  jQuery.dontCheck=false;};window.setTimeout(fn,200);jQuery.historyCallback(hash);location.hash=newhash;}else{
	jQuery.historyCallback(hash);}}});

