moobox = Class.create();
moobox.prototype = {
	options: { //See docs
		closeText: "Resmi Kapat | Close Picture *",
		ajaxLayout: '<div style="width:400px;height:400px;position:absolute;background-color:#FFF">%CONTENT%</div>',
		imageLayout: '<img src="%SRC%" title="%TITLE%" alt="%TITLE%" style="border:2px solid #ffffff;"/><br /><h3 style="color:white; text-align:center;background-color:#000000;padding:4px;border:1px solid #999">%TITLE%</h3>',
		cacheAjax: true,
		fadeTime: 2500,
		fadePower: 1,
		scrollTime: 800
	},
	scrolling: 1,
	o: false, //Overlay layer - dark zone
	b: false, //Box layer - all the stuff
	initialize: function(options) {
		Object.extend(this.options,options || {});
		this.assignEvents();
	},
	doEvent: function (rel,url,title) {
		switch(rel) {
			case "close":
				if (!this.o) return //Not open? leave
				this.fixes(false);
				Element.remove(this.o);
				Element.remove(this.b);
				this.b = this.o = false; 
			break;
			case "insert":
				Element.remove(this.b);
				this.b.style.display='none';
				document.body.appendChild(this.b);
				this.getContent(url,title);				
			break;
			case "open": 
			default: //No rel?
				if (this.o)	this.doEvent('close'); //Open already? close
				this.fixes(true);
				this.o = document.createElement('DIV');
				this.o.id = 'overlay'
				this.o.className = 'mooLoading'
				this.b = document.createElement('DIV');
				this.b.id = 'moobox'
				new fx.Opacity(this.o, {duration:this.options.fadeTime}).custom(0,this.options.fadePower);				
				setTimeout(function() {document.body.appendChild(this.o); document.body.appendChild(this.b);}.bind(this),30);
				this.getContent(url,title);
				this.o.onclick = function() { this.doEvent('close'); }.bind(this);
			break;
		}
	},	
	
	fixes: function (state) {
		if (typeof window.addEventListener != 'undefined') return; //Not ie? out as no need
		if (state) this.scrolling = self.pageYOffset ? ys = self.pageYOffset : (document.documentElement && document.documentElement.scrollTop) ? ys = document.documentElement.scrollTop : document.body.scrollTop;
		b =document.getElementsByTagName('body')[0].style;
		b.height = state ? '100%' : 'auto';
		b.overflow = state ? 'hidden' : '';
		var s = document.getElementsByTagName("SELECT");
		for (var i = 0; i < s.length; i++) s[i].style.visibility= state ? 'hidden' : 'visible';
		window.scrollTo(0, state ? 0 : this.scrolling);
	},
	
	getContent:function (url,title) {
		this.o.className='mooLoading';
		var ext = url.substr(url.length-4);
		switch (ext) {
			case "jpeg": case ".jpg": case ".bmp": case ".gif": case "tiff": case ".png":
				var content = this.options.imageLayout.replace(/%SRC%/g, url).replace(/%TITLE%/g, title);
				var t = new Image();
				t.onload = function() { this.setContent(content);}.bind(this);
				t.src = url;
			break;
			default:
				if (this.options.cacheAjax) url += (url.indexOf('?')!=-1 ? '&' : '?') + 'mooRand=' + Math.random();
				new ajax (url, {onComplete: this.setContent.bind(this)});
		}
	},
	
	setContent:function (t) {
		if (t.responseText) t = this.options.ajaxLayout.replace('%CONTENT%',t.responseText);
		var l = document.createElement('DIV');
		l.innerHTML = this.options.closeText;
		l.id = 'closeText';
		this.o.appendChild(l);
		this.b.style.overflow = 'hidden';
		this.b.style.height = '0';
		this.b.style.width = 'auto';
		this.b.style.display='block';
		this.b.innerHTML = t;
		setTimeout( function() { 
			this.o.className='';
			this.b.style.width = this.b.scrollWidth + 'px';
			this.b.style.margin = '-' + this.b.scrollHeight/2 + 'px 0 0 -' + this.b.scrollWidth/2 + 'px'; //centering
			new fx.Height(this.b, {duration:this.options.scrollTime}).toggle();
			this.assignEvents(this.b);
		}.bind(this),30);
	},
	
	assignEvents: function (container) {
		document.getElementsByClassName('moobox').each(function(el) { 
			if (container) { //This optimization is to avoid reassigning for whole page, but new ajaxed content
				var found = false;
				var z = el;
				while (z=z.parentNode) if (z==container) found = true;
				if (found==false) return;
			}	
			el.onclick=function() {
				this.doEvent(el.rel,el.href,el.title || false);
				return false;
			}.bind(this)
		}.bind(this));
	}
}