
/*global jQuery */


(function($) {
$.fn.imagebutton = function(message, options) {
	
	if (message === "create"){
		return this.each(function() {
			var $imagebutton = $(this);
			if($imagebutton.data('imagebutton')) {
				$imagebutton.unbind();
				$imagebutton.empty();
			}
			
			var params = $.extend({
				state: 'normal', 
				centered: true, 
				visible: false,
				loaded: false,
				load: function(){$(this).parent().imagebutton('show');},
				error: function(){$(this).parent().imagebutton('hide');}
			}, options);
			
			$imagebutton.addClass('imagebutton-' + params.state);
			$imagebutton.data('imagebutton', params);
			
			var attr = {src: params.src};
			
			if (params.width) {
				attr.width = params.width;
			}
			
			if (params.height) {
				attr.height = params.height;
			}
			
			attr.load = function() {
				var $imagebutton = $(this).parent();
				var params = $imagebutton.data('imagebutton');	
				params.loaded = true;
				params.load();
			};
	
			attr.error = function(){
				var $imagebutton = $(this).parent();
				var params = $imagebutton.data('imagebutton');	
				params.loaded = false;	
				params.error();
			};
			
			$("<img/>", attr).appendTo($imagebutton);	
			if(params.visible){
				$imagebutton.show();
			}else{
				$imagebutton.hide();
			}
		});
				
	} else if(message === "destroy") {
		return this.each(function() {
			var $imagebutton = $(this);
			$imagebutton.removeData('imagebutton');
			$imagebutton.empty();	
		});
	} else if(message === "normal") {
		return this.each(function() {
			var $imagebutton = $(this);
			var params = $imagebutton.data('imagebutton');		
			if (params.state !== "normal"){			
				$imagebutton.addClass('imagebutton-normal').removeClass('imagebutton-active');
				params.state = "normal";
			}
		});
	} else if(message === "active") {
		return this.each(function() {
			var $imagebutton = $(this);
			var params = $imagebutton.data('imagebutton');		
			if (params.state !== "active"){			
				$imagebutton.addClass('imagebutton-active').removeClass('imagebutton-normal');
				params.state = "active";
			}
		});
	} else if(message === "getState") {
		return this.first().data('imagebutton').state;
	} else if(message === "setImage") {
		return this.children().attr("src", options.src);
	} else if(message === "show") {
		return this.each(function() {
			var $imagebutton = $(this);
			var params = $imagebutton.data('imagebutton');	
			params.visible = true;
			$imagebutton.show();
			if (params.centered){				
				var $img = $imagebutton.find('img');
				var w = $img.width();
				var h = $img.height();
				if(w > 0 && h > 0) {
					var spaceh = Math.round(($imagebutton.width() - w - 0.00000001) / 2);
					var spacev = Math.round(($imagebutton.height() - h - 0.00000001) / 2);
					$img.css('margin', spacev + 'px ' + spaceh + 'px');
				}
			}	
		});
	} else if(message === "hide") {
		return this.each(function() {
			var $imagebutton = $(this);
			var params = $imagebutton.data('imagebutton');		
			params.visible = false;
			$imagebutton.hide();
		});
	} else if(message === "loaded") {		
		var $imagebutton = $(this);
		var params = $imagebutton.data('imagebutton');		
		return params.loaded;	
	}
};
})(jQuery);