/*global cmsLoad, jQuery, Image, document */
var cmsFiles = [];
if(typeof(cmsLoad) === 'function'){
    cmsLoad(cmsFiles);
}

/**
 * A JQuery plugin that will setup a image buttons.
 *
 * @version 2.0
 * 		- Added button fade mode
 * @requires
 *      jquery.js
 * @optional
 *      hoverIntent.js - for controlling hover triggering
 * @author Ed Rodriguez Ed.Rodriguez@swfwmd.state.fl.us
 */
(function($){
    $.fn.buttons = function(options){
		/*------------------
			OBJECT SETUP
		------------------*/
        
		// PRIVATE
        var opts = $.extend({}, $.fn.buttons.defaults, options);
        
		// IMAGES
		var images = $('> a > img', this);
		
		// SETUP FADE (if needed)
		if(opts.fade){
			var swaps = $('> a', this);			
			var container = $(this);
			// CREATES THE DOM STRUCTURE NEEDED FOR FADES (on-the-fly)
			$(swaps).each(function(i){
				var div = $('<div>');
				var div2 = $('<div>');
				div2.css({
					position: 'absolute',
					top: 0,
					left: 0,
					display: 'none'
				});
				div.attr('class', opts.buttonClass);
				var a = $(this).clone();
				var src = $('> img', a).attr('src');
				src = src.replace(/\/off\//i,'/over/');
				$('> img', a).attr('src',src);
				div2.append(a);
				div.append(div2);
				div.append($(this).clone());
				$(this).remove();
				container.append(div);
			});
			images = $('> div', this);
		}
		
		// SETUP BUTTONS
		$(images).each(function(i){
			var img = (!opts.fade) ? $(this) : $('> a > img', this);
			var src = img.attr('src');
			
			var regexp = new RegExp(opts.off,'i');
			var isOn = false;
			
			// CHECKS ON STATE
			var parent = img.parent('a');
			if(parent.length == 1){
				var href = $(parent).attr('href');
				var url = document.location.href.split('?');
				url = url[0];
				var regexp2 = new RegExp(href,'i');
				
				if(href != '' && href != '#'){
					isOn = regexp2.test(url);
				}
			}
			
			// BUTTON SETUP
			if(isOn){
				img.attr('src', src.replace(regexp,opts.on));
			}else{
				// FADE MODE
				if(opts.fade){
					var over;
					var out;
					if($.fn.hoverIntent){
						over = function(){
							$('> div', this).fadeIn(opts.speedIn);
						};
						out = function(){
							$('> div', this).fadeOut(opts.speedOut);
						};
						var config = {    
							 sensitivity: opts.sensitivity,
							 interval: opts.interval,
							 over: over,
							 timeout: opts.timeout,
							 out: out   
						};
						$(this)[($.fn.hoverIntent) ? 'hoverIntent' : 'hover'](config);
					}
					// A PSUEDO HOVER INTENT WORKAROUND
					else{
						over = function(){
							var fade = $('> div', this);
							if(fade.is(':animated')){
								fade.stop().fadeTo(opts.speedIn, 1);
							}else{
								fade.fadeIn(opts.speedIn);
							}
						};
						out = function(){
							var fade = $('> div', this);
							if(fade.is(':animated')){
								fade.stop().fadeTo(opts.speedOut, 0);
							}else{
								fade.fadeOut(opts.speedOut);
							}
						};
						$(this)[($.fn.hoverIntent) ? 'hoverIntent' : 'hover'](over,out);
					}
				}
				// SWAP MODE
				else{
					// OFF SOURCE
					this.offSrc = src;
					
					// OVER IMAGE
					this.overImage = new Image();
					this.overImage.src = src.replace(regexp,opts.over);
					
					var over = function(){
						$(this).attr('src', this.overImage.src); 
					};
					var out = function(){
						$(this).attr('src', this.offSrc); 
					};
					$(this)[($.fn.hoverIntent) ? 'hoverIntent' : 'hover'](over,out);
				}
			}
		});
        return(this);
    };
    $.fn.buttons.defaults = {
		off: '/off/',
		over: '/over/',
		on: '/on/',
		buttonClass: 'button',
		speedIn: 250,
		speedOut: 400,
		sensitivity: 10, // number = hoverIntent: sensitivity threshold (must be 1 or higher)
		interval: 200, // number = hoverIntent: milliseconds for onMouseOver polling interval   
		timeout: 250, // number = hoverIntent: milliseconds delay before onMouseOut
		fade: false
    };
})(jQuery);
