(function($){

	$.fn.extend({

		contrast: function(options) {

			var core =
			{

				canvas: 'contrast-canvas',
				init: function()
				{

					var status_cookie = defaults.get_cookie('contrast');

					if ( $('#' + core.canvas).length == 0 )
					{
						$('body').wrapInner('<div id="' + core.canvas + '" />');
					}

					if ( status_cookie != null )
					{
						defaults.active();
					}

				}

			}

			var defaults =
			{

				status: false,
				background: false,
				text_enable: 'Auto contraste',
				text_disable: 'Remover contraste',

				get_document_dimension: function ()
				{

					var height = jQuery('#' + core.canvas).height(),
						width = jQuery('#' + core.canvas).width(),
						sizes =
						{
							'width' : width,
							'height' : height
						}

					return sizes;

				},

				active_menu: function (text)
				{
					$('.contrast-link').addClass('contrast-link-active').text(text);
				},

				desactive_menu: function (text)
				{
					$('.contrast-link').removeClass('contrast-link-active').text(text);
				},

				active_contrast: function ()
				{

					var status_cookie = defaults.get_cookie('contrast'),
						content = jQuery('#' + core.canvas).html(),
						overlay = '<div id="contrast-overlay"></div>';

					if ( status_cookie == null )
					{
						defaults.set_cookie('contrast', 1);
					}

					if ( jQuery('#contrast-overlay').length == 0 )
					{
						jQuery('body').append(overlay);
					}

					jQuery('#contrast-overlay').css(defaults.get_document_dimension());

					jQuery(window).resize(function()
					{
						jQuery('#contrast-overlay').css(defaults.get_document_dimension());
					});

					jQuery(content).find('script').remove();

					jQuery('#contrast-overlay').append(content);
				
					// Fix [1]
					jQuery('#contrast-overlay' + ' a[href*="#"]').each(function()
					{
				
						var anchor_old = jQuery(this).attr('href'),
							anchor_new = jQuery(this).attr('href') + '!/contraste';

						jQuery(this).attr('href', anchor_new);

						jQuery('#contrast-overlay' + ' a[name*="' + anchor_old.replace('#','') + '"]').each(function()
						{
							jQuery(this).attr('name', anchor_new.replace('#',''));
						});

					});

					jQuery('#contrast-overlay').removeClass('none');

					jQuery('#' + core.canvas + ' a[href]:first').focus(function()
					{
						jQuery('#contrast-overlay a[href]:first').focus();
					});

					return true;

				},

				remove_contrast: function ()
				{

					var status_cookie = defaults.get_cookie('contrast');

					if ( status_cookie != null )
					{
						defaults.remove_cookie('contrast');
					}

					jQuery('#contrast-overlay').remove();
				
					return true;
				
				},
				
				// @cookies
				get_cookie: function (key)
				{

					var i, x, y, ARRcookies = document.cookie.split(";");

					for ( i = 0; i < ARRcookies.length; i++ )
					{
						x = ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
						y = ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
						x = x.replace(/^\s+|\s+$/g,"");
						if (x==key)
						{
							return unescape(y);
						}
					}

				},

				set_cookie: function (key, value, days)
				{

					var date = new Date();
					date.setDate(date.getDate() + days);
					var value = escape(value) + ((days==null) ? "" : "; expires="+date.toUTCString());

					document.cookie = key + "=" + value;

				},

				remove_cookie: function (key)
				{

					document.cookie = key + '=; expires=Thu, 01-Jan-70 00:00:01 GMT;';

					return true;

				},

				active: function ()
				{
					options.status = true;
					options.active_menu(options.text_disable);
					options.active_contrast();
				},
				
				desactive: function ()
				{
					options.status = false;
					options.desactive_menu(options.text_enable);
					options.remove_contrast();
				}

			}

			var options = $.extend(defaults, options);

			this.each(function() 
			{

				$(this).addClass('contrast-link');
				var object = $('.contrast-link');

				object.live('click', function(event)
				{

					event.preventDefault();

					if ( options.status == true )
					{
						defaults.desactive();
					}
					else
					{
						defaults.active();
					}

				});

			});

			// @init
			return core.init();

		}

	});

})(jQuery);
