var OnBoxChange=null

///////////////////////////////////////////


var compo=["hue","lum","sat"]
var composhort=["h","l","s"]
var compowrap=[1,0,0]

var useAdvanced=true
if(useAdvanced){
 document.write("<scr"+"ipt type='text/javascript' src='/misc/cboxadv.js'></scr"+"ipt>")
}
function HlsGetRgbInt(q1,q2,hue) {
  if (hue>=360) hue=hue-360;
  if (hue<0) hue=hue+360;
  if (hue<60) return Math.round(q1+(q2-q1)*hue/60);
  else if (hue<180) return (q2);
  else if (hue<240) return Math.round(q1+(q2-q1)*(240-hue)/60);
  else return (q1);
}

function BOUND(a,mn,mx){
 if(a<mn)a=mn
 if(a>mx)a=mx
 return a
}

function HlsToRgbInt(hls) {
 var p1,p2;
 var r,g,b;
 var H=hls[0];//0-359
 var L=hls[1];//0-255
 var S=hls[2];//0-255
 if(S==0){
  return [L,L,L]
 }
 if (L<=127){ 
  p2=L*(255+S);
  p2=p2/255;
 } else {
  p2=L*S;
  p2=p2/255;
  p2=L+S-p2;
 }
 p1=(L<<1)-p2;
 r=HlsGetRgbInt(p1,p2,H+120);
 g=HlsGetRgbInt(p1,p2,H);
 b=HlsGetRgbInt(p1,p2,H-120);
 ret=[
  BOUND(r,0,255),
  BOUND(g,0,255),
  BOUND(b,0,255)
 ]
 return [
  Math.round(ret[0]),
  Math.round(ret[1]),
  Math.round(ret[2])
 ]
}

function RgbToHlsInt(rgb){
  var h=0,lt,s;
  var vmin,vmax,delta;
  var r = rgb[0];
  var g = rgb[1];
  var b = rgb[2];
  vmin = Math.min(Math.min(r,g),b);
  vmax = Math.max(Math.max(r,g),b);
  lt = Math.round((vmax+vmin)/2);
  if (vmax==vmin) {
   s = 0;
   h = 0;
  } else {
   var Rdelta,Gdelta,Bdelta;
   var vdelta=(vmax-vmin);
   var vadd=(vmax+vmin);
   var hvdelta=vdelta/2;
   var dividend=(lt<=127)?vadd:510-vadd;
   s=Math.round((vdelta*255)/dividend);
   if (r == vmax){
    Gdelta = Math.round(  ( ((vmax-g)*60) + hvdelta ) / vdelta);
    Bdelta = Math.round(  ( ((vmax-b)*60) + hvdelta ) / vdelta);
    h = Bdelta - Gdelta;
   } else if (g == vmax){
    Rdelta = Math.round(  ( ((vmax-r)*60) + hvdelta ) / vdelta);
    Bdelta = Math.round(  ( ((vmax-b)*60) + hvdelta ) / vdelta);
    h = 120 + Rdelta - Bdelta;
   } else {
    Rdelta = Math.round(  ( ((vmax-r)*60) + hvdelta ) / vdelta );
    Gdelta = Math.round(  ( ((vmax-g)*60) + hvdelta ) / vdelta );
    h = 240 + Gdelta - Rdelta;
   }
   if (h<0)h += 360;
   if (h>=360)h -= 360;
  }
  ret=[h,BOUND(lt,0,255),BOUND(s,0,255)]
  return [
   Math.round(ret[0]),
   Math.round(ret[1]),
   Math.round(ret[2])
  ]
}

function GetRGB(x,y,z){
 var hue=Math.round(x*360/32)
 var hls=[hue,y<<3,z<<3]
 if(hue>=360)hue=0;
 return HlsToRgbInt(hls)
}

function GetNative(r,g,b){
 var hls=RgbToHlsInt([r,g,b])
 hue=Math.round(hls[0]*32/360)
 if(hue>=32)hue=0;
 ret=[hue,(hls[1]+4)>>3,(hls[2]+4)>>3]
 for(i=0;i<ret.length;i++){
  ret[i]=BOUND(ret[i],0,31)
 }
 return ret
}


var rgb_compo=["red","green","blue"]
var rgb_composhort=["r","g","b"]
function rgb_GetRGB(x,y,z){
 return [x<<3,y<<3,z<<3]
}
function rgb_GetNative(r,g,b){
 return [r>>3,g>>3,b>>3]
}

