var netscape = (document.layers) ? 1:0
var goodIE = (document.all) ? 1:0
var mozilla = (navigator.appCodeName=="Mozilla")? 1:0;

var imagedir="javascript/images/cube/";
var posit=new Array();
var cubwin;
var size,wid,hgh;
var stathgh=18; // height of a line of text below cube

function preload(){
	this.length=preload.arguments.length;
	for (var i=0;i<this.length;i++){
		this[i]=new Image();
		this[i].src=imagedir+preload.arguments[i];
	}
}
var pics=new preload(
	"uyellow.gif","ugreen.gif","uorange.gif","uwhite.gif","ublue.gif","ured.gif","ublank.gif",
	"ryellow.gif","rgreen.gif","rorange.gif","rwhite.gif","rblue.gif","rred.gif","rblank.gif",
	"lyellow.gif","lgreen.gif","lorange.gif","lwhite.gif","lblue.gif","lred.gif","lblank.gif");

function dostyle(x0,y0,dx1,dy1,dx2,dy2,i0){
	var i,j,str="";
	for(i=0;i<size;i++){
		for(j=0;j<size;j++){
			str+="#l"+(i0+i*size+j)+" {position:absolute; left:"+(x0+dx1*i+dx2*j)+"; top:"+(y0+dy1*i+dy2*j)+"; width:1;}\n";
		}
	}
	return(str);
}

function styles(){
	return( '<STYLE TYPE="text/css">\n'+
		dostyle(56*size-40,80*size-20,-28,14,28, 14,          0)+
		dostyle(         2,14*size-12,  0,33,28,-14,  size*size)+
		dostyle(84*size-26,	        2,  0,33,28, 14,2*size*size)+
		dostyle(56*size-40,19*size- 7,-28,14,28, 14,3*size*size)+
		dostyle(56*size-12,47*size-21,  0,33,28,-14,4*size*size)+
		dostyle(28*size-12,33*size- 7,  0,33,28, 14,5*size*size)+
		"#messform{position:absolute; left:0; top:"+(108*size-15)+"; width:"+wid+";}\n"+
		"<\/STYLE>"
	);
}

function dopattern(pat){
	//parse string pat and do move sequence it represents
	var pt=pat;
	var a,d,f,q,t;
	var str="";
	if( pt.charAt(0)=="_" ){
		// string denotes a pattern given by its facelets.
		for(a=0; a<6*size*size; a++){
			posit[a]="012345_".indexOf(pt.charAt(a+1))
		}
	}else{
		var qm=0, hm=0, sm=0;
		for(a=0;a<pt.length;a++){
			// read face to be moved
			d=0;
			f="DLBURFdlburf".indexOf(pt.charAt(a));
			if(f>=6) { f-=6; d+=1; }
			if(f>=0){
				// read move type (slice/centre)
				t=0;
				if(a+1<pt.length){
					t="samc".indexOf(pt.charAt(a+1)) +1;
					if(t>0)a++;
					else{t=0;}
				}
				// read move direction (quarter/half/inverse)
				q=1;
				if(a+1<pt.length){
					q="123'".indexOf(pt.charAt(a+1))+1;
					if(q>0)a++;
					else{q=1;}
				}

				// perform move
				str+="DLBURFdlburf".charAt(f+6*d);
				if(t>0) str+="samc".charAt(t-1);
				if(q>1) str+=" 2'".charAt(q-1);
				if( t==0 ){ 	//normal move
					domove(f,d,q);
					sm++;hm++;qm++;if(q==2)qm++;
				}else if( t==1 ){	//slice move
					domove(f,d,q); domove(f+3,d,4-q);
					sm++;hm+=2;qm+=2;if(q==2)qm+=2;
				}else if( t==2 ){	//anti-slice move
					domove(f,d,q); domove(f+3,d,q);
					sm++;hm+=2;qm+=2;if(q==2)qm+=2;
				}else if( t==3 && (size&1)!=0 ){	//middle slice
					domove(f,size>>1,q);
					sm++;hm+=2;qm+=2;if(q==2)qm+=2;
				}else if( t==4 ){	//whole cube
					for(d=0; d<size-1; d++) domove(f,d,q);
					domove(f+3,0,4-q);
				}
				str+=" ";
			}
		}
		str+="(";
		if(qm==hm) str+=qm; else str+=hm+","+qm+"q";
		if(sm!=hm) str+=","+sm+"s";
		str+=")";
	}
	return(str);
}
function displaypat(pat,nam){
	posit = new Array();
	var i,j,k=0;
	for( i=0; i<6; i++)
		for( j=0; j<size*size; j++)
			posit[k++]=i;
	var patstring="<center><font face='Arial' size=2>"+nam+dopattern(pat)+"<\/font><\/center>";
	cubwin.document.open();
	cubwin.document.write(
		"<HTML><HEAD><TITLE>Rubik's Cube Viewer<\/TITLE>"+
		styles()+
		"<\/head><body background='images/backgrnd/cubeback.gif'>\n"+
		display()+
		"<div id=messform>"+patstring+"<\/div>"+
		"<\/BODY><\/HTML>");
	cubwin.document.close();
}

