/*
 * Скрипт jquery.lightbox.js
 * Разработка производилась на основе плагина lightbox
 * для компании I-Partner и системы iDiver
 * Продукт является коммерческим, его распространение без согласования
 * с руководством компанией I-Partner является нарушением интеллектуальной
 * собственности компании I-Partner.
 * Автор: rav, 2008
 */
/*---------------------------------------------------------*/
// Start of our jQuery Plugin
(function($)
{	// Debug

	/*---------------------------------------------------------*/

	if ( !$.browser.safari && typeof window.console !== 'undefined' && typeof window.console.log === 'function' )
	{	// Use window.console
		$.log = window.console.log;
	}
	else
	{	// Don't use anything
		$.log = function ( ) { };
	}

	/*---------------------------------------------------------*/

	// Pre-Req
	$.params_to_json = $.params_to_json || function ( params )
	{	// Turns a params string or url into an array of params
		// Adjust
		params = String(params);
		// Remove url if need be
		params = params.substring(params.indexOf('?')+1);
		// params = params.substring(params.indexOf('#')+1);
		// Change + to %20, the %20 is fixed up later with the decode
		params = params.replace(/\+/g, '%20');
		// Do we have JSON string
		if ( params.substring(0,1) === '{' && params.substring(params.length-1) === '}' )
		{	// We have a JSON string
			return eval(decodeURIComponent(params));
		}
		// We have a params string
		params = params.split(/\&|\&amp\;/);
		var json = {};
		// We have params
		for ( var i = 0, n = params.length; i < n; ++i )
		{
			// Adjust
			var param = params[i] || null;
			if ( param === null ) { continue; }
			param = param.split('=');
			if ( param === null ) { continue; }
			// ^ We now have "var=blah" into ["var","blah"]

			// Get
			var key = param[0] || null;
			if ( key === null ) { continue; }
			if ( typeof param[1] === 'undefined' ) { continue; }
			var value = param[1];
			// ^ We now have the parts

			// Fix
			key = decodeURIComponent(key);
			value = decodeURIComponent(value);
			try {
			    // value can be converted
			    value = eval(value);
			} catch ( e ) {
			    // value is a normal string
			}

			// Set
			// console.log({'key':key,'value':value}, split);
			var keys = key.split('.');
			if ( keys.length === 1 )
			{	// Simple
				json[key] = value;
			}
			else
			{	// Advanced
				var path = '';
				for ( ii in keys )
				{	//
					key = keys[ii];
					path += '.'+key;
					eval('json'+path+' = json'+path+' || {}');
				}
				eval('json'+path+' = value');
			}
			// ^ We now have the parts added to your JSON object
		}
		return json;
	};

	/*---------------------------------------------------------*/

	// Declare our class
	$.LightboxClass = function ( )
	{	// This is the handler for our constructor
		this.construct();
	};

	/*---------------------------------------------------------*/

	// Extend jQuery elements for Lightbox
	$.fn.lightbox = function ( options )
	{	// Init a el for Lightbox
		// Eg. $('#gallery a').lightbox();

		// If need be: Instantiate $.LightboxClass to $.Lightbox
		$.Lightbox = $.Lightbox || new $.LightboxClass();

		// Handle IE6 appropriatly
		if ( $.Lightbox.ie6 && !$.Lightbox.ie6_support )
		{	// We are IE6 and we want to ignore
			return this; // chain
		}

		// Establish options
		options = $.extend({start:false,events:true} /* default options */, options);

		// Get group
		var group = $(this);

		// Events?
		if ( options.events )
		{	// Add events
			$(group).unbind().click(function(){
				// Get obj
				var obj = $(this);
				// Get rel
				// var rel = $(obj).attr('rel');
				// Init group
				if ( !$.Lightbox.init($(obj)[0], group) )
				{	return false;	}
				// Display lightbox
				if ( !$.Lightbox.start() )
				{	return false;	}
				// Cancel href
				return false;
			});
			// Add style
			$(group).addClass('lightbox-enabled');
		}

		// Start?
		if ( options.start )
		{	// Start
			// Get obj
			var obj = $(this);
			// Get rel
			// var rel = $(obj).attr('rel');
			// Init group
			if ( !$.Lightbox.init($(obj)[0], group) )	{	return this;	}
			// Display lightbox
			if ( !$.Lightbox.start() )	{	return this;	}
		}
		// And chain
		return this;
	};

/*---------------------------------------------------------*/

	// Define our class
	$.extend($.LightboxClass.prototype,
	{	// Our LightboxClass definition

		// -----------------
		// Everyting to do with images

		images: {

			// -----------------
			// Variables

			// Our array of images
			list:[], /* [ {
				src: 'url to image',
				link: 'a link to a page',
				title: 'title of the image',
				name: 'name of the image',
				description: 'description of the image'
			} ], */

			// The current active image
			image: false,

			// -----------------
			// Functions

			prev: function ( image )
			{	// Get previous image

				// Get previous from current?
				if ( typeof image === 'undefined' )
				{	image = this.active();
					if ( !image ) { return image; }
				}

				// Is there a previous?
				if ( this.first(image) )
				{	return false;	}

				//alert('prev');
				// Get the previous
				return this.get(image.index-1);
			},

			next: function ( image )
			{	// Get next image

				// Get next from current?
				if ( typeof image === 'undefined' )
				{	image = this.active();
					if ( !image ) { return image; }
				}

				// Is there a next?
				if ( this.last(image) )
				{	return false;	}
				//alert('next');
				// Get the next
				return this.get(image.index+1);
			},

			first: function ( image )
			{	//
				// Get the first image?
				if ( typeof image === 'undefined' )
				{	return this.get(0);	}

				// Are we the first?
				return image.index === 0;
			},

			last: function ( image )
			{	//
				// Get the last image?
				if ( typeof image === 'undefined' )
				{	return this.get(this.size()-1);	}

				// Are we the last?
				return image.index === this.size()-1;
			},

			single: function ( )
			{	// Are we only one
				return this.size() === 1;
			},

			size: function ( )
			{	// How many images do we have
				return this.list.length;
			},

			empty: function ( )
			{	// Are we empty
				return this.size() === 0;
			},

			clear: function ( )
			{	// Clear image arrray
				this.list = [];
				this.image = false;
			},

			active: function ( image )
			{	// Set or get the active image
				// Use false to reset

				// Get the active image?
				if ( typeof image === 'undefined' )
				{	return this.image;	}

				// Set the ative image
				if ( image !== false )
				{	// Make sure image exists
					image = this.get(image);
					if ( !image )
					{	// Error
						return image;
					}
				}

				// Set the active image
				this.image = image;
				return true;
			},

			add: function ( obj )
			{
				// Do we need to recurse?
				if ( obj[0] )
				{	// We have a lot of images
					for ( var i = 0; i < obj.length; i++ )
					{	this.add(obj[i]);	}
					return true;
				}

				// Default image

				// Try and create a image
				var image = this.create(obj);
				if ( !image ) { return image; }

				// Set image index
				image.index = this.size();

				// Push image
				this.list.push(image);

				// Success
				return true;
			},

			create: function ( obj )
			{	// Create image

				// Define
				var image = { // default
					src:	'',
					title:	'',
					description:'',
					name:	'',
					index:	-1,
					color:	null,
					width:	null,
					height:	null,
					image:	true
				};

				// Create
				if ( obj.image )
				{	// Already a image, so copy over values

					image.src = obj.src || image.src;
					image.title = obj.title || image.title;
					image.description = obj.description || image.description;
					image.name = obj.name || image.name;
					image.color = obj.color || image.color;
					image.width = obj.width || image.width;
					image.height = obj.height || image.height;
					image.index = obj.index || image.index;
				}
				else if ( obj.tagName )
				{	// We are an element
					obj = $(obj);
					if ( obj.attr('src') || obj.attr('href') )
					{
						image.src = obj.attr('src') || obj.attr('href');
						image.title = obj.attr('title') || obj.attr('alt') || image.title;
						image.name = obj.attr('name') || '';
						image.color = obj.css('backgroundColor');
						// Extract description from title
						var s = image.title.indexOf(': ');
						if ( s > 0 )
						{	// Description exists
							image.description = image.title.substring(s+2) || image.description;
							image.title = image.title.substring(0,s) || image.title;
						}
					}
					else
					{	// Unsupported element
						image = false;
					}
				}
				else
				{	// Unknown
					image = false;
				}

				if ( !image )
				{	// Error
					$.log('ERROR', 'We dont know what we have:', obj);
					return false;
				}

				// Success
				return image;
			},

			get: function ( image )
			{	// Get the active, or specified image

				// Establish image
				if ( typeof image === 'undefined' || image === null )
				{	// Get the active image
					return this.active();
				}
				else
				if ( typeof image === 'number' )
				{	// We have a index

					// Get image
					image = this.list[image] || false;
				}
				else
				{	// Create
					image = this.create(image);
					if ( !image ) { return false; }

					// Find
					var f = false;
					for ( var i = 0; i < this.size(); i++ )
					{
						var c = this.list[i];
						if ( c.src === image.src && c.title === image.title && c.description === image.description )
						{	f = c;	}
					}

					// Found?
					image = f;
				}

				// Determine image
				if ( !image )
				{	// Image doesn't exist
					$.log('ERROR', 'The desired image doesn\'t exist: ', image, this.list);
					return false;
				}

				// Return image
				return image;
			},

			debug: function ( )
			{
				return $.Lightbox.debug(arguments);
			}

		},

		// -----------------
		// Options
		constructed:		false,
		src:				null,
		baseurl:			null,

		files: {
			// If you are doing a repack with packer (http://dean.edwards.name/packer/) then append ".packed" onto the js and css files before you pack it.
			js: {
				lightbox:	'jquery.lightbox.js'
			},
			css: {
				lightbox:	'../css/jquery.lightbox.css'
			},
			images: {
				prev:		'../img/gallery/prev.gif',
				next:		'../img/gallery/next.gif',
				blank:		'../img/gallery/blank.gif',
				loading:	'../img/gallery/loading.gif'
			}
		},

		text: {
			image:		'Картинка',
			of:			'из',
			close:		'Закрыть',
			closeInfo:	'',
			description: 'Описание картинки не задано',
			download:	'',
			help: {
				close:		'',
				interact:	''
			},
			about: {
				text: 	'',
				title:	'',
				link:	''
			}
		},

		keys: {
			close:	'c',
			prev:	'p',
			next:	'n'
		},

		handlers: {
			// For custom actions
			show:	null
		},

		opacity:		0.6,
		padding:		'0px 0px 0px 0px',
		speed:			400,
		rel:			'lightbox',
		auto_relify:	true,
		auto_scroll:	'disable',
		auto_resize:	true,
		max_width: '800px',
		max_height: '600px',
		ie6:			null,
		ie6_support:	true,		// have ie6 support
		ie6_upgrade:	true,		// show ie6 upgrade message
		colorBlend:		null,		// null - auto-detect, true - force, false - no
		download_link:	false,		// Display the download link
		show_linkback:		true,	// true, false
		show_info:			false,	// auto - automaticly handle, true - force
		show_extended_info:	false,	// auto - automaticly handle, true - force
		options:	['auto_scroll', 'auto_resize', 'download_link', 'show_info', 'show_extended_info', 'ie6_support', 'ie6_upgrade', 'colorBlend', 'baseurl', 'files', 'text', 'show_linkback', 'keys', 'opacity', 'padding', 'speed', 'rel', 'auto_relify'],

		// -----------------
		// Functions

		construct: function ( options )
		{
			var initial = typeof this.constructed === 'undefined' || this.constructed === false;
			this.constructed = true;
			var domReady = initial;
			options = $.extend({}, options);

			// Add baseurl
			if ( initial && (typeof options.files === 'undefined') )
			{	// Load the files like default
				// Get the src of the first script tag that includes our js file (with or without an appendix)
				this.src = $('script[src*='+this.files.js.lightbox+']:first').attr('src');
				// Make sure we found ourselves
				if ( !this.src )
				{	// We didn't
					// $.log('WARNING', 'Lightbox was not able to find it\'s javascript script tag necessary for auto-inclusion.');
					// We don't work with files anymore, so don't care for domReady
					domReady = false;
				}
				else
				{	// We found ourself
					// The baseurl is the src up until the start of our js file
					this.baseurl = this.src.substring(0, this.src.indexOf(this.files.js.lightbox));
					// Apply baseurl to files
					var me = this;
					$.each(this.files, function(group, val){
						$.each(this, function(file, val){
							me.files[group][file] = me.baseurl+val;
						});
					});
					delete me;
					// Now as we have source, we may have more params
					options = $.extend(options, $.params_to_json(this.src));
				}
			}
			else
			if ( typeof options.files === 'object' )
			{	// We have custom files
				var me = this;
				$.each(options.files, function(group, val){
					$.each(this, function(file, val){
						this[file] = me.baseurl+val;
					});
				});

				delete me;
			}
			else {domReady = false;}
			if ( initial && navigator.userAgent.indexOf('MSIE 6') >= 0 ) {
				this.ie6 = true;
			} else { this.ie6 = false;}

			if ( domReady || typeof options.download_link !== 'undefined' ||  typeof options.colorBlend !== 'undefined' || typeof options.files === 'object' || typeof options.text === 'object' || typeof options.show_linkback !== 'undefined' || typeof options.scroll_with !== 'undefined' )
			{$(function() {$.Lightbox.domReady();});}

			return true;
		},

		domReady: function ( )
		{
			var bodyEl = document.getElementsByTagName($.browser.safari ? 'head' : 'body')[0];
			var stylesheets = this.files.css;

			for ( stylesheet in stylesheets )
			{
				var linkEl = document.createElement('link');
				linkEl.type = 'text/css';
				linkEl.rel = 'stylesheet';
				linkEl.media = 'screen';
				linkEl.href = stylesheets[stylesheet];
				linkEl.id = 'lightbox-stylesheet-'+stylesheet.replace(/[^a-zA-Z0-9]/g, '');
				$('#'+linkEl.id).remove();
				bodyEl.appendChild(linkEl);
			}
			delete stylesheets;
			delete bodyEl;

			$('#lightbox,#lightbox-overlay').remove();
			$('body').append('<div id="lightbox-overlay"></div><div id="lightbox"><div id="lightbox-imageBox"><div id="lightbox-imageContainer"><img id="lightbox-image" /><div id="lightbox-nav"><a href="#" id="lightbox-nav-btnPrev"></a><a href="#" id="lightbox-nav-btnNext"></a></div><div id="lightbox-loading"></div></div></div><div id="lightbox-infoBox"><div id="lightbox-title">'+this.text.description+'</div><div id="lightbox-infoFooter"><span id="lightbox-currentNumber"></span><span id="lightbox-close"><a href="#" id="lightbox-close-button" title="'+this.text.closeInfo+'">' + this.text.close + '</a></span></div><div id="lightbox-infoContainer-clear"></div></div></div>');

			this.resizeBoxes();
			this.repositionBoxes();
			$('#lightbox,#lightbox-overlay').hide();

			if ( this.ie6 && this.ie6_support )
			{
				$('#lightbox-overlay').css({
					position:	'absolute',
					top:		'0px',
					left:		'0px'
				});
			}

			// Cycle and preload
			$.each(this.files.images, function()
			{	// Proload the image
				var preloader = new Image();
				preloader.onload = function() {
					preloader.onload = null;
					preloader = null;
				};	preloader.src = this;
			});
  			// Apply events
			// If the window resizes, act appropriatly
			$(window).unbind().resize(function ()
			{	// The window has been resized
				$.Lightbox.resizeBoxes('resized');
			});

			// If the window scrolls, act appropriatly
			if ( this.scroll === 'follow' )
			{	// We want to
				$(window).scroll(function ()
				{	// The window has scrolled
					$.Lightbox.repositionBoxes();
				});
			}

			$('#lightbox-nav-btnPrev').css({ 'background' : 'url(' + $.Lightbox.files.images.prev + ') left 45% no-repeat' });
			$('#lightbox-nav-btnPrev').click(
				function() {
					$.Lightbox.showImage($.Lightbox.images.prev());
					return false;
				}
			);

			$('#lightbox-nav-btnNext').css({ 'background' : 'url(' + $.Lightbox.files.images.next + ') right 45% no-repeat' });
			$('#lightbox-nav-btnNext').click(
				function() {
					$.Lightbox.showImage($.Lightbox.images.next());
					return false;
				}
			);
			// Help
			if ( this.show_linkback )
			{	// Linkback exists so add handler
				$('#lightbox-overlay-text-about a').click(function(){window.open($.Lightbox.text.about.link); return false;});
			}
			$('#lightbox-overlay-text-close').unbind().hover(
				function(){
					$('#lightbox-overlay-text-interact').fadeIn();
				},
				function(){
					$('#lightbox-overlay-text-interact').fadeOut();
				}
			);

			// Image link
			$('#lightbox-caption-title').click(function(){window.open($(this).attr('href')); return false;});

			// Assign close clicks
			$('#lightbox-overlay, #lightbox, #lightbox-loading-link, #lightbox-btnClose').unbind().click(function() {
				$.Lightbox.finish();
				return false;
			});

			// Finish Up
			// Relify
			if ( this.auto_relify ) {
				// We want to relify, no the user
				this.relify();
			}
			// All good
			return true;
		},

		relify: function ( ) {
			// Create event
			var groups = {};
			var groups_n = 0;
			var orig_rel = this.rel;

			// Create the groups
			$.each($('[@rel*='+orig_rel+']'), function(index, obj){
				// Get the group
				var rel = $(obj).attr('rel');

				// Are we really a group
				if ( rel === orig_rel )	{
					// We aren't
					rel = groups_n; // we are individual
				}

				// Does the group exist
				if ( typeof groups[rel] === 'undefined' ) {
					// Make the group
					groups[rel] = [];
					groups_n++;
				}

				// Append the image
				groups[rel].push(obj);
			});

			// Lightbox groups
			$.each(groups, function(index, group){
				$(group).lightbox();
			});
			// Done
			return true;
		},

		init: function ( image, images ) {
			// Init a batch of lightboxes
			// Establish images
			if ( typeof images === 'undefined' ) {
				images = image;
				image = 0;
			}

			// Clear
			this.images.clear();

			// Add images
			if ( !this.images.add(images) )	{
				return false;
			}

			// Do we need to bother
			if ( this.images.empty() )
			{	// No images
				$.log('WARNING', 'Lightbox started, but no images: ', image, images);
				return false;
			}

			// Set active
			if ( !this.images.active(image) ) {
				return false;
			}
			// Done
			return true;
		},



		start: function ( ) {
			// Display the lightbox
			// We are alive
			this.visible = true;

			// Adjust scrolling
			if ( this.scroll === 'disable' ) {
				$(document.body).css('overflow', 'hidden');
			}

			// Fix attention seekers
			$('embed, object, select').css('visibility', 'hidden');

			// Resize the boxes appropriatly
			this.resizeBoxes('general');

			// Reposition the Boxes
			this.repositionBoxes({'speed':0});
			$('#lightbox-image,#lightbox-nav,#lightbox-nav-btnPrev,#lightbox-nav-btnNext').hide();

			// Display the boxes
			$('#lightbox-overlay').css('opacity',this.opacity).fadeIn(400, function(){
				// Show the lightbox
				$('#lightbox').fadeIn(300);

				// Display first image
				if ( !$.Lightbox.showImage($.Lightbox.images.active()) ) {
					$.Lightbox.finish();
					return false;
				}
			});
			// All done
			return true;

		},

		finish: function ( )
		{
			// Get rid of lightbox
			// Hide lightbox
			$('#lightbox').hide();
			$('#lightbox-overlay').fadeOut(function() { $('#lightbox-overlay').hide(); });

			// Fix attention seekers
			$('embed, object, select').css({ 'visibility' : 'visible' });

			// Kill active image
			this.images.active(false);
			// Adjust scrolling
			if ( this.scroll === 'disable' ) {
				$(document.body).css('overflow', 'visible');
			}
			// We are dead
			this.visible = false;
		},

		resizeBoxes: function ( type ) {
			var xScroll, yScroll, pageHeight, pageWidth, SX, SY;
				Body = document.getElementsByTagName("BODY")[0];
			if (window.innerHeight && window.scrollMaxY) {

				xScroll = window.innerWidth + window.scrollMaxX;
				yScroll = window.innerHeight + window.scrollMaxY;

			} else if (document.body.scrollHeight > document.body.offsetHeight){
				xScroll = document.body.scrollWidth;
				yScroll = document.body.scrollHeight;
			} else {
				xScroll = document.body.offsetWidth;
				yScroll = document.body.offsetHeight;
			}

			SY = window.scrollY ? window.scrollY : Body.scrollTop; // Gecko / IE,Opera
			SX = window.scrollX ? window.scrollX : Body.scrollLeft;

			if (self.innerHeight) {
				if(document.documentElement.clientWidth){
					windowWidth = document.documentElement.clientWidth;
				} else {
					windowWidth = self.innerWidth;
				}
				windowHeight = self.innerHeight;
			} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
				windowWidth = document.documentElement.clientWidth;
				windowHeight = document.documentElement.clientHeight;
			} else if (document.body) { // other Explorers
				windowWidth = document.body.clientWidth;
				windowHeight = document.body.clientHeight;
			}

			if(yScroll < windowHeight){
				pageHeight = windowHeight;
			} else {
				pageHeight = yScroll;
			}

			if(xScroll < windowWidth){
				pageWidth = xScroll;
			} else {
				pageWidth = windowWidth;
			}

			$('#lightbox-overlay').css({
				width:		pageWidth,
				height:		pageHeight
			});

			// Handle cases
			switch ( type )
			{
				case 'general': // general resize (start of lightbox)
					return true;
					break;
				case 'resized': // window was resized
					if ( this.auto_resize === false ) {
						// Stop
						// Reposition
						this.repositionBoxes({'nHeight':nHeight, 'speed':this.speed});
						return true;
					}
				case 'transition': // transition between images
				default: // unknown
				break;
			}

			// Get image
			var image = this.images.active();
			if ( !image || !image.width || !this.visible ) {
				// No image or no visible lightbox, so we don't care
				$.log('WARNING', 'A resize occured while no image or no lightbox...');
				return false;
			}

			// Resize image box
			// i:image, w:window, b:box, c:current, n:new, d:difference
			// Get image dimensions
			var iWidth  = image.width;
			var iHeight = image.height;

			// Get window dimensions
			var wWidth  = $(window).width();
			var wHeight = $(window).height();

			// Check if we are in size
			// Lightbox can take up 4/5 of size
			if ( this.auto_resize !== false ) {
				// We want to auto resize
				// При включенном авто масштабировании брать значения
				// из конструктора
				var maxWidth  = this.max_width;
				var maxHeight = this.max_height;

				var resizeRatio;
				while ( iWidth > maxWidth || iHeight > maxHeight ) {
					// We need to resize
					if ( iWidth > maxWidth )
					{	// Resize width, then height proportionally
						resizeRatio = maxWidth/iWidth;
						iWidth = maxWidth;
						iHeight = Math.floor(iHeight*resizeRatio);
					}

					if ( iHeight > maxHeight )	{
						// Resize height, then width proportionally
						resizeRatio = maxHeight/iHeight;
						iHeight = maxHeight;
						iWidth = Math.floor(iWidth*resizeRatio);
					}
				}
			}

			// Get current width and height
			var cWidth  = $('#lightbox-imageBox').width();
			var cHeight = $('#lightbox-imageBox').height();
			// Get the width and height of the selected image plus the padding
			// padding*2 for both sides (left+right || top+bottom)
			var nWidth	= (iWidth  + (this.padding * 2));
			var nHeight	= (iHeight + (this.padding * 2));

			//--- Задаю минимальную ширину окна элемента галереи ---//
			if (nWidth < 180) nWidth = 180;
			if (nHeight < 180) nHeight = 180;
			//-----------------------------------------------------//

			// Diferences
			var dWidth  = cWidth  - nWidth;
			var dHeight = cHeight - nHeight;

			// Set the overlay buttons height and the infobox width
			// Other dimensions specified by CSS
			$('#lightbox-nav-btnPrev,#lightbox-nav-btnNext').css('height', nHeight);
			$('#lightbox-infoBox').css('width', nWidth);

			// Handle final action
			if ( type === 'transition' ) {
				// We are transition
				// Do we need to wait? (just a nice effect to counter the other
				if ( dWidth === 0 && dHeight === 0 ) {
					// We are the same size
					this.pause(this.speed/3);
					this.showImage(null, 3);
				} else {
					// We are not the same size
					// Animate
/*					$('#lightbox-image').width(iWidth).height(iHeight);*/
					$('#lightbox-imageBox').animate({width: nWidth, height: nHeight}, this.speed, function ( ) { $.Lightbox.showImage(null, 3); } );
				}
			} else {
				// We are a resize
				// Animate Lightbox
/*				$('#lightbox-image').animate({width:iWidth, height:iHeight}, this.speed);*/
				$('#lightbox-imageBox').animate({width: nWidth, height: nHeight}, this.speed);
			}
			// Reposition
			this.repositionBoxes({'nHeight':nHeight, 'speed':this.speed});
			// Done
			return true;
		},

		repositioning:			false,	// are we currently repositioning
		reposition_failsafe:	false,	// failsafe
		repositionBoxes: function ( options ) {
			// Prepare
			if ( this.repositioning ) {
				// Already here
				this.reposition_failsafe = true;
				return null;
			}

			this.repositioning = true;

			// Options
			options = $.extend({}, options);
			options.callback = options.callback || null;
			options.speed = options.speed || 'slow';

			// Get page scroll
			var pageScroll = this.getPageScroll();

			// Figure it out
			// alert($(window).height()+"\n"+$(document.body).height()+"\n"+$(document).height());
			// var nHeight = options.nHeight || parseInt($('#lightbox').height(),10) || $(document).height()/3;
			var nHeight = options.nHeight || parseInt($('#lightbox').height(),10);

			// Display lightbox in center
			// var nTop = pageScroll.yScroll + ($(document.body).height() /*frame height*/ - nHeight) / 2.5;
			var nTop = pageScroll.yScroll + ($(window).height() /*frame height*/ - nHeight) / 2.5;
			var nLeft = pageScroll.xScroll;

			// Animate
			var css = {
				left: nLeft,
				top: nTop
			};

			if (options.speed) {
				$('#lightbox').animate(css, 'fast', function(){
					if ( $.Lightbox.reposition_failsafe ) {
						// Fire again
						$.Lightbox.repositioning = $.Lightbox.reposition_failsafe = false;
						$.Lightbox.repositionBoxes(options);
					} else {
						// Done
						$.Lightbox.repositioning = false;
						if ( options.callback ) {
							// Call the user callback
							options.callback();
						}
					}
				});
			} else {
				$('#lightbox').css(css);
				if ( this.reposition_failsafe ){
					// Fire again
					this.repositioning = this.reposition_failsafe = false;
					this.repositionBoxes(options);
				} else {
					// Done
					this.repositioning = false;
				}
			}
			// Done
			return true;
		},

		visible: false,

		showImage: function ( image, step )	{
			// Establish image
			image = this.images.get(image);
			if ( !image ) { return image; }
			// Default step
			step = step || 1;
			// Split up below for jsLint compliance
			var skipped_step_1 = step > 1 && this.images.active().src !== image.src;
			var skipped_step_2 = step > 2 && $('#lightbox-image').attr('src') !== image.src;
			if ( skipped_step_1 || skipped_step_2 )
			{	// Force step 1
				$.log('We wanted to skip a few steps: ', image, step, skipped_step_1, skipped_step_2);
				step = 1;
			}

			switch ( step )
			{
				// ---------------------------------
				// We need to preload
				case 1:
					// Disable keyboard nav
					this.KeyboardNav_Disable();
					// Show the loading image
					$('#lightbox-loading').show();
					// Hide things
					$('#lightbox-infoBox').hide();
					$('#lightbox-image,#lightbox-nav,#lightbox-nav-btnPrev,#lightbox-nav-btnNext').hide();
					// Remove show info events
					$('#lightbox-imageBox').unbind();
					// ^ Why? Because otherwise when the image is changing, the info pops out, not good!
					// Make the image the active image
					if ( !this.images.active(image) ) { return false; }

					// Check if we need to preload
					if ( image.width && image.height ) {
						// We don't
						// Continue to next step
						this.showImage(null, 2);
					} else  {
						// We do
						// Create preloader
						var preloader = new Image();
						// Set callback
						preloader.onload = function() {
							// We have preloaded the image
							// Update image with our new info
							image.width  = preloader.width;
							image.height = preloader.height;
							// Continue to next step
							$.Lightbox.showImage(null, 2);

							// Kill preloader
							preloader.onload = null;
							preloader = null;
						};
						// Start preload
						preloader.src = image.src;
					}
					// Done
					break;

				// ---------------------------------
				// Resize the container
				case 2:
					$('#lightbox-image').attr('src', image.src);
					// Set container border (Moved here for Konqueror fix - Credits to Blueyed)
					if ( typeof this.padding === 'undefined' || this.padding === null || isNaN(this.padding) )	{
						// Autodetect
						this.padding = parseInt($('#lightbox-imageContainer').css('padding-left'), 10) || parseInt($('#lightbox-imageContainer').css('padding'), 10) || 0;
					}

					// Use colorBlend?
					if ( this.colorBlend )	{
						// We have colorBlend
						// Background
						$('#lightbox-overlay').animate({'backgroundColor':image.color}, this.speed*2);
						// Border
						$('#lightbox-imageBox').css('borderColor', image.color);
					}
					// Resize boxes
					this.resizeBoxes('transition');
					// ^ contains callback to next step
					// Done
					break;

				// ---------------------------------
				// Display the image

				case 3:
					// Hide loading
					$('#lightbox-loading').hide();
					// Animate image
					$('#lightbox-image').fadeIn(this.speed*1.5, function() {$.Lightbox.showImage(null, 4); });
					// Start the proloading of other images
					this.preloadNeighbours();

					// Fire custom handler show
					if ( this.handlers.show !== null )	{
						// Fire it
						this.handlers.show(image);
					}
					break;

				case 4:
					var $title = $('#lightbox-caption-title').html(image.title || 'Untitled');
					if ( this.download_link ) {
						$title.attr('href', this.download_link ? image.src : '');
					}
					delete $title;

					$('#lightbox-title').html(image.title || '&nbsp;');

					if ( this.images.size() > 1 )	{
						$('#lightbox-currentNumber').html(this.text.image + '&nbsp;' + ( image.index + 1 ) + '&nbsp;' + this.text.of + '&nbsp;' + this.images.size());
					} else {
						$('#lightbox-currentNumber').html('&nbsp;');
					}
					$('#lightbox-infoBox').show('fast');
					if ( !this.images.first(image) ) {$('#lightbox-nav-btnPrev').show();}
					if ( !this.images.last(image) ) {$('#lightbox-nav-btnNext').show();}
					$('#lightbox-nav').show();
					this.KeyboardNav_Enable();
					break;

				// ---------------------------------
				// Error handling
				default:
					$.log('ERROR', 'Don\'t know what to do: ', image, step);
					return this.showImage(image, 1);
					// break;
			}
			// All done
			return true;
		},

		preloadNeighbours: function ( ) {
			// Preload all neighbour images
			// Do we need to do this?
			if ( this.images.single() || this.images.empty() ) {return true;}

			// Get active image
			var image = this.images.active();
			if ( !image ) { return image; }

			// Load previous
			var prev = this.images.prev(image);
			var objNext;
			if ( prev ) {
				objNext = new Image();
				objNext.src = prev.src;
			}

			// Load next
			var next = this.images.next(image);
			if ( next ) {
				objNext = new Image();
				objNext.src = next.src;
			}
		},

		// --------------------------------------------------
		// Things we don't really care about
		KeyboardNav_Enable: function ( ) {
			$(document).keydown(function(objEvent) {
				$.Lightbox.KeyboardNav_Action(objEvent);
			});
		},

		KeyboardNav_Disable: function ( ) {
			$(document).unbind();
		},

		KeyboardNav_Action: function ( objEvent ) {

			// Prepare
			objEvent = objEvent || window.event;

			// Get the keycode
			var keycode = objEvent.keyCode;
			var escapeKey = objEvent.DOM_VK_ESCAPE /* moz */ || 27;

			// Get key
			var key = String.fromCharCode(keycode).toLowerCase();

			// Close?
			if ( key === this.keys.close || keycode === escapeKey ) {return $.Lightbox.finish();}

			// Prev?
			if ( key === this.keys.prev || keycode === 37 ) {
				// We want previous
				return $.Lightbox.showImage($.Lightbox.images.prev());
			}

			// Next?
			if ( key === this.keys.next || keycode === 39 ) {
				// We want next
				return $.Lightbox.showImage($.Lightbox.images.next());
			}
			// Unknown
			return true;
		},

		getPageScroll: function ( ) {
			var xScroll, yScroll;
			if (self.pageYOffset)
			{
				// Some browser
				yScroll = self.pageYOffset;
				xScroll = self.pageXOffset;
			} else if (document.documentElement && document.documentElement.scrollTop)
			{	// Explorer 6 Strict
				yScroll = document.documentElement.scrollTop;
				xScroll = document.documentElement.scrollLeft;
			} else if (document.body) {
				// All other browsers
				yScroll = document.body.scrollTop;
				xScroll = document.body.scrollLeft;
        	}
			var arrayPageScroll = {'xScroll':xScroll,'yScroll':yScroll};
			return arrayPageScroll;
		},

		pause: function ( ms ) {
			var date = new Date();
			var curDate = null;
			do { curDate = new Date(); }
			while ( curDate - date < ms);
		}



	}); // We have finished extending/defining our LightboxClass

	/*---------------------------------------------------------*/

	if ( typeof $.Lightbox === 'undefined' )
	{
		$.Lightbox = new $.LightboxClass();
	}
})(jQuery); // We are done with our plugin, so lets call it with jQuery as the argument
/*---------------------------------------------------------*/