///////////////////////////////////////////

function parseIntSafe(num,rdx){
 var r=parseInt(num,rdx?rdx:10)
 if(isNaN(r))return 0
 return r
}

function getcurcolor(f){//returns native components (e.g. for red, this is 0..31)
 var r=document.getElementById(f+"_"+compo[0]).value
 var g=document.getElementById(f+"_"+compo[1]).value
 var b=document.getElementById(f+"_"+compo[2]).value
 r=parseIntSafe(r,10)
 g=parseIntSafe(g,10)
 b=parseIntSafe(b,10)
 return [r,g,b]
}

function hx2(v){
 ret=(v<16)?"0":""
 return ret+v.toString(16)
}

function setbackcolor(o,r,g,b){
 r=Math.round(r)
 g=Math.round(g)
 b=Math.round(b)
 o.style.backgroundColor="rgb("+r+","+g+","+b+")"
}


function setbgcolor(o,x,y,z){//in native components (e.g. for red, this is 0..31)
 var rgb=GetRGB(x,y,z)
 setbackcolor(o,rgb[0],rgb[1],rgb[2])
}

function updateswatch(f){
 var rgb=getcurcolor(f)
 var o=document.getElementById("swatch_"+f)
 if(o){
  setbgcolor(o,rgb[0],rgb[1],rgb[2])
  o.style.position="relative"
  o.innerHTML="&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
 }
}

function colorbars(f){
 var rgb=getcurcolor(f)
 for(var i=0;i<32;i++){
  var ro=document.getElementById(f+"_"+compo[0]+"_"+i)
  var go=document.getElementById(f+"_"+compo[1]+"_"+i)
  var bo=document.getElementById(f+"_"+compo[2]+"_"+i)
  setbgcolor(ro,i,rgb[1],rgb[2])
  setbgcolor(go,rgb[0],i,rgb[2])
  setbgcolor(bo,rgb[0],rgb[1],i)
 }
}

function getCurrentRGB(f){
 var rgb=getcurcolor(f)
 return GetRGB(rgb[0],rgb[1],rgb[2])
}

function setChangedColor(x,rgb){
  var oDst=document.getElementById("color_"+x)
  if(oDst)
   oDst.value=tohex(rgb[0],rgb[1],rgb[2])
  var oDst=document.getElementById("newcolor_"+x)
  if(oDst)
   oDst.value=tohex2(rgb[0],rgb[1],rgb[2])
  CallBoxChange(x,rgb)
  mainswatch(x)
}

function padhex2(x){
 if(x<16)
  return "0"+x.toString(16).toUpperCase()
 else
  return x.toString(16).toUpperCase()
}

function tohex2(r,g,b){
 return "#"+padhex2(r)+padhex2(g)+padhex2(b)
}

function tohex(r,g,b){
 r>>=3;
 g>>=3;
 b>>=3;
 r|=(g<<5)|(b<<10)
 var ret="0000"+r.toString(16).toUpperCase()
 ret=ret.substr(ret.length-4)
 return ret
}

function hextocolors(x){
 var hex=parseIntSafe(x,16)
 var ret=[]
 ret[0]=hex&0x1F
 ret[1]=(hex>>5)&0x1F
 ret[2]=(hex>>10)&0x1F
 return ret
}

function hex2tocolors(x){
 var hex=parseIntSafe(x,16)
 var ret=[]
 ret[0]=hex&0x1F
 ret[1]=(hex>>5)&0x1F
 ret[2]=(hex>>10)&0x1F
 return ret
}

function getinputcolor(src){
 var oVal=document.getElementById("color_"+src) //always in RGB 15-bit format
 if(oVal){
  var cols=hextocolors(oVal.value)
  cols[0]<<=3;
  cols[1]<<=3;
  cols[2]<<=3;
  return cols
 }
 oVal=document.getElementById("newcolor_"+src)
 if(oVal){
  var cols=colorToRgb(oVal.value)
  return cols
 }
 return [0,0,0]
}

function transfercolor(src,dst){
 var cols=getinputcolor(src)
 var o=document.getElementById(dst)
 if(o){
  setbackcolor(o,cols[0],cols[1],cols[2]) 
 }
}

function setvaluebase(f,compon,v){
 var formval=document.getElementById(f+"_"+compon)
 var oldval=parseIntSafe(formval.value,10)
 var oldo=document.getElementById(f+"_"+compon+"_"+oldval)
 var newo=document.getElementById(f+"_"+compon+"_"+v)
 if(oldo)oldo.innerHTML="-"
 if(newo)newo.innerHTML="|"
 if(formval)
  formval.value=v
}

