/* CCGallery - HTML5 Multimedia Gallery - 1.3
 * Copyright 2011, Nilok Bose  
 * http://codecanyon.net/user/cosmocoder
*/

jQuery(function(c){var l=c("#ccgallery"),h=c("#thumbGallery"),i=c("#thumbGallery").find("ul"),g=c("#itemList"),d=c("#coverContainer"),f=c.browser.msie?true:false,a=f&&c.browser.version<9&&IE7.recalc?true:false,k="config.xml";if(l.data("mobile")===true){c.ajax({type:"GET",url:"includes/mobile.php",dataType:"text",success:function(m){if(m==="true"){k="config-mobile.xml";e()}}})}else{e()}function e(){c.ajax({type:"GET",url:k,dataType:"xml",success:function(m){j(c(m))}})}function j(x){var m=x.find("file"),r=m.find("cover"),q=m.find("thumb"),p=m.find("title"),u=m.find("description"),w=m.length,o=0;var t="",z="",y="";for(var s=0;s<w;s++){var v="{";m.eq(s).find("category").each(function(){v+='"'+c(this).text()+'": true,'});v=v.substr(0,v.length-1);v+="}";t+='<li data-id="'+(s+1)+'" data-type="'+m.eq(s).attr("type")+"\" data-categories='"+v+"'>";t+='<img src="'+q.eq(s).text()+'" alt="" />';t+='<div class="details">';t+="<h2>"+p.eq(s).text()+"</h2>";t+='<p class="description">'+u.eq(s).text()+"</p>";t+="</div>";t+="</li>";z+='<img src="'+r.eq(s).text()+'" alt="" />';y+='<li data-id="'+(s+1)+'" data-type="'+m.eq(s).attr("type")+"\" data-categories='"+v+"'>";y+="<h2>"+p.eq(s).text()+"</h2>";y+='<p class="description">'+u.eq(s).text()+"</p>";y+="</li>"}i.html(t);d.html(z);g.html(y);if(a){g.delegate("li","mouseleave click",function(A){c(this).removeClass("ie7_class7")});i.delegate("li","mouseleave",function(A){c(this).removeClass("ie7_class4")})}var n;if(c("#gocoverflow").hasClass("active")){n="coverflow"}else{n="thumbnails";if(f){l.find("section").css({position:"absolute",top:"0",left:"0"});c("#coverflowGallery").css({display:"block",opacity:"0"})}}l.find("img").load(function(){o++;if(o===2*w){l.css({height:"auto",background:"none"});if(n==="coverflow"){d.parent().fadeIn(600)}else{h.fadeIn(600);if(f){l.find("section").css("position","static");c("#coverflowGallery").css({display:"none",opacity:"1"})}}b(w,m)}})}function b(s,q){var L=i.clone(),F=g.clone();if(f&&c.browser.version==9){var t=c('<div id="olfix"/>').insertAfter(g)}l.find("menu").delegate("a.navbuttons","click",function(){var ak=c(this),ai=ak.index("a.navbuttons"),al=c("section.displayStyle");ak.addClass("active").siblings().removeClass("active");if(ak.parent().is("#sortButtons")){var ah,aj;if(ak.data("type")){if(ak.data("type")==="all"){ah=L.find("li");aj=F.find("li")}else{ah=L.find("li[data-type="+ak.data("type")+"]");aj=F.find("li[data-type="+ak.data("type")+"]")}}else{if(ak.data("category")){ah=L.find("li").filter(function(){if(ak.data("category") in c(this).data("categories")){return true}});aj=F.find("li").filter(function(){if(ak.data("category") in c(this).data("categories")){return true}})}}i.quicksand(ah,{duration:800,adjustHeight:"dynamic",useScaling:false},function(){i.css("height","auto");if(a){IE7.recalc()}});g.quicksand(aj,{duration:800,adjustHeight:"dynamic",useScaling:false},function(){g.css("height","auto");N();if(a){IE7.recalc()}if(t){t[0].innerHTML=" "}})}else{if(al.eq(ai).is(":visible")){return false}else{al.filter(":visible").fadeOut(600,function(){al.eq(ai).fadeIn(600)})}}});i.delegate("img","click",function(){var aj=c(this).parent(),ai=aj.data("type"),ah=q.eq(aj.data("id")-1).find("source");X(ai,ah,aj.find("h2")[0].innerHTML,aj.find("p")[0].innerHTML)});var ae=d.find("img"),O=c('<div class="cwrapper"/>').appendTo(d).hide(),K=c('<canvas class="fade"/>').appendTo(d),C=c('<p id="coverTitle"/>').appendTo(d).css("z-index",2*s),n=d.width(),o=0,H,S=s%2===0?s/2-1:(s+1)/2-1,ad=getRGB(c("body").css("background-color")),V,r=document.createElement("canvas").getContext?true:false;for(var aa=0;aa<s;aa++){if(o<ae.eq(aa)[0].height){o=ae.eq(aa)[0].height;H=o}}if(r){o=1.5*o;d.height(o)}else{d.height(o+20)}var J=[],u=[],ac=[],B=[],p=[],w=[],D=[],Q=[],Y=ae[S].width;function Z(){if(r){for(var ai=0;ai<s;ai++){var am,al,aj,ak,ah=g.find("li").eq(ai).data("id")-1;ac[ai]=ae[ah].width;B[ai]=ae[ah].height;J[ai]=c('<canvas class="cover"/>').appendTo(O).data("index",ai);u[ai]=J[ai][0].getContext("2d");J[ai][0].width=ac[ai];J[ai][0].height=1.5*B[ai];p[ai]=new Plane(ac[ai],1.5*B[ai],300,u[ai],"#666",ad,ae[ah]);if(ai<S){am=ai;p[ai].rotation.y=Math.PI/4;p[ai].position.z=100;p[ai].render();w[ai]=p[ai].maxwidth;D[ai]=p[ai].maxoffset;aj=w[ai];al=n/2-J[ai][0].width/2-Y/2-w[ai]/2+(ai-S+1)*40+D[ai]/2;ak=n/2-aj/2-Y/2-aj/2+(ai-S+1)*40}else{if(ai>S){am=s-1-ai;p[ai].rotation.y=-Math.PI/4;p[ai].position.z=100;p[ai].render();w[ai]=p[ai].maxwidth;D[ai]=p[ai].maxoffset;aj=w[ai];al=n/2-J[ai][0].width/2+Y/2+w[ai]/2+(ai-S-1)*40-D[ai]/2;ak=n/2+Y/2+(ai-S-1)*40}else{if(ai===S){am=ai;al=n/2-Y/2;p[ai].rotation.y=Math.PI/4;p[ai].position.z=100;p[ai].render();w[ai]=p[ai].maxwidth;D[ai]=p[ai].maxoffset;p[ai].rotation.y=0;p[ai].position.z=0;p[ai].render();aj=ac[ai];ak=n/2-aj/2}}}J[ai].css({zIndex:am,left:al,top:H-B[ai],bottom:"auto"});Q[ai]=c('<a class="coverclick"/>').appendTo(d).data("index",ai);Q[ai].css({left:ak,top:H-B[ai],bottom:"auto",zIndex:s+2+am,width:aj,height:J[ai][0].height})}}else{for(var ai=0;ai<s;ai++){var al,am,ah=g.find("li").eq(ai).data("id")-1;ac[ai]=ae.eq(ah)[0].width;B[ai]=ae.eq(ah)[0].height;J[ai]=c('<div class="cover"/>').appendTo(O).data("index",ai).append(ae.eq(ah).clone());w[ai]=Math.round(0.7*ac[ai]);if(ai<S){al=n/2-Y/2-w[ai]+(ai-S)*40;am=ai;J[ai].width(w[ai]);J[ai].height(Math.round(w[ai]*B[ai]/ac[ai]))}else{if(ai>S){al=n/2+Y/2+(ai-S)*40;am=s-1-ai;J[ai].width(w[ai]);J[ai].height(Math.round(w[ai]*B[ai]/ac[ai]))}else{if(ai===S){al=n/2-Y/2;am=ai;J[ai].width(ac[ai]);J[ai].height(B[ai])}}}J[ai].css({left:al,zIndex:am});Q[ai]=c('<a class="coverclick"/>').appendTo(d).data("index",ai);Q[ai].css({left:al,bottom:0,top:"auto",zIndex:s+2+am,width:J[ai].width(),height:J[ai].height()})}O.height(o);C.css("bottom","0px")}}Z();if(r){K.css({position:"absolute",bottom:"0",left:"0",zIndex:s+1});K[0].width=n;K[0].height=o;var A=K[0].getContext("2d"),ab=A.createLinearGradient(0,0,n,0);ab.addColorStop(0,"rgba("+ad.r+","+ad.g+","+ad.b+", 1.0)");ab.addColorStop(0.35,"rgba("+ad.r+","+ad.g+","+ad.b+", 0.0)");ab.addColorStop(0.65,"rgba("+ad.r+","+ad.g+","+ad.b+", 0.0)");ab.addColorStop(1,"rgba("+ad.r+","+ad.g+","+ad.b+", 1.0)");A.fillStyle=ab;A.rect(0,0,n,o);A.fill()}ae.hide();O.fadeIn(600);g.find("li").eq(S).addClass("active");V=g.find("li").eq(S).data("id");Q[S].addClass("active");C[0].innerHTML=q.eq(S).find("title").text();var R=c("#scrollbar-track"),af=R.find(".ui-slider-handle"),G=af.wrap('<div class="ui-handle-helper-parent"/>').parent();R.slider({animate:true,max:s-1,min:0,value:S,slide:function(ah,ai){M(ai.value)}});G.width(R.width()-af.width());c("#next").click(function(){R.slider("option","value",S+1);M(S+1)});c("#prev").click(function(){R.slider("option","value",S-1);M(S-1)});c(document).keydown(function(ai){var ah=ai.keyCode||ai.charCode;if(ah===39){R.slider("value",S+1);M(S+1)}else{if(ah===37){R.slider("option","value",S-1);M(S-1)}}});d.delegate("a.coverclick","click",function(){var ai=c(this),ah=ai.data("index");if(ai.hasClass("active")){g.find("li").eq(ah).trigger("click")}else{if(ah!==S){R.slider("option","value",ah);M(ah)}}});d.mousewheel(function(ah,ai){ai=-Math.round(ai);if(ai!==0){R.slider("option","value",S+ai);M(S+ai)}});var v=false;d.hover(function(){v=true},function(){v=false});c(window).mousewheel(function(){if(v){return false}});g.delegate("li","click",function(){var ai=c(this),ah=g.find("li").index(ai);if(ai.hasClass("active")){X(ai.data("type"),q.eq(ai.data("id")-1).find("source"),ai.find("h2")[0].innerHTML,ai.find("p")[0].innerHTML)}else{if(ah!==S){ai.addClass("active").siblings().removeClass("active");R.slider("option","value",ah);M(ah)}}});function N(){var ai=g.find("li"),ah=ai.filter("[data-id="+V+"]");if(ah.length===1){ai.removeClass("active");ah.addClass("active")}else{if(ah.length===0){ah=ai.eq(0);ah.addClass("active");V=ah.data("id")}}O.empty();d.find("a.coverclick").remove();S=ai.index(ah);s=ai.length;Y=ae.eq(V-1)[0].width;Z();K.css("z-index",s+1);Q[S].addClass("active");R.slider("option","max",s-1);R.slider("option","value",S);C[0].innerHTML=q.eq(V-1).find("title").text()}function M(ao){if(ao>=0&&ao<s){var ah=ao>S?"next":"prev",ai=s;V=g.find("li").removeClass("active").eq(ao).addClass("active").data("id");Q[S].removeClass("active");Q[ao].addClass("active");C[0].innerHTML=q.eq(V-1).find("title").text();if(r){while(ai--){var an,am,ak,al;if(ai<ao){an=ai;am=n/2-J[ai][0].width/2-ac[ao]/2-w[ai]/2+(ai-ao+1)*40+D[ai]/2;ak=w[ai];al=n/2-ak/2-ac[ao]/2-ak/2+(ai-ao+1)*40}else{if(ai>ao){an=s-1-ai;am=n/2-J[ai][0].width/2+ac[ao]/2+w[ai]/2+(ai-ao-1)*40-D[ai]/2;ak=w[ai];al=n/2-ak/2+ac[ao]/2+ak/2+(ai-ao-1)*40}else{if(ai===ao){an=s;am=n/2-J[ao][0].width/2;ak=ac[ao];al=n/2-ak/2}}}J[ai].css("zIndex",an);Q[ai].css({zIndex:s+2+an,width:ak,left:al});J[ai].stop().animate({left:am},600);if(ah==="next"){if(ai>S&&ai<ao){p[ai].rotation.y=Math.PI/4;p[ai].render()}else{if(ai===ao){c(p[ai].position).stop().animate({z:0},600);c(p[ai].rotation).stop().animate({y:0},{duration:600,step:function(){this.parent.render()}})}else{if(ai===S){c(p[ai].position).stop().animate({z:100},600);c(p[ai].rotation).stop().animate({y:Math.PI/4},{duration:600,step:function(){this.parent.render()}})}}}}else{if(ai>ao&&ai<S){p[ai].rotation.y=-Math.PI/4;p[ai].render()}else{if(ai===S){c(p[ai].position).stop().animate({z:100},600);c(p[ai].rotation).stop().animate({y:-Math.PI/4},{duration:600,step:function(){this.parent.render()}})}else{if(ai===ao){c(p[ai].position).stop().animate({z:0},600);c(p[ai].rotation).stop().animate({y:0},{duration:600,step:function(){this.parent.render()}})}}}}}}else{while(ai--){var an,am,ak,aj;if(ai<ao){am=n/2-ac[ao]/2-w[ai]+(ai-ao)*40;an=ai;ak=w[ai];aj=Math.round(w[ai]*B[ai]/ac[ai])}else{if(ai>ao){am=n/2+ac[ao]/2+(ai-ao)*40;an=s-1-ai;ak=w[ai];aj=Math.round(w[ai]*B[ai]/ac[ai])}else{if(ai===ao){am=n/2-ac[ao]/2;an=s;ak=ac[ai];aj=B[ai]}}}J[ai].css("zIndex",an);Q[ai].css({zIndex:s+2+an,width:ak,height:aj,left:am});J[ai].stop().animate({left:am,width:ak,height:aj},600)}}S=ao}}var m=c('<div id="mask"/>').appendTo("body"),x=c('<div id="overlayLoader"/>').appendTo("body"),W=c('<div id="overlay"/>').appendTo("body"),z=c('<div id="overlayContent"/>').appendTo(W),I=c('<a id="close"/>').appendTo(W),T,P=c(window);z.html('<div class="details"><h2></h2><p></p></div>');var ag=z.find("h2"),E=z.find("p");function X(ai,ah,al,aj){ag[0].innerHTML=al;E[0].innerHTML=aj;var ak=P.scrollTop()+P.height()/2;m.css("height",c(document).height()).fadeIn(400,function(){x.css("top",ak).show();if(ai==="photo"){if(f){W.css({visibility:"hidden",display:"block"});z.css({visibility:"hidden",display:"block"})}var an=c('<img src="'+ah.text()+'" alt="" />').appendTo(z);an[0].onload=function(){y(an[0]);if(f){W.css({visibility:"visible",display:"none"});z.css({visibility:"visible",display:"none"})}U(an[0].width,an[0].height+80,ak)}}else{if(ai==="audio"){var ap='<audio controls preload="auto">',au='<audio controls preload="auto"';for(var aq=0,at=ah.length;aq<at;aq++){var ao=ah.eq(aq).text(),aw=ao.split(".").pop();if(aw==="ogg"){ap+='<source type="audio/ogg" src="'+ao+'" />'}else{if(aw==="mp3"){ap+='<source type="audio/mpeg" src="'+ao+'" />';au+='type="audio/mpeg" src="'+ao+'"></audio>'}}}ap+="</audio>";if(c.browser.safari){z.append(au)}else{z.append(innerShiv(ap))}U(400,110,ak)}else{if(ai==="video"){if(ah.eq(0).text().indexOf("youtube")!==-1){var av=ah.eq(0).text().split("v=")[1],am='<iframe width="600" height="338" src="http://www.youtube.com/embed/'+av+'?hd=1" frameborder="0" allowfullscreen></iframe>';z.append(am)}else{if(ah.eq(0).text().indexOf("vimeo")!==-1){var av=ah.eq(0).text().split("/").pop(),am='<iframe src="http://player.vimeo.com/video/'+av+'" width="600" height="338" frameborder="0"></iframe>';z.append(am)}else{var am='<video controls preload="auto" width="600" height="338">',ar='<video controls preload="auto" width="600" height="338"';for(var aq=0,at=ah.length;aq<at;aq++){var ao=ah.eq(aq).text(),aw=ao.split(".").pop();if(aw==="mp4"){am+='<source type="video/mp4" src="'+ao+'" />';ar+='type="video/mp4" src="'+ao+'"></video>'}else{if(aw==="webm"){am+='<source type="video/webm" src="'+ao+'" />'}else{if(aw==="ogv"){am+='<source type="video/ogg" src="'+ao+'" />'}}}}am+="</video>";if(c.browser.safari){z.append(ar)}else{z.append(innerShiv(am))}}}U(600,418,ak)}}}})}function U(ah,ak,al){var aj=-(ak+40)/2,ai=-(ah+40)/2;x.hide();W.css({width:ah,height:ak,top:al,marginTop:aj,marginLeft:ai}).slideDown(600,function(){z.fadeIn(400).find("audio,video").mediaelementplayer({success:function(am,an){if(a){T=am;IE7.recalc()}}})})}I.click(function(){z.fadeOut(400,function(){W.slideUp(600,function(){if(T){T.pause();T=""}z.children().not("div.details").remove();m.fadeOut(400)})})});function y(ai){var al=P.width()-120,aj=P.height()-200,ak=al/aj,ah=ai.width/ai.height;if(ai.width>al||ai.height>aj){if(ah===ak){ai.width=al;ai.height=aj}else{ai.width=aj*ah;ai.height=aj;if(ai.width>al){ai.width=al;ai.height=al/ah}}}}}});function getRGB(c){var e,d,a;if(c.indexOf("#")===0){if(c.length===4){e=c.substring(1,4).substring(0,1);e=parseInt(e+e,16);d=c.substring(1,4).substring(1,2);d=parseInt(d+d,16);a=c.substring(1,4).substring(2,3);a=parseInt(a+a,16)}else{e=parseInt(c.substring(1,7).substring(0,2),16);d=parseInt(c.substring(1,7).substring(2,4),16);a=parseInt(c.substring(1,7).substring(4,6),16)}}else{if(c.indexOf("rgb")===0){e=c.split("(")[1].split(",")[0];d=c.split("(")[1].split(",")[1];a=c.split("(")[1].split(",")[2].split(")")[0]}}return{r:e,g:d,b:a}}function Plane(c,l,e,n,g,p,i){this.width=c;this.height=l;this.focalLength=e;this.ctx=n;this.color=g;this.rotation={x:0,y:0,z:0,parent:this};this.position={x:0,y:0,z:0};var d=this.ctx.canvas,f=d.width,k=d.height,o=f/2,m=k/2;var b=[make3DPoint(-this.width/2,this.height/2,0),make3DPoint(this.width/2,this.height/2,0),make3DPoint(this.width/2,-this.height/2,0),make3DPoint(-this.width/2,-this.height/2,0)];var j=document.createElement("canvas").getContext("2d");j.canvas.width=this.width;j.canvas.height=this.height;j.drawImage(i,0,0,i.width,i.height,0,0,i.width,i.height);j.save();j.restore();j.scale(1,-1);j.translate(0,-i.height);j.drawImage(i,0,0,i.width,i.height,0,-i.height,i.width,i.height);j.restore();j.scale(1,-1);var h=0.5*i.height,a=j.createLinearGradient(0,0,0,h);a.addColorStop(0,"rgba("+p.r+","+p.g+","+p.b+", 0.5)");a.addColorStop(1,"rgba("+p.r+","+p.g+","+p.b+", 1.0)");j.fillStyle=a;j.rect(0,0,i.width,h);j.fill();this.render=function(){var r=Transform3DTo2D(b,this.rotation,this.position,this.focalLength,o,m);d.width=1;d.width=f;var q=[r[0],r[1],r[3],r[2]];mapTexture(n,q,j.canvas);this.maxwidth=r[1].x-r[0].x;this.maxoffset=Math.abs((r[0].x-0)-(f-r[1].x))}}function make3DPoint(a,c,b){return{x:a,y:c,z:b}}function make2DPoint(a,b){return{x:a,y:b}}function Transform3DTo2D(w,j,D,h,u,t){var k=[],A=Math.sin,a=Math.cos,r=A(j.x),e=a(j.x),p=A(j.y),d=a(j.y),o=A(j.z),b=a(j.z),n,m,l,g,f,s,q,C,B,c;var v=w.length;while(v--){n=w[v].x;m=w[v].y;l=w[v].z;g=e*m-r*l;f=r*m+e*l;q=d*f+p*n;s=-p*f+d*n;C=b*s-o*g;B=o*s+b*g;n=C+D.x;m=B+D.y;l=q+D.z;c=h/(h+l);n=n*c+u;m=-(m*c)+t;k[v]=make2DPoint(n,m)}return k};


