// Event Delegation ------------------------------------[TN]
jQuery.delegate = function(Rules) {
	return function(e) {
		var Target = $(e.target);
		for (var Selector in Rules)
			if (Target.is(Selector)) return Rules[Selector].apply(this, $.makeArray(arguments));
	}
}
//------------------------------------------------------[TN]

// Form Message Class ----------------------------------[MN]
var FormMessage = function( Config ) {
	var This = {
		Prefix: Config.Prefix ? Config.Prefix : '',
		Display: function( JQueryParent, Messages ) {
			var HTML = '<div class="'+ This.Prefix +'Messages">';

			for( Type in Messages ){
				HTML += '<div class="'+ This.Prefix + Type +'">';
				for( Type in Messages ){
					for( i in Messages[Type] ){
						if( typeof( Messages[Type][i] == 'string' ) )
							HTML += '<div class="'+ This.Prefix +'Message">'+ Messages[Type][i] +'</div>';
					}

				}
				HTML += '</div>';
			}
			HTML += '</div>';

			JQueryParent.children( '.'+ This.Prefix +'Messages' ).remove();
			JQueryParent.prepend( HTML );
		}
	};
	return This;
};
//------------------------------------------------------[MN]

// News ------------------------------------------------[TG]
var News = function( Config ) {
	var This = {
		InsertImage: function( Info ) {
			$('#AssetID_Image').attr('value', Info.MediaID);
			//$('#AssetID_Image_Image').attr('src', Info.ThumbPath);
			$('#AssetID_Image_Image').attr('src', Info.FullPath);
		}
	};
	return This;
};
//------------------------------------------------------[TG]

// Template Class --------------------------------------[TG]
var VPI_Template = function( Config ) {
	var This = function() {

		// Private Vars ----------------------------------------[TG]
		var HelpText = {
			'Blank'		: 'This template has a blank canvas.',
			'Custom'	: 'This template has one dynamic center column and an optional custom right rail column.',
			'Standard'	: 'This template has one dynamic center column and a standard right rail column.'

		};
		//------------------------------------------------------[TG]
		
		// Constructor -----------------------------------------[TG]
		(function() {
			This._Config = $.extend(This._Config, Config);
		})();
		//------------------------------------------------------[TG]
		
		// Public Functions ------------------------------------[TG]
		This.Update = function(MySelect) {
			var Template = MySelect.find('option:selected').val();
			MySelect.parent().find('.TemplateHelp').html( HelpText[Template] );

			switch (Template) {
				case 'Blank':
				case 'Standard':
					$('.BodyRailTR').hide();
				break;

				case 'Custom':
					$('.BodyRailTR').show();
				break;
			}
		}
		//------------------------------------------------------[TG]

		// Send Back Reference ---------------------------------[TG]
		return This;
		//------------------------------------------------------[TG]

	};
	return This();
};
//------------------------------------------------------[TG]

// Links Class -----------------------------------------[TG]
var VPI_Links = function( Config ) {
	var This = function() {

		// Private Vars ----------------------------------------[TG]
		//------------------------------------------------------[TG]
		
		// Constructor -----------------------------------------[TG]
		(function() {
			This._Config = $.extend(This._Config, Config);
		})();
		//------------------------------------------------------[TG]
		
		// Public Functions ------------------------------------[TG]
		This.AddLink = function() {
			var Data = (arguments[0]) ? arguments[0] : false;

			$('.ExternalLinkTemplate .ExternalLink').clone().appendTo('.ExternalLinks');

			if (Data) {
				var Object = $('.ExternalLinks .ExternalLink:last');
					Object.find('input[name=\'Link_Title[]\']').attr('value', Data['Title']);
					Object.find('input[name="Link_Link[]"]').attr('value', Data['Link']);
					Object.find('select[name="Link_Target[]"] option[value=' + Data['Target'] + ']').attr('selected', true);
			}

			This.DisableArrows();
		}
		This.DeleteLink = function(Event) {
			$(Event.target).parents('.ExternalLink').remove();
			This.DisableArrows();
		}
		This.MoveLinkUp = function(Event) {
			var Container = $(Event.target).parents('.ExternalLink');

			if (Container.prev()) {
				Container.insertBefore(Container.prev());
			}
			This.DisableArrows();
		}
		This.MoveLinkDown = function(Event) {
			var Container = $(Event.target).parents('.ExternalLink');

			if (Container.next()) {
				Container.insertAfter(Container.next());
			}
			This.DisableArrows();
		}
		This.DisableArrows = function() {
			var First = $('.ExternalLinks .ExternalLink:first .MoveUp');
			var Last = $('.ExternalLinks .ExternalLink:last .MoveDown');

			if (!First.length || !Last.length)
				return;

			$('.ExternalLinks .ExternalLink .MoveUp').attr('src', $('.ExternalLinks .ExternalLink .MoveUp').attr('src').replace('.inactive', ''));
			$('.ExternalLinks .ExternalLink .MoveDown').attr('src', $('.ExternalLinks .ExternalLink .MoveDown').attr('src').replace('.inactive', ''));

			First.attr('src', First.attr('src').replace('msc.up.gif', 'msc.up.inactive.gif'));
			Last.attr('src', Last.attr('src').replace('msc.down.gif', 'msc.down.inactive.gif'));
		}
		//------------------------------------------------------[TG]

		// Send Back Reference ---------------------------------[TG]
		return This;
		//------------------------------------------------------[TG]

	};
	return This();
};
//------------------------------------------------------[TG]

