var test = ( typeof(console) != 'undefined' ) ? console.log : function() {};

document.forward = function(loc) {
	if(!loc.match(/^([a-z]+:\/\/|\/)/i)) {
		var basehref = '';

		var lst = $(document).getElements('base');
		for(var i=0; i<lst.length; ++i) {
			if(lst[i].getAttribute('href')) {
				basehref = lst[i].getAttribute('href').trim();
				break;
			}
		}
		if(!basehref) basehref = '/';
		if(!basehref.match(/\/$/)) basehref += '/';
		loc = basehref + loc;
	}
	document.location = loc;
}


/********************************************************************/
// validate_email()
// returns true if email appears valid
/********************************************************************/
function validate_email(email) {
	email = email.trim();
	if( email.match(/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/) || !email.match(/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/) ) return false;
	return true;
}


/* toHash() method for forms */
Element.implement({
	'toHash': function() {

		if(this.tagName == 'FORM') {
			var data = { };


			this.getElements('input, select, textarea').each(function(el) {
				if (!el.name || el.disabled || el.type == 'submit' || el.type == 'reset' || el.type == 'file' || el.type == 'button' ) return;
				var value = (el.tagName.toLowerCase() == 'select') ? Element.getSelected(el).map( function(opt) { return opt.value; }) : ((el.type == 'radio' || el.type == 'checkbox') && !el.checked) ? null : el.value;

				$splat(value).each(function(val) {
					if (typeof val != 'undefined') {
						data[el.name] = val;
					}
				});
			});
			return data;
		}
		else return false;
	}
});












Overlay = new Class({
	Implements: Options,

	options: {
		duration:		1000,
		transition:		Fx.Transitions.Cubic.easeOut,
		color:			'#000000',
		opacity:		0.5,
		close_on_click:		true,
		onClick:		function() {}
	},

	initialize: function(options) {
		this.setOptions(options);

		this.div = new Element('div', {
			'class': 'divOverlay',
			styles: {
				position: 'absolute',
				left: 0,
				top: 0,
				background: this.options.color,
				width: '100%',
				height: '100%',
				display: 'none'
			}
		})
		.addEvent('click', function() {
			this.click();
		}.bind(this))
		.inject( $(document.body) );

		window.addEvent('resize', function() {
			this.resize()
		}.bind(this));
	},

	show: function() {
		this.resize();

		this.div.setStyles({
			opacity: 0,
			display: 'block'
		});

		new Fx.Tween(this.div, {
			duration: this.options.duration,
			transition: this.options.transition
		}).start('opacity', this.options.opacity);

	},

	hide: function() {
		new Fx.Tween(this.div, {
			duration: this.options.duration,
			transition: this.options.transition,
			onComplete: function() {
				this.element.setStyle('display', 'none');
			}
		}).start('opacity', 0);
	},

	click: function() {
		if(this.options.close_on_click) this.hide();
		if( typeof(this.options.onClick) == 'function' ) this.options.onClick(this);
	},

	resize: function() {
		this.div.setStyles({
			width: $(document.body).getScrollWidth(),
			height: $(document.body).getScrollHeight()
		});
	}

});








DisplayDiv = new Class({
	Implements: Options,

	options: {
		duration:		1000,
		transition:		Fx.Transitions.Cubic.easeOut,
		overlay:		true,
		transition_types:	['morph', 'fade'] // morph, fade
	},

	initialize: function(element, options){
		this.element = $(element);
		this.setOptions(options);
		this._inTransition = false;
		this._curWay = 0;
		this._fx = null;
		this.id = this.__register();

		var self = this;
		var id = this.id;

		this.elOpacity = (this.element.style.opacity) ? this.element.style.opacity : this.element.getStyle('opacity') ;

		this.element.setStyle('overflow', 'hidden');

		this.set_dimensions();

		this.element.setStyle('width', this.elWidth); // fixed width

		window.addEvent('resize', function() { this.__registerDisplayDivClasses[id].setPosition(); });
		window.addEvent('scroll', function() { this.__registerDisplayDivClasses[id].setPosition(); });

		if(this.options.overlay) {
			this.options.overlay.onClick = function() { self.hide(true); }
			this.overlay = new Overlay(this.options.overlay);
			this.options.overlay = true;
		}


		this.reset();
	},


	__register: function() {
		if(!window.__registerDisplayDivClasses) window.__registerDisplayDivClasses = new Array();
		window.__registerDisplayDivClasses.push(this);
		return window.__registerDisplayDivClasses.length - 1;
	},

	set_dimensions: function() {
		if(this.element.getStyle('display') == 'none') {

			var vis = this.element.getStyle('visibility');
			var dis = this.element.getStyle('display');
			this.element.setStyle('visibility', 'hidden');
			this.element.setStyle('display', 'block');

			this.elWidth = this.element.getWidth();
			this.elHeight = this.element.scrollHeight;

			this.element.setStyle('display', dis);
			this.element.setStyle('visibility', vis);
		} else {
			this.elWidth = this.element.getWidth();
			this.elHeight = this.element.scrollHeight;
		}
	},

	reset: function() {
		this.element.setStyle('overflow', 'hidden');
		this._inTransition = false;
		this._curWay = 0;

		this.setPosition();


		for(var t=0; t<this.options.transition_types.length; ++t) {
			switch(this.options.transition_types[t]) {
				case 'morph':
					this.element.setStyle('height', '1px');
					break;
	
				case 'fade':
					this.element.setStyle('opacity', 0.0);
					break;
			}
		}

	},

	setPosition: function() {

		var style = new Object;
		style.left = ( (window.getWidth() / 2) - (this.elWidth / 2) + document.body.getScroll().x );
		style.top = ( (window.getHeight() / 2) - (this.elHeight / 2) + document.body.getScroll().y );


		for(var s in style) this.element.setStyle(s, style[s]);

		this.elTop = style.top;
		this.elLeft = style.left;


	},

	toggle: function() {
		(this._curWay == 1) ? this.hide() : this.show();
	},

	show: function() {
		if(this._inTransition) this._fx.cancel();
		else this.set_dimensions();

		var self = this;

		var to = new Object;

		for(var t=0; t<this.options.transition_types.length; ++t) {
			switch(this.options.transition_types[t]) {
				case 'morph':
					to.height = this.elHeight;
					break;
	
				case 'fade':
					to.opacity = this.elOpacity;
					break;
			}
		}


		if(this.options.overlay) this.overlay.show();

		this._fx = new Fx.Morph( this.element, {
			duration: self.options.duration,
			transition: self.options.transition,
			onStart: function() {
				self._inTransition = true;
				self._curWay = 1;
				this.element.style.display = 'block';
			},
			onComplete: function() {
				self._inTransition = false;
			}
		});

		this._fx.start(to);
	},

	hide: function() {
		if(this._inTransition) this._fx.cancel();

		var self = this;

		var to = new Object;
		for(var t=0; t<this.options.transition_types.length; ++t) {
			switch(this.options.transition_types[t]) {
				case 'morph':
					to.height = 1;
					break;
	
				case 'fade':
					to.opacity = 0;
					break;
			}
		}

		if(this.options.overlay) this.overlay.hide();

		this._fx = new Fx.Morph( this.element, {
			duration: self.options.duration,
			transition: self.options.transition,
			onStart: function() {
				self._inTransition = true;
				self._curWay = 0;
			},
			onComplete: function() {
				self._inTransition = false;
				this.element.style.display = 'none';
			}
		});

		this._fx.start(to);
	}

});