/*
 * Projective texturing using Canvas.
 * (c) Steven Wittens 2008
 * http://www.acko.net/
 */
 
/*
 * Modified by Nilok Bose, (c) 2011   
 * http://codecanyon.net/user/cosmocoder
 */
 
function mapTexture(j,i,e){var h=3,g=28,b=getProjectiveTransform(i);var d=b.transformProjectiveVector([0,0,1]),a=b.transformProjectiveVector([1,0,1]),f=b.transformProjectiveVector([0,1,1]),c=b.transformProjectiveVector([1,1,1]);j.save();j.beginPath();j.moveTo(d[0],d[1]);j.lineTo(a[0],a[1]);j.lineTo(c[0],c[1]);j.lineTo(f[0],f[1]);j.closePath();j.clip();divide(0,0,1,1,d,a,f,c,b,h,g,j,e);j.restore()}function divide(o,W,m,V,U,T,S,Q,x,u,l,s,h){var C=Math.abs,B=Math.max,g=Math.min,q=Math.sqrt;if(u){var M=[T[0]+S[0]-2*U[0],T[1]+S[1]-2*U[1]],K=[T[0]+S[0]-2*Q[0],T[1]+S[1]-2*Q[1]],I=[M[0]+K[0],M[1]+K[1]],E=C((I[0]*I[0]+I[1]*I[1])/(M[0]*K[0]+M[1]*K[1]));M=[T[0]-U[0]+Q[0]-S[0],T[1]-U[1]+Q[1]-S[1]];K=[S[0]-U[0]+Q[0]-T[0],S[1]-U[1]+Q[1]-T[1]];var A=C(M[0]*K[1]-M[1]*K[0]);if((o===0&&m===1)||((0.25+E*5)*A>(l*l))){var c=(o+m)/2,w=(W+V)/2,a=x.transformProjectiveVector([c,w,1]),i=x.transformProjectiveVector([c,W,1]),t=x.transformProjectiveVector([c,V,1]),p=x.transformProjectiveVector([o,w,1]),j=x.transformProjectiveVector([m,w,1]);--u;divide(o,W,c,w,U,i,p,a,x,u,l,s,h);divide(c,W,m,w,i,T,a,j,x,u,l,s,h);divide(o,w,c,V,p,a,S,t,x,u,l,s,h);divide(c,w,m,V,a,j,t,Q,x,u,l,s,h);return}}s.save();s.beginPath();s.moveTo(U[0],U[1]);s.lineTo(T[0],T[1]);s.lineTo(Q[0],Q[1]);s.lineTo(S[0],S[1]);s.closePath();var P=[T[0]-U[0],T[1]-U[1]],y=[Q[0]-T[0],Q[1]-T[1]],R=[S[0]-Q[0],S[1]-Q[1]],k=[U[0]-S[0],U[1]-S[1]];var H=C(P[0]*k[1]-P[1]*k[0]),G=C(y[0]*P[1]-y[1]*P[0]),D=C(R[0]*y[1]-R[1]*y[0]),F=C(k[0]*R[1]-k[1]*R[0]),n=B(B(H,G),B(F,D)),d=0,b=0,L=0,J=0;switch(n){case H:s.transform(P[0],P[1],-k[0],-k[1],U[0],U[1]);if(m!==1){L=1.05/q(P[0]*P[0]+P[1]*P[1])}if(V!==1){J=1.05/q(k[0]*k[0]+k[1]*k[1])}break;case G:s.transform(P[0],P[1],y[0],y[1],T[0],T[1]);if(m!==1){L=1.05/q(P[0]*P[0]+P[1]*P[1])}if(V!==1){J=1.05/q(y[0]*y[0]+y[1]*y[1])}d=-1;break;case D:s.transform(-R[0],-R[1],y[0],y[1],Q[0],Q[1]);if(m!==1){L=1.05/q(R[0]*R[0]+R[1]*R[1])}if(V!==1){J=1.05/q(y[0]*y[0]+y[1]*y[1])}d=-1;b=-1;break;case F:s.transform(-R[0],-R[1],-k[0],-k[1],S[0],S[1]);if(m!==1){L=1.05/q(R[0]*R[0]+R[1]*R[1])}if(V!==1){J=1.05/q(k[0]*k[0]+k[1]*k[1])}b=-1;break}var f=(m-o),e=(V-W),O=L*f,N=J*e;var v=h.width,z=h.height;s.drawImage(h,o*v,W*z,g(m-o+O,1)*v,g(V-W+N,1)*z,d,b,1+L,1+J);s.restore()}function getProjectiveTransform(b){var c=new Matrix(9,8,[[1,1,1,0,0,0,-b[3].x,-b[3].x,-b[3].x],[0,1,1,0,0,0,0,-b[2].x,-b[2].x],[1,0,1,0,0,0,-b[1].x,0,-b[1].x],[0,0,1,0,0,0,0,0,-b[0].x],[0,0,0,-1,-1,-1,b[3].y,b[3].y,b[3].y],[0,0,0,0,-1,-1,0,b[2].y,b[2].y],[0,0,0,-1,0,-1,b[1].y,0,b[1].y],[0,0,0,0,0,-1,0,0,b[0].y]]);var d=c.rowEchelon().values;var a=new Matrix(3,3,[[-d[0][8],-d[1][8],-d[2][8]],[-d[3][8],-d[4][8],-d[5][8]],[-d[6][8],-d[7][8],1]]);return a};


