From 0527ec2a88f342fb491d2437487525262fe54c36 Mon Sep 17 00:00:00 2001 From: Nathan Gray Date: Wed, 2 May 2012 18:01:17 +0000 Subject: [PATCH] Implement color picker --- etemplate/js/et2_widget_color.js | 204 ++ phpgwapi/js/jquery/jpicker/ChangeLog.txt | 121 + phpgwapi/js/jquery/jpicker/Example.html | 774 ++++++ phpgwapi/js/jquery/jpicker/ReadMe.txt | 47 + .../js/jquery/jpicker/css/jPicker-1.1.6.css | 232 ++ .../jquery/jpicker/css/jPicker-1.1.6.min.css | 1 + .../js/jquery/jpicker/images/AlphaBar.png | Bin 0 -> 2195 bytes phpgwapi/js/jquery/jpicker/images/Bars.png | Bin 0 -> 382 bytes phpgwapi/js/jquery/jpicker/images/Maps.png | Bin 0 -> 78245 bytes phpgwapi/js/jquery/jpicker/images/NoColor.png | Bin 0 -> 552 bytes phpgwapi/js/jquery/jpicker/images/Thumbs.db | Bin 0 -> 39936 bytes .../js/jquery/jpicker/images/bar-opacity.png | Bin 0 -> 134 bytes .../js/jquery/jpicker/images/map-opacity.png | Bin 0 -> 139 bytes .../js/jquery/jpicker/images/mappoint.gif | Bin 0 -> 93 bytes phpgwapi/js/jquery/jpicker/images/picker.gif | Bin 0 -> 146 bytes .../jquery/jpicker/images/preview-opacity.png | Bin 0 -> 135 bytes .../js/jquery/jpicker/images/rangearrows.gif | Bin 0 -> 76 bytes phpgwapi/js/jquery/jpicker/jPicker.css | 17 + phpgwapi/js/jquery/jpicker/jpicker-1.1.6.js | 2086 +++++++++++++++++ phpgwapi/js/jquery/jpicker/jpicker.js | 1 + 20 files changed, 3483 insertions(+) create mode 100644 etemplate/js/et2_widget_color.js create mode 100644 phpgwapi/js/jquery/jpicker/ChangeLog.txt create mode 100644 phpgwapi/js/jquery/jpicker/Example.html create mode 100644 phpgwapi/js/jquery/jpicker/ReadMe.txt create mode 100644 phpgwapi/js/jquery/jpicker/css/jPicker-1.1.6.css create mode 100644 phpgwapi/js/jquery/jpicker/css/jPicker-1.1.6.min.css create mode 100644 phpgwapi/js/jquery/jpicker/images/AlphaBar.png create mode 100644 phpgwapi/js/jquery/jpicker/images/Bars.png create mode 100644 phpgwapi/js/jquery/jpicker/images/Maps.png create mode 100644 phpgwapi/js/jquery/jpicker/images/NoColor.png create mode 100644 phpgwapi/js/jquery/jpicker/images/Thumbs.db create mode 100644 phpgwapi/js/jquery/jpicker/images/bar-opacity.png create mode 100644 phpgwapi/js/jquery/jpicker/images/map-opacity.png create mode 100644 phpgwapi/js/jquery/jpicker/images/mappoint.gif create mode 100644 phpgwapi/js/jquery/jpicker/images/picker.gif create mode 100644 phpgwapi/js/jquery/jpicker/images/preview-opacity.png create mode 100644 phpgwapi/js/jquery/jpicker/images/rangearrows.gif create mode 100644 phpgwapi/js/jquery/jpicker/jPicker.css create mode 100644 phpgwapi/js/jquery/jpicker/jpicker-1.1.6.js create mode 100644 phpgwapi/js/jquery/jpicker/jpicker.js diff --git a/etemplate/js/et2_widget_color.js b/etemplate/js/et2_widget_color.js new file mode 100644 index 0000000000..b4b4285b0d --- /dev/null +++ b/etemplate/js/et2_widget_color.js @@ -0,0 +1,204 @@ +/** + * eGroupWare eTemplate2 - JS Color picker object + * + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @package etemplate + * @subpackage api + * @link http://www.egroupware.org + * @author Nathan Gray + * @copyright Nathan Gray 2012 + * @version $Id$ + */ + +"use strict"; + +/*egw:uses + jquery.jquery; + et2_core_inputWidget; + et2_core_valueWidget; + /phpgwapi/js/jquery/jpicker/jpicker-1.1.6.js; +*/ + +/** + * Class which implements the "colorpicker" XET-Tag + */ +var et2_color = et2_inputWidget.extend({ + + attributes: { + "alphaSupport": { + "name": "Transparancy", + "type": "boolean", + "default": false, + "description": "Allow selection of alpha channel as well as color" + } + }, + + // Settings for jPicker - internal + defaults: { + "window": { + expandable: true, + effects: {"type":"none"}, + position: { "x": "screenCenter", "y": "screenCenter"} + }, + "images": { + clientPath: "phpgwapi/js/jquery/jpicker/images/" + }, + "color": { + "active": new jQuery.jPicker.Color() + } + }, + + init: function() { + this._super.apply(this, arguments); + + this.egw().includeCSS("phpgwapi/js/jquery/jpicker/css/jPicker-1.1.6.min.css"); + this.input = this.$node = jQuery(document.createElement("span")); + + // Translations + for(var key in jQuery.fn.jPicker.defaults.localization.text) + { + jQuery.fn.jPicker.defaults.localization.text[key] = this.egw().lang(jQuery.fn.jPicker.defaults.localization.text[key]); + } + for(var key in jQuery.fn.jPicker.defaults.localization.tooltips) + { + jQuery.fn.jPicker.defaults.localization.tooltips[key].ok = this.egw().lang(jQuery.fn.jPicker.defaults.localization.tooltips[key].ok); + jQuery.fn.jPicker.defaults.localization.tooltips[key].cancel = this.egw().lang(jQuery.fn.jPicker.defaults.localization.tooltips[key].cancel); + } + this.options = jQuery.extend({}, this.defaults, this.options); + + this.setDOMNode(this.$node[0]); + }, + + doLoadingFinished: function() { + this._super.apply(this, arguments); + + var self = this; + + // Initialize jPicker + + this.options.color.active = new jQuery.jPicker.Color({hex:this.value}); + var val = this.$node.jPicker(this.options, + // Ok + function(value) { + self.set_value(value); + jQuery("table.jPicker").dialog("close"); + }, + // Color change + null, + // Cancel + function(color) { + jQuery("table.jPicker").dialog("close"); + } + ); + + // Make it look better - plugin defers initialization, so we have to also + setTimeout(function() { + // Make the buttons look like all the others + jQuery("div.jPicker :button").addClass("et2_button et2_button_text"); + + // Turn it into a full dialog + jQuery("table.jPicker").dialog({ + title: self.options.statustext ? self.options.statustext : self.egw().lang('Select color'), + autoOpen: false, + resizable: false, + width: self.get_jPicker() ? self.get_jPicker()[0].width : "auto" + }); + + // Hide original move bar + jQuery('table.jPicker .Move').hide(); + + // Trigger dialog opening + jQuery('.Image',self.$node.next()).click(function() {jQuery("table.jPicker").dialog("open")}); + },500); + return true; + }, + + /** + * Get the jPicker object for this widget, so further things can be done to it + */ + get_jPicker: function() { + if(jQuery.jPicker.List.length) + { + var self = this; + return jQuery(jQuery.jPicker.List.filter(function(index, elem) { + return (this && this.id == self.id); + }))[0]; + } + return null; + }, + + getValue: function() { + return this.value; + }, + + set_value: function(color) { + if(typeof color == "string") { + this.value = color; + } + else if (typeof color == "object" && color.val) + { + // Prefix # to match previous picker values + this.value = '#'+color.val("hex"); + } + + // Update picker + if(jQuery.jPicker.List.length) + { + var self = this; + var picker = this.get_jPicker(); + if(picker) + { + picker.color.active = new jQuery.jPicker.Color(self.options.value); + } + } + } +}); + +et2_register_widget(et2_color, ["colorpicker"]); + +/** + * et2_textbox_ro is the dummy readonly implementation of the textbox. + */ +var et2_color_ro = et2_valueWidget.extend([et2_IDetachedDOM], { + + init: function() { + this._super.apply(this, arguments); + + this.value = ""; + this.$node = $j(document.createElement("div")) + .addClass("et2_color"); + + this.setDOMNode(this.$node[0]); + }, + + set_value: function(_value) { + this.value = _value; + + if(!_value) _value = "inherit"; + this.$node.css("background-color", _value); + }, + /** + * Code for implementing et2_IDetachedDOM + */ + getDetachedAttributes: function(_attrs) + { + _attrs.push("value"); + }, + + getDetachedNodes: function() + { + return [this.node]; + }, + + setDetachedAttributes: function(_nodes, _values) + { + this.span = jQuery(_nodes[0]); + if(typeof _values["value"] != 'undefined') + { + this.set_value(_values["value"]); + } + } +}); + +et2_register_widget(et2_color_ro, ["colorpicker_ro"]); + diff --git a/phpgwapi/js/jquery/jpicker/ChangeLog.txt b/phpgwapi/js/jquery/jpicker/ChangeLog.txt new file mode 100644 index 0000000000..b173dba9d5 --- /dev/null +++ b/phpgwapi/js/jquery/jpicker/ChangeLog.txt @@ -0,0 +1,121 @@ +Change Log +______________ +1.1.6 + Corrected bug preventing selections inside input values in some browsers - the onselectstart function no longer captures on input boxes. + Added support for up/down arrow adjustments of the currently focused input box making the picker more keyboard friendly. + Added ticks around the backgroundImage assignments to correct for paths with whitespace. + +1.1.5 + Corrected Color object constructor to allow setting of the "alpha" value as per the documentation which previously didn't work. + Added support for translucency for quickList colors with checkered background - Only available if "alphaSupport" is enabled. + Restricted default color to "alpha" of 255 if "alphaSupport" is disabled - It will now assign an explicit alpha of 255 when disabled. + Added new setting variable "alphaPrecision" which indicates the number of decimal points to allow in the alpha percentage display - Now defaults to 0. + +1.1.4 + Changed "alpha" range from 0-100 to 0-255 to correct truncating and rounding errors caused by attempting to get an integer percentage that matches a hex value. + "alpha" percentage display will now show up to 1 decimal point for more accurate representation of "alpha" value. + Color object now accepts "alpha" values in a range of 0-255 and also returns the same when getting the "alpha" value. You will need to run ((alpha * 100) / 255) to retrieve a percentage value. + Reworked the table layout and labels to remove the need for the label to reference the radio input box. This reduces injected code and removes the need to generate unique ids on the radio buttons. + Transparent/invisible caret on NULL color is now corrected - uses the same caret color as a white color. + Setting a binded input value of "" or no value attribute will now create a NULL color on initialization instead of the settings default color. + Added a dynamic, invisible "iframe" behind a dialog picker in all browsers that fail jQuery.support.boxModel (currently IE <= 7 Quirks Mode). This prevents "select" box from showing through the picker. + +1.1.3 + Now adding popup color pickers to document.body instead of inline with the popup control. This corrects issues with the picker not showing beyond a relative container scope. + No longer need to hide popup icon in Internet Explorer for picker elements lower in the DOM than the currently active one since the picker itself is attached to document.body (it is always higher in the DOM now). + Popup pickers are now bring-to-front selectable. Clicking on the picker will bring it above all other pickers on the page instead of having to drag one out from underneath another. + Corrected jPicker.List/setTimeout bug which allowed an instance to bind to the List in an order other than the order the initialization function was called. + Added a updateInputColor option (default true) to allow for a binded input field that does not automatically update its background/text color. + +1.1.2 + Reworked the find methods and contexts for element searches. Now using ":first" instead of ".eq(0)" to take advantage of early out searches. Much faster initialization of the picker, on the order of 6 times. + Now using setTimeout for calling visual updates. Dramatically improved marker dragging in all browsers. Reduces blocking as re-rendering is internal to the browser and independent of the other javascript still in progress. + Marker updates can now cancel a previous valueChanged event when a new mouseMove event comes in. IE8 marker dragging is still slower, much over 5 times faster than it was. + Reworked entire quickPick list creation. It now adds up source code and does a single "html" method instead of multiple "append" methods. This is a large part of the speed increase on initialization. + The vast majority of all running scripts on both initialization and dragging is now occupied altering the style rules and finding elements (init only) instead of jPicker code. + All methods previously called with global context now use the "call" method for using the context of the class running the method. "this" in a callback is now the DOM node (jQuery style) and jPicker instead of "window". + Added "effects" section of window settings to allow different show/hide effects and durations. + Removed change log and read me from the full source code to separate files (ChangeLog.txt and ReadMe.txt) and an HTML demonstration/documentation page (Example.txt). + +1.1.1 + Correct IE exception caused by attempting to set "#transparent" to CSS background-color. + +1.1.0 + Reworked nearly the entire plugin including the internal and external event model, bindings, DOM searches, classes, and overall presentation. + The Color object now supports a changed event that you can bind to (or just bind to the picker events still included). + Event order has been reversed, instead of a change event on the map/bar/text fields updating the display, they now update the Color object which then fires the events that update the display. + alphaSupport re-implemented by request - default behavior is off. + Hex code now only 6 characters again. + Color object can now have its value changed from code, using the "val" method, and it will fire all events necessary to update the display. + Removed all "get_*" methods from the color object, instead opting for a single "val" method for getting and setting, more in line with familiar jQuery methods. + Better rendering for all IE versions in Quirks mode. + +1.0.13 + Updated transparency algorithm for red/green/blue color modes. The algorithm from John Dyers' color picker was close but incorrect. Bar colors are now pixel perfect with the new algorithm. + Changed from using "background-position" on the color maps to an element of full height using the "top" attribute for image-map location using "overflow: hidden" to hide overdraw. + IE7/8 ignores opacity on elements taller than 4096px. Image maps therefore no longer include a blank first map so the Bar is just under 4096. Blank is now accomplished by setting the "top" setting to below the map display. + New colorBar picker image that does not draw outside of the element since the elements now hide overdraw. + Added IE5.5/6 support for the picker. This is why it now uses maps of full height and the "top" attribute for map locations. + Moved the images in the maps to 4 pixels apart from each other. IE7/8 change the first pixel of the bottom-border of 2px to partially transparent showing a portion of a different color map without this. + +1.0.12 + Added minified CSS file. + Added IE7/8 Quirks Mode support. + Added configurable string constants for all text and tooltips. You can now change the default values for different languages. + Privatized the RGBA values in the Color object for better NULL handling. YOU MUST USE THE NEW GET FUNCTIONS TO ACCESS THE COLOR PROPERTIES. + Better NULL color handling and an additional "No Color Selected" quick pick color. + More consistent behavior across multiple versions of browsers. + Added alpha response to the binded color picker icon. + Removed "alphaSupport" variable. It is now always supported. + +1.0.11b + Corrected NULL behavior in IE. jQuery was getting an exception when attempting to assign a backgroundColor style of '#'. Now assigns 'transparent' if color is NULL. + Can now create new Color object WITH OR WITHOUT the '#' prefix. + +1.0.11 + Added ability for NULL colors (delete the hex value). Color will be returned as color.hex == ''. Can set the default color to an empty hex string as well. + cancelCallback now returns the original color for use in programming responses. + +1.0.10 + Corrected table layout and tweaked display for more consisent presentation. Nice catch from Jonathan Pasquier. + +1.0.9 + Added optional title variable for each jPicker window. + +1.0.8 + Moved all images into a few sprites - now using backgroundPosition to change color maps and bars instead of changing the image - this should be faster to download and run. + +1.0.7 + RENAMED CSS FILE TO INCLUDE VERSION NUMBER!!! YOU MUST USE THIS VERSIONED CSS FILE!!! There will be no need to do your own CSS version number increments from now on. + Added opacity feedback to color preview boxes. + Removed reliance on "id" value of containing object. Subobjects are now found by class and container instead of id's. This drastically reduces injected code. + Removed (jQuery).jPicker.getListElementById(id) function since "id" is no longer incorporated or required. + +1.0.6 + Corrected picker bugs introduced with 1.0.5. + Removed alpha slider bar until activated - default behavior for alpha is now OFF. + Corrected Color constructor bug not allowing values of 0 for initial value (it was evaluating false and missing the init code - Thanks Pavol). + Removed title tags (tooltips) from color maps and bars - They get in the way in some browsers (e.g. IE - dragging marker does NOT prevent or hide the tooltip). + THERE WERE CSS FILE CHANGES WITH THIS UPDATE!!! IF YOU USE NEVER-EXPIRE HEADERS, YOU WILL NEED TO INCREMENT YOUR CSS FILE VERSION NUMBER!!! + +1.0.5 + Added opacity support to picker and color/callback methods. New property "a" (alpha - range from 0-100) in all color objects now - defaults to 100% opaque. (Thank you Pavol) + Added title attributes to input elements - gives short tooltip directions on what button or field does. + Commit callback used to fire on control initialization (twice actually) - This has been corrected, it does not fire on initialization. + THERE WERE CSS FILE CHANGES WITH THIS UPDATE!!! IF YOU USE NEVER-EXPIRE HEADERS, YOU WILL NEED TO INCREMENT YOUR CSS FILE VERSION NUMBER!!! + +1.0.4 + Added ability for smaller picker icon with expandable window on any DOM element (not just input). + "draggable" property renamed to "expandable" and its scope increased to create small picker icon or large static picker. + +1.0.3 + Added cancelCallback function for registering an external function when user clicks cancel button. (Thank you Jeff and Pavol) + +1.0.2 + Random bug fixes - speed concerns. + +1.0.1 + Corrected closure based memeory leak - there may be others? + +1.0.0 + First Release. \ No newline at end of file diff --git a/phpgwapi/js/jquery/jpicker/Example.html b/phpgwapi/js/jquery/jpicker/Example.html new file mode 100644 index 0000000000..0c70908fc5 --- /dev/null +++ b/phpgwapi/js/jquery/jpicker/Example.html @@ -0,0 +1,774 @@ + + + + + + Digital Magic Productions - jPicker - A jQuery Color Picker Plugin + + + + + + + +
+

jPicker - A jQuery Color Picker Plugin.

+

+ jPicker is a fast, lightweight jQuery plugin for including an advanced color picker in your web projects. It has been painstakenly ported from John Dyers' awesome work on his picker using the Prototype framework.

+ jPicker supports all current browsers and has been extensively tested in Chrome, Firefox, IE5.5+, Safari, and Opera.

+ If you are updating a current version, you MUST always use the CSS and image files from the download as there may have been changes.

+ If you are moving from a V1.0.* version, you MUST read the docs below to implement some changes to the Color object returned by the callback functions.

+ View John Dyer's prototype plugin here.

+ View jPicker details a docs below.

+ Check out the source from Google Code. +



+

jPicker Inline Example

+

+ jPicker can be used inline by binding to any block level element.

+ jPicker() -- no arguments +

+<script type="text/javascript">        
+  $(document).ready(
+    function()
+    {
+      $('#Inline').jPicker();
+    });
+</script>
+<div id="Inline"></div>
+
+



+

jPicker Expandable Example

+

+ jPicker can also display only a small picker icon that opens a popup for editing.

+ jPicker({ window: { expandable: true }}) +

+<script type="text/javascript">
+  $(document).ready(
+    function()
+    {
+      $('#Expandable').jPicker(
+        {
+          window:
+          {
+            expandable: true
+          }
+        });
+    });
+</script>
+<span id="Expandable"></span>
+ +



+

jPicker Alpha Channel Example

+

+ jPicker can also pick colors with alpha (transparency) values.

+ jPicker({ window: { expandable: true }}) +

+<script type="text/javascript">        
+  $(document).ready(
+    function()
+    {
+      $('#Alpha').jPicker(
+        {
+          window:
+          {
+            expandable: true
+          },
+          color:
+          {
+            alphaSupport: true,
+            active: new $.jPicker.Color({ ahex: '99330099' })
+          }
+        });
+    });
+</script>
+<span id="Alpha"></span>
+ +



+

jPicker Binded Example

+

+ jPicker can also be binded to an input element.

+ jPicker() -- no arguments +

+<script type="text/javascript">        
+  $(document).ready(
+    function()
+    {
+      $('#Binded').jPicker();
+    });
+</script>
+<input id="Binded" type="text" value="e2ddcf" />
+ +



+

Multiple jPicker Binded Example

+

+ jPicker can also be binded to multiple elements at a time.

+ jPicker() -- no arguments +

+<script type="text/javascript">        
+  $(document).ready(
+    function()
+    {
+      $('.Multiple').jPicker();
+    });
+</script>
+<input class="Multiple" type="text" value="e2ddcf" /><br />
+<input class="Multiple" type="text" value="" /><br />
+<input class="Multiple" type="text" value="fda0f7" />
+
+
+
+



+

jPicker Callback Functions

+

+ Register for callback function to have it interact with your page.

+ jPicker([settings, [commitCallback, [liveCallback, [cancelCallback]]]]) +

+<script type="text/javascript">
+  $(document).ready(
+    function()
+    {
+      var LiveCallbackElement = $('#Live'),
+          LiveCallbackButton = $('#LiveButton');  // you don't want it searching this
+                                                  // on every live callback!!!
+      $('#Callbacks').jPicker(
+        {},
+        function(color, context)
+        {
+          var all = color.val('all');
+          alert('Color chosen - hex: ' + (all && '#' + all.hex || 'none') +
+            ' - alpha: ' + (all && all.a + '%' || 'none'));
+          $('#Commit').css(
+            {
+              backgroundColor: all && '#' + all.hex || 'transparent'
+            }); // prevent IE from throwing exception if hex is empty
+        },
+        function(color, context)
+        {
+          if (context == LiveCallbackButton.get(0)) alert('Color set from button');
+          var hex = color.val('hex');
+          LiveCallbackElement.css(
+            {
+              backgroundColor: hex && '#' + hex || 'transparent'
+            }); // prevent IE from throwing exception if hex is empty
+        },
+        function(color, context)
+        {
+          alert('"Cancel" Button Clicked');
+        });      
+      $('#LiveButton').click(
+        function()
+        {
+          $.jPicker.List[0].color.active.val('hex', 'e2ddcf', this);
+        });
+    });
+</script>
+<input id="Callbacks" type="text" value="e2ddcf" />
+<span id="Commit" style="background-color: #e2ddcf; display: block; --
+          float: left; height: 50px; margin: 10px; width: 50px;"> --
+          Commit</span>
+<span id="Live" style="display: block; float: left; height: 50px; --
+          margin: 10px; width: 50px;">Live</span>
+<input id="LiveButton" type="button" value="Set To #e2ddcf" />
+
+ Commit + Live + +



+

jPicker Settings And Colors

+

+ Use the "val" method on the active color for interaction with the picker.

+ (jQuery).jPicker.List[index] +

+<script type="text/javascript">        
+  $(document).ready(
+    function()
+    {
+      $('#AlterColors').jPicker();
+      $('#GetActiveColor').click(
+        function()
+        {
+          alert($.jPicker.List[0].color.active.val('ahex'));
+        });
+      $('#GetRG').click(
+        function()
+        {
+          var rg=$.jPicker.List[0].color.active.val('rg');
+          alert('red: ' + rg.r + ', green: ' + rg.g);
+        });
+      $('#SetHue').click(
+        function()
+        {
+          $.jPicker.List[0].color.active.val('h', 133);
+        });
+      $('#SetValue').click(
+        function()
+        {
+          $.jPicker.List[0].color.active.val('v', 38);
+        });
+      $('#SetRG').click(
+        function()
+        {
+          $.jPicker.List[0].color.active.val('rg', { r: 213, g: 118 });
+        });
+    });
+</script>
+<input id="AlterColors" type="text" value="e2ddcf" /><br />
+<input id="GetActiveColor" type="button" value="Get Active Color" /><br />
+<input id="GetRG" type="button" value="Get Red/Green Value" /><br />
+<input id="SetHue" type="button" value="Set Hue To 133" /><br />
+<input id="SetValue" type="button" value="Set Value To 38" /><br />
+<input id="SetRG" type="button" value="Set Red/Green To 213, 118" />
+
+
+
+
+
+ +



+

jPicker Core

+

+ jPicker Core function - returns the jQuery object.

+ jPicker([settings, [commitCallback, [liveCallback, [cancelCallback]]]]) +



+

Settings

+

+ settings [object]: (with defaults)
+

+{
+  window: // used to define the position of the popup window
+          // only useful in binded mode
+  {
+    title: null, // any title for the jPicker window itself - displays
+                 // "Drag Markers To Pick A Color" if left null
+    position:
+    {
+      x: 'screenCenter', // acceptable values "left", "center", "right",
+                         // "screenCenter", or relative px value
+      y: 'top', // acceptable values "top", "bottom", "center", or relative px
+                // value
+    },
+    expandable: false, // default to large static picker - set to true to make an
+                       // expandable picker (small icon with popup) - set
+                       // automatically when binded to input element
+    liveUpdate: true, // set false if you want the user to click "OK" before the
+                      // binded input box updates values (always "true" for
+                      // expandable picker)
+    alphaSupport: false, // set to true to enable alpha picking
+    alphaPrecision: 0, // set decimal precision for alpha percentage display -
+                       // hex codes do not map directly to percentage integers -
+                       // range 0-2
+    updateInputColor: true // set to false to prevent binded input colors from
+                           // changing
+  },
+  color:
+  {
+    mode: 'h', // acceptable values "h" (hue), "s" (saturation), "v" (brightness),
+               // "r" (red), "g" (green), "b" (blue), "a" (alpha)
+    active: new $.jPicker.Color({ hex: 'ffc000' }), // accepts any declared
+               // jPicker.Color object or hex string WITH OR WITHOUT '#'
+    quickList: // this list of quick pick colors - override for a different list
+      [
+        new $.jPicker.Color({ h: 360, s: 33, v: 100}), // accepts any declared
+               // jPicker.Color object or hex string WITH OR WITHOUT '#'
+        new $.jPicker.Color({ h: 360, s: 66, v: 100}),
+        (...) // removed for brevity
+        new $.jPicker.Color({ h: 330, s: 100, v: 50}),
+        new $.jPicker.Color()
+      ]
+  },
+  images
+  {
+    clientPath: '/jPicker/images/', // Path to image files
+    colorMap: // colorMap size and arrow icon
+    {
+      width: 256, // Map width - don't override unless using a smaller image set
+      height: 256, // Map height - don't override unles using a smaller image set
+      arrow:
+      {
+        file: 'mappoint.gif', // Arrow icon image file
+        width: 15, // Arrow icon width
+        height: 15 // Arrow icon height
+      }
+    },
+    colorBar: // colorBar size and arrow icon
+    {
+      width: 20, // Bar width - don't override unless using a smaller image set
+      height: 256, // Bar height - don't override unless using a smaller image set
+      arrow:
+      {
+        file: 'rangearrows.gif', // Arrow icon image file
+        width: 40, // Arrow icon width
+        height: 9 // Arrow icon height
+      }
+    },
+    picker: // picker icon and size
+    {
+      file: 'picker.gif', // Picker icon image file
+      width: 25, // Picker width - don't override unless using a smaller image set
+      height: 24 // Picker height - don't override unless using a smaller image set
+    }
+  },
+  localization:
+  {
+    text:
+    {
+      title: 'Drag Markers To Pick A Color',
+      newColor: 'new',
+      currentColor: 'current',
+      ok: 'OK',
+      cancel: 'Cancel'
+    },
+    tooltips:
+    {
+      colors:
+      {
+        newColor: 'New Color - Press “OK” To Commit',
+        currentColor: 'Click To Revert To Original Color'
+      },
+      buttons:
+      {
+        ok: 'Commit To This Color Selection',
+        cancel: 'Cancel And Revert To Original Color'
+      },
+      hue:
+      {
+        radio: 'Set To “Hue” Color Mode',
+        textbox: 'Enter A “Hue” Value (0-360°)'
+      },
+      saturation:
+      {
+        radio: 'Set To “Saturation” Color Mode',
+        textbox: 'Enter A “Saturation” Value (0-100%)'
+      },
+      brightness:
+      {
+        radio: 'Set To “Brightness” Color Mode',
+        textbox: 'Enter A “Brightness” Value (0-100%)'
+      },
+      red:
+      {
+        radio: 'Set To “Red” Color Mode',
+        textbox: 'Enter A “Red” Value (0-255)'
+      },
+      green:
+      {
+        radio: 'Set To “Green” Color Mode',
+        textbox: 'Enter A “Green” Value (0-255)'
+      },
+      blue:
+      {
+        radio: 'Set To “Blue” Color Mode',
+        textbox: 'Enter A “Blue” Value (0-255)'
+      },
+      alpha:
+      {
+        radio: 'Set To “Alpha” Color Mode',
+        textbox: 'Enter A “Alpha” Value (0-100)'
+      },
+      hex:
+      {
+        textbox: 'Enter A “Hex” Color Value (#000000-#ffffff)',
+        alpha: 'Enter A “Alpha” Value (#00-#ff)'
+      }
+    }
+  }
+}
+



+

Callback Pattern

+

+ function(jPicker.Color color, object context){...} +



+

jPicker List

+

+ The list of active jPicker objects.

+ (jQuery).jPicker.List[] +



+

jPicker Color Class

+

+ Definition of the jPicker.Color class.
+

+(jQuery).jPicker.Color()
+(jQuery).jPicker.Color({ ahex: 'ffffffff' })
+(jQuery).jPicker.Color({ hex: 'ffffff', [a: (0-255)] })
+(jQuery).jPicker.Color({ r: (0-255), g: (0-255), b: (0-255), [a: (0-255)] })
+(jQuery).jPicker.Color({ h: (0-360), s: (0-100), v: (0-100), [a: (0-255)] })
+{
+  val: function(name, value, context),
+  bind: function(callback) where callback is function(color, [context]),
+  unbind: function(callback)
+}
+
+method "val" usage
+
+val(name) : get value
+
+  'r':     red         (0-255)
+  'g':     green       (0-255)
+  'b':     blue        (0-255)
+  'a':     alpha       (0-255)
+  'h':     hue         (0-360)
+  's':     saturation  (0-100)
+  'v':     value       (0-100)
+  'hex':   hex         (000000-ffffff)
+  'ahex':  ahex        (00000000-ffffffff)
+  'all':   all         all
+  
+  ex. Usage
+
+    val('r'):     (0-255)
+    val('h'):     (0-360)
+    val('hex'):   (000000-ffffff)
+    val('rg'):    { r: (0-255), g: (0-255) }
+    val('rgba'):  { r: (0-255), g: (0-255), b: (0-255), a: (0-255) }
+    val('hvga'):  { h: (0-255), v: (0-100), g: (0-255), a: (0-255) }
+    val('all'):   { r: (0-255), g: (0-255), b: (0-255), a: (0-255), h: (0-360) --
+                    s: (0-100), v: (0-100), hex: (000000-ffffff), --
+                    ahex: (00000000-ffffffff) }
+
+val(name, value, [context]) : set value
+
+  'r':     red         (0-255)
+  'g':     green       (0-255)
+  'b':     blue        (0-255)
+  'a':     alpha       (0-255)
+  'h':     hue         (0-360)
+  's':     saturation  (0-100)
+  'v':     value       (0-100)
+  'hex':   hex         (000000-ffffff)
+  'ahex':  ahex        (00000000-ffffffff)
+  
+  ex. Usage
+
+    val('r', (0-255)) || val('r', { r: (0-255) })
+    val('h', (0-360)) || val('h', { h: (0-360) })
+    val('hex', (000000-ffffff)) || val('hex', { hex: (000000-ffffff) })
+    val('rg', { r: (0-255), g: (0-255) })
+    val('rgba', { r: (-255), g: (0-255), b: (0-255), a: (0-255) })
+    val(null, { r: (0-255), g: (0-255) })
+    val('hvga'):  incorrect usage - cannot set hsv AND rgb as they will conflict
+



+

jPicker ColorMethod Utility Class

+

+ Static methods for altering and retrieving different color spaces.
+

+(jQuery).jPicker.ColorMethods.hexToRgba:
+    function(hex)
+    returns { r: (0-255), g: (0-255), b: (0-255), a: (0-255) }
+    
+(jQuery).jPicker.ColorMethods.validateHex:
+    function(hex)
+    returns new hex string
+    
+(jQuery).jPicker.ColorMethods.rgbaToHex:
+    function({ r: (0-255), g: (0-255), b: (0-255), a: (0-255) })
+    returns hex string
+    
+(jQuery).jPicker.ColorMethods.intToHex:
+    function(number)
+    returns hex string
+    
+(jQuery).jPicker.ColorMethods.hexToInt:
+    function(hex)
+    return integer
+
+(jQuery).jPicker.ColorMethods.rgbToHsv:
+    function({ r: (0-255), g: (0-255), b: (0-255) })
+    returns { h: (0-360), s: (0-100), v: (0-100) }
+
+(jQuery).jPicker.ColorMethods.hsvToRgb:
+    function({ h: (0-360), s: (0-100), v: (0-100) })
+    returns { r: (0-255), g: (0-255), b: (0-255) }
+
+



+

Known Issues

+
+

Coming Soon

+
+

Planned For Future Release

+
+

Change Log

+ +
+ + \ No newline at end of file diff --git a/phpgwapi/js/jquery/jpicker/ReadMe.txt b/phpgwapi/js/jquery/jpicker/ReadMe.txt new file mode 100644 index 0000000000..a2006d2f17 --- /dev/null +++ b/phpgwapi/js/jquery/jpicker/ReadMe.txt @@ -0,0 +1,47 @@ +jPicker 1.1.6 + +jQuery Plugin for Photoshop style color picker + +Copyright (c) 2010 Christopher T. Tillman +Digital Magic Productions, Inc. (http://www.digitalmagicpro.com/) +MIT style license, FREE to use, alter, copy, sell, and especially ENHANCE + +Painstakingly ported from John Dyers' excellent work on his own color picker based on the Prototype framework. + +John Dyers' website: (http://johndyer.name) +Color Picker page: (http://johndyer.name/post/2007/09/PhotoShop-like-JavaScript-Color-Picker.aspx) + + + jPicker is a fast, lightweight jQuery plugin for including an advanced color picker in your web projects. +It has been painstakenly ported from John Dyers' awesome work on his picker using the Prototype framework. + + jPicker supports all current browsers and has been extensively tested in Chrome, Firefox, IE5.5+, Safari, +and Opera. + + If you are updating a current version, you MUST always use the CSS and image files from the download as +there may have been changes. + + If you are moving from a V1.0.* version, you MUST read the docs below to implement some changes to the +Color object returned by the callback functions. + + +Known Issues +______________ +Attaching multiple jPicker objects on a single page will slow performance. + jPicker creates a new instance of the picker for every element. Performance will suffer when binding dozens of instances. + + +Coming Soon +______________ + + Will consider supporting jQuery ThemeRoller CSS API for theming the UI if demand exists. + +Planned For Future Release +______________ + + Move the jPicker object to a single instance that all selection instances point to. + - This will result in much faster operation and initialization for pages with multiple pickers. + + Add activateCallback option for calling a callback function when the jPicker is activated or its binding is switched to a different picker element. + + Add multiple window modes for picker operation, include modal, popup, windowed, and exclusive. \ No newline at end of file diff --git a/phpgwapi/js/jquery/jpicker/css/jPicker-1.1.6.css b/phpgwapi/js/jquery/jpicker/css/jPicker-1.1.6.css new file mode 100644 index 0000000000..c46f09b72e --- /dev/null +++ b/phpgwapi/js/jquery/jpicker/css/jPicker-1.1.6.css @@ -0,0 +1,232 @@ +.jPicker .Icon { + display: inline-block; + height: 24px; /* change this value if using a different sized color picker icon */ + position: relative; /* make this element an absolute positioning container */ + text-align: left; /* make the zero width children position to the left of container */ + width: 25px; /* change this value if using a different sized color picker icon */ +} +.jPicker .Icon span.Color, .jPicker .Icon span.Alpha { + background-position: 2px 2px; + display: block; + height: 100%; + left: 0px; + position: absolute; + top: 0px; + width: 100%; +} +.jPicker .Icon span.Image { + background-repeat: no-repeat; + cursor: pointer; + display: block; + height: 100%; + left: 0px; + position: absolute; + top: 0px; + width: 100%; +} +.jPicker.Container { + color: #000; + z-index: 10; +} +table.jPicker { + background-color: #efefef; + border: 1px outset #666; + font-family: Arial, Helvetica, Sans-Serif; + font-size: 12px !important; + margin: 0px; + padding: 5px; + width: 545px; + z-index: 20; +} +.jPicker .Move { + background-color: #dddddd; + border-color: #fff #666 #666 #fff; + border-style: solid; + border-width: 1px; + cursor: move; + height: 12px; + padding: 0px; +} +.jPicker .Title { + font-size: 11px !important; + font-weight: bold; + margin: -2px 0px 0px 0px; + padding: 10px 0px 0px 0px; + text-align: center; + width: 100%; +} +.jPicker div.Map { + border-bottom: 2px solid #fff; + border-left: 2px solid #9a9a9a; + border-right: 2px solid #fff; + border-top: 2px solid #9a9a9a; + cursor: crosshair; + height: 260px; /* IE 6 incorrectly draws border inside the width and height instead of outside - We will fix this to 256px later */ + margin: 0px 10px 10px 10px; + overflow: hidden; /* hide the overdraw of the Color Map icon when at edge of viewing box */ + padding: 0px; + position: relative; /* make this element an absolute positioning container */ + width: 260px; /* IE 6 incorrectly draws border inside the width and height instead of outside - We will fix this to 256px later */ +} +.jPicker div[class="Map"] { + height: 256px; /* correct to 256px for browsers that support the "[class="xxx"]" selector (IE7+,Firefox,Safari,Chrome,Opera,etc.) */ + width: 256px; /* correct to 256px for browsers that support the "[class="xxx"]" selector (IE7+,Firefox,Safari,Chrome,Opera,etc.) */ +} +.jPicker div.Bar { + border-bottom: 2px solid #fff; + border-left: 2px solid #9a9a9a; + border-right: 2px solid #fff; + border-top: 2px solid #9a9a9a; + cursor: n-resize; + height: 260px; /* IE 6 incorrectly draws border inside the width and height instead of outside - We will fix this to 256px later */ + margin: 12px 10px 0px 5px; + overflow: hidden; + padding: 0px; + position: relative; + width: 24px; /* IE 6 incorrectly draws border inside the width and height instead of outside - We will fix this to 20px later */ +} +.jPicker div[class="Bar"] { + height: 256px; /* correct to 256px for browsers that support the "[class="xxx"]" selector (IE7+,Firefox,Safari,Chrome,Opera,etc.) */ + width: 20px; /* correct to 20px for browsers that support the "[class="xxx"]" selector (IE7+,Firefox,Safari,Chrome,Opera,etc.) */ +} +.jPicker .Map .Map1, .jPicker .Map .Map2, .jPicker .Map .Map3, .jPicker .Bar .Map1, .jPicker .Bar .Map2, .jPicker .Bar .Map3, .jPicker .Bar .Map4, .jPicker .Bar .Map5, .jPicker .Bar .Map6 { + background-color: transparent; + background-image: none; + display: block; + left: 0px; + position: absolute; + top: 0px; +} +.jPicker .Map .Map1, .jPicker .Map .Map2, .jPicker .Map .Map3 { + height: 2596px; + width: 256px; /* must specify pixel width. IE7/8 Quirks mode ignores opacity for an absolutely positioned item in a relative container with "overflow: visible". The marker in the colorBar + would not be drawn if its overflow is set to hidden. */ +} +.jPicker .Bar .Map1, .jPicker .Bar .Map2, .jPicker .Bar .Map3, .jPicker .Bar .Map4 { + height: 3896px; + width: 20px; /* must specify pixel width. IE7/8 Quirks mode ignores opacity for an absolutely positioned item in a relative container with "overflow: visible". The marker in the colorBar + would not be drawn if its overflow is set to hidden. */ +} +.jPicker .Bar .Map5, .jPicker .Bar .Map6 { + height: 256px; + width: 20px; /* must specify pixel width. IE7/8 Quirks mode ignores opacity for an absolutely positioned item in a relative container with "overflow: visible". The marker in the colorBar + would not be drawn if its overflow is set to hidden. */ +} +.jPicker .Map .Map1, .jPicker .Map .Map2, .jPicker .Bar .Map6 { + background-repeat: no-repeat; +} +.jPicker .Map .Map3, .jPicker .Bar .Map5 { + background-repeat: repeat; +} +.jPicker .Bar .Map1, .jPicker .Bar .Map2, .jPicker .Bar .Map3, .jPicker .Bar .Map4 { + background-repeat: repeat-x; +} +.jPicker .Map .Arrow { + display: block; + position: absolute; +} +.jPicker .Bar .Arrow { + display: block; + left: 0px; /* (arrow width / 2) - (element width / 2) - position arrows' center in elements' center */ + position: absolute; +} +.jPicker .Preview { + font-size: 9px; + padding: 5px 0px 0px 0px; + text-align: center; +} +.jPicker .Preview div { + border: 2px inset #eee; + height: 62px; + margin: 0px auto; + padding: 0px; + width: 62px; +} +.jPicker .Preview div span { + border: 1px solid #000; + display: block; + height: 30px; + margin: 0px auto; + padding: 0px; + width: 60px; +} +.jPicker .Preview .Active { + border-bottom-width: 0px; +} +.jPicker .Preview .Current { + border-top-width: 0px; + cursor: pointer; +} +.jPicker input { + font-size: 13px; +} +.jPicker .Button { + text-align: center; + padding: 0px 4px; + width: 115px; +} +.jPicker .Button input { + padding: 2px 0px; + width: 100px; +} +.jPicker .Button .Ok { + margin: 12px 0px 5px 0px; +} +.jPicker td { + margin: 0px; + padding: 0px; +} +.jPicker td.Radio { + margin: 0px; + padding: 0px; + width: 31px; +} +.jPicker td.Radio input { + margin: 0px 5px 0px 0px; + padding: 0px; +} +.jPicker td.Text { + font-size: 12px !important; + height: 22px; + margin: 0px; + padding: 0px; + text-align: left; + width: 70px; +} +.jPicker tr.Hex td.Text { + width: 100px; +} +.jPicker td.Text input { + background-color: #fff; + border: 1px inset #aaa; + height: 19px; + margin: 0px 0px 0px 5px; + text-align: left; + width: 30px; +} +.jPicker td[class="Text"] input { + height: 15px; +} +.jPicker tr.Hex td.Text input.Hex { + width: 50px; +} +.jPicker tr.Hex td.Text input.AHex { + width: 20px; +} +.jPicker .Grid { + text-align: center; + width: 114px; +} +.jPicker .Grid span.QuickColor { + border: 1px inset #aaa; + cursor: pointer; + display: inline-block; + height: 15px; + line-height: 15px; + margin: 0px; + padding: 0px; + width: 19px; +} +.jPicker .Grid span[class="QuickColor"] { + width: 17px; +} \ No newline at end of file diff --git a/phpgwapi/js/jquery/jpicker/css/jPicker-1.1.6.min.css b/phpgwapi/js/jquery/jpicker/css/jPicker-1.1.6.min.css new file mode 100644 index 0000000000..c131616fb9 --- /dev/null +++ b/phpgwapi/js/jquery/jpicker/css/jPicker-1.1.6.min.css @@ -0,0 +1 @@ +.jPicker .Icon{display:inline-block;height:24px;position:relative;text-align:left;width:25px}.jPicker .Icon span.Color,.jPicker .Icon span.Alpha{background-position:2px 2px;display:block;height:100%;left:0;position:absolute;top:0;width:100%}.jPicker .Icon span.Image{background-repeat:no-repeat;cursor:pointer;display:block;height:100%;left:0;position:absolute;top:0;width:100%}.jPicker.Container{color:#000;z-index:10}table.jPicker{background-color:#efefef;border:1px outset #666;font-family:Arial,Helvetica,Sans-Serif;font-size:12px!important;margin:0;padding:5px;width:545px;z-index:20}.jPicker .Move{background-color:#ddd;border-color:#fff #666 #666 #fff;border-style:solid;border-width:1px;cursor:move;height:12px;padding:0}.jPicker .Title{font-size:11px!important;font-weight:bold;margin:-2px 0 0 0;padding:10px 0 0 0;text-align:center;width:100%}.jPicker div.Map{border-bottom:2px solid #fff;border-left:2px solid #9a9a9a;border-right:2px solid #fff;border-top:2px solid #9a9a9a;cursor:crosshair;height:260px;margin:0 10px 10px 10px;overflow:hidden;padding:0;position:relative;width:260px}.jPicker div[class="Map"]{height:256px;width:256px}.jPicker div.Bar{border-bottom:2px solid #fff;border-left:2px solid #9a9a9a;border-right:2px solid #fff;border-top:2px solid #9a9a9a;cursor:n-resize;height:260px;margin:12px 10px 0 5px;overflow:hidden;padding:0;position:relative;width:24px}.jPicker div[class="Bar"]{height:256px;width:20px}.jPicker .Map .Map1,.jPicker .Map .Map2,.jPicker .Map .Map3,.jPicker .Bar .Map1,.jPicker .Bar .Map2,.jPicker .Bar .Map3,.jPicker .Bar .Map4,.jPicker .Bar .Map5,.jPicker .Bar .Map6{background-color:transparent;background-image:none;display:block;left:0;position:absolute;top:0}.jPicker .Map .Map1,.jPicker .Map .Map2,.jPicker .Map .Map3{height:2596px;width:256px}.jPicker .Bar .Map1,.jPicker .Bar .Map2,.jPicker .Bar .Map3,.jPicker .Bar .Map4{height:3896px;width:20px}.jPicker .Bar .Map5,.jPicker .Bar .Map6{height:256px;width:20px}.jPicker .Map .Map1,.jPicker .Map .Map2,.jPicker .Bar .Map6{background-repeat:no-repeat}.jPicker .Map .Map3,.jPicker .Bar .Map5{background-repeat:repeat}.jPicker .Bar .Map1,.jPicker .Bar .Map2,.jPicker .Bar .Map3,.jPicker .Bar .Map4{background-repeat:repeat-x}.jPicker .Map .Arrow{display:block;position:absolute}.jPicker .Bar .Arrow{display:block;left:0;position:absolute}.jPicker .Preview{font-size:9px;padding:5px 0 0 0;text-align:center}.jPicker .Preview div{border:2px inset #eee;height:62px;margin:0 auto;padding:0;width:62px}.jPicker .Preview div span{border:1px solid #000;display:block;height:30px;margin:0 auto;padding:0;width:60px}.jPicker .Preview .Active{border-bottom-width:0}.jPicker .Preview .Current{border-top-width:0;cursor:pointer}.jPicker input{font-size:13px}.jPicker .Button{text-align:center;padding:0 4px;width:115px}.jPicker .Button input{padding:2px 0;width:100px}.jPicker .Button .Ok{margin:12px 0 5px 0}.jPicker td{margin:0;padding:0}.jPicker td.Radio{margin:0;padding:0;width:31px}.jPicker td.Radio input{margin:0 5px 0 0;padding:0}.jPicker td.Text{font-size:12px!important;height:22px;margin:0;padding:0;text-align:left;width:70px}.jPicker tr.Hex td.Text{width:100px}.jPicker td.Text input{background-color:#fff;border:1px inset #aaa;height:19px;margin:0 0 0 5px;text-align:left;width:30px}.jPicker td[class="Text"] input{height:15px}.jPicker tr.Hex td.Text input.Hex{width:50px}.jPicker tr.Hex td.Text input.AHex{width:20px}.jPicker .Grid{text-align:center;width:114px}.jPicker .Grid span.QuickColor{border:1px inset #aaa;cursor:pointer;display:inline-block;height:15px;line-height:15px;margin:0;padding:0;width:19px}.jPicker .Grid span[class="QuickColor"]{width:17px} \ No newline at end of file diff --git a/phpgwapi/js/jquery/jpicker/images/AlphaBar.png b/phpgwapi/js/jquery/jpicker/images/AlphaBar.png new file mode 100644 index 0000000000000000000000000000000000000000..2950daeb877f9e917f841953f29c64266b691fcc GIT binary patch literal 2195 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%0A&S-# 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

^m(L~pIE4v{JJ6sFjTx7 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 literal 0 HcmV?d00001 diff --git a/phpgwapi/js/jquery/jpicker/images/NoColor.png b/phpgwapi/js/jquery/jpicker/images/NoColor.png new file mode 100644 index 0000000000000000000000000000000000000000..5dc47670ef4eae06eec62292e0b1786594428c9b GIT binary patch literal 552 zcmV+@0@wYCP)(95lN6yi%m1DW<-}7mdEbf`ObXi z`yRFN=P+~$1`&^QI1INNL|`8Nmrr@#-_dB$$q6zUG@Gj7tu6R`baTUr1g55782I>5 zrDTtc;O!07D%I<}xv9!#)27Azek?EJ>4}m_l*{sh*H^r}pwq#_1Lbm*PGf8gYipRE zmUK(wa3B!iXjIBmp@7Rvg^_rEreYE2=kRzq7K7JIhB26@+tqb(ktZg!2bArO-E-(a)AJP2Aqn;USA9@i=+CJUJuWkVV5bw22$q&afKZ4xHgJDW`}=6MtaRI;kI-LSP(H5=BAB0t zAPJ06g~NhJr4pr5JUYszNqtSFqNXh@sHal?M{IBN?5tLlgK9MTeJGn1<9T%zrP9#) qFJpwqG_{)?U9F~j|G3wm0t^6t`@V<%CHN}<0000jZ!R literal 0 HcmV?d00001 diff --git a/phpgwapi/js/jquery/jpicker/images/Thumbs.db b/phpgwapi/js/jquery/jpicker/images/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..27621da65d4f1859df0e6939fb6c4f070894ea45 GIT binary patch literal 39936 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 Jezd&={tszM_A>wg literal 0 HcmV?d00001 diff --git a/phpgwapi/js/jquery/jpicker/images/bar-opacity.png b/phpgwapi/js/jquery/jpicker/images/bar-opacity.png new file mode 100644 index 0000000000000000000000000000000000000000..e42ad081260dcf697ad046e61356993d4c3c3d5b GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G8lEnWAr-fhY>J=pF!M-AOCP@J!(+klQmE(u|Nrg9=jPdZ eb6Ybo@h~`D<0uF}a@rE8hr!d;&t;ucLK6Vi2PWG9 literal 0 HcmV?d00001 diff --git a/phpgwapi/js/jquery/jpicker/images/map-opacity.png b/phpgwapi/js/jquery/jpicker/images/map-opacity.png new file mode 100644 index 0000000000000000000000000000000000000000..6756cee6df14dabac21fee85d68fd2e30f1873cb GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XbUj@hLn>}1*%UwHVKz(1$>|B5)7j`^u&Pnwz>oj`>(>aS jpPwhotNJUGfy02oX)8y=1{2rcK#dHZu6{1-oD!M<2x%(! literal 0 HcmV?d00001 diff --git a/phpgwapi/js/jquery/jpicker/images/mappoint.gif b/phpgwapi/js/jquery/jpicker/images/mappoint.gif new file mode 100644 index 0000000000000000000000000000000000000000..f5f855745cfda02dcfa684d3fcd628eadf3d39e8 GIT binary patch literal 93 zcmZ?wbhEHba)%3-gb!1ED&*WW@NAi0RAo>Pyhe` literal 0 HcmV?d00001 diff --git a/phpgwapi/js/jquery/jpicker/images/picker.gif b/phpgwapi/js/jquery/jpicker/images/picker.gif new file mode 100644 index 0000000000000000000000000000000000000000..374d891042f22ff5c23eed3148b6ae5fe2cfdb1c GIT binary patch literal 146 zcmZ?wbhEHblw^=#Sj56`S)_gx__~2Yh?c=8>m+y){r~YPZmz!j+@QWJ- rTTkXiR9;#Y7Lm*_bDc!{( zJaZG%Q-e|yQz{EjrrH1%X?nUihE&{2vMGMX!z^TAX6E+H$nXKH$<(wz|Nq+?{eN?F gbMw(m21Yi9jg}lG!VlE;12r*ty85}Sb4q9e04Z`P barW) locX = barW; + if (locY < 0) locY = 0; + else if (locY > barH) locY = barH; + val.call($this, 'xy', { x: ((locX / barW) * rangeX) + minX, y: ((locY / barH) * rangeY) + minY }); + }, + draw = + function() + { + var arrowOffsetX = 0, + arrowOffsetY = 0, + barW = bar.w, + barH = bar.h, + arrowW = arrow.w, + arrowH = arrow.h; + setTimeout( + function() + { + if (rangeX > 0) // range is greater than zero + { + // constrain to bounds + if (x == maxX) arrowOffsetX = barW; + else arrowOffsetX = ((x / rangeX) * barW) | 0; + } + if (rangeY > 0) // range is greater than zero + { + // constrain to bounds + if (y == maxY) arrowOffsetY = barH; + else arrowOffsetY = ((y / rangeY) * barH) | 0; + } + // if arrow width is greater than bar width, center arrow and prevent horizontal dragging + if (arrowW >= barW) arrowOffsetX = (barW >> 1) - (arrowW >> 1); // number >> 1 - superfast bitwise divide by two and truncate (move bits over one bit discarding lowest) + else arrowOffsetX -= arrowW >> 1; + // if arrow height is greater than bar height, center arrow and prevent vertical dragging + if (arrowH >= barH) arrowOffsetY = (barH >> 1) - (arrowH >> 1); + else arrowOffsetY -= arrowH >> 1; + // set the arrow position based on these offsets + arrow.css({ left: arrowOffsetX + 'px', top: arrowOffsetY + 'px' }); + }, 0); + }, + val = + function(name, value, context) + { + var set = value !== undefined; + if (!set) + { + if (name === undefined || name == null) name = 'xy'; + switch (name.toLowerCase()) + { + case 'x': return x; + case 'y': return y; + case 'xy': + default: return { x: x, y: y }; + } + } + if (context != null && context == $this) return; + var changed = false, + newX, + newY; + if (name == null) name = 'xy'; + switch (name.toLowerCase()) + { + case 'x': + newX = value && (value.x && value.x | 0 || value | 0) || 0; + break; + case 'y': + newY = value && (value.y && value.y | 0 || value | 0) || 0; + break; + case 'xy': + default: + newX = value && value.x && value.x | 0 || 0; + newY = value && value.y && value.y | 0 || 0; + break; + } + if (newX != null) + { + if (newX < minX) newX = minX; + else if (newX > maxX) newX = maxX; + if (x != newX) + { + x = newX; + changed = true; + } + } + if (newY != null) + { + if (newY < minY) newY = minY; + else if (newY > maxY) newY = maxY; + if (y != newY) + { + y = newY; + changed = true; + } + } + changed && fireChangeEvents.call($this, context || $this); + }, + range = + function (name, value) + { + var set = value !== undefined; + if (!set) + { + if (name === undefined || name == null) name = 'all'; + switch (name.toLowerCase()) + { + case 'minx': return minX; + case 'maxx': return maxX; + case 'rangex': return { minX: minX, maxX: maxX, rangeX: rangeX }; + case 'miny': return minY; + case 'maxy': return maxY; + case 'rangey': return { minY: minY, maxY: maxY, rangeY: rangeY }; + case 'all': + default: return { minX: minX, maxX: maxX, rangeX: rangeX, minY: minY, maxY: maxY, rangeY: rangeY }; + } + } + var changed = false, + newMinX, + newMaxX, + newMinY, + newMaxY; + if (name == null) name = 'all'; + switch (name.toLowerCase()) + { + case 'minx': + newMinX = value && (value.minX && value.minX | 0 || value | 0) || 0; + break; + case 'maxx': + newMaxX = value && (value.maxX && value.maxX | 0 || value | 0) || 0; + break; + case 'rangex': + newMinX = value && value.minX && value.minX | 0 || 0; + newMaxX = value && value.maxX && value.maxX | 0 || 0; + break; + case 'miny': + newMinY = value && (value.minY && value.minY | 0 || value | 0) || 0; + break; + case 'maxy': + newMaxY = value && (value.maxY && value.maxY | 0 || value | 0) || 0; + break; + case 'rangey': + newMinY = value && value.minY && value.minY | 0 || 0; + newMaxY = value && value.maxY && value.maxY | 0 || 0; + break; + case 'all': + default: + newMinX = value && value.minX && value.minX | 0 || 0; + newMaxX = value && value.maxX && value.maxX | 0 || 0; + newMinY = value && value.minY && value.minY | 0 || 0; + newMaxY = value && value.maxY && value.maxY | 0 || 0; + break; + } + if (newMinX != null && minX != newMinX) + { + minX = newMinX; + rangeX = maxX - minX; + } + if (newMaxX != null && maxX != newMaxX) + { + maxX = newMaxX; + rangeX = maxX - minX; + } + if (newMinY != null && minY != newMinY) + { + minY = newMinY; + rangeY = maxY - minY; + } + if (newMaxY != null && maxY != newMaxY) + { + maxY = newMaxY; + rangeY = maxY - minY; + } + }, + bind = + function (callback) + { + if ($.isFunction(callback)) changeEvents.push(callback); + }, + unbind = + function (callback) + { + if (!$.isFunction(callback)) return; + var i; + while ((i = $.inArray(callback, changeEvents)) != -1) changeEvents.splice(i, 1); + }, + destroy = + function() + { + // unbind all possible events and null objects + $(document).unbind('mouseup', mouseUp).unbind('mousemove', mouseMove); + bar.unbind('mousedown', mouseDown); + bar = null; + arrow = null; + changeEvents = null; + }; + $.extend(true, $this, // public properties, methods, and event bindings - these we need to access from other controls + { + val: val, + range: range, + bind: bind, + unbind: unbind, + destroy: destroy + }); + // initialize this control + arrow.src = options.arrow && options.arrow.image; + arrow.w = options.arrow && options.arrow.width || arrow.width(); + arrow.h = options.arrow && options.arrow.height || arrow.height(); + bar.w = options.map && options.map.width || bar.width(); + bar.h = options.map && options.map.height || bar.height(); + // bind mousedown event + bar.bind('mousedown', mouseDown); + bind.call($this, draw); + }, + ColorValuePicker = // controls for all the input elements for the typing in color values + function(picker, color, bindedHex, alphaPrecision) + { + var $this = this, // private properties and methods + inputs = picker.find('td.Text input'), + red = inputs.eq(3), + green = inputs.eq(4), + blue = inputs.eq(5), + alpha = inputs.length > 7 ? inputs.eq(6) : null, + hue = inputs.eq(0), + saturation = inputs.eq(1), + value = inputs.eq(2), + hex = inputs.eq(inputs.length > 7 ? 7 : 6), + ahex = inputs.length > 7 ? inputs.eq(8) : null, + keyDown = // input box key down - use arrows to alter color + function(e) + { + if (e.target.value == '' && e.target != hex.get(0) && (bindedHex != null && e.target != bindedHex.get(0) || bindedHex == null)) return; + if (!validateKey(e)) return e; + switch (e.target) + { + case red.get(0): + switch (e.keyCode) + { + case 38: + red.val(setValueInRange.call($this, (red.val() << 0) + 1, 0, 255)); + color.val('r', red.val(), e.target); + return false; + case 40: + red.val(setValueInRange.call($this, (red.val() << 0) - 1, 0, 255)); + color.val('r', red.val(), e.target); + return false; + } + break; + case green.get(0): + switch (e.keyCode) + { + case 38: + green.val(setValueInRange.call($this, (green.val() << 0) + 1, 0, 255)); + color.val('g', green.val(), e.target); + return false; + case 40: + green.val(setValueInRange.call($this, (green.val() << 0) - 1, 0, 255)); + color.val('g', green.val(), e.target); + return false; + } + break; + case blue.get(0): + switch (e.keyCode) + { + case 38: + blue.val(setValueInRange.call($this, (blue.val() << 0) + 1, 0, 255)); + color.val('b', blue.val(), e.target); + return false; + case 40: + blue.val(setValueInRange.call($this, (blue.val() << 0) - 1, 0, 255)); + color.val('b', blue.val(), e.target); + return false; + } + break; + case alpha && alpha.get(0): + switch (e.keyCode) + { + case 38: + alpha.val(setValueInRange.call($this, parseFloat(alpha.val()) + 1, 0, 100)); + color.val('a', Math.precision((alpha.val() * 255) / 100, alphaPrecision), e.target); + return false; + case 40: + alpha.val(setValueInRange.call($this, parseFloat(alpha.val()) - 1, 0, 100)); + color.val('a', Math.precision((alpha.val() * 255) / 100, alphaPrecision), e.target); + return false; + } + break; + case hue.get(0): + switch (e.keyCode) + { + case 38: + hue.val(setValueInRange.call($this, (hue.val() << 0) + 1, 0, 360)); + color.val('h', hue.val(), e.target); + return false; + case 40: + hue.val(setValueInRange.call($this, (hue.val() << 0) - 1, 0, 360)); + color.val('h', hue.val(), e.target); + return false; + } + break; + case saturation.get(0): + switch (e.keyCode) + { + case 38: + saturation.val(setValueInRange.call($this, (saturation.val() << 0) + 1, 0, 100)); + color.val('s', saturation.val(), e.target); + return false; + case 40: + saturation.val(setValueInRange.call($this, (saturation.val() << 0) - 1, 0, 100)); + color.val('s', saturation.val(), e.target); + return false; + } + break; + case value.get(0): + switch (e.keyCode) + { + case 38: + value.val(setValueInRange.call($this, (value.val() << 0) + 1, 0, 100)); + color.val('v', value.val(), e.target); + return false; + case 40: + value.val(setValueInRange.call($this, (value.val() << 0) - 1, 0, 100)); + color.val('v', value.val(), e.target); + return false; + } + break; + } + }, + keyUp = // input box key up - validate value and set color + function(e) + { + if (e.target.value == '' && e.target != hex.get(0) && (bindedHex != null && e.target != bindedHex.get(0) || bindedHex == null)) return; + if (!validateKey(e)) return e; + switch (e.target) + { + case red.get(0): + red.val(setValueInRange.call($this, red.val(), 0, 255)); + color.val('r', red.val(), e.target); + break; + case green.get(0): + green.val(setValueInRange.call($this, green.val(), 0, 255)); + color.val('g', green.val(), e.target); + break; + case blue.get(0): + blue.val(setValueInRange.call($this, blue.val(), 0, 255)); + color.val('b', blue.val(), e.target); + break; + case alpha && alpha.get(0): + alpha.val(setValueInRange.call($this, alpha.val(), 0, 100)); + color.val('a', Math.precision((alpha.val() * 255) / 100, alphaPrecision), e.target); + break; + case hue.get(0): + hue.val(setValueInRange.call($this, hue.val(), 0, 360)); + color.val('h', hue.val(), e.target); + break; + case saturation.get(0): + saturation.val(setValueInRange.call($this, saturation.val(), 0, 100)); + color.val('s', saturation.val(), e.target); + break; + case value.get(0): + value.val(setValueInRange.call($this, value.val(), 0, 100)); + color.val('v', value.val(), e.target); + break; + case hex.get(0): + hex.val(hex.val().replace(/[^a-fA-F0-9]/g, '').toLowerCase().substring(0, 6)); + bindedHex && bindedHex.val(hex.val()); + color.val('hex', hex.val() != '' ? hex.val() : null, e.target); + break; + case bindedHex && bindedHex.get(0): + bindedHex.val(bindedHex.val().replace(/[^a-fA-F0-9]/g, '').toLowerCase().substring(0, 6)); + hex.val(bindedHex.val()); + color.val('hex', bindedHex.val() != '' ? bindedHex.val() : null, e.target); + break; + case ahex && ahex.get(0): + ahex.val(ahex.val().replace(/[^a-fA-F0-9]/g, '').toLowerCase().substring(0, 2)); + color.val('a', ahex.val() != null ? parseInt(ahex.val(), 16) : null, e.target); + break; + } + }, + blur = // input box blur - reset to original if value empty + function(e) + { + if (color.val() != null) + { + switch (e.target) + { + case red.get(0): red.val(color.val('r')); break; + case green.get(0): green.val(color.val('g')); break; + case blue.get(0): blue.val(color.val('b')); break; + case alpha && alpha.get(0): alpha.val(Math.precision((color.val('a') * 100) / 255, alphaPrecision)); break; + case hue.get(0): hue.val(color.val('h')); break; + case saturation.get(0): saturation.val(color.val('s')); break; + case value.get(0): value.val(color.val('v')); break; + case hex.get(0): + case bindedHex && bindedHex.get(0): + hex.val(color.val('hex')); + bindedHex && bindedHex.val(color.val('hex')); + break; + case ahex && ahex.get(0): ahex.val(color.val('ahex').substring(6)); break; + } + } + }, + validateKey = // validate key + function(e) + { + switch(e.keyCode) + { + case 9: + case 16: + case 29: + case 37: + case 39: + return false; + case 'c'.charCodeAt(): + case 'v'.charCodeAt(): + if (e.ctrlKey) return false; + } + return true; + }, + setValueInRange = // constrain value within range + function(value, min, max) + { + if (value == '' || isNaN(value)) return min; + if (value > max) return max; + if (value < min) return min; + return value; + }, + colorChanged = + function(ui, context) + { + var all = ui.val('all'); + if (context != red.get(0)) red.val(all != null ? all.r : ''); + if (context != green.get(0)) green.val(all != null ? all.g : ''); + if (context != blue.get(0)) blue.val(all != null ? all.b : ''); + if (alpha && context != alpha.get(0)) alpha.val(all != null ? Math.precision((all.a * 100) / 255, alphaPrecision) : ''); + if (context != hue.get(0)) hue.val(all != null ? all.h : ''); + if (context != saturation.get(0)) saturation.val(all != null ? all.s : ''); + if (context != value.get(0)) value.val(all != null ? all.v : ''); + if (context != hex.get(0) && (bindedHex && context != bindedHex.get(0) || !bindedHex)) hex.val(all != null ? all.hex : ''); + if (bindedHex && context != bindedHex.get(0) && context != hex.get(0)) bindedHex.val(all != null ? all.hex : ''); + if (ahex && context != ahex.get(0)) ahex.val(all != null ? all.ahex.substring(6) : ''); + }, + destroy = + function() + { + // unbind all events and null objects + red.add(green).add(blue).add(alpha).add(hue).add(saturation).add(value).add(hex).add(bindedHex).add(ahex).unbind('keyup', keyUp).unbind('blur', blur); + red.add(green).add(blue).add(alpha).add(hue).add(saturation).add(value).unbind('keydown', keyDown); + color.unbind(colorChanged); + red = null; + green = null; + blue = null; + alpha = null; + hue = null; + saturation = null; + value = null; + hex = null; + ahex = null; + }; + $.extend(true, $this, // public properties and methods + { + destroy: destroy + }); + red.add(green).add(blue).add(alpha).add(hue).add(saturation).add(value).add(hex).add(bindedHex).add(ahex).bind('keyup', keyUp).bind('blur', blur); + red.add(green).add(blue).add(alpha).add(hue).add(saturation).add(value).bind('keydown', keyDown); + color.bind(colorChanged); + }; + $.jPicker = + { + List: [], // array holding references to each active instance of the control + Color: // color object - we will be able to assign by any color space type or retrieve any color space info + // we want this public so we can optionally assign new color objects to initial values using inputs other than a string hex value (also supported) + function(init) + { + var $this = this, + r, + g, + b, + a, + h, + s, + v, + changeEvents = new Array(), + fireChangeEvents = + function(context) + { + for (var i = 0; i < changeEvents.length; i++) changeEvents[i].call($this, $this, context); + }, + val = + function(name, value, context) + { + var set = value !== undefined; + if (!set) + { + if (name === undefined || name == null || name == '') name = 'all'; + if (r == null) return null; + switch (name.toLowerCase()) + { + case 'ahex': return ColorMethods.rgbaToHex({ r: r, g: g, b: b, a: a }); + case 'hex': return val('ahex').substring(0, 6); + case 'all': return { r: r, g: g, b: b, a: a, h: h, s: s, v: v, hex: val.call($this, 'hex'), ahex: val.call($this, 'ahex') }; + default: + var ret={}; + for (var i = 0; i < name.length; i++) + { + switch (name.charAt(i)) + { + case 'r': + if (name.length == 1) ret = r; + else ret.r = r; + break; + case 'g': + if (name.length == 1) ret = g; + else ret.g = g; + break; + case 'b': + if (name.length == 1) ret = b; + else ret.b = b; + break; + case 'a': + if (name.length == 1) ret = a; + else ret.a = a; + break; + case 'h': + if (name.length == 1) ret = h; + else ret.h = h; + break; + case 's': + if (name.length == 1) ret = s; + else ret.s = s; + break; + case 'v': + if (name.length == 1) ret = v; + else ret.v = v; + break; + } + } + return ret == {} ? val.call($this, 'all') : ret; + break; + } + } + if (context != null && context == $this) return; + var changed = false; + if (name == null) name = ''; + if (value == null) + { + if (r != null) + { + r = null; + changed = true; + } + if (g != null) + { + g = null; + changed = true; + } + if (b != null) + { + b = null; + changed = true; + } + if (a != null) + { + a = null; + changed = true; + } + if (h != null) + { + h = null; + changed = true; + } + if (s != null) + { + s = null; + changed = true; + } + if (v != null) + { + v = null; + changed = true; + } + changed && fireChangeEvents.call($this, context || $this); + return; + } + switch (name.toLowerCase()) + { + case 'ahex': + case 'hex': + var ret = ColorMethods.hexToRgba(value && (value.ahex || value.hex) || value || '00000000'); + val.call($this, 'rgba', { r: ret.r, g: ret.g, b: ret.b, a: name == 'ahex' ? ret.a : a != null ? a : 255 }, context); + break; + default: + if (value && (value.ahex != null || value.hex != null)) + { + val.call($this, 'ahex', value.ahex || value.hex || '00000000', context); + return; + } + var newV = {}, rgb = false, hsv = false; + if (value.r !== undefined && !name.indexOf('r') == -1) name += 'r'; + if (value.g !== undefined && !name.indexOf('g') == -1) name += 'g'; + if (value.b !== undefined && !name.indexOf('b') == -1) name += 'b'; + if (value.a !== undefined && !name.indexOf('a') == -1) name += 'a'; + if (value.h !== undefined && !name.indexOf('h') == -1) name += 'h'; + if (value.s !== undefined && !name.indexOf('s') == -1) name += 's'; + if (value.v !== undefined && !name.indexOf('v') == -1) name += 'v'; + for (var i = 0; i < name.length; i++) + { + switch (name.charAt(i)) + { + case 'r': + if (hsv) continue; + rgb = true; + newV.r = value && value.r && value.r | 0 || value && value | 0 || 0; + if (newV.r < 0) newV.r = 0; + else if (newV.r > 255) newV.r = 255; + if (r != newV.r) + { + r = newV.r; + changed = true; + } + break; + case 'g': + if (hsv) continue; + rgb = true; + newV.g = value && value.g && value.g | 0 || value && value | 0 || 0; + if (newV.g < 0) newV.g = 0; + else if (newV.g > 255) newV.g = 255; + if (g != newV.g) + { + g = newV.g; + changed = true; + } + break; + case 'b': + if (hsv) continue; + rgb = true; + newV.b = value && value.b && value.b | 0 || value && value | 0 || 0; + if (newV.b < 0) newV.b = 0; + else if (newV.b > 255) newV.b = 255; + if (b != newV.b) + { + b = newV.b; + changed = true; + } + break; + case 'a': + newV.a = value && value.a != null ? value.a | 0 : value != null ? value | 0 : 255; + if (newV.a < 0) newV.a = 0; + else if (newV.a > 255) newV.a = 255; + if (a != newV.a) + { + a = newV.a; + changed = true; + } + break; + case 'h': + if (rgb) continue; + hsv = true; + newV.h = value && value.h && value.h | 0 || value && value | 0 || 0; + if (newV.h < 0) newV.h = 0; + else if (newV.h > 360) newV.h = 360; + if (h != newV.h) + { + h = newV.h; + changed = true; + } + break; + case 's': + if (rgb) continue; + hsv = true; + newV.s = value && value.s != null ? value.s | 0 : value != null ? value | 0 : 100; + if (newV.s < 0) newV.s = 0; + else if (newV.s > 100) newV.s = 100; + if (s != newV.s) + { + s = newV.s; + changed = true; + } + break; + case 'v': + if (rgb) continue; + hsv = true; + newV.v = value && value.v != null ? value.v | 0 : value != null ? value | 0 : 100; + if (newV.v < 0) newV.v = 0; + else if (newV.v > 100) newV.v = 100; + if (v != newV.v) + { + v = newV.v; + changed = true; + } + break; + } + } + if (changed) + { + if (rgb) + { + r = r || 0; + g = g || 0; + b = b || 0; + var ret = ColorMethods.rgbToHsv({ r: r, g: g, b: b }); + h = ret.h; + s = ret.s; + v = ret.v; + } + else if (hsv) + { + h = h || 0; + s = s != null ? s : 100; + v = v != null ? v : 100; + var ret = ColorMethods.hsvToRgb({ h: h, s: s, v: v }); + r = ret.r; + g = ret.g; + b = ret.b; + } + a = a != null ? a : 255; + fireChangeEvents.call($this, context || $this); + } + break; + } + }, + bind = + function(callback) + { + if ($.isFunction(callback)) changeEvents.push(callback); + }, + unbind = + function(callback) + { + if (!$.isFunction(callback)) return; + var i; + while ((i = $.inArray(callback, changeEvents)) != -1) changeEvents.splice(i, 1); + }, + destroy = + function() + { + changeEvents = null; + } + $.extend(true, $this, // public properties and methods + { + val: val, + bind: bind, + unbind: unbind, + destroy: destroy + }); + if (init) + { + if (init.ahex != null) val('ahex', init); + else if (init.hex != null) val((init.a != null ? 'a' : '') + 'hex', init.a != null ? { ahex: init.hex + ColorMethods.intToHex(init.a) } : init); + else if (init.r != null && init.g != null && init.b != null) val('rgb' + (init.a != null ? 'a' : ''), init); + else if (init.h != null && init.s != null && init.v != null) val('hsv' + (init.a != null ? 'a' : ''), init); + } + }, + ColorMethods: // color conversion methods - make public to give use to external scripts + { + hexToRgba: + function(hex) + { + hex = this.validateHex(hex); + if (hex == '') return { r: null, g: null, b: null, a: null }; + var r = '00', g = '00', b = '00', a = '255'; + if (hex.length == 6) hex += 'ff'; + if (hex.length > 6) + { + r = hex.substring(0, 2); + g = hex.substring(2, 4); + b = hex.substring(4, 6); + a = hex.substring(6, hex.length); + } + else + { + if (hex.length > 4) + { + r = hex.substring(4, hex.length); + hex = hex.substring(0, 4); + } + if (hex.length > 2) + { + g = hex.substring(2, hex.length); + hex = hex.substring(0, 2); + } + if (hex.length > 0) b = hex.substring(0, hex.length); + } + return { r: this.hexToInt(r), g: this.hexToInt(g), b: this.hexToInt(b), a: this.hexToInt(a) }; + }, + validateHex: + function(hex) + { + hex = hex.toLowerCase().replace(/[^a-f0-9]/g, ''); + if (hex.length > 8) hex = hex.substring(0, 8); + return hex; + }, + rgbaToHex: + function(rgba) + { + return this.intToHex(rgba.r) + this.intToHex(rgba.g) + this.intToHex(rgba.b) + this.intToHex(rgba.a); + }, + intToHex: + function(dec) + { + var result = (dec | 0).toString(16); + if (result.length == 1) result = ('0' + result); + return result.toLowerCase(); + }, + hexToInt: + function(hex) + { + return parseInt(hex, 16); + }, + rgbToHsv: + function(rgb) + { + var r = rgb.r / 255, g = rgb.g / 255, b = rgb.b / 255, hsv = { h: 0, s: 0, v: 0 }, min = 0, max = 0, delta; + if (r >= g && r >= b) + { + max = r; + min = g > b ? b : g; + } + else if (g >= b && g >= r) + { + max = g; + min = r > b ? b : r; + } + else + { + max = b; + min = g > r ? r : g; + } + hsv.v = max; + hsv.s = max ? (max - min) / max : 0; + if (!hsv.s) hsv.h = 0; + else + { + delta = max - min; + if (r == max) hsv.h = (g - b) / delta; + else if (g == max) hsv.h = 2 + (b - r) / delta; + else hsv.h = 4 + (r - g) / delta; + hsv.h = parseInt(hsv.h * 60); + if (hsv.h < 0) hsv.h += 360; + } + hsv.s = (hsv.s * 100) | 0; + hsv.v = (hsv.v * 100) | 0; + return hsv; + }, + hsvToRgb: + function(hsv) + { + var rgb = { r: 0, g: 0, b: 0, a: 100 }, h = hsv.h, s = hsv.s, v = hsv.v; + if (s == 0) + { + if (v == 0) rgb.r = rgb.g = rgb.b = 0; + else rgb.r = rgb.g = rgb.b = (v * 255 / 100) | 0; + } + else + { + if (h == 360) h = 0; + h /= 60; + s = s / 100; + v = v / 100; + var i = h | 0, + f = h - i, + p = v * (1 - s), + q = v * (1 - (s * f)), + t = v * (1 - (s * (1 - f))); + switch (i) + { + case 0: + rgb.r = v; + rgb.g = t; + rgb.b = p; + break; + case 1: + rgb.r = q; + rgb.g = v; + rgb.b = p; + break; + case 2: + rgb.r = p; + rgb.g = v; + rgb.b = t; + break; + case 3: + rgb.r = p; + rgb.g = q; + rgb.b = v; + break; + case 4: + rgb.r = t; + rgb.g = p; + rgb.b = v; + break; + case 5: + rgb.r = v; + rgb.g = p; + rgb.b = q; + break; + } + rgb.r = (rgb.r * 255) | 0; + rgb.g = (rgb.g * 255) | 0; + rgb.b = (rgb.b * 255) | 0; + } + return rgb; + } + } + }; + var Color = $.jPicker.Color, List = $.jPicker.List, ColorMethods = $.jPicker.ColorMethods; // local copies for YUI compressor + $.fn.jPicker = + function(options) + { + var $arguments = arguments; + return this.each( + function() + { + var $this = this, settings = $.extend(true, {}, $.fn.jPicker.defaults, options); // local copies for YUI compressor + if ($($this).get(0).nodeName.toLowerCase() == 'input') // Add color picker icon if binding to an input element and bind the events to the input + { + $.extend(true, settings, + { + window: + { + bindToInput: true, + expandable: true, + input: $($this) + } + }); + if($($this).val()=='') + { + settings.color.active = new Color({ hex: null }); + settings.color.current = new Color({ hex: null }); + } + else if (ColorMethods.validateHex($($this).val())) + { + settings.color.active = new Color({ hex: $($this).val(), a: settings.color.active.val('a') }); + settings.color.current = new Color({ hex: $($this).val(), a: settings.color.active.val('a') }); + } + } + if (settings.window.expandable) + $($this).after('    '); + else settings.window.liveUpdate = false; // Basic control binding for inline use - You will need to override the liveCallback or commitCallback function to retrieve results + var isLessThanIE7 = parseFloat(navigator.appVersion.split('MSIE')[1]) < 7 && document.body.filters, // needed to run the AlphaImageLoader function for IE6 + container = null, + colorMapDiv = null, + colorBarDiv = null, + colorMapL1 = null, // different layers of colorMap and colorBar + colorMapL2 = null, + colorMapL3 = null, + colorBarL1 = null, + colorBarL2 = null, + colorBarL3 = null, + colorBarL4 = null, + colorBarL5 = null, + colorBarL6 = null, + colorMap = null, // color maps + colorBar = null, + colorPicker = null, + elementStartX = null, // Used to record the starting css positions for dragging the control + elementStartY = null, + pageStartX = null, // Used to record the mousedown coordinates for dragging the control + pageStartY = null, + activePreview = null, // color boxes above the radio buttons + currentPreview = null, + okButton = null, + cancelButton = null, + grid = null, // preset colors grid + iconColor = null, // iconColor for popup icon + iconAlpha = null, // iconAlpha for popup icon + iconImage = null, // iconImage popup icon + moveBar = null, // drag bar + setColorMode = // set color mode and update visuals for the new color mode + function(colorMode) + { + var active = color.active, // local copies for YUI compressor + clientPath = images.clientPath, + hex = active.val('hex'), + rgbMap, + rgbBar; + settings.color.mode = colorMode; + switch (colorMode) + { + case 'h': + setTimeout( + function() + { + setBG.call($this, colorMapDiv, 'transparent'); + setImgLoc.call($this, colorMapL1, 0); + setAlpha.call($this, colorMapL1, 100); + setImgLoc.call($this, colorMapL2, 260); + setAlpha.call($this, colorMapL2, 100); + setBG.call($this, colorBarDiv, 'transparent'); + setImgLoc.call($this, colorBarL1, 0); + setAlpha.call($this, colorBarL1, 100); + setImgLoc.call($this, colorBarL2, 260); + setAlpha.call($this, colorBarL2, 100); + setImgLoc.call($this, colorBarL3, 260); + setAlpha.call($this, colorBarL3, 100); + setImgLoc.call($this, colorBarL4, 260); + setAlpha.call($this, colorBarL4, 100); + setImgLoc.call($this, colorBarL6, 260); + setAlpha.call($this, colorBarL6, 100); + }, 0); + colorMap.range('all', { minX: 0, maxX: 100, minY: 0, maxY: 100 }); + colorBar.range('rangeY', { minY: 0, maxY: 360 }); + if (active.val('ahex') == null) break; + colorMap.val('xy', { x: active.val('s'), y: 100 - active.val('v') }, colorMap); + colorBar.val('y', 360 - active.val('h'), colorBar); + break; + case 's': + setTimeout( + function() + { + setBG.call($this, colorMapDiv, 'transparent'); + setImgLoc.call($this, colorMapL1, -260); + setImgLoc.call($this, colorMapL2, -520); + setImgLoc.call($this, colorBarL1, -260); + setImgLoc.call($this, colorBarL2, -520); + setImgLoc.call($this, colorBarL6, 260); + setAlpha.call($this, colorBarL6, 100); + }, 0); + colorMap.range('all', { minX: 0, maxX: 360, minY: 0, maxY: 100 }); + colorBar.range('rangeY', { minY: 0, maxY: 100 }); + if (active.val('ahex') == null) break; + colorMap.val('xy', { x: active.val('h'), y: 100 - active.val('v') }, colorMap); + colorBar.val('y', 100 - active.val('s'), colorBar); + break; + case 'v': + setTimeout( + function() + { + setBG.call($this, colorMapDiv, '000000'); + setImgLoc.call($this, colorMapL1, -780); + setImgLoc.call($this, colorMapL2, 260); + setBG.call($this, colorBarDiv, hex); + setImgLoc.call($this, colorBarL1, -520); + setImgLoc.call($this, colorBarL2, 260); + setAlpha.call($this, colorBarL2, 100); + setImgLoc.call($this, colorBarL6, 260); + setAlpha.call($this, colorBarL6, 100); + }, 0); + colorMap.range('all', { minX: 0, maxX: 360, minY: 0, maxY: 100 }); + colorBar.range('rangeY', { minY: 0, maxY: 100 }); + if (active.val('ahex') == null) break; + colorMap.val('xy', { x: active.val('h'), y: 100 - active.val('s') }, colorMap); + colorBar.val('y', 100 - active.val('v'), colorBar); + break; + case 'r': + rgbMap = -1040; + rgbBar = -780; + colorMap.range('all', { minX: 0, maxX: 255, minY: 0, maxY: 255 }); + colorBar.range('rangeY', { minY: 0, maxY: 255 }); + if (active.val('ahex') == null) break; + colorMap.val('xy', { x: active.val('b'), y: 255 - active.val('g') }, colorMap); + colorBar.val('y', 255 - active.val('r'), colorBar); + break; + case 'g': + rgbMap = -1560; + rgbBar = -1820; + colorMap.range('all', { minX: 0, maxX: 255, minY: 0, maxY: 255 }); + colorBar.range('rangeY', { minY: 0, maxY: 255 }); + if (active.val('ahex') == null) break; + colorMap.val('xy', { x: active.val('b'), y: 255 - active.val('r') }, colorMap); + colorBar.val('y', 255 - active.val('g'), colorBar); + break; + case 'b': + rgbMap = -2080; + rgbBar = -2860; + colorMap.range('all', { minX: 0, maxX: 255, minY: 0, maxY: 255 }); + colorBar.range('rangeY', { minY: 0, maxY: 255 }); + if (active.val('ahex') == null) break; + colorMap.val('xy', { x: active.val('r'), y: 255 - active.val('g') }, colorMap); + colorBar.val('y', 255 - active.val('b'), colorBar); + break; + case 'a': + setTimeout( + function() + { + setBG.call($this, colorMapDiv, 'transparent'); + setImgLoc.call($this, colorMapL1, -260); + setImgLoc.call($this, colorMapL2, -520); + setImgLoc.call($this, colorBarL1, 260); + setImgLoc.call($this, colorBarL2, 260); + setAlpha.call($this, colorBarL2, 100); + setImgLoc.call($this, colorBarL6, 0); + setAlpha.call($this, colorBarL6, 100); + }, 0); + colorMap.range('all', { minX: 0, maxX: 360, minY: 0, maxY: 100 }); + colorBar.range('rangeY', { minY: 0, maxY: 255 }); + if (active.val('ahex') == null) break; + colorMap.val('xy', { x: active.val('h'), y: 100 - active.val('v') }, colorMap); + colorBar.val('y', 255 - active.val('a'), colorBar); + break; + default: + throw ('Invalid Mode'); + break; + } + switch (colorMode) + { + case 'h': + break; + case 's': + case 'v': + case 'a': + setTimeout( + function() + { + setAlpha.call($this, colorMapL1, 100); + setAlpha.call($this, colorBarL1, 100); + setImgLoc.call($this, colorBarL3, 260); + setAlpha.call($this, colorBarL3, 100); + setImgLoc.call($this, colorBarL4, 260); + setAlpha.call($this, colorBarL4, 100); + }, 0); + break; + case 'r': + case 'g': + case 'b': + setTimeout( + function() + { + setBG.call($this, colorMapDiv, 'transparent'); + setBG.call($this, colorBarDiv, 'transparent'); + setAlpha.call($this, colorBarL1, 100); + setAlpha.call($this, colorMapL1, 100); + setImgLoc.call($this, colorMapL1, rgbMap); + setImgLoc.call($this, colorMapL2, rgbMap - 260); + setImgLoc.call($this, colorBarL1, rgbBar - 780); + setImgLoc.call($this, colorBarL2, rgbBar - 520); + setImgLoc.call($this, colorBarL3, rgbBar); + setImgLoc.call($this, colorBarL4, rgbBar - 260); + setImgLoc.call($this, colorBarL6, 260); + setAlpha.call($this, colorBarL6, 100); + }, 0); + break; + } + if (active.val('ahex') == null) return; + activeColorChanged.call($this, active); + }, + activeColorChanged = // Update color when user changes text values + function(ui, context) + { + if (context == null || (context != colorBar && context != colorMap)) positionMapAndBarArrows.call($this, ui, context); + setTimeout( + function() + { + updatePreview.call($this, ui); + updateMapVisuals.call($this, ui); + updateBarVisuals.call($this, ui); + }, 0); + }, + mapValueChanged = // user has dragged the ColorMap pointer + function(ui, context) + { + var active = color.active; + if (context != colorMap && active.val() == null) return; + var xy = ui.val('all'); + switch (settings.color.mode) + { + case 'h': + active.val('sv', { s: xy.x, v: 100 - xy.y }, context); + break; + case 's': + case 'a': + active.val('hv', { h: xy.x, v: 100 - xy.y }, context); + break; + case 'v': + active.val('hs', { h: xy.x, s: 100 - xy.y }, context); + break; + case 'r': + active.val('gb', { g: 255 - xy.y, b: xy.x }, context); + break; + case 'g': + active.val('rb', { r: 255 - xy.y, b: xy.x }, context); + break; + case 'b': + active.val('rg', { r: xy.x, g: 255 - xy.y }, context); + break; + } + }, + colorBarValueChanged = // user has dragged the ColorBar slider + function(ui, context) + { + var active = color.active; + if (context != colorBar && active.val() == null) return; + switch (settings.color.mode) + { + case 'h': + active.val('h', { h: 360 - ui.val('y') }, context); + break; + case 's': + active.val('s', { s: 100 - ui.val('y') }, context); + break; + case 'v': + active.val('v', { v: 100 - ui.val('y') }, context); + break; + case 'r': + active.val('r', { r: 255 - ui.val('y') }, context); + break; + case 'g': + active.val('g', { g: 255 - ui.val('y') }, context); + break; + case 'b': + active.val('b', { b: 255 - ui.val('y') }, context); + break; + case 'a': + active.val('a', 255 - ui.val('y'), context); + break; + } + }, + positionMapAndBarArrows = // position map and bar arrows to match current color + function(ui, context) + { + if (context != colorMap) + { + switch (settings.color.mode) + { + case 'h': + var sv = ui.val('sv'); + colorMap.val('xy', { x: sv != null ? sv.s : 100, y: 100 - (sv != null ? sv.v : 100) }, context); + break; + case 's': + case 'a': + var hv = ui.val('hv'); + colorMap.val('xy', { x: hv && hv.h || 0, y: 100 - (hv != null ? hv.v : 100) }, context); + break; + case 'v': + var hs = ui.val('hs'); + colorMap.val('xy', { x: hs && hs.h || 0, y: 100 - (hs != null ? hs.s : 100) }, context); + break; + case 'r': + var bg = ui.val('bg'); + colorMap.val('xy', { x: bg && bg.b || 0, y: 255 - (bg && bg.g || 0) }, context); + break; + case 'g': + var br = ui.val('br'); + colorMap.val('xy', { x: br && br.b || 0, y: 255 - (br && br.r || 0) }, context); + break; + case 'b': + var rg = ui.val('rg'); + colorMap.val('xy', { x: rg && rg.r || 0, y: 255 - (rg && rg.g || 0) }, context); + break; + } + } + if (context != colorBar) + { + switch (settings.color.mode) + { + case 'h': + colorBar.val('y', 360 - (ui.val('h') || 0), context); + break; + case 's': + var s = ui.val('s'); + colorBar.val('y', 100 - (s != null ? s : 100), context); + break; + case 'v': + var v = ui.val('v'); + colorBar.val('y', 100 - (v != null ? v : 100), context); + break; + case 'r': + colorBar.val('y', 255 - (ui.val('r') || 0), context); + break; + case 'g': + colorBar.val('y', 255 - (ui.val('g') || 0), context); + break; + case 'b': + colorBar.val('y', 255 - (ui.val('b') || 0), context); + break; + case 'a': + var a = ui.val('a'); + colorBar.val('y', 255 - (a != null ? a : 255), context); + break; + } + } + }, + updatePreview = + function(ui) + { + try + { + var all = ui.val('all'); + activePreview.css({ backgroundColor: all && '#' + all.hex || 'transparent' }); + setAlpha.call($this, activePreview, all && Math.precision((all.a * 100) / 255, 4) || 0); + } + catch (e) { } + }, + updateMapVisuals = + function(ui) + { + switch (settings.color.mode) + { + case 'h': + setBG.call($this, colorMapDiv, new Color({ h: ui.val('h') || 0, s: 100, v: 100 }).val('hex')); + break; + case 's': + case 'a': + var s = ui.val('s'); + setAlpha.call($this, colorMapL2, 100 - (s != null ? s : 100)); + break; + case 'v': + var v = ui.val('v'); + setAlpha.call($this, colorMapL1, v != null ? v : 100); + break; + case 'r': + setAlpha.call($this, colorMapL2, Math.precision((ui.val('r') || 0) / 255 * 100, 4)); + break; + case 'g': + setAlpha.call($this, colorMapL2, Math.precision((ui.val('g') || 0) / 255 * 100, 4)); + break; + case 'b': + setAlpha.call($this, colorMapL2, Math.precision((ui.val('b') || 0) / 255 * 100)); + break; + } + var a = ui.val('a'); + setAlpha.call($this, colorMapL3, Math.precision(((255 - (a || 0)) * 100) / 255, 4)); + }, + updateBarVisuals = + function(ui) + { + switch (settings.color.mode) + { + case 'h': + var a = ui.val('a'); + setAlpha.call($this, colorBarL5, Math.precision(((255 - (a || 0)) * 100) / 255, 4)); + break; + case 's': + var hva = ui.val('hva'), + saturatedColor = new Color({ h: hva && hva.h || 0, s: 100, v: hva != null ? hva.v : 100 }); + setBG.call($this, colorBarDiv, saturatedColor.val('hex')); + setAlpha.call($this, colorBarL2, 100 - (hva != null ? hva.v : 100)); + setAlpha.call($this, colorBarL5, Math.precision(((255 - (hva && hva.a || 0)) * 100) / 255, 4)); + break; + case 'v': + var hsa = ui.val('hsa'), + valueColor = new Color({ h: hsa && hsa.h || 0, s: hsa != null ? hsa.s : 100, v: 100 }); + setBG.call($this, colorBarDiv, valueColor.val('hex')); + setAlpha.call($this, colorBarL5, Math.precision(((255 - (hsa && hsa.a || 0)) * 100) / 255, 4)); + break; + case 'r': + case 'g': + case 'b': + var hValue = 0, vValue = 0, rgba = ui.val('rgba'); + if (settings.color.mode == 'r') + { + hValue = rgba && rgba.b || 0; + vValue = rgba && rgba.g || 0; + } + else if (settings.color.mode == 'g') + { + hValue = rgba && rgba.b || 0; + vValue = rgba && rgba.r || 0; + } + else if (settings.color.mode == 'b') + { + hValue = rgba && rgba.r || 0; + vValue = rgba && rgba.g || 0; + } + var middle = vValue > hValue ? hValue : vValue; + setAlpha.call($this, colorBarL2, hValue > vValue ? Math.precision(((hValue - vValue) / (255 - vValue)) * 100, 4) : 0); + setAlpha.call($this, colorBarL3, vValue > hValue ? Math.precision(((vValue - hValue) / (255 - hValue)) * 100, 4) : 0); + setAlpha.call($this, colorBarL4, Math.precision((middle / 255) * 100, 4)); + setAlpha.call($this, colorBarL5, Math.precision(((255 - (rgba && rgba.a || 0)) * 100) / 255, 4)); + break; + case 'a': + var a = ui.val('a'); + setBG.call($this, colorBarDiv, ui.val('hex') || '000000'); + setAlpha.call($this, colorBarL5, a != null ? 0 : 100); + setAlpha.call($this, colorBarL6, a != null ? 100 : 0); + break; + } + }, + setBG = + function(el, c) + { + el.css({ backgroundColor: c && c.length == 6 && '#' + c || 'transparent' }); + }, + setImg = + function(img, src) + { + if (isLessThanIE7 && (src.indexOf('AlphaBar.png') != -1 || src.indexOf('Bars.png') != -1 || src.indexOf('Maps.png') != -1)) + { + img.attr('pngSrc', src); + img.css({ backgroundImage: 'none', filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + src + '\', sizingMethod=\'scale\')' }); + } + else img.css({ backgroundImage: 'url(\'' + src + '\')' }); + }, + setImgLoc = + function(img, y) + { + img.css({ top: y + 'px' }); + }, + setAlpha = + function(obj, alpha) + { + obj.css({ visibility: alpha > 0 ? 'visible' : 'hidden' }); + if (alpha > 0 && alpha < 100) + { + if (isLessThanIE7) + { + var src = obj.attr('pngSrc'); + if (src != null && (src.indexOf('AlphaBar.png') != -1 || src.indexOf('Bars.png') != -1 || src.indexOf('Maps.png') != -1)) + obj.css({ filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + src + '\', sizingMethod=\'scale\') progid:DXImageTransform.Microsoft.Alpha(opacity=' + alpha + ')' }); + else obj.css({ opacity: Math.precision(alpha / 100, 4) }); + } + else obj.css({ opacity: Math.precision(alpha / 100, 4) }); + } + else if (alpha == 0 || alpha == 100) + { + if (isLessThanIE7) + { + var src = obj.attr('pngSrc'); + if (src != null && (src.indexOf('AlphaBar.png') != -1 || src.indexOf('Bars.png') != -1 || src.indexOf('Maps.png') != -1)) + obj.css({ filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + src + '\', sizingMethod=\'scale\')' }); + else obj.css({ opacity: '' }); + } + else obj.css({ opacity: '' }); + } + }, + revertColor = // revert color to original color when opened + function() + { + color.active.val('ahex', color.current.val('ahex')); + }, + commitColor = // commit the color changes + function() + { + color.current.val('ahex', color.active.val('ahex')); + }, + radioClicked = + function(e) + { + $(this).parents('tbody:first').find('input:radio[value!="'+e.target.value+'"]').removeAttr('checked'); + setColorMode.call($this, e.target.value); + }, + currentClicked = + function() + { + revertColor.call($this); + }, + cancelClicked = + function() + { + revertColor.call($this); + settings.window.expandable && hide.call($this); + $.isFunction(cancelCallback) && cancelCallback.call($this, color.active, cancelButton); + }, + okClicked = + function() + { + commitColor.call($this); + settings.window.expandable && hide.call($this); + $.isFunction(commitCallback) && commitCallback.call($this, color.active, okButton); + }, + iconImageClicked = + function() + { + show.call($this); + }, + currentColorChanged = + function(ui, context) + { + var hex = ui.val('hex'); + currentPreview.css({ backgroundColor: hex && '#' + hex || 'transparent' }); + setAlpha.call($this, currentPreview, Math.precision(((ui.val('a') || 0) * 100) / 255, 4)); + }, + expandableColorChanged = + function(ui, context) + { + var hex = ui.val('hex'); + var va = ui.val('va'); + iconColor.css({ backgroundColor: hex && '#' + hex || 'transparent' }); + setAlpha.call($this, iconAlpha, Math.precision(((255 - (va && va.a || 0)) * 100) / 255, 4)); + if (settings.window.bindToInput&&settings.window.updateInputColor) + settings.window.input.css( + { + backgroundColor: hex && '#' + hex || 'transparent', + color: va == null || va.v > 75 ? '#000000' : '#ffffff' + }); + }, + moveBarMouseDown = + function(e) + { + var element = settings.window.element, // local copies for YUI compressor + page = settings.window.page; + elementStartX = parseInt(container.css('left')); + elementStartY = parseInt(container.css('top')); + pageStartX = e.pageX; + pageStartY = e.pageY; + // bind events to document to move window - we will unbind these on mouseup + $(document).bind('mousemove', documentMouseMove).bind('mouseup', documentMouseUp); + e.preventDefault(); // prevent attempted dragging of the column + }, + documentMouseMove = + function(e) + { + container.css({ left: elementStartX - (pageStartX - e.pageX) + 'px', top: elementStartY - (pageStartY - e.pageY) + 'px' }); + if (settings.window.expandable && !$.support.boxModel) container.prev().css({ left: container.css("left"), top: container.css("top") }); + e.stopPropagation(); + e.preventDefault(); + return false; + }, + documentMouseUp = + function(e) + { + $(document).unbind('mousemove', documentMouseMove).unbind('mouseup', documentMouseUp); + e.stopPropagation(); + e.preventDefault(); + return false; + }, + quickPickClicked = + function(e) + { + e.preventDefault(); + e.stopPropagation(); + color.active.val('ahex', $(this).attr('title') || null, e.target); + return false; + }, + commitCallback = $.isFunction($arguments[1]) && $arguments[1] || null, + liveCallback = $.isFunction($arguments[2]) && $arguments[2] || null, + cancelCallback = $.isFunction($arguments[3]) && $arguments[3] || null, + show = + function() + { + color.current.val('ahex', color.active.val('ahex')); + var attachIFrame = function() + { + if (!settings.window.expandable || $.support.boxModel) return; + var table = container.find('table:first'); + container.before('