var popBox = new Class({

	initialize: function(options) {
		if(!options)options = {};
		this.options = options;

		this.options.overlayColor = '#fff';
		this.options.overlayOpacity = 0.5;
		
		this.wsize   = window.getSize();
		this.wscroll = window.getScroll();
		this.ssize = window.getScrollSize();

		this.zIndex  = 65555;
		this.display = 0;

		this.Overlay = new Element('div', {
			'styles': {
				'display'           : 'none',
				'position'          : 'absolute',
				'top'               : '0',
				'left'              : '0',
				'opacity'           : this.options.overlayOpacity,
				'z-index'           : this.zIndex,
				'background-color'  : this.options.overlayColor,
				'width'             : this.wsize.x + 'px',
				'height'            : this.ssize.y + 'px'
			}
		});

		if(!this.options.boxClass)this.options.boxClass = '';

		var table = '<table class="BoxTable" cellpadding="0" cellspacing="0"><tr><td class="corner top-left"></td><td class="border-h"></td><td class="corner top-right"></td></tr><tr><td class="border-v"></td><td class="content-td" valign="center" align="center"><div class="content '+this.options.boxClass+'"></div></td><td class="border-v"></td></tr><tr><td class="corner bottom-left"></td><td class="border-h"></td><td class="corner bottom-right"></td></tr></table>';

		this.Box = new Element('div', {
			'class'	: 'BoxContainer '+this.options.boxClass,

			'styles': {
				'visibility'        : 'hidden',
				'position'          : 'absolute',
				'top'               : '0',
				'left'				: '0',
				'z-index'           : this.zIndex
			},

			'html' : table
		});

		this.Content = this.Box.getElement('.content');
		this.Overlay.injectInside(document.body);
		this.Box.injectInside(document.body);

		
		if(this.options.width > 0) {
			this.Box.setStyle('width', this.options.width);
		}
		
		if(this.options.height > 0) {
			this.Box.setStyle('height', this.options.height);
		}
		
		this.Box.morph = new Fx.Morph(this.Box, {duration: 400, transition: Fx.Transitions.Sine.easeOut}).addEvent('onComplete', function(){
				if(this.loader && this.Content.getElement('.loader')){
					this.loader.addClass('active');
					this.Content.getElement('.loader').dispose();
					this.Box.removeClass('frame');

					
					if(this.Content.getElement('.box-header')) {
						this.loader.injectAfter(this.Content.getElement('.box-header'));
					}

					else this.loader.injectInside(this.Content);

					if(this.options.onLoad) {
						this.options.onLoad(this.Content);
					}

					if(this.loader.getElement('.inputText'))this.loader.getElement('.inputText').focus();
				}
		}.bind(this));

		window.addEvents({
			'resize': function() {
				if(this.display == 1) {
					
					this.wsize   = window.getSize();
					this.wscroll = window.getScroll();
					this.ssize = window.getScrollSize();

					this.Overlay.setStyles({'height': this.ssize.y, 'width': this.wsize.x, 'top': 0});

					this.changeDimensions();
				}
			}.bind(this),

			'scroll': function() {
				if(this.display == 1) {
					this.wsize   = window.getSize();
					this.wscroll = window.getScroll();
					this.ssize = window.getScrollSize();
							
					this.changeDimensions();
				}
			}.bind(this)
		});

		if(this.options.closable)this.Overlay.addEvent('click', function() {
			this.complete(true);		
		}.bind(this));

	},

	morphEnd: function() {
		this.morphEndFunction();
		this.morphEndFunction = false;
	},

	setPosition: function() {
		var x = (this.wscroll.x + (this.wsize.x - this.Box.offsetWidth) / 2).toInt();
		var y = (this.wscroll.y + (this.wsize.y - this.Box.offsetHeight) / 2).toInt();
		if(y < this.wscroll.y) y = this.wscroll.y+30;

		this.Box.setStyles({'left': x, 'top': y});
	},

	changeDimensions: function(w, h, loader) {

		if(loader) {
			this.loader = loader;
		}
		
		if(!w) {
			var w = this.Box.offsetWidth;
		}

		if(!h) {
			var h = this.Box.offsetHeight;
		}

		var x = (this.wscroll.x + (this.wsize.x - w) / 2).toInt();
		var y = (this.wscroll.y + (this.wsize.y - h) / 2).toInt();
		if(y < this.wscroll.y) y = this.wscroll.y+30;

		this.Box.morph.cancel();

		this.Box.morph.start({'width': w, 'height': h, 'left': x, 'top': y});
	},

	show: function() {
		this.setPosition();
		this.Overlay.show();
		this.Box.setStyle('visibility', 'visible').show();

		$$('iframe').setStyle('visibility', 'hidden');

		this.display = 1;
	},

	hide: function() {
		this.Overlay.hide();
		this.Box.hide();
		this.display = 0;

		$$('iframe').setStyle('visibility', 'visible');
	},

	remove: function() {
		this.Overlay.dispose();
		this.Box.dispose();
		this.display = 0;
	},

	complete: function(returnvalue) {

		var _return = '';

		if(typeof(returnvalue) == 'string') {
			_return = returnvalue;
		}

		else if(typeof(returnvalue) == 'object') {
			
			if(returnvalue[0].type) {
				if(returnvalue[0].value == '')return false;
				else {
					if(returnvalue.length == 1)_return = returnvalue[0].value;
					else _return = returnvalue;
				}
			}

			else if(returnvalue.type) {
				if(returnvalue.value == '')return false;
				else _return = returnvalue;
			}
		}

		else if(typeof(returnvalue) == 'boolean') {
			_return = returnvalue;
		}


		this.hide();

		if(this.options.onComplete) {
			this.options.onComplete(_return);
		}

		this.remove();
	}

});


