//-----------------------------------------Begin------------------------------------------//
	
	/*		
	===================================================================
	NAME: colorPicker.js
	TYPE: javascript (User Defined Functions)
	VERSION: 1.06.04.12
	CREATED ON: 4/12/06
	AUTHOR: Dean Dal Bozzo, dean@pagefx.com
	===================================================================	

	DESIGNED FOR: When you need a popup window of a color palatte.

	DESCRIPTION: Creates a popup window color picker.

	NOTES: None.

	USAGE: Use with a href or onclick attribute.
		
	ATTRIBUTES: None.
		
	OUTPUT: Popup window
	
	EXAMPLES:
		1. <a href="javascript: void(0);" onclick="showColors('color');">Color Picker</a>
		2. <a href="javascript: showColors('color');">Color Picker</a>
		
		Must include the following in the source file for this to work correctly
			// Set Popup window open to false
     		var popWinOpen = 0;
			var popWin,fldName,pal,idx,clr;			
			
			// Check if pop-up window is already open
			function checkPopup(){
				if(popWin != null && popWin.closed){
					popWinOpen = 0;
				}
			}
			
			// Open pop-up window
			function showColors(strFldName){
				fldName = strFldName;
				pal		= '';
				idx 	= 0;
				clr 	= document.forms[0].clr.value;
				
				// Check if pop-up window is already open
				checkPopup();
				if(popWinOpen == 0){
					// Not open, so open it
					var winFileName			= 'puWin_color2.html';
					var winHeight			= 260;
					var winWidth			= 450;
					var winLf				= (screen.width - winWidth) / 2;
					var winTop				= (screen.height - winHeight) / 2;
					var winProps			= 'height='+ winHeight +',width='+ winWidth +',top=' + winTop + ',left=' + winLf +' ';
			  		popWin 					= window.open(winFileName,'Colors',winProps);
        			popWin.location.href 	= winFileName;
			  		popWin.opener 			= self;
					popWinOpen 				= 1;
       			}
       			popWin.focus();
			}
			
			// Set value from pop-up window and update selected color display
			function setValue(val){
				document.forms[0].clr.value = val;
				showColor(val);
			}
			
			// Check if user inputed valid hex value and update selected color display
			function chkInput(fldObj){
				fldObj.value = chkHexVal('Hex Value',fldObj.value);
				showColor(fldObj.value);
			}

	UPDATES: None
	===================================================================
	*/

//--[Palattes]-------------------------------------------------------//
var g_out	= "'<td bgcolor=\"' + rgb + '\"><a href=\"javascript:setPalletteClr(\\'' + rgb + '\\');\"><img src=\"0images/blank.gif\" width=\"12\" height=\"12\" border=\"0\"></a></td>'";
var g_n 	= 1;

// Build selected palatte				
function generatePalatte(palatte){
	palatte 	= palatte.toLowerCase();
	var clrTbl 	= '';
	var rows 	= 12;
			
	for (row = 0; row < rows; row++) {
		clrTbl += "<tr>";
				
		switch(palatte){
			case 'grays':
				rows 	= 16;
				clrTbl += palGrays(row);
			break;
									
			case 'mac':
				rows 	= 15;
				clrTbl += palMac(row);
			break;
					
			case 'win':
				clrTbl += palWin(row);
			break;
					
			default:
				clrTbl += palWeb(row);
			break;
		}
				
		clrTbl += '</tr>';
	}
	document.write(clrTbl);	
}

// Palatte: Web Safe 216	 
function palWeb(rn){
	var r,g,b,rgb,col,colSet;
	var result = '';
			
	for (col = 0; col < 3; col++){					
		for (colSet = 0; colSet < 6; colSet++){
			r = (col * 51 + (rn % 2) * 51 * 3);
			g = (Math.floor(rn / 2) * 51);
			b = (colSet * 51);				
						
			rgb 	= rgb2HexString(r,g,b);					
			result += eval(g_out);
		}
	}
	return result;
}

// Palatte: Grays 256		
function palGrays(rn){
	var g,rgb,col;
	var result = '';
		
	for (col = 0; col <= 15; col ++) {
		g = Math.floor((col + rn * 16) % 256);

		rgb 	= rgb2HexString(g,g,g);				
		result += eval(g_out);
	}
	return result;
}

