/**
 * $ jQuery Site Overlay
 * Version 2.0.6 (2008-12-02)
 *
 * Copyright (c) 2008 Flink BV - www.flink.nl
 */


$.overlay = {

	// array of current popups
	popups : [],

	// array of global event handlers
	event: $(),

	// default options
	defaultOptions: {
		name: 'default',						// name of popup; id of popup will be "popup_<name>"
		startWidth: 150,						// always open a popup with these geometries
		startHeight: 150,						// ....
		minWidth: 500,							// popup geometries must be at least these geometries after animation
		minHeight: 300,							// ....
		maxWidth: 800,							// maximum geometries allowed on a image popup (could be overwritten by maximum window geometries)
		maxHeight: 600,							// ....
		showAnimation: 'stretch',				// show animation type
		transitionAnimation: 'stretch',			// transition animation type
		hideAnimation: 'none',					// hide animation type
		animation: null,						// animation type used for all actions: show, hide and transition
		showTime: 1000,							// show animation time
		transitionTime: 1000,					// transition animation time
		hideTime: 600,							// hide animation time
		time: null,								// animation time used for all actions: show, hide and transition
		align: 'center',						// horizontal popup alignment
		vAlign: 'center',						// vertical popup alignment
		url: null,								// shortcut to 'content.url'
		content: '',							// html content or an object with argument used with $.ajax
		openHandler: null,						// user's open handler, executed when popup is shown first time
		showHandler: null,						// user's show handler (also used with transition)
		hideHandler: null,						// user's hide handler
		formValidation: true,					// enable form validation with true or an object with options passthrough to $.validatorEnable()
		imageNavText: 'Image % of %',			// Text used in image navigation text
		enableImgTitle: true,					// show image title when available
		enableImgNav: true,						// show image navigation when more then 1 image
		enableCloseButton: true,				// show close button
		marginX: 60,							// margins substracted from maximum window size
		marginY: 60,							// ....
		maskTrigger: true,						// use different mask trigger
		enableMask: true,						// enabled/disable overlay mask
		isGallery: false,						// internal: popup is a gallery
		spacerImg: '/images/shared/x.gif',		// spacer image: must be a transparent gif
		attribImgTitle: 'title'					// attribute to get image title from
	},

	/**
	 * Open popup
	 * @param Map options
	 */
	open: function(options)
	{
		
		
		// merge with default options
		options = $.extend({}, this.defaultOptions, options);
		
		// some special options
		if (options.maskTrigger===true) options.maskTrigger = this.close;
		if (options.animation) options.showAnimation = options.hideAnimation = options.transitionAnimation = options.animation;
		if (options.time) options.showTime = options.hideTime = options.transitionTime = options.time;
		if (options.url && !options.content) options.content = $.extend({}, {url: options.url}, options.content);
		
		// defaults
		var name = options.name
			,newpopup = false
			,$popup = $('#popup_'+name)
			,$mask = $('#overlay')
		;

		// set mask
		if (options.enableMask && !$mask.length) {
			$mask = $('<div id="overlay"></div>').appendTo('body');
			if (options.maskTrigger) $mask.click(options.maskTrigger);
			if($.browser.msie && $.browser.version < 7) $('select').css('visibility', 'hidden');
		}

		// create new popup
		if (!$popup.length) {
			$popup = $('<div id="popup_'+name+'" class="popup">'
				+ '<table class="popupFrame" cellspacing="0" border="0" cellpadding="0">'
				+ '<tr><td class="tl"><img src="'+options.spacerImg+'"></td><td class="t"></td><td class="tr"><img src="'+options.spacerImg+'"></td></tr>'
    			+ '<tr><td class="l"></td><td class="popupContainer"><div class="popupLoader" /><div class="popupContent" /><div class="popupAnimator" />'
    			+ (options.enableCloseButton ? '<a href="#" class="closeBtn" rel="popupClose" />' : '')
    			+ '</td><td class="r"></td></tr>'
    			+ '<tr><td class="bl"></td><td class="b"></td><td class="br"></td></tr></table>'
				+ '</div>').appendTo('body');

			options.popupMarginX = $popup.outerWidth() - $('.popupContainer', $popup).outerWidth();
			options.popupMarginY = $popup.outerHeight() - $('.popupContainer', $popup).outerHeight();
			$popup[0].options = options;

			newpopup = true;
			this.popups.push(name);
		}

		// get page sizes
		var p = this.getDocSize()
			,absolute = ($popup.css('position')=='absolute')
			,maxWidth = p.innerWidth - options.marginX - options.popupMarginX
			,maxHeight = p.innerHeight - options.marginY - options.popupMarginY
		;

		// set maximum width & height
		if(options.maxWidth && maxWidth>options.maxWidth) maxWidth = options.maxWidth;
		if(options.maxHeight && maxHeight>options.maxHeight) maxHeight = options.maxHeight;

		// setup
		var $animator = $('.popupAnimator', $popup)
			,$content = $('.popupContent', $popup)
			,$loader = $('.popupLoader', $popup).show()
			,$closeBtn = $('.closeBtn', $popup).hide()
			,animating = false
			,params = {
				animation: (newpopup ? options.showAnimation : options.transitionAnimation),
				time: (newpopup ? options.showTime : options.transitionTime),
				call: (newpopup ? 'show' : 'transition'),
				end: showHandler,
				width: 0,
				height: 0
			}
		;

		// set animator start width and height
		if (newpopup && (options.startWidth || options.startHeight)) {
			$animator.width(options.startWidth).height(options.startHeight).show();
		} else {
			$animator.width($content.width()).height($content.height()).show();
		}

		// hide after determined geometries.. could be unpredictable otherwise
		$content.hide();

		// fix cursor problem in firefox
		if (absolute && $.browser.mozilla && $.browser.version < '1.9.0.0') {
		    tmp = $('<div id="tmp_bottom"></div>').appendTo('body');
		    $('#overlay').css({position: 'absolute', height: tmp.offset().top});
		    tmp.remove();
		}

		// set horizontal align
		switch (options.align)
		{
			case 'left': $popup.css({left: (absolute ? 0+p.scrollLeft : 0)}); break;
			case 'right': $popup.css({right: 0}); break;
			case 'center' : $popup.css({left: '50%', marginLeft: '-'+parseInt($popup.width()/2)+'px'}); break;
		}

		
		// set vertical align
		switch (options.vAlign)
		{
			case 'top': $popup.css({top: (absolute ? 0+p.scrollTop : 0)}); break;
			case 'bottom': $popup.css({bottom: 0});	break;
			case 'center': $popup.css({top: (absolute ? p.scrollTop + (p.innerHeight/2) : '50%'), marginTop: '-'+parseInt($popup.height()/2)+'px'}); break;
		}

		// custom open event handler
		if ($.isFunction(options.openHandler)) options.openHandler();
		$.overlay.event.triggerHandler('open', [$popup,options]);

		// show handler
		function showHandler()
		{
			// hide loader
			$loader.hide();

			// show close button
			$closeBtn.show();

			// enable validation
			if (options.formValidation && typeof($.validator)=='object') {
				$('form', $popup).validatorEnable($.extend({hdlCallback: $.overlay.formHandler}, options.formValidation));
			}

			// resize handler
			if (newpopup && !options.isGallery) {
				$popup.bind('resize', function(){
					if (!animating) {
						params.animation = 'none';
						params.end = function(){ animating = false; };
						showPopup();
					}
				});
			}

			// custom resize event trigger for non IE
			if (!($.browser.msie && $.browser.version>=7)) {
				$popup[0].resizer = {
					width: $popup.width(),
					height: $popup.height(),
					interval: setInterval(function(){
						if (!animating) {
							var resizer = $popup[0].resizer, curWidth = $popup.width(), curHeight = $popup.height();
							if (curWidth!=resizer.width || curHeight!=resizer.height) {
								//alert('resize: '+curHeight+' '+resizer.height);
								resizer.width = curWidth;
								resizer.height = curHeight;
								$popup.triggerHandler('resize');
							}
						}
					}, 100)
				};
			}

			// bind close handler
			$('a[rel*=popupClose]', $popup).unbind('click').click(function(){ $.overlay.hide($popup, options); return false; });

			// throw popup event
			$popup.triggerHandler('show', [$popup,options]);

			// throw overlay event
			$.overlay.event.triggerHandler('show', [$popup,options]);

			// custom handler
			if ($.isFunction(options.showHandler)) options.showHandler($popup, options);

			// animation ended
			animating = false;
		}

		// animation function
		function showPopup()
		{
			var p = $.overlay.getDocSize()
				,maxWidth = p.innerWidth - options.marginX - options.popupMarginX
				,maxHeight = p.innerHeight - options.marginY - options.popupMarginY
			;

			// animating
			animating = true;

			// get width from content
			params.width = $content.outerWidth();

			// set minimum width
			if (params.width < options.minWidth) {
				$content.width(params.width = options.minWidth);
			}

			// get height from content
			params.height = $content.outerHeight();

			// set minimum height
			if (params.height < options.minHeight) {
				$content.height(params.height = options.minHeight);
			}

			// switch to absolute position when popup is to high
			if (params.height > maxHeight || params.width > maxWidth) {
				options.vAlign = 'top';
				absolute = true;
				$popup.css({position: 'absolute', top: 0+p.scrollTop, marginTop: (p.innerHeight-$popup.height())/2});
			}

			// set maximum geometries
//			if (params.width > options.maxWidth) $content.width(params.width = maxWidth);
//			if (params.height > options.maxHeight) $content.height(params.height = maxHeight);

			// start animation
			$.overlay.animate($popup, options, params);
		}

		// popup is gallery
		if (options.isGallery) {
			//define title attribute
			var titleAttr = options.attribImgTitle;
			
			// define current image
			var img = options.galCollection[options.galCurrent]
				,title = $(img).attr(titleAttr) || ''
				,imgSrc = img.src
					.replace(/&thumbnail=\d+$/, (options.thumbId!==false ? '&thumbnail='+options.thumbId : ''))
					.replace(/&thumb_nr=\d+$/, (options.thumbId!==false ? '&thumb_nr='+options.thumbId : ''))
			;
			
			options.galTotal = options.galCollection.length;

			// after image is loaded
			function onload()
			{
				this.onload=null;
				var imgHeight = this.height
					,imgWidth = this.width
				;

				// define maximum geometries
				while (true)
				{
					if (imgWidth > maxWidth) {
						imgHeight = imgHeight * (maxWidth / imgWidth);
						imgWidth = maxWidth;
					} else if (imgHeight > maxHeight) {
						imgWidth = imgWidth * (maxHeight / imgHeight);
						imgHeight = maxHeight;
					} else break;
				}

				// build html
				var imgText='', content = '<div class="imgContainer"><table border="0" cellpadding="0" cellspacing="0"><tr><td><img src="'+imgSrc+'" width="'+imgWidth+'" height="'+imgHeight+'"></td></tr></table>';
				if (options.enableImgNav && options.galCurrent > 0) content+= '<a href="#" class="imgPrev"></a>';
				if (options.enableImgNav && options.galCurrent < options.galTotal-1) content+= '<a href="#" class="imgNext"></a>';
				content+= '</div>';

				if (options.enableImgTitle && title) imgText+= '<div class="title">'+title+'</div>';
				if (options.enableImgNav && options.galTotal>1) imgText+= '<div class="navInfo">'+options.imageNavText.replace(/%/, options.galCurrent+1).replace(/%/, options.galTotal)+'</div>';
				if (imgText) content+= '<div class="imgDetails">'+imgText+'</div>';

				// set content
				$content.html(content).show();

				// used layers
				var $imgContainer = $('.imgContainer', $popup).hide()
					,$imgDetails = $('.imgDetails', $popup).hide()
				;

				// not preceeding minimum size?
				if (imgWidth < options.minWidth) $imgContainer.width(imgWidth = options.minWidth);
				if (imgHeight < options.minHeight) $imgContainer.height(imgHeight = options.minHeight);

				// set fixed width for details
				$imgDetails.width(imgWidth);

				// calculate extra height
				var detailHeight =  $imgDetails.outerHeight();

				// hide content
				$content.hide();

				// use detail height during animation
				if (newpopup) options.popupMarginY += detailHeight;

				// hide image details
				$imgDetails.show().css({visibility: 'hidden', marginTop: '-'+detailHeight+'px'});

				// add additional parameters
				$.extend(params, {
					width: imgWidth,
					height: imgHeight,
					end: function()
					{
						// hide loader
						$loader.hide();

						// set click handler on previous button
						$('.imgPrev').click(function(){
							$(this).unbind('click');
							if (options.galCurrent>0) {
								options.galCurrent-=1;
								$.overlay.open(options);
							}
							return false;
						});

						// set click handler on next button
						$('.imgNext').click(function(){
							$(this).unbind('click');
							if (options.galCurrent<options.galTotal-1) {
								options.galCurrent+=1;
								$.overlay.open(options);
							}
							return false;
						});

						// fade image
						$imgContainer.fadeIn('slow', function() {
							// default show handler
							showHandler();

							// recalculate height (height could have been changed, eg sIFR)
							detailHeight = $imgDetails.outerHeight();

							// slide down image details
							$imgDetails.css({marginTop: '-'+detailHeight+'px', visibility: 'visible'}).animate({marginTop: 0},'slow');
						});
					}
				});

				// animate
				$.overlay.animate($popup, options, params);
			}

			// preload image
			imgPopup = new Image();
			imgPopup.onload = onload;
			imgPopup.onabort = imgPopup.onerror = $.overlay.close;
			imgPopup.src = imgSrc;
		}

		// content from ajax request
		else if (typeof(options.content) == 'object') {
			
			// execute ajax call
			$.ajax($.extend(options.content, {
				success: function(content) {
					$content.html(content);
					showPopup();
				},
				type: 'post',
				error: $.overlay.hide
			}));
		}

		// static content
		else {
			$content.html(options.content);
			showPopup();
		}
	},

	/**
	 * Hide popup
	 * @param jQuery $popup
	 * @param Map options
	 */
 	hide: function($popup, options)
	{
		// popup doesn't exists
		if ($popup.length==0) return;

		// get options
		if (!options) options = $popup[0].options;
		if (!options) return;

		// execute animation
		function hidePopup()
		{
			var $content = $('.popupContent', $popup).hide()
				,width = $content.outerWidth()
				,height = $content.outerHeight()
				,$animator = $('.popupAnimator', $popup).width(width).height(height).show()
				,$closeBtn = $('.closeBtn', $popup).hide()
			;

			// set to start geometries (only when popup isn't smaller)
			if (width>options.startWidth) width = options.startWidth;
			if (height>options.startHeight) height = options.startHeight;

			// start animation
			$.overlay.animate($popup, options, {
				animation: options.hideAnimation,
				time: options.hideTime,
				width: width,
				height: height,
				call: 'hide',
				end: hideHandler
			});
		}

		// hide handler
		function hideHandler()
		{
			$popup.hide();
			if ($.isFunction(options.hideHandler)) options.hideHandler($popup,options);
			$popup.triggerHandler('hide', [$popup,options]);
			$.overlay.event.triggerHandler('hide', [$popup,options]);
			$popup.remove();
			var newpopups = [];
			for(var i=0; i < $.overlay.popups.length; i++) if ($.overlay.popups[i]!=options.name) newpopups.push($.overlay.popups[i]);
			$.overlay.popups = newpopups;
			if (newpopups.length==0) $.overlay.close();
		}

		// unbind resize event handlers
		$popup.unbind('resize');
		if (!($.browser.msie && $.browser.version>=7)) clearInterval($popup[0].resizer.interval);

		// close without hassle
		if (options.close) {
			options.hideAnimation = 'none';
			hidePopup();
		}

		// start gallery hide animation
		else if (options.isGallery) {
			var preAnimate = function(){$('.imgContainer', $popup).fadeTo('slow', 0, hidePopup);}
				,$imgDetails = $('.imgDetails', $popup)
			;

			if ($imgDetails.length) $imgDetails.slideUp('slow', preAnimate);
			else preAnimate();
		}

		// start normal hide animation
		else {
			hidePopup();
		}
	},

	/**
	 * Animate popup
	 * @param jQuery $popup
	 * @param Map options
	 * @param Map params
	 * @return void
	 */
	animate: function($popup, options, params)
	{
		var $animator = $('.popupAnimator', $popup)
			,$content = $('.popupContent', $popup)
			,end = function(){ $animator.hide(); $content.show(); params.end(); }
			,marginLeft = (options.align=='center' ? '-'+parseInt((params.width+options.popupMarginX)/2)+'px' : 0)
			,marginTop = (options.vAlign=='center' ? '-'+parseInt((params.height+options.popupMarginY)/2)+'px' : 0)
			,time = params.time
			,ease = 'swing'
		;

		// set hide animaion
		switch (params.animation)
		{
			case 'grow':
				$popup.animate({marginTop: marginTop, marginLeft: marginLeft},time,ease);
				$animator.animate({width: params.width,	height: params.height},time,ease,end);
				break;
			case 'stretch':
				time = parseInt(time/2);
				$popup.animate({marginTop: marginTop},time, ease);
				$animator.animate({height: params.height}, time, ease, function(){
					if ($animator.width()!=params.width) {
						$animator.animate({width: params.width}, time, ease);
						$popup.animate({marginLeft: marginLeft},time, ease, end);
					} else {
						end();
					}
				});
				break;
			case 'slide':
				if (params.call!='hide') $animator.width(params.width).css({marginTop: marginTop, marginLeft: marginLeft});
				$animator.animate({height: params.height}, time, ease, end);
				break;
			case 'fade' :
				if (params.call=='hide') {
					$animator.hide();
					$content.show();
					$popup.fadeOut(time, end);
				} else {
					$popup.hide();
					$content.show();
					$animator.hide();
					$popup.css({marginTop: marginTop, marginLeft: marginLeft}).fadeIn(time, end);
				}
				break;
			default :
				//$content.width(params.width).height(params.height);
				$popup.css({marginTop: marginTop, marginLeft: marginLeft});
				end();
				break;
		}
	},


	/**
	 * Remove overlay and all popups
	 * @return false
	 */
 	close: function()
	{
		for (var i=$.overlay.popups.length-1; i >= 0 ; i--) {
			var $popup = $.getPopup($.overlay.popups[i]);
			$.overlay.hide($popup, $.extend($popup[0].options, {close: true}));
		}
		$.overlay.popups = [];
		$('#overlay').remove();
		if($.browser.msie && $.browser.version < 7) $('select').css('visibility', 'visible');
		return false;
	},

	/**
	 * Get document sizes
	 * @return object
	 */
	getDocSize: function()
	{
		var dE = document.documentElement;
		return {
			innerWidth: (window.innerWidth || self.innerWidth || (dE&&dE.clientWidth) || document.body.clientWidth),
			innerHeight: (window.innerHeight || self.innerHeight || (dE&&dE.clientHeight) || document.body.clientHeight),
			//scrollWidth: (dE&&dE.scrollWidth || document.body.scrollWidth),
			//scrollHeight: (dE&&dE.scrollHeight || document.body.scrollHeight),
			scrollTop: (dE&&dE.scrollTop || document.body.scrollTop),
			scrollLeft: (dE&&dE.scrollLeft || document.body.scrollLeft)
		};
	},

	/**
	 * Handler for jquery.validation
	 * @param bool validatedOK
	 * @param jQuery form
	 * @param Map data
	 */
	formHandler: function(validatedOK,form,data)
	{
		var $popup = $(form).parents('.popup');

		// continue post when popup not found
		if ($popup.length == 0) return validatedOK;

		// no errors found
		if (validatedOK)
		{
			
			// get options
			var options = $popup[0].options;

			// options not found, popup does not exist => continue post
			if (!options) return true;

			// set content
			options.content.data = $(':input', form).serialize();
			options.content.type = form.method;
 			if (form.action) options.content.url = form.action;

			// show popup
			$.overlay.open(options);

		} else {
			// errors found, possible resize of popup
			$popup.triggerHandler('resize');
		}

		return false;
	}

};


