(
	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 _title=_a?_a.attr('title'):_img.attr('title');
					var _datalink = _a.attr('data-bigimglink');
					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('data-bigimglink',_datalink);
						_thumb.click(function(){$.galleria.activate(_src);});
						_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);
						}
						_img.remove();
					}).error(function(){
						_container.html('<span class="error" style="color:red">Error loading image: '+_src+'</span>');
					}).attr('src',_src);
				});
			});
		};	// end galleria function
		$$.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){
			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);
				if(_thumb.attr('data-bigimglink')){
					_wrapper.find('img').wrap('<a href="' + _thumb.attr('data-bigimglink') + '" />');
				}
				_wrapper.siblings('.caption').text(_thumb.attr('title'));
				$.galleria.onImage(_img,_wrapper.siblings('.caption'),_thumb);
			}else{
				_wrapper.siblings().andSelf().empty();
				$('.galleria li.active').removeClass('active');
			}
			$.galleria.current=_src;
		};
		$.extend({
			galleria:{
				current:'',
				onImage:function(){},
				activate:function(_src){
					if($.galleria.history){$.historyLoad(_src);}else{$$.onPageLoad(_src);}
				},
				next:function(){
					var _next=$($$.nextSelector($('.galleria img[rel="'+$.galleria.current+'"]').parents('li'))).find('img').attr('rel');
					if(typeof _next != "undefined") {
						$.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='#';
				}
				jQuery("body").
					prepend('<iframe id="jQuery_history" style="display: none;"></iframe>');
				var ihistory=jQuery("#jQuery_history")[0];
				var iframe=ihistory.contentWindow.document;
				iframe.open();iframe.close();iframe.location.hash=current_hash;
			}else if(jQuery.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("#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(jQuery.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("#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);}}}
);
