//####################################################################################################
/*colors.js*/
function hsb2rgb(h,s,b){
 h = h > 360 ? h-360 : h;
 h = Math.round(h);
 s = Math.round(s);
 b = Math.round(b);

 var hexBrightness = Math.round(b * 2.55);
 if(s==0){
  return { r:hexBrightness, g:hexBrightness, b:hexBrightness };
  }
 var Hi = Math.floor(h / 60);
 var f = h / 60 - Hi;
 var p = Math.round(b * (100 - s) * .0255);
 var q = Math.round(b * (100 - f * s) * .0255);
 var t = Math.round(b * (100 - (1 - f) * s) * .0255);
 switch(Hi){
  case 0: return {r:hexBrightness, g:t, b:p};
  case 1: return {r:q, g:hexBrightness, b:p};
  case 2: return {r:p, g:hexBrightness, b:t};
  case 3: return {r:p, g:q, b:hexBrightness};
  case 4: return {r:t, g:p, b:hexBrightness};
  case 5: return {r:hexBrightness, g:p, b:q};
  }
 return false;
 }
function rgb2hsb(r,g,b){
 var h, s, b;
 r = parseFloat(r); g = parseFloat(g); b = parseFloat(b);

 var cmax = (r>g && r>b) ? r : ( g>b ? g : b );
 var cmin = (r<g && r<b) ? r : ( g<b ? g : b );

 b = cmax / 255.0;
 s = (cmax != 0) ? (cmax - cmin) / cmax : 0 ;

 if(s == 0){ h = 0;}
 else{
  var redc = (cmax - r) / (cmax - cmin);
  var greenc = (cmax - g) / (cmax - cmin);
  var bluec = (cmax - b) / (cmax - cmin);

  if(r==cmax){ h = bluec - greenc; }
  else if(g==cmax){ h = 2.0 + redc - bluec; }
  else { h = 4.0 + greenc - redc; }
  
  h = (h>0) ? h / 6.0 : h + 1.0 ;
  }
 return { h:Math.round(h*360), s:Math.round(s*100), b:Math.round(b*100) };
 }

function dec2hex(n){ var r = n.toString(16); return (r.length==1) ? "0"+r : r ; }
function hex2dec(hex){ return parseInt(hex,16); }
function rgb_hex2dec(hex){ return {'r':hex2dec(hex.substring(0,2)), 'g':hex2dec(hex.substring(2,4)), 'b':hex2dec(hex.substring(4,6))}; }
function parseRGB(str){
 str = str.replace("rgb(","").replace(")","");
 var rgb = str.split(",",3);
 return {r:parseInt(rgb[0]),g:parseInt(rgb[1]),b:parseInt(rgb[2])};
 }

function get_hsb(id){
 var c = parseRGB(fixStyle(id,'background-color'));
 c = rgb2hsb(c.r,c.g,c.b);
 return { h:c.h, s:c.s, b:c.b };
 }
function set_hsb(id,h,s,b){
 h = (h>360) ? h-360 : (h<0 ? h+360 : h );
 var c = hsb2rgb(h,s,b);
 setStyle(getElem(id),'background-color','#'+dec2hex(c.r)+dec2hex(c.g)+dec2hex(c.b));
 }

//####################################################################################################
/*color-transitions.js*/
function animateColor(id,c2,millisec){ animateRGB(id,c2,millisec,'color'); }
function animateBGColor(id,c2,millisec){ animateRGB(id,c2,millisec,'background-color'); }
function animateRGB(id,c2,millisec,param){

 var c1 = fixStyle(id,'background-color');
 c1 = (c1.search('#')>-1) ? rgb_hex2dec(c1.substring(1)) : parseRGB(c1) ;
 c2 = (c2.search('#')>-1) ? rgb_hex2dec(c2.substring(1)) : parseRGB(c2) ;

 var msi = millisec/20;//1000/20=50fps
 
 var ir = -(c1.r-c2.r)/msi; var ig = -(c1.g-c2.g)/msi; var ib = -(c1.b-c2.b)/msi;
   
 for(var i=1;i<=msi;i++){
  cr = Math.round(c1.r+i*ir); cg = Math.round(c1.g+i*ig); cb = Math.round(c1.b+i*ib);
  if(cr>255||cb>255||cg>255||cr<0||cb<0||cg<0) alert(i+' : '+cr+','+cg+','+cb);
  var color = '#'+dec2hex(cr)+dec2hex(cg)+dec2hex(cb);
  
  setTimeout( 'setStyle(\''+id+'\',\''+param+'\',\''+color+'\')', i*10 );
  
  
  }
 }
