/**
 * Really Simple Color Picker in jQuery
 * 
 * Copyright (c) 2008 Lakshan Perera (www.laktek.com)
 * Licensed under the MIT (MIT-LICENSE.txt)  licenses.
 * 
 */

(function($){
  $.fn.colorPicker = function(){    
    if(this.length > 0) buildSelector();
    return this.each(function(i) { 
      buildPicker(this)}); 
  };
  
  var selectorOwner;
  var selectorShowing = false;
  
  buildPicker = function(element){
    //build color picker
    control = $("<div class='color_picker'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>")
    control.css('background-color', $(element).val());
    
    //bind click event to color picker
    control.bind("click", toggleSelector);
    
    //add the color picker section
    $(element).after(control);

    //add even listener to input box
    $(element).bind("change", function() {
      selectedValue = toHex($(element).val());
      $(element).next(".color_picker").css("background-color", selectedValue);
    });
    
    //hide the input box
    $(element).hide();

  };
  
  buildSelector = function(){
    selector = $("<div id='color_selector'></div>");

     //add color pallete
     $.each($.fn.colorPicker.defaultColors, function(i){
      swatch = $("<div class='color_swatch'>&nbsp;</div>")
      swatch.css("background-color", "#" + this);
      swatch.bind("click", function(e){ changeColor($(this).css("background-color")) });
      swatch.bind("mouseover", function(e){ 
        $(this).css("border-color", "#598FEF"); 
        $("input#color_value").val(toHex($(this).css("background-color")));    
        }); 
      swatch.bind("mouseout", function(e){ 
        $(this).css("border-color", "#000");
        $("input#color_value").val(toHex($(selectorOwner).css("background-color")));
        });
      
     swatch.appendTo(selector);
     });
  
     //add HEX value field
     hex_field = $("<label for='color_value'>Hex</label><input type='text' size='8' id='color_value'/>");
     hex_field.bind("keydown", function(event){
      if(event.keyCode == 13) {changeColor($(this).val());}
      if(event.keyCode == 27) {toggleSelector()}
     });
     
     $("<div id='color_custom'></div>").append(hex_field).appendTo(selector);

     $("body").append(selector); 
     selector.hide();
  };
  
  checkMouse = function(event){
    //check the click was on selector itself or on selectorOwner
    var selector = "div#color_selector";
    var selectorParent = $(event.target).parents(selector).length;
    if(event.target == $(selector)[0] || event.target == selectorOwner || selectorParent > 0) return
    
    hideSelector();   
  }
  
  hideSelector = function(){
    var selector = $("div#color_selector");
    
    $(document).unbind("mousedown", checkMouse);
    selector.hide();
    selectorShowing = false
  }
  
  showSelector = function(){
    var selector = $("div#color_selector");
    
    //alert($(selectorOwner).offset().top);
    
    selector.css({
      top: $(selectorOwner).offset().top + ($(selectorOwner).outerHeight()),
      left: $(selectorOwner).offset().left
    }); 
    hexColor = $(selectorOwner).prev("input").val();
    $("input#color_value").val(hexColor);
    selector.show();
    
    //bind close event handler
    $(document).bind("mousedown", checkMouse);
    selectorShowing = true 
   }
  
  toggleSelector = function(event){
    selectorOwner = this; 
    selectorShowing ? hideSelector() : showSelector();
  }
  
  changeColor = function(value){
    if(selectedValue = toHex(value)){
      $(selectorOwner).css("background-color", selectedValue);
      $(selectorOwner).prev("input").val(selectedValue).change();
    
      //close the selector
      hideSelector();    
    }
  };
  
  //converts RGB string to HEX - inspired by http://code.google.com/p/jquery-color-utils
  toHex = function(color){
    //valid HEX code is entered
    if(color.match(/[0-9a-fA-F]{3}$/) || color.match(/[0-9a-fA-F]{6}$/)){
      color = (color.charAt(0) == "#") ? color : ("#" + color);
    }
    //rgb color value is entered (by selecting a swatch)
    else if(color.match(/^rgb\(([0-9]|[1-9][0-9]|[1][0-9]{2}|[2][0-4][0-9]|[2][5][0-5]),[ ]{0,1}([0-9]|[1-9][0-9]|[1][0-9]{2}|[2][0-4][0-9]|[2][5][0-5]),[ ]{0,1}([0-9]|[1-9][0-9]|[1][0-9]{2}|[2][0-4][0-9]|[2][5][0-5])\)$/)){
      var c = ([parseInt(RegExp.$1),parseInt(RegExp.$2),parseInt(RegExp.$3)]);
      
      var pad = function(str){
            if(str.length < 2){
              for(var i = 0,len = 2 - str.length ; i<len ; i++){
                str = '0'+str;
              }
            }
            return str;
      }

      if(c.length == 3){
        var r = pad(c[0].toString(16)),g = pad(c[1].toString(16)),b= pad(c[2].toString(16));
        color = '#' + r + g + b;
      }
    }
    else color = false;
    
    return color
  }

	 //converts HEX string to Color Name 
	HexToName = function(color)
	{
	    var colours = {"f0f8ff": "aliceblue", "faebd7": "antiquewhite", "00ffff": "aqua", "7fffd4": "aquamarine", "f0ffff": "azure", "f5f5dc": "beige", "ffe4c4": "bisque", "000000": "black", "ffebcd": "blanchedalmond", "0000ff": "blue", "8a2be2": "blueviolet", "a52a2a": "brown", "deb887": "burlywood", "5f9ea0": "cadetblue", "7fff00": "chartreuse", "d2691e": "chocolate", "ff7f50": "coral", "6495ed": "cornflowerblue", "fff8dc": "cornsilk", "dc143c": "crimson", "00ffff": "cyan", "00008b": "darkblue", "008b8b": "darkcyan", "b8860b": "darkgoldenrod", "a9a9a9": "darkgray", "006400": "darkgreen", "bdb76b": "darkkhaki", "8b008b": "darkmagenta", "556b2f": "darkolivegreen", "ff8c00": "darkorange", "9932cc": "darkorchid", "8b0000": "darkred", "e9967a": "darksalmon", "8fbc8f": "darkseagreen", "483d8b": "darkslateblue", "2f4f4f": "darkslategray", "00ced1": "darkturquoise", "9400d3": "darkviolet", "ff1493": "deeppink", "00bfff": "deepskyblue", "696969": "dimgray", "1e90ff": "dodgerblue", "b22222": "firebrick", "fffaf0": "floralwhite", "228b22": "forestgreen", "ff00ff": "fuchsia", "dcdcdc": "gainsboro", "f8f8ff": "ghostwhite", "ffd700": "gold", "daa520": "goldenrod", "808080": "gray", "008000": "green", "adff2f": "greenyellow", "f0fff0": "honeydew", "ff69b4": "hotpink", "cd5c5c": "indianred", "4b0082": "indigo", "fffff0": "ivory", "f0e68c": "khaki", "e6e6fa": "lavender", "fff0f5": "lavenderblush", "7cfc00": "lawngreen", "fffacd": "lemonchiffon", "add8e6": "lightblue", "f08080": "lightcoral", "e0ffff": "lightcyan", "fafad2": "lightgoldenrodyellow", "90ee90": "lightgreen", "d3d3d3": "lightgrey", "ffb6c1": "lightpink", "ffa07a": "lightsalmon", "20b2aa": "lightseagreen", "87cefa": "lightskyblue", "778899": "lightslategray", "b0c4de": "lightsteelblue", "ffffe0": "lightyellow", "00ff00": "lime", "32cd32": "limegreen", "faf0e6": "linen", "ff00ff": "magenta", "800000": "maroon", "66cdaa": "mediumaquamarine", "0000cd": "mediumblue", "ba55d3": "mediumorchid", "9370db": "mediumpurple", "3cb371": "mediumseagreen", "7b68ee": "mediumslateblue", "00fa9a": "mediumspringgreen", "48d1cc": "mediumturquoise", "c71585": "mediumvioletred", "191970": "midnightblue", "f5fffa": "mintcream", "ffe4e1": "mistyrose", "ffe4b5": "moccasin", "ffdead": "navajowhite", "000080": "navy", "fdf5e6": "oldlace", "808000": "olive", "6b8e23": "olivedrab", "ffa500": "orange", "ff4500": "orangered", "da70d6": "orchid", "eee8aa": "palegoldenrod", "98fb98": "palegreen", "afeeee": "paleturquoise", "db7093": "palevioletred", "ffefd5": "papayawhip", "ffdab9": "peachpuff", "cd853f": "peru", "ffc0cb": "pink", "dda0dd": "plum", "b0e0e6": "powderblue", "800080": "purple", "ff0000": "red", "bc8f8f": "rosybrown", "4169e1": "royalblue", "8b4513": "saddlebrown", "fa8072": "salmon", "f4a460": "sandybrown", "2e8b57": "seagreen", "fff5ee": "seashell", "a0522d": "sienna", "c0c0c0": "silver", "87ceeb": "skyblue", "6a5acd": "slateblue", "708090": "slategray", "fffafa": "snow", "00ff7f": "springgreen", "4682b4": "steelblue", "d2b48c": "tan", "008080": "teal", "d8bfd8": "thistle", "ff6347": "tomato", "40e0d0": "turquoise", "ee82ee": "violet", "f5deb3": "wheat", "ffffff": "white", "f5f5f5": "whitesmoke", "ffff00": "yellow", "9acd32": "yellowgreen"};
		if (typeof colors[colour.toLowerCase()] != 'undefined')
			return colors[colour.toLowerCase()];
		return false;
	}  


  //public methods
  $.fn.colorPicker.addColors = function(colorArray){
    $.fn.colorPicker.defaultColors = $.fn.colorPicker.defaultColors.concat(colorArray);
  };
  
  $.fn.colorPicker.defaultColors = 
	[ '000000', '000080', '00008B', '0000FF', '008000', '00FFFF', '00FFFF', '4B0082', '7FFFD4', '800000', '800080', '808080', '87CEEB', '90EE90', 'A52A2A', 'A9A9A9', 'ADD8E6', 'D3D3D3', 'EE82EE', 'F0E68C', 'F0F8FF', 'F5DEB3', 'F5F5DC', 'FA8072', 'FF0000', 'FF00FF', 'FF00FF', 'FF6347', 'FFA500', 'FFB6C1', 'FFC0CB', 'FFE4C4', 'FFFF00', 'FFFFE0', 'FFFFF0', 'FFFFFF'];
})(jQuery);

// default old	[ '000000', '993300', '333300', '000080', '333399', '333333', '800000', 'FF6600', '808000', '008000', '008080', '0000FF', '666699', '808080', 'FF0000', 'FF9900', '99CC00', '339966', '33CCCC', '3366FF', '800080', '999999', 'FF00FF', 'FFCC00', 'FFFF00', '00FF00', '00FFFF', '00CCFF', '993366', 'C0C0C0', 'FF99CC', 'FFCC99', 'FFFF99', 'CCFFFF', '99CCFF', 'FFFFFF'];


