jQuery.fn.customLightboxGallery = function(_options){
	// defaults options	
	var _options = jQuery.extend({
		thumbnail:'a.zoom',
		lightboxContentBlock: 'div.popup-portfolio',
		lightboxImage:'img.big',
		next:'a.link-next',
		prev:'a.link-prev',
		title:'p',
		name:'h3.gallery-name',
		load:'img.load',
		galleryName:'name',
		faderOpacity: 0.5,
		faderBackground: '#000000',
		closeLink:'a.close',
		paddingLeft:0,
		paddingRight:0,
		paddingTop:9,
		paddingBottom:58,
		lbMinWidth:400,
		onClick: null
	},_options);

	return this.each(function(i, _this){
		var _this = jQuery(_this);
		// generate code for the lightbox **************************************
		var _lightboxCode = '\
				<div class="popup-portfolio">\
					<div class="img-holder">\
						<img alt="image" class="big" style="display:none;" src=""/>\
						<img alt="image" class="load" src="images/ajax-loader.gif"/>\
					</div>\
					<div class="gallery">\
						<a class="btn-prev" href="#">prev</a> \
						<div class="gallery-holder"> \
						</div> \
					<a class="btn-next" href="#">next</a> \
					</div> \
					<a href="#" class="close">close</a>\
				</div>';
		var _faderCode = '<div class="lightbox-fader"></div>';
		
		if (!jQuery(_options.lightboxContentBlock).length)
			$('body').append(_lightboxCode);
		if (!jQuery('.lightbox-fader').length)
			$('body').append(_faderCode);
		
		// set style lightbox **************************************************	
		var _lightbox = jQuery(_options.lightboxContentBlock);
		var _fader = jQuery('div.lightbox-fader');
		
		_lightbox.css({
			width:_options.lbMinWidth,
			display:'none',
			position:'absolute',
			top:0,
			left:0,
			zIndex:999
		});
		_fader.css({
			opacity:_options.faderOpacity,
			backgroundColor:_options.faderBackground,
			display:'none',
			position:'absolute',
			top:0,
			left:0,
			zIndex:998,
			textIndent: -9999
		}).html('<iframe frameborder="0" width="100%" height="100%">$nbsp</iframe>');
		_fader.find('iframe').css('opacity',0);
		
		var _currentImage = 0;
		var _thumbnails = jQuery(_options.thumbnail, _this);
		var _closeLink = jQuery(_options.closeLink, _lightbox);
		var _mainImage = jQuery(_options.lightboxImage, _lightbox);
		var _load = jQuery(_options.load, _lightbox);
		var _title = jQuery(_options.title, _lightbox);
		var _linkNext = jQuery(_options.next, _lightbox);
		var _linkPrev = jQuery(_options.prev, _lightbox);
		var _imageHolder = _mainImage.parent();
		var _image = {};
		var _top = 0;
		var _left = 0, _first = false;
		
		var _galHolder, _galSlide, _galMover;

		_this.click(function(){
			var _url = this.href;
			$.ajax({
				url:_url,
				success:function(_gallery){
				_lightbox.find('div.gallery-holder').html(_gallery);
					_thumbnails = _lightbox.find('div.gallery-holder a');
					_thumbnails.click(function(){
						_thumbnails.parent().removeClass('active');
						$(this).parent().addClass('active');
						_currentImage = _thumbnails.index(jQuery(this));
						onloadImage(_currentImage);			
						return false;
					});
					var _li = _thumbnails.parent().filter('.active');
					
					_linkNext = _lightbox.find('a.btn-next');
					_linkPrev = _lightbox.find('a.btn-prev');
					_galHolder = _lightbox.find('div.gallery-holder');
					_galMover = $('> ul', _galHolder);
					_galSlide = $('li', _galMover);
					
					_linkNext.click(function(){
						_currentImage += 1;
						if (_currentImage >= _thumbnails.length) _currentImage = 0;
						onloadImage(_currentImage);
						_thumbnails.parent().removeClass('active');
						_thumbnails.eq(_currentImage).parent().addClass('active');
						slideGallery(1);
						return false;
					});
					_linkPrev.click(function(){
						_currentImage -= 1;
						if (_currentImage < 0) _currentImage = _thumbnails.length-1;
						onloadImage(_currentImage);
						_thumbnails.parent().removeClass('active');
						_thumbnails.eq(_currentImage).parent().addClass('active');
						slideGallery(-1);
						return false;
					});
					
					_fader.fadeIn(300, function(){
						_mainImage.hide();
						_title.hide();
						_lightbox.fadeIn(400);
						
						setTimeout(function(){
							if (_li.length) {
								_li.find('a').trigger('click');
							} else {
								_thumbnails.eq(0).trigger('click');
							}	
						},100)
						if (!_first) {
							positionLightbox(_lightbox);
							_first = true;
						}
					});
				}
			});
			return false;
		});
		_closeLink.click(function(){
			_lightbox.fadeOut(400, function(){
				_fader.fadeOut(300);
				_scroll = false;
			});
			return false;
		});
		var _m = 0;
		function slideGallery(_direction){
			var _wH = _galHolder.width();
			var _wS = _galSlide.outerWidth();
			_m += _wS*_direction;
			if (_m < 0) _m = 0;
			if (_m > _wS*_galSlide.length - _wH) _m = _wS*_galSlide.length - _wH;
			
			if (_currentImage == 0) _m = 0;
			if (_currentImage >= _galSlide.length-1) _m = _wS*_galSlide.length - _wH;
			
			_galMover.animate({marginLeft:-_m}, 200);
		}
		function onloadImage(_cur) {
			_mainImage.hide();
			_load.show();
			_title.slideUp(300);
			var _img = new Image();
			_img.onload = function(){
				_image = _img;
				_image.w = this.width;
				_image.h = this.height;
				showImage();
				_img.onload = function(){};
			}
			_img.src = _thumbnails.eq(_cur).attr('href');
		}
		function showImage(){
			var _dinWidth = _image.w + _options.paddingLeft + _options.paddingRight;
			var _dinHeight = _image.h;
			var _titleText = _thumbnails.eq(_currentImage).attr('title');
			if (_dinWidth < _options.lbMinWidth) _dinWidth = _options.lbMinWidth;
			var _pos = setLocation();			
			_imageHolder.animate({height:_dinHeight},{queue:false, duration:400});
			_lightbox.animate({
				width:_dinWidth,
				top:_pos.top,
				left:_pos.left
			},{queue:false, duration:400, complete:function(){
				_load.hide();
				_mainImage.attr('src',_image.src).fadeIn(300);
				if (_titleText != '') {
					_title.html(_titleText).slideDown(300);
				}
			}});
		}
		var _height = 0;
		var _width = 0;
		var _scroll = false;
		function innerWH(){
			if (window.innerHeight) {
				_height = window.innerHeight;
				_width = window.innerWidth;
			} else {
				_height = document.documentElement.clientHeight;
				_width = document.documentElement.clientWidth;
			}
		}
		function setLocation(){
			var _offset = {};
			innerWH();
			if (typeof _image.src == 'string') {
				var _thisHeight = _image.h + _options.paddingTop + _options.paddingBottom;
				var _thisWidth = _image.w + _options.paddingLeft + _options.paddingRight;
				if (_thisWidth < _options.lbMinWidth) _thisWidth = _options.lbMinWidth;
				var _page = $('body > div:eq(0)');
				if (_lightbox.length) {
					if (_height > _thisHeight) {
						if (!window.innerHeight) {
							_lightbox.css({position:'absolute'});
							_offset.top = (document.documentElement.scrollTop + (_height - _thisHeight) / 2)
						} else {
							_lightbox.css({position:'fixed'});
							_offset.top = ((_height - _thisHeight) / 2)
						}
					}
					else {
						var _fh = parseInt(_fader.css('height'));
						if (!_scroll) {
						if (_fh - _thisHeight > parseInt($(document).scrollTop())) {
								_fh = parseInt($(document).scrollTop())
								_scroll = _fh;
							} else {
								_scroll = _fh - _thisHeight;
							}
						}
						_lightbox.css({position:'absolute'});
						_offset.top = _scroll;
					}
					if (_width > _thisWidth) 
						_offset.left  = (_width - _thisWidth) / 2;
					else {
						_lightbox.css({position:'absolute'})
						_offset.left = 0;
					};
				}
				return _offset;
			} else {
				return false;
			}
		}
		function positionLightbox (_lbox) {
			
			var _minWidth = $('body > div:eq(0)').outerWidth();
			var _page = $('body > div:eq(0)');
			innerWH();
			if (_height > _page.innerHeight()) _fader.css('height',_height); else _fader.css('height',_page.innerHeight());
			if (_width < _minWidth) {_fader.css('width',_minWidth);} else {_fader.css('width','100%');}
		
			_lbox.css({
				width: _options.lbMinWidth,
				top:_width/2 - _options.lbMinWidth,
				left:_height/2
			});
			
		}
			
		jQuery(window).resize(function(){
			var _pos = setLocation();
			if (_pos) {
				_lightbox.css({
					top:_pos.top,
					left:_pos.left
				});
			}
		});
			
		$(document).keydown(function (e) {
			if (!e) evt = window.event;
			if (e.keyCode == 27) {
				_lightbox.fadeOut(400, function(){
					_fader.fadeOut(300);
					_scroll = false;
				});
			}
		});
	});
}
$(document).ready(function(){
	$('a.ajax-gallery').customLightboxGallery();
});



	
