(function($) {

  //Global vars
  var currentImageElement;
  var config;

  //define bitgallery object with default settings
  defaults = {
    preloadImages:true,             //Start Preloading all Images when is entered
    backgroundOverlay:false,        //No Background Overly for darkening the site
    boxTotallyCentered:false,       //Center Image totally
    boxInitialWidth:425,            //BoxSize before Image is loaded
    boxInitialHeight:440,           //BoxSize before Image is loaded
    navBarStretchToImageWidth:false
  };
  
  
  $.fn.preloadImages = function(e, i) {
    //preload images in sequence and bind click
    if(i == $(e).length) return;
    elem = "bgPreloader"+ i;
    $("div[id='"+elem+"']").attr("class", "bgPreloaderActive");
    imagePreloaded = new Image();
    imagePreloaded.onload = function() { 
      $("div[id='"+elem+"']").remove();
      //click
      $(e).eq(i).click(function() {        
        currentImageElement = $(this);
        $.fn.bitgallery.show();
        return false;         
      });  
      $.fn.preloadImages($(e), ++i);
    };
    imagePreloaded.src = $(e).eq(i).attr("href");
  } 
  
  $.fn.preload = function(e, i) {
    //when all thumbs are loaded call imagepreloader
    if(i == $(e).length) {
      $.fn.preloadImages(e, 0);
      return;
    }
    //Insert fading div when thumbs are preloaded
    thumbPreloaded = new Image();
    thumbPreloaded.onload = function() { 
      position = $(e).eq(i).children().offset();
      elem = "bgPreloader"+ i;
      $(document.body).prepend('<div id="'+elem+'" class="bgPreloader"></div>');
  	  $("div[id='"+elem+"']").css({
        "height":$(e).eq(i).children().height(), 
        "width":$(e).eq(i).children().width(), 
        "left":position.left,
        "top":position.top,
        "position":"absolute",
        "opacity":0.8,
        "z-index":"9905"
      });
      $.fn.preload($(e), ++i);
    };
    thumbPreloaded.src = $(e).eq(i).children().attr("src");
  }   
  


  //Construct
  $.fn.bitgallery = function(settings) {
			
		//use defaults or properties supplied by user
		config = $.extend({}, defaults, settings);

    //Preload, if wanted
    if(config.preloadImages) $.fn.preload($(this), 0);  
		
    //Insert backgroundLayer if wanted
		if(config.backgroundOverlay && !$("#bgBackgroundOverlay").length) {
		  $(document.body).prepend('<div id="bgBackgroundOverlay"></div>');
		  $("#bgBackgroundOverlay").css({
        "height":0, 
        "width":0, 
        "opacity":0.0,
        "display":"none", 
        "position":"absolute", 
        "z-index":"9900"
      });
      //Set it Fixed, just needed for IE6
      /*if($.browser.msie && $.browser.version.substring(0,1) == '6') {
        $(window).scroll(function() {
            $('#bgBackgroundOverlay').css('top', $(this).scrollTop() + "px");
            $('#bgBackgroundOverlay').css('left', $(this).scrollLeft() + "px");
        }); 
      }*/
		}
		
		//Insert imagebase
		$(document.body).prepend('<div id="bgBoxWrapper" style="z-index: 9910"><div id="bgImageWrapper"><div id="bgNavbar" style="z-index: 9950"><img src="js/img/previous.gif" id="buttonPrev" alt="zurück" /><img src="js/img/next.gif" id="buttonNext" alt="vor" /><img src="js/img/close.gif" id="buttonClose" alt="schließen" /></div><img src="" id="bgCurrentImage" style="z-index: 9930" alt="" /></div></div>');
		$("#bgNavbar").css({
      //"left":0,
      "right":11,
      "opacity":0.0,
      "display":"none", 
      "position":"absolute"
    });
    $("#bgBoxWrapper").css({
      "opacity":0.0,
      "display":"none", 
      "position":"absolute"
    });
    $("#bgCurrentImage, #bgImageWrapper").css({
      "display":"none",
      "opacity":0.0
    });
		    
    //Define Click Event 
    
    $('#buttonNext').bind({
      click: function() {
        if($("#bgCurrentImage").is(":animated")) return;
        $.fn.bitgallery.next();
      }
    });
    
    $('#buttonPrev').bind({
      click: function() {
        if($("#bgCurrentImage").is(":animated")) return;
        $.fn.bitgallery.prev();
      }
    });
    
    $('#buttonClose').bind({
      click: function() {
        if($("#bgCurrentImage").is(":animated")) return;
        $.fn.bitgallery.hide(); 
      }
    });
    
    $('#bgImageWrapper').bind({
      click: function() {
        //$.fn.bitgallery.hide();             
      },
      mouseenter: function() {
        $("#bgNavbar").css("opacity", 1.0);  
      },
      mouseleave: function() {
        $("#bgNavbar").css("opacity", 0.0);  
      }
    });
       
    //Update Positions on Window Resize
    $(window).bind('resize', function() {
      $.fn.bitgallery.setPosition();
    });
    
  };
  
  
  $.fn.bitgallery.setPosition = function() {
    //BackgroundOverlayPosititon
		if(config.backgroundOverlay) {
      $("#bgBackgroundOverlay").css({
        "height":$(window).height(), 
        "width":$(window).width()
      });
    }

    currentImage = new Image();
    currentImage.onload = function() {
      $("#bgCurrentImage").attr("src", $(currentImageElement).attr("href"));
    
      //equals bgCurrentImage.outerSize
      bgImageWrapperWidth = currentImage.width + parseInt($("#bgCurrentImage").css("border-left-width")) + parseInt($("#bgCurrentImage").css("border-right-width")) + parseInt($("#bgCurrentImage").css("padding-left")) + parseInt($("#bgCurrentImage").css("padding-right")) + parseInt($("#bgCurrentImage").css("margin-left")) + parseInt($("#bgCurrentImage").css("margin-right"));
      bgImageWrapperHeight = currentImage.height + parseInt($("#bgCurrentImage").css("border-top-width")) + parseInt($("#bgCurrentImage").css("border-bottom-width")) + parseInt($("#bgCurrentImage").css("padding-top")) + parseInt($("#bgCurrentImage").css("padding-bottom")) + parseInt($("#bgCurrentImage").css("margin-top")) + parseInt($("#bgCurrentImage").css("margin-bottom"));
      
      //equals bgImageWrapper.outerSize
      bgBoxWrapperWidth = bgImageWrapperWidth + parseInt($("#bgImageWrapper").css("border-left-width")) + parseInt($("#bgImageWrapper").css("border-right-width")) + parseInt($("#bgImageWrapper").css("padding-left")) + parseInt($("#bgImageWrapper").css("padding-right")) + parseInt($("#bgImageWrapper").css("margin-left")) + parseInt($("#bgImageWrapper").css("margin-right"));
      bgBoxWrapperHeight = bgImageWrapperHeight + parseInt($("#bgImageWrapper").css("border-top-width")) + parseInt($("#bgImageWrapper").css("border-bottom-width")) + parseInt($("#bgImageWrapper").css("padding-top")) + parseInt($("#bgImageWrapper").css("padding-bottom")) + parseInt($("#bgImageWrapper").css("margin-top")) + parseInt($("#bgImageWrapper").css("margin-bottom"));
      
      //equals bgBoxWrapper.outerSize
      bgBoxWrapperLeft = ($(document).width()/2) - ((bgBoxWrapperWidth + parseInt($("#bgBoxWrapper").css("border-left-width")) + parseInt($("#bgBoxWrapper").css("border-right-width")) + parseInt($("#bgBoxWrapper").css("padding-left")) + parseInt($("#bgBoxWrapper").css("padding-right")) + parseInt($("#bgBoxWrapper").css("margin-left")) + parseInt($("#bgBoxWrapper").css("margin-right")))/2);
      bgBoxWrapperTop = ($(document).height()/2) - ((bgBoxWrapperHeight + parseInt($("#bgBoxWrapper").css("border-top-width")) + parseInt($("#bgBoxWrapper").css("border-bottom-width")) + parseInt($("#bgBoxWrapper").css("padding-top")) + parseInt($("#bgBoxWrapper").css("padding-bottom")) + parseInt($("#bgBoxWrapper").css("margin-top")) + parseInt($("#bgBoxWrapper").css("margin-bottom")))/2);
      
      $("#bgBoxWrapper").css({
        //"left":bgBoxWrapperLeft-177,
        "top":248,
        "width":bgBoxWrapperWidth,
        "height":bgBoxWrapperHeight
      }); 

      $("#bgImageWrapper").css({
        "left":0,
        "top":0,
        "width":bgImageWrapperWidth,
        "height":bgImageWrapperHeight
      }); 
      
      $("#bgCurrentImage").css({
        "left":0,
        "top":0,
        "width":currentImage.width,
        "height":currentImage.height
      });
      
      if(config.navBarStretchToImageWidth) {
        $("#bgNavbar").css({
          "width":currentImage.width
        });
      }
      
    };
    currentImage.src = $(currentImageElement).attr("href");
    
  };
  
  
  $.fn.bitgallery.show = function() {
    $("#bgBackgroundOverlay, #bgImageWrapper, #bgBoxWrapper, #bgCurrentImage, #bgNavbar").css("display", "block");
    
    $.fn.bitgallery.setPosition();
    
    //Check Buttons
    $.fn.bitgallery.checkButtons();

    //Show BackgroundOverlay
    //if(config.backgroundOverlay) {
    
    $("#bgBackgroundOverlay, #bgImageWrapper, #bgBoxWrapper, #bgCurrentImage").animate({
      opacity:1.0
    }, 500, function() {
      // Animation complete.
    }); 
    //} 
  };
  
  
  $.fn.bitgallery.hide = function() {
    //Hide BackgroundOverlay
    //if(config.backgroundOverlay) {        
      $("#bgBackgroundOverlay, #bgImageWrapper, #bgBoxWrapper, #bgcurrentImage").animate({
        opacity: 0.0
      }, 500, function() {
        $("#bgBackgroundOverlay, #bgImageWrapper, #bgBoxWrapper, #bgcurrentImage, #bgnavbar").css("display", "none");
      }); 
    //}   
  };
  
  
  $.fn.bitgallery.checkButtons = function() {
    nextPic = $(currentImageElement).nextAll("[rel='"+$(currentImageElement).attr("rel")+"']").eq(0).attr("href"); 
    prevPic = $(currentImageElement).prevAll("[rel='"+$(currentImageElement).attr("rel")+"']").eq(0).attr("href");
    if(!nextPic) {
      $("#buttonNext").fadeOut('fast');
    }  
    if(currentImageElement) {
      if($("#buttonNext").is(":hidden")) $("#buttonNext").fadeIn('fast');
    } 
    if(!prevPic) {
      $("#buttonPrev").fadeOut('fast');
    } 
    if(prevPic) {
      if($("#buttonPrev").is(":hidden")) $("#buttonPrev").fadeIn('fast');
    }  
  } 
  
  $.fn.bitgallery.next = function() {             
    nextSource = $(currentImageElement).nextAll("[rel='"+$(currentImageElement).attr("rel")+"']").eq(0).attr("href");
    if(!nextSource) return; 
    currentImageElement = (currentImageElement).nextAll("[rel='"+$(currentImageElement).attr("rel")+"']").eq(0);
    $('#bgCurrentImage').fadeOut('fast', function() {          
      $("#bgCurrentImage").attr("src", nextSource);
      $('#bgCurrentImage').fadeIn('fast');
    });    
    $.fn.bitgallery.checkButtons();  
    $.fn.bitgallery.setPosition();  
  };
  
  $.fn.bitgallery.prev = function() {          
    prevSource = $(currentImageElement).prevAll("[rel='"+$(currentImageElement).attr("rel")+"']").eq(0).attr("href");
    if(!prevSource) return;
    currentImageElement = (currentImageElement).prevAll("[rel='"+$(currentImageElement).attr("rel")+"']").eq(0);  
    $('#bgCurrentImage').fadeOut('fast', function() {
      $("#bgCurrentImage").attr("src", prevSource);
      $('#bgCurrentImage').fadeIn('fast');
    });
    $.fn.bitgallery.checkButtons(); 
    $.fn.bitgallery.setPosition(); 
  };



})(jQuery);