/*------------------------------------------------------------------------------
	Element handlers
------------------------------------------------------------------------------*/

$.extend({
	/**
	 * Just a wrapper for $.overlay.open
	 * @param Map|string url|options
	 * @return false
	 */
	openPopup: function(options){
		if (typeof(options)=='string') options = {url: options};
		$.overlay.open(options);
		return false;
	},

	/**
	 * Get popup as jQuery object by name
	 * @param string name
	 * @return jQuery
	 */
	getPopup: function(name)
	{
		return $('#popup_'+name);
	},

	/**
	 * Show a single image in a popup
	 * @param string src
	 * @param string title
	 * @param map options
	 * @return false
	 */
	imagePopup: function(src, title, options)
	{
		//set title attribute to default ('title') because title is set to image
		var img = {src: src, title:title}
			,options = $.extend({}, {attribImgTitle: 'title', thumbId: false, galCollection: [img], galCurrent: 0}, options, {isGallery: true});

		$.overlay.open(options);
		return false;
	},

	/**
	 * Show a single flash object in a popup
	 * Use options.swfvars and options.swfparams to manage swfobject
	 * @param string file
	 * @param int width
	 * @param int height
	 * @param map options
	 * @return false
	 */
	flashPopup: function(file,width,height,options)
	{

		//set options
		var options = $.extend({name: 'flash'}, options);

		//execute when swfobject is available
		if(typeof swfobject == 'object') {

			//default update flash message
			if (!options.updateFlashMsg) {
				options.updateFlashMsg = '<div class="flashUpdate"><span>Flash plug-in vereist</span><br>Deze website maakt gebruik van de Flash plug-in. U kunt de plug-in downloaden via de onderstaande link.<br><br><a href="http://www.adobe.com/go/getflashplayer">Download flash plug-in</a></div>';
			}

			//check op versie
			var oVersion = swfobject.getFlashPlayerVersion();
			
			//get minimal dimensions
			var contentHeight 	= $.overlay.defaultOptions.minHeight;
			var contentWidth 	= $.overlay.defaultOptions.minWidth;
			
			
			//get from options set
			if(options.minHeight) {
				contentHeight = options.minHeight;
			} 
			if(options.minWidth) {
				contentHeight = options.minWidth;
			}

			//compare with flash dimensions
			if(contentWidth < width) {
				 contentWidth = width;
				 options.minWidth = contentWidth;
			}
			if(contentHeight < height) {
				contentHeight = height;
				options.minHeight = contentHeight;
			}

			// build html for popup
			var flashHTML = '<div class="flashContainer"><table border="0" cellpadding="0" cellspacing="0"><tr><td width="'+contentWidth+'" height="'+contentHeight+'"><div id="overlayFlash">&nbsp;</div></td></tr></table></div>';
			if (options.title) flashHTML += '<div class="flashDetails"><div class="title">'+options.title+'</div></div>';
			options.content = flashHTML;

			//set showHandler to embed flash with swfobject
			options.showHandler = function() {
				//check if flash is available and 6 or higher (use express instal)
				if (!oVersion.major || oVersion.major < 6) {
					$('#overlayFlash').html(options.updateFlashMsg);
				}
				else {
					$.swfEmbed(file,'overlayFlash',width,height,options.swfvars,options.swfparams);
				}
			};
		}

		$.overlay.open(options);
		return false;
	},

	/**
	 * Show gallery in a popup
	 * @param map options
	 * @return false
	 */
	galleryPopup: function(url, options)
	{
		var options = $.extend({}, {thumbId: false, galCollection: [], galCurrent: 0}, options, {isGallery: true});

		function ajaxError()
		{
			alert('Unable to read gallery information!');
		}

		$.ajax({
			url: url,
			success: function(xml)
			{
				$('file',xml).each(function(i)
				{
					// add image to gallery
					options.galCollection.push({
						src: $('url', this).text(),
						title: $('name', this).text()
					});
				});

				if (options.galCollection.length) {
					$.overlay.open(options);
				} else {
					ajaxError();
				}
			},
			error: ajaxError
		});
		return false;
	},

	/**
	 * Show iFrame in a popup
	 *
	 * @param string url
	 * @param string title (optional)
	 * @param map options (optional)
	 * @return false
	 */
	iframePopup: function(url, title, options){
		var options = $.extend({name: 'iframe'}, options),
			title = title ? '<h2>'+title+'</h2>' : '',
			width = options.width || $.overlay.defaultOptions.minWidth,
			height = options.height || $.overlay.defaultOptions.minHeight
		;

		options.content = title+'<iframe name="popup_iframe" scrolling="auto" vspace="0" hspace="0" marginheight="0" marginwidth="0" width="'+width+'" height="'+height+'" allowtransparency frameborder="0"></iframe>';
		options.showHandler = function($popup)
		{
			$('iframe', $popup).attr('src', url);
		};

		$.overlay.open(options);
		return false;
	}
});