var LightBox = new Class({

	initialize: function(options) {
		this.setGalleries();
	},

	addToGallery: function(a) {
		var gallery = a.get('rel');
		var href = a.get('href');
		
		if(!this.galleries[gallery])this.galleries[gallery] = new Array();
		this.galleries[gallery].push(a);

		var index = this.galleries[gallery].length-1;

		a.removeEvents('click');

		a.addEvent('click', function() {
			this.showGalleryItem(href, gallery, index);
			return false;
		}.bind(this));
	
	},

	setGalleries: function() {
		this.galleries = new Array();
		var alinks = $(document.body).getElements('a[rel^=imagepop\[]');

		alinks.each(function(a, index){
			this.addToGallery(a);
		}.bind(this));
	},


	show: function(h, title, header, vid) {
		this.showGalleryItem(h, false, false, title, header, vid);
	},

	showGalleryItem: function(href, gallery, index, title, header, vid) {

		if(this.galleries[gallery]){
			var g = this.galleries[gallery];
			var a = this.galleries[gallery][index];
			var href = a.get('href');
			if(a.get('vid')){
				var vid = a.get('vid');
			}

			else var vid = '';

			if(a.get('header'))this.galleryHeader = a.get('header');
			else this.galleryHeader = false;

			if(a.get('title'))this.galleryTitle = a.get('title');
			else this.galleryTitle = false;
		}

		else {
			var g = new Array();
			var a = false;
			var href = href;
			var vid = vid;

			this.galleryHeader = title;
			this.galleryTitle = header;
		}

		this.setGalleries();

		if(!this.lbPopup) {
			this.lbPopup = new popBox();

			document.addEvents({
				'keydown': function(event){ if(this.lbPopup){

					if(event.key == 'esc' || event.key == 'enter') {
						this.lbPopup.complete(true);
						this.lbPopup = false;
					}

				}}.bind(this)
			});
		}

		$$('.gl-iframe').dispose();
		this.lbPopup.Box.addClass('frame');
		this.lbPopup.loaderCnt = new Element('div', {'class': 'box-iframe gl-iframe'});
		this.lbPopup.loaderCnt.injectInside($(document.body));	

		this.lbPopup.loaderCnt.setStyles({
			'width': 'auto',
			'height': 'auto'
		});

		this.lbPopup.Content.set('html', '<div class="loader"></div>');

		var content = '';
		if(this.galleryHeader)content += '<div class="box-header"><label>'+this.galleryHeader+'</label></div>';

		content += '<div class="box-footer">';

		if(this.galleryTitle) {
			content += '<div class="title" style="display: none;">'+this.galleryTitle+'</div>';
		}

		content += '<input type="submit" class="cancelButton glClose" value="'+lang.close+'" />';

		if(g.length > 1) {
			content += '<input type="submit" class="submitButton glNext" value="'+lang.next+'" /><input type="submit" class="submitButton glPrev" value="'+lang.previous+'" />';
		}

		content += '</div>';

		this.lbPopup.loaderCnt.set('html', content);

		if(this.lbPopup.loaderCnt.getElement('.glNext')) {
			this.galleryNext = this.lbPopup.loaderCnt.getElement('.glNext');

			this.galleryNext.addEvent('click', function(){
				var n = index+1;
				if(n > g.length-1)n = 0;
				this.showGalleryItem(false, gallery, n);
			}.bind(this));
		}

		if(this.lbPopup.loaderCnt.getElement('.glPrev')) {
			this.galleryPrev = this.lbPopup.loaderCnt.getElement('.glPrev');

			this.galleryPrev.addEvent('click', function(){
				var n = index-1;
				if(n < 0)n = g.length-1;
				this.showGalleryItem(false, gallery, n);
			}.bind(this));
		}

		this.lbPopup.loaderCnt.getElement('.glClose').addEvent('click', function(){
			this.lbPopup.complete(true);
			this.lbPopup = false;
		}.bind(this));

		this.lbPopup.Overlay.addEvent('click', function(){
			this.lbPopup.complete(true);
			this.lbPopup = false;
		}.bind(this));

		this.lbPopup.show();

		if(href.test('.jpg') || href.test('.jpeg') || href.test('.gif') || href.test('.png')){		
			var imageAsset = new Asset.image(href, { onload:function(img){
				img.injectBefore(this.lbPopup.loaderCnt.getElement('.box-footer'));
				var w = this.lbPopup.loaderCnt.getSize().x;

				if(this.lbPopup.loaderCnt.getElement('.box-footer').getElement('.title'))
				this.lbPopup.loaderCnt.getElement('.box-footer').getElement('.title').setStyle('display', '');

				var h = this.lbPopup.loaderCnt.getSize().y;

				h = h+20;
				if(this.galleryHeader)h = h+17;

				this.lbPopup.Content.getElement('.loader').setStyle('background', 'none');
				this.lbPopup.changeDimensions(w+(this.lbPopup.Box.offsetWidth-this.lbPopup.Content.offsetWidth), h+(this.lbPopup.Box.offsetHeight-this.lbPopup.Content.offsetHeight), this.lbPopup.loaderCnt);
			}.bindWithEvent(this)});	
		}


		if(href.test('.swf')){
			var vars = '';
			if(a.get('vars'))vars = a.get('vars');

			var w = 465;
			var h = 344;

			var swfObj = new Swiff(href,{
				width:w,
				height:h,
				params:{ wMode:'opaque', swLiveConnect:'false', allowFullScreen: 'true', FlashVars: vars}
			});

			h = h+20;
			if(this.galleryHeader)h = h+17;

			(function(){
				if(this.lbPopup.loaderCnt.getElement('.box-footer')){
					var canvas = new Element('div').grab(swfObj).injectBefore(this.lbPopup.loaderCnt.getElement('.box-footer'));
				}

				else this.lbPopup.loaderCnt.grab(swfObj); 

				this.lbPopup.Content.getElement('.loader').setStyle('background', 'none');
				this.lbPopup.changeDimensions(w+(this.lbPopup.Box.offsetWidth-this.lbPopup.Content.offsetWidth), h+(this.lbPopup.Box.offsetHeight-this.lbPopup.Content.offsetHeight), this.lbPopup.loaderCnt);

			}).delay(500,this);
		}



		if(href.test('.youtube')){
		
			href = 'http://www.youtube.com/v/'+vid+'&hl=en_US&fs=1&';

			var w = 465;
			var h = 344;

			var swfObj = new Swiff(href,{
				width:w,
				height:h,
				params:{ wMode:'opaque', swLiveConnect:'false', allowFullScreen: 'true', allowscriptaccess: 'always'}
			});

			h = h+20;
			if(this.galleryHeader)h = h+17;

			(function(){
				if(this.lbPopup.loaderCnt.getElement('.box-footer')){
					var canvas = new Element('div').grab(swfObj).injectBefore(this.lbPopup.loaderCnt.getElement('.box-footer'));
				}

				else this.lbPopup.loaderCnt.grab(swfObj); 

				this.lbPopup.Content.getElement('.loader').setStyle('background', 'none');
				this.lbPopup.changeDimensions(w+(this.lbPopup.Box.offsetWidth-this.lbPopup.Content.offsetWidth), h+(this.lbPopup.Box.offsetHeight-this.lbPopup.Content.offsetHeight), this.lbPopup.loaderCnt);

			}).delay(500,this);
		}
	},

	confirm: function(title, message, options) {
		if(!options)options = {};

		options.boxClass = 'confirm';

		if(!options.textBoxBtnOk)options.textBoxBtnOk = 'OK';
		if(!options.textBoxBtnCancel)options.textBoxBtnCancel = 'Cancel';
		if(!message)message = '';

		var pBox	= new popBox(options);
		var content = '';
		
		if(title)content += '<div class="box-header"><label>'+title+'</label></div>';
		content += '<div class="box-message">'+message+'</div><div class="box-footer"><input type="submit" class="submitButton" value="'+options.textBoxBtnOk+'" /><input type="button" class="cancelButton" value="'+options.textBoxBtnCancel+'" /></div>';

		pBox.Content.set('html', content);

		var submitButton = pBox.Content.getElement('.submitButton');
		var cancelButton = pBox.Content.getElement('.cancelButton');

		submitButton.addEvent('click', function(){
			pBox.complete(true);
		});

		cancelButton.addEvent('click', function(){
			pBox.complete(false);
		});

		pBox.show();

		submitButton.focus();

		return pBox;
	},

	alert: function(title, message, boxClass, options) {
		if(!options)options = {};

		options.boxClass = boxClass;

		if(!options.textBoxBtnClose)options.textBoxBtnClose = 'Close';
		if(!message)message = '';

		var pBox	= new popBox(options);
		var content = '';
		
		if(title)content += '<div class="box-header"><label>'+title+'</label></div>';
		content += '<div class="box-message">'+message+'</div><div class="box-footer"><input type="submit" class="submitButton" value="'+options.textBoxBtnClose+'" /></div>';

		pBox.Content.set('html', content);

		var submitButton = pBox.Content.getElement('.submitButton');

		submitButton.addEvents({'click': function(){pBox.complete(true);}, 'keydown': function(event){
			if(event.key == 'enter')pBox.complete(true);
			if(event.key == 'esc')pBox.complete(false);
		}});

		pBox.show();

		submitButton.focus();

		return pBox;
	},

	error: function(title, message, options) {
		return this.alert(title, message, 'error', options);
	},

	warning: function(title, message, options) {
		return this.alert(title, message, 'warning', options);
	},

	info: function(title, message, options) {
		return this.alert(title, message, 'info', options);
	},

	prompt: function(title, message, value, options) {
		if(!options)options = {};

		options.boxClass = 'prompt';

		if(!options.textBoxBtnOk)options.textBoxBtnOk = 'OK';
		if(!options.textBoxBtnCancel)options.textBoxBtnCancel = 'Cancel';
		if(!message)message = '';
		if(!value)value = '';

		var pBox	= new popBox(options);
		var content = '';
		var input	= '';
		var val;

		if(options.langs) {
			for(i = 0; i<options.langs.length; i++) {
				if(value[i])val = value[i];
				else val = '';
				input += '<input type="text" value="'+val+'" class="inputText lang" style="background-image: url(\''+BASE_URL+'images/flags/'+options.langs[i]+'.gif\');"/><br><br>';
			}
		}

		else {
			input += '<input type="text" value="'+value+'" class="inputText" /><br><br>';
		}
		
		
		if(title)content += '<div class="box-header"><label>'+title+'</label></div>';
		content += '<div class="box-message">'+message+input+'</div><div class="box-footer"><input type="submit" class="submitButton" value="'+options.textBoxBtnOk+'" /><input type="button" class="cancelButton" value="'+options.textBoxBtnCancel+'" /></div>';

		pBox.Content.set('html', content);

		var submitButton = pBox.Content.getElement('.submitButton');
		var cancelButton = pBox.Content.getElement('.cancelButton');
		var inputText	 = pBox.Content.getElements('.inputText');

		inputText.addEvent('keydown', function(event){
			if(event.key == 'enter')pBox.complete(inputText);
			if(event.key == 'esc')pBox.complete(false);
		});

		submitButton.addEvent('click', function(){
			pBox.complete(inputText);
		});

		cancelButton.addEvent('click', function(){
			pBox.complete(false);
		});

		pBox.show();
		
		pBox.Content.getElement('.inputText').focus();

		return pBox;
	},


	url: function(title, url, options) {
		if(!options)options = {};

		options.boxClass = 'frame';

		var pBox = new popBox(options);
		var content = '';
		if(title)content += '<div class="box-header"><label>'+title+'</label></div>';
		content += '<div class="loader"></div>';
		
		pBox.Content.set('html', content);

		pBox.show();

		var loader = new Element('div', {'class': 'box-iframe'});

		var frame = new IFrame({
			frameborder: 0,
			id: 'boxframe',
			styles: {
				'overflow-x': 'hidden',
				'visibility': 'visible'
			},
			src: url,

			onload: function(doc) {
				if(!pBox.loader) {
					var w = this.getScrollSize().x;
					var h = this.getScrollSize().y;
					
					if(w < 450)w = 450;
					if(h > window.getSize().y-80)h = window.getSize().y-80;

					if(options.width)w = options.width;
					if(options.height)h = options.height;

					$('boxframe').setStyles({'width': w, 'height': h}); 
					if(pBox.Content.getElement('.loader'))pBox.Content.getElement('.loader').setStyle('background', 'none');

					if(title)h = h+30;

					pBox.changeDimensions(w+(pBox.Box.offsetWidth-pBox.Content.offsetWidth), h+(pBox.Box.offsetHeight-pBox.Content.offsetHeight), loader);
				}
			}
		});

		loader.injectInside(pBox.Content);
		frame.injectInside(loader);

		return pBox;
	},


	ajax: function(title, url, options) {
		if(!options)options = {};

		options.boxClass = 'frame';

		var pBox = new popBox(options);
		var content = '';
		if(title)content += '<div class="box-header"><label>'+title+'</label></div>';

		content += '<div class="loader"></div>';

		if(!options.textBoxBtnOk)options.textBoxBtnOk = 'OK';
		if(!options.textBoxBtnCancel)options.textBoxBtnCancel = 'Cancel';		
		
		if(options.buttons) {
			content += '<div class="box-footer"><input type="submit" class="submitButton" value="'+options.textBoxBtnOk+'" /><input type="button" class="cancelButton" value="'+options.textBoxBtnCancel+'" />';
		}
	
		pBox.Content.set('html', content);

		if(options.buttons) {
			var submitButton = pBox.Content.getElement('.submitButton');
			var cancelButton = pBox.Content.getElement('.cancelButton');

			submitButton.addEvent('click', function(){
				new Request.HTML({'url': url}).send(pBox.Content).addEvents({'onSuccess': function(responseTree, responseElements, responseHTML, responseJavaScript){
					if(responseHTML.length > 7 && responseHTML.indexOf('<input') < 0)LightBox.error(title, responseHTML);
					else {
						if(responseHTML == '')pBox.complete(true);
						else pBox.complete(responseHTML);
					}
				}});
			});

			cancelButton.addEvent('click', function(){
				pBox.complete(false);
			});

		}

		pBox.show();

		var loader = new Element('div', {'class': 'box-iframe'});
		loader.injectInside($(document.body));

		new Request.HTML({'url': url}).send($(options.formSend)).addEvents({'onSuccess': function(responseTree, responseElements, responseHTML, responseJavaScript){
			loader.set('html', responseHTML);

			loader.setStyles({
				'width': 'auto',
				'height': 'auto'
			});

			var w = loader.getSize().x;
			var h = loader.getSize().y;

			if(w < 250)w = 250;
			if(h > window.getSize().y-80)h = window.getSize().y-80;

			if(pBox.Content.getElement('.loader'))pBox.Content.getElement('.loader').setStyle('background', 'none');
			if(title)h = h+30;
			if(options.buttons)h = h+46;

			loader.getElements('.inputText').addEvent('keydown', function(event){
				if(event.key == 'enter'){
					new Request.HTML({'url': url}).send(pBox.Content).addEvents({'onSuccess': function(responseTree, responseElements, responseHTML, responseJavaScript){
						if(responseHTML.length > 7 && responseHTML.indexOf('<input') < 0)LightBox.error(title, responseHTML);
						else pBox.complete(responseHTML);
					}});
				}
				if(event.key == 'esc')pBox.complete(false);
			});

			pBox.changeDimensions(w+(pBox.Box.offsetWidth-pBox.Content.offsetWidth), h+(pBox.Box.offsetHeight-pBox.Content.offsetHeight), loader);

		}});


		return pBox;
	}

});


window.addEvent('domready', function() {
	LightBox = new LightBox();
});
