Click here to Skip to main content
15,895,192 members
Articles / Web Development / HTML

Windows Like Choose Color Dialog

Rate me:
Please Sign up or sign in to vote.
4.45/5 (17 votes)
1 Dec 20052 min read 59.7K   1.5K   32  
How to implement a Windows like Choose Color dialog with HTML and JavaScript.
//////////////////////////////////////////////////
//Calling the dialog
function fnProcessReturnValue(retVal){
	if(retVal){
		if(retVal.substr(0,3)=='OK!'){
			return retVal.substring(3,retVal.length);
		}
	}
	return "";
}

function fnShowChooseColorDlg(color,param,path){
	if (document.all) { //IE4 and up
		var args = new Array(3);
		args[0] = color;
		args[1] = window;
		args[2] = param;
		retVal = window.showModalDialog(
				path+'color_dialog.htm',args,
				'dialogHeight: 380px; dialogWidth: 245px; center: yes; scroll: No; help:  No; resizable: No; status:no;');
		return fnProcessReturnValue(retVal);
	} else if (document.layers) {
	} else if (document.getElementById) { //mozilla
		var winRef;
		winRef = window.open(
				path+'color_dialog.htm?'+escape(color)+'&'+param,"_blank",
				'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=245, height=325');
	}
}

/////////////////////////////////////////////////////////////////////////////////
//Coockies
function Get_Cookie(name){ 
   var start = document.cookie.indexOf(name+"="); 
   var len = start+name.length+1; 
   if ((!start) && (name != document.cookie.substring(0,name.length))) return null; 
   if (start == -1) return null; 
   var end = document.cookie.indexOf(";",len); 
   if (end == -1) end = document.cookie.length; 
   return unescape(document.cookie.substring(len,end)); 
} 

function Set_Cookie(name,value,expires,path,domain,secure) { 
    var cookieString = name + "=" +escape(value) + 
       ( (expires) ? ";expires=" + expires.toGMTString() : "") + 
       ( (path) ? ";path=" + path : "") + 
       ( (domain) ? ";domain=" + domain : "") + 
       ( (secure) ? ";secure" : ""); 
    document.cookie = cookieString; 
} 

function Delete_Cookie(name,path,domain) { 
   if (Get_Cookie(name)) document.cookie = name + "=" + 
      ( (path) ? ";path=" + path : "") + 
      ( (domain) ? ";domain=" + domain : "") + 
      ";expires=Sun, 01-Jan-70 00:00:01 GMT"; 
} 


function setCookieColor(colorName,value){
	var myDate=new Date();
	myDate.setFullYear(2040,0,1);
	Set_Cookie(colorName,value,myDate,"","","");
}


