Your IP : 216.73.216.240


Current Path : /home/sunflowe/www2/vacancesfloride/_AncienSite/plugins/system/jcemediabox/js/
Upload File :
Current File : /home/sunflowe/www2/vacancesfloride/_AncienSite/plugins/system/jcemediabox/js/jcemediabox-src.js

/**
* JCEMediaBox 1.0.5
*
* @version 		$Id: jcemediabox.js 533 2010-02-17 13:03:58Z happynoodleboy $
* @package 		JCEMediaBox
* @copyright 	Copyright (C) 2006-2009 Ryan Demmer. All rights reserved.
* @copyright	Copyright 2009, Moxiecode Systems AB
* @license 		http://www.gnu.org/copyleft/lgpl.html GNU/LGPL
* 
*/
(function() {
	window.JCEMediaBox = {
		/**
		 * Global Options Object
		 */
		options : {
			popup : {
				width				: '',
				height				: '',
				legacy				: 0,
				overlay				: 1,
				overlayopacity 		: 0.8,
				overlaycolor		: '#000000',
				resize				: 0,	
				icons				: 1,
				fadespeed			: 500,
				scalespeed			: 500,
				hideobjects			: 1,
				scrolling			: 'fixed',
				//protect				: 1,
				labels			: {
					'close' 	: 'Close',
					'next'		: 'Next',
					'previous' 	: 'Previous',
					'numbers'	: '{$current} of {$total}',
					'cancel'	: 'Cancel'
				}
			},
			tooltip : {
				speed				: 150,
				offsets				: {x: 16, y : 16},
				position			: 'br',
				opacity				: 0.8,
				background			: '#000000',
				color				: '#ffffff'
			},
			base				: '/',
			pngfix				: false,
			pngfixclass			: '',
			theme				: 'standard',
			themecustom			: '',
			themepath			: 'plugins/system/jcemediabox/themes',
			imgpath				: 'plugins/system/jcemediabox/img'
		},
		init : function(options) {			
			this.extend(this.options, options);
			// Clear IE6 background cache
			if (this.isIE6) try {
				document.execCommand("BackgroundImageCache", false, true);
			} catch(e){};
			this.ready();
		},
		/**
		 * Function to determine if DOM is ready.
		 * Based on JQuery 'bindReady' function - http://jquery.com/
 		 * Copyright (c) 2009 John Resig
		 */
		ready : function() {
			// Mozilla, Opera and webkit nightlies currently support this event
			if (document.addEventListener) {
				// Use the handy event callback
				document.addEventListener("DOMContentLoaded", function() {
					document.removeEventListener("DOMContentLoaded", arguments.callee, false);
					return JCEMediaBox._init();
				}, false);
		
			// If IE event model is used
			} else if (document.attachEvent) {
				// ensure firing before onload,
				// maybe late but safe also for iframes
				document.attachEvent("onreadystatechange", function() {
					if (document.readyState === "complete") {
						document.detachEvent("onreadystatechange", arguments.callee);
						return JCEMediaBox._init();
					}
				});
		
				// If IE and not an iframe
				// continually check to see if the document is ready
				if (document.documentElement.doScroll && window == window.top) (function() {
					if (JCEMediaBox.domLoaded) return;
		
					try {
						// If IE is used, use the trick by Diego Perini
						// http://javascript.nwbox.com/IEContentLoaded/
						document.documentElement.doScroll("left");
					} catch(error) {
						setTimeout(arguments.callee, 0);
						return;
					}
		
					// and execute any waiting functions
					return JCEMediaBox._init();
				})();
			}
		
			// A fallback to window.onload, that will always work
			JCEMediaBox.Event.add(window, "load", function() {
				return JCEMediaBox._init();
			} );
		},
		
		/**
		 * Get the Site Base URL
		 * @method getSite
		 * @return {String} Site Base URL
		 */
		getSite : function() {			
			var base = this.options.base;
			
			if (base) {
				// Get document location
				var site 	= document.location.href;			
				// Split into port (http) and location
				var parts 	= site.split(':\/\/');
				
				var port 	= parts[0];
				var url 	= parts[1];

				// Get url part before base
				if (url.indexOf(base) != -1) {
					url = url.substr(0, url.indexOf(base));
				// Get url part before first slash
				} else {
					url = url.substr(0, url.indexOf('/')) || url;
				}
				// Return full url
				return port + '://' + url + base;
			}
			// Can't get site URL!
			return null;
		},
		
		/**
		 * Private internal function
		 * Initialize JCEMediaBox
		 */
		_init : function() {
			if (this.domLoaded) return;
			
			this.domLoaded = true;
			
			var t = this, d = document, na = navigator, ua = na.userAgent;		
			/**
			 * Constant that is true if the browser is Opera.
			 *
			 * @property isOpera
			 * @type Boolean
			 * @final
			 */
			t.isOpera = window.opera && opera.buildNumber;

			/**
			 * Constant that is true if the browser is WebKit (Safari/Chrome).
			 *
			 * @property isWebKit
			 * @type Boolean
			 * @final
			 */
			t.isWebKit = /WebKit/.test(ua);

			/**
			 * Constant that is true if the browser is IE.
			 *
			 * @property isIE
			 * @type Boolean
			 * @final
			 */
			t.isIE = !t.isWebKit && !t.isOpera && (/MSIE/gi).test(ua) && (/Explorer/gi).test(na.appName);

			/**
			 * Constant that is true if the browser is IE 6 or older.
			 *
			 * @property isIE6
			 * @type Boolean
			 * @final
			 */
			t.isIE6 = t.isIE && /MSIE [56]/.test(ua);
			
			/**
			 * Constant that is true if the browser is IE 7.
			 *
			 * @property isIE7
			 * @type Boolean
			 * @final
			 */
			t.isIE7 = t.isIE && /MSIE [7]/.test(ua);
			
			/**
			 * Get the Site URL
			 * @property site
			 * @type String
			 */
			this.site = this.getSite();
			// Can't get reliable site URL
			if(!this.site) return false;

			// Initialize Popup / Tooltip creation	
			this.Popup.init();
			this.ToolTip.init();
		},
		/**
		 * Performs an iteration of all items in a collection such as an object or array. This method will execure the
		 * callback function for each item in the collection, if the callback returns false the iteration will terminate.
		 * The callback has the following format: cb(value, key_or_index).
		 *
		 * @method each
		 * @param {Object} o Collection to iterate.
		 * @param {function} cb Callback function to execute for each item.
		 * @param {Object} s Optional scope to execute the callback in.
		 * @copyright	Copyright 2009, Moxiecode Systems AB
		 */
		each : function(o, cb, s) {
			var n, l;

			if (!o)
				return 0;

			s = s || o;

			if (o.length !== undefined) {
				// Indexed arrays, needed for Safari
				for (n=0, l = o.length; n < l; n++) {
					if (cb.call(s, o[n], n, o) === false)
						return 0;
				}
			} else {
				// Hashtables
				for (n in o) {
					if (o.hasOwnProperty(n)) {
						if (cb.call(s, o[n], n, o) === false)
							return 0;
					}
				}
			}

			return 1;
		},
		/**
		 * Extends an object with the specified other object(s).
		 *
		 * @method extend
		 * @param {Object} o Object to extend with new items.
		 * @param {Object} e..n Object(s) to extend the specified object with.
		 * @return {Object} o New extended object, same reference as the input object.
		 * @copyright	Copyright 2009, Moxiecode Systems AB 
		 */
		extend : function(o, e) {
			var t = JCEMediaBox, i, l, a = arguments;

			for (i = 1, l = a.length; i < l; i++) {
				e = a[i];

				t.each(e, function(v, n) {
					if (v !== undefined)
						o[n] = v;
				});
			}

			return o;
		},
		
		/**
		 * Removes whitespace from the beginning and end of a string.
		 *
		 * @method trim
		 * @param {String} s String to remove whitespace from.
		 * @return {String} New string with removed whitespace.
		 * @copyright	Copyright 2009, Moxiecode Systems AB
		 */
		trim : function(s) {
			return (s ? '' + s : '').replace(/^\s*|\s*$/g, '');
		},
		
		/**
		 * DOM functions
		 */
		DOM : {
			/**
			 * Get an Element by ID
			 * @param {Object} s ID
			 */
			get : function(s) {
				if (typeof(s) == 'string')
					return document.getElementById(s);
					
				return s;
			},
			
			/**
			 * Return elements matching a simple selector, eg: a, a[id], a.classname
			 * @param {Object} p Selector
			 * @param {Object} o Parent Element
			 */
			select : function(p, o) {
				 var t = this, r = [], s, parts, at, tag, each = JCEMediaBox.each;
				 o = o || document;
				 // Return all elements
				 if (p == '*') {
				 	return o.getElementsByTagName(p);
				 }
				 // Use native support if available
				 if (o.querySelectorAll) {
					return o.querySelectorAll(p);
				 }
				 
				 /**
				  * Internal inArray function
				  * @param {Object} a Array to check
				  * @param {Object} s Key to check for
				  */				 
				 function inArray(a, v) {
					var i, l;
		
					if (a) {
						for (i = 0, l = a.length; i < l; i++) {
							if (a[i] === v)
								return true;
						}
					}
		
					return false;
				}

				 // Split selector
				 s = p.split(',');
				 each(s, function(selectors){
				 	parts = JCEMediaBox.trim(selectors).split('.');
					// Element
					tag = parts[0] || '*';
					// Class
					cl = parts[1] || '';
					// Handle attributes
					if (/\[(.*?)\]/.test(tag)) {
						tag = tag.replace(/(.*?)\[(.*?)\]/, function(a, b, c){
							at = c;
							return b;
						});
					}
					// Get all elements for the given parent and tag
					var elements = o.getElementsByTagName(tag);

					// If class or attribute
					if (cl || at) {
						each(elements, function(el){
							// If class
							if (cl) {
								if(t.hasClass(el, cl)) {
									if (!inArray(r, el)) {
										r.push(el);
									}
								}
							}
							// If attribute
							if (at) {
								if (el.getAttribute(at)) {
									if (!inArray(r, el)) {
										r.push(el);
									}
								}	
							}
						});
					} else {
						r = elements;
					}
				 });
				 return r;
			},
			
			/**
			 * Check if an element has a specific class
			 * @param {Object} el Element
			 * @param {Object} c Class
			 */
			hasClass : function(el, c) {
				return new RegExp(c).test(el.className);
			},
			
			/**
			 * Add a class to an element
			 * @param {Object} el Element
			 * @param {Object} c Class
			 */
			addClass : function(el, c) {
				if (!this.hasClass(el, c)) {
					el.className = JCEMediaBox.trim(el.className + ' ' + c);
				}
			},
			
			/**
			 * Remove a class from an element
			 * @param {Object} el Element
			 * @param {Object} c Class to remove
			 */
			removeClass : function(el, c) {
				if (this.hasClass(el, c)) {
					var s = el.className;
					var re = new RegExp("(^|\\s+)" + c + "(\\s+|$)", "g");
					var v = s.replace(re, ' ');
					v = v.replace(/^\s|\s$/g, '');
					el.className = v;
				}
			},
			
			/**
			 * Show an element
			 * @param {Object} el Element to show
			 */
			show : function(el) {
				el.style.display = 'block';
			},
			
			/**
			 * Hide and element
			 * @param {Object} el Element to hide
			 */
			hide : function(el) {
				el.style.display = 'none';
			},
			
			/**
			 * Remove an element
			 * @param {Object} el Element to remove
			 */
			remove : function(el) {
				var p = el.parentNode || document.body;
				p.removeChild(el);
			},
			
			/**
			 * Set or retrieve a style
			 * @param {Object} el Target Element
			 * @param {Object} s Style to set / get
			 * @param {Object} v Value to set
			 */
			style : function(n, na, v) {
				var isIE = JCEMediaBox.isIE, r, s;
				
				// Camelcase it, if needed
				na = na.replace(/-(\D)/g, function(a, b){
					return b.toUpperCase();
				});

				s = n.style;

				// Get value
				if (typeof v == 'undefined') {
					
					if (na == 'float')
						na = isIE ? 'styleFloat' : 'cssFloat';
					
					r = s[na];

					if (document.defaultView && !r) {						
						if (/float/i.test(na)) na = 'float';
						
						// Remove camelcase
						na = na.replace(/[A-Z]/g, function(a){
							return '-' + a;
						}).toLowerCase();

						try {
							r = document.defaultView.getComputedStyle(n, null).getPropertyValue(na);
						} catch (e) {}
					}

					if (n.currentStyle && !r)
						r = n.currentStyle[na];
						
					return r;
					
				} else {
					
					switch (na) {
						case 'opacity':
							v = parseFloat(v);
							// IE specific opacity
							if (isIE) {
								s.filter = v === '' ? '' : "alpha(opacity=" + (v * 100) + ")";
	
								if (!n.currentStyle || !n.currentStyle.hasLayout)
									s.display = 'inline-block';
							}
							s[na] = v;
							break;
						case 'float':
							na = isIE ? 'styleFloat' : 'cssFloat';
							break;
						default:
							if (v && /(margin|padding|width|height|top|bottom|left|right)/.test(na)) {
								// Add pixel value if number
								v = /^[\-0-9\.]+$/.test(v) ? v + 'px' : v;
							}
							break;
					}
					s[na] = v;
				}
			},
			
			/**
			 * Set styles
			 * @param {Object} el Target Element
			 * @param {Object} props Object of style key/values
			 */
			styles : function(el, props) {
				var t = this;
				JCEMediaBox.each(props, function(v, s){
					return t.style(el, s, v);
				});
			},
			
			/**
			 * Set an Element attribute
			 * @param {Object} el
			 * @param {Object} s
			 * @param {Object} v
			 */
			attribute : function(el, s, v) {
				if (typeof v == 'undefined') {
					if (s == 'class') {
						return el.className;
					}
					v = el.getAttribute(s);
					// Remove anonymous function from events
					if (/^on/.test(s)) {
						v = v.replace(/^function\s+anonymous\(\)\s+\{\s+(.*)\s+\}$/, '$1');
					}
					// Fix Hspace
					if (s == 'hspace' && v == -1) {
						v = '';
					}
					return v;
				}
				// Remove attribute if no value
				if (v === '') {
					el.removeAttribute(s);
				}

				switch(s) {
					case 'style' :
						if (typeof v == 'object') {
							this.styles(el, v);
						} else {
							el.style.cssText = v;
						}
						break;
					case 'class' :
						el.className = v || '';
						break;
					default:
						el.setAttribute(s, v);
						break;
				}
			},
			
			/**
			 * Set Attributes on an Element
			 * @param {Object} el Target Element
			 * @param {Object} attribs Attributes Object
			 */
			attributes : function(el, attribs) {
				var t = this;
				JCEMediaBox.each(attribs, function(v, s){
					t.attribute(el, s, v);
				});
			},
			
			/**
			 * Create an Element
			 * @param {Object} el Element to create
			 * @param {Object} attribs Attributes
			 * @param {Object} styles Styles
			 * @param {Object} html HTML
			 */
			create : function(el, attribs, html) {
				var o = document.createElement(el);
				this.attributes(o, attribs);
				if (typeof html != 'undefined') {
					o.innerHTML = html;
				}
				
				return o;
			},
			
			/**
			 * Add an element to another
			 * @param {Object} n Element to add to
			 * @param {Object} o Element to add. Will be created if string
			 * @param {Object} a Optional attributes
			 * @param {Object} h Optional HTML
			 */
			add : function(n, o, a, h) {
				if (typeof o == 'string') {
					a = a || {};
					o = this.create(o, a, h);
				}
				n.appendChild(o);
				
				return o;
			},
			
			/**
			 * Add an element before the passed in element
			 * @param {Object} n Element to insert into
			 * @param {Object} o Element to insert
			 * @param {Object} c Element to insert before
			 */
			addBefore : function(n, o, c) {
				if (typeof c == 'undefined') {
					c = n.firstChild;
				}
				n.insertBefore(o, c);
			},
			
			/**
			 * IE6 PNG Fix
			 * @param {Object} el Element to fix
			 */
			png : function(el){
				var s;
				// Image Elements
				if (el.nodeName == 'IMG') {
					s = el.src;
					if (/\.png$/i.test(s)) {
						this.attribute(el, 'src', JCEMediaBox.site + 'plugins/system/jcemediabox/img/blank.gif');
						this.style(el, 'filter', "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + s + "')");
					}
				// Background-image styles
				} else {
					s = this.style(el, 'background-image');
					if (/\.png/i.test(s)) {
						var bg = /url\("(.*)"\)/.exec(s)[1];
						this.styles(el, {
							'background-image' 	: 'none',
							'filter' 			: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + bg + "', sizingMethod='image')"
						});
					}
				}
			}
		},
		/**
		 * Event Functions
		 */
		Event : {
			events : [],
			/**
			 * Add an Event handler
			 * @param {Object} o Target Element
			 * @param {Object} n Event name
			 * @param {Object} f Callback function
			 * @param {Object} s Scope
			 * @copyright	Copyright 2009, Moxiecode Systems AB
			 */
			add : function(o, n, f, s) {
				var t = this;
				
				// Setup event callback
				cb = function(e) {
					// Is all events disabled
					if (t.disabled)
						return;
	
					e = e || window.event;

					// Patch in target, preventDefault and stopPropagation in IE it's W3C valid
					if (e && JCEMediaBox.isIE) {
						if (!e.target) {
							e.target = e.srcElement || document;
						}

						if (!e.relatedTarget && e.fromElement) {
							e.relatedTarget = e.fromElement == e.target ? e.toElement : e.fromElement;
						}

						// Patch in preventDefault, stopPropagation methods for W3C compatibility
						JCEMediaBox.extend(e, {
							preventDefault :  function() {
								this.returnValue = false;
							},
				
							stopPropagation : function() {
								this.cancelBubble = true;
							}
						});
					}
					if (e && JCEMediaBox.isWebKit) {
						if (e.target.nodeType == 3) {
							e.target = e.target.parentNode;
						}	
					}			
	
					if (!s)
						return f(e);
	
					return f.call(s, e);
				};
				// Internal function to add an event to an object
				function _add(o, n, f) {
					if (o.attachEvent) {
						o.attachEvent('on' + n, f);
					} else 
						if (o.addEventListener) {
							o.addEventListener(n, f, false);
						} else {
							o['on' + n] = f;
						}
				}
				
				t.events.push({
					obj 	: o,
					name 	: n,
					func 	: f,
					cfunc 	: cb,
					scope 	: s
				});
				
				// Add event
				_add(o, n, cb);
			},
			/**
			 * Removes the specified event handler by name and function from a element or collection of elements.
			 *
			 * @method remove
			 * @param {String/Element/Array} o Element ID string or HTML element or an array of elements or ids to remove handler from.
			 * @param {String} n Event handler name like for example: "click"
			 * @param {function} f Function to remove.
			 * @return {bool/Array} Bool state if true if the handler was removed or an array with states if multiple elements where passed in.
			 * @copyright	Copyright 2009, Moxiecode Systems AB
			 */
			remove : function(o, n, f) {
				var t = this, a = t.events, s = false, r;

				JCEMediaBox.each(a, function(e, i) {
					if (e.obj == o && e.name == n && (!f || (e.func == f || e.cfunc == f))) {
						a.splice(i, 1);
						t._remove(o, n, e.cfunc);
						s = true;
						return false;
					}
				});
	
				return s;
			},
			/**
			 * Internal function to remove an Event
			 * @param {Object} o
			 * @param {Object} n
			 * @param {Object} f
			 * @copyright	Copyright 2009, Moxiecode Systems AB
			 */
			_remove : function(o, n, f) {
				if (o) {
					try {
						if (o.detachEvent)
							o.detachEvent('on' + n, f);
						else if (o.removeEventListener)
							o.removeEventListener(n, f, false);
						else
							o['on' + n] = null;
					} catch (ex) {
						// Might fail with permission denined on IE so we just ignore that
					}
				}
			},
			/**
			 * Cancels an event for both bubbeling and the default browser behavior.
			 *
			 * @method cancel
			 * @param {Event} e Event object to cancel.
			 * @return {Boolean} Always false.
			 * @copyright Copyright 2009, Moxiecode Systems AB
			 */
			cancel : function(e) {
				if (!e)
					return false;
	
				this.stop(e);
	
				return this.prevent(e);
			},
	
			/**
			 * Stops propogation/bubbeling of an event.
			 *
			 * @method stop
			 * @param {Event} e Event to cancel bubbeling on.
			 * @return {Boolean} Always false.
			 * @copyright	Copyright 2009, Moxiecode Systems AB
			 */
			stop : function(e) {
				if (e.stopPropagation)
					e.stopPropagation();
				else
					e.cancelBubble = true;
	
				return false;
			},
	
			/**
			 * Prevent default browser behvaior of an event.
			 *
			 * @method prevent
			 * @param {Event} e Event to prevent default browser behvaior of an event.
			 * @return {Boolean} Always false.
			 * @copyright	Copyright 2009, Moxiecode Systems AB
			 */
			prevent : function(e) {
				if (e.preventDefault)
					e.preventDefault();
				else
					e.returnValue = false;
	
				return false;
			},
			
			/**
			 * Destroys the instance.
			 *
			 * @method destroy
			 * @copyright	Copyright 2009, Moxiecode Systems AB
			 */
			destroy : function() {
				var t = this;
	
				JCEMediaBox.each(t.events, function(e, i) {
					t._remove(e.obj, e.name, e.cfunc);
					e.obj = e.cfunc = null;
				});
	
				t.events = [];
				t = null;
			},
			
			/**
			 * Adds an unload handler to the document. This handler will be executed when the document gets unloaded.
			 * This method is useful for dealing with browser memory leaks where it might be vital to remove DOM references etc.
			 *
			 * @method addUnload
			 * @param {function} f Function to execute before the document gets unloaded.
			 * @param {Object} s Optional scope to execute the function in.
			 * @return {function} Returns the specified unload handler function.
			 * @copyright	Copyright 2009, Moxiecode Systems AB
			 */
			addUnload : function(f, s) {
				var t = this;
	
				f = {func : f, scope : s || this};
	
				if (!t.unloads) {
					function unload() {
						var li = t.unloads, o, n;
	
						if (li) {
							// Call unload handlers
							for (n in li) {
								o = li[n];
	
								if (o && o.func)
									o.func.call(o.scope, 1); // Send in one arg to distinct unload and user destroy
							}
	
							// Detach unload function
							if (window.detachEvent) {
								window.detachEvent('onbeforeunload', fakeUnload);
								window.detachEvent('onunload', unload);
							} else if (window.removeEventListener)
								window.removeEventListener('unload', unload, false);
	
							// Destroy references
							t.unloads = o = li = w = unload = 0;
	
							// Run garbarge collector on IE
							if (window.CollectGarbage)
								CollectGarbage();
						}
					};
	
					function fakeUnload() {
						var d = document;
	
						// Is there things still loading, then do some magic
						if (d.readyState == 'interactive') {
							function stop() {
								// Prevent memory leak
								d.detachEvent('onstop', stop);
	
								// Call unload handler
								if (unload)
									unload();
	
								d = 0;
							};
	
							// Fire unload when the currently loading page is stopped
							if (d)
								d.attachEvent('onstop', stop);
	
							// Remove onstop listener after a while to prevent the unload function
							// to execute if the user presses cancel in an onbeforeunload
							// confirm dialog and then presses the browser stop button
							window.setTimeout(function() {
								if (d)
									d.detachEvent('onstop', stop);
							}, 0);
						}
					};
	
					// Attach unload handler
					if (window.attachEvent) {
						window.attachEvent('onunload', unload);
						window.attachEvent('onbeforeunload', fakeUnload);
					} else if (window.addEventListener)
						window.addEventListener('unload', unload, false);
	
					// Setup initial unload handler array
					t.unloads = [f];
				} else
					t.unloads.push(f);
	
				return f;
			},
	
			/**
			 * Removes the specified function form the unload handler list.
			 *
			 * @method removeUnload
			 * @param {function} f Function to remove from unload handler list.
			 * @return {function} Removed function name or null if it wasn't found.
			 */
			removeUnload : function(f) {
				var u = this.unloads, r = null;
	
				JCEMediaBox.each(u, function(o, i) {
					if (o && o.func == f) {
						u.splice(i, 1);
						r = f;
						return false;
					}
				});
	
				return r;
			}
		},
		Dimensions : {
			/**
			 * Get client window width
			 */
			getWidth: function(){
				return document.documentElement.clientWidth || document.body.clientWidth || this.innerWidth || 0;
			},
			/**
			 * Get client window height
			 */	
			getHeight: function(){
				return document.documentElement.clientHeight || document.body.clientHeight || this.innerHeight || 0;
			},
			/**
			 * Get client window scroll height
			 */
			getScrollHeight: function(){
				return document.documentElement.scrollHeight || document.body.scrollHeight || 0;
			},
			/**
			 * Get client window scroll width
			 */	
			getScrollWidth: function(){
				return document.documentElement.scrollWidth || document.body.scrollWidth || 0;
			},
			/**
			 * Get client window scroll top
			 */
			getScrollTop: function(){
				return document.documentElement.scrollTop || this.pageYOffset || document.body.scrollTop || 0;
			},
			/**
			 * Get the page scrollbar width
			 */
			getScrollbarWidth: function() {
		        var each = JCEMediaBox.each, DOM = JCEMediaBox.DOM;
				
				if (this.scrollbarWidth) {
					return this.scrollbarWidth;
				}

				var outer = DOM.add(document.body, 'div', {
					'style' : {
						position	: 'absolute', 
						visibility	: 'hidden', 
						width		: 200,
						height		: 200,
						border		: 0,
						margin		: 0,
						padding		: 0,
						overflow	: 'hidden'
					}
				});
				
				var inner = DOM.add(outer, 'div', {
					'style' : {
						width	: '100%', 
						height	: 200,
						border	: 0,
						margin	: 0,
						padding	: 0
					}
				});
				
		        var w1 = parseInt(inner.offsetWidth);
		        outer.style.overflow = 'scroll';
		        var w2 = parseInt(inner.offsetWidth);
		        if(w1 == w2){
					w2 = parseInt(outer.clientWidth);
				}
				document.body.removeChild(outer);
				this.scrollbarWidth = (w1 - w2);
				
				return this.scrollbarWidth;
		    },
			/**
			 * Get the outerwidth of an element
			 * @param {Object} n Element
			 */
			outerWidth : function(n){
				var v = 0, x = 0;
				
				x = n.offsetWidth;
				
				if (!x) {
					JCEMediaBox.each(['padding-left', 'padding-right', 'border-left', 'border-right', 'width'], function(s){
						v = parseFloat(JCEMediaBox.DOM.style(n, s));
						v = /[0-9]/.test(v) ? v : 0;
						x = x + v;
					});
				}
				return x;
			},
			/**
			 * Get the outerheight of an Element
			 * @param {Object} n Element
			 */
			outerHeight : function(n){
				var v = 0, x = 0;
				
				x = n.offsetHeight;
				
				if (!x) {
					JCEMediaBox.each(['padding-top', 'padding-bottom', 'border-top', 'border-bottom', 'height'], function(s){
						v = parseFloat(JCEMediaBox.DOM.style(n, s));
						v = /[0-9]/.test(v) ? v : 0;
						x = x + v;
					});
				}		
				return x;
			}
		},
		
		/**
		 * FX Functions
		 * @param {Object} t
		 * @param {Object} b
		 * @param {Object} c
		 * @param {Object} d
		 */
		FX : {			
			animate : function(el, props, speed, cb) {
				var DOM = JCEMediaBox.DOM;
				var options = {
					speed 		: speed || 100,
					callback	: cb || function(){}
				};
				
				var styles = {};

				JCEMediaBox.each(props, function(v, s){			
					// Find start value
					sv = parseFloat(DOM.style(el, s));
					styles[s] = [sv, v];
				});
				new JCEMediaBox.fx(el, options).custom(styles);
				return true;
			}
		}
	};
	
	/**
	 * XHR Functions
	 * Based on XHR.js
	 * copyright (c) 2007 Valerio Proietti, <http://mad4milk.net>
	 */
	JCEMediaBox.XHR = function(options, scope) {
		this.options = {
			method 	: 'GET',
			async 	: true, 
			headers : {},
			data	: null,
			encoding: 'utf-8',
			success : function(){},
			error	: function(){}
		};
		// Set options
		JCEMediaBox.extend(this.options, options);	
		// optional scope for callback functions
		this.scope = scope || this;
	};
	JCEMediaBox.XHR.prototype = {
		/**
		 * Set transport method
		 */
		setTransport : function() {
			this.transport = (window.XMLHttpRequest) ? new XMLHttpRequest() : (JCEMediaBox.isIE ? new ActiveXObject('Microsoft.XMLHTTP') : false);
		},
		/**
		 * Process return
		 */
		onStateChange: function(){
			if (this.transport.readyState != 4 || !this.running) {
				return;
			}
			
			this.running = false;
			var status = 0;
			
			if ((this.transport.status >= 200) && (this.transport.status < 300)) {
				var s = this.transport.responseText;
				var x = this.transport.responseXML;
				
				this.options.success.call(this.scope, s, x);
			} else {
				this.options.error.call(this.scope, this.transport, this.options);
			}
			// Clean up
			this.transport.onreadystatechange = function(){};
			this.transport = null;
		},
		/**
		 * Send request
		 * @param {Object} url URL
		 * @param {Object} options Request options
		 * @param {Object} s Scope
		 */
		send: function(url) {
			var t = this, extend = JCEMediaBox.extend;
			if (this.running) {
				return this;
			}
			this.running = true;
			// Set request transport method
			this.setTransport();
			// store request method as uppercase (GET|POST)
			var method = this.options.method.toUpperCase();
			// Set URL Encoded / POST header options
			if (this.options.urlEncoded && method == 'POST') {
				var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : '';
				extend(this.options.headers, {
					'Content-type': 'application/x-www-form-urlencoded' + encoding
				});
			}
			// Open transport
			this.transport.open(method, url, this.options.async);
			// Set readystatechange function
			this.transport.onreadystatechange = function(){
 				return t.onStateChange();
 			};
			
			if ((this.options.method == 'post') && this.transport.overrideMimeType) {
				extend(this.options.headers, {
					'Connection': 'close'
				});
			}
			// set headers
			for (var type in this.options.headers) {
				try {
					this.transport.setRequestHeader(type, this.options.headers[type]);
				} catch (e) {};
			}
			// send request
			this.transport.send(this.options.data);
		}
	},
	/**
	 * Core Fx Functions
	 * @param {Object} el Element to animate
	 * @param {Object} props A set of styles to animate 
	 * @param {String} speed Speed of animation in milliseconds
	 * @param {Object} cb Optional Callback when the animation finishes
	 */
	JCEMediaBox.fx = function(el, options) {
		this.element 	= el;
		this.callback	= options.callback;
		this.speed 		= options.speed;
		this.wait		= true;
		this.fps		= 50;
		this.now		= {};
	};
	/**
	 * Based on Moo.Fx.Base and Moo.Fx.Styles
	 * @copyright (c) 2006 Valerio Proietti (http://mad4milk.net). MIT-style license.
	 */
	JCEMediaBox.fx.prototype = {
		step: function(){
			var time = new Date().getTime();
			if (time < this.time + this.speed) {
				this.cTime = time - this.time;
				this.setNow();
				
			} else {
				var t = this;
				this.clearTimer();
				this.now = this.to;
				
				setTimeout(function() {
					t.callback.call(t.element, t);
				}, 10);
			}
			this.increase();
		},
	
		setNow: function(){
			for (p in this.from) {
				this.now[p] = this.compute(this.from[p], this.to[p]);
			}
		},
	
		compute: function(from, to){
			var change = to - from;
			return this.transition(this.cTime, from, change, this.speed);
		},
	
		clearTimer: function(){
			clearInterval(this.timer);
			this.timer = null;
			return this;
		},
	
		start: function(from, to){
			var t = this;
			if (!this.wait) this.clearTimer();
			if (this.timer) return;

			this.from = from;
			this.to = to;
			this.time = new Date().getTime();
			this.timer = setInterval(function(){
				return t.step();
			}, Math.round(1000/this.fps));
			return this;
		},

		custom: function(o){
			if (this.timer && this.wait) return;
			var from = {};
			var to = {};
			for (property in o) {
				from[property] 	= o[property][0];
				to[property] 	= o[property][1];
			}
			return this.start(from, to);
		},

		increase: function(){
			for (var p in this.now) {
				this.setStyle(this.element, p, this.now[p])
			}
		},
		
		transition: function(t, b, c, d){
			return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
		},
	
		setStyle: function(e, p, v){
			JCEMediaBox.DOM.style(e, p, v);
		}
	},
	/**
	 * Core Tooltip Object
	 * Create and display tooltips
	 * Based on Mootools Tips Class
	 * copyright (c) 2007 Valerio Proietti, <http://mad4milk.net>
	 */
	JCEMediaBox.ToolTip = {
		/**
		 * Initialise the tooltip
		 * @param {Object} elements
		 * @param {Object} options
		 */
		init: function(){
			var t = this, each = JCEMediaBox.each, DOM = JCEMediaBox.DOM, Event = JCEMediaBox.Event;
			
			// Load tooltip theme
			var theme = JCEMediaBox.options.theme == 'custom' ? JCEMediaBox.options.themecustom : JCEMediaBox.options.theme;

			this.tooltiptheme = '';
			
			new JCEMediaBox.XHR({
				success : function(text, xml) {
					var re = /<!-- THEME START -->([\s\S]*?)<!-- THEME END -->/;
					if (re.test(text)) {
						text = re.exec(text)[1];	
					}
					t.tooltiptheme = text;
				}
			}).send(JCEMediaBox.site + JCEMediaBox.options.themepath + '/' + theme + '/tooltip.html');

			/**
			 * Private internal function to exclude children of element in event
			 * @param {Object} el 	Element with event
			 * @param {Object} e 	Event object
			 * @param {Object} fn 	Callback function
			 */
			function _withinElement(el, e, fn) {
				// Get target
				var p = e.relatedTarget;
				// If element is not target and target not within element...
				while (p && p != el) {
					try { 
						p = p.parentNode; 
					} catch(e) { 
						p = el; 
					}
				}

				if (p != el) {
					return fn.call(this);
				}
				return false;
			}
			// Add events to each found tooltip element
			each(DOM.select('.jcetooltip, .jce_tooltip'), function(el){
				Event.add(el, 'mouseover', function(e){
					_withinElement(el, e, function(){
						return t.start(el);
					});
				});
				Event.add(el, 'mouseout', function(e){
					_withinElement(el, e, function(){
						return t.end(el);
					});
				});
				Event.add(el, 'mousemove', function(e){
					return t.locate(e);
				});
			});
		},
		
		/**
	 	* Create the tooltip div
	 	*/
		create: function(){
			if (!this.toolTip) {
				var DOM = JCEMediaBox.DOM;
				this.toolTip = DOM.add(document.body, 'div', {
					'style': {
						'opacity': 0
					},
					'class': 'jcemediabox-tooltip'
				}, this.tooltiptheme);
			}
		},
		
		/**
		 * Show the tooltip and build the tooltip text
		 * @param {Object} e  Event
		 * @param {Object} el Target Element
		 */
		start: function(el){
			var t = this, DOM = JCEMediaBox.DOM;
			if(!this.tooltiptheme) return false;
			// Create tooltip if it doesn't exist
			this.create();

			// Get tooltip text from title
			var text = el.title || '', title = '';
			// Split tooltip text ie: title::text
			if (/::/.test(text)) {
				var parts = text.split('::');
				title = parts[0].trim();
				text = parts[1].trim();
			}
			// Inherit parent classes
			var cls = el.className.replace(/(jce_?)tooltip/gi, '');
			// Store original title and remove
			this.toolTip.title = el.title;
			
			DOM.attribute(el, 'title', '');
			
			var h = '';
			// Set tooltip title html
			if (title) {
				h += '<h4>' + title + '</h4>';
			}
			// Set tooltip text html
			if (text) {
				h += '<p>' + text + '</p>';
			}
			
			// Set tooltip html
			var tn = DOM.get('jcemediabox-tooltip-text');
			// Use simple tooltip
			if (typeof tn == 'undefined') {
				this.toolTip.className = 'jcemediabox-tooltip-simple';
				this.toolTip.innerHTML = h;
			} else {
				tn.innerHTML = h;
			}
			// Set visible
			DOM.style(t.toolTip, 'visibility', 'visible');
			// Fade in tooltip
			JCEMediaBox.FX.animate(t.toolTip, {
				'opacity' : JCEMediaBox.options.tooltip.opacity
			}, JCEMediaBox.options.tooltip.speed);
		},
		
		/**
		 * Fade Out and hide the tooltip
		 * Restore the original element title
		 * @param {Object} el Element
		 */
		end: function(el){
			var t = this, DOM = JCEMediaBox.DOM;
			if (!this.tooltiptheme) return false;
			// Restore title
			DOM.attribute(el, 'title', this.toolTip.title);
			// Fade out tooltip and hide
			
			DOM.styles(this.toolTip, {
				'visibility' : 'hidden',
				'opacity' : 0
			});
		},
		
		/**
		 * Position the tooltip
		 * @param {Object} e Event trigger
		 */
		locate: function(e){
			if (!this.tooltiptheme) return false;
			this.create();
			
			var o = JCEMediaBox.options.tooltip.offsets;
			var page = {
				'x': e.pageX || e.clientX + document.documentElement.scrollLeft,
				'y': e.pageY || e.clientY + document.documentElement.scrollTop
			};
			var tip = {
				'x': this.toolTip.offsetWidth,
				'y': this.toolTip.offsetHeight
			};
			var pos = {
				'x': page.x + o.x,
				'y': page.y + o.y
			};
			
			var ah = 0;
			
			switch (JCEMediaBox.options.tooltip.position) {
				case 'tl':
					pos.x = (page.x - tip.x) - o.x;
					pos.y = (page.y - tip.y) - (ah + o.y);
					break;
				case 'tr':
					pos.x = page.x + o.x;
					pos.y = (page.y - tip.y) - (ah + o.y);
					break;
				case 'tc':
					pos.x = (page.x - Math.round((tip.x / 2))) + o.x;
					pos.y = (page.y - tip.y) - (ah + o.y);
					break;
				case 'bl':
					pos.x = (page.x - tip.x) - o.x;
					pos.y = (page.y + Math.round((tip.y / 2))) - (ah + o.y);
					break;
				case 'br':
					pos.x = page.x + o.x;
					pos.y = page.y + o.y;
					break;
				case 'bc':
					pos.x = (page.x - (tip.x / 2)) + o.x;
					pos.y = page.y + ah + o.y;
					break;
			}
			JCEMediaBox.DOM.styles(this.toolTip, {
				top	: pos.y,
				left: pos.x
			});
		},
		/**
		 * Position the tooltip
		 * @param {Object} element
		 */
		position: function(element){}
	},
	/**
	 * Core Popup Object
	 * Creates and displays a media popup
	 */
	JCEMediaBox.Popup = {
		addons : {
			'flash' : {},
			'image' : {},
			'html'	: {}
		},
		setAddons : function(n, o) {
			JCEMediaBox.extend(this.addons[n], o);
		},
		getAddons : function(n) {
			if(n) {
				return this.addons[n];
			}
			return this.addons;
		},
		getAddon : function(v, n){
			var t = this, cp = false, r, each = JCEMediaBox.each;

			addons = this.getAddons(n);

			each(this.addons, function(o, s){
				each(o, function(fn) {
					r = fn.call(this, v);
					if (typeof r != 'undefined') {
						cp = r;
					}
				});
			});
			return cp;
		},
		/**
		 * Clean an event removing anonymous function etc.
		 * @param {String} s Event content
		 * Copyright 2009, Moxiecode Systems AB 
		 */
		cleanEvent : function(s) {
			return s.replace(/^function\s+anonymous\(\)\s+\{\s+(.*)\s+\}$/, '$1');
		},
		/**
		 * Get a popup parameter object
		 * @param {String} s Parameter string
		 */
		params : function(s){
			var a = [], x = [];
			
			if(s instanceof Array) {
				x = s;
			} else {
				if (s.indexOf('&') != -1) {
					x = s.split(/&(amp;)?/g);
				} else {
					x = s.split(/;/g);
				}
			}
					
	        JCEMediaBox.each(x, function(n, i){
				if (n) {
					n = n.replace(/^([^\[]+)(\[|=|:)([^\]]*)(\]?)$/, function(a, b, c, d){
						if (d) {
	                        if (!/[^0-9]/.test(d)) {
	                            return '"' + b + '":' + parseInt(d);
	                        }
	                        return '"' + b + '":"' + d + '"';
	                    }
	                    return '';
	                });
	                if (n) {
	                    a.push(n);
	                }
	            }
	        });
			return eval('({' + a.join(',') + '})');
		},
		/**
		 * Gets the raw data of a cookie by name.
		 * Copyright 2009, Moxiecode Systems AB
		 *
		 * @method get
		 * @param {String} n Name of cookie to retrive.
		 * @return {String} Cookie data string.
		 */
		getCookie : function(n) {
			var c = document.cookie, e, p = n + "=", b;

			// Strict mode
			if (!c)
				return;

			b = c.indexOf("; " + p);

			if (b == -1) {
				b = c.indexOf(p);

				if (b != 0)
					return null;
			} else
				b += 2;

			e = c.indexOf(";", b);

			if (e == -1)
				e = c.length;

			return unescape(c.substring(b + p.length, e));
		},

		/**
		 * Sets a raw cookie string.
		 * Copyright 2009, Moxiecode Systems AB
		 *
		 * @method set
		 * @param {String} n Name of the cookie.
		 * @param {String} v Raw cookie data.
		 * @param {Date} e Optional date object for the expiration of the cookie.
		 * @param {String} p Optional path to restrict the cookie to.
		 * @param {String} d Optional domain to restrict the cookie to.
		 * @param {String} s Is the cookie secure or not.
		 */
		setCookie : function(n, v, e, p, d, s) {
			document.cookie = n + "=" + escape(v) +
				((e) ? "; expires=" + e.toGMTString() : "") +
				((p) ? "; path=" + escape(p) : "") +
				((d) ? "; domain=" + d : "") +
				((s) ? "; secure" : "");
		},
		
		/**
		 * Convert legacy popups to new format
		 */
		convert : function(){
			var t = this, each = JCEMediaBox.each, DOM = JCEMediaBox.DOM;
			each(DOM.select('a[href]'), function(el){
				// Only JCE Popup links
				if (/com_jce/.test(el.href)) {
					var p, s, r = [];
					var oc = DOM.attribute('onclick');
					s = oc.replace(/&amp;/g,'&').replace(/&#39;/g,"'").split("'");
					p = t.params(s[0]);
					
					img 	= p['img']		|| '';
					title 	= p['title'] 	|| '';
					
					if(img) {
						if(!/http:\/\//.test(img)){
							if(img.charAt(0) == '/'){
								img = img.substr(1);	
							}
							img = t.site.replace(/http:\/\/([^\/]+)/, '') + img;	
						}
						DOM.attributes(el, {
							'href'		:	img,
							'title'		:	title.replace(/_/, ' '),
							'onclick'	:	''
						});
						
						DOM.addClass(el, 'jcepopup');
					}	
				}																  
			});
		},
		
		/**
		 * Translate popup labels
		 * @param {String} s Theme HTML
		 */
		translate : function(s) {
			var t = this;
			if(!s) {
				s = this.popup.theme;
			}
			s = s.replace(/\{#(\w+?)\}/g, function(a, b){
				return JCEMediaBox.options.popup.labels[b];
			});
			return s;
		},
		
		/**
		 * Returns a styles object from a parameter
		 * @param {Object} o
		 */
		styles : function(o){
			var v, s, x = [];
			if(!o)
				return {};
				
			JCEMediaBox.each(o.split(';'), function(s, i){
				s = s.replace(/(.*):(.*)/, function(a, b, c){
					return "'" + b + "':'" + c + "'";
				});
				x.push(s);
			});
			return eval('({' + x.join(',') + '})');
		},
		
		/**
		 * Get the file type from the url, type attribute or className
		 * @param {Object} el
		 */
		getType : function(el) {
			var o = {}, type;
			
			// Media types
			if (/(director|windowsmedia|mplayer|quicktime|real|divx|flash)/.test(el.type)) {
				type = /(director|windowsmedia|mplayer|quicktime|real|divx|flash)/.exec(el.type)[1];
			}
			
			o = this.getAddon(el.src);

			if (o && o.type) {
				type = o.type;
			}
			
			return type || el.type || 'iframe';
		},
		
		/**
		 * Determine media type and properties
		 * @param {Object} c
		 */
		mediatype : function(c){
			var ci, cb, mt;
	
			c = /(director|windowsmedia|mplayer|quicktime|real|divx|flash)/.exec(c);
			
			switch (c[1]) {
				case 'director':
				case 'application/x-director':
					ci = '166b1bca-3f9c-11cf-8075-444553540000';
					cb = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';
					mt = 'application/x-director';
					break;
				case 'windowsmedia':
				case 'mplayer':
				case 'application/x-mplayer2':
					ci = '6bf52a52-394a-11d3-b153-00c04f79faa6';
					cb = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';
					mt = 'application/x-mplayer2';
					break;
				case 'quicktime':
				case 'video/quicktime':
					ci = '02bf25d5-8c17-4b23-bc80-d3488abddc6b';
					cb = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';
					mt = 'video/quicktime';
					break;
				case 'real':
				case 'realaudio':
				case 'audio/x-pn-realaudio-plugin':
					ci = 'cfcdaa03-8be4-11cf-b84b-0020afbbccfa';
					cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0';
					mt = 'audio/x-pn-realaudio-plugin';
					break;
				case 'divx':
				case 'video/divx':
					ci = '67dabfbf-d0ab-41fa-9c46-cc0f21721616';
					cb = 'http://go.divx.com/plugin/DivXBrowserPlugin.cab';
					mt = 'video/divx';
					break;
				default:
				case 'flash':
				case 'application/x-shockwave-flash':
					ci = 'd27cdb6e-ae6d-11cf-96b8-444553540000';
					cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,124,0';
					mt = 'application/x-shockwave-flash';
					break;
			}
			return {'classid' : ci, 'codebase': cb, 'mediatype': mt};
		},
		
		/**
		 * Determine whether the url is local
		 * @param {Object} s
		 */
		islocal : function(s){
			if (/^(\w+):\/\//.test(s)) {
				return new RegExp('^(' + JCEMediaBox.site + ')').test(s);
			} else {
				return true;
			}
		},
		
		/**
		 * Get the width of the container frame
		 */
		frameWidth : function(){
			var t = this, w = 0, el = this.frame;
			
			JCEMediaBox.each(['left', 'right'], function(s) {
				w = w + parseFloat(JCEMediaBox.DOM.style(el, 'padding-' + s));		
			});
			return parseFloat(this.frame.clientWidth - w);
		},
		
		/**
		 * Get the height of the container frame
		 */
		frameHeight : function(){
			var t = this, h = 0, el = this.frame, DIM = JCEMediaBox.Dimensions;

			JCEMediaBox.each(['top', 'bottom'], function(s) {
				h = h + parseFloat(JCEMediaBox.DOM.style(el, 'padding-' + s));			
			});

			h = h + ((JCEMediaBox.isIE6 || JCEMediaBox.isIE7) ? DIM.getScrollbarWidth() : 0);

			return parseInt(DIM.getHeight()) - h;
		},
		
		/**
		 * Get the width of the usable window
		 */
		width : function(){
			return this.frameWidth() - JCEMediaBox.Dimensions.getScrollbarWidth();
		},
		
		/**
		 * Get the height of the usable window less info divs
		 */
		height : function(){
			var h = 0, t = this, each = JCEMediaBox.each, DOM = JCEMediaBox.DOM, DIM = JCEMediaBox.Dimensions;
			each(['top', 'bottom'], function(s){
				var el = t['info-' + s];
				if(el){
					h = h + parseInt(DIM.outerHeight(el));
				}				
			});

			return this.frameHeight() - h;
		},
		
		/**
		 * Print the page contents
		 */
		printPage : function(){
			if (this.active.type == 'image') {
				
			} else {
				
			}
		},
		
		/**
		 * Create a popup zoom icon
		 * @param {Object} el Popup link element
		 */
		zoom : function(el){
			var t = this, DOM = JCEMediaBox.DOM, extend = JCEMediaBox.extend, each = JCEMediaBox.each, s, m, x, y;
			var child = el.firstChild;
			// Create basic zoom element			
			var zoom = DOM.create('span');
			
			// If child is an image (thumbnail)
			if (child && child.nodeName == 'IMG') {
				var align 	= child.getAttribute('align');
				var vspace 	= child.getAttribute('vspace');
				var hspace 	= child.getAttribute('hspace');
				
				var w = child.getAttribute('width') 	|| child.style.width	|| 0;
				var h = child.getAttribute('height') 	|| child.style.height	|| 0;
				
				var styles = {
					'width'		: w,
					'height'	: h
				};
				
				// Transfer margin, padding and border
				each(['top', 'right', 'bottom', 'left'], function(pos){
					// Set margin
					styles['margin-' + pos] 	= DOM.style(child, 'margin-' + pos);
					// Set padding
					styles['padding-' + pos] 	= DOM.style(child, 'padding-' + pos);
					// Set border
					each(['width', 'style', 'color'], function(prop){
						styles['border-' + pos + '-' + prop] = DOM.style(child, 'border-' + pos + '-' + prop);
					});
				});
				
				// Correct from deprecated align attribute
				if(/\w+/.test(align)){
					extend(styles, {
						'float'			:	/left|right/.test(align) 		? align : '',
						'text-align'	:	/top|middle|bottom/.test(align) ? align : ''
					});
				}
				// Correct from deprecated vspace attribute
				if (vspace > 0) {
					extend(styles, {
						'margin-top'	:	parseInt(vspace),
						'margin-bottom'	:	parseInt(vspace)
					});
				}
				// Correct from deprecated hspace attribute
				if (hspace > 0) {
					extend(styles, {
						'margin-left'	:	parseInt(hspace),
						'margin-right'	:	parseInt(hspace)
					});
				}
				
				// Add style alignment
				extend(styles, {
					'float' 		: DOM.style(child, 'float'),
					'text-align' 	: child.style.textAlign
				});
				
				/**
				 * Private Internal function
				 * Build and place the icon
				 * @param {Object} el The Parent Link Element
				 * @param {Object} zoom The Zoom Element
				 * @param {Object} zoom The Child Element (Image)
				 * @param {Object} styles Computed Styles object
				 */
				function _buildIcon(el, zoom, child, styles) {
					var pos, w = styles.width || 0, h = styles.height || 0;
					// Clone image as span element					
					var span = DOM.add(el, 'span', {
						'class' : 'jcemediabox-zoom-span',
						'style' : child.style.cssText
					});
					
					// Set styles
					DOM.styles(span, styles);
					
					// Move the image into the parent SPAN
					DOM.add(span, child);
					// Move the zoom icon into the parent SPAN
					DOM.add(span, zoom);
					
					// Remove attributes that may affect layout
					each(['style', 'align', 'border', 'hspace', 'vspace'], function(v, i) {
						child.removeAttribute(v);
					});
						
					// Add zoom-image class
					DOM.addClass(zoom, 'jcemediabox-zoom-image');
					// Get icon position
					pos = el.className.match(/icon-(top-right|top-left|bottom-right|bottom-left|left|right|center|centre)/);
					if (pos) {
						pos = pos[1];
						pos = (/^(left|right)/.test(pos)) ? 'bottom ' + pos : pos.replace(/-/, ' ')
					} else {
						pos = 'bottom right';
					}
					
					var top = -h, left = 0;
					
					// Set explicit positions for IE6 when zoom icon is png
					if (JCEMediaBox.isIE6 && /\.png/i.test(DOM.style(zoom, 'background-image'))) {
						var zw = parseFloat(DOM.style(zoom, 'width'));
						var zh = parseFloat(DOM.style(zoom, 'height'));

						if (/(bottom)/.test(pos)) top = -zh;
						if (/(right)/.test(pos)) left = w - zw;
						
						DOM.style(zoom, 'left', left);
						
						DOM.style(el, 'position', 'static');
						DOM.png(zoom);
					}

					// Position zoom image span
					DOM.styles(zoom, {
						'top'					: top,
						'background-position' 	: pos
					});

					// Remove styles from image
					DOM.styles(child, {
						'margin' 	: 0,
						'padding'	: 0,
						'float'		: 'none',
						'border'	: 'none'
					});
				}
				// No dimensions? Try and find using new Image
				if (/^(0|auto)/.test(w) || /^(0|auto)/.test(h)) {
					x = new Image();
					x.src = child.src;
					x.onload = function() {
						extend(styles, {
							width 	: parseInt(x.width), 
							height	: parseInt(x.height)
						});
						_buildIcon(el, zoom, child, styles);	
					} 
				} else {
					_buildIcon(el, zoom, child, styles);
				}
			} else {
				DOM.addClass(zoom, 'jcemediabox-zoom-link');
				if (DOM.hasClass(el, 'icon-left')) {
					DOM.addBefore(el, zoom);
				} else {
					DOM.add(el, zoom);
				}
				// IE7 won't accept display:inherit
				if (JCEMediaBox.isIE7) {
					DOM.style(zoom, 'display', 'inline-block');
				}
			}
			// Return zoom icon element
			return zoom;
		},
		
		/**
		 * Process autopopups
		 */
		auto : function() {
			var t = this;
			JCEMediaBox.each(this.popups, function(el, i){
				if(el.auto) {
					if(el.auto == 'autopopup-single') {
						var cookie = t.getCookie('jceutilities_autopopup_' + el.id);
						if (!cookie) {
							t.setCookie('jceutilities_autopopup_' + el.id, 1);
							t.start(el);
						}
					} else if(el.auto == 'autopopup-multiple') {
						t.start(el);
					}
				}
			});
		},
		
		init : function() {
			window.jcepopup = this;
			this.create();
		},
		
		/**
		 * Create a popup from identifiable link or area elements
		 * Load the popup theme
		 */
		create : function() {
			var t = this, auto = false, each = JCEMediaBox.each, DOM = JCEMediaBox.DOM, Event = JCEMediaBox.Event;
			this.popups = [], this.popuptheme = '';
			
			// Converts a legacy (window) popup into an inline popup
			if (JCEMediaBox.options.popup.legacy == 1) {
				t.convert();
			}
			// Iterate through all found popup links		
			each(DOM.select('a.jcebox, a.jcelightbox, a.jcepopup, area.jcebox, area.jcelightbox, area.jcepopup'), function(el, i) {
				// Simplify class identifier for css
				if (/(jcelightbox|jcebox)/.test(el.className)) {
					DOM.removeClass(el, 'jcelightbox');
					DOM.removeClass(el, 'jcebox');
					DOM.addClass(el, 'jcepopup');
				}

				if (!DOM.hasClass(el, 'nopopup')) {
					// Create zoom icon
					if (JCEMediaBox.options.popup.icons == 1 && el.nodeName == 'A' && !/(noicon|icon-none|noshow)/.test(el.className) && el.style.display != 'none') {
						var zoom = t.zoom(el);					   
					}
					// Hide popup link if specified in class
					if (DOM.hasClass(el, 'noshow')) {
						DOM.hide(el);
					}
					
					var group = '', p = '';
					
					// Auto popup on page load
					if (!auto && el.id) {
						//auto = el.hasClass('autopopup');
						if(c = el.className.match(/autopopup-(single|multiple)/)) {
							auto = c[0];
						}
					}
					
					// Fix title and rel and move parameters
					var title 	= el.title || '';
					var rel 	= el.rel || '';
					// Process title attribute
					if (title && /(\w+\[.*\])/.test(title)) {
						// get parameters
						p = t.params(title);
						DOM.attribute(el, 'title', p.title || '');
						group = p.group || '';
					}
					// Process rel attribute
					if (rel && /(\w+\[.*\])/.test(rel)) {
						var args = [];
						rel = rel.replace(/\b((\w+)\[(.*?)\])(;?)/g, function(a, b, c) {
							args.push(b);
							return '';
						});
						
						// get parameters
						p = t.params(args);
						DOM.attribute(el, 'rel', rel || p.rel || '');
						group = p.group || '';
											
					} else {
						var rx = 'alternate|stylesheet|start|next|prev|contents|index|glossary|copyright|chapter|section|subsection|appendix|help|bookmark|nofollow|licence|tag|friend';
						var lb = '(lightbox(\[(.*?)\])?)';
						var lt = '(lyte(box|frame|show)(\[(.*?)\])?)';
						
						group = rel.replace(new RegExp('\s*(' + rx + '|' + lb + '|' + lt + ')\s*'), '', 'gi');
					}
					// Get AREA parameters from URL if not set
					if (el.nodeName == 'AREA') {
						if (!p) {
							p = t.params(el.href);
						}
						// Set AREA group
						group = group || 'AREA_ELEMENT';
					}

					// Popup object
					var o = {
						'src'  		: el.href,
						'title'		: p.title || title,
						'group' 	: DOM.hasClass(el, 'nogroup') ? '' : group,
						'type'		: p.type || el.type || '',
						'params' 	: p || {},
						'id'		: el.id || '',
						'auto'		: auto
					};
					// Remove type
					el.href = el.href.replace(/&type=(ajax|text\/html|text\/xml)/, '');
					// Add to global popups array
					t.popups.push(o);
					// Add click event to link
					Event.add(el, 'click', function(e){
						Event.cancel(e);
						return t.start(o, i);
					});

					// Reset auto popup value
					auto = false;
				}
			});
			
			// Load the popup theme	
			var theme = JCEMediaBox.options.theme == 'custom' ? JCEMediaBox.options.themecustom : JCEMediaBox.options.theme;
			
			new JCEMediaBox.XHR({
				success : function(text, xml) {
					var re = /<!-- THEME START -->([\s\S]*?)<!-- THEME END -->/;
					if(re.test(text)){
						text = re.exec(text)[1];	
					}
					t.popuptheme = text;
					// Process auto popups
					t.auto();
				}
			}).send(JCEMediaBox.site + JCEMediaBox.options.themepath + '/' + theme + '/popup.html');
		},
		
		/**
		 * Public popup method
		 * @param {String} url Popup URL
		 * @param {String} title Popup Title
		 * @param {String} group Popup Group
		 * @param {String} type Popup Type, eg: image, flash, ajax
		 * @param {Object} params Popup Parameters Object
		 */
		open : function(url, title, group, type, params) {
			var link = {
				'src'  		: url,
				'title'		: title,
				'group' 	: group,
				'type'		: type,
				'params' 	: params
			};
			return this.start(link);
		},
		
		/**
		 * Start a popup
		 * @param {Object} o The popup link object
		 * @param {Object} i The popup index
		 */
		start : function(p, i) {
			var t = this, n = 0, x = 0, items = [], each = JCEMediaBox.each;
			
			// build popup window
			if (this.build()) {
				if (p.group) {
					each(this.popups, function(o, x) {
						if (o.group == p.group) {
							items.push(o);
							if (i && x == i) {
								n = items.indexOf(o);
							}
						}
					});
					// Triggered popup
					if (!p.auto && typeof i == 'undefined') {
						items.push(p);
						n = items.length -1;
					}
				} else {
					items.push(p);
				}			
				return this.show(items, n);
			}
		},
		
		/**
		 * Build Popup structure
		 */
		build : function(){
			var t = this, each = JCEMediaBox.each, DOM = JCEMediaBox.DOM, Event = JCEMediaBox.Event;
			// Create main page object
			this.page = DOM.add(document.body, 'div', {id : 'jcemediabox-popup-page'});
			
			if (JCEMediaBox.options.popup.overlay == 1) {
				// Create overlay
				this.overlay = DOM.add(this.page, 'div', {
					id: 'jcemediabox-popup-overlay',
					style: {
						'opacity': 0,
						'background-color': JCEMediaBox.options.popup.overlaycolor
					}
				});
			}
			
			// Cancel if no theme
			if (!this.popuptheme) {
				return false;
			}
			// Remove comments
			this.popuptheme = this.popuptheme.replace(/<!--(.*?)-->/g, '');
			// Translate
			this.popuptheme = this.translate(this.popuptheme);
			// Create Frame
			this.frame = DOM.add(this.page, 'div', {id : 'jcemediabox-popup-frame'}, '<div id="jcemediabox-popup-body">' + this.popuptheme + '</div>');

			// Create all Popup structure objects
			each(DOM.select('*[id]', this.frame), function(el) {
				var s = el.id.replace('jcemediabox-popup-', '');
				t[s] = el;
				DOM.hide(el);
			});
			
			// Add close function to frame on click
			Event.add(this.frame, 'click', function(e) {
				if (e.target && e.target == t.frame) {
					t.close();
				}
			});
            
            // Setup Close link event
            if (this.closelink) {
                Event.add(this.closelink, 'click', function() {
					return t.close();
                });
            }
            // Setup Cancel link event
            if (this.cancellink) {
                Event.add(this.cancellink, 'click', function() {
                    return t.close();
                });
            }
            // Setup Next link event
            if (this.next) {
                Event.add(this.next, 'click', function() {
                    return t.nextItem();
                });
            }
            // Setup Previous link event
            if (this.prev) {
                Event.add(this.prev, 'click', function() {
                    return t.previousItem();
                });
            }
            if (this.numbers) {
                this.numbers.tmpHTML = this.numbers.innerHTML;
            }
			
            if (this.print) {
                Event.add(this.print, 'click', function() {
                    return t.printPage();
                });
            }
			// PNG Fix
            if (JCEMediaBox.isIE6) {
				DOM.png(this.body);
                each(DOM.select('*', this.body), function(el) {
                    // Exclude loaded content
					if(DOM.attribute(el, 'id') == 'jcemediabox-popup-content') {
						return;
					}
					DOM.png(el);
                });
            }
			return true;
		},
		
		/**
		 * Show the popup window
		 * @param {Array} items Array of popup objects
		 * @param {Int} n Index of current popup
		 */
		show: function(items, n){
			var t = this, DOM = JCEMediaBox.DOM, DIM = JCEMediaBox.Dimensions;
			this.items = items;
			this.bind(true);
			
			// Show popup
			DOM.show(this.body);
			// Get top position
			var top = (DIM.getHeight() - DIM.outerHeight(this.body)) / 2;
			
			// Set top position
			DOM.style(this.body, 'top', top);
			// Changes if IE6 or scrollpopup
			if (JCEMediaBox.isIE6 || JCEMediaBox.options.popup.scrolling == 'scroll') {
				DOM.style(this.page, 'position', 'absolute');
                DOM.style(this.overlay, 'height', DIM.getScrollHeight());
				DOM.style(this.body, 'top', DIM.getScrollTop() + top);
            }
			// Fade in overlay
			if(JCEMediaBox.options.popup.overlay == 1 && this.overlay){
				DOM.show(this.overlay);
				JCEMediaBox.FX.animate(this.overlay, {
					'opacity' 	: JCEMediaBox.options.popup.overlayopacity	
				}, JCEMediaBox.options.popup.fadespeed);
			}
			return this.change(n);		
		},
		
		/**
		 * Create event / key bindings
		 * @param {Boolean} open Whether popup is opened or closed
		 */	
		bind: function(open){
			var t = this, isIE6 = JCEMediaBox.isIE6, each = JCEMediaBox.each, DOM = JCEMediaBox.DOM, Event = JCEMediaBox.Event;
			if(isIE6){
				each(DOM.select('select'), function(el){
					if(open){
						el.tmpStyle = el.style.visibility || '';
					}
					el.style.visibility = open ? 'hidden' : el.tmpStyle;
				});
			}
			if(JCEMediaBox.options.popup.hideobjects){
				each(DOM.select('object, embed'), function(el){
					if(el.id == 'jcemediabox-popup-object') return;
					if(open){
						el.tmpStyle = el.style.visibility || '';
					}
					el.style.visibility = open ? 'hidden' : el.tmpStyle;
				});
			}
			var scroll = JCEMediaBox.options.popup.scrollpopup;
			if (open) {
				Event.add(document, 'keydown', function(e){
					t.listener(e);
				});
				if(isIE6){
					Event.add(window, 'scroll', function(e){
						DOM.style(t.overlay, 'height', JCEMediaBox.Dimensions.getScrollHeight());
					});
					Event.add(window, 'scroll', function(e){
						DOM.style(t.overlay, 'width', JCEMediaBox.Dimensions.getScrollWidth());
					});
				}
			} else {
				if (isIE6 || !scroll) {
					Event.remove(window, 'scroll');
					Event.remove(window, 'resize');
				}
				Event.remove(document, 'keydown');
			}
		},
		
		/**
		 * Keyboard listener
		 * @param {Object} e Event
		 */	
		listener: function(e){
			switch (e.keyCode){
				case 27: this.close(); break;
				case 37: this.previousItem(); break;	
				case 39: this.nextItem(); break;
			}
		},
		
		/**
		 * Process a popup in the group queue
		 * @param {Object} n Queue position
		 */
		queue: function(n){
			var t = this, s = JCEMediaBox.options.popup.fadespeed, ss = JCEMediaBox.options.popup.scalespeed;
			// Optional element
			var changed = false;

			JCEMediaBox.each(['top', 'bottom'], function(s){
				var el = t['info-' + s];
				if (el) {
					var v 			= JCEMediaBox.Dimensions.outerHeight(el);
					var style 		= {};
					style['top'] 	= s == 'top' ? v : -v;
					JCEMediaBox.DOM.style(el, 'z-index', -1);
					JCEMediaBox.FX.animate(el, style, ss, function(){
						if (!changed) {
							changed = true;
							JCEMediaBox.FX.animate(t.content, {'opacity' : 0}, JCEMediaBox.options.popup.fadespeed, function(){
								return t.change(n);	
							});
						}
					});
				}
			});
		},
		
		/**
		 * Process the next popup in the group
		 */
		nextItem : function(){			
			if(this.items.length == 1) return false;
			var n = this.index + 1;
			
			if(n < 0 || n >= this.items.length){
				return false;
			}
			return this.queue(n);
		},
		
		/**
		 * Process the previous popup in the group
		 */
		previousItem : function(){
			if(this.items.length == 1) return false;
			var n = this.index - 1;
			
			if(n < 0 || n >= this.items.length){
				return false;
			}
			return this.queue(n);
		},
		
		/**
		 * Set the popup information (caption, title, numbers)
		 */
		info : function(){
			var each = JCEMediaBox.each, DOM = JCEMediaBox.DOM, Event = JCEMediaBox.Event;
			// Optional Element Caption/Title
	        
	        if (this.caption) {
	            var title = this.active.caption || this.active.title || '', text = '';
				
				var ex = '([-!#$%&\'\*\+\\./0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'\*\+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+)';
				var ux = '((news|telnet|nttp|file|http|ftp|https)://[-!#$%&\'\*\+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'\*\+\\./0-9=?A-Z^_`a-z{|}~]+)';
				
				function processRe(h){
					h = h.replace(new RegExp(ex, 'g'), '<a href="mailto:$1" target="_blank" title="$1">$1</a>');				
					h = h.replace(new RegExp(ux, 'g'), '<a href="$1" target="_blank" title="$1">$1</a>');
					
					return h;
				}
	
	            if (/::/.test(title)) {
	                var parts 	= title.split('::');
					title 		= parts[0].trim();
					text 		= parts[1].trim();
	            }
				var h = '';
				if (title){
					h += '<h4>' + title + '</h4>';
				}
				if (text){
					h += '<p>' + text + '</p>';
				}
				this.caption.innerHTML = h;
				// Lazy layout fix for IE6/7
				if ((JCEMediaBox.isIE6 || JCEMediaBox.isIE7) && !h) {
					this.caption.innerHTML = '&nbsp;';
				}
				
				// Process e-mail and urls
				each(DOM.select('*', this.caption), function(el){
					if (el.nodeName != 'A') {
						each(el.childNodes, function(n, i) {
							if (n.nodeType == 3) {
								var s = n.innerText || n.textContent || n.data || null;
								if (s && /(@|:\/\/)/.test(s)) {
									if (s = processRe(s)) {
										n.parentNode.innerHTML = s;
									}
								}
							}
						});
					}
				});
	        }
			// Optional Element
			var t = this, html = '', len = this.items.length;

            if (this.numbers && len > 1) {
                var html = this.numbers.tmpHTML || '{$numbers}';
                
                if (/\{\$numbers\}/.test(html)) {
                    this.numbers.innerHTML = '';
                    for (var i = 0; i < len; i++) {
                        var n = i + 1;
						// Craete Numbers link
						var link = DOM.add(this.numbers, 'a', {
							'href' : 'javascript:;',
							'title': this.items[i].title || n,
							'class': (this.index == i) ? 'active' : ''
						}, n);
						// add click event
						Event.add(link, 'click', function(e){
							var x = parseInt(e.target.innerHTML) - 1;
                            if (t.index == x) {
								return false;
                            }
                            return t.queue(x);
						});
                    }
                }
                
                if (/\{\$(current|total)\}/.test(html)) {
                    this.numbers.innerHTML = html.replace('{$current}', this.index + 1).replace('{$total}', len);
                }
            } else {
                this.numbers.innerHTML = '';
            }
			each(['top', 'bottom'], function(v, i){
				var el = t['info-' + v];
				if (el) {
					el.style.visibility = 'hidden';
					DOM.show(el);
					each(DOM.select('*[id]', el), function(s) {
						DOM.show(s);
					});
				}
			});
			// Show / Hide Previous and Next buttons
			DOM.hide(this.next);
            DOM.hide(this.prev);
			
			if (len > 1) {
                if (this.prev) {
                    if (this.index > 0) {
                       DOM.show(this.prev);
                    } else {
                        DOM.hide(this.prev);
                    }
                }
                if (this.next) {
                    if (this.index < len - 1) {
                        DOM.show(this.next);
                    } else {
                        DOM.hide(this.next);
                    }
                }
            }
		},
		
		/**
		 * Change the popup
		 * @param {Integer} n Popup number
		 */
		change: function(n){			
			var t = this, extend = JCEMediaBox.extend, each = JCEMediaBox.each, DOM = JCEMediaBox.DOM, isIE = JCEMediaBox.isIE;

			var p = {}, s, o, w, h;
			if(n < 0 || n >= this.items.length){
				return false;
			}
			this.index 	= n;
			this.active = {};
			
			// Show Container
			DOM.show(this.container);	
			// Show Loader
			if (this.loader) {
				DOM.show(this.loader);	
			}
			// Show Cancel
			if (this.cancellink) {
				DOM.show(this.cancellink);	
			}
			// Remove object
			if (this.object) {
				this.object = null;
			}
			
			this.content.innerHTML = '';

			o = this.items[n];

			// Get parameters from addon
			extend(p, this.getAddon(o.src, o.type));
			// Get set parameters
			extend(p, o.params);
			
			extend(this.active, {
				'src'		: 	p.src || o.src,
				'title'		:	o.title,
				'caption'	:	p.caption || '',
				'type'		:	p.type || this.getType(o),
				'params'	: 	p || {},
				'width'		:	p.width		|| JCEMediaBox.options.popup.width 	|| 0,
				'height'	:	p.height 	|| JCEMediaBox.options.popup.height	|| 0
			});
			
			// Setup info
			this.info();

			switch(this.active.type) {
				case 'image':
					if (this.print && this.options.print) {
						this.print.style.visibility = 'visible';
					}

					this.img = new Image();
					this.img.onload = function(){
						return t.setup();
					};
					this.img.src = this.active.src;
					break;
				case 'flash':
				case'director':
				case'shockwave':
				case'mplayer':
				case'windowsmedia':
				case'quicktime':
				case'realaudio':
				case'real':
				case'divx':
					if(this.print) {
						this.print.style.visibility = 'hidden';
					}
					
					p.src 		= this.active.src;		
					var base	= /:\/\//.test(p.src) ? '' : this.site;
					this.object = '';
		
					w = this.width();
					h = this.height();
		
					var mt = this.mediatype(this.active.type);
					
					if(this.active.type == 'flash'){
						p.wmode = 'transparent';
						p.base 	= base;
					}
					if(/(mplayer|windowsmedia)/i.test(this.active.type)){
						p.baseurl = base;
						if(isIE){
							p.url = p.src;
							delete p.src;
						}
					}
					// delete some parameters
					delete p.title;
					delete p.group;
					
					// Set width/height
					p.width 	= this.active.width 	= p.width	|| w;
					p.height 	= this.active.height	= p.height 	|| h;
					
					function makeParam(args) {
						var h = '';
						for(n in args) {
							if (args[n]) {
								h += '<param name="' + n + '" value="' + args[n] + '" />';
							}
						}
						return h;
					}
					
					var flash = /flash/i.test(this.active.type);
		
					// Create single object for IE / Flash
					if (flash || isIE) {
						this.object = '<object id="jcemediabox-popup-object" ';
						// Add type and data attribute
						if (flash && !isIE) {
							this.object += 'type="'+ mt.mediatype +'" data="'+ p.src +'" ';	
						} else {
							this.object += 'codebase="' + mt.codebase + '" classid="clsid:' + mt.classid + '" ';
						}

						for (n in p){
							if(p[n] !== ''){
								if (/(id|name|width|height|style|type)$/.test(n)){
									t.object += n + '="' + decodeURIComponent(p[n]) + '"';	
								}
							}
						}
						this.object += '>';
						for(n in p) {
							if (p[n] !== '' && !/(id|name|width|height|style|type)/.test(n)) {
								t.object += '<param name="' + n + '" value="' + decodeURIComponent(p[n]) + '" />';
							}
						}
						this.object += '</object>';
					// Use embed for non-IE browsers
					} else {
						this.object = '<embed id="jcemediabox-popup-object"';
						for (n in p){
							if(p[n] !== ''){
								t.object += ' ' + n + '="' + decodeURIComponent(p[n]) + '"';	
							}
						}
						this.object += '></embed>';
					}
					
	
					// set global media type
					this.active.type = 'media';
					
					this.setup();
					break;
				case 'ajax':
				case 'text/html':
				case 'text/xml':
					if(this.print && this.options.print) {
						this.print.style.visibility = 'visible';
					}
					
					this.active.width 	= this.active.width 	|| this.width();
					this.active.height 	= this.active.height 	|| this.height();
	
					if (this.islocal(this.active.src)) {
						if(!/tmpl=component/i.test(this.active.src)){
							this.active.src += /\?/.test(this.active.src) ? '&tmpl=component' : '?tmpl=component';
						}
						this.active.type = 'ajax';
					} else {
						this.active.type = 'iframe';
						this.setup();
					}
					
					styles = extend(this.styles(p.styles), {display : 'none'});
					// Create ajax container
					this.ajax = DOM.add(this.content, 'div', {id : 'jcemediabox-popup-ajax', 'style' : styles});
					
					// Corrective stuff for IE6 and IE7
					if (JCEMediaBox.isIE6) {
						DOM.style(this.ajax, 'margin-right', JCEMediaBox.Dimensions.getScrollbarWidth());
					}
					
					if (JCEMediaBox.isIE7) {
						DOM.style(this.ajax, 'padding-right', JCEMediaBox.Dimensions.getScrollbarWidth());
					}
					this.active.src = this.active.src.replace(/\&type=(ajax|text\/html|text\/xml)/, '');
					// Get data
					new JCEMediaBox.XHR({
						method	: 'POST',
						success	: function(text, xml) {
							var data = text, html = data, re = /<body[^>]*>([\s\S]*?)<\/body>/;
							if (re.test(data)) {
								html = re.exec(data)[1];
							}
							
							t.ajax.innerHTML = html;
							
							if (t.loader) {
								DOM.show(t.loader);
							}
							each(DOM.select('a', t.content), function(el) {
								JCEMediaBox.Event.add(el, 'click', function() {
									if (el.href && el.href.indexOf('#') == -1) {
										t.close();
									}
								});
							});
							// setup
							return t.setup();
						}
					}).send(this.active.src);
					break;
				case 'iframe':
				default:
					if (this.print) {
						this.print.style.visibility = 'hidden';
					}
					
					if (this.islocal(this.active.src)) {
						if (!/tmpl=component/i.test(this.active.src)) {
							this.active.src += /\?/.test(this.active.src) ? '&tmpl=component' : '?tmpl=component';
						}
					}
					
					this.active.width 	= this.active.width 	|| this.width();				
					this.active.height 	= this.active.height 	|| this.height();
					
					this.active.type = 'iframe';
					this.setup();
					break;
			}
			return false;
		},
		/**
		 * Proportional resizing method
		 * @param {Object} w
		 * @param {Object} h
		 * @param {Object} x
		 * @param {Object} y
		 */
		resize : function(w, h, x, y) {
			if (w > x) {
				h = h * (x / w); 
				w = x; 
				if (h > y) { 
					w = w * (y / h); 
					h = y; 
				}
			} else if (h > y) { 
				w = w * (y / h); 
				h = y; 
				if (w > x) { 
					h = h * (x / w); 
					w = x;
				}
			}
			w = Math.round(w);
			h = Math.round(h);
			
			return {width : Math.round(w), height : Math.round(h)};
		},
		
		/**
		 * Pre-animation setup. Resize images, set width / height
		 */
		setup: function(){
			var t = this, DOM = JCEMediaBox.DOM, Event = JCEMediaBox.Event, w, h;
			
			w = this.active.width;
			h = this.active.height;
			
			// Get image dimensions and resize if necessary
			if (this.active.type == 'image') {
				var x = this.img.width;
				var y = this.img.height;
				
				w = w || x;
				h = h || y;
				
				if (w != x || h != y) {
					var dim = this.resize(x, y, w, h);
					w = dim.width;
					h = dim.height;
				}
			}
	
			// Resize to fit screen
			if (JCEMediaBox.options.popup.resize == 1 || JCEMediaBox.options.popup.scrolling == 'fixed'){	
				var x 	=  this.width();
				var y 	=  this.height();
				
				var dim = this.resize(w, h, x, y);
				
				w = dim.width;
				h = dim.height;
			}

			DOM.styles(this.content, {
				width 	: w,
				height 	: h
			});
			DOM.hide(this.content);
			if (this.active.type == 'image') {	
				this.content.innerHTML = '<img id="jcemediabox-popup-img" src="' + this.active.src + '" title="' + this.active.title + '" width="' + w + '" height="' + h + '" />';
			
				// Protect images from right-click context menu - disabled until I can get it working in Opera!
				/*if (JCEMediaBox.options.popup.protect == 1) {
					var img = DOM.get('jcepopup-img');
					Event.add(img, 'mousedown', function(e) {
						if (JCEMediaBox.isOpera) {
							if (e.ctrlKey || e.metaKey) {
								Event.cancel(e);
							}
						}
						if (JCEMediaBox.isIE) {
							if (e.button == 2) {
								Event.cancel(e);
							}
						} else {
							if (e.which == 2 || e.which == 3) {
								Event.cancel(e);
							}
						}
					});
					Event.add(img, 'contextmenu', function(e) {
						Event.cancel(e);
					});
				}*/			
			}

			// Animate box
			return this.animate();						   
		},
		/**
		 * Animate the Popup
		 */
		animate : function(){
			var t = this, each = JCEMediaBox.each, DOM = JCEMediaBox.DOM, FX = JCEMediaBox.FX, DIM = JCEMediaBox.Dimensions;
			var ss = JCEMediaBox.options.popup.scalespeed, fs = JCEMediaBox.options.popup.fadespeed;
			
			var cw 	= DIM.outerWidth(this.content);
			var ch 	= DIM.outerHeight(this.content);
			var ih = 0;		
			each(['top', 'bottom'], function(v, i) {
				var el = t['info-' + v];
				if (el) {
					ih = ih + DIM.outerHeight(el);
				}
			});
			
			var st 	= DOM.style(this.page, 'position') == 'fixed' ? 0 : DIM.getScrollTop();
			var top = st + (this.frameHeight() / 2) - ((ch + ih) / 2);
			
			DOM.style(this.content, 'opacity', 0);

			// Animate width
			FX.animate(this.body, {'height' : ch, 'top' : top, 'width' : cw}, ss, function() {
				// Hide loader
				if (t.loader) {
					DOM.hide(t.loader);
				}
				// If media
				if (t.active.type == 'media' && t.object) {
					t.content.innerHTML = t.object;
				}
				DOM.show(t.content);
				if (t.active.type == 'ajax') {
					DOM.show(t.ajax);
				}
				t.content.focus();
				// Iframe
				if (t.active.type == 'iframe') {
					// Create IFrame
					t.iframe = DOM.add(t.content, 'iframe', {
						id : 'jcemediabox-popup-iframe',
						frameBorder : 0,
						allowTransparency : true,
						scrolling : t.active.params.scrolling || 'auto',
						'style' : {
							width : t.active.width,
							height : t.active.height
						}
					});
					// Set src
					t.iframe.setAttribute('src', t.active.src);
				}
				/**
				 * Private internal function
				 * Show info areas of popup
				 */
				function showInfo() {
					// Set Information
					var itop = t['info-top'];
					if (itop) {
						each(DOM.select('*[id]', itop), function(el) {
							if (/jcemediabox-popup-(next|prev)/.test(DOM.attribute(el, 'id'))) {
								return;
							}
							DOM.show(el);
						});

						var h = DIM.outerHeight(itop);
						DOM.styles(itop, {
							'z-index' : -1,
							'top' : h,
							'visibility' : 'visible'
						});

						FX.animate(itop, {'top' : 0}, ss,  function() {
							itop.style.zIndex = 0;
						});
					}
					
					var ibottom = t['info-bottom'];
					if (ibottom) {
						each(DOM.select('*[id]', ibottom), function(el) {
							if (/jcemediabox-popup-(next|prev)/.test(DOM.attribute(el, 'id'))) {
								return;
							}
							DOM.show(el);
						});

						var h = DIM.outerHeight(ibottom);
						
						DOM.styles(ibottom, {
							'z-index' : -1,
							'top' : -h,
							'visibility' : 'visible'
						});
						
						FX.animate(ibottom, {'top' : 0}, ss,  function() {
							ibottom.style.zIndex = 0;
						});				
					}
					
					if (t.closelink) {
						DOM.show(t.closelink);
					}
				}
				// Animate fade in (not for IE if media)
				if (JCEMediaBox.isIE && t.active.type == 'media') {
					DOM.style(t.content, 'opacity', 1);
					showInfo();
				} else {
					FX.animate(t.content, {'opacity' : 1}, fs, function() {
						showInfo();
					});
				}
			});
		},
		
		/**
		 * Close the popup window. Destroy all objects
		 */
		close: function(){		
			var t = this, each = JCEMediaBox.each, DOM = JCEMediaBox.DOM;
			// Destroy objects
			each(['img', 'object', 'iframe', 'ajax'], function(i, v) {
				t[v] = null;								
			});
			// Hide closelink
			if (this.closelink) {
				DOM.hide(this.closelink);
			}
			// Empty content div
			this.content.innerHTML = '';
			// Hide info div
			each(['top', 'bottom'], function(i, v) {
				if(t['info-' + v]){
					DOM.hide(t['info-' + v]);
				}
			});
			DOM.remove(this.frame);
			
			// Fade out overlay
            
            if (this.overlay) {
                if (JCEMediaBox.isIE6) {
                    // Remove event bindings
                    this.bind();
                    // Remove body, ie: popup
                    DOM.remove(this.page);
                } else {
                    JCEMediaBox.FX.animate(this.overlay, {
                        'opacity': 0
                    }, JCEMediaBox.options.popup.fadespeed, function() {
                        t.bind();
                        DOM.remove(t.page);
                    });
                }
            } else {
                DOM.remove(this.page);
            }
			return false;
		}
	}
})();
// Cleanup events
JCEMediaBox.Event.addUnload(function() {
	JCEMediaBox.Event.destroy();
});