// code borrowed and modified from http://www.photos.com
// some code borrowed and modified from http://www.ficml.org/jemimap/style/color/wheel.html

var cp_pick = '';
var cp_contrast = '';
var cp_mouse;
var cp_mouse_con;
var cp_bar_colors = new Array(16);
var cp_bar_contrast = new Array(16);
  
function cp_init() {
  capture();
  unset_cp_vals();
}

// HSV conversion algorithm adapted from easyrgb.com
function hsv2rgb(Hdeg,S,V) {
  var H = Hdeg/360;     // convert from degrees to 0 to 1
  var R, G, B;
  if (S==0) {       // HSV values = From 0 to 1
    R = V*255;     // RGB results = From 0 to 255
    G = V*255;
    B = V*255;
  } else {
    var var_h = H*6;
    var var_i = Math.floor( var_h );     //Or ... var_i = floor( var_h )
    var var_1 = V*(1-S);
    var var_2 = V*(1-S*(var_h-var_i));
    var var_3 = V*(1-S*(1-(var_h-var_i)));
    var var_r, var_g, var_b;
    if (var_i==0)      {var_r=V ;    var_g=var_3; var_b=var_1}
    else if (var_i==1) {var_r=var_2; var_g=V;     var_b=var_1}
    else if (var_i==2) {var_r=var_1; var_g=V;     var_b=var_3}
    else if (var_i==3) {var_r=var_1; var_g=var_2; var_b=V}
    else if (var_i==4) {var_r=var_3; var_g=var_1; var_b=V}
    else               {var_r=V;     var_g=var_1; var_b=var_2}
    R = Math.round(var_r*255);   //RGB results = From 0 to 255
    G = Math.round(var_g*255);
    B = Math.round(var_b*255);
  }
  return new Array(R,G,B);
}

function rgb2hex(rgbary) {
  var hex = "#";
  for (var i = 0; i < 3; i++) {
    var tmp = parseInt(rgbary[i]).toString(16);
    if (tmp.length < 2) tmp = "0" + tmp;
    hex = hex + tmp;
  }
  return hex;
}

function capture() {
  if(document.layers) {
    var layobj = document.layers['wheel'];
    layobj.document.captureEvents(Event.MOUSEMOVE);
    layobj.document.onmousemove = mouseMoved;
  } else if (document.all) {
    var layobj = document.all["wheel"];
    layobj.onmousemove = mouseMoved;
  } else if (document.getElementById) {
    window.document.getElementById("wheel").onmousemove = mouseMoved;
  }
}

function mouseMoved(e) {
  var x, y, cp_rgb;
  var cp_adeg = 0;
  var cp_val = 1;
  var cp_sat = 1;

  if (document.layers) {
    x = e.layerX;
    y = e.layerY;
  } else if (document.all) {
    x = event.offsetX;
    y = event.offsetY + document.body.scrollTop; // mac IE fix
  } else if (document.getElementById) {
    var x_off = 0, y_off = 0;
    x_off = document.getElementById("wheel").offsetLeft;
    y_off = document.getElementById("wheel").offsetTop;
    var parent = document.getElementById("wheel").offsetParent;
    while(parent) {
      x_off = x_off + parent.offsetLeft;
      y_off = y_off + parent.offsetTop;
      parent = parent.offsetParent;
    }
    x = (e.pageX - x_off);
    y = (e.pageY - y_off);
  }
  if (x >= 108) {return false;}
  if (y >= 108) {return false;}
  
  var cartx = x - 54;
  var carty = 54 - y; 
  var cartx2 = cartx * cartx;
  var carty2 = carty * carty;              //normalize x
  var rraw = Math.sqrt(cartx2 + carty2);   //raw radius 
  var rnorm = rraw/54;                     //normalized radius
  if (rraw == 0) {
    cp_rgb = new Array(255,255,255);
  } else {
    var arad = Math.acos(cartx/rraw);            //angle in radians 
    var aradc = (carty>=0)?arad:2*Math.PI - arad;  //correct below axis
    cp_adeg = 360 * aradc/(2*Math.PI);  //convert to degrees
    if (rnorm > 1) {    // outside circle
      cp_rgb = new Array(255,255,255);
    } else {
      cp_sat = rnorm;
      cp_rgb = hsv2rgb(cp_adeg,cp_sat,cp_val);
    }
  }
  cp_mouse = rgb2hex(cp_rgb);
  cp_mouse_con = cp_calc_contrast(cp_mouse);
  return false;
}

function rgb_scale(hex, val) { // val is 0 - 15
  var r = parseInt(hex.substring(1,3), 16);
  var g = parseInt(hex.substring(3,5), 16);
  var b = parseInt(hex.substring(5,7), 16);

  var max = (r > g) ? (r > b) ? r : b : (g > b) ? g : b;
  var rp, gp, bp;
  if(max == 0) {
    rp = gp = bp = 1;
  } else {
    rp = r/max;
    gp = g/max;
    bp = b/max;
  }

  var nr = parseInt(rp * (val * 16 + 15)).toString(16);
  if (nr.length < 2) nr="0"+nr;
  var ng = parseInt(gp * (val * 16 + 15)).toString(16);
  if (ng.length < 2) ng="0"+ng;
  var nb = parseInt(bp * (val * 16 +15)).toString(16);
  if (nb.length < 2) nb="0"+nb;

  return("#" + nr + ng + nb);
}

function cp_wheel() {
  cp_pick = cp_mouse;
  cp_contrast = cp_mouse_con;
  set_cp_vals();
  return false;
}