function mainswatch(f){
 transfercolor(f,"cbswatch_"+f)
}

function setvalue(f,compon,v){
 setvaluebase(f,compon,v)
 updateswatch(f)
 colorbars(f)
}

function genline(index,frm){
 var ret=""
 x=compo[index]
 xshort=composhort[index]
 ret+=xshort+":&lt;"
 for(var i=0;i<32;i++){
  ret+="<a"
  ret+=" id='"+frm+"_"+x+"_"+i+"'"
  ret+=" href='javascript:setvalue(\""+frm+"\",\""+x+"\","+i+")'>-</a>";
 }
 ret+="&gt;"
 ret+="&nbsp;&nbsp;&nbsp;&nbsp;"
 ret+="<input type=\"text\" id=\""+frm+"_"+x+"\" value=\"0\" size=\"2\" maxlength=\"2\" /><br/>\r\n"
 return ret
}

function colorform(frm){
 var f=""
 f+=genline(0,frm)
 f+=genline(1,frm)
 f+=genline(2,frm)
 f+="<div id=\"swatch_"+frm+"\" style=\"width: 250px;\"></div>\r\n";
 f+="<a href=\"javascript:closeform('"+frm+"',1)\">Done</a> | "
 f+="<a href=\"javascript:closeform('"+frm+"',0)\">Cancel</a>\r\n";
 return f
}

function openform(x){
 if(useAdvanced){
  openAdvancedForm(x)
  return
 }
 var o=document.getElementById("cont_"+x)
 if(o.style.display=="block"){
  closeform(x,1)
 } else {
  var cols=getinputcolor(x)
  var cf=colorform(x)
  o.innerHTML=cf
  cols=GetNative(cols[0]<<3,cols[1]<<3,cols[2]<<3);
  setvalue(x,compo[0],cols[0])
  setvalue(x,compo[1],cols[1])
  setvalue(x,compo[2],cols[2])
  o.style.display="block";
 }
}
function closeform(x,change){
 if(useAdvanced){
  closeAdvancedForm(x,change)
  return
 }
 var o=document.getElementById("cont_"+x)
 if(change){
  var rgb=getCurrentRGB(x)
  setChangedColor(x,rgb)
 }
 o.style.display="none";
 o.innerHTML=""
}
function colorbox(label,x,start){
 if(!start)start="0000"
 var onchg=" onchange=\"CallBoxChange('"+x+"')\""
 var cbox=""
 cbox+="<div class=\"colorboxouter\">";
 cbox+="<span id=\"cbswatch_"+x+"\"\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"
 cbox+="&nbsp;<label for=\"color_"+x+"\">"+label+"</label> "
 cbox+="<input id=\"color_"+x+"\" value=\""+start+"\" type=\"text\" size=\"4\" maxlength=\"4\" "+onchg+"/>"
 cbox+="&nbsp;&nbsp;<a href=\"javascript:openform('"+x+"')\">Change color</a>"
 cbox+="<div class=\"colorboxinner\" id=\"cont_"+x+"\"></div></div>";
 return cbox
}

function writecbox(label,x,start){
 if(document.getElementById){
  document.write(colorbox(label,x,start))
  mainswatch(x)
 }
}


function colorlink(label,x,start,showswatch){
 if(!start)start="0000"
 var cbox=""
 cbox+="<div class=\"colorboxouter\">";
 if(showswatch){
  cbox+="<span id=\"cbswatch_"+x+"\"\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>&nbsp;&nbsp;"
 }
 cbox+="<a href=\"javascript:openform('"+x+"')\">"+label+"</a>"
 cbox+="<div class=\"colorboxinner\" id=\"cont_"+x+"\"></div></div>";
 return cbox
}


function writeclink(label,x,start,showswatch){
 if(document.getElementById){
  document.write(colorlink(label,x,start,showswatch))
  mainswatch(x)
 }
}

/////////////////////////////////////

function boundwrap(v,wrap){
  if(wrap){
   while(v<0)v+=32
   while(v>=32)v-=32
  } else {
   v=BOUND(v,0,31)
  }
  return v
}

