/**
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/**
 * (C) 2008 Syronex / J.M. Rosengard
 * http://www.syronex.com/software/jquery-color-picker
 *
 * - Check mark is either black or white, depending on the darkness 
 *   of the color selected.
 * - Fixed a bug in the original plugin that led to problems when there is 
 *   more than one colorPicker in a document.
 *
 * This is based on: 
 *
 * jQuery colorSelect plugin 0.9
 * http://plugins.jquery.com/project/colorPickerAgain
 * Copyright (c) 2008 Otaku RzO (Renzo Galo Castro Jurado).
 * (Original author URL & domain name no longer available.)
 *
 */

(function($) {
  $.fn.colorPicker = function($$options) {
    // Defaults
    var $defaults = {
      color:new Array(
	"#009900", "#009933", "#009966", "#009999", "#0099CC", "#0099FF"
, "#00CC00", "#00CC33", "#00CC66", "#00CC99", "#00CCCC", "#00CCFF"
, "#00FF00", "#00FF33", "#00FF66", "#00FF99", "#00FFCC", "#00FFFF"
, "#330000", "#330033", "#330066", "#330099", "#3300CC", "#3300FF"
, "#333300", "#333333", "#333366", "#333399", "#3333CC", "#3333FF"
, "#336600", "#336633", "#336666", "#336699", "#3366CC", "#3366FF"
, "#339900", "#339933", "#339966", "#339999", "#3399CC", "#3399FF"
, "#33CC00", "#33CC33", "#33CC66", "#33CC99", "#33CCCC", "#33CCFF"
, "#33FF00", "#33FF33", "#33FF66", "#33FF99", "#33FFCC", "#33FFFF"
, "#660000", "#660033", "#660066", "#660099", "#6600CC", "#6600FF"
, "#663300", "#663333", "#663366", "#663399", "#6633CC", "#6633FF"
, "#666600", "#666633", "#666666", "#666699", "#6666CC", "#6666FF"
, "#669900", "#669933", "#669966", "#669999", "#6699CC", "#6699FF"
, "#66CC00", "#66CC33", "#66CC66", "#66CC99", "#66CCCC", "#66CCFF"
, "#66FF00", "#66FF33", "#66FF66", "#66FF99", "#66FFCC", "#66FFFF"
, "#990000", "#990033", "#990066", "#990099", "#9900CC", "#9900FF"
, "#993300", "#993333", "#993366", "#993399", "#9933CC", "#9933FF"
, "#996600", "#996633", "#996666", "#996699", "#9966CC", "#9966FF"
, "#999900", "#999933", "#999966", "#999999", "#9999CC", "#9999FF"
, "#99CC00", "#99CC33", "#99CC66", "#99CC99", "#99CCCC", "#99CCFF"
, "#99FF00", "#99FF33", "#99FF66", "#99FF99", "#99FFCC", "#99FFFF"
, "#CC0000", "#CC0033", "#CC0066", "#CC0099", "#CC00CC", "#CC00FF"
, "#CC3300", "#CC3333", "#CC3366", "#CC3399", "#CC33CC", "#CC33FF"
, "#CC6600", "#CC6633", "#CC6666", "#CC6699", "#CC66CC", "#CC66FF"
, "#CC9900", "#CC9933", "#CC9966", "#CC9999", "#CC99CC", "#CC99FF"
, "#CCCC00", "#CCCC33", "#CCCC66", "#CCCC99", "#CCCCCC", "#CCCCFF"
, "#CCFF00", "#CCFF33", "#CCFF66", "#CCFF99", "#CCFFCC", "#CCFFFF"
, "#FF0000", "#FF0033", "#FF0066", "#FF0099", "#FF00CC", "#FF00FF"
, "#FF3300", "#FF3333", "#FF3366", "#FF3399", "#FF33CC", "#FF33FF"
, "#FF6600", "#FF6633", "#FF6666", "#FF6699", "#FF66CC", "#FF66FF"
, "#FF9900", "#FF9933", "#FF9966", "#FF9999", "#FF99CC", "#FF99FF"
, "#FFCC00", "#FFCC33", "#FFCC66", "#FFCC99", "#FFCCCC", "#FFCCFF"
, "#FFFF00", "#FFFF33", "#FFFF66"
	),
      defaultColor: 0,
      columns: 0,
      click: function($color){}
    };
		
    var $settings = $.extend({}, $defaults, $$options);
		
    // Iterate and reformat each matched element
    return this.each(function() {
      var $this = $(this);
      // build element specific options
      var o = $.meta ? $.extend({}, $settings, $this.data()) : $settings;
      var $$oldIndex = typeof(o.defaultColor)=='number' ? o.defaultColor : -1;
      
      var _html = "";
      for(i=0;i<o.color.length;i++){
	_html += '<div style="background-color:'+o.color[i]+';"></div>';
	if($$oldIndex==-1 && o.defaultColor==o.color[i]) $$oldIndex = i;
      }
      
      $this.html('<div class="jColorSelect">'+_html+'</div>');
      var $color = $this.children('.jColorSelect').children('div');
      // Set container width
      var w = ($color.width()+2+2) * (o.columns>0 ? o.columns : o.color.length );
      $this.children('.jColorSelect').css('width',w);
      
      // Subscribe to click event of each color box
      $color.each(function(i){
	$(this).click(function(){
	  if( $$oldIndex == i ) return;	  
	  if( $$oldIndex > -1 ){
	    cell = $color.eq($$oldIndex);
	    if(cell.hasClass('check')) cell.removeClass(
	      'check').removeClass('checkwht').removeClass('checkblk');
	  }
	  // Keep index
	  $$oldIndex = i;
	  $(this).addClass('check').addClass(isdark(o.color[i]) ? 'checkwht' : 'checkblk');
	  // Trigger user event
	  o.click(o.color[i]);
	});
      });
      
      // Simulate click for defaultColor
      _tmp = $$oldIndex;
      $$oldIndex = -1;
      $color.eq(_tmp).trigger('click');
    });    
    return this;
  };
  
  
})(jQuery);

/**
 * Return true if color is dark, false otherwise.
 * (C) 2008 Syronex / J.M. Rosengard
 **/
function isdark(color){
  var colr = parseInt(color.substr(1), 16);
  return (colr >>> 16) // R
    + ((colr >>> 8) & 0x00ff) // G 
    + (colr & 0x0000ff) // B
    < 500;
}

