//<--
/*
	@name: Desaturation filter for Mootools
	@author: SWAT (Rostovtsev Ruslan)
	@url: http://www.jsysteam.ru
	@version: 1.0.0
*/

var Desaturate = new Class({
	Implements: Options,
	options: {
		elements: null,
		hoverColor: true,
		useAverage: false
	},
	
	canvas: new Array(),
	initialize: function(options) {
		this.setOptions(options);
		if(!this.options.elements) {
			this.options.elements = $(document.body).getElements('.desaturate');
		}
		for(var i = 0; i < this.options.elements.length; i++) {
			this.applyFilter(i);
			if(this.options.hoverColor) {
				this.addEvents(i);
			}
		}
	},
	
	processing: function(index) {
	
		if(this.canvas.length <= index)
			return (function() { this.ctx.processing(this.idx); }).delay(50, {ctx: this, idx: index});
		
		var canvas = this.canvas[index];
		var ctx = canvas.getContext("2d");
		var w = canvas.getProperty('width').toInt();
		var h = canvas.getProperty('height').toInt();
		ctx.drawImage(this.options.elements[index], 0, 0, w, h); 
		var d = ctx.getImageData(0, 0, w, h);
		var p = w * h;
		var pix = p * 4, pix1, pix2;
		if (this.options.useAverage) {
			while (p--) 
				d.data[pix-=4] = d.data[pix1=pix+1] = d.data[pix2=pix+2] = (d.data[pix] +  d.data[pix1] + d.data[pix2]) / 3;
		} else {
			while (p--)
				d.data[pix-=4] = d.data[pix1=pix+1] = d.data[pix2=pix+2] = (d.data[pix] * 0.3 + d.data[pix1] * 0.59 + d.data[pix2] * 0.11);
		}
		ctx.putImageData(d, 0, 0);
	},
	
	
	applyFilter: function(index) {
														
		var img = this.options.elements[index];
	
		if(Browser.Engine.trident) {
			 img.setStyle('filter', 'gray'); // если не yandex
			
		} else {
			if(this.canvas.length > index) {
				var disp = img.getStyle('display');
				img.store('sdisp', disp);
				img.setStyle('display', 'none');
				this.canvas[index].setStyle('display', disp);
			} else {
				var canvas = new Element('canvas', {
					'width': img.getProperty('width').toInt(),
					'height': img.getProperty('height').toInt()
				});
				if(!img.complete) {
					img.addEvent('load', function() {
						 this.ctx.processing(this.idx);
					}.bind({idx: index, ctx: this}));
				} else {
					this.processing(index);
				}
				img.store('sdisp', img.getStyle('display'));
				canvas.addClass(img.getProperty('class'));
				canvas.style.cssText = img.style.cssText;
				// если не yandex
					img.setStyle('display', 'none');
					canvas.inject(img, 'before'); 
				this.canvas.push(canvas);
			}
		}
	},
	
	removeFilter: function(index) {
		var img = this.options.elements[index];
		if(Browser.Engine.trident) {
			img.setStyle('filter', '');
		} else {
			this.canvas[index].setStyle('display', 'none');
			img.setStyle('display', img.retrieve('sdisp'));
		}
	},
	
	addEvents: function(index) {
		var img = this.options.elements[index];
			img.addEvent('mouseleave', function(event) {
				this.ctx.applyFilter(this.idx);
			}.bind({idx: index, ctx: this}));
			
			var el = Browser.Engine.trident ? img : this.canvas[index];
			el.addEvent('mouseenter', function(event) {
				this.ctx.removeFilter(this.idx);
			}.bind({idx: index, ctx: this}));
		
	}
});


