/////////////////////////////////////////////////
//
// ColorPicker.js
//
// (c) 2006 by Edward H. Trager
//
// Released under the GNU General Public License
//
//
/////////////////////////////////////////////////

////////////////
//
// global vars:
//
////////////////

var isDraggable=false;
var scrollTimer=null;

var x,y;
var draggableObject;

var vSliderHeight=50;

var timerDelay=250;

var ty=0;
var newY=0;
var vSliderMin=30;
var vSliderMax=118;

var red   = 255;
var green = 255;
var blue  = 255;

var jumpY = 0;

//
// selectMouse()
//
function selectMouse(e){
	
	var fobj       = e.target;
	
	if(fobj.className=="vSlider"){
		
		isDraggable=true;
		draggableObject = fobj;
		ty=parseInt(draggableObject.style.top+0);
		y=e.clientY;
		document.onmousemove=verticalMouseMove;
	}else{
		jumpY=e.clientY;
	}
	
	return false;
	
}


//
// verticalMouseMove()
//
function verticalMouseMove(e){
	
	if(isDraggable){
		
		// Move drag bar:
		newY= ty+e.clientY-y;
		if(newY<vSliderMin) newY=vSliderMin;
		if(newY>vSliderMax) newY=vSliderMax;
		draggableObject.style.top = newY+"px";
		
		// Scroll table too:
		var sliderLength=vSliderMax-vSliderMin;
		var scrollFraction = 1-(newY-vSliderMin)/(sliderLength);
		
		//
		// adjust color:
		//
		adjustColor(draggableObject.id,scrollFraction);
		
	}
	return false;
	
}

//
// adjustColor()
//
function adjustColor(id,scrollFraction){
		//
		//
		//
		var colorComponent=parseInt(scrollFraction*255.0);
		
		//document.getElementById("show").innerHTML=draggableObject.id;
		if(id=='R'){
			red   = colorComponent;
		}else if(id=='G'){
			green = colorComponent;
		}else if(id=='B'){
			blue  = colorComponent;
		}
		
		//
		// Show labels:
		//
		
		//document.getElementById("show").innerHTML=d2h(red)+' '+d2h(green)+' '+d2h(blue);
		
		document.getElementById("redvalue"  ).innerHTML = d2h(red  );
		document.getElementById("greenvalue").innerHTML = d2h(green);
		document.getElementById("bluevalue" ).innerHTML = d2h(blue );
		
		// targetValue:
		document.getElementById("targetValue"     ).innerHTML = "#"+d2h(red)+d2h(green)+d2h(blue);
		// complementValue:
		document.getElementById("complementValue" ).innerHTML = "#"+d2h(255-red)+d2h(255-green)+d2h(255-blue);
		
		// Main target:
		document.getElementById("target").style.backgroundColor='rgb('+red+','+green+','+blue+')';
		// complement:
		document.getElementById("complement").style.backgroundColor='rgb('+(255-red)+','+(255-green)+','+(255-blue)+')';
		
		// Central triangle:
		document.getElementById("s5").style.borderTopColor='rgb('+red+','+green+','+blue+')';
		
		// Red region:
		document.getElementById("s1").style.borderBottomColor='rgb('+red+',0,0)';
		document.getElementById("s1").style.borderRightColor ='rgb('+red+',0,0)';
		document.getElementById("s2").style.borderLeftColor  ='rgb('+red+',0,0)';
		document.getElementById("s4").style.borderTopColor   ='rgb('+red+',0,0)';
		// Yellow region:
		document.getElementById("s2").style.borderBottomColor='rgb('+red+','+green+',0)';
		// Magenta region:
		document.getElementById("s4").style.borderRightColor ='rgb('+red+',0,'+blue+')';
		document.getElementById("s5").style.borderLeftColor  ='rgb('+red+',0,'+blue+')';
		// Green region:
		document.getElementById("s2").style.borderRightColor ='rgb(0,'+green+',0)';
		document.getElementById("s3").style.borderLeftColor  ='rgb(0,'+green+',0)';
		document.getElementById("s3").style.borderBottomColor='rgb(0,'+green+',0)';
		document.getElementById("s6").style.borderTopColor   ='rgb(0,'+green+',0)';
		// Cyan region:
		document.getElementById("s5").style.borderRightColor ='rgb(0,'+green+','+blue+')';
		document.getElementById("s6").style.borderLeftColor  ='rgb(0,'+green+','+blue+')';
		// Blue region:
		document.getElementById("s7").style.borderRightColor ='rgb(0,0,'+blue+')';
		document.getElementById("s8").style.borderLeftColor  ='rgb(0,0,'+blue+')';
		document.getElementById("s8").style.borderBottomColor='rgb(0,0,'+blue+')';
		document.getElementById("s8").style.borderRightColor ='rgb(0,0,'+blue+')';
		document.getElementById("s9").style.borderLeftColor  ='rgb(0,0,'+blue+')';
		
}
//
// setDraggableToFalse()
//
//    Resets the global "isDraggable" boolean to false.
//
function setDraggableToFalse(){
	isDraggable=false;
	//isScrolling=false;
	window.clearTimeout(scrollTimer);
}