function showpat(pat){
	var nam;
	if(netscape || goodIE || mozilla){
		if(showpat.arguments.length>1){
			size=showpat.arguments[1];
		}else size=3;
		wid=112*size-22;
		hgh=108*size;
		if(showpat.arguments.length>2){
			nam="<b>"+showpat.arguments[2]+"<\/b><br>";
			hgh+=stathgh;
		}else nam='';
		if( pat.charAt(0)!="_" ) hgh+=2*stathgh;
		cubwin=window.open("","cubewin","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,copyhistory=no,width="+wid+",height="+hgh);
		cubwin.resizeTo(wid+10,hgh+30); // resize in case window exists already. Note: frame width is 5.
		displaypat(pat,nam);
		cubwin.focus();
	}else{
		alert("You need a browser which supports layers\nand styles (e.g. Netscape 4+ or MSIE 5+)\nSorry!");
	}
}


function display(){
	var s='';
	var i,j,k=0;
	for(i=0;i<6;i++){
		for(j=0;j<size*size;j++){
			if	  (i==0 || i==3){
				s+="<div id=l"+k+"><img src='"+pics[posit[k]].src+"' width=58 height=29 border=0><\/div>\n";
			}else if(i==1 || i==4){
				s+="<div id=l"+k+"><img src='"+pics[7+posit[k]].src+"' width=30 height=48 border=0><\/div>\n";
			}else if(i==2 || i==5){
				s+="<div id=l"+k+"><img src='"+pics[14+posit[k]].src+"' width=30 height=48 border=0><\/div>\n";
			}
			k++;
		}
	}
	return(s);
}


function domove(f,d,q){
	//do move of face f, layer d, q quarter turns
	var f1,f2,f3,f4;
	var s2=size*size;
	var c,i,j,k;
	if(f>5)f-=6;
	// cycle the side facelets
	for(k=0; k<q; k++){
		for(i=0; i<size; i++){
			if(f==0){
				f1=6*s2-size*d-size+i;
				f2=2*s2-size*d-1-i;
				f3=3*s2-size*d-1-i;
				f4=5*s2-size*d-size+i;
			}else if(f==1){
				f1=3*s2+d+size*i;
				f2=3*s2+d-size*(i+1);
				f3=  s2+d-size*(i+1);
				f4=5*s2+d+size*i;
			}else if(f==2){
				f1=3*s2+d*size+i;
				f2=4*s2+size-1-d+size*i;
				f3=	 d*size+size-1-i;
				f4=2*s2-1-d-size*i;
			}else if(f==3){
				f1=4*s2+d*size+size-1-i;
				f2=2*s2+d*size+i;
				f3=  s2+d*size+i;
				f4=5*s2+d*size+size-1-i;
			}else if(f==4){
				f1=6*s2-1-d-size*i;
				f2=size-1-d+size*i;
				f3=2*s2+size-1-d+size*i;
				f4=4*s2-1-d-size*i;
			}else if(f==5){
				f1=4*s2-size-d*size+i;
				f2=2*s2-size+d-size*i;
				f3=s2-1-d*size-i;
				f4=4*s2+d+size*i;
			}
			c=posit[f1];
			posit[f1]=posit[f2];
			posit[f2]=posit[f3];
			posit[f3]=posit[f4];
			posit[f4]=c;
		}
		
		/* turn face */
		if(d==0){
			for(i=0; i+i<size; i++){
				for(j=0; j+j<size-1; j++){
					f1=f*s2+         i+         j*size;
					f3=f*s2+(size-1-i)+(size-1-j)*size;
					if(f<3){
						f2=f*s2+(size-1-j)+         i*size;
						f4=f*s2+         j+(size-1-i)*size;
					}else{
						f4=f*s2+(size-1-j)+         i*size;
						f2=f*s2+         j+(size-1-i)*size;
					}
					c=posit[f1];
					posit[f1]=posit[f2];
					posit[f2]=posit[f3];
					posit[f3]=posit[f4];
					posit[f4]=c;
				}
			}
		}
	}
}
/*
       19                32
   16           48           35
       31   60      51   44
   28     80    63    67     47
              83  64
          92          79
              95  76
 
                 0
             12     3
                15
*/