function cp_bar(bar_num) {  // clicked the bar, update the swatch
  cp_pick = cp_bar_colors[bar_num];
  cp_contrast = cp_bar_contrast[bar_num];
  set_cp_vals(1);
}

function cp_contrast_click() {
  var tmp = cp_pick;
  cp_pick = cp_contrast;
  cp_contrast = tmp;
  set_cp_vals();
  return false;
}

function cp_text_entry() {
  var new_val = document.forms.advsearch.rgb1_value.value;

  if(new_val.match(/^#?[0-9A-Fa-f]{6}$/)) {
    if(new_val.length == 6) new_val = '#' + new_val;
    cp_pick = new_val;
    cp_contrast = cp_calc_contrast(cp_pick);
    set_cp_vals();
  } else {
    document.forms.advsearch.rgb1_value.value = cp_pick;
    document.search.keyw_color.value = cp_pick;
document.search_2.keyw_color2.value = cp_pick;
document.search2.keyw_color3.value = cp_pick;
  }
  return false;
}

function cp_calc_contrast(hex) {
  var r = parseInt(hex.substring(1,3), 16);
  var g = parseInt(hex.substring(3,5), 16);
  var b = parseInt(hex.substring(5,7), 16);

  if(r == g && g == b) return(hex);

  var nr, ng, nb;
  if(r>=g && r>=b && g>=b) {
    ng = r - g + b;
    nr = b; nb = r;
  } else if(r>=g && r>=b && b>=g) {
    nb = r - b + g;
    nr = g; ng = r;
  } else if(g>=r && g>=b && r>=b) {
    nr = g - r + b;
    ng = b; nb = g;
  } else if(g>=r && g>=b && b>=r) {
    nb = g - b + r;
    ng = r; nr = g;
  } else if(b>=r && b>=g && r>=g) {
    nr = b - r + g;
    nb = g; ng = b;
  } else if(b>=r && b>=g && g>=r) {
    ng = b - g + r;
    nb = r; nr = b;
  } else {
    //alert('couldnt decide what to do, returning original color');
    return(hex);
  }

  var rgbary = new Array(nr,ng,nb);
  return(rgb2hex(rgbary));
}

function set_cp_vals(skip_bar) {  // populate both swatches and the bar
  var hex = cp_pick;
  var contrast_hex = cp_contrast;
  var swatch, swatch2, contrast, s_gif, c_gif;
  var bar = new Array(16);
  if(document.layers) {
    swatch = document.layers['cp_swatch'];
    swatch2 = document.layers['cp_swatch2'];
    s_gif = document.layers['cp_swatch_spacer'];
    contrast = document.layers['cp_contrast'];
    c_gif = document.layers['cp_cont_spacer'];
    for (var i = 0; i < 16; i++) {
      bar[i] = eval('document.layers["cp_bar_' + i + '"]');
    }
  } else if (document.all) {
    swatch = document.all.cp_swatch;
    swatch2 = document.all.cp_swatch2;
    s_gif = document.all.cp_swatch_spacer;
    contrast = document.all.cp_contrast;
    c_gif = document.all.cp_cont_spacer;
    for (var i = 0; i < 16; i++) {
      bar[i] = eval('document.all.cp_bar_' + i);
    }
  } else if (document.getElementById) {
    swatch = document.getElementById('cp_swatch');
    swatch2 = document.getElementById('cp_swatch2');
    s_gif = document.getElementById('cp_swatch_spacer');
    contrast = document.getElementById('cp_contrast');
    c_gif = document.getElementById('cp_cont_spacer');
    for (var i = 0; i < 16; i++) {
      bar[i] = eval('document.getElementById("cp_bar_' + i + '")');
    }
  }
  if(!swatch) return false;
  swatch.style.backgroundColor = hex;
  swatch2.style.backgroundColor = hex;
  swatch.style.backgroundImage = '';
  swatch2.style.backgroundImage = '';
  s_gif.title = hex;
  contrast.style.backgroundColor = contrast_hex;
  c_gif.title = contrast_hex;

  document.forms.advsearch.rgb1_value.value = hex;
  document.search.keyw_color.value = hex
document.search_2.keyw_color2.value = hex;
document.search2.keyw_color3.value = hex;;
  // stop here if color is empty
  if (hex == '') return false;
  document.forms.advsearch.cp_color.value = hex + '+';
  if(!skip_bar) {
    for (var i = 0; i < 16; i++) {
      var c = rgb_scale(cp_pick, i);
      var con = rgb_scale(cp_contrast, i);
      cp_bar_colors[i] = c;
      cp_bar_contrast[i] = con;
      bar[i].style.backgroundColor = c;
    }
  }
}

function unset_cp_vals() {
  var swatch, contrast, s_gif;
  if(document.layers) {
    swatch = document.layers['cp_swatch'];
    s_gif = document.layers['cp_swatch_spacer'];
    contrast = document.layers['cp_contrast'];
  } else if (document.all) {
    swatch = document.all.cp_swatch;
    s_gif = document.all.cp_swatch_spacer;
    contrast = document.all.cp_contrast;
  } else if (document.getElementById) {
    swatch = document.getElementById('cp_swatch');
    s_gif = document.getElementById('cp_swatch_spacer');
    contrast = document.getElementById('cp_contrast');
  }

  if(!swatch) return false;
  swatch.style.backgroundColor = '';
 // swatch.style.backgroundImage = 'url(' + cp_small_wheel_src + ')';
  s_gif.title = 'Search for photos by color';
  contrast.style.backgroundColor = '#ffffff';

  document.forms.advsearch.cp_color.value = '';
  document.forms.advsearch.rgb1_value.value = '';
}

// start me up buttercup
cp_init();