/* 
 * Generic matrix class.
 * (c) Steven Wittens 2008
 * http://www.acko.net/
 */
 
/*
 * Modified by Nilok Bose, (c) 2011  
 * http://codecanyon.net/user/cosmocoder
 */
 
var Matrix=function(a,c,b){this.w=a;this.h=c;this.values=b||Matrix.allocate(c)};Matrix.allocate=function(a,e){var b=[],d=e,c=a;while(d--){b[d]=[];while(c--){b[d][c]=0}}return b};Matrix.cloneValues=function(b){clone=[];for(var c=0,a=b.length;c<a;++c){clone[c]=[].concat(b[c])}return clone};Matrix.prototype.transformProjectiveVector=function(b){var c=[];for(var e=0;e<this.h;++e){c[e]=0;for(var a=0;a<this.w;++a){c[e]+=this.values[e][a]*b[a]}}var d=1/(c[c.length-1]);for(var e=0;e<this.h;++e){c[e]*=d}return c};Matrix.prototype.rowEchelon=function(){if(this.w<=this.h){throw"Matrix rowEchelon size mismatch"}var h=Matrix.cloneValues(this.values);for(var a=0;a<this.h;++a){var f=h[a][a];while(f==0){for(var g=a+1;g<this.h;++g){if(h[g][a]!=0){var i=h[g];h[g]=h[a];h[a]=i;break}}if(g==this.h){return new Matrix(this.w,this.h,h)}else{f=h[a][a]}}var b=1/f;for(var e=a;e<this.w;++e){h[a][e]*=b}for(var d=0;d<this.h;++d){if(d==a){continue}var c=h[d][a];h[d][a]=0;for(var e=a+1;e<this.w;++e){h[d][e]-=c*h[a][e]}}}return new Matrix(this.w,this.h,h)};