// PageType Class --------------------------------------[MN]
var VPI_PageType = function( Config ) {
	var This = function() {

		// Public Vars -----------------------------------------[TG]
		This._Config = {
			Type: 'static'
		};
		//------------------------------------------------------[TG]

		// Constructor -----------------------------------------[MN]
		(function() {
			This._Config = $.extend(This._Config, Config);
		})();
		//------------------------------------------------------[MN]
		
		// Public Functions ------------------------------------[MN]
		This.Update = function( Type ) {

			switch( Type ) {
				case 'Dynamic':
					$( '.PAG_ShowIfLinkOut' ).hide();

					$( '.HideIfLinkOut' ).show();
					$( '.PAG_HideIfDynamic' ).hide();
					$( '.PAG_HideIfStatic' ).show();
					tinyMCE.triggerSave();
					$( 'textarea[name=Body]' ).removeClass( 'ADM_TinyEditor' );
					tinyMCE.execCommand( 'mceRemoveControl', true, $( 'textarea[name=Body]' ).attr( 'id' ) );
				break;

				case 'Linkout':
					$( '.PAG_HideIfDynamic' ).hide();
					$( '.PAG_HideIfStatic' ).show();
					$( '.PAG_ShowIfLinkOut' ).show();
					$( '.HideIfLinkOut' ).hide();

					$( 'textarea[name=Body]' ).css('height','20px');
					tinyMCE.triggerSave();
					$( 'textarea[name=Body]' ).removeClass( 'ADM_TinyEditor' );
					tinyMCE.execCommand( 'mceRemoveControl', true, $( 'textarea[name=Body]' ).attr( 'id' ) );
					return false;

				break;

				case 'Static':
					$( 'textarea[name=Body]' ).css('height','400px');
					$( '.PAG_ShowIfLinkOut' ).hide();
					$( '.HideIfLinkOut' ).show();
					$( '.PAG_HideIfStatic' ).hide();
					$( '.PAG_HideIfDynamic' ).show();
					$( 'select[name=Template]').change();
					$( 'textarea[name=Body]' ).addClass( 'ADM_TinyEditor' );
					tinyMCE.execCommand( 'mceAddControl', true, $( 'textarea[name=Body]' ).attr( 'id' ) );
				break;
			}

			This._Config.Type = Type.toLowerCase();
			$( '.ADM_TextInput[name=WebTitle]' ).keyup();
		}
		//------------------------------------------------------[MN]

		// Send Back Reference ---------------------------------[MN]
		return This;
		//------------------------------------------------------[MN]

	};
	return This();
};
//------------------------------------------------------[MN]

// Constructors ----------------------------------------[MN]
var MSG	= new FormMessage( { Prefix: 'MSG_' } );
var NEW	= new News();
var TPL = new VPI_Template();
var LNK = new VPI_Links();
var TYP = new VPI_PageType();
//------------------------------------------------------[MN]
