(function (window, $) {
	var dCanvas = document.createElement('canvas'), desaturateImage, saturateImage;
	if (!!(dCanvas.getContext)) {
		var getDesaturatedImg = function (dImage/*DOM Object*/) {
			var canvasContext = dCanvas.getContext('2d'), imgPixels, imgSize = {width: dImage.width, height: dImage.height};
			dCanvas.width = imgSize.width;
			dCanvas.height = imgSize.height;
			canvasContext.drawImage(dImage, 0, 0);
			imgPixels = canvasContext.getImageData(0, 0, imgSize.width, imgSize.height);
			for (var y = 0; y < imgPixels.height; y++) {
				for (var x = 0; x < imgPixels.width; x++) {
					var pIndex = (y * 4) * imgPixels.width + x * 4;
					var cAvg = (imgPixels.data[pIndex] + imgPixels.data[pIndex + 1] + imgPixels.data[pIndex + 2]) / 3;
					imgPixels.data[pIndex] = cAvg;
					imgPixels.data[pIndex + 1] = cAvg;
					imgPixels.data[pIndex + 2] = cAvg;
				}
			}
			canvasContext.putImageData(imgPixels, 0, 0, 0, 0, imgPixels.width, imgPixels.height);
			return dCanvas.toDataURL();
		};
		desaturateImage = function (dImage/*DOM Object*/) {
			var desaturatedData, imgUrl, oDesaturate = dImage.oDesaturate || {};
			if (dImage.tagName == 'IMG') {
				if (oDesaturate.desaturatedData) {
					desaturatedData = oDesaturate.desaturatedData;
				} else {
					desaturatedData = getDesaturatedImg(dImage);
				}
				if (!oDesaturate.baseSrc) {
					oDesaturate.baseSrc = dImage.src;
				}
				dImage.src = desaturatedData;
			} else if ((imgUrl = dImage.style.backgroundImage).length) {
				if (oDesaturate.desaturatedData) {
					dImage.style.backgroundImage = 'url(' + oDesaturate.desaturatedData + ')';
				} else {
					var tempImage = new Image(), urlRegExp = new RegExp('url\\(\"?([^"]*)\"?\\)');
					tempImage.src = imgUrl.replace(urlRegExp, '$1');
					if (!oDesaturate.baseSrc) {
						oDesaturate.baseSrc = tempImage.src;
					}
					tempImage.onload = function () {
						desaturatedData = getDesaturatedImg(tempImage);
						dImage.style.backgroundImage = 'url(' + desaturatedData + ')';
						oDesaturate.desaturatedData = desaturatedData;
					};
				}
			}
			dImage.oDesaturate = oDesaturate;
		};
		saturateImage = function (dImage/*DOM Object*/) {
			var oDesaturate = dImage.oDesaturate || {};
			if (oDesaturate.baseSrc) {
				if (dImage.tagName == 'IMG') {
					dImage.src = oDesaturate.baseSrc;
				} else if (dImage.style.backgroundImage.length) {
					dImage.style.backgroundImage = 'url(' + oDesaturate.baseSrc + ')';
				}
			}
		};
	} else { //предпологаем что это IE...
		desaturateImage = function (dImage/*DOM Object*/) {
			dImage.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(grayScale=1)';
		};
		saturateImage = function (dImage) {
			dImage.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(grayScale=0)';
		};
	}
	window.desaturateImage = desaturateImage;
	window.saturateImage = saturateImage;
	if ($) {
		$.fn.desaturate = function () {
			var jImg = $(this);
			if (jImg.length > 1) {
				jImg.each(function () {
					desaturateImage(jImg.get(0));
				});
			} else {
				desaturateImage(jImg.get(0));
			}
			return this; 
		};
		$.fn.saturate = function () { 
			var jImg = $(this);
			if (jImg.length > 1) {
				jImg.each(function () {
					saturateImage(jImg.get(0));
				});
			} else {
				saturateImage(jImg.get(0));
			}
			return this;
		};
	}
})(this, jQuery);
