/*
	Gallery Viewer v1.1.0.
	Written by All Web Promotion 2008.
*/

;(function($) {

	$.fn.galleryviewer = function(opts) {

		var defaults = {
			'changeEvent'		: 'click',
			'transitionTime'	: 200
		};
		var settings = $.extend({}, defaults, opts);

		$(this).each(function() {
			$(this).click(function(e){
				var linkElem = this;
				var jModal = $.modal(settings);
				build(jModal, linkElem);
				jModal.show();
				return false;
			});
		});

		return $(this);

		function linkImageUrl (imageLink) {
			return $(imageLink).metadata().galleryviewerImageUrl
					|| $(imageLink).attr('href')
					|| $(imageLink).find('img').attr('src');
		}

		function linkThumbUrl (imageLink) {
			return $(imageLink).metadata().galleryviewerThumbUrl
					|| $(imageLink).find('img').attr('src');
		}

		function linkImageTitle (imageLink) {
			return $(imageLink).metadata().galleryviewerImageTitle
					|| $(imageLink).attr('title')
					|| $(imageLink).find('title').attr('src')
					|| $(imageLink).find('img').attr('alt')
					|| $(imageLink).find('img').attr('src');
		}

		function build (jModal, linkElem) {

			jModal.initWindow();
			var jTitle = $('<div class="title">');
			jModal.container.append(
				$('<div class="header">')
					.append(jTitle)
					.append('<div class="close">&nbsp;</div>')
			);

			var jImage = $('<img/>').addClass('image').css('display','block');
			if (jModal.isie6) {
				jImage.css('textAlign','left');
			}
			var jImageContainer = $('<div>')
				.addClass('image-container')
				.appendTo(jModal.container)
				.append(jImage);
			var imageDimensions = {
				'width'		: parseInt(jImageContainer.css('width')),
				'height'	: parseInt(jImageContainer.css('height'))
			};
			var links = new Array();
			$('[rel="' + $(linkElem).attr('rel') + '"]').each(function() {
				if (!$(this).hasClass('galleryviewer-nothumb')) {
					links.push(this);
				}
			});

			if (links.length > 0) {
				if (links.length < 2) {
					jModal.container.addClass('nothumbs');
				}
				var url, urlThumb, imageTitle, imageDims, jThumb, jThumbImage, jThumbImageSelected, jThumbImageDefault;
				var jThumbs = $('<div>')
						.addClass('thumbs')
						.appendTo(jModal.container);
				for (var i=0; i<links.length; i++) {
					url = linkImageUrl(links[i]);
					urlThumb = linkThumbUrl(links[i]);
					imageTitle = linkImageTitle(links[i]);
					jThumb = $('<div>')
						.addClass('thumb')
						.appendTo(jThumbs);
					jThumbImage = $('<img/>')
						.attr('src', urlThumb)
						.attr('srclarge', url)
						.attr('alt', imageTitle)
						.appendTo(jThumb);
					if (i == 0) {
						jThumbImageDefault = jThumbImage;
					}
					if ((jThumb.css('width') != 'auto') && (parseInt(jThumb.css('width')) > 1)) {
						jThumbImage.attr('width', parseInt(jThumb.css('width')));
					}
					if ((jThumb.css('height') != 'auto') && (parseInt(jThumb.css('height')) > 1)) {
						jThumbImage.attr('height', parseInt(jThumb.css('height')));
					}
					jThumbImage.bind(settings.changeEvent, function(e){
						jTitle.text($(this).attr('alt'));
						var imageUrl = $(this).attr('srclarge');
						jImageContainer.addClass('loading');
						jImage.hide();
						var preloader = new Image();
						preloader.onload = function(){
							imageDims = trapsize(preloader.width, preloader.height, imageDimensions.width, imageDimensions.height);
							preloader.onload = null;
							jImageContainer.removeClass('loading');
							jImage
								.attr('src', imageUrl)
								.attr('width', imageDims.w)
								.attr('height', imageDims.h)
								.css({	'width'			: imageDims.w + 'px',
										'height'		: imageDims.h + 'px',
										'margin-right'	: '0',
										'margin-bottom'	: '0',
										'margin-left'	: ((imageDimensions.width - imageDims.w) / 2) + 'px',
										'margin-top'	: ((imageDimensions.height - imageDims.h) / 2) + 'px'
									 })
								.hide()
								.animate({'opacity':'show'}, settings.transitionTime, 'linear');
						}; /* end onload */
						preloader.src = imageUrl;
					});
					if (links[i] == linkElem) {
						jThumbImageSelected = jThumbImage;
					}
				}
				(jThumbImageSelected || jThumbImageDefault).trigger(settings.changeEvent);
			} /* end if (links.length > 0) */

		} /* end build() */

		function trapsize (itemWidth, itemHeight, maxWidth, maxHeight) {
			do {
				if (maxWidth > 0) {
					if (itemWidth > maxWidth) {
						itemHeight = Math.floor(itemHeight * maxWidth / itemWidth);
						itemWidth = maxWidth;
					}
					if (!(itemHeight > maxHeight)) {
						break;
					}
				}
				if (maxHeight > 0) {
					if (itemHeight > maxHeight) {
						itemWidth = Math.floor(itemWidth * maxHeight / itemHeight);
						itemHeight = maxHeight;
					}
				}
			} while (0);
			return {'w':itemWidth,'h':itemHeight};
		} /* end trapsize() */

		function pausems (ms) {
			var date = new Date();
			var curDate;
			do {
				curDate = new Date();
			} while((curDate - date) < ms);
		}

	};
})(jQuery);

