Added feature #7150: Add pageUnavailable_handling for system problems and maintenance
[Packages/TYPO3.CMS.git] / typo3 / wizard_colorpicker.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 1999-2005 Kasper Skårhøj (kasperYYYY@typo3.com)
6 * All rights reserved
7 *
8 * This script is part of the TYPO3 project. The TYPO3 project is
9 * free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * The GNU General Public License can be found at
15 * http://www.gnu.org/copyleft/gpl.html.
16 * A copy is found in the textfile GPL.txt and important notices to the license
17 * from the author is found in LICENSE.txt distributed with these scripts.
18 *
19 *
20 * This script is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * This copyright notice MUST APPEAR in all copies of the script!
26 ***************************************************************/
27 /**
28 * Colorpicker wizard
29 *
30 * $Id $
31 * Revised for TYPO3 3.7 May/2004 by Kasper Skaarhoj
32 *
33 * @author Mathias Schreiber <schreiber@wmdb.de>
34 * @author Peter Kühn <peter@kuehn.com>
35 * @author Kasper Skaarhoj <typo3@typo3.com>
36 */
37 /**
38 * [CLASS/FUNCTION INDEX of SCRIPT]
39 *
40 *
41 *
42 * 75: class SC_wizard_colorpicker
43 * 103: function init()
44 * 182: function main()
45 * 233: function printContent()
46 * 246: function frameSet()
47 *
48 * SECTION: Rendering of various color selectors
49 * 305: function colorMatrix()
50 * 354: function colorList()
51 * 384: function colorImage()
52 * 417: function getIndex($im,$x,$y)
53 *
54 * TOTAL FUNCTIONS: 8
55 * (This index is automatically created/updated by the extension "extdeveval")
56 *
57 */
58
59
60 $BACK_PATH = '';
61 require('init.php');
62 require('template.php');
63 require_once(PATH_t3lib.'class.t3lib_stdgraphic.php');
64 $LANG->includeLLFile('EXT:lang/locallang_wizards.xml');
65
66 /**
67 * Script Class for colorpicker wizard
68 *
69 * @author Mathias Schreiber <schreiber@wmdb.de>
70 * @author Peter Kühn <peter@kuehn.com>
71 * @author Kasper Skaarhoj <typo3@typo3.com>
72 * @package TYPO3
73 * @subpackage core
74 */
75 class SC_wizard_colorpicker {
76
77 // GET vars:
78 var $P; // Wizard parameters, coming from TCEforms linking to the wizard.
79 var $colorValue; // Value of the current color picked.
80 var $fieldChangeFunc; // Serialized functions for changing the field... Necessary to call when the value is transferred to the TCEform since the form might need to do internal processing. Otherwise the value is simply not be saved.
81 var $fieldName; // Form name (from opener script)
82 var $formName; // Field name (from opener script)
83 var $md5ID; // ID of element in opener script for which to set color.
84 var $showPicker; // Internal: If false, a frameset is rendered, if true the content of the picker script.
85
86 // Static:
87 var $HTMLcolorList = "aqua,black,blue,fuchsia,gray,green,lime,maroon,navy,olive,purple,red,silver,teal,yellow,white";
88
89 // Internal:
90 var $pickerImage = '';
91 var $imageError = ''; // Error message if image not found.
92
93 /**
94 * document template object
95 *
96 * @var smallDoc
97 */
98 var $doc;
99 var $content; // Accumulated content.
100
101
102
103
104 /**
105 * Initialises the Class
106 *
107 * @return void
108 */
109 function init() {
110 global $BACK_PATH, $LANG;
111
112 // Setting GET vars (used in frameset script):
113 $this->P = t3lib_div::_GP('P',1);
114
115 // Setting GET vars (used in colorpicker script):
116 $this->colorValue = t3lib_div::_GP('colorValue');
117 $this->fieldChangeFunc = t3lib_div::_GP('fieldChangeFunc');
118 $this->fieldName = t3lib_div::_GP('fieldName');
119 $this->formName = t3lib_div::_GP('formName');
120 $this->md5ID = t3lib_div::_GP('md5ID');
121 $this->exampleImg = t3lib_div::_GP('exampleImg');
122
123
124 // Resolving image (checking existence etc.)
125 $this->imageError = '';
126 if ($this->exampleImg) {
127 $this->pickerImage = t3lib_div::getFileAbsFileName($this->exampleImg,1,1);
128 if (!$this->pickerImage || !@is_file($this->pickerImage)) {
129 $this->imageError = 'ERROR: The image, "'.$this->exampleImg.'", could not be found!';
130 }
131 }
132
133 // Setting field-change functions:
134 $fieldChangeFuncArr = unserialize($this->fieldChangeFunc);
135 $update = '';
136 if (is_array($fieldChangeFuncArr)) {
137 unset($fieldChangeFuncArr['alert']);
138 foreach($fieldChangeFuncArr as $v) {
139 $update.= '
140 parent.opener.'.$v;
141 }
142 }
143
144 // Initialize document object:
145 $this->doc = t3lib_div::makeInstance('smallDoc');
146 $this->doc->backPath = $BACK_PATH;
147 $this->doc->docType = 'xhtml_trans';
148 $this->doc->JScode = $this->doc->wrapScriptTags('
149 function checkReference() { //
150 if (parent.opener && parent.opener.document && parent.opener.document.'.$this->formName.' && parent.opener.document.'.$this->formName.'["'.$this->fieldName.'"]) {
151 return parent.opener.document.'.$this->formName.'["'.$this->fieldName.'"];
152 } else {
153 close();
154 }
155 }
156 function changeBGcolor(color) { // Changes the color in the table sample back in the TCEform.
157 if (parent.opener.document.layers) {
158 parent.opener.document.layers["'.$this->md5ID.'"].bgColor = color;
159 } else if (parent.opener.document.all) {
160 parent.opener.document.all["'.$this->md5ID.'"].style.background = color;
161 } else if (parent.opener.document.getElementById && parent.opener.document.getElementById("'.$this->md5ID.'")) {
162 parent.opener.document.getElementById("'.$this->md5ID.'").bgColor = color;
163 }
164 }
165 function setValue(input) { //
166 var field = checkReference();
167 if (field) {
168 field.value = input;
169 '.$update.'
170 changeBGcolor(input);
171 }
172 }
173 function getValue() { //
174 var field = checkReference();
175 return field.value;
176 }
177 ');
178
179 // Start page:
180 $this->content.=$this->doc->startPage($LANG->getLL('colorpicker_title'));
181 }
182
183 /**
184 * Main Method, rendering either colorpicker or frameset depending on ->showPicker
185 *
186 * @return void
187 */
188 function main() {
189 global $LANG;
190
191 if(!t3lib_div::_GP('showPicker')) { // Show frameset by default:
192 $this->frameSet();
193 } else {
194
195 // Putting together the items into a form:
196 $content = '
197 <form name="colorform" method="post" action="wizard_colorpicker.php">
198 '.$this->colorMatrix().'
199 '.$this->colorList().'
200 '.$this->colorImage().'
201
202 <!-- Value box: -->
203 <p class="c-head">'.$LANG->getLL('colorpicker_colorValue',1).'</p>
204 <table border="0" cellpadding="0" cellspacing="3">
205 <tr>
206 <td><input type="text" '.$this->doc->formWidth(7).' maxlength="10" name="colorValue" value="'.htmlspecialchars($this->colorValue).'" /></td>
207 <td style="background-color:'.htmlspecialchars($this->colorValue).'; border: 1px solid black;">&nbsp;<span style="color: black;">'.$LANG->getLL('colorpicker_black',1).'</span>&nbsp;<span style="color: white;">'.$LANG->getLL('colorpicker_white',1).'</span>&nbsp;</td>
208 <td><input type="submit" name="save_close" value="'.$LANG->getLL('colorpicker_setClose',1).'" /></td>
209 </tr>
210 </table>
211
212 <!-- Hidden fields with values that has to be kept constant -->
213 <input type="hidden" name="showPicker" value="1" />
214 <input type="hidden" name="fieldChangeFunc" value="'.htmlspecialchars($this->fieldChangeFunc).'" />
215 <input type="hidden" name="fieldName" value="'.htmlspecialchars($this->fieldName).'" />
216 <input type="hidden" name="formName" value="'.htmlspecialchars($this->formName).'" />
217 <input type="hidden" name="md5ID" value="'.htmlspecialchars($this->md5ID).'" />
218 <input type="hidden" name="exampleImg" value="'.htmlspecialchars($this->exampleImg).'" />
219 </form>';
220
221 // If the save/close button is clicked, then close:
222 if(t3lib_div::_GP('save_close')) {
223 $content.=$this->doc->wrapScriptTags('
224 setValue(\''.$this->colorValue.'\');
225 parent.close();
226 ');
227 }
228
229 // Output:
230 $this->content.=$this->doc->section($LANG->getLL('colorpicker_title'), $content, 0,1);
231 }
232 }
233
234 /**
235 * Returnes the sourcecode to the browser
236 *
237 * @return void
238 */
239 function printContent() {
240 $this->content.= $this->doc->endPage();
241 $this->content = $this->doc->insertStylesAndJS($this->content);
242 echo $this->content;
243 }
244
245 /**
246 * Returnes a frameset so our JavaScript Reference isn't lost
247 * Took some brains to figure this one out ;-)
248 * If Peter wouldn't have been I would've gone insane...
249 *
250 * @return void
251 */
252 function frameSet() {
253 global $LANG;
254
255 // Set doktype:
256 $GLOBALS['TBE_TEMPLATE']->docType = 'xhtml_frames';
257 $GLOBALS['TBE_TEMPLATE']->JScode = $GLOBALS['TBE_TEMPLATE']->wrapScriptTags('
258 if (!window.opener) {
259 alert("ERROR: Sorry, no link to main window... Closing");
260 close();
261 }
262 ');
263
264 $this->content = $GLOBALS['TBE_TEMPLATE']->startPage($LANG->getLL('colorpicker_title'));
265
266 // URL for the inner main frame:
267 $url = 'wizard_colorpicker.php?showPicker=1'.
268 '&colorValue='.rawurlencode($this->P['currentValue']).
269 '&fieldName='.rawurlencode($this->P['itemName']).
270 '&formName='.rawurlencode($this->P['formName']).
271 '&exampleImg='.rawurlencode($this->P['exampleImg']).
272 '&md5ID='.rawurlencode($this->P['md5ID']).
273 '&fieldChangeFunc='.rawurlencode(serialize($this->P['fieldChangeFunc']));
274
275 $this->content.='
276 <frameset rows="*,1" framespacing="0" frameborder="0" border="0">
277 <frame name="content" src="'.htmlspecialchars($url).'" marginwidth="0" marginheight="0" frameborder="0" scrolling="auto" noresize="noresize" />
278 <frame name="menu" src="dummy.php" marginwidth="0" marginheight="0" frameborder="0" scrolling="no" noresize="noresize" />
279 </frameset>
280 ';
281
282 $this->content.='
283 </html>';
284 }
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300 /************************************
301 *
302 * Rendering of various color selectors
303 *
304 ************************************/
305
306 /**
307 * Creates a color matrix table
308 *
309 * @return void
310 */
311 function colorMatrix() {
312 global $LANG;
313
314 $steps = 51;
315
316 // Get colors:
317 $color = array();
318
319 for($rr=0;$rr<256;$rr+=$steps) {
320 for($gg=0;$gg<256;$gg+=$steps) {
321 for($bb=0;$bb<256;$bb+=$steps) {
322 $color[] = '#'.
323 substr('0'.dechex($rr),-2).
324 substr('0'.dechex($gg),-2).
325 substr('0'.dechex($bb),-2);
326 }
327 }
328 }
329
330 // Traverse colors:
331 $columns = 24;
332
333 $rows = 0;
334 $tRows = array();
335 while(isset($color[$columns*$rows])) {
336 $tCells = array();
337 for($i=0;$i<$columns;$i++) {
338 $tCells[] = '
339 <td bgcolor="'.$color[$columns*$rows+$i].'" onclick="document.colorform.colorValue.value = \''.$color[$columns*$rows+$i].'\'; document.colorform.submit();" title="'.$color[$columns*$rows+$i].'">&nbsp;&nbsp;</td>';
340 }
341 $tRows[] = '
342 <tr>'.implode('',$tCells).'
343 </tr>';
344 $rows++;
345 }
346
347 $table = '
348 <p class="c-head">'.$LANG->getLL('colorpicker_fromMatrix',1).'</p>
349 <table border="0" cellpadding="1" cellspacing="1" style="width:100%; border: 1px solid black; cursor:crosshair;">'.implode('',$tRows).'
350 </table>';
351
352 return $table;
353 }
354
355 /**
356 * Creates a selector box with all HTML color names.
357 *
358 * @return void
359 */
360 function colorList() {
361 global $LANG;
362
363 // Initialize variables:
364 $colors = explode(',',$this->HTMLcolorList);
365 $currentValue = strtolower($this->colorValue);
366 $opt = array();
367 $opt[] = '<option value=""></option>';
368
369 // Traverse colors, making option tags for selector box.
370 foreach($colors as $colorName) {
371 $opt[] = '<option style="background-color: '.$colorName.';" value="'.htmlspecialchars($colorName).'"'.($currentValue==$colorName ? ' selected="selected"' : '').'>'.htmlspecialchars($colorName).'</option>';
372 }
373
374 // Compile selector box and return result:
375 $output = '
376 <p class="c-head">'.$LANG->getLL('colorpicker_fromList',1).'</p>
377 <select onchange="document.colorform.colorValue.value = this.options[this.selectedIndex].value; document.colorform.submit(); return false;">
378 '.implode('
379 ',$opt).'
380 </select><br/>';
381
382 return $output;
383 }
384
385 /**
386 * Creates a color image selector
387 *
388 * @return void
389 */
390 function colorImage() {
391 global $LANG;
392
393 // Handling color-picker image if any:
394 if (!$this->imageError) {
395 if ($this->pickerImage) {
396 if(t3lib_div::_POST('coords_x')) {
397 $this->colorValue = '#'.$this->getIndex(t3lib_stdgraphic::imageCreateFromFile($this->pickerImage),t3lib_div::_POST('coords_x'),t3lib_div::_POST('coords_y'));
398 }
399 $pickerFormImage = '
400 <p class="c-head">'.$LANG->getLL('colorpicker_fromImage',1).'</p>
401 <input type="image" src="../'.substr($this->pickerImage,strlen(PATH_site)).'" name="coords" style="cursor:crosshair;" /><br />';
402 } else {
403 $pickerFormImage = '';
404 }
405 } else {
406 $pickerFormImage = '
407 <p class="c-head">'.htmlspecialchars($this->imageError).'</p>';
408 }
409
410 return $pickerFormImage;
411 }
412
413 /**
414 * Gets the HTML (Hex) Color Code for the selected pixel of an image
415 * This method handles the correct imageResource no matter what format
416 *
417 * @param pointer Valid ImageResource returned by t3lib_stdgraphic::imageCreateFromFile
418 * @param integer X-Coordinate of the pixel that should be checked
419 * @param integer Y-Coordinate of the pixel that should be checked
420 * @return string HEX RGB value for color
421 * @see colorImage()
422 */
423 function getIndex($im,$x,$y) {
424 $rgb = ImageColorAt($im, $x, $y);
425 $colorrgb = imagecolorsforindex($im,$rgb);
426 $index['r'] = dechex($colorrgb['red']);
427 $index['g'] = dechex($colorrgb['green']);
428 $index['b'] = dechex($colorrgb['blue']);
429 foreach ($index as $value) {
430 if(strlen($value) == 1) {
431 $hexvalue[] = strtoupper('0'.$value);
432 } else {
433 $hexvalue[] = strtoupper($value);
434 }
435 }
436 $hex = implode('',$hexvalue);
437 return $hex;
438 }
439 }
440
441 // Include extension?
442 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/wizard_colorpicker.php']) {
443 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/wizard_colorpicker.php']);
444 }
445
446
447
448
449
450
451
452
453
454
455
456
457 // Make instance:
458 $SOBE = t3lib_div::makeInstance('SC_wizard_colorpicker');
459 $SOBE->init();
460 $SOBE->main();
461 $SOBE->printContent();
462 ?>