$.fn.extend({
	/*
		Grayscale image
			uses canvas
	*/
	desaturate: function (options) {
		var defaults = {

		};
		
		var settings = $.extend(defaults, options);
		
		var method = {
			grayScaleIE : function()
			{
				$(this).data("des-status", 1);
				$(this).get(0).style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(grayScale=1)';	
			},
			desaturate : function()
			{
				var imgObj = $(this).get(0);
				var canvas = document.createElement('canvas');
				var canvasContext = canvas.getContext('2d');
				
				var imgW = imgObj.width;
				var imgH = imgObj.height;
				canvas.width = imgW;
				canvas.height = imgH;
				
				canvasContext.drawImage(imgObj, 0, 0);
				var imgPixels = canvasContext.getImageData(0, 0, imgW, imgH);
				
				for(var y = 0; y < imgPixels.height; y++){
					for(var x = 0; x < imgPixels.width; x++){
						var i = (y * 4) * imgPixels.width + x * 4;
						var avg = (imgPixels.data[i] + imgPixels.data[i + 1] + imgPixels.data[i + 2]) / 3; //i = R, i + 1, G, i+2 = B
						imgPixels.data[i] = avg; 
						imgPixels.data[i + 1] = avg; 
						imgPixels.data[i + 2] = avg;
					}
				}
				
				canvasContext.putImageData(imgPixels, 0, 0, 0, 0, imgPixels.width, imgPixels.height);
				imgObj.src = canvas.toDataURL();
				$(this).data("des-status", 1);
			},
			undo : function()
			{
				$(this).data("des-status", 0);
				if($.browser.msie){
					$(this).get(0).style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(grayScale=0)';
				} else {
				   $(this).get(0).src = $(this).data("src");
				}   
			}
		};
		
		
		return this.each(function() {
			if(typeof(options) == "string")
			{
			    if(!$(this).data("src")) $(this).data("src", $(this).attr("src"));
			    
				method[options].call(this);
				return this;
			}
			else
			{
				$(this).data("src", $(this).attr("src"));
				// Width is not known before load
				if($(this).width() == 0 || $.browser.msie)
				{
					if($(this).data("des-status") == 0)
					{
						if($.browser.msie){
							method.grayScaleIE.call(this);
						} else {
						   method.desaturate.call(this);
						}  
					}
					$(this).load(function(){
						if($.browser.msie){
							method.grayScaleIE.call(this);
						} else {
						   method.desaturate.call(this);
						}  
						$(this).unbind("load");
					});
				}
				else
				{
					if($.browser.msie){
						method.grayScaleIE.call(this);
					} else {
					   method.desaturate.call(this);
					}     
				}   
			}
		});
	}
});
