/* CCGallery - HTML5 Multimedia Gallery - 1.4
 * Copyright 2011, Nilok Bose  
 * http://codecanyon.net/user/cosmocoder
*/

jQuery(function(c){var m=c("#ccgallery"),i=c("#thumbGallery"),j=c("#thumbGallery").find("ul"),h=c("#itemList"),d=c("#coverContainer"),g=c.browser.msie?true:false,a=g&&c.browser.version<9&&IE7.recalc?true:false,l="config.xml",e=m.data("autoplay")===true?true:false;if(m.data("mobile")===true){c.ajax({type:"GET",url:"includes/mobile.php",dataType:"text",success:function(n){if(n==="true"){l="config-mobile.xml";f()}}})}else{f()}function f(){c.ajax({type:"GET",url:l,dataType:"xml",success:function(n){k(c(n))}})}function k(z){var n=z.find("file"),s=n.find("cover"),r=n.find("thumb"),q=n.find("title"),v=n.find("description"),y=n.length,p=0;var u="",B="",A="";for(var t=0;t<y;t++){var x=n.eq(t).find("category"),w='{"category": false}';if(x.length!==0){w="{";x.each(function(){w+='"'+c(this).text()+'": true,'});w=w.substr(0,w.length-1);w+="}"}u+='<li data-id="'+(t+1)+'" data-type="'+n.eq(t).attr("type")+"\" data-categories='"+w+"'>";u+='<img src="'+r.eq(t).text()+'" alt="" />';u+='<div class="details">';u+="<h2>"+q.eq(t).text()+"</h2>";u+='<p class="description">'+v.eq(t).text()+"</p>";u+="</div>";u+="</li>";B+='<img src="'+s.eq(t).text()+'" alt="" />';A+='<li data-id="'+(t+1)+'" data-type="'+n.eq(t).attr("type")+"\" data-categories='"+w+"'>";A+="<h2>"+q.eq(t).text()+"</h2>";A+='<p class="description">'+v.eq(t).text()+"</p>";A+="</li>"}j.html(u);d.html(B);h.html(A);if(a){h.delegate("li","mouseleave click",function(C){c(this).removeClass("ie7_class7")});j.delegate("li","mouseleave",function(C){c(this).removeClass("ie7_class4")})}var o;if(c("#gocoverflow").hasClass("active")){o="coverflow"}else{o="thumbnails";if(g){m.find("section").css({position:"absolute",top:"0",left:"0"});c("#coverflowGallery").css({display:"block",opacity:"0"})}}m.find("img").load(function(){p++;if(p===2*y){m.css({height:"auto",background:"none"});if(o==="coverflow"){d.parent().fadeIn(600)}else{i.fadeIn(600);if(g){m.find("section").css("position","static");c("#coverflowGallery").css({display:"none",opacity:"1"})}}b(y,n)}})}function b(t,r){var N=j.clone(),G=h.clone(),K=100;if(g&&c.browser.version==9){var u=c('<div id="olfix"/>').insertAfter(h)}m.find("menu").delegate("a.navbuttons","click",function(){var ao=c(this),ak=ao.index("a.navbuttons"),ap=c("section.displayStyle"),al=ao.data("type"),am=ao.data("category");ao.addClass("active").siblings().removeClass("active");if(ao.parent().is("#sortButtons")){var aj,an;if(al){if(al==="all"){aj=N.find("li");an=G.find("li")}else{aj=N.find("li[data-type="+al+"]");an=G.find("li[data-type="+al+"]")}}else{if(am){aj=N.find("li").filter(function(){if(am in c(this).data("categories")){return true}});an=G.find("li").filter(function(){if(am in c(this).data("categories")){return true}})}}j.quicksand(aj,{duration:K,adjustHeight:"dynamic",useScaling:false},function(){j.css("height","auto");if(a){IE7.recalc()}});h.quicksand(an,{duration:K,adjustHeight:"dynamic",useScaling:false},function(){h.css("height","auto");P();if(a){IE7.recalc()}if(u){u[0].innerHTML=" "}})}else{if(ap.eq(ak).is(":visible")){return false}else{ap.filter(":visible").fadeOut(600,function(){ap.eq(ak).fadeIn(600)})}}});c("#sortButtons").find("a.active").not('[data-type="all"]').trigger("click");K=800;j.delegate("img","click",function(){var al=c(this).parent(),ak=al.data("type"),aj=r.eq(al.data("id")-1).find("source");Z(ak,aj,al.find("h2")[0].innerHTML,al.find("p")[0].innerHTML)});var ag=d.find("img"),Q=c('<div class="cwrapper"/>').appendTo(d).hide(),M=c('<canvas class="fade"/>').appendTo(d),D=c('<p id="coverTitle"/>').appendTo(d).css("z-index",2*t),o=d.width(),p=0,I,U=t%2===0?t/2-1:(t+1)/2-1,af=getRGB(c("body").css("background-color")),X,s=document.createElement("canvas").getContext?true:false;for(var ac=0;ac<t;ac++){if(p<ag.eq(ac)[0].height){p=ag.eq(ac)[0].height;I=p}}if(s){p=1.5*p;d.height(p)}else{d.height(p+20)}var L=[],v=[],ae=[],C=[],q=[],x=[],E=[],S=[],aa=ag[U].width;function ab(){if(s){for(var ak=0;ak<t;ak++){var ao,an,al,am,aj=h.find("li").eq(ak).data("id")-1;ae[ak]=ag[aj].width;C[ak]=ag[aj].height;L[ak]=c('<canvas class="cover"/>').appendTo(Q).data("index",ak);v[ak]=L[ak][0].getContext("2d");L[ak][0].width=ae[ak];L[ak][0].height=1.5*C[ak];q[ak]=new Plane(ae[ak],1.5*C[ak],300,v[ak],"#666",af,ag[aj]);if(ak<U){ao=ak;q[ak].rotation.y=Math.PI/4;q[ak].position.z=100;q[ak].render();x[ak]=q[ak].maxwidth;E[ak]=q[ak].maxoffset;al=x[ak];an=o/2-L[ak][0].width/2-aa/2-x[ak]/2+(ak-U+1)*40+E[ak]/2;am=o/2-al/2-aa/2-al/2+(ak-U+1)*40}else{if(ak>U){ao=t-1-ak;q[ak].rotation.y=-Math.PI/4;q[ak].position.z=100;q[ak].render();x[ak]=q[ak].maxwidth;E[ak]=q[ak].maxoffset;al=x[ak];an=o/2-L[ak][0].width/2+aa/2+x[ak]/2+(ak-U-1)*40-E[ak]/2;am=o/2+aa/2+(ak-U-1)*40}else{if(ak===U){ao=ak;an=o/2-aa/2;q[ak].rotation.y=Math.PI/4;q[ak].position.z=100;q[ak].render();x[ak]=q[ak].maxwidth;E[ak]=q[ak].maxoffset;q[ak].rotation.y=0;q[ak].position.z=0;q[ak].render();al=ae[ak];am=o/2-al/2}}}L[ak].css({zIndex:ao,left:an,top:I-C[ak],bottom:"auto"});S[ak]=c('<a class="coverclick"/>').appendTo(d).data("index",ak);S[ak].css({left:am,top:I-C[ak],bottom:"auto",zIndex:t+2+ao,width:al,height:L[ak][0].height})}}else{for(var ak=0;ak<t;ak++){var an,ao,aj=h.find("li").eq(ak).data("id")-1;ae[ak]=ag.eq(aj)[0].width;C[ak]=ag.eq(aj)[0].height;L[ak]=c('<div class="cover"/>').appendTo(Q).data("index",ak).append(ag.eq(aj).clone());x[ak]=Math.round(0.7*ae[ak]);if(ak<U){an=o/2-aa/2-x[ak]+(ak-U)*40;ao=ak;L[ak].width(x[ak]);L[ak].height(Math.round(x[ak]*C[ak]/ae[ak]))}else{if(ak>U){an=o/2+aa/2+(ak-U)*40;ao=t-1-ak;L[ak].width(x[ak]);L[ak].height(Math.round(x[ak]*C[ak]/ae[ak]))}else{if(ak===U){an=o/2-aa/2;ao=ak;L[ak].width(ae[ak]);L[ak].height(C[ak])}}}L[ak].css({left:an,zIndex:ao});S[ak]=c('<a class="coverclick"/>').appendTo(d).data("index",ak);S[ak].css({left:an,bottom:0,top:"auto",zIndex:t+2+ao,width:L[ak].width(),height:L[ak].height()})}Q.height(p);D.css("bottom","0px")}}ab();if(s){M.css({position:"absolute",bottom:"0",left:"0",zIndex:t+1});M[0].width=o;M[0].height=p;var B=M[0].getContext("2d"),ad=B.createLinearGradient(0,0,o,0);ad.addColorStop(0,"rgba("+af.r+","+af.g+","+af.b+", 1.0)");ad.addColorStop(0.35,"rgba("+af.r+","+af.g+","+af.b+", 0.0)");ad.addColorStop(0.65,"rgba("+af.r+","+af.g+","+af.b+", 0.0)");ad.addColorStop(1,"rgba("+af.r+","+af.g+","+af.b+", 1.0)");B.fillStyle=ad;B.rect(0,0,o,p);B.fill()}ag.hide();Q.fadeIn(600);h.find("li").eq(U).addClass("active");X=h.find("li").eq(U).data("id");S[U].addClass("active");D[0].innerHTML=r.eq(U).find("title").text();var T=c("#scrollbar-track"),ah=T.find(".ui-slider-handle"),H=ah.wrap('<div class="ui-handle-helper-parent"/>').parent();T.slider({animate:true,max:t-1,min:0,value:U,slide:function(aj,ak){O(ak.value)}});H.width(T.width()-ah.width());c("#next").click(function(){T.slider("value",U+1);O(U+1)});c("#prev").click(function(){T.slider("value",U-1);O(U-1)});c(document).keydown(function(ak){var aj=ak.keyCode||ak.charCode;if(aj===39){T.slider("value",U+1);O(U+1)}else{if(aj===37){T.slider("value",U-1);O(U-1)}}});d.delegate("a.coverclick","click",function(){var ak=c(this),aj=ak.data("index");if(ak.hasClass("active")){h.find("li").eq(aj).trigger("click")}else{if(aj!==U){T.slider("value",aj);O(aj)}}});d.mousewheel(function(aj,ak){ak=-Math.round(ak);if(ak!==0){T.slider("value",U+ak);O(U+ak)}});var w=false;d.hover(function(){w=true},function(){w=false});c(window).mousewheel(function(){if(w){return false}});h.delegate("li","click",function(){var ak=c(this),aj=h.find("li").index(ak);if(ak.hasClass("active")){Z(ak.data("type"),r.eq(ak.data("id")-1).find("source"),ak.find("h2")[0].innerHTML,ak.find("p")[0].innerHTML)}else{if(aj!==U){ak.addClass("active").siblings().removeClass("active");T.slider("value",aj);O(aj)}}});function P(){var ak=h.find("li"),aj=ak.filter("[data-id="+X+"]");if(aj.length===1){ak.removeClass("active");aj.addClass("active")}else{if(aj.length===0){aj=ak.eq(0);aj.addClass("active");X=aj.data("id")}}Q.empty();d.find("a.coverclick").remove();U=ak.index(aj);t=ak.length;aa=ag.eq(X-1)[0].width;ab();M.css("z-index",t+1);S[U].addClass("active");T.slider("option","max",t-1);T.slider("option","value",U);D[0].innerHTML=r.eq(X-1).find("title").text()}function O(aq){if(aq>=0&&aq<t){var aj=aq>U?"next":"prev",ak=t;X=h.find("li").removeClass("active").eq(aq).addClass("active").data("id");S[U].removeClass("active");S[aq].addClass("active");D[0].innerHTML=r.eq(X-1).find("title").text();if(s){while(ak--){var ap,ao,am,an;if(ak<aq){ap=ak;ao=o/2-L[ak][0].width/2-ae[aq]/2-x[ak]/2+(ak-aq+1)*40+E[ak]/2;am=x[ak];an=o/2-am/2-ae[aq]/2-am/2+(ak-aq+1)*40}else{if(ak>aq){ap=t-1-ak;ao=o/2-L[ak][0].width/2+ae[aq]/2+x[ak]/2+(ak-aq-1)*40-E[ak]/2;am=x[ak];an=o/2-am/2+ae[aq]/2+am/2+(ak-aq-1)*40}else{if(ak===aq){ap=t;ao=o/2-L[aq][0].width/2;am=ae[aq];an=o/2-am/2}}}L[ak].css("zIndex",ap);S[ak].css({zIndex:t+2+ap,width:am,left:an});L[ak].stop().animate({left:ao},600);if(aj==="next"){if(ak>U&&ak<aq){q[ak].rotation.y=Math.PI/4;q[ak].render()}else{if(ak===aq){c(q[ak].position).stop().animate({z:0},600);c(q[ak].rotation).stop().animate({y:0},{duration:600,step:function(){this.parent.render()}})}else{if(ak===U){c(q[ak].position).stop().animate({z:100},600);c(q[ak].rotation).stop().animate({y:Math.PI/4},{duration:600,step:function(){this.parent.render()}})}}}}else{if(ak>aq&&ak<U){q[ak].rotation.y=-Math.PI/4;q[ak].render()}else{if(ak===U){c(q[ak].position).stop().animate({z:100},600);c(q[ak].rotation).stop().animate({y:-Math.PI/4},{duration:600,step:function(){this.parent.render()}})}else{if(ak===aq){c(q[ak].position).stop().animate({z:0},600);c(q[ak].rotation).stop().animate({y:0},{duration:600,step:function(){this.parent.render()}})}}}}}}else{while(ak--){var ap,ao,am,al;if(ak<aq){ao=o/2-ae[aq]/2-x[ak]+(ak-aq)*40;ap=ak;am=x[ak];al=Math.round(x[ak]*C[ak]/ae[ak])}else{if(ak>aq){ao=o/2+ae[aq]/2+(ak-aq)*40;ap=t-1-ak;am=x[ak];al=Math.round(x[ak]*C[ak]/ae[ak])}else{if(ak===aq){ao=o/2-ae[aq]/2;ap=t;am=ae[ak];al=C[ak]}}}L[ak].css("zIndex",ap);S[ak].css({zIndex:t+2+ap,width:am,height:al,left:ao});L[ak].stop().animate({left:ao,width:am,height:al},600)}}U=aq}}var n=c('<div id="mask"/>').appendTo("body"),y=c('<div id="overlayLoader"/>').appendTo("body"),Y=c('<div id="overlay"/>').appendTo("body"),A=c('<div id="overlayContent"/>').appendTo(Y),J=c('<a id="close"/>').appendTo(Y),V,R=c(window);A.html('<div class="details"><h2></h2><p></p></div>');var ai=A.find("h2"),F=A.find("p");function Z(ak,aj,an,al){ai[0].innerHTML=an;F[0].innerHTML=al;var am=R.scrollTop()+R.height()/2;n.css("height",c(document).height()).fadeIn(400,function(){y.css("top",am).show();if(ak==="photo"){if(g){Y.css({visibility:"hidden",display:"block"});A.css({visibility:"hidden",display:"block"})}var aq=c('<img src="'+aj.text()+'" alt="" />').appendTo(A);aq[0].onload=function(){z(aq[0]);if(g){Y.css({visibility:"visible",display:"none"});A.css({visibility:"visible",display:"none"})}W(aq[0].width,aq[0].height+80,am)}}else{if(ak==="audio"){var at='<audio controls preload="auto">',ay='<audio controls preload="auto"';for(var au=0,aw=aj.length;au<aw;au++){var ar=aj.eq(au).text(),aA=ar.split(".").pop();if(aA==="ogg"){at+='<source type="audio/ogg" src="'+ar+'" />'}else{if(aA==="mp3"){at+='<source type="audio/mpeg" src="'+ar+'" />';ay+='type="audio/mpeg" src="'+ar+'"></audio>'}}}at+="</audio>";if(c.browser.safari){A.append(ay)}else{A.append(innerShiv(at))}W(400,110,am)}else{if(ak==="video"){if(aj.eq(0).text().indexOf("youtube")!==-1){var az=aj.eq(0).text().split("v=")[1],ax=e?"&autoplay=1":"",ap='<iframe width="600" height="338" src="http://www.youtube.com/embed/'+az+"?hd=1&rel=0"+ax+'" frameborder="0" allowfullscreen></iframe>';A.append(ap)}else{if(aj.eq(0).text().indexOf("vimeo")!==-1){var az=aj.eq(0).text().split("/").pop(),ao=e?"&autoplay=1":"",ap='<iframe src="http://player.vimeo.com/video/'+az+"?"+ao+'" width="600" height="338" frameborder="0" webkitAllowFullScreen allowFullScreen></iframe>';A.append(ap)}else{var ap='<video controls preload="auto" width="600" height="338">',av='<video controls preload="auto" width="600" height="338"';for(var au=0,aw=aj.length;au<aw;au++){var ar=aj.eq(au).text(),aA=ar.split(".").pop();if(aA==="mp4"){ap+='<source type="video/mp4" src="'+ar+'" />';av+='type="video/mp4" src="'+ar+'"></video>'}else{if(aA==="webm"){ap+='<source type="video/webm" src="'+ar+'" />'}else{if(aA==="ogv"){ap+='<source type="video/ogg" src="'+ar+'" />'}}}}ap+="</video>";if(c.browser.safari){A.append(av)}else{A.append(innerShiv(ap))}}}W(600,418,am)}}}})}function W(aj,am,an){var al=-(am+40)/2,ak=-(aj+40)/2;y.hide();Y.css({width:aj,height:am,top:an,marginTop:al,marginLeft:ak}).slideDown(600,function(){A.fadeIn(400).find("audio,video").mediaelementplayer({success:function(ao,ap){if(a){V=ao;IE7.recalc()}if(e){ao.play()}}})})}J.click(function(){A.fadeOut(400,function(){Y.slideUp(600,function(){if(V){V.pause();V=""}A.children().not("div.details").remove();n.fadeOut(400)})})});function z(ak){var an=R.width()-120,al=R.height()-200,am=an/al,aj=ak.width/ak.height;if(ak.width>an||ak.height>al){if(aj===am){ak.width=an;ak.height=al}else{ak.width=al*aj;ak.height=al;if(ak.width>an){ak.width=an;ak.height=an/aj}}}}}});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)};
