blob: f0080910f6de8b7a35868985d61b83ba0da2cc29 [file] [log] [blame]
/*
Scripts to create interactive colour pickers in SVG using ECMA script
Copyright (C) <2006> <Andreas Neumann>
Version 1.0, 2006-10-26
neumann@karto.baug.ethz.ch
http://www.carto.net/
http://www.carto.net/neumann/
Credits:
* none so far
----
Documentation: http://www.carto.net/papers/svg/gui/colourPicker/
----
current version: 1.0
version history:
1.0 (2006-10-26)
initial version
-------
This ECMA script library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library (lesser_gpl.txt); if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
----
original document site: http://www.carto.net/papers/svg/gui/colourPicker/
Please contact the author in case you want to use code or ideas commercially.
If you use this code, please include this copyright header, the included full
LGPL 2.1 text and read the terms provided in the LGPL 2.1 license
(http://www.gnu.org/copyleft/lesser.txt)
-------------------------------
Please report bugs and send improvements to neumann@karto.baug.ethz.ch
If you use this control, please link to the original (http://www.carto.net/papers/svg/gui/colourPicker/)
somewhere in the source-code-comment or the "about" of your project and give credits, thanks!
*/
function colourPicker(id,parentNode,x,y,width,height,bgstyles,textstyles,sliderSymbId,satSliderVisible,valSliderVisible,alphaSliderVisible,colValTextVisible,fillVisible,strokeVisible,startHue,endHue,nrStopVals,fillStartColor,strokeStartColor,functionToCall) {
var nrArguments = 21;
var createColourPicker= true;
if (arguments.length == nrArguments) {
this.id = id; //the id of the colour picker
this.parentNode = parentNode; //the id or node reference of the parent group where the button can be appended
this.x = x; //upper left corner of colour picker
this.y = y; //upper left corner of colour picker
this.width = width; //width of colour picker
this.height = height; //height of colour picker
this.bgstyles = bgstyles; //an array of literals containing presentation attributes of the colourpicker background
this.textstyles = textstyles; //if shadowcolor = none than no shadow will be used
this.sliderSymbId = sliderSymbId; //id referencing the slider symbol to be used for the sliders
this.satSliderVisible = satSliderVisible; //possible values for visibility: true/false
this.valSliderVisible = valSliderVisible; //possible values for visibility: true/false
this.alphaSliderVisible = alphaSliderVisible; //possible values for visibility: true/false
this.colValTextVisible = colValTextVisible; //possible values for visibility: true/false
this.fillVisible = fillVisible; //possible values for visibility: true/false
this.strokeVisible = strokeVisible; //possible values for visibility: true/false
this.startHue = startHue; //start hue in degree (0 to 360)
this.endHue = endHue; //end hue in degree (0 to 360), end hue should be larger than start hue
this.nrStopVals = nrStopVals; //nr of stop vals in between, in addition to start and end
this.fillStartColors = fillStartColor.split(","); //string, rgba.format, f.e. 255,0,0,1
this.strokeStartColors = strokeStartColor.split(","); //string, rgba.format, f.e. 255,0,0,1
this.functionToCall = functionToCall; //a function or object to call, in case of an object, the method "getColor" is called; if you don't need any, than just say undefined
if (this.fillVisible) {
this.activeColourType = "fill";
}
else {
this.activeColourType = "stroke";
}
//now test if defs section is available
try {
this.svgdefs = document.getElementsByTagNameNS(svgNS,"defs").item(0);
}
catch (ex) {
createColourPicker = false;
alert("Error "+ex+", Could not find a <defs /> section in your svg-file!\nPlease add at least an empty <defs /> element!");
}
this.created = false;
}
else {
createColourPicker = false;
alert("Error in colourPicker ("+id+") constructor: wrong nr of arguments! You have to pass over "+nrArguments+" parameters.");
}
if (createColourPicker) {
this.createColourpicker();
}
else {
alert("Could not create colourPicker with id '"+id+"' due to errors in the constructor parameters");
}
}
//test if parent group exists
colourPicker.prototype.testParent = function() {
//test if of type object
var nodeValid = false;
this.parentGroup = document.createElementNS(svgNS,"g");
if (typeof(this.parentNode) == "object") {
if (this.parentNode.nodeName == "svg" || this.parentNode.nodeName == "g" || this.parentNode.nodeName == "svg:svg" || this.parentNode.nodeName == "svg:g") {
this.parentNode.appendChild(this.parentGroup);
nodeValid = true;
}
}
else if (typeof(this.parentNode) == "string") {
//first test if button group exists
if (!document.getElementById(this.parentNode)) {
this.parentGroup.setAttributeNS(null,"id",this.parentNode);
document.documentElement.appendChild(this.parentGroup);
nodeValid = true;
}
else {
document.getElementById(this.parentNode).appendChild(this.parentGroup);
nodeValid = true;
}
}
return nodeValid;
}
colourPicker.prototype.createColourpicker = function() {
var result = this.testParent();
if (result) {
this.nrSliders = 1; //these are to define the distribution along y-axis
this.nrRects = 0; //these are to define the distribution along x-axis
//create gradients in defs section
//hueGradient
var hueGradientDefs = document.createElementNS(svgNS,"linearGradient");
hueGradientDefs.setAttributeNS(null,"id",this.id+"_hueGradient");
var curHue = this.startHue;
var curPerc = 0;
var hueIncr = (this.endHue - this.startHue) / (this.nrStopVals - 1);
var percIncr = 100 / (this.nrStopVals - 1);
for (i = 0;i<this.nrStopVals;i++) {
if (curPerc > 100) {
curPerc = 100;
}
if (curHue > this.endHue) {
curHue = this.endHue;
}
var stopVal = document.createElementNS(svgNS,"stop");
stopVal.setAttributeNS(null,"offset",curPerc+"%");
myRgbArr = hsv2rgb(Math.round(curHue),1,1);
stopVal.setAttributeNS(null,"stop-color","rgb("+myRgbArr['red']+","+myRgbArr['green']+","+myRgbArr['blue']+")");
hueGradientDefs.appendChild(stopVal);
curPerc += percIncr;
curHue += hueIncr;
}
if (this.created) {
this.svgdefs.replaceChild(hueGradientDefs,document.getElementById(this.id+"_hueGradient"));
}
else {
this.svgdefs.appendChild(hueGradientDefs);
}
//generate satGradient if visible
if (this.satSliderVisible) {
var satGradientDefs = document.createElementNS(svgNS,"linearGradient");
satGradientDefs.setAttributeNS(null,"id",this.id+"_satGradient");
this.satStartGradient = document.createElementNS(svgNS,"stop");
this.satStartGradient.setAttributeNS(null,"offset","0%");
this.satStartGradient.setAttributeNS(null,"stop-color","rgb(255,255,255)");
satGradientDefs.appendChild(this.satStartGradient);
this.satEndGradient = document.createElementNS(svgNS,"stop");
this.satEndGradient.setAttributeNS(null,"offset","100%");
this.satEndGradient.setAttributeNS(null,"stop-color","rgb(255,0,0)");
satGradientDefs.appendChild(this.satEndGradient);
if (this.created) {
this.svgdefs.replaceChild(satGradientDefs,document.getElementById(this.id+"_satGradient"));
}
else {
this.svgdefs.appendChild(satGradientDefs);
}
this.nrSliders++;
}
//generate valGradient if visible
if (this.valSliderVisible) {
var valGradientDefs = document.createElementNS(svgNS,"linearGradient");
valGradientDefs.setAttributeNS(null,"id",this.id+"_valGradient");
this.valStartGradient = document.createElementNS(svgNS,"stop");
this.valStartGradient.setAttributeNS(null,"offset","0%");
this.valStartGradient.setAttributeNS(null,"stop-color","rgb(0,0,0)");
valGradientDefs.appendChild(this.valStartGradient);
this.valEndGradient = document.createElementNS(svgNS,"stop");
this.valEndGradient.setAttributeNS(null,"offset","100%");
this.valEndGradient.setAttributeNS(null,"stop-color","rgb(255,0,0)");
valGradientDefs.appendChild(this.valEndGradient);
if (this.created) {
this.svgdefs.replaceChild(valGradientDefs,document.getElementById(this.id+"_valGradient"));
}
else {
this.svgdefs.appendChild(valGradientDefs);
}
this.nrSliders++;
}
//generate opacityGradient if visible
if (this.alphaSliderVisible) {
var alphaGradientDefs = document.createElementNS(svgNS,"linearGradient");
alphaGradientDefs.setAttributeNS(null,"id",this.id+"_alphaGradient");
this.alphaStartGradient = document.createElementNS(svgNS,"stop");
this.alphaStartGradient.setAttributeNS(null,"offset","0%");
this.alphaStartGradient.setAttributeNS(null,"stop-color","rgb(255,0,0)");
this.alphaStartGradient.setAttributeNS(null,"stop-opacity",0);
alphaGradientDefs.appendChild(this.alphaStartGradient );
this.alphaEndGradient = document.createElementNS(svgNS,"stop");
this.alphaEndGradient.setAttributeNS(null,"offset","100%");
this.alphaEndGradient.setAttributeNS(null,"stop-color","rgb(255,0,0)");
this.alphaEndGradient.setAttributeNS(null,"stop-opacity",1);
alphaGradientDefs.appendChild(this.alphaEndGradient);
if (this.created) {
this.svgdefs.replaceChild(alphaGradientDefs,document.getElementById(this.id+"_alphaGradient"));
}
else {
this.svgdefs.appendChild(alphaGradientDefs);
}
this.nrSliders++;
}
//create bg rectangle
var bgRect = document.createElementNS(svgNS,"rect");
bgRect.setAttributeNS(null,"x",this.x);
bgRect.setAttributeNS(null,"y",this.y);
bgRect.setAttributeNS(null,"width",this.width);
bgRect.setAttributeNS(null,"height",this.height);
for (var attrib in this.bgstyles) {
bgRect.setAttributeNS(null,attrib,this.bgstyles[attrib]);
}
this.parentGroup.appendChild(bgRect);
//now createSliders
var invisSliderLineWidth = this.width * 0.05;
var slidRectHeight = invisSliderLineWidth * 0.5;
var sliderStyles = {"stroke":"none","fill":"none"};
var yNew = this.y + this.height * 0.13;
var yNewInc = this.height * 0.8 / this.nrSliders;
//create hue slider
//first create rectangle behind slider to hold gradient
this.rectHue = document.createElementNS(svgNS,"rect");
this.rectHue.setAttributeNS(null,"x",(this.x + this.width * 0.04));
this.rectHue.setAttributeNS(null,"y",(yNew - slidRectHeight * 0.5));
this.rectHue.setAttributeNS(null,"width",(this.x + this.width * 0.7)-(this.x + this.width * 0.04));
this.rectHue.setAttributeNS(null,"height",slidRectHeight);
this.rectHue.setAttributeNS(null,"fill","url(#"+this.id+"_hueGradient)");
this.parentGroup.appendChild(this.rectHue);
this.slidHue = new slider("hueSlider_"+this.id,this.parentGroup,this.x + this.width * 0.04,yNew,this.startHue,this.x + this.width * 0.7,yNew,this.endHue,0,sliderStyles,invisSliderLineWidth,this.sliderSymbId,this,true);
var hueText = document.createElementNS(svgNS,"text");
hueText.setAttributeNS(null,"x",this.slidHue.x2 + this.width * 0.02);
hueText.setAttributeNS(null,"y",this.slidHue.y2 + this.width * 0.015);
hueText.setAttributeNS(null,"pointer-events","none");
for (var attrib in this.textstyles) {
hueText.setAttributeNS(null,attrib,this.textstyles[attrib]);
}
var hueTextNode = document.createTextNode("Hue ("+this.startHue+String.fromCharCode(176)+"-"+this.endHue+String.fromCharCode(176)+")");
hueText.appendChild(hueTextNode);
this.parentGroup.appendChild(hueText);
//create rects to show colour values for fill and stroke
if (this.strokeVisible) {
this.strokeRect = document.createElementNS(svgNS,"rect");
if (this.fillVisible) {
this.strokeRect.setAttributeNS(null,"x",this.slidHue.x1 + this.width * 0.1);
this.strokeRect.setAttributeNS(null,"y",this.y + this.height * 0.45);
}
else {
this.strokeRect.setAttributeNS(null,"x",this.slidHue.x1);
this.strokeRect.setAttributeNS(null,"y",this.y + this.height * 0.3);
}
this.strokeRect.setAttributeNS(null,"width",this.width * 0.15);
this.strokeRect.setAttributeNS(null,"height",this.height * 0.3);
this.strokeRect.setAttributeNS(null,"fill","none");
this.strokeRect.setAttributeNS(null,"stroke","rgb("+this.strokeStartColors[0]+","+this.strokeStartColors[1]+","+this.strokeStartColors[2]+")");
this.strokeRect.setAttributeNS(null,"stroke-width",invisSliderLineWidth * 0.5);
this.strokeRect.setAttributeNS(null,"stroke-opacity",this.strokeStartColors[3]);
this.strokeRect.setAttributeNS(null,"id",this.id+"_strokeColour");
this.strokeRect.setAttributeNS(null,"pointer-events","all");
this.strokeRect.addEventListener("click",this,false);
this.parentGroup.appendChild(this.strokeRect);
this.nrRects++;
}
if (this.fillVisible) {
this.fillRect = document.createElementNS(svgNS,"rect");
this.fillRect.setAttributeNS(null,"x",this.slidHue.x1);
this.fillRect.setAttributeNS(null,"y",this.y + this.height * 0.3);
this.fillRect.setAttributeNS(null,"width",this.width * 0.15);
this.fillRect.setAttributeNS(null,"height",this.height * 0.3);
this.fillRect.setAttributeNS(null,"fill","rgb("+this.fillStartColors[0]+","+this.fillStartColors[1]+","+this.fillStartColors[2]+")");
this.fillRect.setAttributeNS(null,"fill-opacity",this.fillStartColors[3]);
this.fillRect.setAttributeNS(null,"id",this.id+"_fillColour");
this.fillRect.addEventListener("click",this,false);
if (this.activeColourType == "stroke") {
this.parentGroup.insertBefore(this.fillRect,this.strokeRect);
}
else {
this.parentGroup.appendChild(this.fillRect);
}
this.nrRects++;
}
switch(this.nrRects) {
case 0:
slidLeft = this.slidHue.x1;
break;
case 1:
slidLeft = this.slidHue.x1 + this.width * 0.2;
break;
default:
slidLeft = this.slidHue.x1 + this.width * 0.3;
break;
}
yNew = yNew + yNewInc;
if (this.satSliderVisible) {
//create rectangle to hold sat gradient
this.rectSat = document.createElementNS(svgNS,"rect");
this.rectSat.setAttributeNS(null,"x",slidLeft);
this.rectSat.setAttributeNS(null,"y",(yNew - slidRectHeight * 0.5));
this.rectSat.setAttributeNS(null,"width",(this.x + this.width * 0.7)-slidLeft);
this.rectSat.setAttributeNS(null,"height",slidRectHeight);
this.rectSat.setAttributeNS(null,"fill","url(#"+this.id+"_satGradient)");
this.parentGroup.appendChild(this.rectSat);
//create sat slider
this.slidSat = new slider("satSlider_"+this.id,this.parentGroup,slidLeft,yNew,0,this.x + this.width * 0.7,yNew,100,100,sliderStyles,invisSliderLineWidth,this.sliderSymbId,this,true);
var satText = document.createElementNS(svgNS,"text");
for (var attrib in this.textstyles) {
satText.setAttributeNS(null,attrib,this.textstyles[attrib]);
}
satText.setAttributeNS(null,"pointer-events","none");
satText.setAttributeNS(null,"x",this.slidSat.x2 + this.width * 0.02);
satText.setAttributeNS(null,"y",this.slidSat.y2 + this.width * 0.015);
var satTextNode = document.createTextNode("Saturation (%)");
satText.appendChild(satTextNode);
this.parentGroup.appendChild(satText);
yNew = yNew + yNewInc;
}
if (this.valSliderVisible) {
//create rectangle to hold val gradient
this.rectVal = document.createElementNS(svgNS,"rect");
this.rectVal.setAttributeNS(null,"x",slidLeft);
this.rectVal.setAttributeNS(null,"y",(yNew - slidRectHeight * 0.5));
this.rectVal.setAttributeNS(null,"width",(this.x + this.width * 0.7)-slidLeft);
this.rectVal.setAttributeNS(null,"height",slidRectHeight);
this.rectVal.setAttributeNS(null,"fill","url(#"+this.id+"_valGradient)");
this.parentGroup.appendChild(this.rectVal);
//create val slider
this.slidVal = new slider("valSlider_"+this.id,this.parentGroup,slidLeft,yNew,0,this.x + this.width * 0.7,yNew,100,100,sliderStyles,invisSliderLineWidth,this.sliderSymbId,this,true);
var valText = document.createElementNS(svgNS,"text");
for (var attrib in this.textstyles) {
valText.setAttributeNS(null,attrib,this.textstyles[attrib]);
}
valText.setAttributeNS(null,"pointer-events","none");
valText.setAttributeNS(null,"x",this.slidVal.x2 + this.width * 0.02);
valText.setAttributeNS(null,"y",this.slidVal.y2 + this.width * 0.015);
var valTextNode = document.createTextNode("Value (%)");
valText.appendChild(valTextNode);
this.parentGroup.appendChild(valText);
yNew = yNew + yNewInc;
}
if (this.alphaSliderVisible) {
//create rectangle to hold alpha gradient
this.rectAlpha = document.createElementNS(svgNS,"rect");
this.rectAlpha.setAttributeNS(null,"x",slidLeft);
this.rectAlpha.setAttributeNS(null,"y",(yNew - slidRectHeight * 0.5));
this.rectAlpha.setAttributeNS(null,"width",(this.x + this.width * 0.7)-slidLeft);
this.rectAlpha.setAttributeNS(null,"height",slidRectHeight);
this.rectAlpha.setAttributeNS(null,"fill","url(#"+this.id+"_alphaGradient)");
this.parentGroup.appendChild(this.rectAlpha);
//create val slider
this.slidAlpha = new slider("alphaSlider_"+this.id,this.parentGroup,slidLeft,yNew,0,this.x + this.width * 0.7,yNew,100,100,sliderStyles,invisSliderLineWidth,this.sliderSymbId,this,true);
var alphaText = document.createElementNS(svgNS,"text");
for (var attrib in this.textstyles) {
alphaText.setAttributeNS(null,attrib,this.textstyles[attrib]);
}
alphaText.setAttributeNS(null,"pointer-events","none");
alphaText.setAttributeNS(null,"x",this.slidAlpha.x2 + this.width * 0.02);
alphaText.setAttributeNS(null,"y",this.slidAlpha.y2 + this.width * 0.015);
var alphaTextNode = document.createTextNode("Opacity (%)");
alphaText.appendChild(alphaTextNode);
this.parentGroup.appendChild(alphaText);
}
//create text to hold rgb/hsv values
if (this.colValTextVisible) {
this.colValText = document.createElementNS(svgNS,"text");
for (var attrib in this.textstyles) {
this.colValText.setAttributeNS(null,attrib,this.textstyles[attrib]);
}
this.colValText.setAttributeNS(null,"x",this.slidHue.x1);
this.colValText.setAttributeNS(null,"y",this.y + this.height * 0.95);
var textNode = document.createTextNode("RGB: 255,0,0; HSV: 0,100,100");
this.colValText.appendChild(textNode);
this.parentGroup.appendChild(this.colValText);
}
fillHSVvar = rgb2hsv(parseInt(this.fillStartColors[0]),parseInt(this.fillStartColors[1]),parseInt(this.fillStartColors[2]));
strokeHSVvar = rgb2hsv(parseInt(this.strokeStartColors[0]),parseInt(this.strokeStartColors[1]),parseInt(this.strokeStartColors[2]));
this.hue = new Array();
this.hue["fill"] = fillHSVvar["hue"];
this.hue["stroke"] = strokeHSVvar["hue"];
this.sat = new Array();
this.sat["fill"] = fillHSVvar["sat"];
this.sat["stroke"] = strokeHSVvar["sat"];
this.val = new Array();
this.val["fill"] = fillHSVvar["val"];
this.val["stroke"] = strokeHSVvar["val"];
this.alpha = new Array();
this.alpha["fill"] = parseFloat(this.fillStartColors[3]);
this.alpha["stroke"] = parseFloat(this.strokeStartColors[3]);
this.rgbArr = new Array();
this.rgbArr["fill"] = hsv2rgb(this.hue["fill"],this.sat["fill"],this.val["fill"]);
this.rgbArr["stroke"] = hsv2rgb(this.hue["stroke"],this.sat["stroke"],this.val["stroke"]);
this.setRGBAColour(this.activeColourType,this.rgbArr[this.activeColourType]["red"],this.rgbArr[this.activeColourType]["green"],this.rgbArr[this.activeColourType]["blue"],this.alpha[this.activeColourType],false);
//indicate that it was created once
this.created = true;
}
else {
alert("could not create or reference 'parentNode' of button with id '"+this.id+"'");
}
}
colourPicker.prototype.handleEvent = function(evt) {
var el = evt.target;
if (evt.type == "click") {
var id = el.getAttributeNS(null,"id");
if (id == this.id+"_fillColour") {
this.activeColourType = "fill";
if (this.strokeVisible) {
this.parentGroup.insertBefore(this.strokeRect,this.fillRect);
}
}
if (id == this.id+"_strokeColour") {
this.activeColourType = "stroke";
if (this.fillVisible) {
this.parentGroup.insertBefore(this.fillRect,this.strokeRect);
}
}
if (id == this.id+"_fillColour" || id == this.id+"_strokeColour") {
this.setRGBAColour(this.activeColourType,this.rgbArr[this.activeColourType]["red"],this.rgbArr[this.activeColourType]["green"],this.rgbArr[this.activeColourType]["blue"],this.alpha[this.activeColourType],false);
}
}
}
//this method should be used from external
colourPicker.prototype.getValues = function() {
var result = {"fill":{"red":this.rgbArr["fill"]["red"],"green":this.rgbArr["fill"]["green"],"blue":this.rgbArr["fill"]["blue"],"alpha":this.alpha["fill"],"hue":this.hue["fill"],"sat":this.sat["fill"],"val":this.val["fill"]},"stroke":{"red":this.rgbArr["stroke"]["red"],"green":this.rgbArr["stroke"]["green"],"blue":this.rgbArr["stroke"]["blue"],"alpha":this.alpha["stroke"],"hue":this.hue["stroke"],"sat":this.sat["stroke"],"val":this.val["stroke"]}};
return result;
}
//this method is used by this object but may be also used from external
colourPicker.prototype.setRGBAColour = function(colourType,red,green,blue,alpha,fireFunction) {
//colourType = fill|stroke
hsvArr = rgb2hsv(red,green,blue);
this.hue[colourType] = hsvArr["hue"];
this.sat[colourType] = hsvArr["sat"];
this.val[colourType] = hsvArr["val"];
this.alpha[colourType] = alpha;
this.rgbArr[colourType]["red"] = red;
this.rgbArr[colourType]["green"] = green;
this.rgbArr[colourType]["blue"] = blue;
if (colourType == this.activeColourType) {
this.slidHue.setValue(this.hue[colourType]);
if (this.satSliderVisible) {
this.slidSat.setValue(Math.round(this.sat[colourType] * 100));
rgbSatEnd = hsv2rgb(this.hue[this.activeColourType],1,this.val[this.activeColourType]);
rgbSatStart = hsv2rgb(this.hue[this.activeColourType],0,this.val[this.activeColourType]);
this.satStartGradient.setAttributeNS(null,"stop-color","rgb("+rgbSatStart["red"]+","+rgbSatStart["green"]+","+rgbSatStart["blue"]+")");
this.satEndGradient.setAttributeNS(null,"stop-color","rgb("+rgbSatEnd["red"]+","+rgbSatEnd["green"]+","+rgbSatEnd["blue"]+")");
if (myMapApp.navigator == "Batik") {
this.rectSat.removeAttributeNS(null,"fill");
this.rectSat.setAttributeNS(null,"fill","url(#"+this.id+"_satGradient)");
}
}
if (this.valSliderVisible) {
this.slidVal.setValue(Math.round(this.val[colourType] * 100));
rgbValEnd = hsv2rgb(this.hue[this.activeColourType],this.sat[this.activeColourType],1);
rgbValStart = hsv2rgb(this.hue[this.activeColourType],this.sat[this.activeColourType],0);
this.valStartGradient.setAttributeNS(null,"stop-color","rgb("+rgbValStart["red"]+","+rgbValStart["green"]+","+rgbValStart["blue"]+")");
this.valEndGradient.setAttributeNS(null,"stop-color","rgb("+rgbValEnd["red"]+","+rgbValEnd["green"]+","+rgbValEnd["blue"]+")");
if (myMapApp.navigator == "Batik") {
this.rectVal.removeAttributeNS(null,"fill");
this.rectVal.setAttributeNS(null,"fill","url(#"+this.id+"_valGradient)");
}
}
if (this.alphaSliderVisible) {
this.slidAlpha.setValue(Math.round(this.alpha[colourType] * 100));
rgbAlpha = hsv2rgb(this.hue[this.activeColourType],this.sat[this.activeColourType],this.val[this.activeColourType]);
this.alphaStartGradient.setAttributeNS(null,"stop-color","rgb("+rgbAlpha["red"]+","+rgbAlpha["green"]+","+rgbAlpha["blue"]+")");
this.alphaEndGradient.setAttributeNS(null,"stop-color","rgb("+rgbAlpha["red"]+","+rgbAlpha["green"]+","+rgbAlpha["blue"]+")");
if (myMapApp.navigator == "Batik") {
this.rectAlpha.removeAttributeNS(null,"fill");
this.rectAlpha.setAttributeNS(null,"fill","url(#"+this.id+"_alphaGradient)");
}
}
if (this.colValTextVisible) {
this.colValText.firstChild.nodeValue = "RGBA: "+this.rgbArr[this.activeColourType]["red"]+","+this.rgbArr[this.activeColourType]["green"]+","+this.rgbArr[this.activeColourType]["blue"]+","+Math.round(this.alpha[this.activeColourType] * 100) +"; HSVA: "+this.hue[this.activeColourType]+","+Math.round(this.sat[this.activeColourType] * 100)+","+Math.round(this.val[this.activeColourType] * 100)+","+Math.round(this.alpha[this.activeColourType] * 100);
}
}
//set values in fill and stroke rectangles
if (colourType == "stroke") {
this.strokeRect.setAttributeNS(null,"stroke","rgb("+red+","+green+","+blue+")");
this.strokeRect.setAttributeNS(null,"stroke-opacity",alpha);
}
if (colourType == "fill") {
this.fillRect.setAttributeNS(null,"fill","rgb("+red+","+green+","+blue+")");
this.fillRect.setAttributeNS(null,"fill-opacity",alpha);
}
if (fireFunction) {
this.fireFunction();
}
}
//this is a helper method to be used by this object only
colourPicker.prototype.getSliderVal = function(changeType,sliderId,slidValue) {
//get all colour values from sliders
if (sliderId == "hueSlider_"+this.id) {
this.hue[this.activeColourType] = Math.round(this.slidHue.value);
}
if (sliderId == "satSlider_"+this.id && this.satSliderVisible) {
this.sat[this.activeColourType] = Math.round(this.slidSat.value) / 100;
}
if (sliderId == "valSlider_"+this.id && this.valSliderVisible) {
this.val[this.activeColourType] = Math.round(this.slidVal.value) / 100;
}
if (sliderId == "alphaSlider_"+this.id && this.alphaSliderVisible) {
this.alpha[this.activeColourType] = Math.round(this.slidAlpha.value) / 100;
}
this.rgbArr[this.activeColourType] = hsv2rgb(this.hue[this.activeColourType],this.sat[this.activeColourType],this.val[this.activeColourType]);
if (this.fillVisible && this.activeColourType == "fill") {
this.fillRect.setAttributeNS(null,"fill","rgb("+this.rgbArr["fill"]["red"]+","+this.rgbArr["fill"]["green"]+","+this.rgbArr["fill"]["blue"]+")");
this.fillRect.setAttributeNS(null,"fill-opacity",this.alpha[this.activeColourType]);
}
if (this.strokeVisible && this.activeColourType == "stroke") {
this.strokeRect.setAttributeNS(null,"stroke","rgb("+this.rgbArr["stroke"]["red"]+","+this.rgbArr["stroke"]["green"]+","+this.rgbArr["stroke"]["blue"]+")");
this.strokeRect.setAttributeNS(null,"stroke-opacity",this.alpha[this.activeColourType]);
}
if (this.colValTextVisible) {
this.colValText.firstChild.nodeValue = "RGBA: "+this.rgbArr[this.activeColourType]["red"]+","+this.rgbArr[this.activeColourType]["green"]+","+this.rgbArr[this.activeColourType]["blue"]+","+Math.round(this.alpha[this.activeColourType] * 100) +"; HSVA: "+this.hue[this.activeColourType]+","+Math.round(this.sat[this.activeColourType] * 100)+","+Math.round(this.val[this.activeColourType] * 100)+","+Math.round(this.alpha[this.activeColourType] * 100);
}
if (this.satSliderVisible) {
rgbSatEnd = hsv2rgb(this.hue[this.activeColourType],1,this.val[this.activeColourType]);
rgbSatStart = hsv2rgb(this.hue[this.activeColourType],0,this.val[this.activeColourType]);
this.satStartGradient.setAttributeNS(null,"stop-color","rgb("+rgbSatStart["red"]+","+rgbSatStart["green"]+","+rgbSatStart["blue"]+")");
this.satEndGradient.setAttributeNS(null,"stop-color","rgb("+rgbSatEnd["red"]+","+rgbSatEnd["green"]+","+rgbSatEnd["blue"]+")");
if (myMapApp.navigator == "Batik") {
this.rectSat.removeAttributeNS(null,"fill");
this.rectSat.setAttributeNS(null,"fill","url(#"+this.id+"_satGradient)");
}
}
if (this.valSliderVisible) {
rgbValEnd = hsv2rgb(this.hue[this.activeColourType],this.sat[this.activeColourType],1);
rgbValStart = hsv2rgb(this.hue[this.activeColourType],this.sat[this.activeColourType],0);
this.valStartGradient.setAttributeNS(null,"stop-color","rgb("+rgbValStart["red"]+","+rgbValStart["green"]+","+rgbValStart["blue"]+")");
this.valEndGradient.setAttributeNS(null,"stop-color","rgb("+rgbValEnd["red"]+","+rgbValEnd["green"]+","+rgbValEnd["blue"]+")");
if (myMapApp.navigator == "Batik") {
this.rectVal.removeAttributeNS(null,"fill");
this.rectVal.setAttributeNS(null,"fill","url(#"+this.id+"_valGradient)");
}
}
if (this.alphaSliderVisible) {
rgbAlpha = hsv2rgb(this.hue[this.activeColourType],this.sat[this.activeColourType],this.val[this.activeColourType]);
this.alphaStartGradient.setAttributeNS(null,"stop-color","rgb("+rgbAlpha["red"]+","+rgbAlpha["green"]+","+rgbAlpha["blue"]+")");
this.alphaEndGradient.setAttributeNS(null,"stop-color","rgb("+rgbAlpha["red"]+","+rgbAlpha["green"]+","+rgbAlpha["blue"]+")");
if (myMapApp.navigator == "Batik") {
this.rectAlpha.removeAttributeNS(null,"fill");
this.rectAlpha.setAttributeNS(null,"fill","url(#"+this.id+"_alphaGradient)");
}
}
this.fireFunction();
}
//this hides a colourPicker
colourPicker.prototype.hide = function() {
this.parentGroup.setAttributeNS(null,"display","none");
}
//this method shows a colourPicker once it was hidden
colourPicker.prototype.show = function() {
this.parentGroup.setAttributeNS(null,"display","inherit");
}
//this is an internal method
colourPicker.prototype.fireFunction = function() {
var values = this.getValues();
if (typeof(this.functionToCall) == "function") {
this.functionToCall(this.id,values);
}
if (typeof(this.functionToCall) == "object") {
this.functionToCall.colourChanged(this.id,values);
}
if (typeof(this.functionToCall) == undefined) {
return;
}
}
//this method is for internal use only
colourPicker.prototype.rebuild = function() {
this.fillStartColors = new Array(this.rgbArr["fill"]["red"],this.rgbArr["fill"]["green"],this.rgbArr["fill"]["blue"],this.alpha["fill"]);
this.strokeStartColors = new Array(this.rgbArr["stroke"]["red"],this.rgbArr["stroke"]["green"],this.rgbArr["stroke"]["blue"],this.alpha["stroke"]);
this.parentGroup.parentNode.removeChild(this.parentGroup);
this.createColourpicker();
}
//this method allows to move the colourPicker to a different position
colourPicker.prototype.moveTo = function(x,y) {
this.x = x;
this.y = y;
this.rebuild();
}
//this method changes the size of the colourPicker, you should make sure that the width and height values aren't too small, otherwise the colourPicker would look a bit strange ...
colourPicker.prototype.resize = function(width,height) {
this.width = width;
this.height = height;
this.rebuild();
}