// Palatte: Mac OS 270		
function palMac(rn){
	var r,g,b,rgb,col,colSet;
	var result = '';			
			
	for (col = 0; col < 3; col++){					
		for (colSet = 0; colSet < 6; colSet++){
			if(rn < 12){
					r = 255 - (Math.floor(rn / 2) * 51);
					g = 255 - (col * 51 + (rn % 2) * 51 * 3);
					b = 255 - (colSet * 51);
			}else{
				if(g_n <= 14){
					r = 255 - (g_n * 17);
					g = 0;
					b = 0;
				}else if(g_n > 14 && g_n <= 28){
					r = 0;
					g = 255 - ((g_n-14) * 17);
					b = 0;
				}else if(g_n > 28 && g_n <= 42){
					r = 0;
					g = 0;
					b = 255 - ((g_n-28) * 17);
				}else{
					r = 255 - ((g_n-42) * 17);
					g = r;
					b = r;
				}
				g_n++;
			}
			
			rgb 	= rgb2HexString(r,g,b);				
			result += eval(g_out);			
		}
	}
	return result;		
}

// Palatte: Win OS 216		
function palWin(rn){
	var r,g,b,rgb,col,colSet;
	var result = '';
			
	for (col = 0; col < 3; col++){					
		for (colSet = 0; colSet < 6; colSet++){
			g = (col * 51 + (rn % 2) * 51 * 3);
			b = (Math.floor(rn / 2) * 51);
			r = (colSet * 51); 
					
			rgb 	= rgb2HexString(r,g,b);				
			result += eval(g_out);			
		}
	}	
	return result;	
}

//--[User clicked a color, show selected color and values]------------------------//
function setPalletteClr(hex){
	document.forms[0].fHex.value = hex;
	chgInputVal(document.forms[0].fHex);
}

//--[User changed input values]---------------------------------------------------//
var g_r,g_g,g_b,g_h,g_s,g_br,g_hex;


// Event Handler
function chgInputVal(fldObj){
	var fldName = fldObj.name.toLowerCase().substr(0,2);
	
	// Get form values
	var frmObj 	= document.forms[0];
	var frmHex	= frmObj.fHex.value;
	var frmR	= parseInt(frmObj.f1Red.value);
	var frmG	= parseInt(frmObj.f1Green.value);
	var frmB	= parseInt(frmObj.f1Blue.value);
	var frmH	= parseInt(frmObj.f2Hue.value);
	var frmS	= parseInt(frmObj.f2Saturation.value);
	var frmBr	= parseInt(frmObj.f2Brightness.value);
	
	// Validation / Format
	var min	 	= 0;
	var max 	= 255;
	var maxH 	= 360;
				
	g_r		= chkIntVal('Red',frmR,min,max);
	g_g		= chkIntVal('Green',frmG,min,max);
	g_b		= chkIntVal('Blue',frmB,min,max);
	
	max 	= 100;
	
	g_h		= chkIntVal('Hue',frmH,min,maxH);
	g_s		= chkIntVal('Saturation',frmS,min,max);
	g_br	= chkIntVal('Brightness',frmBr,min,max); 	
	
	g_hex 	= chkHexVal('Hex',frmHex); 
	
 	// END Validation / Format
		
	switch(fldName){
		case 'f1':
			frmObj.f1Red.value 		= g_r;
			frmObj.f1Green.value	= g_g;
			frmObj.f1Blue.value		= g_b;
			
			g_hex = rgb2HexString(g_r,g_g,g_b);			
			frmObj.fHex.value 		= g_hex;
			
			convertRGBtoHSB(g_r,g_g,g_b);
			frmObj.f2Hue.value 			= g_h;
			frmObj.f2Saturation.value 	= g_s;
			frmObj.f2Brightness.value 	= g_br;
		break;

		case 'f2':
			frmObj.f2Hue.value 			= g_h;
			frmObj.f2Saturation.value 	= g_s;
			frmObj.f2Brightness.value 	= g_br;
			
			convertHSBtoRGB(g_h,g_s,g_br);
			frmObj.f1Red.value 		= g_r;
			frmObj.f1Green.value	= g_g;
			frmObj.f1Blue.value		= g_b;
						
			g_hex = rgb2HexString(g_r,g_g,g_b);			
			frmObj.fHex.value = g_hex;
		break;
		
		default:
			frmObj.fHex.value = g_hex;	
								
			convertHextoRGB(g_hex);		
			frmObj.f1Red.value 		= g_r;
			frmObj.f1Green.value	= g_g;
			frmObj.f1Blue.value		= g_b;	
			
			convertRGBtoHSB(g_r,g_g,g_b);
			frmObj.f2Hue.value 			= g_h;
			frmObj.f2Saturation.value 	= g_s;
			frmObj.f2Brightness.value 	= g_br;
		break;
	}
	
	// Update selected color display
	showColor(g_hex);
}

