// main.js functions for Colour Match page copyright (c) K.J. Petrie 2002

//Controls
CoarseStep=5;
FineStep=1;
CoarseInterval=10;
FineInterval=100;
//BrowserTest(); Write later

//Globals
Action='';
Blue=255;
CF='';
Enable=true;
Green=255;
Red=255;
NavName=navigator.appName.toLowerCase();
NavVer=navigator.appVersion;
NavNum=parseInt((NavName=='microsoft internet explorer')?NavVer.substring(NavVer.indexOf('MSIE')+5):NavVer);
Nav=(NavName=='netscape')?((NavNum>4)?'moz':'net'):(NavName=='microsoft internet explorer')?'ie':'other';

function edthis(box){
	box.style.borderColor="rgb(0,0,0)";
	box.style.backgroundColor=(box.style.backgroundColor)?box.style.backgroundColor:"rgb(255,255,255)";
	Controls=window.open('','Controls','titlebar,width=320,height=220');
	if(Controls){
		Controls.document.open();
		if((Nav=='ie')&&(NavNum<=4)){//IE4 bug
			Controls.document.writeln('<html>\n<head>\n<title>Adjust Colour</title>\n<style type="text/css"><!--\nbody{background-color:#FFFFFF}\ntd, th, p, .button{color:#5BE;font:normal 8pt/10pt arial,helvetica,sans-serif}\nth{text-align:center}\n.dedication{font-style:italic}\n.button {color:#FFFFFF;background-color:#38A;border:2px solid ;border-color:#60C7E0 #002070 #002070 #60C7E0;height:20px;width:50px;vertical-align:middle}\n-->\n</style>\n</head>');
			Controls.alert('Tip: Strengthening white produces green, which is a good colour to start from.');
		}
		else{
			Controls.document.writeln('<html>\n<head>\n<title>Adjust Colour</title>\n<style type="text/css"><!--\nbody{background-color:#FFFFFF}\ntd, th, p, .button{color:#5BE;font:normal 8pt/10pt arial,helvetica,sans-serif}\nth{text-align:center}\n.dedication{font-style:italic}\n.button {color:#FFFFFF;background-color:#38A;border:2px solid ;border-color:#60C7E0 #002070 #002070 #60C7E0;height:20px;width:50px;vertical-align:middle}\n-->\n</style>\n</head>');
		}
		Controls.document.writeln('<body onUnload="opener.Finished(Box);">\n<p>Adjust the colour in the selected area using the buttons below.</p><form name="ConForm" id="ConForm">');
		Controls.document.writeln('<table><tr>\n<td>Start Colour:</td><td><input type="button" class="button" name="red" value="Red" onClick="opener.SetColour(Box,200,0,0);"></td><td><input type="button" class="button" name="yellow" value="Yellow" onClick="opener.SetColour(Box,255,255,128);"></td><td><input type="button" class="button" name="green" value="Green" onClick="opener.SetColour(Box,0,128,0);"></td><td><input type="button" class="button" name="blue" value="Blue" onClick="opener.SetColour(Box,0,0,128);"></td></tr>');
		Controls.document.writeln('<tr>\n<td></td><th colspan=2>&#0150;&#0150;&#0150; Coarse &#0150;&#0150;&#0150;</th><th colspan=2>&#0150;&#0150;&#0150;&#0150; Fine &#0150;&#0150;&#0150;&#0150;</th></tr>');
		Controls.document.writeln('<tr>\n<td>Hue:</td><td><input type="button" class="button" name="hot" value="Warmer" onMouseDown="opener.Warm(Box,\'coarse\');" onMouseUp="opener.Stop();"></td><td><input type="button" class="button" name="cold" value="Cooler" onMouseDown="opener.Cool(Box,\'coarse\');" onMouseUp="opener.Stop();"></td><td><input type="button" class="button" name="warm" value="Warmer" onMouseDown="opener.Warm(Box,\'fine\');" onMouseUp="opener.Stop();"></td><td><input type="button" class="button" name="cool" value="Cooler" onMouseDown="opener.Cool(Box,\'fine\');" onMouseUp="opener.Stop();"></td></tr>');
		Controls.document.writeln('<tr>\n<td>Luminance:</td><td><input type="button" class="button" name="dark" value="Darker" onMouseDown="opener.Dark(Box,\'coarse\');" onMouseUp="opener.Stop();"></td><td><input type="button" class="button" name="dazzling" value="Lighter" onMouseDown="opener.Light(Box,\'coarse\');" onMouseUp="opener.Stop();"></td><td><input type="button" class="button" name="dim" value="Darker" onMouseDown="opener.Dark(Box,\'fine\');" onMouseUp="opener.Stop();"></td><td><input type="button" class="button" name="light" value="Lighter" onMouseDown="opener.Light(Box,\'fine\');" onMouseUp="opener.Stop();"></td></tr>');
		Controls.document.writeln('<tr>\n<td>Saturation:</td><td><input type="button" class="button" name="herculean" value="Stronger" onMouseDown="opener.Strong(Box,\'coarse\');" onMouseUp="opener.Stop();"></td><td><input type="button" class="button" name="thin" value="Paler" onMouseDown="opener.Pale(Box,\'coarse\');" onMouseUp="opener.Stop();"></td><td><input type="button" class="button" name="strong" value="Stronger" onMouseDown="opener.Strong(Box,\'fine\');" onMouseUp="opener.Stop();"></td><td><input type="button" class="button" name="pale" value="Paler" onMouseDown="opener.Pale(Box,\'fine\');" onMouseUp="opener.Stop();"></td></tr>');
		Controls.document.writeln('<tr>\n<td colspan=4><p class="dedication">To Rosemary with best wishes.</p></td><td><input type="button" class="button" name="close" value="Finished" onClick="self.close();"></td>\n</tr></table>\n</form>\n</body>\n</html>');
		Controls.document.close();
		Controls.Box=box;
		Controls.focus();
	}
	else{
		alert('To use this page your browser needs to be able to open windows automatically. It is currently unable to do so. Please review your browser settings and try again.');
	}
}

