var mdMsg = new Class( {
	
	options: {
		processData: false,
		msgBuild: 'simple',
		msgType: 'alert',
		trueBttn: 'OK',
		flsBttn: 'Cancel',
		overlay: {
			color: '232323',
			opacity: 0.9,
			duration: 150,
			transition: Fx.Transitions.Quad.easeOut
		},
		fxIn: {
			type: 'slide',
			fxOpt: 't',
			fade: false,
			duration: 300,
			transition: Fx.Transitions.Sine.easeOut
		},
		fxOut: {
			type: 'slide',
			fxOpt: 'b',
			fade: false,
			duration: 300,
			transition: Fx.Transitions.Sine.easeIn
		}
	},
	
	initialize: function( obj, options ) {
		
		this.setOptions( options );
		
		if( $type( this.options.processData ) == 'function' )
			obj = this.options.processData( obj );
		
		this.parseObj( obj );
		this.overlay = new Element( 'div' ).setProperty( 'id', 'mdmsg_overlay' ).setStyles( { 'width': $(document.body).getSize().size.x, 'height': $(document.body).getSize().size.y } ).injectInside( document.body );
		this.createMsg( this.options.msgBuild, this.options.msgType, this.msgData );
		this.getDims( this.msg );
		
		this.fxDefs = {
			slide: {
				fxIn: {
					tl: { 'top': [this.msgDims.t, this.msgDims.y], 'left': [this.msgDims.l, this.msgDims.x] },
					t: { 'top': [this.msgDims.t, this.msgDims.y], 'left': [this.msgDims.x, this.msgDims.x] },
					tr: { 'top': [this.msgDims.t, this.msgDims.y], 'left': [this.msgDims.r, this.msgDims.x] },
					r: { 'top': [this.msgDims.y, this.msgDims.y], 'left': [this.msgDims.r, this.msgDims.x] },
					br: { 'top': [this.msgDims.b, this.msgDims.y], 'left': [this.msgDims.r, this.msgDims.x] },
					b: { 'top': [this.msgDims.b, this.msgDims.y], 'left': [this.msgDims.x, this.msgDims.x] },
					bl: { 'top': [this.msgDims.b, this.msgDims.y], 'left': [this.msgDims.l, this.msgDims.x] },
					l: { 'left': [this.msgDims.l, this.msgDims.x], 'top': [this.msgDims.y, this.msgDims.y] }
				},
				fxOut: {
					tl: { 'top': [this.msgDims.y, this.msgDims.t], 'left': [this.msgDims.x, this.msgDims.l] },
					t: { 'top': [this.msgDims.y, this.msgDims.t], 'left': [this.msgDims.x, this.msgDims.x] },
					tr: { 'top': [this.msgDims.y, this.msgDims.t], 'left': [this.msgDims.x, this.msgDims.r] },
					r: { 'top': [this.msgDims.y, this.msgDims.y], 'left': [this.msgDims.x, this.msgDims.r] },
					br: { 'top': [this.msgDims.y, this.msgDims.b], 'left': [this.msgDims.x, this.msgDims.r] },
					b: { 'top': [this.msgDims.y, this.msgDims.b], 'left': [this.msgDims.x, this.msgDims.x] },
					bl: { 'top': [this.msgDims.y, this.msgDims.b], 'left': [this.msgDims.x, this.msgDims.l] },
					l: { 'left': [this.msgDims.x, this.msgDims.l], 'top': [this.msgDims.y, this.msgDims.y] }
				}
			},
			scale: {
				fxIn: { 'left': [this.msgDims.x], 'top': [this.msgDims.y], 'font-size': [0,10] },
				fxOut: { 'left': [this.msgDims.x], 'top': [this.msgDims.y], 'width': [0, this.msgDims.w], 'height': [0, this.msgDims.h] }
			}
		};
		// removed .setStyle( 'visibility', 'visible' ) from the line below
		this.msg.fxIn = this.msg.effects( { duration: this.options.fxIn.duration, transition:this.options.fxIn.transition, onStart: function() { this.msg.injectInside( this.overlay ) }.bind( this ) } );
		this.msg.fxOut = this.msg.effects( { duration: this.options.fxOut.duration, transition:this.options.fxOut.transition, onComplete: function() {
			if( $type( this.options.overlay ) == 'object' )
				this.initOverlay( 'fxOut' ) }.bind( this )
		} );
		if( this.options.fxIn.type != 'standard' )
			this.fxInOpts = this.fxDefs[this.options.fxIn.type]['fxIn'][this.options.fxIn.fxOpt];
		if( this.options.fxOut.type != 'standard' )
			this.fxOutOpts = this.fxDefs[this.options.fxOut.type]['fxOut'][this.options.fxOut.fxOpt];
		
		if( this.options.fxIn.fade == true )
			this.fxInOpts.opacity = [0, 1];
		if( $type( this.options.overlay ) == 'object' )
			this.initOverlay( 'fxIn' );
		// Added section below
		if( this.options.fxIn.type != 'standard' ) {
			for( _css in this.fxInOpts )
				this.msg.setStyle( _css, this.fxInOpts[_css][0] );
		}
		this.msg.setStyle( 'visibility', 'visible' );
		// end of added section
		(function() { this.msg.fxIn.start( this.fxInOpts ) } ).bind( this ).delay( ( $type( this.options.overlay ) == 'object' ) ? this.options.overlay.duration : 0 );
		
		var fxOut = function() { 
			if( this.options.fxOut.fade == true )
				this.fxOutOpts.opacity = [1, 0];
			this.msg.fxOut.start( this.fxOutOpts );
		}.bind( this );
		
		this.truBttn.addEvent( 'click', function() {
			fxOut();
			return true;
		} );
		if( this.flsBttn ) {
			this.flsBttn.addEvent( 'click', function() {
				fxOut();
				return false;
			} );
		}
		
	},
	
	parseObj: function ( obj ) {
		
		switch( $type( obj ) )
		{
			case 'collection':
			case 'element':
			case 'number':
			case 'string':
				this.msgData = obj;
				break;
			case 'array':
				var keys = ['bar', 'content'];
				this.msgData = obj.associate( keys );
				break;
			case 'object':
				this.msgData = obj;
				break;
			default:
				alert( 'The data supplied to mdMsg was was not the correct type.' );
		}
		
	},
	
	createMsg: function ( build, type, data ) {
		
		this.msg = new Element( 'div' ).setStyle( 'visibility', 'hidden' ).setProperty( 'id', 'mdmsg_' + build );
		if( build == 'advanced' ) {
			var t = new Element( 'div' ).addClass( 't' ).injectInside( this.msg );
			new Element( 'div' ).addClass( 'tl' ).injectInside( t );
			new Element( 'div' ).addClass( 'tr' ).injectInside( t );
			var m = new Element( 'div' ).addClass( 'm' ).injectInside( this.msg );
			new Element( 'div' ).addClass( 'mi' ).injectInside( m );
			var b = new Element( 'div' ).addClass( 'b' ).injectInside( this.msg );
			new Element( 'div' ).addClass( 'bl' ).injectInside( b );
			new Element( 'div' ).addClass( 'br' ).injectInside( b );
		}
		
		if( data.bar )
			new Element( 'div' ).addClass( 'bar' ).setHTML( data.bar ).injectInside( ( build == 'simple' ) ? this.msg : m ); 
		
		new Element( 'div' ).addClass( 'content' ).setHTML( ( data.content ) ? data.content : data ).injectInside( ( build == 'simple' ) ? this.msg : m ); 
		
		var hold = new Element( 'div' ).addClass( 'hold' ).injectInside( this.msg );
		this.truBttn = new Element( 'button' ).addClass( 'c' ).setHTML( this.options.trueBttn ).injectInside( ( build == 'simple' ) ? hold : m );
		if( type == 'confirm' ) {
			this.truBttn.removeClass( 'c' ).addClass( 'l' );
			this.flsBttn = new Element( 'button' ).addClass( 'r' ).setHTML( this.options.flsBttn ).injectInside( ( build == 'simple' ) ? hold : m );
		}
	},
	
	getDims: function ( obj ) {
		
		this.msg.setStyle('visibility', 'hidden').injectInside( document.body );
		
		var objDims = obj.getCoordinates();
		var winDims = window.getSize();
		
		this.msgDims = {
			w: objDims.width.toInt(),
			h: objDims.height.toInt(),
			x: ( winDims.size.x.toInt() / 2 ) - ( objDims.width.toInt() / 2),
			y: ( ( winDims.size.y.toInt() / 2 ) -  objDims.height.toInt() ) + winDims.scroll.y.toInt(),
			t: winDims.scroll.y.toInt() - objDims.height.toInt(),
			r: winDims.size.x.toInt(),
			b: winDims.scroll.y.toInt() + winDims.size.y.toInt(),
			l: 0 - objDims.width.toInt()
		}
		
		this.msg.remove();
		
	},
	
	initOverlay: function( type ) {
		
		var opacFrom = ( type == 'fxIn' ) ? 0 : this.options.overlay.opacity;
		var opacTo = ( type == 'fxIn' ) ? this.options.overlay.opacity : 0;
		this.overlay.setOpacity( opacFrom ).setStyle( 'background-color', '#' + this.options.overlay.color ).effect( 'opacity', { duration: this.options.overlay.duration, transition: this.options.overlay.transition } ).start( opacTo );
		
	}
	
} );

mdMsg.implement( new Options );
