/* Copyright (c) 2011-2012, Edward Evers All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name(s) Alpha Robotics, Edward Evers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EDWARD EVERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ var System=System||{};System.out=System.out||{};System.out.println=function(message){console.log(message)};System.nanoTime=function(){return 0};var java=java||{};java.applet=java.applet||{};java.awt=java.awt||{};java.lang=java.lang||{};java.io=java.io||{};java.util=java.util||{};java.util.Iterator=function(){this.list=[];var index=-1;this.hasNext=function(){index++;return(index{},])/g,' $1 ');var less5=less4.replace(/[\t\r\n]/g,' ');var less6=less5.replace(/ +/g,' ');var less7=less6.replace(/^\s+/g,'');var tokens=less7.split(' ');var index=-1;this.ttype=java.io.StreamTokenizer.TT_WORD;this.sval='width';this.nval=0;this.wordChars=function(low,hi){};this.slashSlashComments=function(flag){};this.slashStarComments=function(flag){};this.lowerCaseMode=function(flag){};this.eolIsSignificant=function(flag){};this.nextToken=function(){index++;this.sval=tokens[index];this.nval=parseFloat(tokens[index]);if(this.sval){if(isNaN(this.nval)){this.ttype=java.io.StreamTokenizer.TT_WORD}else{this.ttype=java.io.StreamTokenizer.TT_NUMBER}}else{this.ttype=java.io.StreamTokenizer.TT_EOF}return this.ttype};this.pushBack=function(){index--};this.lineno=function(){return 0}};java.io.StreamTokenizer.TT_EOF=-1;java.io.StreamTokenizer.TT_EOL=10;java.io.StreamTokenizer.TT_NUMBER=-2;java.io.StreamTokenizer.TT_WORD=-3;java.lang.globals=java.lang.globals||{};java.lang.globals._currentThread=null;java.lang.Thread=function(runnable){java.lang.globals._currentThread=this;var _running=false;var _interval=500;var runner=function(){_running=runnable.runOnTimer();if(_running){setTimeout(runner,_interval)}};this.isAlive=function(){return(_running)};this.start=function(){_running=true;runnable.run();_running=false};this.startTimer=function(){_running=true;setTimeout(runner,_interval)};this.setInterval=function(value){_interval=value}};java.lang.Thread.currentThread=function(){return java.lang.globals._currentThread};java.awt.Graphics=function(parentId){var _canvas=null;if(parentId){_canvas=document.getElementById(parentId)}else{_canvas=document.createElement("canvas")}var _context=_canvas.getContext("2d");var _imageData=_context.createImageData(_canvas.width,_canvas.height);this.setColor=function(color){_context.fillStyle=color.getRGBString();_context.strokeStyle=color.getRGBString()};this.clearRect=function(x,y,w,h){_context.clearRect(x,y,w,h)};this.fillRect=function(x,y,w,h){_context.fillRect(x,y,w,h)};this.fillPolygon=function(arrayX,arrayY,k){_context.beginPath();_context.moveTo(arrayX[0],arrayY[0]);for(var i=1;i0)){if(doLogging){console.log('Touch count :'+event.targetTouches.length)}if(event.targetTouches.length>1){for(var i in event.targetTouches){var touch=event.targetTouches[i];var target=touch.target;if(target){if(doLogging){console.log(target.id+': touch index '+i)}if(target.id==element.id){pointEvent=touch}}}}else{var touch0=event.targetTouches[0];pointEvent=touch0}}else{if(doLogging){console.log('mouse event')}pointEvent=event}return pointEvent}function getTotalOffsetLeft(element){var result=0;if(element){result=element.offsetLeft;if(element.offsetParent!==document.body){result+=getTotalOffsetLeft(element.offsetParent)}}return result}function getTotalOffsetTop(element){var result=0;if(element){result=element.offsetTop;if(element.offsetParent!==document.body){result+=getTotalOffsetTop(element.offsetParent)}}return result}function MousePosition(event,element){this.documentX=(event.pageX);this.documentY=(event.pageY);this.x=(this.documentX-getTotalOffsetLeft(element));this.y=(this.documentY-getTotalOffsetTop(element))}java.awt.Component=function(canvasId){var _graphics=new java.awt.Graphics(canvasId);var _this=this;var _dragging=false;var _lastDownTarget=null;var mousedown=function(event){event.preventDefault();var pointEvent=getPointEvent(event,_graphics.getCanvas(),false);if(pointEvent){_dragging=true;var click=new MousePosition(pointEvent,_graphics.getCanvas());if(_this.mouseUp){_this.mouseDown(new java.awt.Event(event),click.x,click.y)}}return true};var mousemove=function(event){event.preventDefault();var pointEvent=getPointEvent(event,_graphics.getCanvas(),false);if(pointEvent){if(_dragging){var click=new MousePosition(pointEvent,_graphics.getCanvas());if(_this.mouseUp){_this.mouseDrag(new java.awt.Event(event),click.x,click.y)}}}return true};var mouseup=function(event){event.preventDefault();var pointEvent=getPointEvent(event,_graphics.getCanvas(),false);if(pointEvent){var click=new MousePosition(pointEvent,_graphics.getCanvas());if(_this.mouseUp){_this.mouseUp(new java.awt.Event(event),click.x,click.y)}}_dragging=false;return true};_graphics.getCanvas().addEventListener("mousedown",mousedown,false);_graphics.getCanvas().addEventListener("mousemove",mousemove,false);_graphics.getCanvas().addEventListener("mouseup",mouseup,false);_graphics.getCanvas().addEventListener("touchstart",function(){return mousedown(event)},false);_graphics.getCanvas().addEventListener("touchmove",function(){var pointEvent=getPointEvent(event,_graphics.getCanvas(),false);return mousemove(event)},false);_graphics.getCanvas().addEventListener("touchend",function(){return mouseup(event)},false);var documentmousedown=function(event){_lastDownTarget=event.target};var documentmousemove=function(event){var pointEvent=getPointEvent(event,_graphics.getCanvas(),false);if(pointEvent){if(_dragging){var click=new MousePosition(pointEvent,_graphics.getCanvas());if(_this.mouseUp){_this.mouseDrag(new java.awt.Event(event),click.x,click.y)}}}};var documentmouseup=function(event){var pointEvent=getPointEvent(event,_graphics.getCanvas(),false);if(pointEvent){var click=new MousePosition(pointEvent,_graphics.getCanvas());if(_this.mouseUp){_this.mouseUp(new java.awt.Event(event),click.x,click.y)}}_dragging=false};document.addEventListener("mousedown",documentmousedown,false);document.addEventListener("mousemove",documentmousemove,false);document.addEventListener("mouseup",documentmouseup,false);document.addEventListener("touchstart",documentmousedown,false);document.addEventListener("touchend",documentmouseup,false);this.keypress_listener=function(event){if(_lastDownTarget==_graphics.getCanvas()){event.preventDefault();if(_this.keyDown){_this.keyDown(new java.awt.Event(event),String.fromCharCode(event.charCode))}}};document.addEventListener("keypress",this.keypress_listener,false);this.keydown_listener=function(event){if(_lastDownTarget==_graphics.getCanvas()){if(event.key){switch(event.key){case"F1":case"F2":case"F3":case"F4":case"F5":case"F6":case"F7":case"F8":case"F9":case"ArrowLeft":case"ArrowUp":case"ArrowRight":case"ArrowDown":event.preventDefault();if(_this.keyDown){_this.keyDown(new java.awt.Event(event),event.keyCode)}break;default:break}}else if(event.keyIdentifier){switch(event.keyIdentifier){case"F1":case"F2":case"F3":case"F4":case"F5":case"F6":case"F7":case"F8":case"F9":case"Left":case"Up":case"Right":case"Down":event.preventDefault();if(_this.keyDown){_this.keyDown(new java.awt.Event(event),event.keyCode)}break;default:break}}}};document.addEventListener("keydown",this.keydown_listener,false);this.removeEventListeners=function(){document.removeEventListener("mousedown",documentmousedown);document.removeEventListener("mousemove",mousemove);document.removeEventListener("mouseup",mouseup);document.removeEventListener("touchstart",documentmousedown);document.removeEventListener("touchend",documentmouseup);document.removeEventListener("keypress",this.keypress_listener);document.removeEventListener("keydown",this.keydown_listener)};this.createImage=function(width,height){return new java.awt.Image(width,height)};this.resize=function(width,height){_graphics.setSize(width,height)};this.setSize=function(width,height){_graphics.setSize(width,height)};this.repaint=function(){this.paint(_graphics)};this.paint=function(g){};this.add=function(comp){};this.getHeight=function(){_canvas=_graphics.getCanvas();return _canvas.height};this.getWidth=function(){_canvas=_graphics.getCanvas();return _canvas.width};this.setBounds=function(x,y,width,height){_graphics.setSize(width,height)};this.getSize=function(){_canvas=_graphics.getCanvas();return{width:_canvas.width,height:_canvas.height}};this.getParent=function(){return _this};this.requestFocusInWindow=function(){};this.getGraphics=function(){return _graphics}};java.awt.Container=function(canvasId){this.inheritsFrom=java.awt.Component;this.inheritsFrom(canvasId);var self=this;return self};java.awt.Window=function(canvasId){this.inheritsFrom=java.awt.Container;this.inheritsFrom(canvasId);this.setVisible=function(b){};var self=this;return self};java.awt.Frame=function(canvasId){this.inheritsFrom=java.awt.Window;this.inheritsFrom(canvasId);this.setTitle=function(title){};var self=this;return self};var javax=javax||{};javax.imageio=javax.imageio||{};javax.imageio.ImageIO=javax.imageio.ImageIO||{};javax.swing=javax.swing||{};javax.swing.text=javax.swing.text||{};javax.imageio.ImageIO.read=function(filename,callback){var img=new Image();img.onload=function(){callback(img)};img.src=filename};javax.swing.JScrollPane=function(canvasId){this.inheritsFrom=java.awt.Component;this.inheritsFrom(canvasId);this.setVisible=function(aFlag){};var self=this;return self};javax.swing.text.JTextComponent=function(canvasId){this.inheritsFrom=java.awt.Component;this.inheritsFrom(canvasId);this.setText=function(t){};var self=this;return self};javax.swing.JTextArea=function(canvasId){this.inheritsFrom=javax.swing.text.JTextComponent;this.inheritsFrom(canvasId);this.setFocusable=function(focusable){};this.setForeground=function(c){};this.setBackground=function(c){};this.setFont=function(f){};this.append=function(str){console.log(str)};var self=this;return self};java.applet.Applet=function(canvasId){var _parameters={};this.inheritsFrom=java.awt.Frame;this.inheritsFrom(canvasId);this.setParameter=function(param,value){_parameters[param]=value};this.getParameter=function(param){return _parameters[param]};this.stop=function(){this.removeEventListeners()}};java.awt.Font=function(){};java.awt.Font.BOLD=1;java.awt.Font.CENTER_BASELINE=1;java.awt.Font.DIALOG="Dialog";java.awt.Font.DIALOG_INPUT="DialogInput";java.awt.Font.HANGING_BASELINE=2;java.awt.Font.ITALIC=2;java.awt.Font.LAYOUT_LEFT_TO_RIGHT=0;java.awt.Font.LAYOUT_NO_LIMIT_CONTEXT=4;java.awt.Font.LAYOUT_NO_START_CONTEXT=2;java.awt.Font.LAYOUT_RIGHT_TO_LEFT=1;java.awt.Font.MONOSPACED="Monospaced";java.awt.Font.PLAIN=0;java.awt.Font.ROMAN_BASELINE=0;java.awt.Font.SANS_SERIF="SansSerif";java.awt.Font.SERIF="Serif";java.awt.Font.TRUETYPE_FONT=0;java.awt.Font.TYPE1_FONT=1;java.awt.Color=function(r,g,b){this.getRed=function(){return r};this.getGreen=function(){return g};this.getBlue=function(){return b};this.getRGBString=function(){return"rgb("+r+","+g+","+b+")"}};java.awt.Color.HTMLtoRGB=function(html,vals){function hexToR(h){return parseInt((cutHex(h)).substring(0,2),16)}function hexToG(h){return parseInt((cutHex(h)).substring(2,4),16)}function hexToB(h){return parseInt((cutHex(h)).substring(4,6),16)}function cutHex(h){return(h.charAt(0)=="#")?h.substring(1,7):h}vals[0]=hexToR(html);vals[1]=hexToG(html);vals[2]=hexToB(html)};java.awt.Color.RGBtoHSB=function(r,g,b,vals){var min=Math.min(r,g,b),max=Math.max(r,g,b),delta=max-min,h,s,v=max;v=Math.floor(max/255*100);if(max!==0){s=Math.floor(delta/max*100)}else{vals[0]=0;vals[1]=0;vals[2]=0;return}if(r==max){h=(delta===0)?(0):((g-b)/delta); }else if(g==max){h=(delta===0)?(0):(2+(b-r)/delta); }else{h=(delta===0)?(0):(4+(r-g)/delta); }h=Math.floor(h*60);if(h<0){h+=360}vals[0]=h/360;vals[1]=s/100;vals[2]=v/100};java.awt.Color.HTMLtoHSB=function(html,vals){var temp=[];java.awt.Color.HTMLtoRGB(html,temp);java.awt.Color.RGBtoHSB(temp[0],temp[1],temp[2],vals)};java.awt.Color.getHSBColor=function(h,s,v){var r;var g;var b;var i;var f;var p;var q;var t;if(h&&s===undefined&&v===undefined){s=h.s;v=h.v;h=h.h}i=Math.floor(h*6);f=h*6-i;p=v*(1-s);q=v*(1-f*s);t=v*(1-(1-f)*s);switch(i%6){case 0:r=v;g=t;b=p;break;case 1:r=q;g=v;b=p;break;case 2:r=p;g=v;b=t;break;case 3:r=p;g=q;b=v;break;case 4:r=t;g=p;b=v;break;case 5:r=v;g=p;b=q;break;default:break}return new java.awt.Color(Math.floor(r*255),Math.floor(g*255),Math.floor(b*255))};java.awt.Color.getHTMLColor=function(html){function hexToR(h){return parseInt((cutHex(h)).substring(0,2),16)}function hexToG(h){return parseInt((cutHex(h)).substring(2,4),16)}function hexToB(h){return parseInt((cutHex(h)).substring(4,6),16)}function cutHex(h){return(h.charAt(0)=="#")?h.substring(1,7):h}var r=hexToR(html);var g=hexToG(html);var b=hexToB(html);return new java.awt.Color(r,g,b)};java.awt.Color.blue=new java.awt.Color(0x00,0x00,0xff);java.awt.Color.lightGray=new java.awt.Color(0x80,0x80,0x80);java.awt.Color.black=new java.awt.Color(0x00,0x00,0x00);java.awt.Color.white=new java.awt.Color(0xff,0xff,0xff);java.awt.Color.red=new java.awt.Color(0xff,0x00,0x00);java.awt.Color.green=new java.awt.Color(0x00,0xff,0x00);java.awt.Color.yellow=new java.awt.Color(0xff,0xff,0x00);java.lang.Float=java.lang.Float||{};java.lang.Float.MAX_EXPONENT=127;java.lang.Float.MAX_VALUE=3.4028234663852886E38;java.lang.Float.MIN_EXPONENT=-126;java.lang.Float.MIN_NORMAL=1.1754943508222875E-38;java.lang.Float.MIN_VALUE=1.401298464324817E-45;java.lang.Float.NEGATIVE_INFINITY=-1.0/0.0;java.lang.Float.POSITIVE_INFINITY=1.0/0.0;java.lang.Float.SIZE=32;if(window.java===undefined){alert('java js no loaded.')}function Rubik(canvasId){this.inheritsFrom=java.applet.Applet;this.inheritsFrom(canvasId);var _this=this;var actionlist=null;var animation=null;var threadSuspended=false;var painting=false;var stepsperturn=16;var d_phi=(((3.14)/2)/stepsperturn);var turnstep=0;var twistcount=0;var twistspeed=1;var scramblelistsize=0;var scramblelist=[];var m=Math;var offGraphics;var offImage;var i,j,k;var n,o,p,q;var rectX=[],rectY=[];var newCoord=[];var n1,n2,n3,n4,o1,o2,o3,o4;var screenwidth=0;var screenheight=0;var MpX=0;var MpY=0;var bgColor=null;var zoomfactor=0;var depthfromscreen=0;var pixelsperunit=0;var scalingfactor=0;var twistfactor=0;var naturalState=true;var twisting=false;var OKtoDrag=false;var credits=false;var inputlocked=false;var solving=false;var animating=false;var FBLRUDmode=false;var showdragregions=false;var showdragline=false;var firstColorcycle=true;var lastX,lastY;var dx,dy;var dz;var cubesperedge=0;var scrambledepth=0;var solvedepth=0;var twistdepth=0;var currenttwistdepth=0;var twistmode=0;var temptwistmode=1;var colList=[];var sideCols=[];var labelmode=0;var dragmode=0;var sideVec=[[0,0,1],[0,0,-1],[0,-1,0],[1,0,0],[0,1,0],[-1,0,0]];var corners=[[-1,-1,-1],[1,-1,-1],[1,1,-1],[-1,1,-1],[-1,-1,1],[1,-1,1],[1,1,1],[-1,1,1]];var labelcorners=[[-1.25,-1.25,-1.25],[1.25,-1.25,-1.25],[1.25,1.25,-1.25],[-1.25,1.25,-1.25],[-1.25,-1.25,1.25],[1.25,-1.25,1.25],[1.25,1.25,1.25],[-1.25,1.25,1.25]];var topCorners=[],midCorners=[],botCorners=[];var sides=[[4,5,6,7],[3,2,1,0],[0,1,5,4],[1,2,6,5],[7,6,2,3],[3,0,4,7]];var nextSide=[[2,3,4,5],[4,3,2,5],[1,3,0,5],[1,4,0,2],[0,3,1,5],[1,2,0,4]];var twistDir=[[-1,1,-1,1],[-1,1,-1,1],[1,1,1,1],[1,-1,1,-1],[1,1,1,1],[1,-1,1,-1]];var OppSide=[1,0,4,5,2,3];var centertwistDirMultiplier=[[0,0,-1,1,1,1],[0,0,1,1,-1,1],[1,-1,0,1,0,1],[1,-1,-1,0,1,0],[-1,1,0,1,0,1],[1,-1,1,0,-1,0]];var colDir=[-1,-1,1,-1,1,-1];var eye=[1,0,0];var eX=[0,1,0];var eY=[0,0,0];var Teye=[0,0,0];var TeX=[0,0,0];var TeY=[0,0,0];var light=[0,0,0];var temp=[0,0,0],temp2=[0,0,0],temp3=[0,0,0],temp4=[0,0,0];var phi,phibase=0,Cphi,Sphi;var outerringshift;var outerringsize;var innerringdelta=[];var innerringside=[];var innerringshift=[];var innerringsize=[];var innerringoffset=[];var circleOrder=[];var buffer=[];var mainBlocks=[];var labelBlocks=[];var topBlocks=[],midBlocks=[],botBlocks=[];var sideW,sideH;var sx,sy,sz,sdxh,sdyh,sdxv,sdyv,sdzh,sdzv,d,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12;var twistSide=-1;var dragReg;var dragCorn=[];var dragDir=[];var currDragDir=[];var nearSide=[];var URFDLBIndex=[];var empty1Array=function(m){var result=[];for(var i=0;i=0;i--){for(j=0;j<10;j++){if(s[i]==h[j]){value+=j*Exponent;break}}Exponent*=10}}else{value=defInt}return value};var hexStringToColor=function(s,defColor){var hex=[];var h="0123456789abcdef";if((s)&&(s!==null)){s=s.replace("#","");if((6==s.length)||(3==s.length)){if(3==s.length){s=s[0]+s[0]+s[1]+s[1]+s[2]+s[2]}}else{s=null}}var c;hex=empty1Array(6);if(((s)&&(s!==null))&&(s.length===6)){s=s.toLowerCase();for(i=0;i<6;i++){for(j=0;j<16;j++){if(s[i]==h[j]){hex[i]=j}}}c=new java.awt.Color(hex[0]*16+hex[1],hex[2]*16+hex[3],hex[4]*16+hex[5])}else{c=defColor}return c};var importColor=function(param,defColor){var hex=[];var s=_this.getParameter(param);return hexStringToColor(s,defColor)};this.getString=function(){var sTemp="stickers={";for(i=0;i<6;i++){sTemp=sTemp+"{";for(j=0;j<(cubesperedge*cubesperedge);j++){sTemp=sTemp+(sideCols[i][j]).toString();if(j<((cubesperedge*cubesperedge)-1)){sTemp=sTemp+","}}sTemp=sTemp+"}";if(i<5){sTemp=sTemp+","}}sTemp=sTemp+"}";return sTemp};var getLinearIndex=function(i,j,n){return i*n+j};var rotateMatrix=function(A,dim){var n=dim;var B=A.slice();if(n<=1){return}for(var i=0;i0){if(scramblelist[twistcount-1][0]==sideNum){if(scramblelist[twistcount-1][1]==currenttwistdepth){if(scramblelist[twistcount-1][3]==twistmode){if((scramblelist[twistcount-1][2]*(multiplier*colDir[sideNum]))<0){twistcount--;scramblelist[twistcount][0]=0;scramblelist[twistcount][1]=0;scramblelist[twistcount][2]=0;scramblelist[twistcount][3]=0;bSkip=true}else if(twistcount>1){if(scramblelist[twistcount-2][0]==sideNum){if(scramblelist[twistcount-2][1]==currenttwistdepth){if(scramblelist[twistcount-2][3]==twistmode){if(scramblelist[twistcount-2][2]==(multiplier*colDir[sideNum])){twistcount--;twistcount--;scramblelist[twistcount][2]*=-1;twistcount++;scramblelist[twistcount][0]=0;scramblelist[twistcount][1]=0;scramblelist[twistcount][2]=0;scramblelist[twistcount][3]=0;bSkip=true}}}}}}}}}if(!bSkip){scramblelist[twistcount][0]=sideNum;scramblelist[twistcount][1]=currenttwistdepth;scramblelist[twistcount][2]=multiplier*colDir[sideNum];scramblelist[twistcount][3]=twistmode;twistcount++;scramblelist[twistcount][0]=0;scramblelist[twistcount][1]=0;scramblelist[twistcount][2]=0;scramblelist[twistcount][3]=0}}}};var removefromscramblelist=function(){if(twistcount>=0){scramblelist[twistcount][0]=0;scramblelist[twistcount][1]=0;scramblelist[twistcount][2]=0}};var createscramblelist=function(commit){temptwistmode=twistmode;twisting=false;naturalState=true;resetscramblelist();for(i=0;i0){temp1*=temp1;if(temp1>temp2){temp2=temp1;sideNum=i}}}}return(sideNum)};var findBack=function(){var sideNum=0;var frontNum=findFront();sideNum=OppSide[frontNum];return(sideNum)};var findRight=function(){var sideNum=0;var temp1=0;var temp2=0;var upNum=findUp();var frontNum=findFront();for(i=0;i<6;i++){if(i!=upNum&&i!=frontNum){temp1=cosAng(eX,sideVec[i]);if(temp1>0){temp1*=temp1;if(temp1>temp2){temp2=temp1;sideNum=i}}}}return(sideNum)};var findLeft=function(){var sideNum=0;var rightNum=findRight();sideNum=OppSide[rightNum];return(sideNum)};var findUp=function(){var sideNum=0;var temp1=0;var temp2=0;for(i=0;i<6;i++){temp1=cosAng(eY,sideVec[i]);if(temp1>0){temp1*=temp1;if(temp1>temp2){temp2=temp1;sideNum=i}}}return(sideNum)};var findDown=function(){var sideNum=0;var upNum=findUp();sideNum=OppSide[upNum];return(sideNum)};var isTurnOK=function(){if(FBLRUDmode){if(naturalState){return true}}return false};this.TurnFrontCW=function(){if(naturalState){var sideNum=findFront();var direction=colDir[sideNum]*(-1);turnSide(sideNum,1,direction,0)}};this.TurnFrontCCW=function(){if(naturalState){var sideNum=findFront();var direction=colDir[sideNum];turnSide(sideNum,1,direction,0)}};this.TurnBackCW=function(){if(naturalState){var sideNum=findBack();var direction=colDir[sideNum]*(-1);turnSide(sideNum,1,direction,0)}};this.TurnBackCCW=function(){if(naturalState){var sideNum=findBack();var direction=colDir[sideNum];turnSide(sideNum,1,direction,0)}};this.TurnLeftCW=function(){if(naturalState){var sideNum=findLeft();var direction=colDir[sideNum]*(-1);turnSide(sideNum,1,direction,0)}};this.TurnLeftCCW=function(){if(naturalState){var sideNum=findLeft();var direction=colDir[sideNum];turnSide(sideNum,1,direction,0)}};this.TurnRightCW=function(){if(naturalState){var sideNum=findRight();var direction=colDir[sideNum]*(-1);turnSide(sideNum,1,direction,0)}};this.TurnRightCCW=function(){if(naturalState){var sideNum=findRight();var direction=colDir[sideNum];turnSide(sideNum,1,direction,0)}};this.TurnUpCW=function(){if(naturalState){var sideNum=findUp();var direction=colDir[sideNum]*(-1);turnSide(sideNum,1,direction,0)}};this.TurnUpCCW=function(){if(naturalState){var sideNum=findUp();var direction=colDir[sideNum];turnSide(sideNum,1,direction,0)}};this.TurnDownCW=function(){if(naturalState){var sideNum=findDown();var direction=colDir[sideNum]*(-1);turnSide(sideNum,1,direction,0)}};this.TurnDownCCW=function(){if(naturalState){var sideNum=findDown();var direction=colDir[sideNum];turnSide(sideNum,1,direction,0)}};this.importActionList=function(sActionList){if((cubesperedge==3)||(cubesperedge==2)){var sTemp;actionlist.reset();while(sActionList.length>0){var firstcomma=sActionList.indexOf(',');if(firstcomma==-1){sTemp=sActionList.substring(0,sActionList.length);sActionList=sActionList.substring(sActionList.length,sActionList.length)}else{sTemp=sActionList.substring(0,firstcomma);sActionList=sActionList.substring(firstcomma+1,sActionList.length)}if(sTemp.length==1){if(sTemp==="F"){var sideNum=findFront();var direction=colDir[sideNum]*(-1);actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="B"){var sideNum=findBack();var direction=colDir[sideNum]*(-1);actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="L"){var sideNum=findLeft();var direction=colDir[sideNum]*(-1);actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="R"){var sideNum=findRight();var direction=colDir[sideNum]*(-1);actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="U"){var sideNum=findUp();var direction=colDir[sideNum]*(-1);actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="D"){var sideNum=findDown();var direction=colDir[sideNum]*(-1);actionlist.addAction(sideNum,1,direction,0)}}if(sTemp.length==2){if(sTemp==="Fi"){var sideNum=findFront();var direction=colDir[sideNum];actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="Bi"){var sideNum=findBack();var direction=colDir[sideNum];actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="Li"){var sideNum=findLeft();var direction=colDir[sideNum];actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="Ri"){var sideNum=findRight();var direction=colDir[sideNum];actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="Ui"){var sideNum=findUp();var direction=colDir[sideNum];actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="Di"){var sideNum=findDown();var direction=colDir[sideNum];actionlist.addAction(sideNum,1,direction,0)}}}}};this.importSolutionActionList=function(sActionList){if((cubesperedge==3)||(cubesperedge==2)){var sTemp;actionlist.reset();while(sActionList.length>0){var firstcomma=sActionList.indexOf(',');if(firstcomma==-1){sTemp=sActionList.substring(0,sActionList.length);sActionList=sActionList.substring(sActionList.length,sActionList.length)}else{sTemp=sActionList.substring(0,firstcomma);sActionList=sActionList.substring(firstcomma+1,sActionList.length)}if(sTemp.length==1){if(sTemp==="F"){var sideNum=RUBIK_FRONT_FACE;var direction=colDir[sideNum]*(-1);actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="B"){var sideNum=RUBIK_BACK_FACE;var direction=colDir[sideNum]*(-1);actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="L"){var sideNum=RUBIK_LEFT_FACE;var direction=colDir[sideNum]*(-1);actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="R"){var sideNum=RUBIK_RIGHT_FACE;var direction=colDir[sideNum]*(-1);actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="U"){var sideNum=RUBIK_UP_FACE;var direction=colDir[sideNum]*(-1);actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="D"){var sideNum=RUBIK_DOWN_FACE;var direction=colDir[sideNum]*(-1);actionlist.addAction(sideNum,1,direction,0)}}if(sTemp.length==2){if(sTemp==="Fi"){var sideNum=RUBIK_FRONT_FACE;var direction=colDir[sideNum];actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="Bi"){var sideNum=RUBIK_BACK_FACE;var direction=colDir[sideNum];actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="Li"){var sideNum=RUBIK_LEFT_FACE;var direction=colDir[sideNum];actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="Ri"){var sideNum=RUBIK_RIGHT_FACE;var direction=colDir[sideNum];actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="Ui"){var sideNum=RUBIK_UP_FACE;var direction=colDir[sideNum];actionlist.addAction(sideNum,1,direction,0)}else if(sTemp==="Di"){var sideNum=RUBIK_DOWN_FACE;var direction=colDir[sideNum];actionlist.addAction(sideNum,1,direction,0)}}}}};this.playActionList=function(){try{if((cubesperedge==3)||(cubesperedge==2)){if(!actionlist.isFinished()){if(naturalState){if(!inputlocked){inputlocked=true;phibase=0;phi=0;temptwistmode=twistmode;if(!startAnimation.apply(this)){inputlocked=false}}}}}}catch(e){}};this.turnFace=function(sFace,depth,mode){this.importActionList(sFace);this.playActionList()};this.keyDown=function(evt,key){if(!inputlocked){if(key=='~'){credits=(credits)?(false):(true);_this.repaint()}else if(key=='u'){if(FBLRUDmode){_this.TurnUpCW()}}else if(key=='U'){if(FBLRUDmode){_this.TurnUpCCW()}}else if(key=='d'){if(FBLRUDmode){_this.TurnDownCW()}}else if(key=='D'){if(FBLRUDmode){_this.TurnDownCCW()}}else if(key=='l'){if(FBLRUDmode){_this.TurnLeftCW()}}else if(key=='L'){if(FBLRUDmode){_this.TurnLeftCCW()}}else if(key=='f'){if(FBLRUDmode){_this.TurnFrontCW()}}else if(key=='F'){if(FBLRUDmode){_this.TurnFrontCCW()}}else if(key=='b'){if(FBLRUDmode){_this.TurnBackCW()}}else if(key=='B'){if(FBLRUDmode){_this.TurnBackCCW()}}else if(key=='e'){if(isTurnOK()){this.restore()}}else if(key=='E'){if(isTurnOK()){this.restoreLive()}}else if(key=='r'){if(FBLRUDmode){_this.TurnRightCW()}else{this.restore()}}else if(key=='R'){if(FBLRUDmode){_this.TurnRightCCW()}else{this.restoreLive()}}else if(key=='s'){this.scramble()}else if(key=='S'){this.scrambleLive()}else if(key=='x'){phibase=0;phi=0;twisting=false;naturalState=true;eye[0]=1;eye[1]=0;eye[2]=0;eX[0]=0;eX[1]=1;eX[2]=0;vecProd(eye,eX,eY);normalize(eY);_this.repaint()}else if(key=='X'){phibase=0;phi=0;twisting=false;naturalState=true;eye[0]=-1;eye[1]=0;eye[2]=0;eX[0]=0;eX[1]=-1;eX[2]=0;vecProd(eye,eX,eY);normalize(eY);_this.repaint()}else if(key=='y'){phibase=0;phi=0;twisting=false;naturalState=true;eye[0]=0;eye[1]=1;eye[2]=0;eX[0]=-1;eX[1]=0;eX[2]=0;vecProd(eye,eX,eY);normalize(eY);_this.repaint()}else if(key=='Y'){phibase=0;phi=0;twisting=false;naturalState=true;eye[0]=0;eye[1]=-1;eye[2]=0;eX[0]=1;eX[1]=0;eX[2]=0;vecProd(eye,eX,eY);normalize(eY);_this.repaint()}else if(key=='z'){phibase=0;phi=0;twisting=false;naturalState=true;eye[0]=0;eye[1]=0;eye[2]=1;eX[0]=1;eX[1]=0;eX[2]=0;vecProd(eye,eX,eY);normalize(eY);_this.repaint()}else if(key=='Z'){phibase=0;phi=0;twisting=false;naturalState=true;eye[0]=0;eye[1]=0;eye[2]=-1;eX[0]=1;eX[1]=0;eX[2]=0;vecProd(eye,eX,eY);normalize(eY);_this.repaint()}else if(key==java.awt.Event.F2){if(cubesperedge<=3){if(FBLRUDmode){FBLRUDmode=false}else{FBLRUDmode=true}}}else if(key==java.awt.Event.F3){if(twistmode==1){twistmode=0}else{twistmode=1}}}if(key=='1'){SetTwistSpeed(1)}else if(key=='2'){SetTwistSpeed(10)}else if(key=='3'){SetTwistSpeed(50)}else if(key=='4'){SetTwistSpeed(100)}else if(key=='c'){for(i=0;i<6;i++){var ColorIndex=(i*20)+19;_this.setSideColor(i,cycleHue(colList[ColorIndex]))}_this.repaint()}else if(key=='C'){var sideNum=findFront();var ColorIndex=(sideNum*20)+19;_this.setSideColor(sideNum,cycleHue(colList[ColorIndex]));_this.repaint()}else if(key==java.awt.Event.UP){var delta=0;if(evt.controlDown()){delta=-1}else{delta=-10}if(evt.shiftDown()){dx=0;dy=delta;dz=0}else{dx=0;dy=delta;dz=0}rotateAll();_this.repaint()}else if(key==java.awt.Event.DOWN){var delta=0;if(evt.controlDown()){delta=1}else{delta=10}if(evt.shiftDown()){dx=0;dy=delta;dz=0}else{dx=0;dy=delta;dz=0}rotateAll();_this.repaint()}else if(key==java.awt.Event.LEFT){var delta=0;if(evt.controlDown()){delta=-1}else{delta=-10}if(evt.shiftDown()){dx=0;dy=0;dz=-delta}else{dx=delta;dy=0;dz=0}rotateAll();_this.repaint()}else if(key==java.awt.Event.RIGHT){var delta=0;if(evt.controlDown()){delta=1}else{delta=10}if(evt.shiftDown()){dx=0;dy=0;dz=-delta}else{dx=delta;dy=0;dz=0}rotateAll();_this.repaint()}else if(key==java.awt.Event.F1){labelmode++;labelmode=labelmode%3;if(!animating){_this.repaint()}}else if(key==java.awt.Event.F4){if(showdragregions){showdragregions=false}else{showdragregions=true}if(!animating){_this.repaint()}}else if(key==java.awt.Event.F6){if(showdragline){showdragline=false}else{showdragline=true}if(!animating){_this.repaint()}}else if(key==java.awt.Event.F5){if(animating){stopAnimation()}inputlocked=false;this.restore();twistmode=importInt("twistmode",1);dragmode=importInt("dragmode",0);eye[0]=1;eye[1]=0;eye[2]=0;eX[0]=0;eX[1]=1;eX[2]=0;vecProd(eye,eX,eY);normalize(eY);_this.repaint();dx=screenwidth/3;dy=0;dz=0;rotateAll();dx=0;dy=screenheight/3;dz=0;rotateAll();_this.repaint()}else if(key==java.awt.Event.F9){dragmode++;dragmode=dragmode%3}return false};this.mouseDrag=function(evt,x,y){__dragX=x;__dragY=y;try{dx=x-lastX;dy=y-lastY;dz=0;if((!twisting||animating)&&(OKtoDrag)){checkDragRegions()}OKtoDrag=false;if(!twisting||animating){if(dragmode==1){if(!animating){rotateAll()}}else{rotateAll()}lastX=x;lastY=y}else{if(!inputlocked){phi=(twistfactor)*(currDragDir[0]*(dx)+currDragDir[1]*(dy))/m.sqrt(currDragDir[0]*currDragDir[0]+currDragDir[1]*currDragDir[1]);if(dragmode==1){var direction=Math.floor(phi/m.sqrt(phi*phi));turnSide(twistSide,currenttwistdepth,direction,1)}}}_this.repaint()}catch(e){}return false};this.mouseDown=function(evt,x,y){__downX=x;__downY=y;if(!inputlocked){if(naturalState&&!animating){if((evt.modifiers&java.awt.Event.META_MASK)!==0){twistmode=0}else{twistmode=1}}}lastX=x;lastY=y;OKtoDrag=true;return false};this.mouseUp=function(evt,x,y){__downX=-10;__downY=-10;__dragX=-10;__dragY=-10;if(!inputlocked){updateCubeRestState();if(naturalState&&!animating){twistmode=1}}_this.repaint();return false};var checkDragRegions=function(){var check;var x1,x2,y1,y2,alpha,beta;OKtoDrag=false;check=false;for(i=0;i0)&&(alpha<1)&&(beta>0)&&(beta<1)){currDragDir[0]=dragDir[i][0];currDragDir[1]=dragDir[i][1];d=currDragDir[0]*(dx)+currDragDir[1]*(dy);d=d*d/((currDragDir[0]*currDragDir[0]+currDragDir[1]*currDragDir[1])*((dx)*(dx)+(dy)*(dy)));if(naturalState){currenttwistdepth=Math.floor(dragDir[i][2])}if(d>0.6){check=true;twistSide=nearSide[i];i=(3*((twistdepth*2)*2))}}}if(check&&(cubesperedge>1)){twisting=true;if(naturalState){cutUpCube();naturalState=false}}};var rotateAll=function(){copyVec(eX,temp);scalMult(temp,(-dx)*(twistfactor));addVec(temp,eye);vecProd(eY,eye,eX);normalize(eX);normalize(eye);copyVec(eY,temp);scalMult(temp,(dy)*(twistfactor));addVec(temp,eye);vecProd(eye,eX,eY);normalize(eY);normalize(eye);copyVec(eX,temp);scalMult(temp,(dz)*(twistfactor));addVec(temp,eY);vecProd(eY,eye,eX);normalize(eX);normalize(eY)};var rotateZ=function(v,theta){var c=Math.cos(theta);var s=Math.sin(theta);var result=[v[0]*c-v[1]*s,v[0]*s+v[1]*c,v[2]];return result};var rotateY=function(v,theta){var c=Math.cos(theta);var s=Math.sin(theta);var result=[v[2]*s+v[0]*c,v[1],v[2]*c-v[0]*s];return result};var rotateX=function(v,theta){var c=Math.cos(theta);var s=Math.sin(theta);var result=[v[0],v[1]*c-v[2]*s,v[1]*s+v[2]*c];return result};var rotateAboutUD=function(angle){eX=rotateZ(eX,angle);eY=rotateZ(eY,angle);eye=rotateZ(eye,angle)};var rotateAboutFB=function(angle){eX=rotateY(eX,angle);eY=rotateY(eY,angle);eye=rotateY(eye,angle)};var rotateAboutLR=function(angle){eX=rotateX(eX,angle);eY=rotateX(eY,angle);eye=rotateX(eye,angle)};var updateCubeRestState=function(){var quads;var qu;if(twisting){twisting=false;phibase+=phi;phi=0;qu=phibase;while(qu<0){qu+=125.662}quads=(Math.floor(qu*3.183));if(((quads%5)===0)||((quads%5)==4)){quads=(Math.floor(((quads+1)/5)%4));if(colDir[twistSide]<0){quads=(4-quads)%4}phibase=0;naturalState=true;if((currenttwistdepth==1)||(twistmode===0)){ColorTwist(twistSide,quads)}else{ColorTwist_slice(twistSide,quads)}if(!animating){addtoscramblelist(twistSide,quads)}}_this.repaint()}return false};var twist=function(sideNum,depth,angle){if(0===depth){if(angle0){this.fixBlock(eye,eX,eY,labelcorners,labelBlocks,3);if(labelmode>1){var message="(";message+=(twistSide).toString();message+=",";message+=(currenttwistdepth).toString();message+=",";message+=(twistmode).toString();message+=")";offGraphics.setColor(java.awt.Color.black);offGraphics.drawString(message,10,10)}}if(naturalState){this.fixBlock(eye,eX,eY,corners,mainBlocks,0)}else{copyVec(eye,Teye);copyVec(eX,TeX);Cphi=m.cos(phi+phibase);Sphi=-m.sin(phi+phibase);switch(twistSide){case 0:Teye[0]=Cphi*eye[0]+Sphi*eye[1];TeX[0]=Cphi*eX[0]+Sphi*eX[1];Teye[1]=-Sphi*eye[0]+Cphi*eye[1];TeX[1]=-Sphi*eX[0]+Cphi*eX[1];break;case 1:Teye[0]=Cphi*eye[0]-Sphi*eye[1];TeX[0]=Cphi*eX[0]-Sphi*eX[1];Teye[1]=Sphi*eye[0]+Cphi*eye[1];TeX[1]=Sphi*eX[0]+Cphi*eX[1];break;case 2:Teye[0]=Cphi*eye[0]-Sphi*eye[2];TeX[0]=Cphi*eX[0]-Sphi*eX[2];Teye[2]=Sphi*eye[0]+Cphi*eye[2];TeX[2]=Sphi*eX[0]+Cphi*eX[2];break;case 3:Teye[1]=Cphi*eye[1]+Sphi*eye[2];TeX[1]=Cphi*eX[1]+Sphi*eX[2];Teye[2]=-Sphi*eye[1]+Cphi*eye[2];TeX[2]=-Sphi*eX[1]+Cphi*eX[2];break;case 4:Teye[0]=Cphi*eye[0]+Sphi*eye[2];TeX[0]=Cphi*eX[0]+Sphi*eX[2];Teye[2]=-Sphi*eye[0]+Cphi*eye[2];TeX[2]=-Sphi*eX[0]+Cphi*eX[2];break;case 5:Teye[1]=Cphi*eye[1]-Sphi*eye[2];TeX[1]=Cphi*eX[1]-Sphi*eX[2];Teye[2]=Sphi*eye[1]+Cphi*eye[2];TeX[2]=Sphi*eX[1]+Cphi*eX[2];break;default:break}vecProd(Teye,TeX,TeY);if(scalProd(eye,sideVec[twistSide])<0.02){if((currenttwistdepth==1)||(twistmode===0)){this.fixBlock(Teye,TeX,TeY,topCorners,topBlocks,2);this.fixBlock(eye,eX,eY,botCorners,botBlocks,1)}else{this.fixBlock(eye,eX,eY,topCorners,topBlocks,1);this.fixBlock(Teye,TeX,TeY,midCorners,midBlocks,2);this.fixBlock(eye,eX,eY,botCorners,botBlocks,1)}}else{if((currenttwistdepth==1)||(twistmode===0)){this.fixBlock(eye,eX,eY,botCorners,botBlocks,1);this.fixBlock(Teye,TeX,TeY,topCorners,topBlocks,2)}else{this.fixBlock(eye,eX,eY,botCorners,botBlocks,1);this.fixBlock(Teye,TeX,TeY,midCorners,midBlocks,2);this.fixBlock(eye,eX,eY,topCorners,topBlocks,1)}}}if(credits){offGraphics.setColor(java.awt.Color.black);offGraphics.fillRect(0,0,screenwidth,screenheight);offGraphics.setColor(java.awt.Color.green);offGraphics.drawString("Rubik's Cube 3D simulator",10,15);offGraphics.drawString("Original 3x3x3 design and code by",10,30);offGraphics.setColor(java.awt.Color.white);offGraphics.drawString("Karl Hšrnell, March 11 1996",10,45);offGraphics.drawString("Last modified October 6",10,60);offGraphics.setColor(java.awt.Color.green);offGraphics.drawString("New nxnxn design and code modifications by",10,75);offGraphics.setColor(java.awt.Color.white);offGraphics.drawString("Edward Evers, January 03 2001",10,90);offGraphics.setColor(java.awt.Color.green);offGraphics.drawString("Variable animation speed",10,105);offGraphics.drawString("Drag while animating",10,120);offGraphics.setColor(java.awt.Color.white);offGraphics.drawString("Edward Evers, March 30 2002",10,135);offGraphics.setColor(java.awt.Color.green);offGraphics.drawString("Cube rotation via arrow keys",10,150);offGraphics.drawString("FBLRUD controls",10,165);offGraphics.setColor(java.awt.Color.white);offGraphics.drawString("Edward Evers, September 28 2002",10,180);offGraphics.setColor(java.awt.Color.green);offGraphics.drawString("Color cycling",10,195);offGraphics.setColor(java.awt.Color.white);offGraphics.drawString("Edward Evers, August 01 2002",10,210);offGraphics.setColor(java.awt.Color.green);offGraphics.drawString("\"slice\" turning rev. 0.5",10,225);offGraphics.setColor(java.awt.Color.white);offGraphics.drawString("Edward Evers, August 02 2002",10,240);offGraphics.setColor(java.awt.Color.green);offGraphics.drawString("Added get/*String*/ var and setString",10,255);offGraphics.setColor(java.awt.Color.white);offGraphics.drawString("Edward Evers, January 31 2003",10,270);offGraphics.setColor(java.awt.Color.green);offGraphics.drawString("Added startAnimation and stopAnimation methods",10,285);offGraphics.setColor(java.awt.Color.white);offGraphics.drawString("Edward Evers, November 06 2004",10,300);offGraphics.setColor(java.awt.Color.green);offGraphics.drawString("Revomed usage of depricated Thread.stop method",10,315);offGraphics.setColor(java.awt.Color.white);offGraphics.drawString("Edward Evers, November 06 2004",10,330);offGraphics.setColor(java.awt.Color.green);offGraphics.drawString("Allow importActionList and playActionList for 2x2x2 cubes.",10,345);offGraphics.setColor(java.awt.Color.white);offGraphics.drawString("Edward Evers, November 16 2004",10,360)}if(showdragline){drawDownDot(__downX,__downY,3);drawDragDot(__dragX,__dragY,3);drawLine(__downX,__downY,__dragX,__dragY)}g.drawImage(offImage,0,0,this);painting=false};this.update=function(g){paint(g)};this.fixBlock=function(beye,beX,beY,bcorners,bblocks,mode){copyVec(beye,light);scalMult(light,-3);addVec(beX,light);subVec(beY,light);for(i=0;i<8;i++){newCoord[i][0]=((pixelsperunit)*scalProd(bcorners[i],beX));newCoord[i][1]=((-1)*(pixelsperunit)*scalProd(bcorners[i],beY));newCoord[i][2]=(depthfromscreen-(scalProd(bcorners[i],beye)))}if(mode==3){for(i=0;i<6;i++){for(j=0;j<4;j++){rectX[j]=Math.floor(MpX+(zoomfactor)*(newCoord[sides[i][j]][0])/(newCoord[sides[i][j]][2]));rectY[j]=Math.floor(MpY+(zoomfactor)*(newCoord[sides[i][j]][1])/(newCoord[sides[i][j]][2]));offGraphics.setColor(java.awt.Color.black);offGraphics.drawString((sides[i][j]).toString(),rectX[j],rectY[j])}}return}for(i=0;i<6;i++){if(scalProd(beye,sideVec[i])>-0.02){if((bblocks[i][1]-bblocks[i][0])===0){offGraphics.setColor(java.awt.Color.black);for(j=0;j<4;j++){rectX[j]=Math.floor(MpX+(zoomfactor)*(newCoord[sides[i][j]][0])/(newCoord[sides[i][j]][2]));rectY[j]=Math.floor(MpY+(zoomfactor)*(newCoord[sides[i][j]][1])/(newCoord[sides[i][j]][2]))}offGraphics.fillPolygon(rectX,rectY,4)}}}for(i=0;i<6;i++){if(scalProd(beye,sideVec[i])>0.1){offGraphics.setColor(java.awt.Color.black);for(j=0;j<4;j++){rectX[j]=Math.floor(MpX+(zoomfactor)*(newCoord[sides[i][j]][0])/(newCoord[sides[i][j]][2]));rectY[j]=Math.floor(MpY+(zoomfactor)*(newCoord[sides[i][j]][1])/(newCoord[sides[i][j]][2]))}offGraphics.fillPolygon(rectX,rectY,4);sideW=bblocks[i][1]-bblocks[i][0];sideH=bblocks[i][3]-bblocks[i][2];if(sideW>0){k=Math.floor(9.6*(1-cosAng(light,sideVec[i])));sx=newCoord[sides[i][0]][0];sy=newCoord[sides[i][0]][1];sz=newCoord[sides[i][0]][2];sdxh=(newCoord[sides[i][1]][0]-sx)/sideW;sdyh=(newCoord[sides[i][1]][1]-sy)/sideW;sdzh=(newCoord[sides[i][1]][2]-sz)/sideW;sdxv=(newCoord[sides[i][3]][0]-sx)/sideH;sdyv=(newCoord[sides[i][3]][1]-sy)/sideH;sdzv=(newCoord[sides[i][3]][2]-sz)/sideH;p=bblocks[i][2];for(n=0;n1){var mx=(rectX[0]+rectX[2])/2;var my=(rectY[0]+rectY[2])/2;offGraphics.setColor(java.awt.Color.black);offGraphics.drawString(i+","+(p*cubesperedge+q),mx,my)}q++}p++}}switch(mode){case 0:t1=sx;t2=sy;t3=sz;t4=0;t5=0;t6=0;t7=sdxh;t8=sdyh;t9=sdzh;t10=sdxv;t11=sdyv;t12=sdzv;for(j=0;j<4;j++){dragCorn[dragReg][0]=MpX+(zoomfactor)*t1/t3;dragCorn[dragReg][4]=MpY+(zoomfactor)*t2/t3;dragCorn[dragReg][3]=MpX+(zoomfactor)*(t1+t10)/(t3+t12);dragCorn[dragReg][7]=MpY+(zoomfactor)*(t2+t11)/(t3+t12);t4=t1+t7*cubesperedge;t5=t2+t8*cubesperedge;t6=t3+t9*cubesperedge;dragCorn[dragReg][1]=MpX+(zoomfactor)*t4/t6;dragCorn[dragReg][5]=MpY+(zoomfactor)*t5/t6;dragCorn[dragReg][2]=MpX+(zoomfactor)*(t4+t10)/(t6+t12);dragCorn[dragReg][6]=MpY+(zoomfactor)*(t5+t11)/(t6+t12);dragDir[dragReg][0]=t7*twistDir[i][j];dragDir[dragReg][1]=t8*twistDir[i][j];dragDir[dragReg][2]=1;nearSide[dragReg]=nextSide[i][j];if(showdragregions){rectX[0]=Math.floor(dragCorn[dragReg][0]);rectX[1]=Math.floor(dragCorn[dragReg][1]);rectX[2]=Math.floor(dragCorn[dragReg][2]);rectX[3]=Math.floor(dragCorn[dragReg][3]);rectY[0]=Math.floor(dragCorn[dragReg][4]);rectY[1]=Math.floor(dragCorn[dragReg][5]);rectY[2]=Math.floor(dragCorn[dragReg][6]);rectY[3]=Math.floor(dragCorn[dragReg][7]);offGraphics.setColor(java.awt.Color.red);offGraphics.drawPolygon(rectX,rectY,4)}dragReg++;for(k=1;k1){if(k==(twistdepth-1)&&j==3){offGraphics.setColor(java.awt.Color.green)}else{offGraphics.setColor(java.awt.Color.red)}}else{offGraphics.setColor(java.awt.Color.red)}offGraphics.drawPolygon(rectX,rectY,4)}}t1=t4;t2=t5;t3=t6;d=t7;t7=t10;t10=-d;d=t8;t8=t11;t11=-d;d=t9;t9=t12;t12=-d}break;case 1:break;case 2:if((i!=twistSide)&&(sideW>0)){var branchvalue1=(cubesperedge/2>0)?(cubesperedge/2):(1);var branchvalue2=(cubesperedge%2>0)?(branchvalue1+1):(branchvalue1);if(sideW==cubesperedge){if(bblocks[i][3]<=branchvalue1){dragDir[dragReg][0]=sdxh*twistDir[i][0];dragDir[dragReg][1]=sdyh*twistDir[i][0]}else{if(bblocks[i][3]==branchvalue2){dragDir[dragReg][0]=-sdxh*twistDir[i][2]*centertwistDirMultiplier[i][twistSide];dragDir[dragReg][1]=-sdyh*twistDir[i][2]*centertwistDirMultiplier[i][twistSide]}else{dragDir[dragReg][0]=-sdxh*twistDir[i][2];dragDir[dragReg][1]=-sdyh*twistDir[i][2]}}}else{if(bblocks[i][1]<=branchvalue1){dragDir[dragReg][0]=-sdxv*twistDir[i][3];dragDir[dragReg][1]=-sdyv*twistDir[i][3]}else{if(bblocks[i][1]==branchvalue2){dragDir[dragReg][0]=sdxv*twistDir[i][1]*centertwistDirMultiplier[i][twistSide];dragDir[dragReg][1]=sdyv*twistDir[i][1]*centertwistDirMultiplier[i][twistSide]}else{dragDir[dragReg][0]=sdxv*twistDir[i][1];dragDir[dragReg][1]=sdyv*twistDir[i][1]}}}for(j=0;j<4;j++){t1=newCoord[sides[i][j]][0];t2=newCoord[sides[i][j]][1];t3=newCoord[sides[i][j]][2];dragCorn[dragReg][j]=(MpX+(zoomfactor)*t1/t3);dragCorn[dragReg][4+j]=(MpY+(zoomfactor)*t2/t3)}if(showdragregions){rectX[0]=Math.floor(dragCorn[dragReg][0]);rectX[1]=Math.floor(dragCorn[dragReg][1]);rectX[2]=Math.floor(dragCorn[dragReg][2]);rectX[3]=Math.floor(dragCorn[dragReg][3]);rectY[0]=Math.floor(dragCorn[dragReg][4]);rectY[1]=Math.floor(dragCorn[dragReg][5]);rectY[2]=Math.floor(dragCorn[dragReg][6]);rectY[3]=Math.floor(dragCorn[dragReg][7]);offGraphics.setColor(java.awt.Color.red);offGraphics.drawPolygon(rectX,rectY,4)}nearSide[dragReg]=twistSide;dragReg++}break;default:break}}}};var startAnimation=function(){if((animation)&&(animation!==null)){while(animation.isAlive()){play(getCodeBase(),"beep.au")}animation=null}if(animation===null){animating=true;try{animation=new java.lang.Thread(this);animation.start()}catch(e){var Message=e.getMessage();animating=false}}return(animating)};var stopAnimation=function(){if((animation)&&(animation!==null)){animating=false}};this.stop=function(){if((animation)&&(animation!==null)){animation=null}if(threadSuspended){threadSuspended=false;notify()}};this.runOnTimer=function(){var me=java.lang.Thread.currentThread();me.setInterval(twistspeed);if(animating){try{if(!painting){turnstep++;if(turnstep==(stepsperturn-1)){turnstep=0;updateAnimationState();if(onactioncomplete){onactioncomplete()}}else{twist(getAnimationTwistSideNumber(),getAnimationTwistDepth(),getAnimationTwistMultiplier());_this.repaint()}}}catch(e){animating=false}result=true}else{_this.repaint();if(onanimationcomplete){setTimeout(function(){onanimationcomplete()},0)}result=false}return result};this.run=function(){var me=java.lang.Thread.currentThread();turnstep=0;me.startTimer()};var getAnimationTwistSideNumber=function(){var l_sideNum=0;if(!actionlist.isFinished()){l_sideNum=actionlist.getSideNumber()}else{l_sideNum=scramblelist[twistcount][0]}return(l_sideNum)};var getAnimationTwistDepth=function(){var l_depth=0;if(!actionlist.isFinished()){l_depth=actionlist.getDepth();twistmode=actionlist.getTwistMode();currenttwistdepth=l_depth}else{l_depth=scramblelist[twistcount][1];twistmode=scramblelist[twistcount][3];currenttwistdepth=l_depth}return(l_depth)};var getAnimationTwistMultiplier=function(){var multiplier=0;if(!actionlist.isFinished()){multiplier=actionlist.getDirection();multiplier*=d_phi}else{multiplier=(solving)?(-1):(1);multiplier*=(scramblelist[twistcount][2]);multiplier*=d_phi}return(multiplier)};var onactioncomplete=null;var onanimationcomplete=null;this.onActionComplete=function(oncomplete){onactioncomplete=oncomplete};this.onAnimationComplete=function(oncomplete){onanimationcomplete=oncomplete};var updateAnimationState=function(){if(!actionlist.isFinished()){animating=false;updateCubeRestState();animating=true;if(!actionlist.goNext()){actionlist.reset();twistmode=temptwistmode;inputlocked=false;stopAnimation();return}}else{updateCubeRestState();if(solving){twistcount--;if(twistcount==-1){resetscramblelist();twistmode=temptwistmode;inputlocked=false;stopAnimation();return}}else{twistcount++;if(scramblelist[twistcount][2]===0){inputlocked=false;stopAnimation();return}}}};var list=[];var beginIndex;var endIndex;this.ActionList=function(){list=empty2Array(1024,4);this.reset()};this.addAction=function(sideNum,depth,direction,mode){if(endIndex<200){list[endIndex][0]=sideNum;list[endIndex][1]=depth;list[endIndex][2]=direction;list[endIndex][3]=mode;endIndex++}};this.reset=function(){beginIndex=0;endIndex=0;list[beginIndex][0]=0;list[beginIndex][1]=0;list[beginIndex][2]=0;list[beginIndex][3]=0};this.goNext=function(){var bResult=false;if(beginIndex1)?(h/360):(h);s=(s>1)?(s/100):(s);v=(v>1)?(v/100):(v);i=Math.floor(h*6);f=h*6-i;p=v*(1-s);q=v*(1-f*s);t=v*(1-(1-f)*s);switch(i%6){case 0:r=v;g=t;b=p;break;case 1:r=q;g=v;b=p;break;case 2:r=p;g=v;b=t;break;case 3:r=p;g=q;b=v;break;case 4:r=t;g=p;b=v;break;case 5:r=v;g=p;b=q;break;default:break}return[Math.floor(r*255),Math.floor(g*255),Math.floor(b*255)]},hsv2ToRgb:function(h,s,v){var r,g,b,i,f,p,q,t;if(h&&s===undefined&&v===undefined){s=h.s;v=h.v;h=h.h}h=h/360;s=s/100;v=v/100;i=Math.floor(h*6);f=h*6-i;p=v*(1-s);q=v*(1-f*s);t=v*(1-(1-f)*s);switch(i%6){case 0:r=v;g=t;b=p;break;case 1:r=q;g=v;b=p;break;case 2:r=p;g=v;b=t;break;case 3:r=p;g=q;b=v;break;case 4:r=t;g=p;b=v;break;case 5:r=v;g=p;b=q;break;default:break}return[Math.floor(r*255),Math.floor(g*255),Math.floor(b*255)]},rgbToHsv:function(r,g,b){r=r/255;g=g/255;b=b/255;var max=Math.max(r,g,b),min=Math.min(r,g,b);var h,s,v=max;var d=max-min;s=max===0?0:d/max;if(max==min){h=0}else{switch(max){case r:h=(g-b)/d+(gg)?((r>b)?(r):(b)):((g>b)?(g):(b)),delta=max-min,h,s,v=max;v=(((max/255*100))<<1)>>1;if(max!==0){s=(((delta/max*100))<<1)>>1}else{return[0,0,0]}if(r==max){h=(g-b)/delta; }else if(g==max){h=2+(b-r)/delta; }else{h=4+(r-g)/delta; }h=(((h*60))<<1)>>1;if(h<0){h+=360}return[h,s,v]},rgbToHtml:function(r,g,b){return("#"+intToHex(r)+intToHex(g)+intToHex(b)).toUpperCase()},hsvToHtml:function(h,s,v){var rgb=this.hsvToRgb(h,s,v);return("#"+intToHex(rgb[0])+intToHex(rgb[1])+intToHex(rgb[2])).toUpperCase()},hsv2ToHtml:function(h,s,v){var rgb=this.hsv2ToRgb(h,s,v);return("#"+intToHex(rgb[0])+intToHex(rgb[1])+intToHex(rgb[2])).toUpperCase()},isRgbString:function(s){return(s.toLowerCase().indexOf("rgb(")===0)},rgbStringToRgb:function(s){s=s.replace("rgb(","");s=s.replace("RGB(","");s=s.replace(")","");var rgb=s.split(",");return[parseInt(rgb[0],10),parseInt(rgb[1],10),parseInt(rgb[2],10)]},rgbStringToHex:function(s){var result=s;if(this.isRgbString(s)){var rgb=this.rgbStringToRgb(s);result=("#"+intToHex(rgb[0])+intToHex(rgb[1])+intToHex(rgb[2])).toUpperCase()}return result},htmlToRgb:function(html){var r=0;var g=0;var b=0;html=this.rgbStringToHex(html);r=hexToR(html);g=hexToG(html);b=hexToB(html);return[r,g,b]},htmlToHsv:function(html){var r=0;var g=0;var b=0;html=this.rgbStringToHex(html);r=hexToR(html);g=hexToG(html);b=hexToB(html);var hsv=this.rgbToHsv2(r,g,b);return hsv},generateRgbToHsv2Lookup2:function(){var n=256*256*256;var _ht=new Uint32Array(n);var _st=new Uint32Array(n);var _vt=new Uint32Array(n);for(var i=0;i<256;i++){for(var j=0;j<256;j++){for(var k=0;k<256;k++){var l=((i<<16)+(j<<8)+k);var hsv=ColorTools.rgbToHsv2(i,j,k);_ht[l]=hsv[0];_st[l]=hsv[1];_vt[l]=hsv[2]}}}return function(r,g,b){var k=((r<<16)+(g<<8)+b);return[_ht[k],_st[k],_vt[k]]}},generateRgbToHsv2Lookup:function(){var _hsvt=new Uint32Array(256*256*256);for(var i=0;i<256;i++){for(var j=0;j<256;j++){for(var k=0;k<256;k++){var l=((i<<16)+(j<<8)+k);var hsv=ColorTools.rgbToHsv2(i,j,k);_hsvt[l]=(hsv[0]<<16)|(hsv[1]<<8)|(hsv[2])}}}return function(r,g,b){var hsv32=_hsvt[((r<<16)+(g<<8)+b)];return[(hsv32&0xffff0000)>>16,(hsv32&0x0000ff00)>>8,(hsv32&0x000000ff)]}},}})();var HoughTransform=function(width,height,numAngleCells,accumThreshold,drawLines,imgContext,hsContext,console){'use strict';var rhoMax=Math.sqrt(width*width+height*height);var accum=Array(numAngleCells);var ox=width/2;var oy=height/2;if(hsContext){var border=20;hsContext.canvas.width=numAngleCells+border+border;hsContext.canvas.height=rhoMax+border+border;hsContext.fillStyle='rgba(0,0,0,.5)';hsContext.strokeStyle='rgba(0,0,0,.5)';hsContext.beginPath();hsContext.moveTo(border,border);hsContext.lineTo(border,rhoMax+border);hsContext.lineTo(numAngleCells+border,rhoMax+border);hsContext.stroke();hsContext.font="10px Arial";hsContext.fillText("Rho",5,border);hsContext.fillText("Theta",numAngleCells,rhoMax+border+border/2);hsContext.fillStyle='rgba(0,0,0,.1)'}var cosTable=Array(numAngleCells);var sinTable=Array(numAngleCells);for(var theta=0,thetaIndex=0;thetaIndex(rhoMax-n))return(rhoMax);else return(rho+n)};var getCullMinTheta=function(theta,n){if(theta(numAngleCells-n))return(numAngleCells);else return(theta+n)};var cull=function(theta,rho){var cullMin=getCullMinRho(rho,10);var cullMax=getCullMaxRho(rho,10);var cullMinT=getCullMinTheta(theta,10);var cullMaxT=getCullMaxTheta(theta,10);for(var l=cullMinT;lmax){max=accum[i][j];bestRho=j;bestTheta=i}}}if(max>accumThreshold){accum[bestTheta][bestRho]=0;cull(bestTheta,bestRho);if(((bestTheta>6)&&(bestTheta<174))||((bestTheta>186)&&(bestTheta<354))){return}if(done[bestRho][bestTheta])return;if(hsContext){hsContext.fillStyle='rgba(255,0,0,1)';hsContext.fillRect(bestTheta+border,bestRho,2,2);hsContext.fillStyle='rgba(0,0,0,.1)'}if(imgContext){bestRho<<=1;bestRho-=rhoMax;var a=cosTable[bestTheta];var b=sinTable[bestTheta];var x0=bestRho*a;var y0=bestRho*b;var dy=rhoMax*(a);var dx=rhoMax*(-b);var x1=(x0+dx);var y1=(y0+dy);var x2=(x0-dx);var y2=(y0-dy);if((bestTheta>=90)&&(bestTheta<=270)){h_lines[h_lines.length]=[x0,y0,x1,y1]}else{v_lines[v_lines.length]=[x0,y0,x1,y1]}if(drawLines){imgContext.beginPath();imgContext.lineWidth=3;imgContext.strokeStyle='rgba(0,255,0,1)';imgContext.moveTo(x1+ox,y1+oy);imgContext.lineTo(x2+ox,y2+oy);imgContext.stroke();imgContext.strokeStyle='rgba(0,0,0,1)';imgContext.closePath()}}}}};var sortVLines=function(){v_lines.sort(function(a,b){return a[0]-b[0]});var temp=[];var last_x=-width;v_lines.forEach(function(line){if(line[0]>(last_x+10)){temp[temp.length]=line;last_x=line[0]}});v_lines=temp.slice()};var sortHLines=function(){h_lines.sort(function(a,b){return a[1]-b[1]});var temp=[];var last_y=-height;h_lines.forEach(function(line){if(line[1]>(last_y+10)){temp[temp.length]=line;last_y=line[1]}});h_lines=temp.slice()};var intersects=function(l2,l1){var x1=l1[0];var y1=l1[1];var x2=l1[2];var y2=l1[3];var x3=l2[0];var y3=l2[1];var x4=l2[2];var y4=l2[3];var x12=x1-x2;var x34=x3-x4;var y12=y1-y2;var y34=y3-y4;var c=x12*y34-y12*x34;if(Math.abs(c)<0.01){return{r:false,x:NaN,y:NaN}}else{var a=x1*y2-y1*x2;var b=x3*y4-y3*x4;var x=(a*x34-b*x12)/c;var y=(a*y34-b*y12)/c;return{r:true,sx:x+ox,sy:y+oy}}};var intersections=[];var subplotIntersections=function(lines1,lines2){if(imgContext){for(var i in lines1){var k=intersections.length;intersections[k]=[];var lastx=false;var lasty=false;for(var j in lines2){var r=intersects(lines1[i],lines2[j]);if((r.r)&&((r.sx)>0)&&((r.sy)>0)&&((r.sx)3){if(intersections[0].length>3){if(intersections[1].length>3){if(intersections[2].length>3){if(intersections[3].length>3){drawCircle(0,1,0,1);drawCircle(0,1,1,2);drawCircle(0,1,2,3);drawCircle(1,2,0,1);drawCircle(1,2,1,2);drawCircle(1,2,2,3);drawCircle(2,3,0,1);drawCircle(2,3,1,2);drawCircle(2,3,2,3)}}}}}};var plotIntersections=function(){sortVLines();sortHLines();subplotIntersections(h_lines,v_lines);subplotIntersections(v_lines,h_lines);plotRegions()};return{Acc:function(x,y){var rho;var thetaIndex=0;x-=width>>1;y-=height>>1;for(;thetaIndex>=1;if(accum[thetaIndex]==undefined)accum[thetaIndex]=[];if(accum[thetaIndex][rho]==undefined){accum[thetaIndex][rho]=1}else{accum[thetaIndex][rho]++}drawInHough(rho,thetaIndex)}},AccClassical:function(x,y){var rho;var theta=0;var thetaIndex=0;x-=width/2;y-=height/2;for(;thetaIndex>=1;if(accum[thetaIndex]==undefined)accum[thetaIndex]=[];if(accum[thetaIndex][rho]==undefined){accum[thetaIndex][rho]=1}else{accum[thetaIndex][rho]++}drawInHough(rho,thetaIndex)}},extract:function(n){for(var i=0;i0){_table[k]=i*255/j}else{_table[k]=NaN}}}return function(){var _ref_rgb=[255,255,255];this.reset=function(){_ref_rgb[0]=255;_ref_rgb[1]=255;_ref_rgb[2]=255};this.setRgb=function(r,g,b){_ref_rgb[0]=r;_ref_rgb[1]=g;_ref_rgb[2]=b};this.balanceR=function(v){return _table[((v<<8)+_ref_rgb[0])]};this.balanceG=function(v){return _table[((v<<8)+_ref_rgb[1])]};this.balanceB=function(v){return _table[((v<<8)+_ref_rgb[2])]};this.balance=function(i,s,d){d[i]=this.balanceR(s[i]);d[i+1]=this.balanceG(s[i+1]);d[i+2]=this.balanceB(s[i+2])}}})();return{is_almost:is_almost,ColorAverager:function(){var avg_color=[0,0,0];var avg_color_count=0;this.reset=function(){avg_color=[0,0,0];avg_color_count=0};this.addColor=function(r,g,b){avg_color_count++;avg_color[0]+=r;avg_color[1]+=g;avg_color[2]+=b};this.getColor=function(){return[(avg_color[0]/avg_color_count)>>0,(avg_color[1]/avg_color_count)>>0,(avg_color[2]/avg_color_count)>>0]}},ScanBox:function(rect){FilterUtils.ColorAverager.call(this);this.rect=rect},ColorMax:function(){FilterUtils.ColorAverager.call(this);var max=32;var max_rgb=[max,max,max];var updateMaxColor=function(r,g,b){var test=(r+g+b)/3;if(test>max){max=test;max_rgb=[r,g,b];return true}return false};this.updateMax=function(){var srgb=this.getColor();return updateMaxColor(srgb[0],srgb[1],srgb[2])};this.getMaxColor=function(){return max_rgb.slice()}},WhiteBalancer:WhiteBalancer,}})();var Filters=(function(FilterUtils){"use strict";var isLittleEndian=(function(){var buf=new ArrayBuffer(8);var data=new Uint32Array(buf);data[1]=0x0a0b0c0d;return!(buf[4]===0x0a&&buf[5]===0x0b&&buf[6]===0x0c&&buf[7]===0x0d)})();console.log("Little Endian CPU : "+isLittleEndian);var foreach_pixel=function(ymin,ymax,xmin,xmax,width,height,callback){for(var y=ymin;y>8)+((src[i]&0x00ff0000)>>16))*171)>>9;dst[i]=((255<<24)|(v<<16)|(v<<8)|(v<<0))}};var grayscale_be=function(src8,dst8,width,height,params){var src=new Uint32Array(src8.buffer);var dst=new Uint32Array(dst8.buffer);for(var i=0;i>8)+((src[i]&0x00ff0000)>>16)+((src[i]&0xff000000)>>24))*171)>>9;dst[i]=((v<<24)|(v<<16)|(v<<8)|(255<<0))}};var frame_stack=[];var stack_size=3;var get_median=function(arr){arr.sort(function sortNumber(a,b){return a-b});if(arr.length%2===0){return(arr[(arr.length/2)-1]+arr[arr.length/2])/2}else{return arr[Math.floor(arr.length/2)]}};console.log(get_median([1,5,2,4,3]));console.log(get_median([1,2,4,3]));var build_frame_stack=function(src,width,height){for(var j=0;jt2)){matches=false}}}return matches}return{copy:function(src,dst,width,height,params){dst.set(src)},red:(isLittleEndian)?(red_le):(red_be),green:(isLittleEndian)?(green_le):(green_be),blue:(isLittleEndian)?(blue_le):(blue_be),grayscale:(isLittleEndian)?(grayscale_le):(grayscale_be),pixelate:function(src,dst,width,height,params){params=params||{};var pixel_count_x=(params.pixel_count_x)?(params.pixel_count_x):(64);var pixel_count_y=(params.pixel_count_y)?(params.pixel_count_y):(64);var dx=width/pixel_count_x;var dy=height/pixel_count_y;foreach_pixel_step(0,height,0,width,width,height,dy,dx,function(x,y,i){for(var t=0;t=params.threshold)?(255):(0);dst[i]=dst[i+1]=dst[i+2]=v;dst[i+3]=255}},thresholdRGB:function(src,dst,width,height,params){for(var i=0;i=params.thresholdR)?(src[i]):(0);dst[i+1]=(src[i+1]>=params.thresholdG)?(src[i+1]):(0);dst[i+2]=(src[i+2]>=params.thresholdB)?(src[i+2]):(0);dst[i+3]=255}},saturation:function(src,dst,width,height,params){for(var i=0;i>1;var w=width;var h=height;var alphaFac=params.opaque?1:0;for(var y=0;y=0&&scy=0&&scxthreshold)?(255):(0);dst[i]=p;dst[i+1]=p;dst[i+2]=p;dst[i+3]=255})},sobel:function(src,dst,width,height,params){var weights0=[-1,-2,-1,0,0,0,1,2,1];var weights1=[-1,0,1,-2,0,2,-1,0,1];var horizontalFloat32Data={width:width,height:height,data:new Float32Array(width*height*4)};Filters.convolute(src,horizontalFloat32Data.data,width,height,{weights:weights0});var verticalFloat32Data={width:width,height:height,data:new Float32Array(width*height*4)};Filters.convolute(src,verticalFloat32Data.data,width,height,{weights:weights1});var src0=verticalFloat32Data.data;var src1=horizontalFloat32Data.data;for(var i=0;it)?(a):(b)};var threshold=(params.threshold)?(params.threshold):(0);var src0=verticalFloat32Data.data;var src1=horizontalFloat32Data.data;for(var i=0;it)?(a):(b)};var threshold=(params.threshold)?(params.threshold):(0);var src0=verticalFloat32Data.data;var src1=horizontalFloat32Data.data;for(var i=0;i-22.5))||(thisAngle>157.5)||(thisAngle<-157.5))newAngle=0;if(((thisAngle>22.5)&&(thisAngle<67.5))||((thisAngle<-112.5)&&(thisAngle>-157.5)))newAngle=45;if(((thisAngle>67.5)&&(thisAngle<112.5))||((thisAngle<-67.5)&&(thisAngle>-112.5)))newAngle=90;if(((thisAngle>112.5)&&(thisAngle<157.5))||((thisAngle<-22.5)&&(thisAngle>-67.5)))newAngle=135;edgeDirection[i]=newAngle}var upperThreshold=60;var lowerThreshold=30;var findEdge=function(rowShift,colShift,row,col,dir,lowerThreshold,W,H){var newRow;var newCol;var i;var edgeEnd=false;if(colShift<0){if(col>0)newCol=col+colShift;else edgeEnd=true}else if(col0)newRow=row+rowShift;else edgeEnd=true}else if(rowlowerThreshold)){dst[i]=255;dst[i+1]=255;dst[i+2]=255;dst[i+3]=255;if(colShift<0){if(newCol>0)newCol=newCol+colShift;else edgeEnd=true}else if(newCol0)newRow=newRow+rowShift;else edgeEnd=true}else if(newRow>2;var col=k%width;var row=(k-col)/width;if(gradientFloat32Data[i]>upperThreshold){switch(edgeDirection[i]){case 0:findEdge(0,1,row,col,0,lowerThreshold,width,height);break;case 45:findEdge(1,1,row,col,45,lowerThreshold,width,height);break;case 90:findEdge(1,0,row,col,90,lowerThreshold,width,height);break;case 135:findEdge(1,-1,row,col,135,lowerThreshold,width,height);break;default:dst[i]=0;dst[i+1]=0;dst[i+2]=0;dst[i+3]=255;break}}else{dst[i]=0;dst[i+1]=0;dst[i+2]=0;dst[i+3]=255}}for(i=0;i0)newCol=col+colShift;else edgeEnd=true}else if(col0)newRow=row+rowShift;else edgeEnd=true}else if(row0)newCol=newCol+colShift;else edgeEnd=true}else if(newCol0)newRow=newRow+rowShift;else edgeEnd=true}else if(newRow0)newCol=col+colShift;else edgeEnd=true}else if(col0)newRow=row+rowShift;else edgeEnd=true}else if(row0)newCol=newCol+colShift;else edgeEnd=true}else if(newCol0)newRow=newRow+rowShift;else edgeEnd=true}else if(newRowmax[2]){max[0]=nonMax[count][0];max[1]=nonMax[count][1];max[2]=nonMax[count][2]}}for(count=0;count>2;var col2=k2%width;var row2=(k2-col2)/width;if(dst[i]==255){switch(edgeDirection[i]){case 0:suppressNonMax(1,0,row2,col2,0,lowerThreshold);break;case 45:suppressNonMax(1,-1,row2,col2,45,lowerThreshold);break;case 90:suppressNonMax(0,1,row2,col2,90,lowerThreshold);break;case 135:suppressNonMax(1,1,row2,col2,135,lowerThreshold);break;default:break}}}},dialate:function(src,dst,width,height,params){var assign=function(dst,i,r,g,b,a){dst[i]=r;dst[i+1]=g;dst[i+2]=b;dst[i+3]=a};foreach_pixel(0,height,0,width,width,height,function(x,y,i){assign(dst,i,0,0,0,255)});foreach_pixel(1,height-1,1,width-1,width,height,function(x,y,i){var r=src[i];var g=src[i+1];var b=src[i+2];var s=r+g+b;dst[i+3]=255;if(s>256){assign(dst,i-width*4,r,g,b,255);assign(dst,i-4,r,g,b,255);assign(dst,i,r,g,b,255);assign(dst,i+4,r,g,b,255);assign(dst,i+width*4,r,g,b,255)}})},clip:function(src,dst,width,height,params){var lb=(typeof(params.lb)!==undefined)?(params.lb):(0);var ub=(typeof(params.ub)!==undefined)?(params.ub):(0);for(var i=0;i=lb)&&(src[i]<=ub))?(src[i]):(0);dst[i+1]=((src[i+1]>=lb)&&(src[i+1]<=ub))?(src[i+1]):(0);dst[i+2]=((src[i+2]>=lb)&&(src[i+2]<=ub))?(src[i+2]):(0);dst[i+3]=255}},fill:function(src,dst,width,height,params){var is_match=function(color0,i,color1,k){var result=true;for(var j=0;j<3;j++){result=result&&(color0[j+i]==color1[j+k])}return result};for(var i=0;i>0):(0x30);for(var i=0;i=params.threshold)?(255):(0);dst[i]=dst[i+1]=dst[i+2]=v;dst[i+3]=255}},neighbors:function(src,dst,width,height,params){for(var i=0;i=0&&scy=0&&scx>0)*wt;g+=((src[srcOff]&0x0000ff00)>>8)*wt;b+=((src[srcOff]&0x00ff0000)>>16)*wt;a+=((src[srcOff]&0xff000000)>>24)*wt}}}dst[dstOff]=r;dst[dstOff+1]=g;dst[dstOff+2]=b;dst[dstOff+3]=255}}},convolute2:function(src,dst,width,height,params){var sw=width;var sh=height;var side=params.dim?params.dim:Math.round(Math.sqrt(params.weights.length));var halfSide=side>>1;var w=width;var h=height;var alphaFac=params.opaque?1:0;for(var y=0;y=0&&scy=0&&scx64)?(255):(0);temp0[i+1]=(v>64)?(255):(0);temp0[i+2]=(v>64)?(255):(0);temp0[i+3]=255});var assign=function(buffer,i,r,g,b,a){buffer[i]=r;buffer[i+1]=g;buffer[i+2]=b;buffer[i+3]=a};var temp=dst;foreach_pixel(1,height-1,1,width-1,width,height,function(x,y,i){if(temp0[i]===255){assign(temp,i-width*4,255,0,0,255);assign(temp,i-4,255,0,0,255);assign(temp,i,255,0,0,255);assign(temp,i+4,255,0,0,255);assign(temp,i+width*4,255,0,0,255)}else{temp[i+3]=255}})},gSobel:function(src,dst,width,height,params){var weights0=[-1,-2,-1,0,0,0,1,2,1];var weights1=[-1,0,1,-2,0,2,-1,0,1];var horizontalFloat32Data={width:width,height:height,data:new Float32Array(width*height*4)};Filters.convolute(src,horizontalFloat32Data.data,width,height,{weights:weights0});var verticalFloat32Data={width:width,height:height,data:new Float32Array(width*height*4)};Filters.convolute(src,verticalFloat32Data.data,width,height,{weights:weights1});var src0=verticalFloat32Data.data;var src1=horizontalFloat32Data.data;foreach_pixel(0,height,0,width,width,height,function(x,y,i){var r=(Math.abs(src0[i])+Math.abs(src1[i]))/2;var g=(Math.abs(src0[i+1])+Math.abs(src1[i+1]))/2;var b=(Math.abs(src0[i+2])+Math.abs(src1[i+2]))/2;var v=(r+b+g)/3;dst[i]=v;dst[i+1]=v;dst[i+2]=v;dst[i+3]=255})},bwCustomSobel:function(src,dst,width,height,params){var weights0=[-1,-2,-1,0,0,0,1,2,1];var weights1=[-1,0,1,-2,0,2,-1,0,1];var horizontalFloat32Data={width:width,height:height,data:new Float32Array(width*height*4)};Filters.convolute(src,horizontalFloat32Data.data,width,height,{weights:weights0});var verticalFloat32Data={width:width,height:height,data:new Float32Array(width*height*4)};Filters.convolute(src,verticalFloat32Data.data,width,height,{weights:weights1});var src0=verticalFloat32Data.data;var src1=horizontalFloat32Data.data;var threshold=(params.threshold)?(params.threshold):(128);var ym=(params.top)?(params.top):(0);var yx=(params.bottom)?(params.bottom):(0);var xm=(params.left)?(params.left):(0);var xx=(params.right)?(params.right):(0);dst.set(src);foreach_pixel(ym,(height-yx),xm,(width-xx),width,height,function(x,y,i){var r=(Math.abs(src0[i])+Math.abs(src1[i]))/2;var g=(Math.abs(src0[i+1])+Math.abs(src1[i+1]))*1.5;var b=(Math.abs(src0[i+2])+Math.abs(src1[i+2]))*1.5;var v=(r+b+g)/3;var p=(v>threshold)?(255):(0);dst[i]=p;dst[i+1]=p;dst[i+2]=p;dst[i+3]=255})},bwhSobel:function(src,dst,width,height,params){var acc_threshold=(params.acc_threshold)?(params.acc_threshold):(150);var draw_lines=(params.draw_lines)?(params.draw_lines):(false);var display_filter=(params.display_filter)?(params.display_filter):(false);var extract=(params.extract)?(params.extract):(1);var ym=(params.top)?(params.top):(0);var yx=(params.bottom)?(params.bottom):(0);var xm=(params.left)?(params.left):(0);var xx=(params.right)?(params.right):(0);var bdst=new Uint8ClampedArray(width*height*4);Filters.bwCustomSobel(src,bdst,width,height,params);var imgCanvas=document.createElement("canvas");imgCanvas.width=width;imgCanvas.height=height;var imgContext=imgCanvas.getContext("2d");var hsContext=null;var src0=(display_filter)?(bdst):(src);imgContext.putImageData(new ImageData(src0,width,height),0,0);var Hough=HoughTransform(width,height,360,acc_threshold,draw_lines,imgContext,hsContext,console);foreach_pixel(ym,(height-yx),xm,(width-xx),width,height,function(x,y,i){if(bdst[i]===255)Hough.Acc(x,y)});Hough.extract(extract);var imgData=imgContext.getImageData(0,0,width,height);dst.set(imgData.data)},blue_fe:function(src,dst,width,height,params){foreach_pixel(0,height,0,width,width,height,function(x,y,i){dst[i+0]=0;dst[i+1]=0;dst[i+2]=src[i+2];dst[i+3]=255})},blue_fl:function(src,dst,width,height,params){for(var i=0;i0)){videoTracks.forEach(function(track){if((track.enabled)&&(track.getSettings)){var settings=track.getSettings();if(settings){results[results.length]=settings}}})}}return results};this.getEnabledVideoTracksSettings=function(){return _getEnabledVideoTracksSettings(_stream)};var constraints={audio:false,video:{facingMode:"environment"}};this.selectVideoInput=function(deviceId){if(deviceId){constraints={audio:false,video:{deviceId:{exact:deviceId}}}}else{constraints={audio:false,video:true}}};var onThen=function(stream){stream.getTracks().forEach(function(track){if(track.getCapabilities){console.log(track.getCapabilities())}});_stream=stream;_videoRequestPending=false;_videoAvailable=true;if(undefined===_video.srcObject){_video.src=navigator.__getStream(stream)}else{_video.srcObject=stream}if(onload){_video.addEventListener("loadedmetadata",function(){onload()},false)}update()};var onCatch=function(e){alert("navigator.getUserMedia error: "+e);alert('Webcam error!',e);if(onerror){onerror(e)}};this.start=function(){cancelPendingAnimationFrameRequest();_doUpdate=true;if(_stream){update()}else{if((!_videoRequestPending)&&(!_stream)){_videoRequestPending=true;console.log(constraints.video);var promise=navigator.__getUserMedia(constraints,onThen,onCatch);console.log("promise : "+promise);if((promise)&&(promise.then)){promise.then(onThen).catch(onCatch)}}}};this.stop=function(){cancelPendingAnimationFrameRequest();if(_stream){if(_stream.getTracks){_stream.getTracks().forEach(function(track){track.stop()})}else{_stream.stop()}_doUpdate=false;if(undefined===_video.srcObject){_video.src=""}else{_video.srcObject=null}_stream=null}};this.pause=function(){cancelPendingAnimationFrameRequest();_doUpdate=false};this.isAvailable=function(){return _videoAvailable};var lastTime=new Date().getTime();var elapsedTime=0;var fps=0;var frameCount=0;var updateFPS=function(){var now=new Date().getTime();frameCount++;elapsedTime+=(now-lastTime);lastTime=now;if(elapsedTime>=1000){fps=frameCount;frameCount=0;elapsedTime-=1000;var fpsElement=document.getElementById('fps');if(fpsElement){fpsElement.innerHTML=fps}}};var update=function(){if(_doUpdate){render();updateFPS();_requestId=requestAnimFrame(update)}};var _sx=0;var _sy=0;var _2sx=0;var _2sy=0;var iOS=/iPad|iPhone|iPod/.test(window.navigator.userAgent)&&!window.MSStream;var _ios_sx=0;var _ios_sy=0;var _ios_scx=0;var _ios_scy=0;var crop=true;var isReadyForCapture=false;var readyForCapture=function(){if((0===_video.videoWidth)||(0===_video.videoHeight)){return false}else{console.log("declared:[ "+_video.width+" , "+_video.height+" ], intrinsic:[ "+_video.videoWidth+" , "+_video.videoHeight+" ]");if(crop){_ios_sx=0;_ios_sy=0;_ios_scx=_video.videoWidth;_ios_scy=_video.videoHeight;if(_video.videoWidth!==_video.width){_2sx=(_video.videoWidth-_video.width);_sx=_2sx/2;_ios_scx=_video.videoWidth;_ios_scy=(_video.height*_ios_scx)/_video.width;_ios_sy=(_video.height-_ios_scy)/2}if(_video.videoHeight!==_video.height){_2sy=(_video.videoHeight-_video.height);_sy=_2sy/2}}return true}};window.addEventListener("orientationchange",function(){isReadyForCapture=false});var getVideoFrameImageData=function(){if(!isReadyForCapture){isReadyForCapture=readyForCapture();return null}_canvas.width=_video.width;_canvas.height=_video.height;_context.clearRect(0,0,_canvas.width,_canvas.height);if(crop){if(iOS){_context.drawImage(_video,_ios_sx,_ios_sy,_ios_scx,_ios_scy,0,0,_canvas.width,_canvas.height)}else{_context.drawImage(_video,_sx,_sy,_video.width,_video.height,0,0,_canvas.width,_canvas.height)}}else{_context.drawImage(_video,0,0,_video.videoWidth,_video.videoHeight,0,0,_canvas.width,_canvas.height)}var sourceData=_context.getImageData(0,0,_canvas.width,_canvas.height);return{data:sourceData,width:_canvas.width,height:_canvas.height}};var render=function(){if(_outputs.length>0){var sourceFrame=getVideoFrameImageData();if(null!==sourceFrame){for(var i=0;i<_outputs.length;i++){_outputs[i].videoIn(_this,sourceFrame)}}}}}function WebMSource(parent,onload,onerror){var _video=(typeof parent==="string")?(document.getElementById(parent)):(parent);var _canvas=document.createElement("canvas");var _context=_canvas.getContext('2d');_context.imageSmoothingEnabled=false;_context.globalCompositeOperation="copy";_context.globalAlpha=1.0;var _requestId=0;var _outputs=[];var _this=this;this.addOutput=function(output){_outputs[_outputs.length]=output};_canvas.width=_video.width;_canvas.height=_video.height;var cancelPendingAnimationFrameRequest=function(){if(0!==_requestId){console.log("current animation request : "+_requestId);cancelAnimationFrame(_requestId);_requestId=0}};function draw(){if(_video.paused||_video.ended)return false;_context.clearRect(0,0,_canvas.width,_canvas.height);_context.drawImage(_video,0,0,_canvas.width,_canvas.height);var sourceData=_context.getImageData(0,0,_video.width,_video.height);var sourceFrame={data:sourceData,width:_video.width,height:_video.height};for(var j=0;j<_outputs.length;j++){_outputs[j].videoIn(_this,sourceFrame)}_requestId=requestAnimFrame(draw)}var initialize=function(){window.requestAnimFrame=(function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(callback,1000/30)}})()};initialize();_video.addEventListener('play',function(){draw()},false);this.start=function(){cancelPendingAnimationFrameRequest();_video.play()};this.stop=function(){cancelPendingAnimationFrameRequest();_video.pause()}}var database={};database.cubes={};database.cubes.traditional={};database.cubes.traditional.faces={U:{id:0,name:"U",html_color:"#FFFFFF",thresholds:{hue:240,saturation:2,value:80,hue_tolerance:160,saturation_tolerance:20,value_tolerance:20,},},D:{id:1,name:"D",html_color:"#FFFF00",thresholds:{hue:60,saturation:40,value:100,hue_tolerance:20,saturation_tolerance:30,value_tolerance:100,},},F:{id:2,name:"F",html_color:"#FF0000",thresholds:{hue:345,saturation:100,value:100,hue_tolerance:10,saturation_tolerance:30,value_tolerance:100,},},B:{id:4,name:"B",html_color:"#FF8000",thresholds:{hue:15,saturation:80,value:100,hue_tolerance:20,saturation_tolerance:20,value_tolerance:60,},},L:{id:5,name:"L",html_color:"#008000",thresholds:{hue:140,saturation:60,value:50,hue_tolerance:20,saturation_tolerance:30,value_tolerance:100,},},R:{id:3,name:"R",html_color:"#0000FF",thresholds:{hue:240,saturation:100,value:65,hue_tolerance:25,saturation_tolerance:30,value_tolerance:20,},},};database.cubes.CMYK={};database.cubes.CMYK.faces={U:{id:0,name:"U",html_color:"#FFFFFF",thresholds:{hue:240,saturation:2,value:80,hue_tolerance:160,saturation_tolerance:20,value_tolerance:20,},},D:{id:1,name:"D",html_color:"#F4E758",thresholds:{hue:70,saturation:40,value:100,hue_tolerance:15,saturation_tolerance:10,value_tolerance:20,},},F:{id:2,name:"F",html_color:"#D8127D",thresholds:{hue:340,saturation:85,value:50,hue_tolerance:10,saturation_tolerance:15,value_tolerance:30,},},B:{id:4,name:"B",html_color:"#E88D37",thresholds:{hue:10,saturation:50,value:80,hue_tolerance:10,saturation_tolerance:10,value_tolerance:20,},},L:{id:5,name:"L",html_color:"#89BC4E",thresholds:{hue:130,saturation:60,value:80,hue_tolerance:20,saturation_tolerance:15,value_tolerance:15,},},R:{id:3,name:"R",html_color:"#3D9FCA",thresholds:{hue:200,saturation:70,value:70,hue_tolerance:10,saturation_tolerance:15,value_tolerance:20,},},};database.cubes.nexus7={};database.cubes.nexus7.faces={U:{id:0,name:"U",html_color:"#FFFFFF",thresholds:{hue:240,saturation:2,value:80,hue_tolerance:160,saturation_tolerance:20,value_tolerance:100,},},D:{id:1,name:"D",html_color:"#FFFF00",thresholds:{hue:62,saturation:50,value:81,hue_tolerance:15,saturation_tolerance:20,value_tolerance:100,},},F:{id:2,name:"F",html_color:"#FF0000",thresholds:{hue:359,saturation:65,value:65,hue_tolerance:10,saturation_tolerance:20,value_tolerance:100,},},B:{id:4,name:"B",html_color:"#FF8000",thresholds:{hue:28,saturation:60,value:87,hue_tolerance:15,saturation_tolerance:20,value_tolerance:100,},},L:{id:5,name:"L",html_color:"#008000",thresholds:{hue:143,saturation:80,value:45,hue_tolerance:20,saturation_tolerance:20,value_tolerance:100,},},R:{id:3,name:"R",html_color:"#0000FF",thresholds:{hue:218,saturation:85,value:47,hue_tolerance:20,saturation_tolerance:20,value_tolerance:100,},},};database.cubes.nexus7CMYK={};database.cubes.nexus7CMYK.faces={U:{id:0,name:"U",html_color:"#FFFFFF",thresholds:{hue:240,saturation:2,value:80,hue_tolerance:160,saturation_tolerance:20,value_tolerance:100,},},D:{id:1,name:"D",html_color:"#F4E758",thresholds:{hue:75,saturation:61,value:92,hue_tolerance:15,saturation_tolerance:10,value_tolerance:100,},},F:{id:2,name:"F",html_color:"#D8127D",thresholds:{hue:357,saturation:50,value:84,hue_tolerance:10,saturation_tolerance:15,value_tolerance:100,},},B:{id:4,name:"B",html_color:"#E88D37",thresholds:{hue:17,saturation:45,value:80,hue_tolerance:10,saturation_tolerance:10,value_tolerance:100,},},L:{id:5,name:"L",html_color:"#89BC4E",thresholds:{hue:129,saturation:63,value:79,hue_tolerance:20,saturation_tolerance:15,value_tolerance:100,},},R:{id:3,name:"R",html_color:"#3D9FCA",thresholds:{hue:180,saturation:85,value:66,hue_tolerance:10,saturation_tolerance:15,value_tolerance:100,},},};database.cubes.nexus7CMYKWB={};database.cubes.nexus7CMYKWB.faces={U:{id:0,name:"U",html_color:"#FFFFFF",thresholds:{hue:240,saturation:2,value:80,hue_tolerance:160,saturation_tolerance:20,value_tolerance:100,},},D:{id:1,name:"D",html_color:"#F4E758",thresholds:{hue:72,saturation:50,value:50,hue_tolerance:15,saturation_tolerance:50,value_tolerance:50,},},F:{id:2,name:"F",html_color:"#D8127D",thresholds:{hue:352,saturation:50,value:50,hue_tolerance:10,saturation_tolerance:50,value_tolerance:50,},},B:{id:4,name:"B",html_color:"#E88D37",thresholds:{hue:13,saturation:50,value:50,hue_tolerance:10,saturation_tolerance:50,value_tolerance:50,},},L:{id:5,name:"L",html_color:"#89BC4E",thresholds:{hue:121,saturation:50,value:50,hue_tolerance:20,saturation_tolerance:50,value_tolerance:50,},},R:{id:3,name:"R",html_color:"#3D9FCA",thresholds:{hue:200,saturation:50,value:50,hue_tolerance:15,saturation_tolerance:50,value_tolerance:50,},},};(typeof Cube=="object")||(function(){window.Cube={worker:new Worker("./CubeWorker.js"),tablesGenerated:false,movesetToArray:function(solution){var moves=solution.split(" ");var arr=[];for(var i=0;iCube.colorIndexes[b]){return 1}return 0}).join("")},autocompleteCube:function(cube){return Cube.arrToCube(Cube.autocompleteArray(Cube.cubeToArr(cube)))},autocompleteArray:function(arrIn){var current=JSON.parse(JSON.stringify(arrIn));var oldCube;do{oldCube=JSON.parse(JSON.stringify(current));current=Cube.autocompleteEdge(current)}while(Cube.arrToCube(current)!=Cube.arrToCube(oldCube));do{oldCube=JSON.parse(JSON.stringify(current));current=Cube.autocompleteCorner(current)}while(Cube.arrToCube(current)!=Cube.arrToCube(oldCube));return current},autocompleteEdge:function(arrIn){var arr=JSON.parse(JSON.stringify(arrIn));var completedEdges=[];for(var i=0;i<6;i++){for(var j=0;j<3;j++){for(var k=(1-j%2);k<3;k+=2){var thisFacelet=arr[i][j][k];if(thisFacelet=="_"){continue}var ofc=Cube.getAdjacentFacelets(i,j,k)[0];var opposingFacelet=arr[ofc[0]][ofc[1]][ofc[2]];if(opposingFacelet=="_"){continue}var edge=Cube.orderColors(thisFacelet,opposingFacelet);if(completedEdges.indexOf(edge)==-1){completedEdges.push(edge)}}}}for(var i=0;i<6;i++){for(var j=0;j<3;j++){for(var k=(1-j%2);k<3;k+=2){var thisFacelet=arr[i][j][k];if(thisFacelet!="_"){continue}var ofc=Cube.getAdjacentFacelets(i,j,k)[0];var opposingFacelet=arr[ofc[0]][ofc[1]][ofc[2]];var edge=Cube.orderColors(thisFacelet,opposingFacelet);if(opposingFacelet=="_"){continue}var possibleColors=[];for(var l=0;l0)?(2):(1);var stepType=step.substring(0,1);if(step.indexOf("'")===1){_reverseAction=stepType;_action=stepType+'i'}else{_reverseAction=stepType+'i';_action=stepType}if(_count===2){_reverseAction=_reverseAction+","+_reverseAction;_action=_action+","+_action}this.getActionList=function(reverse){if(reverse){return _reverseAction}else{return _action}}}var _parent=(typeof parent==="string")?(document.getElementById(parent)):(parent);var _solution;var _moves=[];var _currentMove=0;var _animating=false;var _stickers=null;var resetButton=document.getElementById(controlIds[0]);var stepBackButton=document.getElementById(controlIds[1]);var playButton=document.getElementById(controlIds[2]);var stepForwardButton=document.getElementById(controlIds[3]);var pauseButton=document.getElementById(controlIds[4]);var enableButtons=function(){resetButton.disabled=(_currentMove>0)?(false):(true);stepBackButton.disabled=(_currentMove>0)?(false):(true);stepForwardButton.disabled=(_currentMove<(_moves.length))?(false):(true);playButton.disabled=(_currentMove<(_moves.length))?(false):(true);pauseButton.disabled=true};this.disablePlayerControls=function(){resetButton.disabled=true;stepBackButton.disabled=true;stepForwardButton.disabled=true;playButton.disabled=true;pauseButton.disabled=true};this.enablePlayerControls=function(){enableButtons()};this.setStatus=function(s){_parent.innerHTML=s};var setMove=function(n){var div=_parent;if(div){for(var i=0;i0){_currentMove--;_animating=true;playReverseStep(rubik,_currentMove)}}};this.play=function(rubik){this.disablePlayerControls();if(!_animating){rubik.onAnimationComplete(function(){if(_currentMove<(_moves.length)){setMove(_currentMove);playStep(rubik,_currentMove);_currentMove++}else{rubik.onAnimationComplete(null);_animating=false;enableButtons()}});_animating=true;pauseButton.disabled=false;if(_currentMove<(_moves.length)){setMove(_currentMove);_animating=true;playStep(rubik,_currentMove);_currentMove++}}};this.pause=function(rubik){this.disablePlayerControls();if(_animating){rubik.onAnimationComplete(function(){setMove(_currentMove);_animating=false;enableButtons()})}};this.reset=function(rubik){this.disablePlayerControls();if(!_animating){if(_stickers){rubik.setString(_stickers)}_currentMove=0;setMove(_currentMove);this.enablePlayerControls()}}}var solutionAnimator=new SolutionAnimator(output,controlIds);return{setBgColor:function(color){rubik.setBgColor(color)},disable:function(){solutionAnimator.disablePlayerControls()},reset:function(){solutionAnimator.reset(rubik)},play:function(){solutionAnimator.play(rubik)},pause:function(){solutionAnimator.pause(rubik)},stepBack:function(){solutionAnimator.playReverse(rubik)},stepForward:function(){solutionAnimator.playNext(rubik)},scramble:function(){solutionAnimator.disablePlayerControls();rubik.scramble();rubik.syncU(false);rubik.syncF(false);solutionAnimator.setStatus("click solve to continue")},scrambleLive:function(moves){solutionAnimator.disablePlayerControls();rubik.resetCube();rubik.syncU(false);rubik.syncF(false);solutionAnimator.buildSolutionGraphic(moves);solutionAnimator.creatMoves(moves);solutionAnimator.enablePlayerControls();solutionAnimator.getActionList()},setString:function(stickers){solutionAnimator.disablePlayerControls();rubik.resetCube();rubik.setString(stickers);rubik.syncU(false);rubik.syncF(false);rubik.repaint();solutionAnimator.setStatus("click solve to continue")},solveCube:function(params){params=params||{};var _solvCube=function(params){var cube=rubik.getURFDLB();var maxmoves=20;var maxtime=(params.maxtime)||20;solutionAnimator.disablePlayerControls();solutionAnimator.setStatus("verifying...");Cube.verifyCube(cube,function(result){if(result===0){solutionAnimator.setStatus("solving...");Cube.solveCube(cube,function(result){solutionAnimator.saveAppletState(rubik);solutionAnimator.buildSolutionGraphic(result);solutionAnimator.creatMoves(result);solutionAnimator.enablePlayerControls();result=solutionAnimator.getActionList()},function(result){var message;switch(result){case 1:message="There is not exactly one facelet of each color";break;case 2:message="Not all 12 edges exist exactly once";break;case 3:message="Flip error: One edge has to be flipped";break;case 4:message="Not all corners exist exactly once";break;case 5:message="Twist error: One corner has to be twisted";break;case 6:message="Parity error: Two corners or two edges have to be exchanged";break;case 7:message="No solution exists in "+maxmoves+" number of moves or less";break;case 8:message="Timed out; No solution found within "+maxtime+" seconds";break;default:message="Unknown error";break}solutionAnimator.setStatus("solveCube error ["+result+"]:
"+message)},null,maxmoves,maxtime)}else{var message;switch(result){case 1:message="There is not exactly one face of each color";break;case 2:message="Not all 12 edges exist exactly once";break;case 3:message="Flip error: One edge has to be flipped";break;case 4:message="Not all corners exist exactly once";break;case 5:message="Twist error: One corner has to be twisted";break;case 6:message="Parity error: Two corners or two edges have to be exchanged";break;default:message="Unknown error";break}solutionAnimator.setStatus("verifyCube error ["+result+"]:
"+message)}})};rubik.syncU(true,function(){rubik.syncF(true,function(){rubik.repaint();_solvCube(params)})})},}};var RubikApp=RubikApp||{};$(document).ready(function(){var scale=1.0;var doScale=true;var fitClient=function(width,height){if((width>0)&&(height>0)){var size=(((width>0):(height);var rubik=new Rubik("applet");rubik.setParameter("height",height.toString(10));rubik.setParameter("bgColor","#eee");rubik.init();RubikApp.rubik=rubik}else{alert("Could not find JavaScript library rubik.js")}var solverApp=SolverApp(RubikApp.rubik,"outputText",["reset","step-back","play","step-forward","pause"]);var virtualCubeMap=new VirtualCubeMap(solverApp,function(i){switch(i){case 0:return"#FFFFFF";case 1:return"#FFFF00";case 2:return"#FF0000";case 3:return"#0000FF";case 4:return"#FF6400";case 5:return"green";default:return"#000000"}});var scannerComponent=(function(virtualCubeMap,controlIds,outputIds){var selectMap=[FACE_U,FACE_D,FACE_F,FACE_B,FACE_L,FACE_R];var buildSideUpMap=function(scanSideMap){var map=[];for(var i=0;i=(r-errors[0]))&&(h<=(r+errors[0])))};this.isAlmost=function(h,s,v){return((FilterUtils.is_almost(h,hsv[0],errors[0]))&&(FilterUtils.is_almost(s,hsv[1],errors[1]))&&(FilterUtils.is_almost(v,hsv[2],errors[2])))};this.isColor=function(h,s,v){var result=false;if(_min[0]<0){if((((h>=(360+_min[0]))||(h<=_max[0])))&&((s>=hsv[1])&&(v>=hsv[2]))){result=true}}else{if((((h>=_min[0])&&(h<=_max[0])))&&((s>=hsv[1])&&(v>=hsv[2]))){result=true}}return result};this.setHue=function(value){hsv[0]=value;_min[0]=hsv[0]-errors[0];_max[0]=hsv[0]+errors[0]};this.getHue=function(value){return hsv[0]};this.setHueTolerance=function(value){errors[0]=value;_min[0]=hsv[0]-errors[0];_max[0]=hsv[0]+errors[0]};this.getHueTolerance=function(){return errors[0]};this.setSaturation=function(value){hsv[1]=value;_min[1]=hsv[1]-errors[1];_max[1]=hsv[1]+errors[1]};this.getSaturation=function(value){return hsv[1]};this.setSaturationTolerance=function(value){errors[1]=value;_min[1]=hsv[1]-errors[1];_max[1]=hsv[1]+errors[1]};this.getSaturationTolerance=function(){return errors[1]};this.setValue=function(value){hsv[2]=value;_min[2]=hsv[2]-errors[2];_max[2]=hsv[2]+errors[2]};this.getValue=function(value){return hsv[2]};this.setValueTolerance=function(value){errors[2]=value;_min[2]=hsv[2]-errors[2];_max[2]=hsv[2]+errors[2]};this.getValueTolerance=function(){return errors[2]};this.getHTMLColor=function(){return htmlColor};this.setHTMLColor=function(value){htmlColor=value}}var makeSticker=function(face){var result=new Sticker(face.name,face.html_color,[face.thresholds.hue,face.thresholds.saturation,face.thresholds.value],[face.thresholds.hue_tolerance,face.thresholds.saturation_tolerance,face.thresholds.value_tolerance]);return result};var _sticker=makeSticker(face);this.getId=function(){return face.id};this.getName=function(){return face.name};this.getHTMLColor=function(){return _sticker.getHTMLColor()};this.isColor=function(h,s,v){return _sticker.isColor(h,s,v)};this.isAlmost=function(h,s,v){return _sticker.isAlmost(h,s,v)};var CalibrationModule=function(face){var tag=face.name.toLowerCase();var color=document.getElementById(tag+"Color");var target=document.getElementById(tag+"Target");var calibrate=document.getElementById(tag+"Calibrate");var parameters=document.getElementById(tag+"Parameters");var th=parameters.querySelectorAll('[name="hue"]')[0];var ts=parameters.querySelectorAll('[name="saturation"]')[0];var tv=parameters.querySelectorAll('[name="value"]')[0];var tht=parameters.querySelectorAll('[name="hue_tolerance"]')[0];var tst=parameters.querySelectorAll('[name="saturation_tolerance"]')[0];var tvt=parameters.querySelectorAll('[name="value_tolerance"]')[0];var updateStickerHtmlColor=function(){var h=_sticker.getHue();var s=_sticker.getSaturation();var v=_sticker.getValue();var html=ColorTools.hsv2ToHtml(h,s,v);color.value=html;_sticker.setHTMLColor(html);rubik.setSideColorHTML(face.id,html);rubik.repaint()};var hsv=[0,0,0];function doCalibrate(rgb){var html=ColorTools.rgbToHtml(rgb[0],rgb[1],rgb[2]);html=ColorTools.rgbStringToHex(html);var hsv=ColorTools.rgbToHsv2(rgb[0],rgb[1],rgb[2]);var h=hsv[0];var s=hsv[1];var v=hsv[2];th.value=h;ts.value=s;tv.value=v;_sticker.setHue(h);_sticker.setSaturation(s);_sticker.setValue(v);updateStickerHtmlColor()}if(color){color.value=face.html_color}if(calibrate){calibrate.onclick=function(event){stopVideo();if(calibrate.innerHTML==="accept"){var rgb=boxFilterParams.boxes[0].getColor();doCalibrate(rgb);boxFilterParams.boxes=_scanboxes;calibrate.innerHTML="calibrate"}else{boxFilterParams.boxes=_calibratebox;calibrate.innerHTML="accept"}startVideo()}}if(color){color.onchange=function(){var hsv=ColorTools.htmlToHsv(color.value);var h=hsv[0];var s=hsv[1];var v=hsv[2];th.value=h;ts.value=s;tv.value=v}}if(th){th.value=face.thresholds.hue;th.onchange=function(){var value=parseInt(event.currentTarget.value,10);_sticker.setHue(value);updateStickerHtmlColor()}}if(ts){ts.value=face.thresholds.saturation;ts.onchange=function(){var value=parseInt(event.currentTarget.value,10);_sticker.setSaturation(value);updateStickerHtmlColor()}}if(tv){tv.value=face.thresholds.value;tv.onchange=function(){var value=parseInt(event.currentTarget.value,10);_sticker.setValue(value);updateStickerHtmlColor()}}if(tht){tht.value=face.thresholds.hue_tolerance;tht.onchange=function(event){var value=parseInt(event.currentTarget.value,10);_sticker.setHueTolerance(value)}}if(tst){tst.value=face.thresholds.saturation_tolerance;tst.onchange=function(event){var value=parseInt(event.currentTarget.value,10);_sticker.setSaturationTolerance(value)}}if(tvt){tvt.value=face.thresholds.value_tolerance;tvt.onchange=function(event){var value=parseInt(event.currentTarget.value,10);_sticker.setValueTolerance(value)}}this.calibrate=function(rgb,ht,st,vt){if(ht){tht.value=ht;_sticker.setHueTolerance(ht)}if(st){tst.value=st;_sticker.setSaturationTolerance(st)}if(vt){tvt.value=vt;_sticker.setValueTolerance(vt)}doCalibrate(rgb)}};var calibrationControls=new CalibrationModule(face);this.calibrate=function(rgb,ht,st,vt){calibrationControls.calibrate(rgb,ht,st,vt)};rubik.setSideColorHTML(face.id,face.html_color);rubik.repaint()}var cube3dsides=["U","D","F","R","B","L"];var createFaces=function(rubik,configuration,sidesOrdering){var faces=[];for(var i=0;i<6;i++){var face=configuration.faces[sidesOrdering[i]];faces[i]=new Face(rubik,face)}return faces};var configuration=database.cubes.traditional;var _faces=createFaces(RubikApp.rubik,configuration,cube3dsides);var selectConfiguration=function(){var configuration=database.cubes.traditional;var select=document.getElementById("configuration");if(select){var i=parseInt(select.value,10);switch(i){case 1:{configuration=database.cubes.CMYK}break;case 2:{configuration=database.cubes.nexus7}break;case 3:{configuration=database.cubes.nexus7CMYK}break;case 4:{configuration=database.cubes.nexus7CMYKWB}break;default:break}_faces=createFaces(rubik,configuration,cube3dsides)}};var getFaceFromHSV=function(faces,hsv){var face=null;var perm=[1,4,2,3,5,0];for(var j=0;j<6;j++){var k=perm[j];if(faces[k].isAlmost(hsv[0],hsv[1],hsv[2])){face=faces[k];break}}return face};function makeScanMessage(i){var _scanColor=_faces[scanSideMap[i]].getHTMLColor();var _upColor=_faces[scanUpSideMap[i]].getHTMLColor();var s=document.createElement('span');s.className="square";s.style.background=_scanColor;var u=document.createElement('span');u.className="square";u.style.background=_upColor;return"Ready to scan "+s.outerHTML+" side ( "+u.outerHTML+" side facing up)."}function setScanStatus(s){var status=document.getElementById("scanning-status");status.innerHTML=s}function updateScanStatus(i){setScanStatus(makeScanMessage(i))}var faceIds=[-1,-1,-1,-1,-1,-1,-1,-1,-1];var onScanComplete=function(){videoSource.pause();setTimeout(function(){var onConfirm=function(){PopUpManager.closePopUp('confirm-scan');virtualCubeMap.updateVirtualCube();currentScanSide++;if(currentScanSide<6){updateScanStatus(currentScanSide);faceIds=[-1,-1,-1,-1,-1,-1,-1,-1,-1];videoSource.start()}else{currentScanSide=0;setScanStatus("Scanning complete. Start to begin again.");stopVideo();var tab=document.querySelector('[data-rel="view2"]');if(tab){tab.click();var theApp=document.getElementById("the-app");if(theApp){theApp.scrollIntoView()}}}};var onCancel=function(){PopUpManager.closePopUp('confirm-scan');videoSource.start()};PopUpManager.displayPopUp('confirm-scan',function(){var confirm=document.getElementById("confirm-confirm");var cancel=document.getElementById("confirm-cancel");confirm.onclick=onConfirm;cancel.onclick=onCancel;var getTileClickHandler=function(element,sideId,stickerId){return function(){PopUpManager.displayPopUp('select-color',function(){var getTileClickHandler=function(faceId){return function(){element.style.background=_faces[faceId].getHTMLColor();virtualCubeMap.getSide(sideId).getSticker(stickerId).setColor(faceId);PopUpManager.closePopUp('select-color')}};var selctTiles=[];for(var i=0;i<6;i++){selctTiles[i]=document.getElementById("s"+i);selctTiles[i].style.background=_faces[selectMap[i]].getHTMLColor();selctTiles[i].onclick=getTileClickHandler(selectMap[i])}})}};var confirmTiles=[];for(var i=0;i<9;i++){confirmTiles[i]=document.getElementById("C0"+i);if(-1!==faceIds[i]){confirmTiles[i].style.background=_faces[faceIds[i]].getHTMLColor()}else{faceIds[i]=scanSideMap[currentScanSide];confirmTiles[i].style.background=_faces[faceIds[i]].getHTMLColor()}if(4!==i){var sideMapIndex=sideMap.indexOf(scanSideMap[currentScanSide]);confirmTiles[i].onclick=getTileClickHandler(confirmTiles[i],sideMapIndex,i)}}confirm.focus()})},500)};var updateColorsOnTimer=function(colors,boxFilterParams){var pl=function(v){return(" "+v).substr(-3)};var nl=function(){return unescape(" ")};var setOutputColor=function(output,rgb,hsv,faceName){var r=rgb[0];var g=rgb[1];var b=rgb[2];var h=hsv[0];var s=hsv[1];var v=hsv[2];var css="rgb("+r+","+g+","+b+")";var content="r:"+pl(r)+" h:"+pl(h)+nl()+"g:"+pl(g)+" s:"+pl(s)+nl()+"b:"+pl(b)+" v:"+pl(v)+nl()+"sticker: "+faceName;output.style.background=ColorTools.rgbToHtml(r,g,b);output.innerHTML="
"+content+"
"};var ctx=boxFilterParams.overlay_context;ctx.clearRect(0,0,360,360);var drawBox=function(i,c){if(ctx){var box=boxFilterParams.boxes[i];if(box){var rect=box.rect;var x=rect[0]+boxFilterParams.originX-10;var y=rect[1]+boxFilterParams.originY-10;var w=rect[2]-rect[0]+20;var h=rect[3]-rect[1]+20;ctx.lineWidth=1;ctx.strokeStyle=c;ctx.strokeRect(x,y,w,h)}else{console.error("no box at "+i)}}};var maxRgb=boxFilterParams.maxAverager.getMaxColor();var maxHsv=ColorTools.rgbToHsv2(maxRgb[0],maxRgb[1],maxRgb[2]);setOutputColor(outputs[9],maxRgb,maxHsv,"N/A");if(colors.length===1){for(var j=0;j<9;j++){if(outputs[j]){if(j===4){setOutputColor(outputs[j],colors[0],ColorTools.rgbToHsv2(colors[0][0],colors[0][1],colors[0][2]),"N/A")}else{setOutputColor(outputs[j],[0,0,0],[0,0,0],"N/A")}}}}else{var found=[];var faceName=[];var faceColor=[];for(var i=0;i(rect[0]-a))&&(x<(rect[2]+a))&&(y>(rect[1]-a))&&(y<(rect[3]+a)))};var domRect=e.target.getBoundingClientRect();var x=(e.clientX-domRect.left)/scale-boxFilterParams.originX;var y=(e.clientY-domRect.top)/scale-boxFilterParams.originY;var popUpCalibrate=function(box){videoSource.pause();PopUpManager.displayPopUp('calibrate-tile',function(){var sample=document.getElementById("sample");var rgb=box.getColor();var hsv=ColorTools.rgbToHsv2(rgb[0],rgb[1],rgb[2]);var sh=document.getElementById("sample-h");if(sh)sh.innerHTML=hsv[0];var ss=document.getElementById("sample-s");if(ss)ss.innerHTML=hsv[1];var sv=document.getElementById("sample-v");if(sv)sv.innerHTML=hsv[2];var html=ColorTools.rgbToHtml(rgb[0],rgb[1],rgb[2]);sample.style.background=html;var onWhiteBalance=function(){boxFilterParams.balancer.setRgb(rgb[0],rgb[1],rgb[2]);PopUpManager.closePopUp('calibrate-tile');videoSource.start()};var onWhiteBalanceOff=function(){boxFilterParams.balancer.setRgb(255,255,255);PopUpManager.closePopUp('calibrate-tile');videoSource.start()};var onCancel=function(){PopUpManager.closePopUp('calibrate-tile');videoSource.start()};var getTileClickHandler=function(element,faceId){return function(){_faces[faceId].calibrate(rgb,15,15,50);onCancel()}};var confirmTiles=[];for(var i=0;i<6;i++){confirmTiles[i]=document.getElementById("o"+i);confirmTiles[i].style.background=_faces[selectMap[i]].getHTMLColor();confirmTiles[i].onclick=getTileClickHandler(confirmTiles[i],selectMap[i])}var wb=document.getElementById("calibrate-whitebalance");var wbo=document.getElementById("calibrate-whitebalance-off");var cancel=document.getElementById("calibrate-cancel");wb.onclick=onWhiteBalance;wbo.onclick=onWhiteBalanceOff;cancel.onclick=onCancel;cancel.focus()})};for(var i=0;i0)){currentDeviceId=settings[0].deviceId;console.log("Current Video device : "+currentDeviceId)}var i=0;select.innerHTML="";devices.forEach(function(device){if('videoinput'===device.kind){console.log(device.kind+": "+device.label+" id = "+device.deviceId);var option=document.createElement("option");option.innerHTML=(device.label)?(device.label):(device.kind+" #"+(++i));option.value=device.deviceId;if(device.deviceId===currentDeviceId){option.selected=true}select.appendChild(option)}})}).catch(function(err){console.log(err.name+": "+err.message)})}}};var videoSource=new VideoSource("video-source",function(){updateScanStatus(currentScanSide);refreshDeviceList(videoSource,"select-webcam")});var select=document.getElementById("select-webcam");if(select){select.onchange=function(){console.log(select.value);stopVideo();videoSource.stop();videoSource.selectVideoInput(select.value);startVideo()};refreshDeviceList(videoSource,"select-webcam")}var videoMonitor=new VideoMonitor("canvas-viewport");videoSource.addOutput(boxFilter);boxFilter.addOutput(videoMonitor);videoMonitor.setOrigin(boxFilterParams.originX,boxFilterParams.originY);var startButton=document.getElementById(controlIds[0]);var stopButton=document.getElementById(controlIds[1]);var wbButton=document.getElementById(controlIds[2]);wbButton.focus();var startVideo=function(){if(0===currentScanSide){rubik.resetCube();virtualCubeMap.updateVirtualCubeMapStickersArray(rubik);updateScanStatus(currentScanSide)}videoSource.start();startButton.disabled=true;stopButton.disabled=false;wbButton.disabled=false};var stopVideo=function(){startButton.disabled=false;wbButton.disabled=true;stopButton.disabled=true;videoSource.pause()};return{doWhiteBalance:function(){videoSource.pause();if(wbButton.innerHTML==="accept"){var color=boxFilterParams.boxes[0].getColor();boxFilterParams.balancer.setRgb(color[0],color[1],color[2]);boxFilterParams.boxes=_scanboxes;wbButton.innerHTML="white balance"}else{boxFilterParams.boxes=_calibratebox;boxFilterParams.autoBalance=false;boxFilterParams.balancer.setRgb(255,255,255);wbButton.innerHTML="accept"}videoSource.start()},startVideo:startVideo,stopVideo:stopVideo,selectConfiguration:selectConfiguration,onScanComplete:onScanComplete}})(virtualCubeMap,["start-video","stop-video","whitebalance"],["dt0","dt1","dt2","dt3","dt4","dt5","dt6","dt7","dt8","dt9"]);window.doWhiteBalance=function(){scannerComponent.doWhiteBalance()};window.startVideo=function(){scannerComponent.startVideo()};window.stopVideo=function(){scannerComponent.stopVideo()};window.selectConfiguration=function(){scannerComponent.selectConfiguration()};window.reset=function(){solverApp.reset()};window.pause=function(){solverApp.pause()};window.play=function(){solverApp.play()};window.stepBack=function(){solverApp.stepBack()};window.stepForward=function(){solverApp.stepForward()};window.onFromURFDLB=function(){var input=document.getElementById("URFDLB");if(input){var filter=function(s){s=s.trim();if(s.includes("yobwrg:")){s=s.replace("yobwrg:","");s=s.trim();s=s.replace(/L/g,"b");s=s.replace(/B/g,"r");s=s.replace(/R/g,"f");s=s.replace(/F/g,"l");return s.toUpperCase()}return s};input.value=filter(input.value.trim());var URFDLBToString=function(cube){if(54===cube.length){var test=cube;test=test.replace(/U/g,"");test=test.replace(/D/g,"");test=test.replace(/F/g,"");test=test.replace(/B/g,"");test=test.replace(/L/g,"");test=test.replace(/R/g,"");if(0===test.length){var permute=function(side,perm){var reversURFDLB={U:0,D:1,F:2,R:3,B:4,L:5};var s="{";s+=reversURFDLB[side[perm[0]]];for(var i=1;i<9;i++){s+=","+reversURFDLB[side[perm[i]]]}s+="}";return s};var uPerm=[6,7,8,3,4,5,0,1,2];var rPerm=[2,1,0,5,4,3,8,7,6];var s="stickers={";s+=permute(cube.substr(0,9),uPerm);s+=","+permute(cube.substr(27,9),uPerm);s+=","+permute(cube.substr(18,9),uPerm);s+=","+permute(cube.substr(9,9),uPerm);s+=","+permute(cube.substr(45,9),rPerm);s+=","+permute(cube.substr(36,9),uPerm);s+="}";return s}}return""};var stickers=URFDLBToString(input.value);if(stickers){RubikApp.rubik.setString(stickers);virtualCubeMap.updateVirtualCubeMapStickersArray(RubikApp.rubik)}else{solverApp.scrambleLive(input.value)}}};window.onScramble=function(){solverApp.scramble();virtualCubeMap.updateVirtualCubeMapStickersArray(RubikApp.rubik)};window.SolveCube=function(){var params={};var input=document.getElementById("maxtime");if(input){params.maxtime=input.value}solverApp.solveCube(params)};window.toggleDarkLight=function(){var body=document.body;var currentClass=body.className;body.className=currentClass=="dark-mode"?"light-mode":"dark-mode";solverApp.setBgColor((currentClass=="dark-mode")?("#eee"):("#222"))};solverApp.disable();var PopUpManager=(function(){var _popUps={};var _activeName=null;window.addEventListener("orientationchange",function(){doScale=true;if((_activeName)&&(_popUps.hasOwnProperty(_activeName))){_popUps[_activeName].fitWindow()}});return{addPopUp:function(name){var popUpElement=document.getElementById(name);if(popUpElement){var popUp=new Yaui.ModalBackground(popUpElement);_popUps[name]=popUp}else{alert("pop up element not found.")}},displayPopUp:function(name,onComplete){_activeName=name;_popUps[name].fitWindow();_popUps[name].showMiddle();if(onComplete){onComplete()}},closePopUp:function(name){_activeName=null;_popUps[name].hide()},}})();var initializePopups=function(){PopUpManager.addPopUp('confirm-scan');PopUpManager.addPopUp('calibrate-tile');PopUpManager.addPopUp('select-color')};initializePopups()});