function CantParse(){alert(arguments[0]);
	alert('NON-STANDARD BROWSER\n\nSorry, we cannot understand your browser\'s Document Object Model.\n\nThis page requires a DOM level one capable browser in order to set colours.');
	return false;
}

function Clip(colarray){
	for(var i=0;i<3;i++){
		colarray[i]=(colarray[i]<0)?0:colarray[i];
		colarray[i]=(colarray[i]>255)?255:colarray[i];;
	}
	return colarray;
}

function Cool(box,cf){
	var col=ParseColour(box.style.backgroundColor);
	var step=(cf=='coarse')?CoarseStep:FineStep;
	if(!col[9]){
		if(!col[10]){
			col[(col[7]+1)%3]-=step;
			col[(col[7]+2)%3]+step;
		}
		else{
			col[col[6]]-=step;
			col[(col[6]+1)%3]+=step;
		}
		col=Clip(col);
		box.style.backgroundColor='rgb('+col[0]+','+col[1]+','+col[2]+')';
	}
	Controls.Box=box;
	CF=cf;
	Action=setTimeout('Run("Cool",Controls.Box,CF);',(cf=='coarse')?CoarseInterval:FineInterval);
}

function Dark(box,cf){
	var col=ParseColour(box.style.backgroundColor);
	var step=(cf=='coarse')?CoarseStep:FineStep;
	col[0]-=step;
	col[1]-=step;
	col[2]-=step;
	col=Clip(col);
	box.style.backgroundColor='rgb('+col[0]+','+col[1]+','+col[2]+')';
	Controls.Box=box;
	CF=cf;
	Action=setTimeout('Run("Dark",Controls.Box,CF);',(cf=='coarse')?CoarseInterval:FineInterval);
}

function Finished(box){
	box.style.borderColor="rgb(128,128,128)";
}

function Light(box,cf){
	var col=ParseColour(box.style.backgroundColor);
	var step=(cf=='coarse')?CoarseStep:FineStep;
	col[0]+=step;
	col[1]+=step;
	col[2]+=step;//alert(col);
	col=Clip(col);
	box.style.backgroundColor='rgb('+col[0]+','+col[1]+','+col[2]+')';
	Controls.Box=box;
	CF=cf;
	Action=setTimeout('Run("Light",Controls.Box,CF);',(cf=='coarse')?CoarseInterval:FineInterval);
}

function Pale(box,cf){
	var col=ParseColour(box.style.backgroundColor);
	var step=(cf=='coarse')?CoarseStep:FineStep;
	if(!col[9]){
		if(col[8]){
			col[col[7]]+=step;
			col[(col[7]+1)%3]=col[(col[7]+2)%3]-=step;
		}
		else{
			if(col[10]){
				col[col[6]]-=step;
				col[(col[6]+1)%3]=col[(col[6]+2)%3]+=step;
			}
			else{
				col[col[6]]-=step;
				col[col[7]]+=step;
			}
		}
		box.style.backgroundColor='rgb('+col[0]+','+col[1]+','+col[2]+')';
	}
	Controls.Box=box;
	CF=cf;
	Action=setTimeout('Run("Pale",Controls.Box,CF);',(cf=='coarse')?CoarseInterval:FineInterval);
}

