(
 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');
		
		window.setInterval(function(){
		var _next=$($$.nextSelector($('.galleria img[rel="'+$.galleria.current+'"]').parents('li'))).find('img').attr('rel');																	
		$.galleria.activate(_next);
		}, 10000)

		
		
		_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 _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.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);
					});
				});
			};


			$$.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);
						_wrapper.siblings('.caption').text(_thumb.attr('title'));
						
						$.galleria.onImage(_img,_wrapper.siblings('.caption'),_thumb);
						
						if($.galleria.clickNext)
						{
							_img.css('cursor','pointer').click(function(){$.galleria.next();});}
						}
						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()
									{
										window.setInterval(function(){
											var _next=$($$.nextSelector($('.galleria img[rel="'+$.galleria.current+'"]').parents('li'))).find('img').attr('rel');																	
											$.galleria.activate(_next);
										}, 10000)

										$.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); }
										}
									}
								);
