addLoadEvent(function(){if(supports_canvas()){addFilter("filter-blur");addFilter("filter-greyscale");addFilter("filter-mosaic");addFilter("filter-noise");addFilter("filter-posterize");addFilter("filter-sepia");addFilter("filter-tint");}});function addFilter(filterType){toFilter=getElementsByClassName(filterType);for(var current in toFilter){params=getFilterParameters(toFilter[current]);var img=getReferenceImage(toFilter[current]);img.onLoad=processFilters(filterType,img,params,current,toFilter);}
function processFilters(filterType,img,params,current,toFilter){var buffer=document.createElement("canvas");var c=buffer.getContext('2d');c.width=buffer.width=img.width;c.height=buffer.height=img.height;if(img&&c){var pixels=initializeBuffer(c,img);if(pixels){if(filterType=="filter-blur"){pixels=gaussianBlur(img,pixels,params.blurAmount);}
if(filterType=="filter-tint"){var src=parseInt(createColor(params.tintColor),16),dest={r:((src&0xFF0000)>>16),g:((src&0x00FF00)>>8),b:(src&0x0000FF)};}
for(var i=0,data=pixels.data,length=data.length;i<length/4;i++){var index=i*4;var thisPixel={r:data[index],g:data[index+ 1],b:data[index+ 2]};pixels=applyFilters(filterType,params,img,pixels,index,thisPixel,dest);}
c.putImageData(pixels,0,0);placeReferenceImage(toFilter[current],buffer);}}}
function getReferenceImage(ref){if(ref.nodeName=="IMG"){return ref;}
var bg=window.getComputedStyle(ref,null).backgroundImage;if(bg){var img=new Image();img.src=bg.replace(/['"]/g,'').slice(4,-1);return img;}
return false;}
function placeReferenceImage(ref,buffer){result=buffer.toDataURL("image/png");if(ref.nodeName=="IMG"){img.src=result;}else{ref.style.backgroundImage="url("+ result+")";}}
function getFilterParameters(ref){var params={"blurAmount":1,"greyscaleAmount":1,"mosaicAmount":1,"mosaicSize":5,"noiseAmount":30,"noiseType":"mono","posterizeAmount":5,"sepiaAmount":1,"tintAmount":0.3,"tintColor":"#FFF"};for(var filterName in params){var hyphenated=filterName.replace(/([A-Z])/g,function(all,letter){return'-'+ letter.toLowerCase();}),attr=ref.getAttribute("data-pb-"+ hyphenated);if(attr){params[filterName]=attr;}}
params['tintColor']=ref.getAttribute("data-pb-tint-colour")||params['tintColor'];params['posterizeAreas']=256/params.posterizeAmount;params['posterizeValues']=255/(params.posterizeAmount- 1);return(params);}
function initializeBuffer(c,img){c.clearRect(0,0,c.width,c.height);if(img.width>0&&img.height>0){try{c.drawImage(img,0,0,img.width,img.height);return(c.getImageData(0,0,c.width,c.height));}catch(err){}}}
function createColor(src){src=src.replace(/^#/,'');if(src.length==3){src=src.replace(/(.)/g,'$1$1');}
return(src);}
function findColorDifference(dif,dest,src){return(dif*dest+(1- dif)*src);}
function setRGB(data,index,r,g,b){data[index]=r;data[index+ 1]=g;data[index+ 2]=b;return data;}
function applyFilters(filterType,params,img,pixels,index,thisPixel,dest){var data=pixels.data,val;switch(filterType){case"filter-greyscale":val=(thisPixel.r*0.21)+(thisPixel.g*0.71)+(thisPixel.b*0.07);data=setRGB(data,index,findColorDifference(params.greyscaleAmount,val,thisPixel.r),findColorDifference(params.greyscaleAmount,val,thisPixel.g),findColorDifference(params.greyscaleAmount,val,thisPixel.b));break;case"filter-mosaic":var pos=index>>2;var stepY=Math.floor(pos/imgWidth);var stepY1=stepY%params.mosaicSize;var stepX=pos-(stepY*imgWidth);var stepX1=stepX%params.mosaicSize;if(stepY1)pos-=stepY1*imgWidth;if(stepX1)pos-=stepX1;pos=pos<<2;data=setRGB(data,index,findColorDifference(params.mosaicOpacity,data[pos],thisPixel.r),findColorDifference(params.mosaicOpacity,data[pos+ 1],thisPixel.g),findColorDifference(params.mosaicOpacity,data[pos+ 2],thisPixel.b));break;case"filter-noise":val=noise(params.noiseAmount);if((params.noiseType=="mono")||(params.noiseType=="monochrome")){data=setRGB(data,index,checkRGBBoundary(thisPixel.r+ val),checkRGBBoundary(thisPixel.g+ val),checkRGBBoundary(thisPixel.b+ val));}else{data=setRGB(data,index,checkRGBBoundary(thisPixel.r+ noise(params.noiseAmount)),checkRGBBoundary(thisPixel.g+ noise(params.noiseAmount)),checkRGBBoundary(thisPixel.b+ noise(params.noiseAmount)));}
break;case"filter-posterize":data=setRGB(data,index,parseInt(params.posterizeValues*parseInt(thisPixel.r/params.posterizeAreas)),parseInt(params.posterizeValues*parseInt(thisPixel.g/params.posterizeAreas)),parseInt(params.posterizeValues*parseInt(thisPixel.b/params.posterizeAreas)));break;case"filter-sepia":data=setRGB(data,index,findColorDifference(params.sepiaAmount,(thisPixel.r*0.393)+(thisPixel.g*0.769)+(thisPixel.b*0.189),thisPixel.r),findColorDifference(params.sepiaAmount,(thisPixel.r*0.349)+(thisPixel.g*0.686)+(thisPixel.b*0.168),thisPixel.g),findColorDifference(params.sepiaAmount,(thisPixel.r*0.272)+(thisPixel.g*0.534)+(thisPixel.b*0.131),thisPixel.b));break;case"filter-tint":data=setRGB(data,index,findColorDifference(params.tintAmount,dest.r,thisPixel.r),findColorDifference(params.tintAmount,dest.g,thisPixel.g),findColorDifference(params.tintAmount,dest.b,thisPixel.b));break;}
return(pixels);}
function noise(noiseValue){return Math.floor(noiseValue/2-(Math.random()*noiseValue));}
function checkRGBBoundary(val){if(val<0){return 0;}else if(val>255){return 255;}else{return val;}}}