function adjcloseform(x,change){
 var o=document.getElementById("cont_"+x)
 if(change){
  var labels=document.getElementById("color_"+x)
  labels=labels.value
  labels=labels.split(",")
  for(var i=0;i<labels.length;i++){
   var oSrc=document.getElementById("cacolor_"+x+"_"+labels[i])
   var oDst=document.getElementById("color_"+labels[i])
   var cols=hextocolors(oSrc.value)
   cols[0]<<=3;
   cols[1]<<=3;
   cols[2]<<=3;
   setChangedColor(labels[i],cols)
  }
 }
 o.style.display="none";
 o.innerHTML=""
}

function adjsetvalue(f,compon,v){
 var labels=document.getElementById("color_"+f)
 setvaluebase(f,compon,v)
 labels=labels.value
 labels=labels.split(",")
 for(var i=0;i<labels.length;i++){
  var cols=getinputcolor(labels[i])//get color as 8-bit RGB
  cols=GetNative(cols[0],cols[1],cols[2])//convert to native format
  var adjust=getcurcolor(f)//get adjustments
  var o=document.getElementById("caswatch_"+f+"_"+labels[i])
  var oFrm=document.getElementById("cacolor_"+f+"_"+labels[i])
  cols[0]+=adjust[0]
  cols[1]+=adjust[1]
  cols[2]+=adjust[2]
  cols[0]=boundwrap(cols[0],compowrap[0])
  cols[1]=boundwrap(cols[1],compowrap[1])
  cols[2]=boundwrap(cols[2],compowrap[2])
  cols=GetRGB(cols[0],cols[1],cols[2])//convert to 8-bit RGB
  oFrm.value=tohex(cols[0],cols[1],cols[2])
  setbackcolor(o,cols[0],cols[1],cols[2]) 
 }
}


function adjgenline(index,frm){
 var ret=""
 x=compo[index]
 xshort=composhort[index]
 ret+=xshort+":&lt;"
 for(var i=-31;i<32;i++){
  ret+="<a"
  ret+=" id='"+frm+"_"+x+"_"+i+"'"
  ret+=" href='javascript:adjsetvalue(\""+frm+"\",\""+x+"\","+i+")'>-</a>";
 }
 ret+="&gt;"
 ret+="&nbsp;&nbsp;&nbsp;&nbsp;"
 ret+="<input type=\"text\" id=\""+frm+"_"+x+"\" value=\"0\" size=\"3\" maxlength=\"3\" /><br/>\r\n"
 return ret
}


function adjcolorform(frm,labels){
 var f=""
 f+="<div class=\"coloradjust\">";
 for(i=0;i<labels.length;i++){
  f+="<span id=\"caswatch_"+frm+"_"+labels[i]+"\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>";
  f+="<input id=\"cacolor_"+frm+"_"+labels[i]+"\" type=\"hidden\" value=\"\"/>";
 }
 f+="<br/>";
 f+=adjgenline(0,frm)
 f+=adjgenline(1,frm)
 f+=adjgenline(2,frm)
 f+="<div id=\"swatch_"+frm+"\" style=\"width: 200;\"></div>\r\n";
 f+="<a href=\"javascript:adjcloseform('"+frm+"',1)\">Done</a> | "
 f+="<a href=\"javascript:adjcloseform('"+frm+"',0)\">Cancel</a>\r\n";
 f+="</div>";
 return f
}


function adjopenform(x){
 var o=document.getElementById("cont_"+x)
 if(o.style.display=="block"){
  adjcloseform(x,1)
 } else {
  var oDst=document.getElementById("color_"+x)
  labels=oDst.value.split(",")
  var cf=adjcolorform(x,labels)
  o.innerHTML=cf
  adjsetvalue(x,compo[0],0)
  adjsetvalue(x,compo[1],0)
  adjsetvalue(x,compo[2],0)
  o.style.display="block";
 }
}

function adjcolorbox(x,colorlabels){
 var cbox=""
 cbox+="<div class=\"colorboxouter\">";
 cbox+="<input id=\"color_"+x+"\" value=\""+colorlabels.join(",")+"\" type=\"hidden\"/>"
 cbox+="&nbsp;&nbsp;<a href=\"javascript:adjopenform('"+x+"')\">Adjust all colors</a>"
 cbox+="<div class=\"colorboxinner\" id=\"cont_"+x+"\"></div></div>";
 return cbox
}

function adjwritecbox(x,colorlabels){
 if(document.getElementById){
  document.write(adjcolorbox(x,colorlabels))
 }
}

////////////////////////////////////

function CallBoxChange(o,rgb){
 if(OnBoxChange){
  OnBoxChange(o,rgb ? rgb : getinputcolor(o))
 }
}

