/**
 * Image Desaturate - jQuery plugin
 * Desaturate (convert) all types of images on web page
 * 
 * (c) 2010 Dmitry Kelmi <miksir@maker.ru>
 * Version: 0.6 (23 Sep 2010)
 * Requires: jQuery v1.3+
 * 
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 * 
 * How to use:
 *  $(selector).desaturate(options);
 *  options = {
 *    'iefix': true or false  - autofix images for IE(6-8)
 *  }
 *
 *  IE fix need in following cases:
 *    - image is png with transparency - it apply standart IE fix for png
 *    - desaturated image will be switched with opacity (fadeIn/fadeOut) - jQuery can reset filters after
 *      fadeIn / fadeOut and lost desaturate effect
 *  'iefix' apply fixes only to target of desaturate() and not to other png images!
 *  If you set 'iefix' to false, you can fix images with .desaturateImgFix(), note: all other kind of scripts
 *  for PNG IE fix wont work with .desaturate().
 *
 *  Note: desaturate will replace current image and return new node as result (for all browsers)
 *  Note for non-ie: u can't desaturate IMG which is not loaded yet, so better to use it with onload event.
 */
jQuery.desaturate={defaults:{onswitch:null,iefix:true,level:1,rgb:[0.3333,0.3333,0.3333]},customClass:"js-desaturate-fixed"};jQuery.desaturate.Image=function(b){this.image=b;this.canvas=null;this.options={};this.jImage=jQuery(this.image);this.jImage.bind("load.desaturate",jQuery.proxy(this.imageLoaded,this));this.loaded=this.image.complete;this.src=this.jImage.attr("src");this.isPNG=this.jImage.is("IMG[src$=.png]");var a=new String(this.jImage.css("width"));a=a.replace(/px/,"");var c=new String(this.jImage.css("height"));c=c.replace(/px/,"");this.width=this.jImage.width()?this.jImage.width():(a?a:this.jImage.attr("width"));this.height=this.jImage.height()?this.jImage.height():(c?c:this.jImage.attr("height"));this.imgFilter="";if(this.image.style.filter){this.imgFilter="filter:"+this.image.style.filter+";";this.image.style.filter=""}this.image.style.width="";this.image.style.height="";this.imgId=this.jImage.attr("id")?'id="'+this.jImage.attr("id")+'" ':"";this.imgClass='class="'+this.jImage.attr("class")+" "+jQuery.desaturate.customClass+'" ';this.imgTitle=this.jImage.attr("title")?'title="'+this.jImage.attr("title")+'" ':"";this.imgAlt=this.jImage.attr("alt")?'alt="'+this.jImage.attr("alt")+'" ':"";this.imgStyles=this.image.style.cssText;this.imgStyles+=this.jImage.attr("align")?"float:"+this.jImage.attr("align")+";":"";this.imgStyles+=this.jImage.parent().attr("href")?"cursor:hand;":"";this.imgStyles=this.imgStyles.replace(/filter:/i,"");this.imgCssSize=(this.width&&this.height)?"width:"+this.width+"px;height:"+this.height+"px;":""};jQuery.desaturate.Image.prototype.imageLoaded=function(){this.loaded=true;this.jImage.unbind("load.desaturate");if(this.canvas){this.replaceImageWithCanvas();this.canvas=null}};jQuery.desaturate.Image.prototype.replace=function(a){return jQuery(a).replaceAll(this.image).get(0)};jQuery.desaturate.Image.prototype.prepareCanvas=function(){var a='<canvas style="display:inline-block;'+this.imgStyles+this.imgCssSize+'" ';a+=this.imgId+this.imgClass+this.imgTitle+this.imgAlt+"></canvas>";this.canvas=jQuery(a).get(0);return this.canvas};jQuery.desaturate.Image.prototype.switchToCanvas=function(){if(this.loaded&&this.canvas){this.replaceImageWithCanvas();this.canvas=null}};jQuery.desaturate.Image.prototype.replaceImageWithCanvas=function(){var a=this.replace(this.getCanvas());if(typeof(this.options.onswitch)=="function"){this.options.onswitch.call(a)}};jQuery.desaturate.Image.prototype.getCanvas=function(){var k=this.options;var b=this.canvas;var e=b.getContext("2d");var g=this.width;var c=this.height;b.width=g;b.height=c;e.drawImage(this.image,0,0);var a=e.getImageData(0,0,g,c);for(var h=0;h<a.height;h++){for(var j=0;j<a.width;j++){var d=(h*4)*a.width+j*4;var f=a.data[d]*k.rgb[0]+a.data[d+1]*k.rgb[1]+a.data[d+2]*k.rgb[2];a.data[d]=f*k.level+a.data[d]*(1-k.level);a.data[d+1]=f*k.level+a.data[d+1]*(1-k.level);a.data[d+2]=f*k.level+a.data[d+2]*(1-k.level)}}e.putImageData(a,0,0,0,0,a.width,a.height);return b};jQuery.desaturate.Image.prototype.getIeFix=function(){var b="display:block;background:transparent;padding:0;margin:0;";var a='<span style="display:inline-block;'+this.imgStyles+this.imgCssSize+'" ';a+=this.imgId+this.imgClass+this.imgTitle+this.imgAlt+">";a+='<span style="'+b+this.imgCssSize+this.imgFilter+'">';if(this.isPNG){a+='<span style="'+b+this.imgCssSize;a+="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+this.src+"', sizingMethod='crop');\">";a+="</span>"}else{a+='<img style="'+b+this.imgCssSize+'" '+this.imgTitle+this.imgAlt;a+=' src="'+this.src+'">'}a+="</span>";a+="</span>";return jQuery(a).get(0)};jQuery.fn.desaturate=function(b){var a=[];var c=jQuery.extend(true,{},jQuery.desaturate.defaults,b);this.each(function(){var e=this;var g=null;var f=jQuery.extend(true,{},c,jQuery.metadata?jQuery(e).metadata():{},jQuery(e).data("desaturate"));if(jQuery.browser.msie&&jQuery(e).is("IMG")&&f.iefix){g=new jQuery.desaturate.Image(e);g.options=f;e=g.replace(g.getIeFix())}if(jQuery.browser.msie&&(jQuery(e).is("IMG")||jQuery(e).hasClass(jQuery.desaturate.customClass))){var d=e;if(jQuery(e).hasClass(jQuery.desaturate.customClass)){d=jQuery("SPAN",e).get(0)}d.style.filter=(d.style.filter?d.style.filter+" ":"")+"progid:DXImageTransform.Microsoft.BasicImage(grayScale=1)";if(typeof(f.onswitch)=="function"){jQuery.proxy(f.onswitch,e)}}if(!jQuery.browser.msie&&(jQuery(e).is("IMG"))){g=new jQuery.desaturate.Image(e);g.options=f;e=g.prepareCanvas();g.switchToCanvas()}a.push(e)});return this.pushStack(a,"desaturate","")};jQuery.fn.desaturateImgFix=function(b){if(!jQuery.browser.msie){return this}var c=jQuery.extend(true,{},jQuery.desaturate.defaults,b);var a=[];this.each(function(){var d=jQuery.extend(true,{},c,jQuery.metadata?jQuery(this).metadata():{},jQuery(this).data("desaturate"));if(!jQuery(this).is("IMG")){a.push(this)}else{var e=new jQuery.desaturate.Image(this);e.options=d;a.push(e.replace(e.getIeFix()))}});return this.pushStack(a,"desaturateImgFix","")};
