/* DHTML Color Picker v1.0.3, Programming by Ulyses, ColorJack.com */
/* Updated August 24th, 2007 */
/* modified by youcan Sep-2007 */

if(typeof $=='undefined') {function $(v) {return(document.getElementById(v));}}
function $S(v) { return(document.getElementById(v).style); }
function absPos(o) { var r={x:o.offsetLeft,y:o.offsetTop}; if(o.offsetParent) { var v=absPos(o.offsetParent); r.x+=v.x; r.y+=v.y; } return(r); }  
function agent(v) { return(Math.max(navigator.userAgent.toLowerCase().indexOf(v),0)); }
function within(v,a,z) { return((v>=a && v<=z)?true:false); }
function XY(e,v) { var z=agent('msie')?[event.clientX+document.body.scrollLeft,event.clientY+document.body.scrollTop]:[e.pageX,e.pageY]; return(z[zero(v)]); }
function XYwin(v) { var z=agent('msie')?[document.body.clientHeight,document.body.clientWidth]:[window.innerHeight,window.innerWidth]; return(!isNaN(v)?z[v]:z); }
function findObjectY(obj) {var curtop = 0;if(obj.offsetParent) {curtop = obj.offsetTop; while(obj = obj.offsetParent) {curtop += obj.offsetTop;}}return curtop;}
function zero(v) { v=parseInt(v); return(!isNaN(v)?v:0); }
function toHex(v) { v=Math.round(Math.min(Math.max(0,v),255)); return("0123456789ABCDEF".charAt((v-v%16)/16)+"0123456789ABCDEF".charAt(v%16)); }
function rgb2hex(r) { return(toHex(r[0])+toHex(r[1])+toHex(r[2])); }
function hsv2hex(h) { return(rgb2hex(hsv2rgb(h))); }
function hex2hsv(h) { return(rgb2hsv(hex2rgb(h))); }
function hex2rgb(v) { var r = Math.max(0,Math.min(parseInt(v.substr(1,2),16),255)); var g = Math.max(0,Math.min(parseInt(v.substr(3,2),16),255)); var b = Math.max(0,Math.min(parseInt(v.substr(5,2),16),255)); return([r,g,b]);}
function rgb2hsv(a) {
	var R=a[0],G=a[1],B=a[2],H=null,S=null,V=null,D,M;
	M=Math.min(R,G,B); V=Math.max(R,G,B); D=V-M; S=(V==0)?0:D/V;
	if(S==0) {H=0;} else {
		if (R==V) {H=60*(G-B)/D;} else {
			if (G==V) {H=120+60*(B-R)/D;} else {if (B==V) {H=240+60*(R-G)/D;}}
		}if (H<=0) { H+=360; }
	}
	H=Math.round(H); S=Math.round(S*100); V=Math.round((V/255)*100); 
	return [H,S,V];
}
function hsv2rgb(r) {
    var F,A,C,R,B,G,S=r[1]/100,V=r[2]/100,H=r[0]/360;
    if(S>0) { 
    	if(H>=1) H=0;
        H=6*H; F=H-Math.floor(H); A=Math.round(255*V*(1.0-S)); B=Math.round(255*V*(1.0-(S*F))); C=Math.round(255*V*(1.0-(S*(1.0-F)))); V=Math.round(255*V); 
        switch(Math.floor(H)) {case 0: R=V; G=C; B=A; break; case 1: R=B; G=V; B=A; break; case 2: R=A; G=V; B=C; break; case 3: R=A; G=B; B=V; break; case 4: R=C; G=A; B=V; break; case 5: R=V; G=A; B=B; break; }
        return([R?R:0,G?G:0,B?B:0]);
    }
    else return([(V=Math.round(V*255)),V,V]);
}

/* PLUGIN */

var maxValue={'h':360,'s':100,'v':100}, HSV={0:360,1:100,2:100};
var hSV=165, wSV=162, hH=163, slideHSV={0:360,1:100,2:100}, zINDEX=15, stop=1;
var colID = ''; var hexID = ''; var preCol = '#000000';

