(function($){

 	$.fn.extend({ 
 		
 		bxGallery: function(options) {

			var defaults = {
				maxwidth: '',
				maxheight: '',
				thumbwidth: 200,
				thumbcrop: false,
				croppercent: .35,
				thumbplacement: 'bottom',
				thumbcontainer: '',
				opacity: .7,
				load_text: '',
				load_image: 'http://i302.photobucket.com/albums/nn92/wandoledzep/spinner.gif',
				wrapperclass: 'outer2'
			}
				
			var options =  $.extend(defaults, options);
			var o = options;
			var cont = '';
			var caption = '';
			var $outer = '';
			var $orig = this;
			var tall = 0;
			var wide = 0;
			var showing = 0;
			var i = 0;
			var k = $orig.find('img').size();
			
			preload_img();			
						
			function preload_img(){
				$orig.hide();
				if(o.load_text != ''){
					$orig.before('<div id="loading">' + o.load_text + '</div>');
				}else{
					$orig.before('<div id="loading"><img src="' + o.load_image + '" /></div>');
				}
				$orig.parent().find('#loading').css({'textAlign':'center', 'width':o.maxwidth});
				$orig.find('img').each(function(){ 

                var the_source = $(this).attr('src'); 
                //alert('step1');
                var onload = function(){preload_check();}; 
                //alert('step2');
                var img = new Image(); 
                //alert('step3');
                img.src = the_source; 
                //alert('step4');
                
                // IE Fix 
                if($.browser.version.substr(0,1) <= 8){ 
                function testImg(){ 
                if(img.complete != null && img.complete == true){ 
                onload(); 
                return; 
                } 
                setTimeout(testImg, 1000); 
                } 
                setTimeout(testImg, 1000); 
                }else{ 
                img.onload = onload 
                } 

                }); 
		
			}
			
			function preload_check(){
				i++;
				if(i == k){init();}
			}
			
			function init(){
				set_layout();			
				set_main_img();			
				place_thumbcontainer();			
				set_thumbs();			
			}
			
			function set_layout(){
				$orig.parent().find('#loading').hide();
				$orig.show();				
				$orig.wrap('<div class="' + o.wrapperclass + '"></div>');
				$outer = $orig.parent();	
				$orig.find('li').css({'position':'absolute'});
			}
			
			function set_main_img(){
				$orig.find('img').each(function(){
					var $this = $(this);
					var $imgheight = $this.height();
					var $imgwidth = $this.width();
					if($this.attr('title') != ''){
						caption = $this.attr('title');
						$this.parent().append('<div class="caption">' + caption + '</div>');
					}			
					if(o.maxwidth != ''){
						$this.width(o.maxwidth);
						$this.height(($imgheight/$imgwidth)*o.maxwidth);
					}else if(o.maxheight != ''){
						$this.height(o.maxheight);
						$this.width(($imgwidth/$imgheight)*o.maxheight);
					}	
					if($this.height() + $this.parent().find('.caption').height() > tall){
						tall = $this.height() + $this.parent().find('.caption').height();
					}
					if($this.width() > wide){
						wide = $this.width();
					}
					cont += '<li><img src="' + $this.attr('src') + '" /></li>'; 
				});
				$orig.find('li:not(:first)').hide();
				$orig.height(tall);
				$orig.width(wide);
				$outer.find('.caption').width(wide);
			}
									
			function place_thumbcontainer(){
				if(o.thumbplacement == 'top'){		
					$outer.prepend('<ul class="thumbs">' + cont + '</ul>');
					$outer.find('.thumbs').css({'overflow':'auto'});
				}else if(o.thumbplacement == 'left'){
					$outer.prepend('<ul class="thumbs">' + cont + '</ul>');
					$orig.css({'float':'left'});
					$outer.find('.thumbs').css({'float':'left'});
				}else if(o.thumbplacement == 'bottom'){
					$outer.append('<ul class="thumbs">' + cont + '</ul>');
				}else if(o.thumbplacement == 'right'){
					$outer.append('<ul class="thumbs">' + cont + '</ul>');
					$orig.css({'float':'left'});
					$outer.find('.thumbs').css({'float':'left'});				
				}
				$outer.append('<div style="clear:both"></div>');
				if(o.thumbcontainer != ''){
					$outer.find('.thumbs').width(o.thumbcontainer);
				}		
			}
			
			function set_thumbs(){						
	    		return $outer.find('.thumbs li').each(function() {				
				
					var $this = $(this);
					var $img = $this.find('img');
					var $imgwidth = $img.width();
					var $imgheight = $img.height();
					$this.css({'opacity':o.opacity});	
				
					if(o.thumbcrop){
						$img.width($imgwidth * o.croppercent);
						$img.height(($imgheight/$imgwidth)*$img.width());				
						$this.css({
							'float':'left',
							'width':o.thumbwidth,
							'height':o.thumbwidth,
							'overflow':'hidden',
							'cursor':'pointer'
						});
					}else{
						$img.width(o.thumbwidth);
						$img.height(($imgheight/$imgwidth)*o.thumbwidth);				
						$this.css({
							'float':'left',
							'cursor':'pointer'
						});
						$this.height($img.height());
					}
					
					
				
					$this.click(function(){
						var x = $outer.find('.thumbs li').index($this);
						if(showing != x){
							$orig.find('li').fadeOut();
							$orig.find('li').eq(x).fadeIn();
							showing = x;
						}
					});
				
					$this.hover(function(){
						$this.fadeTo(200, 1);
					}, function(){
						$this.fadeTo(200, o.opacity);
					});
			
	    		});	
			}
						
    	}
	});
	
})(jQuery);