$.fn.extend({
	/**
	 * Set an onclick zoom event on a jQuery object
	 *
	 * @param Object options (optional) Options passthrough $.overlay.showPopup(). Set options.thumbnr to set thumbnail number. Enable gallery alike behavior by enabling options.gallery.
	 * @return jQuery object
	 */
	setGallery: function(options)
	{
		var options = $.extend({}, {thumbId: false, galCollection: [], galCurrent: 0}, options, {isGallery: true});

		// collect images
		$.each(this, function(){
			
			// get image object
			var img = (this.src ? this : $('img', this)[0]);
			if (!img.src || img.options) return;

			// add image to gallery
			options.galCollection.push(img);

			// set options
			img.options = options;
		});
		
		// set click event handler
		return $(this).css({cursor: 'pointer'}).click(function()
		{
			img = (this.src ? this : $('img', this)[0]);
			if (!img.src || !img.options) return false;
			
			img.options.galCurrent = $.inArray(img, img.options.galCollection);
			
			$.overlay.open(img.options);
			return false;
		});
	},

	/**
	 * Set an onclick popup event on an object
	 *
	 * @see jQuery.overlay.showPopup
	 * @param Object options
	 * @return jQuery object
	 */
	openPopup: function(options)
	{
		return $.each(this, function()
		{
			if (this.popup == 'object') return;

			this.popup = options || {};

			$(this).css({cursor: 'pointer'}).click(function() {
				$.overlay.open($.extend({url: this.href}, this.popup));
				return false;
			});
		});
	},

	/**
	 * A onclick wrapper for $.iframePopup()
	 *
	 * @see jQuery.iframePopup
	 * @param map		options
	 * @return jQuery object
	 */
	iframePopup: function(options)
	{
		return $(this).click(function(){
			return $.iframePopup(this.href, this.title, options);
		});
	}
});