function HSVslide(d,o,e) {
	function tXY(e) { tY=XY(e,1)-ab.y; tX=XY(e)-ab.x; }
	function mkHSV(a,b,c) { return(Math.min(a,Math.max(0,Math.ceil((parseInt(c)/b)*a)))); }
	function ckHSV(a,b) { if(within(a,0,b)) return(a); else if(a>b) return(b); else if(a<0) return('-'+oo); }
	function drag(e) { 
		if(!stop) { 
			if(d!='drag') tXY(e);
			if(d=='SVslide') { ds.left=ckHSV(tX-oo,wSV)+'px'; ds.top=ckHSV(tY-oo,wSV)+'px';
			slideHSV[1]=mkHSV(100,wSV,ds.left); slideHSV[2]=100-mkHSV(100,wSV,ds.top); HSVupdate();
		}
		else if(d=='Hslide') { 
			var ck=ckHSV(tY-oo,hH), j, r='hsv', z={};
			ds.top=(ck-5)+'px'; slideHSV[0]=mkHSV(360,hH,ck);
 			for(var i=0; i<=r.length-1; i++) { j=r.substr(i,1); z[i]=(j=='h')?maxValue[j]-mkHSV(maxValue[j],hH,ck):HSV[i]; }
			HSVupdate(z); $S('SV').backgroundColor='#'+hsv2hex([HSV[0],100,100]);
		}
		else if(d=='drag') { ds.left=XY(e)+oX-eX+'px'; ds.top=XY(e,1)+oY-eY+'px'; }
	}}
	if(stop) { stop=''; var ds=$S(d!='drag'?d:o);
		if(d=='drag') { var oX=parseInt(ds.left), oY=parseInt(ds.top), eX=XY(e), eY=XY(e,1); $S(o).zIndex=zINDEX++; }
		else { var ab=absPos($(o)), tX, tY, oo=(d=='Hslide')?2:4; ab.x+=10; ab.y+=22; if(d=='SVslide') slideHSV[0]=HSV[0]; }
		document.onmousemove=drag; document.onmouseup=function(){ stop=1; document.onmousemove=''; document.onmouseup=''; }; drag(e);
	}
}
function HSVupdate(v) { 
	v=hsv2hex(HSV=v?v:slideHSV);
	$('plugHEX').innerHTML=v;
	$S('plugCUR').background='#'+v;
	if(colID!='') $S(colID).backgroundColor='#'+v;
	if(hexID!='') $(hexID).value='#'+v.toLowerCase();
	forceRefresh(); 
	return(v);
}
function initPicker() { 
	var z=''; var obj = document.getElementsByTagName("body")[0];
	var ele = document.createElement("div"); ele.id = 'blokit';
	obj.appendChild(ele);
	ele = document.createElement("div"); ele.id = 'plugin';
	ele.innerHTML = '<div id="plugCUR"><\/div><div id="plugHEX" title="Hex Value">FFFFFF<\/div><div id="plugCLOSE" title="close"><b>X<\/b><\/div>'
	+ '<br><div id="SV" title="Saturation + Value"><div id="SVslide" style="top: -4px; left: -4px;"><br><\/div><\/div>'
	+ '<form id="H" title="Hue"><div id="Hslide" style="top: -7px; left: -8px;"><br><\/div><div id="Hmodel"><\/div><\/form>';
	obj.appendChild(ele);
	
	for(var i=hSV; i>=0; i--) z+="<div style=\"BACKGROUND: #"+hsv2hex([Math.round((360/hSV)*i),100,100])+";\"><br /><\/div>";
	$('Hmodel').innerHTML=z;
	if(isGE){
		$S('plugCLOSE').MozUserSelect = "none"; 		$S('SV').MozUserSelect = "none";		$S('H').MozUserSelect = "none";	}else if(isWK){		$S('plugin').KhtmlUserSelect = "none";
		$S('plugCLOSE').KhtmlUserSelect = "none";
		$S('SV').KhtmlUserSelect = "none"; 		$S('H').KhtmlUserSelect = "none"; 	}else if(isIE||isOP){
		$('plugCLOSE').unselectable = "on"; 		$('SV').unselectable = "on";		$('H').unselectable = "on";	}	
	if(isIE) {
		$('plugHEX').onmousedown = function(){stop=0; setTimeout('stop=1',100);} 
		$('plugCLOSE').onmousedown = function(){closePicker();} 
		$('SV').onmousedown = function(){HSVslide('SVslide','plugin',event);}
		$('H').onmousedown = function(){HSVslide('Hslide','plugin',event);}
		$('blokit').onclick = function(){closePicker();}
	}else {
		$('plugHEX').setAttribute("onmousedown","stop=0; setTimeout('stop=1',100);"); 
		$('plugCLOSE').setAttribute("onmousedown","closePicker();"); 
		$('SV').setAttribute("onmousedown","HSVslide('SVslide','plugin',event);");
		$('H').setAttribute("onmousedown","HSVslide('Hslide','plugin',event);");
		$('blokit').setAttribute("onClick", "closePicker();");
	}
	$S('plugin').display='none';
}
function openPicker(cid,hid,x,y) {
	colID = cid; hexID = hid;
	preCol = $(hexID).value;
	var T = hex2hsv(preCol);
	var Y = findObjectY($(colID));
	$S('plugin').top=(Y-7)+'px';
	$S('plugin').left='12em';
	$S('SVslide').top=Math.min((170-4)-(T[2]/100*170),170-9)+'px';
	$S('SVslide').left=Math.max((-4)+(T[1]/100*170-4),-4)+'px';
	$S('Hslide').top=Math.min((165-7)-(T[0]/360*165),165-7)+'px';
	$S('SV').backgroundColor='#'+hsv2hex([T[0],100,100]);
	$S('plugin').display='block';
	$S('blokit').display='block';
	HSVupdate(T);
}
function closePicker() { 
	$S('plugin').top='0px'; $S('plugin').left='-999px';
	$S('blokit').display='none';
	$S('plugin').display=($S('plugin').display=='none'?'block':'none');
	if(isWK!=1&&isIE!=1) {
	var a = $(hexID); var e = document.createEvent('MouseEvents');
	e.initMouseEvent('click',true,true,document.defaultView,1,0,0,0,0,false,false,false,false,0,null);
	a.dispatchEvent(e);	
	}else {$(hexID).click(); }
}
