var Shadowbox = function() {
	var ua = navigator.userAgent.toLowerCase(), S = {
		version : "3.0b",
		adapter : null,
		current : -1,
		gallery : [],
		cache : [],
		content : null,
		dimensions : null,
		plugins : null,
		path : '',
		options : {
			adapter : null,
			animate : true,
			animateFade : true,
			autoplayMovies : true,
			autoDimensions : false,
			continuous : false,
			counterLimit : 10,
			counterType : 'default',
			displayCounter : true,
			displayNav : true,
			ease : function(x) {
				return 1 + Math.pow(x - 1, 3);
			},
			enableKeys : true,
			errors : {
				fla : {
					name : 'Flash',
					url : 'http://www.adobe.com/products/flashplayer/'
				},
				qt : {
					name : 'QuickTime',
					url : 'http://www.apple.com/quicktime/download/'
				},
				wmp : {
					name : 'Windows Media Player',
					url : 'http://www.microsoft.com/windows/windowsmedia/'
				},
				f4m : {
					name : 'Flip4Mac',
					url : 'http://www.flip4mac.com/wmv_download.htm'
				}
			},
			ext : {
				img : [ 'png', 'jpg', 'jpeg', 'gif', 'bmp' ],
				swf : [ 'swf' ],
				flv : [ 'flv' ],
				qt : [ 'dv', 'mov', 'moov', 'movie', 'mp4' ],
				wmp : [ 'asf', 'wm', 'wmv' ],
				qtwmp : [ 'avi', 'mpg', 'mpeg' ],
				iframe : [ 'asp', 'aspx', 'cgi', 'cfm', 'htm', 'html', 'jsp',
						'pl', 'php', 'php3', 'php4', 'php5', 'phtml', 'rb',
						'rhtml', 'shtml', 'txt', 'vbs' ]
			},
			fadeDuration : 0.35,
			flashParams : {
				bgcolor : '#000000',
				allowFullScreen : true
			},
			flashVars : {},
			flashVersion : '9.0.115',
			handleOversize : 'resize',
			handleUnsupported : 'link',
			initialHeight : 160,
			initialWidth : 320,
			language : 'en',
			modal : false,
			onChange : null,
			onClose : null,
			onFinish : null,
			onOpen : null,
			overlayColor : '#000',
			overlayOpacity : 0.8,
			players : [ 'img' ],
			resizeDuration : 0.35,
			showOverlay : true,
			showMovieControls : true,
			skipSetup : false,
			slideshowDelay : 0,
			useSizzle : true,
			viewportPadding : 20
		},
		client : {
			isIE : ua.indexOf('msie') > -1,
			isIE6 : ua.indexOf('msie 6') > -1,
			isIE7 : ua.indexOf('msie 7') > -1,
			isGecko : ua.indexOf('gecko') > -1 && ua.indexOf('safari') == -1,
			isWebkit : ua.indexOf('applewebkit/') > -1,
			isWindows : ua.indexOf('windows') > -1 || ua.indexOf('win32') > -1,
			isMac : ua.indexOf('macintosh') > -1 || ua.indexOf('mac os x') > -1,
			isLinux : ua.indexOf('linux') > -1
		},
		regex : {
			domain : /:\/\/(.*?)[:\/]/,
			inline : /#(.+)$/,
			rel : /^(light|shadow)box/i,
			gallery : /^(light|shadow)box\[(.*?)\]/i,
			unsupported : /^unsupported-(\w+)/,
			param : /\s*([a-z_]*?)\s*=\s*(.+)\s*/
		},
		libraries : {
			Prototype : 'prototype',
			jQuery : 'jquery',
			MooTools : 'mootools',
			YAHOO : 'yui',
			dojo : 'dojo',
			Ext : 'ext'
		},
		applyOptions : function(opts) {
			if (opts) {
				default_options = apply( {}, S.options);
				apply(S.options, opts);
			}
		},
		buildCacheObj : function(link, opts) {
			var href = link.href, obj = {
				el : link,
				title : link.getAttribute('title'),
				options : apply( {}, opts || {}),
				content : href
			};
			each( [ 'player', 'title', 'height', 'width', 'gallery' ],
					function(o) {
						if (typeof obj.options[o] != 'undefined') {
							obj[o] = obj.options[o];
							delete obj.options[o];
						}
					});
			if (!obj.player)
				obj.player = getPlayer(href);
			var rel = link.getAttribute('rel');
			if (rel) {
				var m = rel.match(S.regex.gallery);
				if (m)
					obj.gallery = escape(m[2]);
				each(rel.split(';'), function(p) {
					m = p.match(S.regex.param);
					if (m) {
						if (m[1] == 'options')
							eval('apply(obj.options,' + m[2] + ')');
						else
							obj[m[1]] = m[2];
					}
				});
			}
			return obj;
		},
		change : function(n) {
			if (!S.gallery)
				return;
			if (!S.gallery[n]) {
				if (!S.options.continuous) {
					return;
				} else {
					n = n < 0 ? S.gallery.length - 1 : 0;
				}
			}
			S.current = n;
			if (typeof slide_timer == 'number') {
				clearTimeout(slide_timer);
				slide_timer = null;
				slide_delay = slide_start = 0;
			}
			if (S.options.onChange)
				S.options.onChange();
			loadContent();
		},
		clearCache : function() {
			each(S.cache, function(obj) {
				if (obj.el)
					S.lib.removeEvent(obj.el, 'click', handleClick);
			});
			S.cache = [];
		},
		close : function() {
			if (!active)
				return;
			active = false;
			listenKeys(false);
			if (S.content) {
				S.content.remove();
				S.content = null;
			}
			if (typeof slide_timer == 'number')
				clearTimeout(slide_timer);
			slide_timer = null;
			slide_delay = 0;
			if (S.options.onClose)
				S.options.onClose();
			S.skin.onClose();
			S.revertOptions();
			each(v_cache, function(c) {
				c[0].style.visibility = c[1];
			});
		},
		contentId : function() {
			return content_id;
		},
		getCounter : function() {
			var len = S.gallery.length;
			if (S.options.counterType == 'skip') {
				var c = [], i = 0, end = len, limit = parseInt(S.options.counterLimit) || 0;
				if (limit < len && limit > 2) {
					var h = Math.floor(limit / 2);
					i = S.current - h;
					if (i < 0)
						i += len;
					end = S.current + (limit - h);
					if (end > len)
						end -= len;
				}
				while (i != end) {
					if (i == len)
						i = 0;
					c.push(i++);
				}
			} else
				var c = (S.current + 1) + ' ' + S.lang.of + ' ' + len;
			return c;
		},
		getCurrent : function() {
			return S.current > -1 ? S.gallery[S.current] : null;
		},
		hasNext : function() {
			return S.gallery.length > 1
					&& (S.current != S.gallery.length - 1 || S.options.continuous);
		},
		init : function(opts) {
			if (initialized)
				return;
			initialized = true;
			opts = opts || {};
			init_options = opts;
			if (opts)
				apply(S.options, opts);
			for ( var e in S.options.ext)
				S.regex[e] = new RegExp(
						'\.(' + S.options.ext[e].join('|') + ')\s*$', 'i');
			if (!S.path) {
				var path_re = /(.+)shadowbox\.js/i, path;
				each(document.getElementsByTagName('script'), function(s) {
					if ((path = path_re.exec(s.src)) != null) {
						S.path = path[1];
						return false;
					}
				});
			}
			if (S.options.adapter)
				S.adapter = S.options.adapter;
			else {
				for ( var lib in S.libraries) {
					if (typeof window[lib] != 'undefined') {
						S.adapter = S.libraries[lib];
						break;
					}
				}
				if (!S.adapter)
					S.adapter = 'base';
			}
			if (S.options.useSizzle && !window['Sizzle'])
				U.include(S.path + 'libraries/sizzle/sizzle.js');
			if (!S.lang)
				U.include(S.path + 'languages/shadowbox-' + S.options.language
						+ '.js');
			each(S.options.players, function(p) {
				if ((p == 'swf' || p == 'flv') && !window['swfobject'])
					U.include(S.path + 'libraries/swfobject/swfobject.js');
				if (!S[p])
					U.include(S.path + 'players/shadowbox-' + p + '.js');
			});
			if (!S.lib)
				U.include(S.path + 'adapters/shadowbox-' + S.adapter + '.js');
		},
		isActive : function() {
			return active;
		},
		isPaused : function() {
			return slide_timer == 'paused';
		},
		load : function() {
			if (S.skin.options) {
				apply(S.options, S.skin.options);
				apply(S.options, init_options);
			}
			var markup = S.skin.markup.replace(/\{(\w+)\}/g, function(m, p) {
				return S.lang[p];
			});
			S.lib.append(document.body, markup);
			if (S.skin.init)
				S.skin.init();
			var id;
			S.lib.addEvent(window, 'resize', function() {
				if (id) {
					clearTimeout(id);
					id = null;
				}
				if (active) {
					id = setTimeout(function() {
						if (S.skin.onWindowResize)
							S.skin.onWindowResize();
						var c = S.content;
						if (c && c.onWindowResize)
							c.onWindowResize();
					}, 50);
				}
			});
			if (!S.options.skipSetup)
				S.setup();
		},
		next : function() {
			S.change(S.current + 1);
		},
		open : function(obj, id) {
			if (U.isLink(obj))
				obj = S.buildCacheObj(obj);
			if (!id) {
				id = 0
			}
			;
			if (obj.constructor == Array) {
				S.gallery = obj;
				S.current = id;
			} else {
				if (!obj.gallery) {
					S.gallery = [ obj ];
					S.current = 0;
				} else {
					S.current = null;
					S.gallery = [];
					each(S.cache, function(c) {
						if (c.gallery && c.gallery == obj.gallery) {
							if (S.current == null && c.content == obj.content
									&& c.title == obj.title)
								S.current = S.gallery.length;
							S.gallery.push(c);
						}
					});
					if (S.current == null) {
						S.gallery.unshift(obj);
						S.current = 0;
					}
				}
			}
			obj = S.getCurrent();
			if (obj.options) {
				S.revertOptions();
				S.applyOptions(obj.options);
			}
			var g, r, m, s, a, oe = S.options.errors, msg, el;
			for ( var i = 0; i < S.gallery.length; ++i) {
				g = S.gallery[i] = apply( {}, S.gallery[i]);
				r = false;
				if (g.player == 'unsupported') {
					r = true;
				} else if (m = S.regex.unsupported.exec(g.player)) {
					if (S.options.handleUnsupported == 'link') {
						g.player = 'html';
						switch (m[1]) {
						case 'qtwmp':
							s = 'either';
							a = [ oe.qt.url, oe.qt.name, oe.wmp.url,
									oe.wmp.name ];
							break;
						case 'qtf4m':
							s = 'shared';
							a = [ oe.qt.url, oe.qt.name, oe.f4m.url,
									oe.f4m.name ];
							break;
						default:
							s = 'single';
							if (m[1] == 'swf' || m[1] == 'flv')
								m[1] = 'fla';
							a = [ oe[m[1]].url, oe[m[1]].name ];
						}
						msg = S.lang.errors[s].replace(/\{(\d+)\}/g, function(
								m, n) {
							return a[n];
						});
						g.content = '<div class="sb-message">' + msg + '</div>';
					} else
						r = true;
				} else if (g.player == 'inline') {
					m = S.regex.inline.exec(g.content);
					if (m) {
						var el = U.get(m[1]);
						if (el)
							g.content = el.innerHTML;
						else
							throw 'Cannot find element with id ' + m[1];
					} else
						throw 'Cannot find element id for inline content';
				} else if (g.player == 'swf' || g.player == 'flv') {
					var version = (g.options && g.options.flashVersion)
							|| S.options.flashVersion;
					if (!swfobject.hasFlashPlayerVersion(version)) {
						g.width = 310;
						g.height = 177;
					}
				}
				if (r) {
					S.gallery.splice(i, 1);
					if (i < S.current)
						--S.current;
					else if (i == S.current)
						S.current = i > 0 ? i - 1 : i;
					--i;
				}
			}
			if (S.gallery.length) {
				if (!active) {
					if (typeof S.options.onOpen == 'function'
							&& S.options.onOpen(obj) === false)
						return;
					v_cache = [];
					each( [ 'select', 'object', 'embed', 'canvas' ], function(
							tag) {
						each(document.getElementsByTagName(tag), function(el) {
							v_cache.push( [ el,
									el.style.visibility || 'visible' ]);
							el.style.visibility = 'hidden';
						});
					});
					var h = S.options.autoDimensions && 'height' in obj ? obj.height
							: S.options.initialHeight;
					var w = S.options.autoDimensions && 'width' in obj ? obj.width
							: S.options.initialWidth;
					S.skin.onOpen(h, w, loadContent);
				} else
					loadContent();
				active = true;
			}
		},
		pause : function() {
			if (typeof slide_timer != 'number')
				return;
			var time = new Date().getTime();
			slide_delay = Math.max(0, slide_delay - (time - slide_start));
			if (slide_delay) {
				clearTimeout(slide_timer);
				slide_timer = 'paused';
				if (S.skin.onPause)
					S.skin.onPause();
			}
		},
		play : function() {
			if (!S.hasNext())
				return;
			if (!slide_delay)
				slide_delay = S.options.slideshowDelay * 1000;
			if (slide_delay) {
				slide_start = new Date().getTime();
				slide_timer = setTimeout(function() {
					slide_delay = slide_start = 0;
					S.next();
				}, slide_delay);
				if (S.skin.onPlay)
					S.skin.onPlay();
			}
		},
		previous : function() {
			S.change(S.current - 1);
		},
		revertOptions : function() {
			apply(S.options, default_options);
		},
		setDimensions : function(height, width, max_h, max_w, tb, lr, resizable) {
			var h = height = parseInt(height), w = width = parseInt(width), pad = parseInt(S.options.viewportPadding) || 0;
			var extra_h = 2 * pad + tb;
			if (h + extra_h >= max_h)
				h = max_h - extra_h;
			var extra_w = 2 * pad + lr;
			if (w + extra_w >= max_w)
				w = max_w - extra_w;
			var resize_h = height, resize_w = width, change_h = (height - h)
					/ height, change_w = (width - w) / width, oversized = (change_h > 0 || change_w > 0);
			if (resizable && oversized && S.options.handleOversize == 'resize') {
				if (change_h > change_w)
					w = Math.round((width / height) * h);
				else if (change_w > change_h)
					h = Math.round((height / width) * w);
				resize_w = w;
				resize_h = h;
			}
			S.dimensions = {
				height : h + tb,
				width : w + lr,
				inner_h : h,
				inner_w : w,
				top : (max_h - (h + extra_h)) / 2 + pad,
				left : (max_w - (w + extra_w)) / 2 + pad,
				oversized : oversized,
				resize_h : resize_h,
				resize_w : resize_w
			};
			return S.dimensions;
		},
		setup : function(links, opts) {
			if (!links) {
				var links = [], rel;
				each(document.getElementsByTagName('a'), function(a) {
					rel = a.getAttribute('rel');
					if (rel && S.regex.rel.test(rel))
						links.push(a);
				});
			} else {
				var len = links.length;
				if (len) {
					if (window['Sizzle']) {
						if (typeof links == 'string')
							links = Sizzle(links);
						else if (len == 2 && links.push
								&& typeof links[0] == 'string'
								&& links[1].nodeType)
							links = Sizzle(links[0], links[1]);
					}
				} else
					links = [ links ];
			}
			each(links, function(link) {
				if (typeof link.shadowboxCacheKey == 'undefined') {
					link.shadowboxCacheKey = S.cache.length;
					S.lib.addEvent(link, 'click', handleClick);
				}
				S.cache[link.shadowboxCacheKey] = S.buildCacheObj(link, opts);
			});
		}
	}, U = S.util = {
		animate : function(el, p, to, d, cb) {
			var from = parseFloat(S.lib.getStyle(el, p));
			if (isNaN(from))
				from = 0;
			var delta = to - from;
			if (delta == 0) {
				if (cb)
					cb();
				return;
			}
			var op = p == 'opacity';
			function fn(ease) {
				var to = from + ease * delta;
				if (op)
					U.setOpacity(el, to);
				else
					el.style[p] = to + 'px';
			}
			if (!d || (!op && !S.options.animate)
					|| (op && !S.options.animateFade)) {
				fn(1);
				if (cb)
					cb();
				return;
			}
			d *= 1000;
			var begin = new Date().getTime(), end = begin + d, time, timer = setInterval(
					function() {
						time = new Date().getTime();
						if (time >= end) {
							clearInterval(timer);
							fn(1);
							if (cb)
								cb();
						} else
							fn(S.options.ease((time - begin) / d));
					}, 10);
		},
		apply : function(o, e) {
			for ( var p in e)
				o[p] = e[p];
			return o;
		},
		clearOpacity : function(el) {
			var s = el.style;
			if (window.ActiveXObject) {
				if (typeof s.filter == 'string' && (/alpha/i).test(s.filter))
					s.filter = s.filter.replace(/[\w\.]*alpha\(.*?\);?/i, '');
			} else
				s.opacity = '';
		},
		each : function(obj, fn, scope) {
			for ( var i = 0, len = obj.length; i < len; ++i)
				if (fn.call(scope || obj[i], obj[i], i, obj) === false)
					return;
		},
		get : function(id) {
			return document.getElementById(id);
		},
		include : function() {
			var includes = {};
			return function(file) {
				if (includes[file])
					return;
				includes[file] = true;
				document
						.write('<scr' + 'ipt type="text/javascript" src="' + file + '"><\/script>');
			}
		}(),
		isLink : function(obj) {
			if (!obj || !obj.tagName)
				return false;
			var up = obj.tagName.toUpperCase();
			return up == 'A' || up == 'AREA';
		},
		removeChildren : function(el) {
			while (el.firstChild)
				el.removeChild(el.firstChild);
		},
		setOpacity : function(el, o) {
			var s = el.style;
			if (window.ActiveXObject) {
				s.zoom = 1;
				s.filter = (s.filter || '').replace(/\s*alpha\([^\)]*\)/gi, '')
						+ (o == 1 ? '' : ' alpha(opacity=' + (o * 100) + ')');
			} else
				s.opacity = o;
		}
	}, apply = U.apply, each = U.each, init_options, initialized = false, default_options = {}, content_id = 'sb-content', active = false, slide_timer, slide_start, slide_delay = 0, v_cache = [];
	if (navigator.plugins && navigator.plugins.length) {
		var names = [];
		each(navigator.plugins, function(p) {
			names.push(p.name);
		});
		names = names.join();
		var detectPlugin = function(n) {
			return names.indexOf(n) > -1;
		}
		var f4m = detectPlugin('Flip4Mac');
		S.plugins = {
			fla : detectPlugin('Shockwave Flash'),
			qt : detectPlugin('QuickTime'),
			wmp : !f4m && detectPlugin('Windows Media'),
			f4m : f4m
		}
	} else {
		function detectPlugin(n) {
			try {
				var axo = new ActiveXObject(n);
			} catch (e) {
			}
			return !!axo;
		}
		S.plugins = {
			fla : detectPlugin('ShockwaveFlash.ShockwaveFlash'),
			qt : detectPlugin('QuickTime.QuickTime'),
			wmp : detectPlugin('wmplayer.ocx'),
			f4m : false
		}
	}
	function getPlayer(url) {
		var re = S.regex, p = S.plugins, m = url.match(re.domain), d = m
				&& document.domain == m[1];
		if (url.indexOf('#') > -1 && d)
			return 'inline';
		var q = url.indexOf('?');
		if (q > -1)
			url = url.substring(0, q);
		if (re.img.test(url))
			return 'img';
		if (re.swf.test(url))
			return p.fla ? 'swf' : 'unsupported-swf';
		if (re.flv.test(url))
			return p.fla ? 'flv' : 'unsupported-flv';
		if (re.qt.test(url))
			return p.qt ? 'qt' : 'unsupported-qt';
		if (re.wmp.test(url)) {
			if (p.wmp)
				return 'wmp';
			if (p.f4m)
				return 'qt';
			if (S.client.isMac)
				return p.qt ? 'unsupported-f4m' : 'unsupported-qtf4m';
			return 'unsupported-wmp';
		}
		if (re.qtwmp.test(url)) {
			if (p.qt)
				return 'qt';
			if (p.wmp)
				return 'wmp';
			return S.client.isMac ? 'unsupported-qt' : 'unsupported-qtwmp';
		}
		if (!d || re.iframe.test(url))
			return 'iframe';
		return 'unsupported';
	}
	function handleClick(e) {
		var link;
		if (U.isLink(this)) {
			link = this;
		} else {
			link = S.lib.getTarget(e);
			while (!U.isLink(link) && link.parentNode)
				link = link.parentNode;
		}
		if (link) {
			var key = link.shadowboxCacheKey;
			if (typeof key != 'undefined' && typeof S.cache[key] != 'undefined')
				link = S.cache[key];
			S.open(link);
			if (S.gallery.length)
				S.lib.preventDefault(e);
		}
	}
	function listenKeys(on) {
		if (!S.options.enableKeys)
			return;
		S.lib[(on ? 'add' : 'remove') + 'Event']
				(document, 'keydown', handleKey);
	}
	function handleKey(e) {
		var code = S.lib.keyCode(e);
		S.lib.preventDefault(e);
		switch (code) {
		case 81:
		case 88:
		case 27:
			S.close();
			break;
		case 37:
			S.previous();
			break;
		case 39:
			S.next();
			break;
		case 32:
			S[(typeof slide_timer == 'number' ? 'pause' : 'play')]();
		}
	}
	function loadContent() {
		var obj = S.getCurrent();
		if (!obj)
			return;
		var p = obj.player == 'inline' ? 'html' : obj.player;
		if (typeof S[p] != 'function')
			throw 'Unknown player: ' + p;
		var change = false;
		if (S.content) {
			S.content.remove();
			change = true;
			S.revertOptions();
			if (obj.options)
				S.applyOptions(obj.options);
		}
		U.removeChildren(S.skin.bodyEl());
		S.content = new S[p](obj);
		listenKeys(false);
		S.skin.onLoad(S.content, change, function() {
			if (!S.content)
				return;
			if (typeof S.content.ready != 'undefined') {
				var id = setInterval(function() {
					if (S.content) {
						if (S.content.ready) {
							clearInterval(id);
							id = null;
							S.skin.onReady(contentReady);
						}
					} else {
						clearInterval(id);
						id = null;
					}
				}, 100);
			} else
				S.skin.onReady(contentReady);
		});
		if (S.gallery.length > 1) {
			var next = S.gallery[S.current + 1] || S.gallery[0];
			if (next.player == 'img') {
				var a = new Image();
				a.src = next.content;
			}
			var prev = S.gallery[S.current - 1]
					|| S.gallery[S.gallery.length - 1];
			if (prev.player == 'img') {
				var b = new Image();
				b.src = prev.content;
			}
		}
	}
	function contentReady() {
		if (!S.content)
			return;
		S.content.append(S.skin.bodyEl(), content_id, S.dimensions);
		S.skin.onFinish(finishContent);
	}
	function finishContent() {
		if (!S.content)
			return;
		if (S.content.onLoad)
			S.content.onLoad();
		if (S.options.onFinish)
			S.options.onFinish();
		if (!S.isPaused())
			S.play();
		listenKeys(true);
	}
	return S;
}();
Shadowbox.skin = function() {
	var S = Shadowbox, U = S.util, overlay_on = false, png = [ 'sb-nav-close',
			'sb-nav-next', 'sb-nav-play', 'sb-nav-pause', 'sb-nav-previous' ];
	function fixTop() {
		U.get('sb-container').style.top = document.documentElement.scrollTop + 'px';
	}
	function toggleVisible(cb) {
		var so = U.get('sb-overlay'), sc = U.get('sb-container'), sb = U
				.get('sb-wrapper');
		if (cb) {
			if (S.client.isIE6) {
				fixTop();
				S.lib.addEvent(window, 'scroll', fixTop);
			}
			if (S.options.showOverlay) {
				overlay_on = true;
				so.style.backgroundColor = S.options.overlayColor;
				U.setOpacity(so, 0);
				if (!S.options.modal)
					S.lib.addEvent(so, 'click', S.close);
				sb.style.display = 'none';
			}
			sc.style.visibility = 'visible';
			if (overlay_on) {
				var op = parseFloat(S.options.overlayOpacity);
				U.animate(so, 'opacity', op, S.options.fadeDuration, cb);
			} else
				cb();
		} else {
			if (S.client.isIE6)
				S.lib.removeEvent(window, 'scroll', fixTop);
			S.lib.removeEvent(so, 'click', S.close);
			if (overlay_on) {
				sb.style.display = 'none';
				U.animate(so, 'opacity', 0, S.options.fadeDuration, function() {
					sc.style.display = '';
					sb.style.display = '';
					U.clearOpacity(so);
				});
			} else
				sc.style.visibility = 'hidden';
		}
	}
	function toggleNav(id, on) {
		var el = U.get('sb-nav-' + id);
		if (el)
			el.style.display = on ? '' : 'none';
	}
	function toggleLoading(on, cb) {
		var ld = U.get('sb-loading'), p = S.getCurrent().player, anim = (p == 'img' || p == 'html');
		if (on) {
			function fn() {
				U.clearOpacity(ld);
				if (cb)
					cb();
			}
			U.setOpacity(ld, 0);
			ld.style.display = '';
			if (anim)
				U.animate(ld, 'opacity', 1, S.options.fadeDuration, fn);
			else
				fn();
		} else {
			function fn() {
				ld.style.display = 'none';
				U.clearOpacity(ld);
				if (cb)
					cb();
			}
			if (anim)
				U.animate(ld, 'opacity', 0, S.options.fadeDuration, fn);
			else
				fn();
		}
	}
	function buildBars(cb) {
		var obj = S.getCurrent();
		U.get('sb-title-inner').innerHTML = obj.title || '';
		var c, n, pl, pa, p;
		if (S.options.displayNav) {
			c = true;
			var len = S.gallery.length;
			if (len > 1) {
				if (S.options.continuous)
					n = p = true;
				else {
					n = (len - 1) > S.current;
					p = S.current > 0;
				}
			}
			if (S.options.slideshowDelay > 0 && S.hasNext()) {
				pa = !S.isPaused();
				pl = !pa;
			}
		} else {
			c = n = pl = pa = p = false;
		}
		toggleNav('close', c);
		toggleNav('next', n);
		toggleNav('play', pl);
		toggleNav('pause', pa);
		toggleNav('previous', p);
		var c = '';
		if (S.options.displayCounter && S.gallery.length > 1) {
			var count = S.getCounter();
			if (typeof count == 'string')
				c = count;
			else {
				U.each(count, function(i) {
					c += '<a onclick="Shadowbox.change(' + i + ');"'
					if (i == S.current)
						c += ' class="sb-counter-current"';
					c += '>' + (i + 1) + '</a>';
				});
			}
		}
		U.get('sb-counter').innerHTML = c;
		cb();
	}
	function hideBars(anim, cb) {
		var sw = U.get('sb-wrapper'), st = U.get('sb-title'), si = U
				.get('sb-info'), ti = U.get('sb-title-inner'), ii = U
				.get('sb-info-inner'), t = parseInt(S.lib
				.getStyle(ti, 'height')) || 0, b = parseInt(S.lib.getStyle(ii,
				'height')) || 0;
		function fn() {
			ti.style.visibility = ii.style.visibility = 'hidden';
			buildBars(cb);
		}
		if (anim) {
			U.animate(st, 'height', 0, 0.35);
			U.animate(si, 'height', 0, 0.35);
			U.animate(sw, 'paddingTop', t, 0.35);
			U.animate(sw, 'paddingBottom', b, 0.35, fn);
		} else {
			st.style.height = si.style.height = '0px';
			sw.style.paddingTop = t + 'px';
			sw.style.paddingBottom = b + 'px';
			fn();
		}
	}
	function showBars(cb) {
		var sw = U.get('sb-wrapper'), st = U.get('sb-title'), si = U
				.get('sb-info'), ti = U.get('sb-title-inner'), ii = U
				.get('sb-info-inner'), t = parseInt(S.lib
				.getStyle(ti, 'height')) || 0, b = parseInt(S.lib.getStyle(ii,
				'height')) || 0;
		ti.style.visibility = ii.style.visibility = '';
		if (ti.innerHTML != '') {
			U.animate(st, 'height', t, 0.35);
			U.animate(sw, 'paddingTop', 0, 0.35);
		}
		U.animate(si, 'height', b, 0.35);
		U.animate(sw, 'paddingBottom', 0, 0.35, cb);
	}
	function adjustHeight(height, top, anim, cb) {
		var sb = U.get('sb-body'), s = U.get('sb-wrapper'), h = parseInt(height), t = parseInt(top);
		if (anim) {
			U.animate(sb, 'height', h, S.options.resizeDuration);
			U.animate(s, 'top', t, S.options.resizeDuration, cb);
		} else {
			sb.style.height = h + 'px';
			s.style.top = t + 'px';
			if (cb)
				cb();
		}
	}
	function adjustWidth(width, left, anim, cb) {
		var s = U.get('sb-wrapper'), w = parseInt(width), l = parseInt(left);
		if (anim) {
			U.animate(s, 'width', w, S.options.resizeDuration);
			U.animate(s, 'left', l, S.options.resizeDuration, cb);
		} else {
			s.style.width = w + 'px';
			s.style.left = l + 'px';
			if (cb)
				cb();
		}
	}
	function resizeContent(cb) {
		var c = S.content;
		if (!c)
			return;
		var d = setDimensions(c.height, c.width, c.resizable);
		switch (S.options.animSequence) {
		case 'hw':
			adjustHeight(d.inner_h, d.top, true, function() {
				adjustWidth(d.width, d.left, true, cb);
			});
			break;
		case 'wh':
			adjustWidth(d.width, d.left, true, function() {
				adjustHeight(d.inner_h, d.top, true, cb);
			});
			break;
		default:
			adjustWidth(d.width, d.left, true);
			adjustHeight(d.inner_h, d.top, true, cb);
		}
	}
	function setDimensions(height, width, resizable) {
		var sbi = U.get('sb-body-inner')
		sw = U.get('sb-wrapper'), so = U.get('sb-overlay'),
				tb = sw.offsetHeight - sbi.offsetHeight, lr = sw.offsetWidth
						- sbi.offsetWidth, max_h = so.offsetHeight,
				max_w = so.offsetWidth;
		return S.setDimensions(height, width, max_h, max_w, tb, lr, resizable);
	}
	return {
		markup : '<div id="sb-container">'
				+ '<div id="sb-overlay"></div>'
				+ '<div id="sb-wrapper">'
				+ '<div id="sb-title">'
				+ '<div id="sb-title-inner"></div>'
				+ '</div>'
				+ '<div id="sb-body">'
				+ '<div id="sb-body-inner"></div>'
				+ '<div id="sb-loading">'
				+ '<a onclick="Shadowbox.close()">{cancel}</a>'
				+ '</div>'
				+ '</div>'
				+ '<div id="sb-info">'
				+ '<div id="sb-info-inner">'
				+ '<div id="sb-counter"></div>'
				+ '<div id="sb-nav">'
				+ '<a id="sb-nav-close" title="{close}" onclick="Shadowbox.close()"></a>'
				+ '<a id="sb-nav-next" title="{next}" onclick="Shadowbox.next()"></a>'
				+ '<a id="sb-nav-play" title="{play}" onclick="Shadowbox.play()"></a>'
				+ '<a id="sb-nav-pause" title="{pause}" onclick="Shadowbox.pause()"></a>'
				+ '<a id="sb-nav-previous" title="{previous}" onclick="Shadowbox.previous()"></a>'
				+ '</div>' + '<div style="clear:both"></div>' + '</div>'
				+ '</div>' + '</div>' + '</div>',
		options : {
			animSequence : 'sync'
		},
		init : function() {
			if (S.client.isIE6) {
				U.get('sb-body').style.zoom = 1;
				var el, m, re = /url\("(.*\.png)"\)/;
				U
						.each(
								png,
								function(id) {
									el = U.get(id);
									if (el) {
										m = S.lib.getStyle(el,
												'backgroundImage').match(re);
										if (m) {
											el.style.backgroundImage = 'none';
											el.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,src=' + m[1] + ',sizingMethod=scale);';
										}
									}
								});
			}
		},
		bodyEl : function() {
			return U.get('sb-body-inner');
		},
		onOpen : function(h, w, cb) {
			U.get('sb-container').style.display = 'block';
			var d = setDimensions(h, w);
			adjustHeight(d.inner_h, d.top, false);
			adjustWidth(d.width, d.left, false);
			toggleVisible(cb);
		},
		onLoad : function(content, change, cb) {
			toggleLoading(true);
			hideBars(change, function() {
				if (!content)
					return;
				if (!change)
					U.get('sb-wrapper').style.display = '';
				cb();
			});
		},
		onReady : function(cb) {
			resizeContent(function() {
				showBars(cb);
			});
		},
		onFinish : function(cb) {
			toggleLoading(false, cb);
		},
		onClose : function() {
			toggleVisible(false);
		},
		onPlay : function() {
			toggleNav('play', false);
			toggleNav('pause', true);
		},
		onPause : function() {
			toggleNav('pause', false);
			toggleNav('play', true);
		},
		onWindowResize : function() {
			var c = S.content;
			if (!c)
				return;
			var d = setDimensions(c.height, c.width, c.resizable);
			adjustWidth(d.width, d.left, false);
			adjustHeight(d.inner_h, d.top, false);
			var el = U.get(S.contentId());
			if (el) {
				if (c.resizable && S.options.handleOversize == 'resize') {
					el.height = d.resize_h;
					el.width = d.resize_w;
				}
			}
		}
	};
}();
