/*Copyright 2006-2009 Treefly, Inc. All rights reserved.*/var FilterParam=function(q){for(var c in this._defaults){if(typeof (q[c])=="undefined"){this[c]=this._defaults[c];}else{this[c]=q[c];}}if(this.value===null){this.value=this.identity;}};FilterParam.prototype={_defaults:{"value":null,"min":0,"max":100,"identity":0,"exponent":1,"multiplier":1,"intercept":0,"scratchArgPos":0},set:function(c){if(typeof (c)=="undefined"||c===null||c===""){return false;}else{if(typeof (c)=="number"){if(this.min!==null&&c<this.min){this.value=this.min;}else{if(this.max!==null&&c>this.max){this.value=this.max;}else{this.value=c;}}}else{this.value=c;}}return true;},getScratchValue:function(){if(this.value===null||this.value==this.identity){return "";}var c;if(this.value<0){c=-1*Math.pow(Math.abs(this.value),this.exponent)*this.multiplier+this.intercept;}else{c=Math.pow(this.value,this.exponent)*this.multiplier+this.intercept;}if(Math.round(c)==c){return c;}else{c=Math.round((c*1000))/1000;return c;}},toDef:function(){var q={};for(var c in this._defaults){if(this[c]!=this._defaults[c]){q[c]=this[c];}}return q;}};var Filter=function(q){for(var c in q){this[c]=q[c];}};Filter.prototype={getValue:function(){return this.getFirstParam().value;},setValue:function(c){var q=this.getFirstParam();return q.set(c);},getFirstParam:function(){for(var c in this.params){if(this.params[c].scratchArgPos===0){return this.params[c];}}return null;},toSegment:function(){if(this.isBooleanInScratch){if(this.getValue()){return this.scratchName;}else{return "";}}var c=[];for(var q in this.params){c[this.params[q].scratchArgPos]=this.params[q].getScratchValue();}if(c.join("")===""){return "";}else{return this.scratchName+"_"+c.join(",");}},toDef:function(){var x={"params":{}};for(var c in this){if(c=="params"){for(var q in this["params"]){x["params"][q]=this["params"][q].toDef();}}else{if(!Filter.prototype[c]&&!this.params[c]){x[c]=this[c];}}}return x;}};var State=function(c){var h={};for(var x in c){if(!c[x]["scratchName"]){c[x]["scratchName"]=x;}h[x]=new Filter(c[x]);h[x]["params"]={};for(var m in c[x]["params"]){h[x]["params"][m]=new FilterParam(c[x]["params"][m]);}}this.filters=h;for(var j in this.filters){this[j]=this.filters[j];for(var q in this.filters[j]["params"]){this.filters[j][q]=this.filters[j]["params"][q];}}};State.prototype={toSegments:function(){var x=[];for(var m in this.filters){x.push(this.filters[m]);}x.sort(function(k,j){return (j.priority||0)-(k.priority||0);});var c=[];for(var q=0;q<x.length;q++){if(x[q].scratchName=="crop"){cps=this.filters["crop"].params;sps=this.filters["size"].params;var h=(sps.height.value-cps.y.value-cps.height.value);c.push("crop_"+cps.x.value+","+h+","+cps.width.value+","+cps.height.value);}else{if(x[q].toSegment()){c.push(x[q].toSegment());}}}return c.join("/");},toDef:function(){var q={};for(var c in this.filters){q[c]=this.filters[c].toDef();}return q;}};var metaImageFromRemote=function(q,c){var x={};var h=loadJSONDoc("/open/"+q);h.addCallback(function(j){var m=new MetaImage(j,c);update(x,m);});return x;};var MetaImage=function(h,c){this.image=document.getElementById(c);this.id=c;if(!h.history.length||!h.historyIndex){throw "metaImageDef must have a history.";}for(var q in h){if(q=="history"){this.history=[];for(var x=0;x<h.history.length;x++){this.history[x]=new State(h.history[x]);}}else{this[q]=h[q];}}this.state=new State(h.history.slice(h.historyIndex)[0]);};MetaImage.prototype={communicateWithServer:false,domain:"services.snipshot.com.local",pathToScratch:"scratch",inputImageType:"jpg",outputImageType:"jpg",excludeCrop:true,commit:function(){var c=serializeJSON(this.state.toDef());if(this.communicateWithServer){var q={"method":"POST","sendContent":"stateDef="+urlEncode(c),"headers":{"Content-type":"application/x-www-form-urlencoded"}};var x=doXHR("/commit/"+this.id,q);return x;}else{return true;}},updateHistory:function(){this.history=this.history.slice(0,this.history.length+this.historyIndex+1);this.historyIndex=-1;this.history.push(new State(this.state.toDef()));},save:function(){var c=this.history.slice(this.historyIndex)[0];if(serializeJSON(c.toDef())==serializeJSON(this.state.toDef())){return false;}this.updateHistory();if(this.communicateWithServer){writeCookie("metaImage","");var q=this.commit();this.saveToCookie();return q;}else{this.saveToCookie();return true;}},restoreHistory:function(c){if(!c||c>-1||Math.abs(c)>this.history.length){return false;}var q=this.history.slice(c)[0];this.state=new State(q.toDef());this.historyIndex=c;if(this.communicateWithServer){if(this._waitingToRestore){this._waitingToRestore.cancel();}this._waitingToRestore=callLater(1,function(h){writeCookie("metaImage","");var x=doXHR("/restore/"+h+"/"+c);this.saveToCookie();return x;},this.id);return this._waitingToRestore;}else{this.saveToCookie();return true;}},saveToCookie:function(){var q={"id":this.id,"historyIndex":this.historyIndex,"scratchURL":this._buildURL(this.domain,this.pathToScratch,this.inputImageType,this.outputImageType)};var c=serializeJSON(q).replace(/\s/g,"");writeCookie("metaImage",c);return q;},_buildURL:function(h,c,x,q){return "http://"+h+"/"+c+"/"+this.id+"."+x+"/"+this.state.toSegments()+"/snipshot"+"."+q;},loadImage:function(){var c=this._buildURL(this.domain,this.pathToScratch,this.inputImageType,this.outputImageType);if(this.excludeCrop){c=c.replace(/\/crop[^\/]*/,"");}this.image.src=c;return this.image.src;},change:function(c,q){if(c=="width"||c=="height"){this.state.filters.size[c].set(q);}else{if(c=="contrast"||c=="saturation"||c=="brightness"){this.state.filters.color[c].set(q);}else{this.state.filters[c].setValue(q);}}var x=this.save();if(x){this.loadImage();return x;}else{return false;}},restore:function(c){var q=this.restoreHistory(c);if(q){this.loadImage();return q;}else{return false;}},undo:function(){return this.restore(this.historyIndex-1);},redo:function(){return this.restore(this.historyIndex+1);}};var writeCookie=function(c,x,h){if(!h){var h=12;}var m=new Date();m.setTime(m.getTime()+(h*60*60*1000));var q=document.domain.substring(document.domain.indexOf("snipshot"),document.domain.length);document.cookie=c+"="+x+"; expires="+m.toGMTString()+"; domain=."+q+"; path=/";};var readCookie=function(q){if(q.indexOf("=")!=q.length-1){q=q+"=";}var m=document.cookie.indexOf(q);if(m!=-1){var h=m+q.length;var c=document.cookie.indexOf(";",h);if(c==-1){c=document.cookie.length;}var x=document.cookie.substring(h,c);return x;}};