function ParseColour(colour){
	var colarray=[];
	if((colour.charAt(0).toLowerCase()=='r')){//alert(colour.substring(4).split(/,/));
		colarray=colour.substring(colour.indexOf('(')+1,colour.lastIndexOf(')')).split(/,/);
		for(var i=0;i<3;i++){
			colarray[i]=parseInt(colarray[i],10);
		}
	}
	else{
		if((colour.length==7)||(colour.length==4)){
			colour=colour.substr(1);
		}
		if(colour.length==3){
			colarray=[parseInt(colour.substr(0,1)+colour.substr(0,1),16),parseInt(colour.substr(1,1)+colour.substr(1,1),16),parseInt(colour.substr(2,1)+colour.substr(2,1),16)];
		}
		else{
			if(colour.length==6){
				colarray=[parseInt(colour.substr(0,2),16),parseInt(colour.substr(2,2),16),parseInt(colour.substr(4,2),16)];
			}
			else{
				colarray=[255,255,255];
				CantParse(2);
			}
		}
	}
	var size=colarray.slice(0);
	size.sort(SortMethod);
	colarray[3]=size[0];
	colarray[4]=colarray[0]+colarray[1]+colarray[2];
	colarray[5]=size[2];
	colarray[8]=(size[1]==size[2])?true:false;
	colarray[9]=(colarray[8]&&(size[0]==size[2]))?true:false;
	colarray[10]=(size[0]==size[1])?true:false;
	colarray[6]=(colarray[9])?1:SearchPrimary(colarray,colarray[5]);
	colarray[7]=(colarray[9])?0:SearchPrimary(colarray,colarray[3]);
	
	return colarray;//[r,g,b,min,totlum,max,highprim,lowprim,heq2flag,eq3flag,leq2flag]
}

function Run(func,box,cf){
	if(Enable){//alert(func+'(box,cf)');
		eval(func+'(box,cf)');
	}
}

function SearchPrimary(colarray,val){
	for(var i=0;(colarray[i]!=val)&&(i<3);i++){}
	return i;
}

function SetColour(box,r,g,b){
	box.style.backgroundColor='rgb('+r+','+g+','+b+')';
}

function SortMethod(a,b){
	return a-b;
}

function Stop(){//alert('Stop called')
	clearTimeout(Action);
	Enable=false;
	setTimeout("Enable=true",300);
}

function Strong(box,cf){
	var col=ParseColour(box.style.backgroundColor);
	var step=(cf=='coarse')?CoarseStep:FineStep;
//[r,g,b,min,totlum,max,highprim,lowprim,heq2flag,eq3flag,leq2flag]
	if(col[9]){
		col[6]=1;
		col[7]=0;
		col[9]=col[8]=false;
		col[10]=true;
	}
	if(col[8]){
		col[col[7]]-=step;
		col[(col[7]+1)%3]=col[(col[7]+2)%3]+=step;
	}
	else{
		if(col[10]){
			col[col[6]]+=step;
			col[(col[6]+1)%3]=col[(col[6]+2)%3]-=step;
		}
		else{
			col[col[6]]+=step;
			col[col[7]]-=step;
		}
	}
	box.style.backgroundColor='rgb('+col[0]+','+col[1]+','+col[2]+')';
	Controls.Box=box;
	CF=cf;
	Action=setTimeout('Run("Strong",Controls.Box,CF);',(cf=='coarse')?CoarseInterval:FineInterval);
}

function Warm(box,cf){
	var col=ParseColour(box.style.backgroundColor);
	var step=(cf=='coarse')?CoarseStep:FineStep;
	if(!col[9]){
		if(!col[10]){
			col[(col[7]+2)%3]-=step;
			col[(col[7]+1)%3]+=step;
		}
		else{
			col[col[6]]-=step;
			col[(col[6]+2)%3]+=step;
		}
		col=Clip(col);
		box.style.backgroundColor='rgb('+col[0]+','+col[1]+','+col[2]+')';
	}
	Controls.Box=box;
	CF=cf;
	Action=setTimeout('Run("Warm",Controls.Box,CF);',(cf=='coarse')?CoarseInterval:FineInterval);
}

