var Proto ={
    setOpacity: function(element, value) {
    	element.style.opacity = (value == 1 || value === '') ? '' : (value < 0.00001) ? 0 : value;
    	return element;
    },
	extend  : function(destination, source) {
  		for (var property in source) {
    		destination[property] = source[property];
 		 }
  		return destination;
	},
   getDimensions: function(element) {

    var display = JAME.CSS.getStyle(element,'display');
    if (display != 'none' && display != null)
      return {width: element.offsetWidth, height: element.offsetHeight};
    var els = element.style;
    var originalVisibility = els.visibility;
    var originalPosition = els.position;
    var originalDisplay = els.display;
    els.visibility = 'hidden';
    els.position = 'absolute';
    els.display = 'block';
    var originalWidth = element.clientWidth;
    var originalHeight = element.clientHeight;
    els.display = originalDisplay;
    els.position = originalPosition;
    els.visibility = originalVisibility;
    return {width: originalWidth, height: originalHeight};
  },
  getHeight: function(element) {
	return Proto.getDimensions(element).height;
  },
  getWidth: function(element){
	return Proto.getDimensions(element).width;
  },
  insertTop: function(element, content) {

    if (element.insertAdjacentHTML) {
      try {
        element.insertAdjacentHTML('AfterBegin', content);
      } catch (e) {}
    } else {
       this.range = element.ownerDocument.createRange();
       this.range.selectNodeContents(element);
       this.range.collapse(true);
       var frags = [this.range.createContextualFragment(content)].reverse(false);
	   for(var i=0,ln=frags.length;i<ln;i++){
      	   element.insertBefore(frags[i], element.firstChild);
	   }
    }
  }
};



JAME.extend(JAME.Events,{
	addListener : function (elm,evt, func) {

		if (!elm.listeners) elm.listeners = {};
		if (!elm.listeners[evt]) elm.listeners[evt] = [];
						
		elm.listeners[evt].push(func);
		elm["on" + evt] = JAME.Events._handleEvent;
		return elm;
	},
	_handleEvent : function (evt) {

		evt = JAME.Events.Normalize(evt);

		var listeners = this.listeners[evt.type];
		var ln     = listeners.length;
		var ret;
		for (var i=0; i<ln; i++) {
			ret = listeners[i].call(this, evt);
			if (i === (ln - 1))
				return ret;
		}
	}
});

function TweenScale (element,options) {
	this.element = element;
    this.elementPositioning = JAME.CSS.getStyle(element,'position');
    this.scaleFrom       = options.scaleFrom || 100.0;
	this.scaleTo         = options.scaleTo;
    this.scaleX          = (options.scaleX!==undefined)? options.scaleX: true;
	this.scaleY          = (options.scaleY!==undefined)? options.scaleY: true;
	this.scaleFromCenter = options.scaleFromCenter;
    this.originalStyle   = {};
	var self=this;
    ['top','left','width','height'].each(function(elm){
      self.originalStyle[elm] = element.style[elm];
	});
    this.originalTop  = element.offsetTop;
    this.originalLeft = element.offsetLeft;
    this.factor       = (this.scaleTo - this.scaleFrom)/100;
    this.dims         = [element.offsetHeight, element.offsetWidth];
}

TweenScale.prototype = {
  update: function(position) {
    var currentScale = (this.scaleFrom/100.0) + (this.factor * position);
    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
  },
  setDimensions:function (height, width) {
    	var d = {};
    	if(this.scaleX) d.width  = Math.round(width);
    	if(this.scaleY) d.height = Math.round(height);

    	if(this.scaleFromCenter) {
      		var topd  = (height - this.dims[0])/2;
      		var leftd = (width  - this.dims[1])/2;
        	if(this.elementPositioning == 'absolute') {
        		if(this.scaleY) d.top = this.originalTop-topd;
        		if(this.scaleX) d.left = this.originalLeft-leftd;
      		} else {
        		if(this.scaleY) d.top = -topd;
        		if(this.scaleX) d.left = -leftd;
      		}
    	}
    	JAME.CSS.setStyles(this.element,d);
  }
}

var lightwindow = function(options) { this.initialize(options);};	

lightwindow.prototype = {
	element : null,
	contentToFetch : null,
	windowActive : false,
	dataEffects : [],
	dimensions : {
		cruft : null,
		container : null,
		viewport : {
			height : null,
			width : null,
			offsetTop : null,
			offsetLeft : null
		}
	},
	pagePosition : {
		x : 0,
		y : 0
	},
	pageDimensions : {
		width : null,
		height : null
	},
	galleries : [],
	resizeTo : {
		height : null,
		heightPercent : null,
		width : null,
		widthPercent : null,
		fixedTop : null,
		fixedLeft : null
	},
	scrollbarOffset : 18,
	containerChange : {
		height : 0,
		width : 0
	},
	activeGallery : false,
	galleryLocation : {
		current : 0,
		total : 0
	},
	initialize : function(options) {
		this.options = Proto.extend({
			rebuildContainers : true,
			resizeSpeed : 8,
			contentOffset : {
				height : 20,
				width : 20
			},
			dimensions : {
				image : {height : 250, width : 250},
				page : {height : 250, width : 250},
				inline : {height : 250, width : 250},
				media : {height : 250, width : 250},
				external : {height : 250, width : 250},
				titleHeight : 25
			},
			classNames : {	
				standard : 'lightwindow',
				action : 'lightwindow_action'
			},
			fileTypes : {
				page : ['asp', 'aspx', 'cgi', 'cfm', 'htm', 'html', 'xhtml','pl', 'php4', 'php3', 'php', 'php5', 'phtml', 'rhtml', 'shtml', 'txt', 'vbs', 'rb'],
				media : ['aif', 'aiff', 'asf', 'avi', 'divx', 'm1v', 'm2a', 'm2v', 'm3u', 'mid', 'midi', 'mov', 'moov', 'movie', 'mp2', 'mp3', 'mpa', 'mpa', 'mpe', 'mpeg', 'mpg', 'mpg', 'mpga', 'pps', 'qt', 'rm', 'ram', 'swf', 'viv', 'vivo', 'wav'],
				image : ['bmp', 'gif', 'jpg', 'png', 'tiff']
			},
			mimeTypes : {
				avi : 'video/avi',
				aif : 'audio/aiff',
				aiff : 'audio/aiff',
				gif : 'image/gif',
				bmp : 'image/bmp',
				jpeg : 'image/jpeg',
				m1v : 'video/mpeg',
				m2a : 'audio/mpeg',
				m2v : 'video/mpeg',
				m3u : 'audio/x-mpequrl',
				mid : 'audio/x-midi',
				midi : 'audio/x-midi',
				mjpg : 'video/x-motion-jpeg',
				moov : 'video/quicktime',
				mov : 'video/quicktime',
				movie : 'video/x-sgi-movie',
				mp2 : 'audio/mpeg',
				mp3 : 'audio/mpeg3',
				mpa : 'audio/mpeg',
				mpa : 'video/mpeg',
				mpe : 'video/mpeg',
				mpeg : 'video/mpeg',
				mpg : 'audio/mpeg',
				mpg : 'video/mpeg',
				mpga : 'audio/mpeg',
				pdf : 'application/pdf',
				png : 'image/png',
				pps : 'application/mspowerpoint',
				qt : 'video/quicktime',
				ram : 'audio/x-pn-realaudio-plugin',
				rm : 'application/vnd.rn-realmedia',
				swf	: 'application/x-shockwave-flash',
				tiff : 'image/tiff',
				viv : 'video/vivo',
				vivo : 'video/vivo',
				wav : 'audio/wav',
				wmv : 'application/x-mplayer2'			
			},	
			classids : {
				mov : 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',
				swf : 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000',
				wmv : 'clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6'
			},
			codebases : {
				mov : 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0',
				swf : 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0',
				wmv : 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,5,715'
			},	
			viewportPadding : 10,
			EOLASFix : 'swf,wmv,fla,flv',
			overlay : {
				opacity : 0.7,
				image : '/common/cdn/libs/js/lightwindow/images/white.png',
				presetImage : '/common/cdn/libs/js/lightwindow/images/white-70.png'
			},
			skin : 	{
				main : 	'<div id="lightwindow_container" >'+
							'<div id="lightwindow_title_bar" >'+
								'<div id="lightwindow_title_bar_inner" >'+
									'<span id="lightwindow_title_bar_title"></span>'+
									'<a id="lightwindow_title_bar_close_link" >Close</a>'+
								'</div>'+
							'</div>'+
							'<div id="lightwindow_stage" >'+
								'<div id="lightwindow_contents" >'+
								'</div>'+
								'<div id="lightwindow_navigation" >'+
									'<a href="#" id="lightwindow_previous" >'+
										'<span id="lightwindow_previous_title"></span>'+
									'</a>'+
									'<a href="#" id="lightwindow_next" >'+
										'<span id="lightwindow_next_title"></span>'+
									'</a>'+
									'<iframe name="lightwindow_navigation_shim" id="lightwindow_navigation_shim" src="javascript:false;" frameBorder="0" scrolling="no"></iframe>'+
								'</div>'+								
								'<div id="lightwindow_galleries">'+
									'<div id="lightwindow_galleries_tab_container" >'+
										'<a href="#" id="lightwindow_galleries_tab" >'+
											'<span id="lightwindow_galleries_tab_span" class="up" >Galleries</span>'+
										'</a>'+
									'</div>'+
									'<div id="lightwindow_galleries_list" >'+
									'</div>'+
								'</div>'+
							'</div>'+
							'<div id="lightwindow_data_slide" >'+
								'<div id="lightwindow_data_slide_inner" >'+
									'<div id="lightwindow_data_details" >'+
										'<div id="lightwindow_data_gallery_container" >'+
											'<span id="lightwindow_data_gallery_current"></span>'+
											' of '+
											'<span id="lightwindow_data_gallery_total"></span>'+
										'</div>'+
										'<div id="lightwindow_data_author_container" >'+
											'by <span id="lightwindow_data_author"></span>'+
										'</div>'+
									'</div>'+
									'<div id="lightwindow_data_caption" >'+
									'</div>'+
								'</div>'+
							'</div>'+
						'</div>',	
				loading : 	'<div id="lightwindow_loading" >'+
								'<img src="/common/cdn/libs/js/lightwindow/javascript/indicator.gif" alt="loading" />'+
								'<span></span>'+
								'<iframe name="lightwindow_loading_shim" id="lightwindow_loading_shim" src="javascript:false;" frameBorder="0" scrolling="no"></iframe>'+
							'</div>',
				iframe : 	'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'+
							'<html xmlns="http://www.w3.org/1999/xhtml">'+
								'<body bgcolor="#000">'+
									'{body_replace}'+
								'</body>'+
							'</html>',
				gallery : {
					top :		'<div class="lightwindow_galleries_list">'+
									'<h1>{gallery_title_replace}</h1>'+
									'<ul>',
					middle : 			'<li>'+
											'{gallery_link_replace}'+
										'</li>',
					bottom : 		'</ul>'+
								'</div>'
				}
			},
			hideFlash : false,
			showTitleBar : true,
			onClose : undefined
		}, options || {});


		this.duration = ((11-this.options.resizeSpeed)*0.15);
		this._setupLinks();
		this._getScroll();
		this._getPageDimensions();
		this._browserDimensions();
		if(this.options.rebuildContainers)
			this._addLightWindowMarkup(false);
		this._setupDimensions(); 
	},

	activate : function(e, link){		
		this._clearWindowContents(true);		
		this._addLoadingWindowMarkup();
		this._setupWindowElements(link);
		this._getScroll();
		this._browserDimensions();
		this._setupDimensions();
		this._toggleTroubleElements('hidden', false);
		this._displayLightWindow('block', 'hidden');
		this._setStatus(true);
		this._prepareIE(true);
		this._loadWindow();
	},
	deactivate : function(){

		this.windowActive = false;
		this.animating = false;
		this._displayLightWindow('none', 'visible');
		this._clearWindowContents(false);
		this._prepareIE(false);
		this._setupDimensions();
		this._toggleTroubleElements('visible', false);	
		if(this.element.onClose) this.element.onClose();
		this.element = null;
	},
	createWindow : function(element, attributes) {
		this._processLink($(element));
	},
	activateWindow : function(options) {
		this.element = Proto.extend({
			href : null,
			title : null,
			author : null,
			caption : null,
			rel : null,
			top : null,
			left : null,
			type : null,
			showImages : null,
			height : null,
			width : null,
			loadingAnimation : null,
			iframeEmbed : null,
			form : null,
			onClose : null
		}, options || {});
		

		this.contentToFetch = this.element.href;
		this.windowType = this.element.type ? this.element.type : this._fileType(this.element.href);	
		
		this._clearWindowContents(true);
		this._addLoadingWindowMarkup();
		
		this._getScroll();
		this._browserDimensions();
		this._setupDimensions();
		this._toggleTroubleElements('hidden', false);
		this._displayLightWindow('block', 'hidden');
		this._setStatus(true);
		this._prepareIE(true);
		this._loadWindow();
	},
	_setupLinks : function() {
		var self=this;
		setTimeout(function(){
			var links = parse('.'+self.options.classNames.standard);
			links = links && links.constructor===Array ? links : links ? [links]:[];
			for(var i=0,ln=links.length;i<ln;i++){
				self._processLink(links[i]);
			}
		},1000)
	},
	_processLink : function(link) {
		
		var url = link.getAttribute('href');
		if (url.indexOf('?') > -1) {
			url = url.substring(0, url.indexOf('?'));
		}
		
		var container = url.substring(url.indexOf('#')+1);
		var elm = JAME.$(container);
		if(elm){elm.style.display = 'none';}
		
		var self = this;
		JAME.Events.addListener(link,'click', function(e) {
			e.stopPropagation();
			e.preventDefault();
			self.activate(e,link);
		});		
	},

	_setupActions : function() {

		var links = parse('#lightwindow_container .'+this.options.classNames.action);
		if(!links) return;
		var self = this;
		for(var i=0,ln=links.ln;i<ln;i++){
			(function(n){
				JAME.Events.addListener(link[n],'click', function(e) {
					e.stopPropagation();
					e.preventDefault();
					self[link.getAttribute('rel')](e,link[n]);
				});	
			})(i);
		}

	},
	
	_addLightWindowMarkup : function(rebuild) {

		var overlay = document.createElement('div');
		overlay.id  = 'lightwindow_overlay';		

		overlay.style.backgroundRepeat='repeat';
		overlay.style.height=this.pageDimensions.height+'px';

		if (navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1) {
			overlay.style.backgroundImage='url('+this.options.overlay.presetImage+')';		
		} else {
			overlay.style.backgroundImage='url('+this.options.overlay.image+')';	
			JAME.CSS.setStyles(overlay,{opacity:this.options.overlay.opacity});
		}
		
		var lw = document.createElement('div');
		lw.id= 'lightwindow';
		lw.innerHTML = this.options.skin.main;
		
		var body = document.getElementsByTagName('body')[0];
		body.appendChild(overlay);
		body.appendChild(lw);	
		var self = this;
		var elm = JAME.$('lightwindow_title_bar_close_link');
		if (elm) {
			var self = this;
			JAME.Events.addListener(elm,'click', function(e) {
				e.stopPropagation();
				e.preventDefault();
				self.deactivate(e,elm);
			});
		}
		if (window.attachEvent) {
			document.attachEvent('onmousewheel',function(e){self._stopScrolling(e,document)});
		} else {
			window.addEventListener('DOMMouseScroll',function(e){self._stopScrolling(e,document)},false);
		}
		var self = this;
		JAME.Events.addListener(overlay,'click', function(e) {
			e.stopPropagation();
			e.preventDefault();
			self.deactivate(e,overlay);
		});			
	},

	_addLoadingWindowMarkup : function() {
		JAME.$('lightwindow_contents').innerHTML += this.options.skin.loading;
	},
	_setupWindowElements : function(link) {
		this.element         = link;
		this.element.title   = null ? '' : link.getAttribute('title');
		this.element.author  = null ? '' : link.getAttribute('author');
		this.element.caption = null ? '' : link.getAttribute('caption');
		this.element.rel     = null ? '' : link.getAttribute('rel');
		this.element.params  = null ? '' : link.getAttribute('params');
		this.contentToFetch  = this.element.href;
		this.windowType = this._getParameter('lightwindow_type') ? this._getParameter('lightwindow_type') : this._fileType(this.contentToFetch);	
	},

	_clearWindowContents : function(contents) {
		var elm = JAME.$('lightwindow_iframe');
		if (elm) {
			elm.parentNode.removeChild(elm);
		}
		elm = JAME.$('lightwindow_media_primary');
		if (elm) {
			try {
				elm.Stop();
			} catch(e) {}
			elm.parentNode.removeChild(elm);
		}
		elm = JAME.$('lightwindow_media_secondary');
		if (elm) {
			try {
				elm.Stop();
			} catch(e) {}
			elm.parentNode.removeChild(elm);
		}
		
		if (contents) {
			JAME.$('lightwindow_contents').innerHTML = '';
			JAME.$('lightwindow_contents').style.overflow='hidden';	
			
			if (!this.windowActive) {
				JAME.$('lightwindow_data_slide_inner').style.display= 'none';
				JAME.$('lightwindow_title_bar_title').innerHTML = '';
			}
			JAME.$('lightwindow_data_slide').style.height= 'auto';
		}
		this.resizeTo.height = null;
		this.resizeTo.width = null;
	},
	_setStatus : function(status) {
		this.animating = status;
		if (status) {
			JAME.$('lightwindow_loading').style.display='';
		}
		if (!(/MSIE 6./i.test(navigator.userAgent))) {
			this._fixedWindow(status);
		}
	},
	_fixedWindow : function(status) {
		var elm = JAME.$('lightwindow');
		if (status) {

			if (this.windowActive) {
				this._getScroll();
				elm.style.position= 'absolute';
				elm.style.top     = parseFloat(JAME.CSS.getStyle(elm,'top'))+this.pagePosition.y+'px';
				elm.style.left    = parseFloat(JAME.CSS.getStyle(elm,'left'))+this.pagePosition.x+'px';
			} else {
				elm.style.position= 'absolute';					
			}
		} else {
			if (this.windowActive) {
				this._getScroll();
				elm.style.position='fixed';
				elm.style.top     = parseFloat(JAME.CSS.getStyle(elm,'top'))-this.pagePosition.y+'px';
				elm.style.left    = parseFloat(JAME.CSS.getStyle(elm,'left'))-this.pagePosition.x+'px';	
			} else {
				if (JAME.$('lightwindow_iframe')) {
					this._browserDimensions();
				}
				elm.style.position='fixed';
				elm.style.top     = (parseFloat(this._getParameter('lightwindow_top')) ? parseFloat(this._getParameter('lightwindow_top'))+'px' : this.dimensions.viewport.height/2+'px');
				elm.style.left    = (parseFloat(this._getParameter('lightwindow_left')) ? parseFloat(this._getParameter('lightwindow_left'))+'px' : this.dimensions.viewport.width/2+'px');
			}
		}
	},
	_prepareIE : function(setup) {
		if (window.attachEvent) {
			var height, overflowX, overflowY;
			var height =(setup) ? '100%':'auto';
			var body = document.getElementsByTagName('body')[0];
			var html = document.getElementsByTagName('html')[0];
			html.style.height = body.style.height = height;
		}
	},
	_stopScrolling : function(e) {
		if (this.animating) {
			if (e.preventDefault) {
				e.preventDefault();
			}
			e.returnValue = false;		
		}
	},
	_getScroll : function(){
      	if(typeof(window.pageYOffset) == 'number') {
        	this.pagePosition.x = window.pageXOffset;
        	this.pagePosition.y = window.pageYOffset;
      	} else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) {
	       	this.pagePosition.x = document.body.scrollLeft;
        	this.pagePosition.y = document.body.scrollTop;
		} else if(document.documentElement) {
        	this.pagePosition.x = document.documentElement.scrollLeft;
        	this.pagePosition.y = document.documentElement.scrollTop;
      	}
	},
	_setScroll : function(x, y) {
		document.documentElement.scrollLeft = x; 
		document.documentElement.scrollTop = y; 
	},
	_toggleTroubleElements : function(visibility, content){
		
		if (content) {
			var selects = JAME.$('lightwindow_contents').getElementsByTagName('select');
		} else {
			var selects = document.getElementsByTagName('select');
		}
		
		for(var i = 0; i < selects.length; i++) {
			selects[i].style.visibility = visibility;
		}
		
		if (!content) {
			if (this.options.hideFlash){
				var objects = document.getElementsByTagName('object');
				for (i = 0; i != objects.length; i++) {
					objects[i].style.visibility = visibility;
				}
				var embeds = document.getElementsByTagName('embed');
				for (i = 0; i != embeds.length; i++) {
					embeds[i].style.visibility = visibility;
				}
			}
			var iframes = document.getElementsByTagName('iframe');
			for (i = 0; i != iframes.length; i++) {
				iframes[i].style.visibility = visibility;
			}
		}
	},
	_getPageDimensions : function() {
		var xScroll, yScroll;
		if (window.innerHeight && window.scrollMaxY) {	
			xScroll = document.body.scrollWidth;
			yScroll = window.innerHeight + window.scrollMaxY;
		} else if (document.body.scrollHeight > document.body.offsetHeight){ 
			xScroll = document.body.scrollWidth;
			yScroll = document.body.scrollHeight;
		} else { 
			xScroll = document.body.offsetWidth;
			yScroll = document.body.offsetHeight;
		}

		var windowWidth, windowHeight;
		if (self.innerHeight) {	
			windowWidth = self.innerWidth;
			windowHeight = self.innerHeight;
		} else if (document.documentElement && document.documentElement.clientHeight) { 
			windowWidth = document.documentElement.clientWidth;
			windowHeight = document.documentElement.clientHeight;
		} else if (document.body) { 
			windowWidth = document.body.clientWidth;
			windowHeight = document.body.clientHeight;
		}	

		if(yScroll < windowHeight){
			this.pageDimensions.height = windowHeight;
		} else { 
			this.pageDimensions.height = yScroll;
		}

		if(xScroll < windowWidth){	
			this.pageDimensions.width = windowWidth;
		} else {
			this.pageDimensions.width = xScroll;
		}
	},
	_displayLightWindow : function(display, visibility) {
		var elm = JAME.$('lightwindow_overlay');
		elm.style.display    = JAME.$('lightwindow').style.display = JAME.$('lightwindow_container').style.display = display;	
		elm.style.visibility = JAME.$('lightwindow').style.visibility = JAME.$('lightwindow_container').style.visibility = visibility;
	},
	_setupDimensions : function() {

		var originalHeight, originalWidth;
		switch (this.windowType) {
			case 'page' :
				originalHeight = this.options.dimensions.page.height;
				originalWidth = this.options.dimensions.page.width;
				break;

			case 'image' :
				originalHeight = this.options.dimensions.image.height;
				originalWidth = this.options.dimensions.image.width;
				break;
				
			case 'media' :
				originalHeight = this.options.dimensions.media.height;
				originalWidth = this.options.dimensions.media.width;
				break;
			
			case 'external' : 
				originalHeight = this.options.dimensions.external.height;
				originalWidth = this.options.dimensions.external.width;
				break;
				
			case 'inline' :
				originalHeight = this.options.dimensions.inline.height;
				originalWidth = this.options.dimensions.inline.width;
				break;
				
			default :
				originalHeight = this.options.dimensions.page.height;
				originalWidth = this.options.dimensions.page.width;
				break;
				
		}

		var offsetHeight = this._getParameter('lightwindow_top') ? parseFloat(this._getParameter('lightwindow_top'))+this.pagePosition.y : this.dimensions.viewport.height/2+this.pagePosition.y;
		var offsetWidth = this._getParameter('lightwindow_left') ? parseFloat(this._getParameter('lightwindow_left'))+this.pagePosition.x : this.dimensions.viewport.width/2+this.pagePosition.x;
		
		JAME.$('lightwindow').style.top  = offsetHeight+'px',
		JAME.$('lightwindow').style.left = offsetWidth+'px'

		var elm = JAME.$('lightwindow_container');
		elm.style.height= originalHeight+'px';
		elm.style.width= originalWidth+'px';
		elm.style.left= -(originalWidth/2)+'px';
		elm.style.top= -(originalHeight/2)+'px';

		JAME.$('lightwindow_contents').style.height= originalHeight+'px',
		JAME.$('lightwindow_contents').style.width = originalWidth+'px'

	},
	_fileType : function(url) {
		var image = new RegExp("[^\.]\.("+this.options.fileTypes.image.join('|')+")\s*$", "i");
		if (image.test(url)) return 'image';
		if (url.indexOf('#') > -1 && (document.domain == this._getDomain(url))) return 'inline';		
		if (url.indexOf('?') > -1) url = url.substring(0, url.indexOf('?'));
		var type = 'unknown';
		var page = new RegExp("[^\.]\.("+this.options.fileTypes.page.join('|')+")\s*$", "i");
		var media = new RegExp("[^\.]\.("+this.options.fileTypes.media.join('|')+")\s*$", "i");
		if (document.domain != this._getDomain(url)) type = 'external';
	  	if (media.test(url)) type = 'media';
		if (type == 'external' || type == 'media') return type;
	  	if (page.test(url) || url.substr((url.length-1), url.length) == '/') type = 'page';
		return type;
	},
	_fileExtension : function(url) {
		if (url.indexOf('?') > -1) {
			url = url.substring(0, url.indexOf('?'));
		}
		var extenstion = '';
		for (var x = (url.length-1); x > -1; x--) {
			if (url.charAt(x) == '.') {
				return extenstion;
			}
			extenstion = url.charAt(x)+extenstion;
		}
	},
	_getDomain : function(url) {    
        var leadSlashes = url.indexOf('//');
        var domainStart = leadSlashes+2;
        var withoutResource = url.substring(domainStart, url.length);
        var nextSlash = withoutResource.indexOf('/');
        var domain = withoutResource.substring(0, nextSlash);
		if (domain.indexOf(':') > -1){
			var portColon = domain.indexOf(':');
			domain = domain.substring(0, portColon);
       	}
		return domain;
    },
	_getParameter : function(parameter, parameters) {
		if (!this.element) return false;
		if (parameter == 'lightwindow_top' && this.element.top) {
			return unescape(this.element.top);
		} else if (parameter == 'lightwindow_left' && this.element.left) {
			return unescape(this.element.left);
		} else if (parameter == 'lightwindow_type' && this.element.type) {
			return unescape(this.element.type);
		} else if (parameter == 'lightwindow_show_images' && this.element.showImages) {
			return unescape(this.element.showImages);
		} else if (parameter == 'lightwindow_height' && this.element.height) {
			return unescape(this.element.height);
		} else if (parameter == 'lightwindow_width' && this.element.width) {
			return unescape(this.element.width);
		} else if (parameter == 'lightwindow_loading_animation' && this.element.loadingAnimation) {
			return unescape(this.element.loadingAnimation);
		} else if (parameter == 'lightwindow_iframe_embed' && this.element.iframeEmbed) {
			return unescape(this.element.iframeEmbed);
		} else if (parameter == 'lightwindow_form' && this.element.form) {
			return unescape(this.element.form);
		} else {
			if (!parameters) {
				if (this.element.params) parameters = this.element.params;
				else return;
			}
			var value;
			var parameterArray = parameters.split(',');
			var compareString = parameter+'=';
			var compareLength = compareString.length;
			for (var i = 0; i < parameterArray.length; i++) {
				if (parameterArray[i].substr(0, compareLength) == compareString) {
					var currentParameter = parameterArray[i].split('=');
					value = currentParameter[1];
					break;
				}
			}
			if (!value) return false;
			else return unescape(value);
		}
	},
	_browserDimensions : function() {
		if (window.attachEvent) {
            this.dimensions.viewport.height = document.documentElement.clientHeight;
            this.dimensions.viewport.width = document.documentElement.clientWidth;   
        } else {
            this.dimensions.viewport.height = window.innerHeight;
            this.dimensions.viewport.width = document.width || document.body.offsetWidth;
        }
	},
	_getScrollerWidth : function() {
	    var scrollDiv = document.createElement('div');
		scrollDiv.id             = 'lightwindow_scroll_div';
		scrollDiv.style.position = 'absolute';
		scrollDiv.style.top      = '-10000px';
		scrollDiv.style.left     = '-10000px';
		scrollDiv.style.width    = '100px';		
		scrollDiv.style.height   = '100px';
		scrollDiv.style.overflow = 'hidden';


	    var contentDiv = document.createElement('div');
		contentDiv.id='lightwindow_content_scroll_div';
		contentDiv.style.width= '100%';
		contentDiv.style.height= '200px';

	    scrollDiv.appendChild(contentDiv);

		var body = document.getElementsByTagName('body')[0];
		body.appendChild(scrollDiv);

	    var noScroll = JAME.$('lightwindow_content_scroll_div').offsetWidth;
	    scrollDiv.style.overflow = 'auto';
    	var withScroll = JAME.$('lightwindow_content_scroll_div').offsetWidth;
		var elm = JAME.$('lightwindow_scroll_div');
		elm.parentNode.removeChild(elm);
	    this.scrollbarOffset = noScroll-withScroll;
	},
	_addParamToObject : function(name, value, object, id) {
		var param = document.createElement('param');
		param.setAttribute('value', value);
		param.setAttribute('name', name);
		if (id) {
			param.setAttribute('id', id);
		}
		object.appendChild(param);
		return object;
	},
	_outerHTML : function(object) {
 		if (window.attachEvent) {
			return object.outerHTML;
		} else {
			var clone = object.cloneNode(true);
			var cloneDiv = document.createElement('div');
			cloneDiv.appendChild(clone);
			return cloneDiv.innerHTML;
		}
	},
	_convertToMarkup : function(object, closeTag) {
		var markup = this._outerHTML(object).replace('</'+closeTag+'>', '');
		if (window.attachEvent) {
			for (var i = 0; i < object.childNodes.length; i++){
				markup += this._outerHTML(object.childNodes[i]);
			}
			markup += '</'+closeTag+'>';
		}
		return markup;
	},

	_appendObject : function(object, closeTag, appendTo) {
		if (window.attachEvent) {
			appendTo.innerHTML += this._convertToMarkup(object, closeTag);
			if (this.options.EOLASFix.indexOf(this._fileType(this.element.href)) > -1) {
				var objectElements = document.getElementsByTagName('object');
				for (var i = 0; i < objectElements.length; i++) {
					if (objectElements[i].getAttribute("data")) objectElements[i].removeAttribute('data');
					objectElements[i].outerHTML = objectElements[i].outerHTML;
					objectElements[i].style.visibility = "visible";
				}
			}
		} else {
			appendTo.appendChild(object);	
		}	
	},
	_appendIframe : function(scroll) {
		var iframe = document.createElement('iframe');
		iframe.setAttribute('id', 'lightwindow_iframe');
		iframe.setAttribute('name', 'lightwindow_iframe');
		iframe.setAttribute('src', 'about:blank');
		iframe.setAttribute('height', '100%');
		iframe.setAttribute('width', '100%');
		iframe.setAttribute('frameborder', '0');
		iframe.setAttribute('marginwidth', '0');
		iframe.setAttribute('marginheight', '0');
		iframe.setAttribute('scrolling', scroll);	
		this._appendObject(iframe, 'iframe', JAME.$('lightwindow_contents'));
	},
	_writeToIframe : function(content) {
		var template = this.options.skin.iframe;
		template = template.replace('{body_replace}', content); 
		var elm = JAME.$('lightwindow_iframe');
		if (elm.contentWindow){
			elm.contentWindow.document.open();
			elm.contentWindow.document.write(template);
			elm.contentWindow.document.close();
		} else {
			elm.contentDocument.open();
			elm.contentDocument.write(template);
			elm.contentDocument.close();
		}
	},
	_loadWindow : function() {
		switch (this.windowType) {
			case 'image' :

				var current = 0;
				var images  = [];
				this.checkImage = [];
				this.resizeTo.height = this.resizeTo.width = 0;
				this.imageCount = this._getParameter('lightwindow_show_images') ? parseInt(this._getParameter('lightwindow_show_images')) : 1;
				var self = this;
				for (var i = current; i < (current+this.imageCount); i++) {
					images[i] = document.createElement('img');
					images[i].setAttribute('id', 'lightwindow_image_'+i);
					images[i].setAttribute('border', '0');
					images[i].setAttribute('src', this.contentToFetch);
					JAME.$('lightwindow_contents').appendChild(images[i]);
					(function(n){
						var img = images[n];
						self.checkImage[n] = setInterval(function() {

							if ( img.complete && !(typeof img.naturalWidth != "undefined" && img.naturalWidth == 0)) {
								clearInterval(self.checkImage[n]);
								var imageHeight = Proto.getHeight(img);
								if (imageHeight > self.resizeTo.height) {
									self.resizeTo.height = imageHeight;
								}
								self.resizeTo.width += Proto.getWidth(img);
								self.imageCount--;
								img.style.height=img.style.width= '100%';
								if (self.imageCount == 0) {
									self._processWindow();
								}
							}
						}, 10); 
					})(i);
				}
			break;
		
		case 'media' :			
		
			var current = 0;
			this.resizeTo.height = this.resizeTo.width = 0;

			if (this._getParameter('lightwindow_iframe_embed')) {
				this.resizeTo.height = this.dimensions.viewport.height;
				this.resizeTo.width = this.dimensions.viewport.width;	
			} else {
				this.resizeTo.height = this._getParameter('lightwindow_height');
				this.resizeTo.width = this._getParameter('lightwindow_width');				
			}
			
			this._processWindow();
			
			break;

		case 'external' :		

			this._appendIframe('auto');
			this.resizeTo.height = this.dimensions.viewport.height;
			this.resizeTo.width = this.dimensions.viewport.width;	
			this._processWindow();

			break;
				
		case 'page' :	
			var self = this;
			new JAME.Ajax({
				url:this.contentToFetch,
				onSuccess :function(response) {
					var elm =JAME.$('lightwindow_contents');
					elm.innerHTML += response;
					self.resizeTo.height = elm.scrollHeight+(self.options.contentOffset.height);
					self.resizeTo.width = elm.scrollWidth+(self.options.contentOffset.width);
					self._processWindow();
				}
			})
			break;
			
		case 'inline' : 
		
			var content = this.contentToFetch;
			if (content.indexOf('?') > -1) {
				content = content.substring(0, content.indexOf('?'));
			}
			content = content.substring(content.indexOf('#')+1);
			
			var elm = JAME.$('lightwindow_contents');

			Proto.insertTop(elm, JAME.$(content).innerHTML);
			
			this.resizeTo.height = elm.scrollHeight+(this.options.contentOffset.height);
			this.resizeTo.width = elm.scrollWidth+(this.options.contentOffset.width);
			
			this._toggleTroubleElements('hidden', true); 			
			this._processWindow();
			
			break;
			
		default : 
			throw("Page Type could not be determined, please amend this lightwindow URL "+this.contentToFetch);
			break;
		}
	},
	_resizeWindowToFit : function() {
		if (this.resizeTo.height+this.dimensions.cruft.height > this.dimensions.viewport.height) {
			var heightRatio = this.resizeTo.height/this.resizeTo.width;
			this.resizeTo.height = this.dimensions.viewport.height-this.dimensions.cruft.height-(2*this.options.viewportPadding);
			if (this.windowType == 'image' || (this.windowType == 'media' && !this._getParameter('lightwindow_iframe_embed'))) {
				this.resizeTo.width = this.resizeTo.height/heightRatio;
				JAME.$('lightwindow_data_slide_inner').style.width=this.resizeTo.width+'px'		
			}
		} 
		if (this.resizeTo.width+this.dimensions.cruft.width > this.dimensions.viewport.width) {
			var widthRatio = this.resizeTo.width/this.resizeTo.height;
			this.resizeTo.width = this.dimensions.viewport.width-2*this.dimensions.cruft.width-(2*this.options.viewportPadding);
			if (this.windowType == 'image' || (this.windowType == 'media' && !this._getParameter('lightwindow_iframe_embed'))) {
				this.resizeTo.height = this.resizeTo.width/widthRatio;
				JAME.$('lightwindow_data_slide_inner').style.height=this.resizeTo.height+'px'
			}
		}
	},
	_presetWindowSize : function() {
		if (this._getParameter('lightwindow_height')) {
			this.resizeTo.height = parseFloat(this._getParameter('lightwindow_height'));
		}
		if (this._getParameter('lightwindow_width')) {
			this.resizeTo.width = parseFloat(this._getParameter('lightwindow_width'));
		}
	},
	_processWindow : function() {

		this.dimensions.dataEffects = [];

		if (this.element.caption || this.element.author) {
			var elm = JAME.$('lightwindow_data_caption');
			if (this.element.caption) {
				elm.innerHTML = this.element.caption;
				elm.style.display= 'block';
			} else {
				elm.style.display= 'none';				
			}
			if (this.element.author) {
				JAME.$('lightwindow_data_author').innerHTML = this.element.author;
				JAME.$('lightwindow_data_author_container').style.display= 'block';
			} else {
				JAME.$('lightwindow_data_author_container').style.display= 'none';			
			}

			JAME.$('lightwindow_data_gallery_container').style.display='none';			

			JAME.$('lightwindow_data_slide_inner').style.display= 'block';
			JAME.$('lightwindow_data_slide_inner').style.width= this.resizeTo.width+'px';
			JAME.$('lightwindow_data_slide_inner').style.height= 'auto';
			JAME.$('lightwindow_data_slide_inner').style.visibility= 'visible';

			JAME.$('lightwindow_data_slide').style.display  = Proto.getHeight(JAME.$('lightwindow_data_slide'))+'px';
			JAME.$('lightwindow_data_slide').style.width    = '1px';
			JAME.$('lightwindow_data_slide').style.overflow = 'hidden';
			JAME.$('lightwindow_data_slide').style.display  = 'block';

		} else {
			JAME.$('lightwindow_data_slide').style.display= 'none';
			JAME.$('lightwindow_data_slide').style.width  = 'auto';
			JAME.$('lightwindow_data_slide_inner').style.display= 'none';
			JAME.$('lightwindow_data_slide_inner').style.visibility= 'hidden';
			JAME.$('lightwindow_data_slide_inner').style.width= this.resizeTo.width+'px';
			JAME.$('lightwindow_data_slide_inner').style.height= '0px';
		}

		JAME.$('lightwindow_title_bar_title').innerHTML = (this.element.title != 'null')?this.element.title:'';



		var originalContainerDimensions = {
			height: Proto.getHeight(JAME.$('lightwindow_container')), 
			width:  Proto.getWidth(JAME.$('lightwindow_container'))
		};

    	JAME.$('lightwindow_container').style.height= 'auto';
		JAME.$('lightwindow_container').style.width= Proto.getWidth(JAME.$('lightwindow_container'))+this.options.contentOffset.width-(this.windowActive ? this.options.contentOffset.width : 0)+'px';

		var newContainerDimensions = {
			height: Proto.getHeight(JAME.$('lightwindow_container')),
			width:  Proto.getWidth(JAME.$('lightwindow_container'))
		};	
		this.containerChange = {
			height: originalContainerDimensions.height-newContainerDimensions.height, 
			width: originalContainerDimensions.width-newContainerDimensions.width
		};

		this.dimensions.container = {
			height: Proto.getHeight(JAME.$('lightwindow_container')), 
			width:  Proto.getWidth(JAME.$('lightwindow_container'))
		};
		this.dimensions.cruft = {
			height: this.dimensions.container.height-Proto.getHeight(JAME.$('lightwindow_contents'))+this.options.contentOffset.height,
			width: this.dimensions.container.width-Proto.getWidth(JAME.$('lightwindow_contents'))+this.options.contentOffset.width
		};

		this._presetWindowSize();
		this._resizeWindowToFit();

		if (!this.windowActive) {
		   	JAME.$('lightwindow_container').style.left= -(this.dimensions.container.width/2)+'px';
			JAME.$('lightwindow_container').style.top= -(this.dimensions.container.height/2)+'px';
		}
		elm = JAME.$('lightwindow_container');
	    elm.style.height= this.dimensions.container.height+'px';
		elm.style.width = this.dimensions.container.width+'px';

		this._displayLightWindow('block', 'visible');
		this._defaultAnimationHandler();
	},

	_defaultAnimationHandler : function() {	
		var self=this;
		if (this.element.caption || this.element.author) {
			JAME.$('lightwindow_data_slide').style.display= 'none';
			JAME.$('lightwindow_data_slide').style.width  = 'auto';
			this.dimensions.dataEffects.push(function(){
				return new JAME.FX({duration:self.duration*1000}).Tween(JAME.$('lightwindow_data_slide'),{opacity:[0,1]});
			});
		}
		JAME.$('lightwindow_title_bar_inner').style.height    = '0px';
		JAME.$('lightwindow_title_bar_inner').style.marginTop = this.options.dimensions.titleHeight+'px';
		this.dimensions.dataEffects.push(function(){
			return new JAME.FX({}).Tween(JAME.$('lightwindow_title_bar_inner'),{opacity:[0,1],height: self.options.dimensions.titleHeight, marginTop:[-self.options.dimensions.titleHeight,0]});
		});

		var elm     = JAME.$('lightwindow_contents');		
		var resized = false;


		var ratio = this.dimensions.container.width-Proto.getWidth(elm)+this.resizeTo.width+this.options.contentOffset.width;
		var contents=[];
		var container=[];
		var fx2 = new JAME.FX({duration:700});
		if (ratio != Proto.getWidth(JAME.$('lightwindow_container'))) {
			contents.push(new TweenScale(JAME.$('lightwindow_contents'),{
				scaleFrom:100*(Proto.getWidth(elm)/(Proto.getWidth(elm)+self.options.contentOffset.width)),
				scaleTo  :100*(self.resizeTo.width/Proto.getWidth(elm)),
				scaleFromCenter:false,
			  	scaleY:false
			}));
			container.push(new TweenScale(JAME.$('lightwindow_container'),{
				scaleFrom:100,
				scaleTo  :100*(ratio/(self.dimensions.container.width)),
				scaleFromCenter:true,
			  	scaleY:false
			}));
		}
		ratio = this.dimensions.container.height-Proto.getHeight(elm)+this.resizeTo.height+this.options.contentOffset.height;
		if (ratio != Proto.getHeight(JAME.$('lightwindow_container'))) {
			contents.push(new TweenScale(JAME.$('lightwindow_contents'),{
				scaleFrom:100*(Proto.getHeight(elm)/(Proto.getHeight(elm)+(self.options.contentOffset.height))),
				scaleTo  :100*(self.resizeTo.height/Proto.getHeight(elm)),
				scaleFromCenter:false,
			  	scaleX:false
			}));
			container.push(new TweenScale(JAME.$('lightwindow_container'),{
				scaleFrom:100,
				scaleTo  :100*(ratio/(self.dimensions.container.height)),
				scaleFromCenter:true,
			  	scaleX:false
			}));
			resized = true;
		}

		setTimeout(function() {
			fx2.Tween(JAME.$('lightwindow_container'),{});
			fx2.addListener('onTween',function() {
				var pos=(fx2.actualTime - fx2.startingTime) / fx2.duration;
				container[0].update(pos);
				contents[0].update(pos);
			});
			fx2.addListener('onComplete',function() {
				container[0].update(1);
				contents[0].update(1);
				var fx3 = new JAME.FX().Tween(JAME.$('lightwindow_contents'),{});
				fx3.addListener('onTween',function() {
					var pos=(fx2.actualTime - fx2.startingTime) / fx2.duration;
					container[1].update(pos);
					contents[1].update(pos);
				});
				fx3.addListener('onComplete',function() {
					container[1].update(1);
					contents[1].update(1);
					var anim;
					if (self.dimensions.dataEffects.length > 0) {
						for(var i=0,ln=self.dimensions.dataEffects.length;i<ln;i++){
							anim=self.dimensions.dataEffects[i]();
							if(i==ln-1)
								anim.queue(function() {setTimeout(function() {self._finishWindow();},400);})
						}
					}
				});
			});
		},250);
		
	
		if (!resized) {	

			var anim;
			if (self.dimensions.dataEffects.length > 0) {
				if (this.containerChange.height != 0 || this.containerChange.width != 0) {
					new JAME.FX().Twee(JAME.$('lightwindow_container'), {height:this.containerChange.height, width:this.containerChange.width});
				}
				for(var i=0,ln=self.dimensions.dataEffects.length;i<ln;i++){
					anim=self.dimensions.dataEffects[i]();
					if(i==ln-1)
						anim.queue(function() {setTimeout(function() {self._finishWindow();},400);})
				}
			}
		}			
		
	},
	_defaultfinalWindowAnimationHandler : function(delay) {
		if (this.windowType == 'media' || this._getParameter('lightwindow_loading_animation')) {	
			JAME.$('lightwindow_loading').style.display='none';
			this._setStatus(false);
		} else {
			var self = this;
			new JAME.FX({duration:750}).Tween(JAME.$('lightwindow_loading'),{opacity:[1,0],display:['','none']}).queue(
				function(){
					if (self.windowType != 'image' && self.windowType != 'media' && self.windowType != 'external') {
						JAME.$('lightwindow_contents').style.overflow='auto';
					}
					self._setStatus(false);
				}
			);
		}
	},

	/*ANIMATION RELATED END */


	_finishWindow : function() {
		if (this.windowType == 'external' && JAME.$('lightwindow_iframe')) {
			JAME.$('lightwindow_iframe').setAttribute('src', this.element.href);
			this._defaultfinalWindowAnimationHandler(1);	
		} else if (this.windowType == 'media') {

			var outerObject = document.createElement('object');
			outerObject.setAttribute('classid', this.options.classids[this._fileExtension(this.contentToFetch)]);
			outerObject.setAttribute('codebase', this.options.codebases[this._fileExtension(this.contentToFetch)]);
			outerObject.setAttribute('id', 'lightwindow_media_primary');
			outerObject.setAttribute('name', 'lightwindow_media_primary');
			outerObject.setAttribute('width', this.resizeTo.width);
			outerObject.setAttribute('height', this.resizeTo.height);
			outerObject = this._addParamToObject('movie', this.contentToFetch, outerObject);
			outerObject = this._addParamToObject('src', this.contentToFetch, outerObject);
			outerObject = this._addParamToObject('controller', 'true', outerObject);
			outerObject = this._addParamToObject('wmode', 'transparent', outerObject);
			outerObject = this._addParamToObject('cache', 'false', outerObject);
			outerObject = this._addParamToObject('quality', 'high', outerObject);

			if (!window.attachEvent) {
				var innerObject = document.createElement('object');
				innerObject.setAttribute('type', this.options.mimeTypes[this._fileExtension(this.contentToFetch)]);
				innerObject.setAttribute('data', this.contentToFetch);
				innerObject.setAttribute('id', 'lightwindow_media_secondary');
				innerObject.setAttribute('name', 'lightwindow_media_secondary');
				innerObject.setAttribute('width', this.resizeTo.width);
				innerObject.setAttribute('height', this.resizeTo.height);
				innerObject = this._addParamToObject('controller', 'true', innerObject);
				innerObject = this._addParamToObject('wmode', 'transparent', innerObject);
				innerObject = this._addParamToObject('cache', 'false', innerObject);
				innerObject = this._addParamToObject('quality', 'high', innerObject);
			
				outerObject.appendChild(innerObject);
			}	
			
			if (this._getParameter('lightwindow_iframe_embed')) {
				this._appendIframe('no');
				this._writeToIframe(this._convertToMarkup(outerObject, 'object'));
			} else {
				this._appendObject(outerObject, 'object', JAME.$('lightwindow_contents'));
			}
			this._defaultfinalWindowAnimationHandler(0);
		} else {
			this._defaultfinalWindowAnimationHandler(0);
		}
		this._setupActions();
	}
}

JAME.DOM.Ready(lightwindowInit);

function lightwindowInit() {
	window.myLightWindow = new lightwindow();
}
