/**
 * Initialise active elements
 */
$( document ).ready(
	function(){
		/**
		 * Home page pop-out blocks
		 */
		var content_blocks = $( 'div.pop-out' );
		if( content_blocks.length > 0 ){
			$( 'div#homepanel div.block-block' ).each(
				function(){
					new GDMContentBlock( this );
				}
			);
		}
	}
)

/********************************************************
 * Implements 'pop-out' functionality on content blocks *
 ********************************************************/
GDMContentBlock = function( block ){

	this.block = $( block );
	this.options = this.block.find( 'div.options' );
	
	var top = this.block.position().top + parseInt( this.block.css( 'margin-top') );


	var padding_left = parseInt( this.block.css( 'padding-left' ) );
	var padding_right = parseInt( this.block.css( 'padding-right' ) );
	var padding_top = parseInt( this.block.css( 'padding-top' ) );
	var padding_bottom = parseInt( this.block.css( 'padding-bottom' ) );

	var right = 340;

	this.options_width =
		this.options.width() +
		padding_left +
		padding_right;

	// Wrap whole block contents
	var block_wrapper = Utilities.Create
	(
		'div',
		{
			css:{
				'width': this.block.width(),
				'paddingLeft': padding_left,
				'paddingRight':padding_right,
				'paddingTop':padding_top,
				'paddingBottom':padding_bottom,
				'backgroundColor': this.block.css( 'backgroundColor' )
			},
			'class':'content_wrapper'
		}
	);
	this.block.wrapInner( block_wrapper );
	this.block.css( 'padding', 0 );
	
	this.block.append( this.options );

	var div = Utilities.Create
	(
		'div',
		{
			css:{
				'width':this.options_width,
				'position': 'absolute',
				'top': 0,
				'left': right,
				'height': this.block.height(),
				'overflow':'hidden'
			}
		}
	);

	this.options.wrap( div );
	this.options.css(
		{
			'display': 'block',
			'left': -this.options_width,
			'height': this.block.height(),
			'padding-top': padding_top,
			'padding-bottom': padding_bottom
		}
	);
	
	this.block.hover(
		Utilities.Bind(
			function(){
				this.ShowOptions();
			},
			this
		),
		Utilities.Bind(
			function(){
				this.HideOptions();
			},
			this
		)
	);
}
GDMContentBlock.prototype.ShowOptions = function(){
	this.options.stop();
	this.options.animate
	(
		{
			'left':'0px'
		}
	);
}
GDMContentBlock.prototype.HideOptions = function(){
//return;
	this.options.stop();
	this.options.animate
	(
		{
			'left':-this.options_width
		}
	);
}

/****************************
 * Various useful functions *
 ****************************/
Utilities = {
	/**
	 * Binds an anonymous function to an 'object'
	 */
	Bind:function( fn, scope, args, override ) {
		args = jQuery.makeArray( args );

		return function()
			{
				arguments = jQuery.makeArray( arguments );
				if( args ){
					if( override ){
						arguments = args;
					} else {
						for( var i = 0; i < args.length; i++ ){
							arguments.push( args[ i ] );
						}
					}
				}
				fn.apply( scope, arguments );
			};
	},
	/**
	 * Create an HTML element and populate its properties
	 *
	 * @param		string		type			What type of element to create
	 * @param		object		properties		[Optional] Options to assign to the object (text, html, css, events, id etc.)
	 *
	 * @return		HTMLElement
	 */
	Create:function( type, properties ){
		var element = jQuery( document.createElement( type ) );

		if(  typeof properties == 'object' ){
			for( var name in properties ){
				var value = properties[ name ];
				switch( name ){
					case 'css':{
						element.css( value );
						break;
					}
					case 'text':{
						element.attr
						(
							( ( jQuery.browser.mozilla ) ? 'textContent' : 'innerText' ),
							value
						);
						break;
					}
					case 'html':{
						element.append( value );
						break;
					}
					case 'events':{
						for( var event in value ){
							element.bind( event, value[ event ] );
						 }
						 break;
					}
					default:{
						element.attr( name, value )
						break;
					}
				}
			}
		}

		return element;
	}
}