//
// vSnapTop()
//
//    Snaps the scrollabe window to the topmost position.
//
function vSnapTop(objId){
	document.getElementById(objId).style.top=vSliderMin+"px";
	adjustColor(objId,1.0);
}

//
// vSnapBottom()
//
//    Snaps the scrollabe window to the bottommost position.
//
function vSnapBottom(objId){
	document.getElementById(objId).style.top=vSliderMax+"px";
	adjustColor(objId,0.0);
}

//
// vScroll()
//
//    Scrolls the table vertically by "dx" pixels.
//
function vScroll(dy,objId){
	
	
	newY+=dy;
	if(newY<vSliderMin) newY=vSliderMin;
	if(newY>vSliderMax) newY=vSliderMax;
	
	// move vSlider appropriately:
	var vSlider=document.getElementById(objId);
	vSlider.style.top=parseInt(newY)+"px";
	
	var sliderLength=vSliderMax-vSliderMin;
	var scrollFraction = 1-(newY-vSliderMin)/(sliderLength);
	//
	// adjust color:
	//
	adjustColor(objId,scrollFraction);
	
}

//function jump(objId){
//	
//	var jumpAmount = 5.8667;
//	vScroll(jumpAmount,objId);
//}

//
// clientIsSupported()
//
function clientIsSupported(){
	
	var client        = navigator.userAgent.toLowerCase();
	var clientVersion = navigator.appVersion.toLowerCase();
	var isSupportedVersionOfOpera = (client.indexOf("opera 8") != -1);
	
	//alert(document.all);
	
	if(document.all){
		
		//
		// Opera has this, so --
		//
		if(isSupportedVersionOfOpera){
			return true;
		}
		
		//
		// Otherwise, it is Internet Explorer:
		//
		// DOM and CSS are way too buggy, 
		// so we don't even try support it -
		//
		return false;
		
	}else if(document.layers){
		// Old Netscape 4 browser:
		// Definitely not supported -
		return false;
		
	}else if(document.getElementById){
		
		//
		// Opera:
		//
		if(isSupportedVersionOfOpera){
			return true;
		}
		
		//
		// Modern DOM Browser
		// The following are tested and supported:
		//
		if(client.indexOf("firefox") != -1){
			return true;
		}
		
		//
		// Recent versions of Mozilla and Netscape
		// to be supported:
		//
		if(client.indexOf("gecko/2004") != -1){
			return true;
		}
		
		return false;
		
	}else{
		
		return false;
		
	}
	
}

///////////////////////////////////////////
//
// Functions to call when the Javascript is
// loaded/initialized:
//
///////////////////////////////////////////

if(clientIsSupported()){
	document.onmousedown = selectMouse;
	document.onmouseup   = setDraggableToFalse;
}


var hexadecimalDigits="0123456789abcdef";

//
// d2h
//
function d2h(d) {
	var h = hexadecimalDigits.substr(d&15,1);
	while(d>15) {
		d>>=4;
		h=hexadecimalDigits.substr(d&15,1)+h;
	}
	if(h.length==1) return "0"+h;
	else return h;
}

//
// h2d
//
function h2d(h){
	return parseInt(h,16);
}