function getCookieColor(colorName){
	val = Get_Cookie(colorName);
	if (val == null)
		return "#ffffff";
	return val;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////	
//RGB HLS Color transforms

	var RANGE = 240;
	var HLSMAX = RANGE;/* H,L, and S vary over 0-HLSMAX */
   	var RGBMAX  = 255;   /* R,G, and B vary over 0-RGBMAX */
                           /* HLSMAX BEST IF DIVISIBLE BY 6 */
                           /* RGBMAX, HLSMAX must each fit in a byte. */

   /* Hue is undefined if Saturation is 0 (grey-scale) */
   /* This value determines where the Hue scrollbar is */
   /* initially set for achromatic colors */
   var UNDEFINED  = HLSMAX*2/3;

   function  RGBtoHLS(R,G,B)
   {
      cMax = Math.max( Math.max(R,G), B);
      cMin = Math.min( Math.min(R,G), B);

      L = Math.floor(( ((cMax+cMin)*HLSMAX) + RGBMAX )/(2*RGBMAX));

      if (cMax == cMin) {           /* r=g=b --> achromatic case */
         S = 0;                     /* saturation */
         H = UNDEFINED;             /* hue */
      }
      else {                        /* chromatic case */
         /* saturation */
         if (L <= (HLSMAX/2))
            S = Math.floor( ( ((cMax-cMin)*HLSMAX) + ((cMax+cMin)/2) ) / (cMax+cMin) );
         else
            S = Math.floor( ( ((cMax-cMin)*HLSMAX) + ((2*RGBMAX-cMax-cMin)/2) )/ (2*RGBMAX-cMax-cMin) );

         /* hue */
      Rdelta = Math.floor( ( ((cMax-R)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin) );
      Gdelta = Math.floor( ( ((cMax-G)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin) );
      Bdelta = Math.floor( ( ((cMax-B)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin) );

         if (R == cMax)
            H = Bdelta - Gdelta;
         else if (G == cMax)
            H = (HLSMAX/3) + Rdelta - Bdelta;
         else /* B == cMax */
            H = ((2*HLSMAX)/3) + Gdelta - Rdelta;

         if (H < 0)
            H += HLSMAX;
         if (H > HLSMAX)
            H -= HLSMAX;
      }
	  
	  res = new Array();
	  res[0] = Math.floor(H);
	  res[1] = Math.floor(L);
	  res[2] = Math.floor(S);
	  
	  return res;
   }
   /* utility routine for HLStoRGB */
   
   function  HueToRGB(n1,n2,hue)
   {
	   
		n1 = Math.floor(n1);
		n2 = Math.floor(n2);
		hue = Math.floor(hue);
      /* range check: note values passed add/subtract thirds of range */
      if (hue < 0)
         hue += HLSMAX;

      if (hue > HLSMAX)
         hue -= HLSMAX;

      /* return r,g, or b value from this tridrant */
      if (hue < (HLSMAX/6))
          return Math.floor( n1 + Math.floor((((n2-n1)*hue+(HLSMAX/12))/(HLSMAX/6))) );
      if (hue < (HLSMAX/2))
         return ( n2 );
      if (hue < ((HLSMAX*2)/3))
         return Math.floor( n1 +    Math.floor( (((n2-n1)*(((HLSMAX*2)/3)-hue)+(HLSMAX/12)) / (HLSMAX/6)) ) );
      else
         return Math.floor( n1 );
   }

   function HLStoRGB(hue,lum,sat)
    {

      if (sat == 0) {            /* achromatic case */
         R=G=B=(lum*RGBMAX)/HLSMAX;
         if (hue != UNDEFINED) {
            /* ERROR */
          }
       }
      else  {                    /* chromatic case */
         /* set up magic numbers */
         if (lum <= (HLSMAX/2))
            Magic2 = Math.floor(	(lum*(HLSMAX + sat) + (HLSMAX/2)) / HLSMAX	);
         else
            Magic2 = (lum + sat - Math.floor( ((lum*sat) + (HLSMAX/2))/HLSMAX) );
			
         Magic1 = 2*lum-Magic2;

         /* get RGB, change units from HLSMAX to RGBMAX */
         R = (HueToRGB(Magic1,Magic2,hue+(HLSMAX/3))*RGBMAX + (HLSMAX/2))/HLSMAX;
         G = (HueToRGB(Magic1,Magic2,hue)*RGBMAX + (HLSMAX/2)) / HLSMAX;
         B = (HueToRGB(Magic1,Magic2,hue-(HLSMAX/3))*RGBMAX +  (HLSMAX/2))/HLSMAX;
      }
	  
  
	  res = new Array();
	  res[0] = Math.floor(R);
	  res[1] = Math.floor(G);
	  res[2] = Math.floor(B);
	  
	  return res;

    }

/////////////////////////////////////////////////////////////////
//drawing
var g_param = 0;

var step = 6;
var visStep = 5;

function myParseInt(strIntNum){
	if(strIntNum.length<=0 || strIntNum=="")
		return 0;
	
	intStr = "0123456789";
	
	for(i = 0 ; i < strIntNum.length; i++){
	   if(intStr.indexOf(strIntNum.substring(i,1))<0)
			return 0;
	}
	return parseInt(strIntNum);
}

function getHex(num){
   hexStr = "0123456789ABCDEF";
   hex="";
   if (num>=16) {
      hex = hexStr.substr(parseInt(num/16),1);
      num = num%16;
   }
   hex += hexStr.substr(num,1);

   if(hex.length == 1)
		hex = "0" +  hex;
   
   return hex;
}

function getNum(hex){
	if(hex.length !=2 )	
		return 0;
	hexStr = "0123456789ABCDEFabcdef";

	for(i = 0 ; i < hex.length; i++){
	   if(hexStr.indexOf(hex.substring(i,1))<0)
			return 0;
	}

	return parseInt(hex,16);
}


function HSTable(L,parentEl){
	var table = document.createElement('TABLE');
	table.setAttribute('cellPadding',0);
	table.setAttribute('cellSpacing',0);
	table.setAttribute('border',0);

	var tBody = document.createElement('TBODY');
	table.appendChild(tBody);


	var maxS = Math.floor((HLSMAX-1)/step)*step;
	var maxH = HLSMAX-1;
	
	for(S = maxS ;S >= 0 ; S-=step)
	{
		var row = document.createElement('TR');
		for (H=0;H<maxH;H+=step)
		{
			var cell = document.createElement('TD');
			var res = HLStoRGB(H,L,S );
			cell.style.backgroundColor = "#" + getHex(res[0])+getHex(res[1]) + getHex(res[2]);
			cell.style.width = visStep + "px";
			cell.style.height = visStep + "px";
//			cell.style.width = step + "px";
//			cell.style.height = step + "px";
//			var theData = document.createTextNode();
//			cell.appendChild(theData);
			row.appendChild(cell);
		}
		tBody.appendChild(row);
	}

	document.getElementById(parentEl).appendChild(table);
//	document.body.appendChild(table);	
}


function LTable(H,S,parentEl){
	if(document.getElementById('sliderTable')){
		document.getElementById(parentEl).removeChild(document.getElementById('sliderTable'));
	}
	
	var table = document.createElement('TABLE');
	table.setAttribute('cellPadding',0);
	table.setAttribute('cellSpacing',0);
	table.setAttribute('border',0);
	table.setAttribute('id','sliderTable');

	var tBody = document.createElement('TBODY');
	table.appendChild(tBody);

	var maxL = Math.floor((HLSMAX-1)/step)*step;
	
	for(L = maxL ;L >= 0 ; L-=step)
	{
		var row = document.createElement('TR');
		
		var cell = document.createElement('TD');
		var res = HLStoRGB(H,L,S);
		cell.style.backgroundColor = "#" + getHex(res[0])+getHex(res[1]) + getHex(res[2]);
		cell.style.width = 10+ "px";
		cell.style.height = visStep + "px";

//			var theData = document.createTextNode();
//			cell.appendChild(theData);
		row.appendChild(cell);

		tBody.appendChild(row);
	}
	document.getElementById(parentEl).appendChild(table);
//	document.body.appendChild(table);	
}




var colorArr = new Array(
	new Array('#ff8080','#ffff80','#80ff80','#00ff80','#80ffff','#0080ff','#ff80c0','#ff80ff'),
	new Array('#ff0000','#ffff00','#80ff00','#00ff40','#00ffff','#0080c0','#8080c0','#ff00ff'),
	new Array('#804040','#ff8040','#00ff00','#008080','#004080','#8080ff','#800040','#ff0080'),
	new Array('#800000','#ff8000','#008000','#008040','#0000ff','#0000a0','#800080','#8000ff'),
	new Array('#400000','#804000','#004000','#004040','#000080','#000040','#400040','#400080'),
	new Array('#000000','#808000','#808040','#808080','#408080','#c0c0c0','#400040','#ffffff')
);

var curColElX = 0;
var curColElY = 0;


function fnOnColorClick(color,x,y){
	cell = document.getElementById("basic_color_"+curColElX+"_"+curColElY);
	cell.style.borderColor = "#ffffff";
	
	curColElX = x;
	curColElY = y;
	cell = document.getElementById("basic_color_"+curColElX+"_"+curColElY);
	cell.style.borderColor = "#ff0000";

	document.getElementById('R_id').value = getNum(color.substr(1,2));
	document.getElementById('G_id').value = getNum(color.substr(3,2));
	document.getElementById('B_id').value = getNum(color.substr(5,2));
	OnChangeRGB();
}

function ColorsTable(parentEl){
	var table = document.createElement('TABLE');
	table.setAttribute('cellPadding',0);
	table.setAttribute('cellSpacing',5);
	table.setAttribute('border',0);
	table.setAttribute('id','basic_color_table');
	
	var tBody = document.createElement('TBODY');
	table.appendChild(tBody);


	var hLen = 8;
	var vLen = 6;
	
	for(y = 0;y<vLen;y++)
	{
		var row = document.createElement('TR');
		for (x=0;x<hLen;x++)
		{
			var cell = document.createElement('TD');
			cell.style.backgroundColor = colorArr[y][x];
			cell.style.color = colorArr[y][x];
			cell.style.width = 20 + "px";
			cell.style.height = 15 + "px";
			cell.style.borderWidth = "1px";
			cell.style.borderColor = "#ffffff";

			cell.style.borderStyle = "solid";
			cell.setAttribute('id',"basic_color_"+x+"_"+y);
			
			onClickEvent = 
				function(col,colX,colY) {
					return (
						function (){
							fnOnColorClick(col,colX,colY);
						}
					); 
				} (colorArr[y][x],x,y);
		
			if (document.all) { //IE4 and up
				cell.attachEvent("onclick",onClickEvent);
			} else if (document.layers) {
				cell.addeventlistener("onclick",onClickEvent,false);
			} else if (document.getElementById) {
				cell.addEventListener("click",onClickEvent,false);
			} 
			
			var theData = document.createTextNode('.');
			cell.appendChild(theData);
			row.appendChild(cell);
		}
		tBody.appendChild(row);
	}

	document.getElementById(parentEl).appendChild(table);
//	document.body.appendChild(table);	
}

//////////////////////////////////////////////////////////////////////////
var curCustElX = 0;
var curCustElY = 0;

function fnAddCustColorClick(red,green,blue){
	cell = document.getElementById("custom_color_"+curCustElX+"_"+curCustElY);
	color = "#" + getHex(red)+getHex(green) + getHex(blue);
	cell.style.backgroundColor = color;
	cell.style.color = color;

	onClickEvent = 
		function(col,colX,colY) {
			return (
				function (){
					fnOnCustColorClick(col,colX,colY);
				}
			); 
		} (color,curCustElX,curCustElY);

	if (document.all) { //IE4 and up
		cell.attachEvent("onclick",onClickEvent);
	} else if (document.layers) {
		cell.addeventlistener("onclick",onClickEvent,false);
	} else if (document.getElementById) {
		cell.addEventListener("click",onClickEvent,false);
	} 

	setCookieColor("custom_color_"+curCustElX+"_"+curCustElY,color);	
}


function fnOnCustColorClick(color,x,y){
	cell = document.getElementById("custom_color_"+curCustElX+"_"+curCustElY);
	cell.style.borderColor = "#000000";
	
	curCustElX = x;
	curCustElY = y;
	cell = document.getElementById("custom_color_"+curCustElX+"_"+curCustElY);
	cell.style.borderColor = "#ff0000";

//	color = cell.style.color;
//	alert(color);

	document.getElementById('R_id').value = getNum(color.substr(1,2));
	document.getElementById('G_id').value = getNum(color.substr(3,2));
	document.getElementById('B_id').value = getNum(color.substr(5,2));
	OnChangeRGB();

	
}

function CustColorsTable(parentEl){
	var table = document.createElement('TABLE');
	table.setAttribute('cellPadding',0);
	table.setAttribute('cellSpacing',5);
	table.setAttribute('border',0);
	table.setAttribute('id','cust_color_table');

	var tBody = document.createElement('TBODY');
	table.appendChild(tBody);

	var hLen = 8;
	var vLen = 2;
	
	for(y = 0;y<vLen;y++)
	{
		var row = document.createElement('TR');
		for (x=0;x<hLen;x++)
		{
			color = getCookieColor("custom_color_"+x+"_"+y);
			
			var cell = document.createElement('TD');
			cell.style.backgroundColor = color;
			cell.style.color = color;
			cell.style.width = 20 + "px";
			cell.style.height = 15 + "px";
			cell.style.borderWidth = "1px";
			cell.style.borderColor = "#000000";
			cell.style.borderStyle = "solid";
			cell.setAttribute('id',"custom_color_"+x+"_"+y);

			
			onClickEvent = 
				function(col,colX,colY) {
					return (
						function (){
							fnOnCustColorClick(col,colX,colY);
						}
					); 
				} (color,x,y);
		
			if (document.all) { //IE4 and up
				cell.attachEvent("onclick",onClickEvent);
			} else if (document.layers) {
				cell.addeventlistener("onclick",onClickEvent,false);
			} else if (document.getElementById) {
				cell.addEventListener("click",onClickEvent,false);
			} 
			
			var theData = document.createTextNode(".");
			cell.appendChild(theData);
			row.appendChild(cell);
		}
		tBody.appendChild(row);
	}

	document.getElementById(parentEl).appendChild(table);

	cell = document.getElementById("custom_color_"+curCustElX+"_"+curCustElY);
	cell.style.borderColor = "#ff0000";
	
//	document.body.appendChild(table);	
}



////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Dialog functionality
////////////////////////////////////////////////////////////////////////////////////////////////////////////

var colorsLeft = 10;
var colorsTop = 10 ;
var colorsWidth = 220;
var colorsHeight = 140;

var custColorsLeft = colorsLeft;
var custColorsTop = colorsTop + colorsHeight + 35;
var custColorsWidth = colorsWidth;
var custColorsHeight = 65;

var buttonsLeft = colorsLeft;
var buttonsTop = custColorsTop + custColorsHeight + 20;
var buttonsWidth = colorsWidth;
var buttonsHeight = 50;


var graphicsLeft = colorsLeft + colorsWidth + 20;
var graphicsTop = colorsTop;
var graphicsHeight = (HLSMAX/step)*visStep;

var valuesLeft = graphicsLeft;
var valuesTop = graphicsTop + graphicsHeight + 10;
/////////////////////////////////////////////////////
//relative to div_graphics
var selectLeft = 0;
var selectTop = 0;
var selectWidth = (HLSMAX/step)*visStep;
var selectHeight = graphicsHeight;

var selectPointerWidth = 20;
var selectPointerHeight = 20;

var sliderLeft = selectLeft + selectWidth + 10;
var sliderTop = selectTop;
var sliderWidth = 10;
var sliderHeight = selectHeight;

var sliderPointerWidth = 5;
var sliderPointerHeight = 9;

function fnVerifyNumber(strFieldId,maxVal){
	iValue = myParseInt(document.getElementById(strFieldId).value);
	if(iValue<0)
		document.getElementById(strFieldId).value = "0";
	else if(iValue>maxVal)
		document.getElementById(strFieldId).value=maxVal.toString();
	else if( iValue.toString() != document.getElementById(strFieldId).value)
		document.getElementById(strFieldId).value = myParseInt(document.getElementById(strFieldId).value).toString();
}


function fnGetColorByRelativePos(pos,relVal){
	return 	Math.round((pos/relVal)*HLSMAX);
}

function fnGetRelativePosByColor(col,relVal){
	return 	Math.round((col/HLSMAX)*relVal);
}



function getMouseXPos(e) {

	if (document.all) { //IE4 and up
		return (myParseInt(event.clientX) + myParseInt(document.body.scrollLeft));
	} else if (document.layers) {
		if(!e)
			e = window.event;
	    return myParseInt(e.pageX)
	} else if (document.getElementById) {
		if(!e)
			e = window.Event;
		return (myParseInt(e.clientX) + myParseInt(document.body.scrollLeft))
	} 

}
// <B style="color:black;background-color:#A0FFFF">Get</B> the vartical <B style="color:black;background-color:#ff9999">position</B> of the mouse
function getMouseYPos(e) {
	if (document.all) { //IE4 and up
		return (myParseInt(event.clientY) + myParseInt(document.body.scrollTop));
	} else if (document.layers) {
		if(!e)
			e = window.event;
	    return myParseInt(e.pageY);
	} else if (document.getElementById) { // mozilla
		if(!e)
			e = window.Event;
		return (myParseInt(e.clientY) + myParseInt(document.body.scrollTop));
	} 

}

function CalcSliderPos(e){
	parentLeft = document.getElementById('div_graphics').offsetLeft + document.getElementById('HSTable').offsetLeft;
	parentTop = document.getElementById('div_graphics').offsetTop + document.getElementById('HSTable').offsetTop;
	
	pos = getMouseYPos(e) - sliderTop - graphicsTop;
	Lum = fnGetColorByRelativePos(pos,sliderHeight);
	
	if(Lum<0){
		Lum = 0;
		pos = 0;
	}
	if(Lum>HLSMAX){
		Lum = HLSMAX;
		pos = sliderHeight;
	}
	
	if(Lum>HLSMAX || Lum<0)	
		return;


	slider = document.getElementById('div_slider');
	CalcLumByPos(pos);
//	slider.style.left = (getMouseXPos() - sliderPointerWidth - graphicsLeft)+ 'px';
	slider.style.top = (pos - sliderPointerHeight - 2 ) + 'px';
}

function CalcSelectPos(e){
	selectEl = document.getElementById('div_select');
	pos = getMouseXPos(e) - selectLeft - graphicsLeft;
	Hue = fnGetColorByRelativePos(pos,selectWidth);
	
	if(Hue<0){
		Hue = 0;
		pos = 0;
	}
	if(Hue>HLSMAX){
		Hue = HLSMAX;
		pos = selectWidth;
	}

	if(Hue>=0 && Hue<=HLSMAX){
		CalcHueByPos(pos);

		selectEl.style.left = (pos - selectPointerWidth/2) + 'px';
	}
	
	pos = getMouseYPos(e) - selectTop - graphicsTop;
	Sat = fnGetColorByRelativePos(pos,selectHeight);
	

	if(Sat<0){
		Sat = 0;
		pos = 0;
	}
	if(Sat>HLSMAX){
		Sat = HLSMAX;
		pos = selectWidth;
	}

	if(Sat>=0 && Sat<=HLSMAX){
		CalcSatByPos(pos);
		selectEl.style.top = (pos - selectPointerHeight/2) + 'px';
	}

}
///////////////////////////////////////////////////////////////////////
var curElementName;
function CaptureElement(elementDivName,elWidth,elHeight,parentLeft,parentTop,e){
	el = document.getElementById(elementDivName);
	if(el){
		mX = getMouseXPos(e);
		mY = getMouseYPos(e);
		if( 
			(el.offsetLeft + parentLeft <= mX && mX <= el.offsetLeft + parentLeft + elWidth) &&
			(el.offsetTop + parentTop <= mY && mY <= el.offsetTop + parentTop + elHeight) 
		){
			curElementName = elementDivName;
			return true;
		}
	}
	return false;
}

function CaptureSelectImg(e){
	parentLeft = document.getElementById('div_graphics').offsetLeft + document.getElementById('HSTable').offsetLeft;
	parentTop = document.getElementById('div_graphics').offsetTop + document.getElementById('HSTable').offsetTop;
	return CaptureElement('div_select',selectPointerWidth,selectPointerHeight,parentLeft,parentTop,e);
}

function CaptureSlideImg(e){
	parentLeft = document.getElementById('div_graphics').offsetLeft + document.getElementById('LTable').offsetLeft;
	parentTop = document.getElementById('div_graphics').offsetTop + document.getElementById('LTable').offsetTop + sliderPointerHeight/2;
	
	return CaptureElement('div_slider',sliderPointerWidth,sliderPointerHeight,parentLeft,parentTop,e);
}


function doMouseMove(e) {

	if (document.all) { //IE4 and up
		if(!e)
			e = event;
		btn = 1;	
		el = e.srcElement;
	} else if (document.layers) {
		if(!e)
			e = window.event;
		btn = 0;
		el = e.target;
	} else if (document.getElementById) {
		if(!e)
			e = window.Event;
		btn = 0;
		el = e.target;
	} 

	if (/*(e.button==btn) && */(curElementName!=null)){
		if(curElementName =='div_select'){
			CalcSelectPos(e);
			e.returnValue = false
			e.cancelBubble = true
		}else if(curElementName =='div_slider'){
			CalcSliderPos(e);
			e.returnValue = false
			e.cancelBubble = true
		}else{
		
		}
	}
}

function doDragStart(e, transferData, action) {
	if (document.all) { //IE4 and up
		e = event;
	} else if (document.layers) {
		if(!e)
			e = window.event;
	} else if (document.getElementById) {
		if(!e)
			e = window.Event;
	} 
	
	if ("IMG"==event.srcElement.tagName)
	  event.returnValue=false;
}

function doMouseDown(e) {
	if (document.all) { //IE4 and up
		if(!e)
			e = event;
		btn = 1;	
		el = e.srcElement;
	} else if (document.layers) {
		if(!e)
			e = window.event;
		btn = 0;
		el = e.target;
	} else if (document.getElementById) {
		if(!e)
			e = window.Event;
		btn = 0;
		el = e.target;
	} 

	
	if ((e.button==btn) && (el.tagName=="IMG")){
		if(!CaptureSelectImg(e)){
			if(CaptureSlideImg(e)){
				return false;
			}
		}
		else{
			return false;
		}
	}
}

document.ondragstart = doDragStart;
document.onmousedown = doMouseDown;

document.onmousemove = doMouseMove;
document.onmouseup = new Function("curElementName=null;	");


////////////////////////////////////////////////////////////////////////////////////

function fnOnLoad(){
	
/////////////////////////////////////
// Left part of dialog
	colorsEl = document.getElementById('div_colors');
	colorsEl.style.left = colorsLeft + 'px';
	colorsEl.style.top = colorsTop + 'px';
	colorsEl.style.width = colorsWidth  + 'px';
	colorsEl.style.height = colorsHeight + 'px';
	ColorsTable('div_colors');
	colorsEl.style.display = '';


	custColorsEl = document.getElementById('div_cust_colors');
	custColorsEl.style.left = custColorsLeft + 'px';
	custColorsEl.style.top = custColorsTop + 'px';
	custColorsEl.style.width = custColorsWidth + 'px';
	custColorsEl.style.height = custColorsHeight + 'px';
	CustColorsTable('div_cust_colors');
	custColorsEl.style.display = '';

	buttonsEl = document.getElementById('div_buttons');
	buttonsEl.style.left = buttonsLeft + 'px';
	buttonsEl.style.top = buttonsTop + 'px';
	buttonsEl.style.width = buttonsWidth + 'px';
	buttonsEl.style.height = buttonsHeight + 'px';
	buttonsEl.style.display='';
////////////////////////////////////////////////////
	selectEl = document.getElementById('HSTable');
	selectEl.style.left = selectLeft + 'px';
	selectEl.style.top = selectLeft + 'px';
	selectEl.style.width = selectWidth + 'px';
	selectEl.style.height = selectHeight + 'px';

	sliderEl = document.getElementById('LTable');
	sliderEl.style.left = sliderLeft + 'px';
	sliderEl.style.top = sliderTop + 'px';
	sliderEl.style.width = sliderWidth + 'px';
	sliderEl.style.height = sliderHeight + 'px';


	slideEl = document.getElementById('div_slider');
	slideEl.style.left = (sliderWidth + 2) + 'px';
	slideEl.style.top = (sliderHeight - sliderPointerHeight - 2) + 'px';

////////////////////////////////
	selectPointerEl = document.getElementById('div_select');
	selectPointerEl.style.left = '-' + selectPointerWidth/2 + 'px';
	selectPointerEl.style.top = '-' + selectPointerHeight/2 + 'px';
///////////////////////////////////////////////////////////
	HSTable(160,'HSTable');

	graphicsEl = document.getElementById('div_graphics');
	graphicsEl.style.left = graphicsLeft + 'px';
	graphicsEl.style.top = graphicsTop + 'px';
	graphicsEl.style.display='';

	valuesEl = document.getElementById('div_values');
	valuesEl.style.left = valuesLeft + 'px';
	valuesEl.style.top = valuesTop + 'px';
	valuesEl.style.display='';
/////////////////////////////////////////////////////////////////////
	var prevColor = ""

	if (document.all) { //IE4 and up
		prevColor = dialogArguments[0];
		window.opener = dialogArguments[1];
		g_param = dialogArguments[2];
	} else if (document.layers) {
		
	} else if (document.getElementById) { //mozilla
		var url = unescape(window.location.href);
		var parArray = url.split('?');
		if(parArray.length==2){
			var paramsArray = parArray[1].split('&');
			prevColor = paramsArray[0];
			g_param = paramsArray[1];
		}
	} 

	if(prevColor){
		if(prevColor.length == 7){
			if(prevColor.substr(0,1) == '#'){
				document.getElementById('R_id').value = getNum(prevColor.substr(1,2));
				document.getElementById('G_id').value = getNum(prevColor.substr(3,2));
				document.getElementById('B_id').value = getNum(prevColor.substr(5,2));
				OnChangeRGB();
			}
		}
	}
	else{
		document.getElementById('H_id').value = 0;
		document.getElementById('S_id').value = HLSMAX;
		document.getElementById('L_id').value = 0;

		RGBByHSL();
		
		LTable(0,HLSMAX,'LTable');
	}
	
}



function CalcHueByPos(pos){
	document.getElementById('H_id').value = fnGetColorByRelativePos(pos,selectWidth);

	OnChangeHS();
}

function CalcPosByHue(){
	
	Hue = document.getElementById('H_id').value;
	
	selectEl = document.getElementById('div_select');
	selectEl.style.left = fnGetRelativePosByColor(Hue,selectWidth) - selectPointerWidth/2 + 'px';

	OnChangeHS();
}

function CalcSatByPos(pos){
	document.getElementById('S_id').value = HLSMAX - fnGetColorByRelativePos(pos,selectHeight);
	
	OnChangeHS();
}

function CalcPosBySat(){
	Sat = document.getElementById('S_id').value;

	selectEl = document.getElementById('div_select');
	selectEl.style.top = fnGetRelativePosByColor(HLSMAX - Sat,selectHeight) - selectPointerHeight/2 + 'px';
	
	OnChangeHS();
}

function CalcLumByPos(pos){
	document.getElementById('L_id').value = HLSMAX - fnGetColorByRelativePos(pos,sliderHeight);
	OnChangeL();
}


function CalcPosByLum(){
	Lum = document.getElementById('L_id').value;

	slider = document.getElementById('div_slider');
	slider.style.top = fnGetRelativePosByColor(HLSMAX - Lum,sliderHeight) - sliderPointerHeight  + 'px';

	OnChangeL();
}

function RGBByHSL(){
	H = myParseInt(document.getElementById('H_id').value);
	L = myParseInt(document.getElementById('L_id').value);
	S = myParseInt(document.getElementById('S_id').value);

	res = HLStoRGB(H,L,S);

	document.getElementById('R_id').value = res[0];
	document.getElementById('G_id').value = res[1];
	document.getElementById('B_id').value = res[2];
	
	setPreviewColor();
}

function HSLByRGB(){
	R = myParseInt(document.getElementById('R_id').value);
	G = myParseInt(document.getElementById('G_id').value);
	B = myParseInt(document.getElementById('B_id').value);

	res = RGBtoHLS(R,G,B);

	document.getElementById('H_id').value = res[0];
	document.getElementById('L_id').value = res[1];
	document.getElementById('S_id').value = res[2];
	
	setPreviewColor();
}

function OnChangeHS(){
	RGBByHSL();
	
	H = myParseInt(document.getElementById('H_id').value);
	S = myParseInt(document.getElementById('S_id').value);
	
	LTable(H,S,'LTable');
}

function OnChangeL(){
	RGBByHSL();
}

function OnChangeRGB(){
	HSLByRGB();

	Hue = myParseInt(document.getElementById('H_id').value);
	Sat = myParseInt(document.getElementById('S_id').value);

	selectEl = document.getElementById('div_select');
	selectEl.style.left = (fnGetRelativePosByColor(Hue,selectWidth) - selectPointerWidth/2) + 'px';
	selectEl.style.top = (fnGetRelativePosByColor(HLSMAX - Sat,selectWidth) - selectPointerHeight/2) + 'px';
	LTable(Hue,Sat,'LTable');

	Lum = myParseInt(document.getElementById('L_id').value);

	slider = document.getElementById('div_slider');
	slider.style.top = fnGetRelativePosByColor(HLSMAX - Lum,sliderHeight) - sliderPointerHeight + 'px';
	
}

function setPreviewColor(){
	R = myParseInt(document.getElementById('R_id').value);
	G = myParseInt(document.getElementById('G_id').value);
	B = myParseInt(document.getElementById('B_id').value);
	
	prevEl = document.getElementById("previewColor");
	prevEl.style.backgroundColor = '#'+getHex(R)+getHex(G)+getHex(B);
}

function EndDialog(val){
	var retVal = "";
	if(val=="OK"){
		R = myParseInt(document.getElementById('R_id').value);
		G = myParseInt(document.getElementById('G_id').value);
		B = myParseInt(document.getElementById('B_id').value);
		retVal = "OK!" + "#" + getHex(R)+getHex(G) + getHex(B);
	}
	
	if (document.all) { //IE4 and up
		window.returnValue = retVal;
	} else if (document.layers) {
		
	} else if (document.getElementById) { //mozilla
		if(window.opener.OnChangeColor){
			window.opener.OnChangeColor(fnProcessReturnValue(retVal),g_param);
		}
		else{
			alert('No OnChangeColor function present to call!');
		}
			
	} 

	if(window.opener){
		if(window.opener.OnChangeColor){
			window.opener.OnChangeColor(fnProcessReturnValue(retVal),g_param);
		}
		else{
			alert('No OnChangeColor function present to call!');
		}
		
	}

	window.close();
}

var isShownCustColors = false;
function ShowHideCustColors(){
	
	if (document.all) { //IE4 and up
		if(isShownCustColors){
			window.dialogWidth = 245 + 'px';
			document.getElementById('DefineCustomColors').value = 'Define Custom Colors >>';
		}
		else{
			window.dialogWidth = 495 + 'px';
			document.getElementById('DefineCustomColors').value = 'Define Custom Colors <<';
		}
	} else if (document.layers) {
	} else if (document.getElementById) { //mozilla
		if(isShownCustColors){
			window.resizeTo(245,380);
			document.getElementById('DefineCustomColors').value = 'Define Custom Colors >>';
		}
		else{
			window.resizeTo(495,380);
			document.getElementById('DefineCustomColors').value = 'Define Custom Colors <<';
		}
		
	} 
	isShownCustColors = !isShownCustColors;
}


By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Software Developer (Senior)
United Kingdom United Kingdom
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions