ColorPicker.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893
  1. // Licensed Materials - Property of IBM
  2. //
  3. // IBM Cognos Products: pps
  4. //
  5. // (C) Copyright IBM Corp. 2005, 2017
  6. //
  7. // US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  8. var currentColorPicker = null;
  9. var colorPickerDOM = null;
  10. var patternPickerDOM = null;
  11. var ownerControl = null;
  12. var currentColor = "";
  13. var currentlySelectedColorCell = null;
  14. var isIE = navigator.appVersion.indexOf("MSIE")>0;
  15. var notifyColorChange = "";
  16. var MAX_RGB = 255;
  17. var MAX_HSL = 240;
  18. function RGB(red, green, blue) {
  19. if (red < 0)
  20. this.red = 0;
  21. else if (red > MAX_RGB)
  22. this.red = MAX_RGB;
  23. else
  24. this.red = red;
  25. if (green < 0)
  26. this.green = 0;
  27. else if (green > MAX_RGB)
  28. this.green = MAX_RGB;
  29. else
  30. this.green = green;
  31. if (blue < 0)
  32. this.blue = 0;
  33. else if (blue > MAX_RGB)
  34. this.blue = MAX_RGB;
  35. else
  36. this.blue = blue;
  37. }
  38. function HSL(hue, sat, lum) {
  39. if (hue < 0)
  40. this.hue = 0;
  41. else if (hue > MAX_HSL)
  42. this.hue = MAX_HSL;
  43. else
  44. this.hue = hue;
  45. if (sat < 0)
  46. this.sat = 0;
  47. else if (sat > MAX_HSL)
  48. this.sat = MAX_HSL;
  49. else
  50. this.sat = sat;
  51. if (lum < 0)
  52. this.lum = 0;
  53. else if (lum > MAX_HSL)
  54. this.lum = MAX_HSL;
  55. else
  56. this.lum = lum;
  57. }
  58. function displayColorPicker(event) {
  59. var eventM = new eventManager(event);
  60. eventM.cancelBubble();
  61. displayColorPickerObj(eventM.getSrc().parentNode.parentNode.parentNode.parentNode);
  62. }
  63. function displayColorPickerObj(obj) {
  64. //Create the dom for the color Picker.
  65. if (currentColorPicker != null)
  66. return;
  67. ownerControl = obj; //Get the table
  68. if (colorPickerDOM == null) {
  69. currentColorPicker = document.createElement("DIV");
  70. currentColorPicker.className = "ColorPickerDiv";
  71. var outerTable = document.createElement("TABLE");
  72. if (isIE){
  73. outerTable.setAttribute("cellpadding",8);
  74. outerTable.setAttribute("cellspacing",0);
  75. }
  76. var outerTableBody = document.createElement("TBODY");
  77. if (outerTableBody.addEventListener)
  78. outerTableBody.addEventListener('click',stopProp,false);
  79. else
  80. outerTableBody.onclick = function() {stopProp();}
  81. var row = document.createElement("TR");
  82. var cell = document.createElement("TD");
  83. cell.className = "colorPickerPreviewCell";
  84. var center = document.createElement("CENTER");
  85. var div = document.createElement("DIV");
  86. div.className = "colorPickerPreview";
  87. div.id = "colorPickerPreviewDiv";
  88. center.appendChild(div);
  89. cell.appendChild(center);
  90. row.appendChild(cell);
  91. cell = document.createElement("TD");
  92. cell.className = "colorPickerColorTableContainer";
  93. div = document.createElement("DIV");
  94. div.className = "colorPickerColorTable";
  95. createWebSafeColorPicker(div);
  96. cell.appendChild(div);
  97. row.appendChild(cell);
  98. outerTableBody.appendChild(row);
  99. row = document.createElement("TR");
  100. cell = document.createElement("TD");
  101. row.appendChild(cell);
  102. cell = document.createElement("TD");
  103. var innerTable = document.createElement("TABLE");
  104. if (isIE){
  105. innerTable.setAttribute("cellpadding",8);
  106. innerTable.setAttribute("cellspacing",0);
  107. }
  108. var innerTableBody = document.createElement("TBODY");
  109. var innerrow = document.createElement("TR");
  110. var innercell = document.createElement("TD");
  111. innercell.className = "colorPickerLabel";
  112. innercell.appendChild(document.createTextNode(strColorPickerRed + " "));
  113. innerrow.appendChild(innercell);
  114. innercell = document.createElement("TD");
  115. var textBox = document.createElement("INPUT");
  116. textBox.type = "text";
  117. textBox.size = "5";
  118. textBox.id = "colorPickerRed"
  119. textBox.onchange = function() { onRGBChange(); };
  120. textBox.onkeyup = function() { onRGBChange(); };
  121. innercell.appendChild(textBox);
  122. innerrow.appendChild(innercell);
  123. innercell = document.createElement("TD");
  124. innercell.className = "colorPickerLabel";
  125. innercell.appendChild(document.createTextNode(strColorPickerHue + " "));
  126. innerrow.appendChild(innercell);
  127. innercell = document.createElement("TD");
  128. textBox = document.createElement("INPUT");
  129. textBox.type = "text";
  130. textBox.size = "5";
  131. textBox.id = "colorPickerHue"
  132. textBox.onchange = function() { onHSLChange(); };
  133. textBox.onkeyup = function() { onHSLChange(); };
  134. innercell.appendChild(textBox);
  135. innerrow.appendChild(innercell);
  136. innerTableBody.appendChild(innerrow);
  137. innerrow = document.createElement("TR");
  138. innercell = document.createElement("TD");
  139. innercell.className = "colorPickerLabel";
  140. innercell.appendChild(document.createTextNode(strColorPickerGreen + " "));
  141. innerrow.appendChild(innercell);
  142. innercell = document.createElement("TD");
  143. textBox = document.createElement("INPUT");
  144. textBox.type = "text";
  145. textBox.size = "5";
  146. textBox.id = "colorPickerGreen"
  147. textBox.onchange = function() { onRGBChange(); };
  148. textBox.onkeyup = function() { onRGBChange(); };
  149. innercell.appendChild(textBox);
  150. innerrow.appendChild(innercell);
  151. innercell = document.createElement("TD");
  152. innercell.className = "colorPickerLabel";
  153. innercell.appendChild(document.createTextNode(strColorPickerSat + " "));
  154. innerrow.appendChild(innercell);
  155. innercell = document.createElement("TD");
  156. textBox = document.createElement("INPUT");
  157. textBox.type = "text";
  158. textBox.size = "5";
  159. textBox.id = "colorPickerSat"
  160. textBox.onchange = function() { onHSLChange(); };
  161. textBox.onkeyup = function() { onHSLChange(); };
  162. innercell.appendChild(textBox);
  163. innerrow.appendChild(innercell);
  164. innerTableBody.appendChild(innerrow);
  165. innerrow = document.createElement("TR");
  166. innercell = document.createElement("TD");
  167. innercell.className = "colorPickerLabel";
  168. innercell.appendChild(document.createTextNode(strColorPickerBlue + " "));
  169. innerrow.appendChild(innercell);
  170. innercell = document.createElement("TD");
  171. textBox = document.createElement("INPUT");
  172. textBox.type = "text";
  173. textBox.size = "5";
  174. textBox.id = "colorPickerBlue"
  175. textBox.onchange = function() { onRGBChange(); };
  176. textBox.onkeyup = function() { onRGBChange(); };
  177. innercell.appendChild(textBox);
  178. innerrow.appendChild(innercell);
  179. innercell = document.createElement("TD");
  180. innercell.className = "colorPickerLabel";
  181. innercell.appendChild(document.createTextNode(strColorPickerLum + " "));
  182. innerrow.appendChild(innercell);
  183. innercell = document.createElement("TD");
  184. textBox = document.createElement("INPUT");
  185. textBox.type = "text";
  186. textBox.size = "5";
  187. textBox.id = "colorPickerLum"
  188. textBox.onchange = function() { onHSLChange(); };
  189. textBox.onkeyup = function() { onHSLChange(); };
  190. innercell.appendChild(textBox);
  191. innerrow.appendChild(innercell);
  192. innerTableBody.appendChild(innerrow);
  193. innerTable.appendChild(innerTableBody);
  194. cell.appendChild(innerTable);
  195. row.appendChild(cell);
  196. outerTableBody.appendChild(row);
  197. row = document.createElement("TR");
  198. cell = document.createElement("TD");
  199. cell.colspan = 2;
  200. cell.className = "colorPickerButtonArea";
  201. var span = document.createElement("SPAN");
  202. span.className = "colorPickerButton";
  203. span.appendChild(document.createTextNode(strColorPickerOK));
  204. span.onclick = function() { setOwnerControlColor();hideColorPicker();eval(notifyColorChange); }
  205. span.onmouseover = new Function("this.className = 'colorPickerButtonRollover';");
  206. span.onmouseout = new Function("this.className = 'colorPickerButton';");
  207. cell.appendChild(span);
  208. cell.appendChild(document.createTextNode(" "));
  209. span = document.createElement("SPAN");
  210. span.className = "colorPickerButton";
  211. span.appendChild(document.createTextNode(strColorPickerCancel));
  212. span.onclick = function() { hideColorPicker(); }
  213. span.onmouseover = new Function("this.className = 'colorPickerButtonRollover';");
  214. span.onmouseout = new Function("this.className = 'colorPickerButton';");
  215. cell.appendChild(span);
  216. row.appendChild(cell);
  217. outerTableBody.appendChild(row);
  218. outerTable.appendChild(outerTableBody);
  219. currentColorPicker.appendChild(outerTable);
  220. document.body.appendChild(currentColorPicker);
  221. colorPickerDOM = currentColorPicker;
  222. } else {
  223. currentColorPicker = colorPickerDOM;
  224. currentColorPicker.style.display = "";
  225. }
  226. positionColorPicker();
  227. initializeColorPicker();
  228. }
  229. function createWebSafeColorPicker(parent) {
  230. //This function creates a table of the 216 web safe colors.
  231. var table = document.createElement("TABLE");
  232. if (isIE){
  233. table.setAttribute("cellpadding",2);
  234. table.setAttribute("cellspacing",2);
  235. }
  236. table.setAttribute("border",0);
  237. var tableBody = document.createElement("TBODY");
  238. tableBody.id = "ColorPickerWebSafePaletteTable";
  239. var row;
  240. var cell;
  241. var color;
  242. for (var i = 0; i < 12; i++) {
  243. row = document.createElement("TR");
  244. for (var j = 0; j < 18; j++) {
  245. cell = document.createElement("TD");
  246. cell.className = "colorPickerWebSafeColorCell";
  247. color = getHexColor(parseInt(j % 6) * 51, parseInt(i % 6) * 51, (parseInt(j / 6) + 3 * parseInt(i / 6)) * 51);
  248. cell.style.backgroundColor = "#" + color;
  249. cell.onclick = new Function ( "setColorPickerColor('" + color + "');" );
  250. row.appendChild(cell);
  251. }
  252. tableBody.appendChild(row);
  253. }
  254. table.appendChild(tableBody);
  255. parent.appendChild(table);
  256. }
  257. function getHexColor(red, green, blue) {
  258. var redHex = convertIntToHex(red);
  259. while (redHex.length < 2)
  260. redHex = "0" + redHex;
  261. var greenHex = convertIntToHex(green);
  262. while (greenHex.length < 2)
  263. greenHex = "0" + greenHex;
  264. var blueHex = convertIntToHex(blue);
  265. while (blueHex.length < 2)
  266. blueHex = "0" + blueHex;
  267. var hexColor = redHex + greenHex + blueHex;
  268. if (hexColor.length != 6) {
  269. alert(red + "," + green + "," + blue + " = " + hexColor);
  270. }
  271. return hexColor;
  272. }
  273. function convertIntToHex(num) {
  274. var hexDigits = "0123456789ABCDEF";
  275. var hexNo = "";
  276. var tempNo = num;
  277. var tempDigit;
  278. while (tempNo > 0) {
  279. tempDigit = tempNo % 16;
  280. tempNo = parseInt(tempNo / 16);
  281. hexNo = hexDigits.charAt(tempDigit) + hexNo;
  282. }
  283. return hexNo;
  284. }
  285. function getRGBFromHex(hexColor) {
  286. var red = 0;
  287. var green = 0;
  288. var blue = 0;
  289. red = getIntFromHex(hexColor.substr(0,2));
  290. green = getIntFromHex(hexColor.substr(2,2));
  291. blue = getIntFromHex(hexColor.substr(4,2));
  292. return new RGB(red,green,blue);
  293. }
  294. function getIntFromHex(hexNum) {
  295. var num = 0;
  296. var digit;
  297. for (var i = 0; i < hexNum.length; i++) {
  298. digit = hexNum.charAt(i);
  299. switch (digit) {
  300. case 'A': num = 16 * num + 10; break;
  301. case 'B': num = 16 * num + 11; break;
  302. case 'C': num = 16 * num + 12; break;
  303. case 'D': num = 16 * num + 13; break;
  304. case 'E': num = 16 * num + 14; break;
  305. case 'F': num = 16 * num + 15; break;
  306. default: num = 16 * num + parseInt(digit);
  307. }
  308. }
  309. return num;
  310. }
  311. function displayPatternPicker(event) {
  312. var eventM = new eventManager(event);
  313. eventM.cancelBubble();
  314. displayPatternPickerObj(eventM.getSrc().parentNode.parentNode.parentNode.parentNode);
  315. }
  316. function displayPatternPickerObj(obj) {
  317. //Create the dom for the color Picker.
  318. if (currentColorPicker != null)
  319. return;
  320. ownerControl = obj; //Get the table
  321. var currentPattern = parseInt(ownerControl.getAttribute("pattern"));
  322. if (patternPickerDOM == null) {
  323. currentColorPicker = document.createElement("DIV");
  324. currentColorPicker.className = "PatternPickerDiv";
  325. var outerTable = document.createElement("TABLE");
  326. outerTable.setAttribute("cellpadding",0);
  327. outerTable.setAttribute("cellspacing",4);
  328. var outerTableBody = document.createElement("TBODY");
  329. var row;
  330. var cell;
  331. var div;
  332. var patternNo;
  333. for (var i = 0; i < 6; i++) {
  334. row = document.createElement("TR");
  335. for (var j = 1; j <= 7; j++) {
  336. patternNo = (i*7 + j);
  337. cell = document.createElement("TD");
  338. cell.id = "patternpickercell" + i + "-" + j;
  339. div = document.createElement("DIV");
  340. cell.setAttribute("pattern", patternNo);
  341. cell.className = "patternPickerPatternCell";
  342. div.style.backgroundImage = getPatternStyle(patternNo);
  343. div.className = (patternNo == currentPattern)? "patternPickerPatternDivSelected": "patternPickerPatternDiv" ;
  344. cell.onclick = new Function( "selectPattern(" + patternNo + ");eval(notifyColorChange);" );
  345. cell.appendChild(div);
  346. row.appendChild(cell);
  347. }
  348. outerTableBody.appendChild(row);
  349. }
  350. outerTable.appendChild(outerTableBody);
  351. currentColorPicker.appendChild(outerTable);
  352. document.body.appendChild(currentColorPicker);
  353. patternPickerDOM = currentColorPicker;
  354. } else {
  355. currentColorPicker = patternPickerDOM;
  356. currentColorPicker.style.display = "";
  357. //We have to select the correct item
  358. var patternNo;
  359. for (var i = 0; i < 6; i++) {
  360. for (var j = 1; j <= 7; j++) {
  361. patternNo = (i*7 + j);
  362. var cell = document.getElementById("patternpickercell" + i + "-" + j);
  363. cell.firstChild.className = (patternNo == currentPattern)? "patternPickerPatternDivSelected": "patternPickerPatternDiv" ;
  364. }
  365. }
  366. }
  367. positionColorPicker();
  368. }
  369. function getPatternStyle(patternNo) {
  370. //return "background-image: url(" + topparent.getGlobal("menuImagePath") + "pattern" + patternNo + ".png);";
  371. return "url(" + topparent.getGlobal("menuImagePath") + "pattern" + patternNo + ".png)";
  372. }
  373. function selectPattern(patternNo) {
  374. ownerControl.setAttribute("pattern",patternNo);
  375. ownerControl.firstChild.firstChild.firstChild.style.backgroundImage = getPatternStyle(patternNo);
  376. hideColorPicker();
  377. }
  378. function positionColorPicker() {
  379. var colorPickerWidth = currentColorPicker.offsetWidth;
  380. var colorPickerHeight = currentColorPicker.offsetHeight;
  381. var docheight,docwidth;
  382. if (window.innerHeight) {
  383. docheight = window.innerHeight;
  384. docwidth = window.innerWidth;
  385. } else {
  386. docheight = document.body.offsetHeight;
  387. docwidth = document.body.offsetWidth;
  388. }
  389. var verticalScroll = 0;
  390. if (window.scrollY)
  391. verticalScroll = scrollY;
  392. else
  393. verticalScroll = document.body.scrollTop;
  394. currentColorPicker.style.top = parseInt((docheight - colorPickerHeight) / 2) + verticalScroll;
  395. currentColorPicker.style.left = parseInt((docwidth - colorPickerWidth) / 2);
  396. }
  397. function initializeColorPicker() {
  398. setColorPickerColor(ownerControl.getAttribute("color"));
  399. }
  400. function selectCurrentWebSafeColorCell() {
  401. if (currentlySelectedColorCell)
  402. currentlySelectedColorCell.removeChild(currentlySelectedColorCell.firstChild);
  403. //Find the correct cell;
  404. var rgb = getRGBFromHex(currentColor);
  405. if ((rgb.red % 51) || (rgb.green % 51) || (rgb.blue % 51)) {
  406. //Not a websafe color
  407. currentlySelectedColorCell = null;
  408. } else {
  409. //find the row
  410. var rowNum = parseInt(rgb.green / 51);
  411. if (rgb.blue >= (51 * 3))
  412. rowNum += 6;
  413. var colNum = parseInt(rgb.red / 51);
  414. if (colNum += 6 * ((rgb.blue % (3 * 51)) / 51));
  415. currentlySelectedColorCell = document.getElementById("ColorPickerWebSafePaletteTable").childNodes[rowNum].childNodes[colNum];
  416. var selectImg = document.createElement("IMG");
  417. selectImg.className = "colorPickerWebSafeColorCellSelected";
  418. selectImg.src = topparent.getGlobal("menuImagePath") + "blank.gif";
  419. if (((rgb.red + rgb.green + rgb.blue)/3) < (255/3))
  420. selectImg.style.borderColor = "#FFFFFF";
  421. else
  422. selectImg.style.borderColor = "#000000";
  423. if (topparent.getGlobal("nn7")) {
  424. selectImg.style.height = "2px";
  425. }
  426. currentlySelectedColorCell.appendChild(selectImg);
  427. }
  428. }
  429. function setColorPickerColor(color) {
  430. var colorPreview = document.getElementById("colorPickerPreviewDiv");
  431. colorPreview.style.backgroundColor = "#" + color;
  432. currentColor = color;
  433. selectCurrentWebSafeColorCell();
  434. var rgb = getRGBFromHex(color);
  435. document.getElementById("colorPickerRed").value = rgb.red;
  436. document.getElementById("colorPickerGreen").value = rgb.green;
  437. document.getElementById("colorPickerBlue").value = rgb.blue;
  438. var hsl = RGBtoHSL(rgb);
  439. document.getElementById("colorPickerHue").value = hsl.hue;
  440. document.getElementById("colorPickerSat").value = hsl.sat;
  441. document.getElementById("colorPickerLum").value = hsl.lum;
  442. }
  443. function onRGBChange() {
  444. var rgb = new RGB(parseInt(document.getElementById("colorPickerRed").value),parseInt(document.getElementById("colorPickerGreen").value),parseInt(document.getElementById("colorPickerBlue").value));
  445. var hexColor = getHexColor(rgb.red, rgb.green, rgb.blue);
  446. var colorPreview = document.getElementById("colorPickerPreviewDiv");
  447. colorPreview.style.backgroundColor = "#" + hexColor;
  448. currentColor = hexColor;
  449. selectCurrentWebSafeColorCell();
  450. var hsl = RGBtoHSL(rgb);
  451. document.getElementById("colorPickerHue").value = hsl.hue;
  452. document.getElementById("colorPickerSat").value = hsl.sat;
  453. document.getElementById("colorPickerLum").value = hsl.lum;
  454. }
  455. function onHSLChange() {
  456. var hsl = new HSL(parseInt(document.getElementById("colorPickerHue").value),parseInt(document.getElementById("colorPickerSat").value),parseInt(document.getElementById("colorPickerLum").value));
  457. var rgb = HSLtoRGB(hsl);
  458. var hexColor = getHexColor(rgb.red, rgb.green, rgb.blue);
  459. var colorPreview = document.getElementById("colorPickerPreviewDiv");
  460. colorPreview.style.backgroundColor = "#" + hexColor;
  461. currentColor = hexColor;
  462. selectCurrentWebSafeColorCell();
  463. document.getElementById("colorPickerRed").value = rgb.red;
  464. document.getElementById("colorPickerGreen").value = rgb.green;
  465. document.getElementById("colorPickerBlue").value = rgb.blue;
  466. }
  467. function setOwnerControlColor() {
  468. ownerControl.setAttribute("color",currentColor);
  469. ownerControl.firstChild.firstChild.firstChild.style.backgroundColor = "#" + currentColor;
  470. }
  471. function hideColorPicker() {
  472. if (currentColorPicker != null) {
  473. currentColorPicker.style.display = "none";
  474. currentColorPicker = null;
  475. ownerControl = null;
  476. currentColor = "";
  477. }
  478. }
  479. /**********************************/
  480. /* RGB / HSL conversions routines */
  481. /**********************************/
  482. function RGBtoHSL(rgb) {
  483. var hue = 0;
  484. var sat = 0;
  485. var lum = 0;
  486. var minColor = rgb.red;
  487. var maxColor = rgb.red;
  488. if (rgb.green < minColor)
  489. minColor = rgb.green;
  490. else if (rgb.green > maxColor)
  491. maxColor = rgb.green;
  492. if (rgb.blue < minColor)
  493. minColor = rgb.blue;
  494. else if (rgb.blue > maxColor)
  495. maxColor = rgb.blue;
  496. lum = parseInt(((maxColor + minColor) / 2) * MAX_HSL/MAX_RGB + 0.5);
  497. if (maxColor != minColor) {
  498. if (lum < (MAX_HSL / 2)) {
  499. sat = (maxColor - minColor) / (maxColor + minColor);
  500. } else {
  501. sat = (maxColor - minColor) / ((2 * MAX_RGB) - maxColor - minColor);
  502. }
  503. sat = parseInt(sat * MAX_HSL + 0.5);
  504. }
  505. if ((maxColor == 0 && minColor == 0) || (maxColor - minColor == 0))
  506. hue = 0;
  507. else if (rgb.red == maxColor) {
  508. hue = parseInt(((rgb.green - rgb.blue)/(maxColor - minColor)) * MAX_HSL/6);
  509. } else if (rgb.green == maxColor) {
  510. hue = parseInt(((rgb.blue - rgb.red)/(maxColor - minColor)) * MAX_HSL/6 + MAX_HSL/3);
  511. } else {
  512. hue = parseInt(((rgb.red - rgb.green)/(maxColor - minColor)) * MAX_HSL/6 + 2 * MAX_HSL/3);
  513. }
  514. if (hue < 0)
  515. hue += MAX_HSL;
  516. return new HSL(hue,sat,lum);
  517. }
  518. function HSLtoRGB(hsl) {
  519. var red = 0;
  520. var green = 0;
  521. var blue = 0;
  522. var temp1, temp2, Rtemp, Gtemp, Btemp;
  523. if (hsl.sat == 0) {
  524. red = parseInt(hsl.lum * MAX_RGB/MAX_HSL + 0.5);
  525. green = parseInt(hsl.lum * MAX_RGB/MAX_HSL + 0.5);
  526. blue = parseInt(hsl.lum * MAX_RGB/MAX_HSL + 0.5);
  527. } else {
  528. if (hsl.lum < (MAX_HSL / 2)) {
  529. temp2 = hsl.lum/MAX_HSL * (1 + hsl.sat/MAX_HSL);
  530. } else
  531. temp2 = (hsl.lum + hsl.sat)/MAX_HSL - (hsl.lum/MAX_HSL * hsl.sat/MAX_HSL);
  532. temp1 = 2 * hsl.lum/MAX_HSL - temp2;
  533. Rtemp = hsl.hue/MAX_HSL + 1/3;
  534. if (Rtemp > 1)
  535. Rtemp -= 1;
  536. else if (Rtemp < 0)
  537. Rtemp += 1;
  538. Gtemp = hsl.hue/MAX_HSL;
  539. if (Gtemp > 1)
  540. Gtemp -= 1;
  541. else if (Gtemp < 0)
  542. Gtemp += 1;
  543. Btemp = hsl.hue/MAX_HSL - 1/3;
  544. if (Btemp > 1)
  545. Btemp -= 1;
  546. else if (Btemp < 0)
  547. Btemp += 1;
  548. if (6 * Rtemp < 1)
  549. red = temp1 + (temp2 - temp1) * 6 * Rtemp;
  550. else if (2 * Rtemp < 1)
  551. red = temp2;
  552. else if (3 * Rtemp < 2)
  553. red = temp1 + (temp2 - temp1) * (2/3 - Rtemp) * 6;
  554. else
  555. red = temp1;
  556. if (6 * Gtemp < 1)
  557. green = temp1 + (temp2 - temp1) * 6 * Gtemp;
  558. else if (2 * Gtemp < 1)
  559. green = temp2;
  560. else if (3 * Gtemp < 2)
  561. green = temp1 + (temp2 - temp1) * (2/3 - Gtemp) * 6;
  562. else
  563. green = temp1;
  564. if (6 * Btemp < 1)
  565. blue = temp1 + (temp2 - temp1) * 6 * Btemp;
  566. else if (2 * Btemp < 1)
  567. blue = temp2;
  568. else if (3 * Btemp < 2)
  569. blue = temp1 + (temp2 - temp1) * (2/3 - Btemp) * 6;
  570. else
  571. blue = temp1;
  572. }
  573. return new RGB(parseInt(red * MAX_RGB + 0.5), parseInt(green * MAX_RGB + 0.5), parseInt(blue * MAX_RGB + 0.5));
  574. }
  575. function setColorPicker(id, color) {
  576. var colorPicker = document.getElementById(id);
  577. colorPicker.setAttribute("color",color);
  578. colorPicker.firstChild.firstChild.firstChild.style.backgroundColor = "#" + color;
  579. }
  580. function getColorPickerColor(id) {
  581. return document.getElementById(id).getAttribute("color");
  582. }
  583. function setPatternPicker(id, pattern) {
  584. var patternPicker = document.getElementById(id);
  585. patternPicker.setAttribute("pattern",pattern);
  586. patternPicker.firstChild.firstChild.firstChild.style.backgroundImage = getPatternStyle(pattern);
  587. }
  588. function getPatternPickerPattern(id) {
  589. return parseInt(document.getElementById(id).getAttribute("pattern"));
  590. }
  591. //***************************************
  592. //slider
  593. var dragging_slider = null;
  594. var sliderPageOffsetLeft = 0;
  595. var sliderContainerOffsetWidth = 0;
  596. var sliderOffsetWidth = 0;
  597. var sliderTextBox = null;
  598. var minSliderValue = 0;
  599. var maxSliderValue = 0;
  600. function startdragslider(event) {
  601. var eventM = new eventManager(event);
  602. eventM.cancelBubble();
  603. dragging_slider = eventM.getSrc();
  604. if (dragging_slider.tagName.toUpperCase() != "IMG") {
  605. dragging_slider = dragging_slider.firstChild;
  606. }
  607. sliderPageOffsetLeft = getPageOffsetLeft(dragging_slider.parentNode);
  608. sliderOffsetWidth = dragging_slider.offsetWidth;
  609. sliderContainerOffsetWidth = dragging_slider.parentNode.offsetWidth - sliderOffsetWidth;
  610. sliderTextBox = dragging_slider.parentNode.nextSibling.firstChild.nextSibling;
  611. minSliderValue = parseInt(dragging_slider.parentNode.getAttribute("min"));
  612. maxSliderValue = parseInt(dragging_slider.parentNode.getAttribute("max"));
  613. }
  614. function stopdragslider(event) {
  615. dragging_slider = null;
  616. }
  617. function dragslider(event) {
  618. var eventM = new eventManager(event);
  619. eventM.cancelBubble();
  620. if (dragging_slider != null) {
  621. var val = eventM.theEvent.clientX - sliderPageOffsetLeft - sliderOffsetWidth/2;
  622. if (val > 0 && val < sliderContainerOffsetWidth ) {
  623. dragging_slider.style.left = val;
  624. if ((val - 2) <= 0)
  625. sliderTextBox.value = minSliderValue;
  626. else if ((val + 2) >= sliderContainerOffsetWidth)
  627. sliderTextBox.value = maxSliderValue;
  628. else
  629. sliderTextBox.value = parseInt(minSliderValue + ((val - 2) * (maxSliderValue - minSliderValue)/(sliderContainerOffsetWidth - 4)));
  630. }
  631. }
  632. }
  633. function sliderCLicked(event) {
  634. //Clicking the slider is the same as a complete drag operation
  635. startdragslider(event);
  636. dragslider(event);
  637. stopdragslider(event);
  638. }
  639. function getPageOffsetLeft(obj) {
  640. var left = obj.offsetLeft;
  641. var oParent = obj.offsetParent;
  642. while (oParent) {
  643. left += oParent.offsetLeft;
  644. oParent = oParent.offsetParent;
  645. }
  646. return left;
  647. }
  648. function changeSlider(event) {
  649. var eventM = new eventManager(event);
  650. eventM.cancelBubble();
  651. var text = eventM.getSrc();
  652. sliderValueChanged(text);
  653. }
  654. function sliderValueChanged(text) {
  655. var slider = text.parentNode.previousSibling.firstChild;
  656. var sliderWidth = text.parentNode.previousSibling.offsetWidth;
  657. var sliderMin = text.parentNode.previousSibling.getAttribute("min");
  658. var sliderMax = text.parentNode.previousSibling.getAttribute("max");
  659. if (text.value == "") {
  660. val = 0;
  661. text.value = "";
  662. } else if (text.value == "-") {
  663. val = 0;
  664. text.value = "-";
  665. } else {
  666. var val = parseInt(text.value);
  667. if (isNaN(val)) {
  668. val = sliderMin;
  669. }
  670. if (val < sliderMin)
  671. val = sliderMin;
  672. if (val > sliderMax)
  673. val = sliderMax;
  674. text.value = val;
  675. }
  676. slider.style.left = (val * (sliderWidth - 4 - slider.offsetWidth)/(sliderMax - sliderMin) ) + 2;
  677. }
  678. function stopProp(event) {
  679. var eventM = new eventManager(event);
  680. eventM.cancelBubble();
  681. }