;var WelBoxed = new Class({
	type: 0xF00,
	elements: [],
	titles: [],
	options: {
		'loader': '/images/bouncy.gif',

		'background-opacity': '.7',
		'controls-opacity': '.5',
		
		'control-next-title': 'next',
		'control-prev-title': 'prev',
		
		'width': 700,
		'height': 304
	},
	initialize: function(anchorClass, type, options) {
		if (options && typeof options == 'object')
			this._mergeOptions(options);
		
		this.type = type;
		
		var me = this;
		$$('.' + anchorClass).each(function(element, index) {
			me.elements.push(element.get('href'));
			
			var title = '';
			if (element.getProperty('title'))
				title = element.getProperty('title');
			
			me.titles.push(title);
			
			element.addEvent('click', function(e) {
				new Event(e).stop();
				
				me.showOverlay(index);
			});
		});
	},
	createOverlay: function() {
		if (!WelBoxed._overlay) {
			var offset = window.getSize().y;
			if (Browser.Engine.trident)
				offset = window.getSize().y + document.body.scrollTop || window.pageYOffset;
			
			WelBoxed._overlay = new Element('div')
				.set('id', 'welboxed-background-layer')
				.addClass('welboxed-background-layer')
				.setStyles({
					'width': (window.getSize().x + 50) + 'px',
					'height': offset + 'px',
					'opacity': '0'
				});
			
			if (Browser.Engine.trident) {
				WelBoxed._overlay.addClass('welboxed-background-layer-ie-fix');
			}
			
			WelBoxed._overlay.inject(document.body);
			
			WelBoxed._overlay.addEvent('click', function(e) {
				new Event(e).stop();
				
				WelBoxed.close();
			});
		}
	},
	showOverlay: function(index) {
		this.createOverlay();
		
		var me = this;
		WelBoxed._overlay.set('morph', {
			'duration': 500,
			onStart: function() {
				WelBoxed._overlay.setStyle('display', 'block');
			},
			onComplete: function() {
				me.openBox(index);
			}
		});
	
		WelBoxed._overlay.morph({
			'opacity': me.options['background-opacity']
		});
	},
	openBox: function(index) {
		var offset = window.getSize().y / 2;
		if (Browser.Engine.trident) {
			offset = ((window.getSize().y / 2) + (document.body.scrollTop || window.pageYOffset));
		}
			
		var box = new Element('div')
			.set('id', 'welboxed-popup-layer')
			.addClass('welboxed-popup-layer')
			.setStyles({
				'top': offset + 'px',
				'left': (window.getSize().x / 2) + 'px'
			})
			.set('html', '<center><img src="' + this.options['loader'] + '" style="border: 0; padding: 2px;" /></center>');
		
		if (Browser.Engine.trident) {
			box.addClass('welboxed-popup-layer-ie-fix');
		}
		
		box.inject(document.body);
		
		if (this.type == WelBoxed.GALLERY) {
			this._showImage(index);
		} else if (this.type == WelBoxed.MAPS) {
			this._showMaps();
		} else {
			this._showAjax(index);
		}
	},
	_showImage: function(index) {
		var me  = this;
		var img = new Asset.images(this.elements[index], {
			title: 'welboxed-image',
			onComplete: function() {
				me._setPopupTransformation(img[0], index);
			}
		});
	},
	_showAjax: function(index) {
		var me = this;
		new Request({
			'method': 'post',
			'url': me.elements[index],
			'data': {
				'welboxed': 'true'
			},
			'evalScripts': true,
			onComplete: function(response) {
				var div = new Element('div')
					.set('html', response);
				
				me._setPopupTransformation(div, index);
			}
		}).send();
	},
	_showMaps: function() {
		if (!this.options['callback'] || typeof this.options['callback'] != 'function')
			return;
			
		var maps = new Element('div');
		maps.set('id', 'gm-container');
		maps.setStyles({
			'width': '900px',
			'height': '400px'
		});
		
		this._setPopupTransformation(maps, 1, this.options['callback']);
	},
	_setPopupTransformation: function(element, index, callback) {
		$('welboxed-popup-layer').empty();
		
		var me = this;
		$('welboxed-popup-layer').set('morph', {
			duration: 300,
			onComplete: function() {
				me._setElementStyles(element);
				me._createInnerLayer();
				
				me._injectElement(element);
				
				if (me.elements.length > 1)
					me._setUpControls(index);
				
				if (callback)
					callback();
			}
		});
		
		me._startTransformation(element);
	},
	_startTransformation: function(element) {
		var width, height = 0;
		
		if (this.type == WelBoxed.GALLERY) {
			width  = element.width  + 30;
			height = element.height + 30;
		} else {
			width  = this.options['width'];
			height = this.options['height'];
		}
		
		var offset = window.getSize().y / 2;
		if (Browser.Engine.trident) {
			offset = ((window.getSize().y / 2) + (document.body.scrollTop || window.pageYOffset));
		}
		
		$('welboxed-popup-layer').morph({
			'width': width + 'px',
			'height': height + 'px',
			'top': (offset - (height / 2)) + 'px',
			'left': ((window.getSize().x / 2) - (width / 2)) + 'px'
		});
	},
	_setElementStyles: function(element) {
		element.setStyle('opacity', 0);
	},
	_createInnerLayer: function() {
		new Element('div')
			.set('id', 'welboxed-inner-layer')
			.inject($('welboxed-popup-layer'));
		
		if (this.type == WelBoxed.GALLERY)
			$('welboxed-inner-layer').addClass('gallery-container');
		else
			$('welboxed-inner-layer').addClass('ajax-container');
	},
	_injectElement: function(element) {
		element.inject($('welboxed-inner-layer'));
		element.morph({
			'opacity': 1
		});
	},
	_setUpControls: function(currentIndex) {
		var me = this;
		
		if (currentIndex > 0) {
			new Element('div')
				.set('id', 'welboxed-prev-control')
				.addClass('welboxed-popup-control')
				.setStyle('opacity', me.options['controls-opacity'])
				.inject($('welboxed-inner-layer'))
				.addEvent('click', function(e) {
					new Event(e).stop();
					
					me._openSmooth(currentIndex - 1);
				});
			new Element('a')
				.set('html', me.titles[currentIndex - 1]) //me.options['control-prev-title'])
				.inject($('welboxed-prev-control'));
		}
		
		if (currentIndex < (me.elements.length - 1)) {
			new Element('div')
				.set('id', 'welboxed-next-control')
				.addClass('welboxed-popup-control')
				.setStyle('opacity', me.options['controls-opacity'])
				.inject($('welboxed-inner-layer'))
				.addEvent('click', function(e) {
					new Event(e).stop();
					
					me._openSmooth(currentIndex + 1);
				});
			new Element('a')
				.set('html', me.titles[currentIndex + 1]) //me.options['control-next-title'])
				.inject($('welboxed-next-control'));
		}
	},
	_openSmooth: function(index) {
		var me = this;
		
		$$('.welboxed-popup-control').dispose();
		
		$('welboxed-popup-layer').set('morph', {
			onComplete: function() {
				$('welboxed-popup-layer').dispose();
				me.openBox(index);
			}
		});
		
		$('welboxed-popup-layer').morph({
			'opacity': 0
		});
	},
	_mergeOptions: function(options) {
		for (prop in options)
			this.options[prop] = options[prop];
	}
});
WelBoxed.AJAX     = 0xF00;
WelBoxed.GALLERY  = 0xBABE;
WelBoxed.MAPS     = 0xCAFE;

WelBoxed._overlay = false;
WelBoxed.close = function() {
	if ($defined($('welboxed-background-layer'))) {
		$('welboxed-background-layer').set('morph', {
			'duration': 300,
			onStart: function() {
				if ($defined($('welboxed-popup-layer')))
					$('welboxed-popup-layer').dispose();
			},
			onComplete: function() {
				$('welboxed-background-layer').setStyle('display', 'none');
			}
		});
		$('welboxed-background-layer').morph({
			'opacity': 0
		});
	}
};