//--[Functions for Event Handler]-----------------------------------//
// Convert RGB to HSB
function convertRGBtoHSB(r,g,b){
	var m	= Math.min(Math.min(r,g),b);
	var br	= Math.max(Math.max(r,g),b);
	var d	= br - m;
	var s	= (br == 0) ? 0 : d / br;
	var h;
	
	if(s == 0){
		h = 0;
	}else{
		if(r == br){
			h = (60 * (g - b)) / d;
		}else if(g == br){
			h = 120 + (60 * (b - r)) / d;
		}else{
			h = 240 + (60 * (r - g)) / d;
		}
		if(h < 0){
			h += 360;
		}
	}
			
	s  *= 100;
	br 	= (br / 255) * 100;
	
	// Set global values	
	g_h 	= Math.round(h);
	g_s 	= Math.round(s);
	g_br	= Math.round(br);
}

// Convert HSB to RGB
function convertHSBtoRGB(h,s,br){
	var r,g,b;
	h %= 360;
			
	if(br == 0){
		r = 0;
		g = 0;
		b = 0;
	}
	
	h  /= 60;		
	s  /= 100;
	br /= 100;
			
	var i = Math.floor(h);
	var f = h - i;
	var p = br * (1 - s);
	var q = br * (1 - (s * f));
	var t = br * (1 - (s * (1 - f)));
			
	switch(i){
		case 0:
			r = br;
			g = t;
			b = p;
		break;
				
		case 1:
			r = q;
			g = br;
			b = p;
		break;
				
		case 2:
			r = p;
			g = br;
			b = t;
		break;
				
		case 3:
			r = p;
			g = q;
			b = br;
		break;
				
		case 4:
			r = t;
			g = p;
			b = br;
		break;
				
		case 5:
			r = br;
			g = p;
			b = q;
		break;
	}
	
	r = Math.round(r * 255);
	g = Math.round(g * 255);
	b = Math.round(b * 255);
	
	// Set global values
	g_r = r;
	g_g	= g;
	g_b	= b;			
}

// Convert Hex to RGB
function convertHextoRGB(hex){	
	var r = parseInt(hex.substr(0,2),16);
	var g = parseInt(hex.substr(2,2),16);
	var b = parseInt(hex.substr(4,2),16);
	
	// Set global values
	g_r = r;
	g_g	= g;
	g_b	= b;
}

// Convert Hex to RGB
function rgb2HexString(r,g,b){
 	var rgb 	= r << 16 | g << 8 | b;
 	var result 	= rgb.toString(16);
		 	
 	while(result.length < 6){
		result = '0' + result;
	}
	return result;
}

//--[Check integer value, if needed display error message]----------------------------//
function chkIntVal(strName,intVal,intMin,intMax){
	strName = strName	|| '';
	intVal	= intVal	|| 0;
	intMin	= intMin	|| 0;
	intMax	= intMax	|| 0;
			
	var result,errTxt;
			
	// Check for integer value and if in range of minimum and maximum
	if(intVal > (intMin-1) && intVal < (intMax+1)){
		// Passed
		result = intVal;
	}else{
		// Check if value is out of range
		if(intVal > intMax){
			// Value is greater than maximum
			result = intMax;
		}else{
			// Value is less than minimum
			result = 0;
		}
		errTxt = strName + ' value must be between ' + intMin + ' and ' + intMax + '.\nClosest value will be inserted';
				
		// Display error message
		alert(errTxt);
	}
	return result;
}
//--[Check hex value, if needed display error message]----------------------------//
function chkHexVal(strName,strHex){
 	// Format hex input, 6 charaters minimum		
 	while(strHex.length < 6){
 		strHex = '0' + strHex;
 	}
 	
 	// Regular expression pattern to parse hex color input
 	var re = /^#?([0-9a-fA-f]{6})$/
 	
 	var validHex = re.exec(strHex);
	
	// Input is not valid, reset input and display error message
	if(!validHex){
		strHex 	= '000000';		
		
		// Display error message
		alert(strName + ' values must be between 0-f.\n' + strHex + ' value will be inserted');
	}else{
		 strHex = validHex[1].toLowerCase();
	}
	
	return strHex;
}

//--[Display selected color]----------------------------//
function showColor(strHexVal){
	// Show the color in the toolbar rectangle
	strHexVal = '#' + strHexVal;
	
	// Browser NN4
	if(document.layers) {      
		document.layers["divColor"].bgColor = strHexVal;
				
	// Browser IE          
	} else if(document.all) {          
		 document.all.divColor.style.backgroundColor = strHexVal;  
				 
	// Browser NN6
	} else if(!document.all && document.getElementById) {          
		document.getElementById("divColor").style.backgroundColor = strHexVal;           
	}
}
//----------------------------------End All-----------------------------------------------//