ru-se.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

colorpicker.js (29083B)


      1 // ===================================================================
      2 // Author: Matt Kruse <matt@mattkruse.com>
      3 // WWW: http://www.mattkruse.com/
      4 //
      5 // NOTICE: You may use this code for any purpose, commercial or
      6 // private, without any further permission from the author. You may
      7 // remove this notice from your final code if you wish, however it is
      8 // appreciated by the author if at least my web site address is kept.
      9 //
     10 // You may *NOT* re-distribute this code in any way except through its
     11 // use. That means, you can include it in your product, or your web
     12 // site, or any other form where the code is actually being used. You
     13 // may not put the plain javascript up on your site for download or
     14 // include it in your javascript libraries for download.
     15 // If you wish to share this code with others, please just point them
     16 // to the URL instead.
     17 // Please DO NOT link directly to my .js files from your site. Copy
     18 // the files to your server and use them there. Thank you.
     19 // ===================================================================
     20 
     21 
     22 /* SOURCE FILE: AnchorPosition.js */
     23 
     24 /*
     25 AnchorPosition.js
     26 Author: Matt Kruse
     27 Last modified: 10/11/02
     28 
     29 DESCRIPTION: These functions find the position of an <A> tag in a document,
     30 so other elements can be positioned relative to it.
     31 
     32 COMPATABILITY: Netscape 4.x,6.x,Mozilla, IE 5.x,6.x on Windows. Some small
     33 positioning errors - usually with Window positioning - occur on the
     34 Macintosh platform.
     35 
     36 FUNCTIONS:
     37 getAnchorPosition(anchorname)
     38   Returns an Object() having .x and .y properties of the pixel coordinates
     39   of the upper-left corner of the anchor. Position is relative to the PAGE.
     40 
     41 getAnchorWindowPosition(anchorname)
     42   Returns an Object() having .x and .y properties of the pixel coordinates
     43   of the upper-left corner of the anchor, relative to the WHOLE SCREEN.
     44 
     45 NOTES:
     46 
     47 1) For popping up separate browser windows, use getAnchorWindowPosition.
     48    Otherwise, use getAnchorPosition
     49 
     50 2) Your anchor tag MUST contain both NAME and ID attributes which are the
     51    same. For example:
     52    <A NAME="test" ID="test"> </A>
     53 
     54 3) There must be at least a space between <A> </A> for IE5.5 to see the
     55    anchor tag correctly. Do not do <A></A> with no space.
     56 */
     57 
     58 // getAnchorPosition(anchorname)
     59 //   This function returns an object having .x and .y properties which are the coordinates
     60 //   of the named anchor, relative to the page.
     61 function getAnchorPosition(anchorname) {
     62 	// This function will return an Object with x and y properties
     63 	var useWindow=false;
     64 	var coordinates=new Object();
     65 	var x=0,y=0;
     66 	// Browser capability sniffing
     67 	var use_gebi=false, use_css=false, use_layers=false;
     68 	if (document.getElementById) { use_gebi=true; }
     69 	else if (document.all) { use_css=true; }
     70 	else if (document.layers) { use_layers=true; }
     71 	// Logic to find position
     72  	if (use_gebi && document.all) {
     73 		x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]);
     74 		y=AnchorPosition_getPageOffsetTop(document.all[anchorname]);
     75 		}
     76 	else if (use_gebi) {
     77 		var o=document.getElementById(anchorname);
     78 		x=AnchorPosition_getPageOffsetLeft(o);
     79 		y=AnchorPosition_getPageOffsetTop(o);
     80 		}
     81  	else if (use_css) {
     82 		x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]);
     83 		y=AnchorPosition_getPageOffsetTop(document.all[anchorname]);
     84 		}
     85 	else if (use_layers) {
     86 		var found=0;
     87 		for (var i=0; i<document.anchors.length; i++) {
     88 			if (document.anchors[i].name==anchorname) { found=1; break; }
     89 			}
     90 		if (found==0) {
     91 			coordinates.x=0; coordinates.y=0; return coordinates;
     92 			}
     93 		x=document.anchors[i].x;
     94 		y=document.anchors[i].y;
     95 		}
     96 	else {
     97 		coordinates.x=0; coordinates.y=0; return coordinates;
     98 		}
     99 	coordinates.x=x;
    100 	coordinates.y=y;
    101 	return coordinates;
    102 	}
    103 
    104 // getAnchorWindowPosition(anchorname)
    105 //   This function returns an object having .x and .y properties which are the coordinates
    106 //   of the named anchor, relative to the window
    107 function getAnchorWindowPosition(anchorname) {
    108 	var coordinates=getAnchorPosition(anchorname);
    109 	var x=0;
    110 	var y=0;
    111 	if (document.getElementById) {
    112 		if (isNaN(window.screenX)) {
    113 			x=coordinates.x-document.body.scrollLeft+window.screenLeft;
    114 			y=coordinates.y-document.body.scrollTop+window.screenTop;
    115 			}
    116 		else {
    117 			x=coordinates.x+window.screenX+(window.outerWidth-window.innerWidth)-window.pageXOffset;
    118 			y=coordinates.y+window.screenY+(window.outerHeight-24-window.innerHeight)-window.pageYOffset;
    119 			}
    120 		}
    121 	else if (document.all) {
    122 		x=coordinates.x-document.body.scrollLeft+window.screenLeft;
    123 		y=coordinates.y-document.body.scrollTop+window.screenTop;
    124 		}
    125 	else if (document.layers) {
    126 		x=coordinates.x+window.screenX+(window.outerWidth-window.innerWidth)-window.pageXOffset;
    127 		y=coordinates.y+window.screenY+(window.outerHeight-24-window.innerHeight)-window.pageYOffset;
    128 		}
    129 	coordinates.x=x;
    130 	coordinates.y=y;
    131 	return coordinates;
    132 	}
    133 
    134 // Functions for IE to get position of an object
    135 function AnchorPosition_getPageOffsetLeft (el) {
    136 	var ol=el.offsetLeft;
    137 	while ((el=el.offsetParent) != null) { ol += el.offsetLeft; }
    138 	return ol;
    139 	}
    140 function AnchorPosition_getWindowOffsetLeft (el) {
    141 	return AnchorPosition_getPageOffsetLeft(el)-document.body.scrollLeft;
    142 	}
    143 function AnchorPosition_getPageOffsetTop (el) {
    144 	var ot=el.offsetTop;
    145 	while((el=el.offsetParent) != null) { ot += el.offsetTop; }
    146 	return ot;
    147 	}
    148 function AnchorPosition_getWindowOffsetTop (el) {
    149 	return AnchorPosition_getPageOffsetTop(el)-document.body.scrollTop;
    150 	}
    151 
    152 /* SOURCE FILE: PopupWindow.js */
    153 
    154 /*
    155 PopupWindow.js
    156 Author: Matt Kruse
    157 Last modified: 02/16/04
    158 
    159 DESCRIPTION: This object allows you to easily and quickly popup a window
    160 in a certain place. The window can either be a DIV or a separate browser
    161 window.
    162 
    163 COMPATABILITY: Works with Netscape 4.x, 6.x, IE 5.x on Windows. Some small
    164 positioning errors - usually with Window positioning - occur on the
    165 Macintosh platform. Due to bugs in Netscape 4.x, populating the popup
    166 window with <STYLE> tags may cause errors.
    167 
    168 USAGE:
    169 // Create an object for a WINDOW popup
    170 var win = new PopupWindow();
    171 
    172 // Create an object for a DIV window using the DIV named 'mydiv'
    173 var win = new PopupWindow('mydiv');
    174 
    175 // Set the window to automatically hide itself when the user clicks
    176 // anywhere else on the page except the popup
    177 win.autoHide();
    178 
    179 // Show the window relative to the anchor name passed in
    180 win.showPopup(anchorname);
    181 
    182 // Hide the popup
    183 win.hidePopup();
    184 
    185 // Set the size of the popup window (only applies to WINDOW popups
    186 win.setSize(width,height);
    187 
    188 // Populate the contents of the popup window that will be shown. If you
    189 // change the contents while it is displayed, you will need to refresh()
    190 win.populate(string);
    191 
    192 // set the URL of the window, rather than populating its contents
    193 // manually
    194 win.setUrl("http://www.site.com/");
    195 
    196 // Refresh the contents of the popup
    197 win.refresh();
    198 
    199 // Specify how many pixels to the right of the anchor the popup will appear
    200 win.offsetX = 50;
    201 
    202 // Specify how many pixels below the anchor the popup will appear
    203 win.offsetY = 100;
    204 
    205 NOTES:
    206 1) Requires the functions in AnchorPosition.js
    207 
    208 2) Your anchor tag MUST contain both NAME and ID attributes which are the
    209    same. For example:
    210    <A NAME="test" ID="test"> </A>
    211 
    212 3) There must be at least a space between <A> </A> for IE5.5 to see the
    213    anchor tag correctly. Do not do <A></A> with no space.
    214 
    215 4) When a PopupWindow object is created, a handler for 'onmouseup' is
    216    attached to any event handler you may have already defined. Do NOT define
    217    an event handler for 'onmouseup' after you define a PopupWindow object or
    218    the autoHide() will not work correctly.
    219 */
    220 
    221 // Set the position of the popup window based on the anchor
    222 function PopupWindow_getXYPosition(anchorname) {
    223 	var coordinates;
    224 	if (this.type == "WINDOW") {
    225 		coordinates = getAnchorWindowPosition(anchorname);
    226 		}
    227 	else {
    228 		coordinates = getAnchorPosition(anchorname);
    229 		}
    230 	this.x = coordinates.x;
    231 	this.y = coordinates.y;
    232 	}
    233 // Set width/height of DIV/popup window
    234 function PopupWindow_setSize(width,height) {
    235 	this.width = width;
    236 	this.height = height;
    237 	}
    238 // Fill the window with contents
    239 function PopupWindow_populate(contents) {
    240 	this.contents = contents;
    241 	this.populated = false;
    242 	}
    243 // Set the URL to go to
    244 function PopupWindow_setUrl(url) {
    245 	this.url = url;
    246 	}
    247 // Set the window popup properties
    248 function PopupWindow_setWindowProperties(props) {
    249 	this.windowProperties = props;
    250 	}
    251 // Refresh the displayed contents of the popup
    252 function PopupWindow_refresh() {
    253 	if (this.divName != null) {
    254 		// refresh the DIV object
    255 		if (this.use_gebi) {
    256 			document.getElementById(this.divName).innerHTML = this.contents;
    257 			}
    258 		else if (this.use_css) {
    259 			document.all[this.divName].innerHTML = this.contents;
    260 			}
    261 		else if (this.use_layers) {
    262 			var d = document.layers[this.divName];
    263 			d.document.open();
    264 			d.document.writeln(this.contents);
    265 			d.document.close();
    266 			}
    267 		}
    268 	else {
    269 		if (this.popupWindow != null && !this.popupWindow.closed) {
    270 			if (this.url!="") {
    271 				this.popupWindow.location.href=this.url;
    272 				}
    273 			else {
    274 				this.popupWindow.document.open();
    275 				this.popupWindow.document.writeln(this.contents);
    276 				this.popupWindow.document.close();
    277 			}
    278 			this.popupWindow.focus();
    279 			}
    280 		}
    281 	}
    282 // Position and show the popup, relative to an anchor object
    283 function PopupWindow_showPopup(anchorname) {
    284 	this.getXYPosition(anchorname);
    285 	this.x += this.offsetX;
    286 	this.y += this.offsetY;
    287 	if (!this.populated && (this.contents != "")) {
    288 		this.populated = true;
    289 		this.refresh();
    290 		}
    291 	if (this.divName != null) {
    292 		// Show the DIV object
    293 		if (this.use_gebi) {
    294 			document.getElementById(this.divName).style.left = this.x + "px";
    295 			document.getElementById(this.divName).style.top = this.y;
    296 			document.getElementById(this.divName).style.visibility = "visible";
    297 			}
    298 		else if (this.use_css) {
    299 			document.all[this.divName].style.left = this.x;
    300 			document.all[this.divName].style.top = this.y;
    301 			document.all[this.divName].style.visibility = "visible";
    302 			}
    303 		else if (this.use_layers) {
    304 			document.layers[this.divName].left = this.x;
    305 			document.layers[this.divName].top = this.y;
    306 			document.layers[this.divName].visibility = "visible";
    307 			}
    308 		}
    309 	else {
    310 		if (this.popupWindow == null || this.popupWindow.closed) {
    311 			// If the popup window will go off-screen, move it so it doesn't
    312 			if (this.x<0) { this.x=0; }
    313 			if (this.y<0) { this.y=0; }
    314 			if (screen && screen.availHeight) {
    315 				if ((this.y + this.height) > screen.availHeight) {
    316 					this.y = screen.availHeight - this.height;
    317 					}
    318 				}
    319 			if (screen && screen.availWidth) {
    320 				if ((this.x + this.width) > screen.availWidth) {
    321 					this.x = screen.availWidth - this.width;
    322 					}
    323 				}
    324 			var avoidAboutBlank = window.opera || ( document.layers && !navigator.mimeTypes['*'] ) || navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled );
    325 			this.popupWindow = window.open(avoidAboutBlank?"":"about:blank","window_"+anchorname,this.windowProperties+",width="+this.width+",height="+this.height+",screenX="+this.x+",left="+this.x+",screenY="+this.y+",top="+this.y+"");
    326 			}
    327 		this.refresh();
    328 		}
    329 	}
    330 // Hide the popup
    331 function PopupWindow_hidePopup() {
    332 	if (this.divName != null) {
    333 		if (this.use_gebi) {
    334 			document.getElementById(this.divName).style.visibility = "hidden";
    335 			}
    336 		else if (this.use_css) {
    337 			document.all[this.divName].style.visibility = "hidden";
    338 			}
    339 		else if (this.use_layers) {
    340 			document.layers[this.divName].visibility = "hidden";
    341 			}
    342 		}
    343 	else {
    344 		if (this.popupWindow && !this.popupWindow.closed) {
    345 			this.popupWindow.close();
    346 			this.popupWindow = null;
    347 			}
    348 		}
    349 	}
    350 // Pass an event and return whether or not it was the popup DIV that was clicked
    351 function PopupWindow_isClicked(e) {
    352 	if (this.divName != null) {
    353 		if (this.use_layers) {
    354 			var clickX = e.pageX;
    355 			var clickY = e.pageY;
    356 			var t = document.layers[this.divName];
    357 			if ((clickX > t.left) && (clickX < t.left+t.clip.width) && (clickY > t.top) && (clickY < t.top+t.clip.height)) {
    358 				return true;
    359 				}
    360 			else { return false; }
    361 			}
    362 		else if (document.all) { // Need to hard-code this to trap IE for error-handling
    363 			var t = window.event.srcElement;
    364 			while (t.parentElement != null) {
    365 				if (t.id==this.divName) {
    366 					return true;
    367 					}
    368 				t = t.parentElement;
    369 				}
    370 			return false;
    371 			}
    372 		else if (this.use_gebi && e) {
    373 			var t = e.originalTarget;
    374 			while (t.parentNode != null) {
    375 				if (t.id==this.divName) {
    376 					return true;
    377 					}
    378 				t = t.parentNode;
    379 				}
    380 			return false;
    381 			}
    382 		return false;
    383 		}
    384 	return false;
    385 	}
    386 
    387 // Check an onMouseDown event to see if we should hide
    388 function PopupWindow_hideIfNotClicked(e) {
    389 	if (this.autoHideEnabled && !this.isClicked(e)) {
    390 		this.hidePopup();
    391 		}
    392 	}
    393 // Call this to make the DIV disable automatically when mouse is clicked outside it
    394 function PopupWindow_autoHide() {
    395 	this.autoHideEnabled = true;
    396 	}
    397 // This global function checks all PopupWindow objects onmouseup to see if they should be hidden
    398 function PopupWindow_hidePopupWindows(e) {
    399 	for (var i=0; i<popupWindowObjects.length; i++) {
    400 		if (popupWindowObjects[i] != null) {
    401 			var p = popupWindowObjects[i];
    402 			p.hideIfNotClicked(e);
    403 			}
    404 		}
    405 	}
    406 // Run this immediately to attach the event listener
    407 function PopupWindow_attachListener() {
    408 	if (document.layers) {
    409 		document.captureEvents(Event.MOUSEUP);
    410 		}
    411 	window.popupWindowOldEventListener = document.onmouseup;
    412 	if (window.popupWindowOldEventListener != null) {
    413 		document.onmouseup = new Function("window.popupWindowOldEventListener(); PopupWindow_hidePopupWindows();");
    414 		}
    415 	else {
    416 		document.onmouseup = PopupWindow_hidePopupWindows;
    417 		}
    418 	}
    419 // CONSTRUCTOR for the PopupWindow object
    420 // Pass it a DIV name to use a DHTML popup, otherwise will default to window popup
    421 function PopupWindow() {
    422 	if (!window.popupWindowIndex) { window.popupWindowIndex = 0; }
    423 	if (!window.popupWindowObjects) { window.popupWindowObjects = new Array(); }
    424 	if (!window.listenerAttached) {
    425 		window.listenerAttached = true;
    426 		PopupWindow_attachListener();
    427 		}
    428 	this.index = popupWindowIndex++;
    429 	popupWindowObjects[this.index] = this;
    430 	this.divName = null;
    431 	this.popupWindow = null;
    432 	this.width=0;
    433 	this.height=0;
    434 	this.populated = false;
    435 	this.visible = false;
    436 	this.autoHideEnabled = false;
    437 
    438 	this.contents = "";
    439 	this.url="";
    440 	this.windowProperties="toolbar=no,location=no,status=no,menubar=no,scrollbars=auto,resizable,alwaysRaised,dependent,titlebar=no";
    441 	if (arguments.length>0) {
    442 		this.type="DIV";
    443 		this.divName = arguments[0];
    444 		}
    445 	else {
    446 		this.type="WINDOW";
    447 		}
    448 	this.use_gebi = false;
    449 	this.use_css = false;
    450 	this.use_layers = false;
    451 	if (document.getElementById) { this.use_gebi = true; }
    452 	else if (document.all) { this.use_css = true; }
    453 	else if (document.layers) { this.use_layers = true; }
    454 	else { this.type = "WINDOW"; }
    455 	this.offsetX = 0;
    456 	this.offsetY = 0;
    457 	// Method mappings
    458 	this.getXYPosition = PopupWindow_getXYPosition;
    459 	this.populate = PopupWindow_populate;
    460 	this.setUrl = PopupWindow_setUrl;
    461 	this.setWindowProperties = PopupWindow_setWindowProperties;
    462 	this.refresh = PopupWindow_refresh;
    463 	this.showPopup = PopupWindow_showPopup;
    464 	this.hidePopup = PopupWindow_hidePopup;
    465 	this.setSize = PopupWindow_setSize;
    466 	this.isClicked = PopupWindow_isClicked;
    467 	this.autoHide = PopupWindow_autoHide;
    468 	this.hideIfNotClicked = PopupWindow_hideIfNotClicked;
    469 	}
    470 
    471 /* SOURCE FILE: ColorPicker2.js */
    472 
    473 /*
    474 Last modified: 02/24/2003
    475 
    476 DESCRIPTION: This widget is used to select a color, in hexadecimal #RRGGBB
    477 form. It uses a color "swatch" to display the standard 216-color web-safe
    478 palette. The user can then click on a color to select it.
    479 
    480 COMPATABILITY: See notes in AnchorPosition.js and PopupWindow.js.
    481 Only the latest DHTML-capable browsers will show the color and hex values
    482 at the bottom as your mouse goes over them.
    483 
    484 USAGE:
    485 // Create a new ColorPicker object using DHTML popup
    486 var cp = new ColorPicker();
    487 
    488 // Create a new ColorPicker object using Window Popup
    489 var cp = new ColorPicker('window');
    490 
    491 // Add a link in your page to trigger the popup. For example:
    492 <A HREF="#" onClick="cp.show('pick');return false;" NAME="pick" ID="pick">Pick</A>
    493 
    494 // Or use the built-in "select" function to do the dirty work for you:
    495 <A HREF="#" onClick="cp.select(document.forms[0].color,'pick');return false;" NAME="pick" ID="pick">Pick</A>
    496 
    497 // If using DHTML popup, write out the required DIV tag near the bottom
    498 // of your page.
    499 <SCRIPT LANGUAGE="JavaScript">cp.writeDiv()</SCRIPT>
    500 
    501 // Write the 'pickColor' function that will be called when the user clicks
    502 // a color and do something with the value. This is only required if you
    503 // want to do something other than simply populate a form field, which is
    504 // what the 'select' function will give you.
    505 function pickColor(color) {
    506 	field.value = color;
    507 	}
    508 
    509 NOTES:
    510 1) Requires the functions in AnchorPosition.js and PopupWindow.js
    511 
    512 2) Your anchor tag MUST contain both NAME and ID attributes which are the
    513    same. For example:
    514    <A NAME="test" ID="test"> </A>
    515 
    516 3) There must be at least a space between <A> </A> for IE5.5 to see the
    517    anchor tag correctly. Do not do <A></A> with no space.
    518 
    519 4) When a ColorPicker object is created, a handler for 'onmouseup' is
    520    attached to any event handler you may have already defined. Do NOT define
    521    an event handler for 'onmouseup' after you define a ColorPicker object or
    522    the color picker will not hide itself correctly.
    523 */
    524 ColorPicker_targetInput = null;
    525 function ColorPicker_writeDiv() {
    526 	document.writeln("<DIV ID=\"colorPickerDiv\" STYLE=\"position:absolute;visibility:hidden;\"> </DIV>");
    527 	}
    528 
    529 function ColorPicker_show(anchorname) {
    530 	this.showPopup(anchorname);
    531 	}
    532 
    533 function ColorPicker_pickColor(color,obj) {
    534 	obj.hidePopup();
    535 	pickColor(color);
    536 	}
    537 
    538 // A Default "pickColor" function to accept the color passed back from popup.
    539 // User can over-ride this with their own function.
    540 function pickColor(color) {
    541 	if (ColorPicker_targetInput==null) {
    542 		alert("Target Input is null, which means you either didn't use the 'select' function or you have no defined your own 'pickColor' function to handle the picked color!");
    543 		return;
    544 		}
    545 	ColorPicker_targetInput.value = color;
    546 	}
    547 
    548 // This function is the easiest way to popup the window, select a color, and
    549 // have the value populate a form field, which is what most people want to do.
    550 function ColorPicker_select(inputobj,linkname) {
    551 	if (inputobj.type!="text" && inputobj.type!="hidden" && inputobj.type!="textarea") {
    552 		alert("colorpicker.select: Input object passed is not a valid form input object");
    553 		window.ColorPicker_targetInput=null;
    554 		return;
    555 		}
    556 	window.ColorPicker_targetInput = inputobj;
    557 	this.show(linkname);
    558 	}
    559 
    560 // This function runs when you move your mouse over a color block, if you have a newer browser
    561 function ColorPicker_highlightColor(c) {
    562 	var thedoc = (arguments.length>1)?arguments[1]:window.document;
    563 	var d = thedoc.getElementById("colorPickerSelectedColor");
    564 	d.style.backgroundColor = c;
    565 	d = thedoc.getElementById("colorPickerSelectedColorValue");
    566 	d.innerHTML = c;
    567 	}
    568 
    569 function ColorPicker() {
    570 	var windowMode = false;
    571 	// Create a new PopupWindow object
    572 	if (arguments.length==0) {
    573 		var divname = "colorPickerDiv";
    574 		}
    575 	else if (arguments[0] == "window") {
    576 		var divname = '';
    577 		windowMode = true;
    578 		}
    579 	else {
    580 		var divname = arguments[0];
    581 		}
    582 
    583 	if (divname != "") {
    584 		var cp = new PopupWindow(divname);
    585 		}
    586 	else {
    587 		var cp = new PopupWindow();
    588 		cp.setSize(225,250);
    589 		}
    590 
    591 	// Object variables
    592 	cp.currentValue = "#FFFFFF";
    593 
    594 	// Method Mappings
    595 	cp.writeDiv = ColorPicker_writeDiv;
    596 	cp.highlightColor = ColorPicker_highlightColor;
    597 	cp.show = ColorPicker_show;
    598 	cp.select = ColorPicker_select;
    599 
    600 	// Code to populate color picker window
    601 	var colors = new Array(	"#4180B6","#69AEE7","#000000","#000033","#000066","#000099","#0000CC","#0000FF","#330000","#330033","#330066","#330099",
    602 							"#3300CC","#3300FF","#660000","#660033","#660066","#660099","#6600CC","#6600FF","#990000","#990033","#990066","#990099",
    603 							"#9900CC","#9900FF","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#FF0000","#FF0033","#FF0066","#FF0099",
    604 							"#FF00CC","#FF00FF","#7FFFFF","#7FFFFF","#7FF7F7","#7FEFEF","#7FE7E7","#7FDFDF","#7FD7D7","#7FCFCF","#7FC7C7","#7FBFBF",
    605 							"#7FB7B7","#7FAFAF","#7FA7A7","#7F9F9F","#7F9797","#7F8F8F","#7F8787","#7F7F7F","#7F7777","#7F6F6F","#7F6767","#7F5F5F",
    606 							"#7F5757","#7F4F4F","#7F4747","#7F3F3F","#7F3737","#7F2F2F","#7F2727","#7F1F1F","#7F1717","#7F0F0F","#7F0707","#7F0000",
    607 
    608 							"#4180B6","#69AEE7","#003300","#003333","#003366","#003399","#0033CC","#0033FF","#333300","#333333","#333366","#333399",
    609 							"#3333CC","#3333FF","#663300","#663333","#663366","#663399","#6633CC","#6633FF","#993300","#993333","#993366","#993399",
    610 							"#9933CC","#9933FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#FF3300","#FF3333","#FF3366","#FF3399",
    611 							"#FF33CC","#FF33FF","#FF7FFF","#FF7FFF","#F77FF7","#EF7FEF","#E77FE7","#DF7FDF","#D77FD7","#CF7FCF","#C77FC7","#BF7FBF",
    612 							"#B77FB7","#AF7FAF","#A77FA7","#9F7F9F","#977F97","#8F7F8F","#877F87","#7F7F7F","#777F77","#6F7F6F","#677F67","#5F7F5F",
    613 							"#577F57","#4F7F4F","#477F47","#3F7F3F","#377F37","#2F7F2F","#277F27","#1F7F1F","#177F17","#0F7F0F","#077F07","#007F00",
    614 
    615 							"#4180B6","#69AEE7","#006600","#006633","#006666","#006699","#0066CC","#0066FF","#336600","#336633","#336666","#336699",
    616 							"#3366CC","#3366FF","#666600","#666633","#666666","#666699","#6666CC","#6666FF","#996600","#996633","#996666","#996699",
    617 							"#9966CC","#9966FF","#CC6600","#CC6633","#CC6666","#CC6699","#CC66CC","#CC66FF","#FF6600","#FF6633","#FF6666","#FF6699",
    618 							"#FF66CC","#FF66FF","#FFFF7F","#FFFF7F","#F7F77F","#EFEF7F","#E7E77F","#DFDF7F","#D7D77F","#CFCF7F","#C7C77F","#BFBF7F",
    619 							"#B7B77F","#AFAF7F","#A7A77F","#9F9F7F","#97977F","#8F8F7F","#87877F","#7F7F7F","#77777F","#6F6F7F","#67677F","#5F5F7F",
    620 							"#57577F","#4F4F7F","#47477F","#3F3F7F","#37377F","#2F2F7F","#27277F","#1F1F7F","#17177F","#0F0F7F","#07077F","#00007F",
    621 
    622 							"#4180B6","#69AEE7","#009900","#009933","#009966","#009999","#0099CC","#0099FF","#339900","#339933","#339966","#339999",
    623 							"#3399CC","#3399FF","#669900","#669933","#669966","#669999","#6699CC","#6699FF","#999900","#999933","#999966","#999999",
    624 							"#9999CC","#9999FF","#CC9900","#CC9933","#CC9966","#CC9999","#CC99CC","#CC99FF","#FF9900","#FF9933","#FF9966","#FF9999",
    625 							"#FF99CC","#FF99FF","#3FFFFF","#3FFFFF","#3FF7F7","#3FEFEF","#3FE7E7","#3FDFDF","#3FD7D7","#3FCFCF","#3FC7C7","#3FBFBF",
    626 							"#3FB7B7","#3FAFAF","#3FA7A7","#3F9F9F","#3F9797","#3F8F8F","#3F8787","#3F7F7F","#3F7777","#3F6F6F","#3F6767","#3F5F5F",
    627 							"#3F5757","#3F4F4F","#3F4747","#3F3F3F","#3F3737","#3F2F2F","#3F2727","#3F1F1F","#3F1717","#3F0F0F","#3F0707","#3F0000",
    628 
    629 							"#4180B6","#69AEE7","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#33CC00","#33CC33","#33CC66","#33CC99",
    630 							"#33CCCC","#33CCFF","#66CC00","#66CC33","#66CC66","#66CC99","#66CCCC","#66CCFF","#99CC00","#99CC33","#99CC66","#99CC99",
    631 							"#99CCCC","#99CCFF","#CCCC00","#CCCC33","#CCCC66","#CCCC99","#CCCCCC","#CCCCFF","#FFCC00","#FFCC33","#FFCC66","#FFCC99",
    632 							"#FFCCCC","#FFCCFF","#FF3FFF","#FF3FFF","#F73FF7","#EF3FEF","#E73FE7","#DF3FDF","#D73FD7","#CF3FCF","#C73FC7","#BF3FBF",
    633 							"#B73FB7","#AF3FAF","#A73FA7","#9F3F9F","#973F97","#8F3F8F","#873F87","#7F3F7F","#773F77","#6F3F6F","#673F67","#5F3F5F",
    634 							"#573F57","#4F3F4F","#473F47","#3F3F3F","#373F37","#2F3F2F","#273F27","#1F3F1F","#173F17","#0F3F0F","#073F07","#003F00",
    635 
    636 							"#4180B6","#69AEE7","#00FF00","#00FF33","#00FF66","#00FF99","#00FFCC","#00FFFF","#33FF00","#33FF33","#33FF66","#33FF99",
    637 							"#33FFCC","#33FFFF","#66FF00","#66FF33","#66FF66","#66FF99","#66FFCC","#66FFFF","#99FF00","#99FF33","#99FF66","#99FF99",
    638 							"#99FFCC","#99FFFF","#CCFF00","#CCFF33","#CCFF66","#CCFF99","#CCFFCC","#CCFFFF","#FFFF00","#FFFF33","#FFFF66","#FFFF99",
    639 							"#FFFFCC","#FFFFFF","#FFFF3F","#FFFF3F","#F7F73F","#EFEF3F","#E7E73F","#DFDF3F","#D7D73F","#CFCF3F","#C7C73F","#BFBF3F",
    640 							"#B7B73F","#AFAF3F","#A7A73F","#9F9F3F","#97973F","#8F8F3F","#87873F","#7F7F3F","#77773F","#6F6F3F","#67673F","#5F5F3F",
    641 							"#57573F","#4F4F3F","#47473F","#3F3F3F","#37373F","#2F2F3F","#27273F","#1F1F3F","#17173F","#0F0F3F","#07073F","#00003F",
    642 
    643 							"#4180B6","#69AEE7","#FFFFFF","#FFEEEE","#FFDDDD","#FFCCCC","#FFBBBB","#FFAAAA","#FF9999","#FF8888","#FF7777","#FF6666",
    644 							"#FF5555","#FF4444","#FF3333","#FF2222","#FF1111","#FF0000","#FF0000","#FF0000","#FF0000","#EE0000","#DD0000","#CC0000",
    645 							"#BB0000","#AA0000","#990000","#880000","#770000","#660000","#550000","#440000","#330000","#220000","#110000","#000000",
    646 							"#000000","#000000","#000000","#001111","#002222","#003333","#004444","#005555","#006666","#007777","#008888","#009999",
    647 							"#00AAAA","#00BBBB","#00CCCC","#00DDDD","#00EEEE","#00FFFF","#00FFFF","#00FFFF","#00FFFF","#11FFFF","#22FFFF","#33FFFF",
    648 							"#44FFFF","#55FFFF","#66FFFF","#77FFFF","#88FFFF","#99FFFF","#AAFFFF","#BBFFFF","#CCFFFF","#DDFFFF","#EEFFFF","#FFFFFF",
    649 
    650 							"#4180B6","#69AEE7","#FFFFFF","#EEFFEE","#DDFFDD","#CCFFCC","#BBFFBB","#AAFFAA","#99FF99","#88FF88","#77FF77","#66FF66",
    651 							"#55FF55","#44FF44","#33FF33","#22FF22","#11FF11","#00FF00","#00FF00","#00FF00","#00FF00","#00EE00","#00DD00","#00CC00",
    652 							"#00BB00","#00AA00","#009900","#008800","#007700","#006600","#005500","#004400","#003300","#002200","#001100","#000000",
    653 							"#000000","#000000","#000000","#110011","#220022","#330033","#440044","#550055","#660066","#770077","#880088","#990099",
    654 							"#AA00AA","#BB00BB","#CC00CC","#DD00DD","#EE00EE","#FF00FF","#FF00FF","#FF00FF","#FF00FF","#FF11FF","#FF22FF","#FF33FF",
    655 							"#FF44FF","#FF55FF","#FF66FF","#FF77FF","#FF88FF","#FF99FF","#FFAAFF","#FFBBFF","#FFCCFF","#FFDDFF","#FFEEFF","#FFFFFF",
    656 
    657 							"#4180B6","#69AEE7","#FFFFFF","#EEEEFF","#DDDDFF","#CCCCFF","#BBBBFF","#AAAAFF","#9999FF","#8888FF","#7777FF","#6666FF",
    658 							"#5555FF","#4444FF","#3333FF","#2222FF","#1111FF","#0000FF","#0000FF","#0000FF","#0000FF","#0000EE","#0000DD","#0000CC",
    659 							"#0000BB","#0000AA","#000099","#000088","#000077","#000066","#000055","#000044","#000033","#000022","#000011","#000000",
    660 							"#000000","#000000","#000000","#111100","#222200","#333300","#444400","#555500","#666600","#777700","#888800","#999900",
    661 							"#AAAA00","#BBBB00","#CCCC00","#DDDD00","#EEEE00","#FFFF00","#FFFF00","#FFFF00","#FFFF00","#FFFF11","#FFFF22","#FFFF33",
    662 							"#FFFF44","#FFFF55","#FFFF66","#FFFF77","#FFFF88","#FFFF99","#FFFFAA","#FFFFBB","#FFFFCC","#FFFFDD","#FFFFEE","#FFFFFF",
    663 
    664 							"#4180B6","#69AEE7","#FFFFFF","#FFFFFF","#FBFBFB","#F7F7F7","#F3F3F3","#EFEFEF","#EBEBEB","#E7E7E7","#E3E3E3","#DFDFDF",
    665 							"#DBDBDB","#D7D7D7","#D3D3D3","#CFCFCF","#CBCBCB","#C7C7C7","#C3C3C3","#BFBFBF","#BBBBBB","#B7B7B7","#B3B3B3","#AFAFAF",
    666 							"#ABABAB","#A7A7A7","#A3A3A3","#9F9F9F","#9B9B9B","#979797","#939393","#8F8F8F","#8B8B8B","#878787","#838383","#7F7F7F",
    667 							"#7B7B7B","#777777","#737373","#6F6F6F","#6B6B6B","#676767","#636363","#5F5F5F","#5B5B5B","#575757","#535353","#4F4F4F",
    668 							"#4B4B4B","#474747","#434343","#3F3F3F","#3B3B3B","#373737","#333333","#2F2F2F","#2B2B2B","#272727","#232323","#1F1F1F",
    669 							"#1B1B1B","#171717","#131313","#0F0F0F","#0B0B0B","#070707","#030303","#000000","#000000","#000000","#000000","#000000");
    670 	var total = colors.length;
    671 	var width = 72;
    672 	var cp_contents = "";
    673 	var windowRef = (windowMode)?"window.opener.":"";
    674 	if (windowMode) {
    675 		cp_contents += "<html><head><title>Select Color</title></head>";
    676 		cp_contents += "<body marginwidth=0 marginheight=0 leftmargin=0 topmargin=0><span style='text-align: center;'>";
    677 		}
    678 	cp_contents += "<table style='border: none;' cellspacing=0 cellpadding=0>";
    679 	var use_highlight = (document.getElementById || document.all)?true:false;
    680 	for (var i=0; i<total; i++) {
    681 		if ((i % width) == 0) { cp_contents += "<tr>"; }
    682 		if (use_highlight) { var mo = 'onMouseOver="'+windowRef+'ColorPicker_highlightColor(\''+colors[i]+'\',window.document)"'; }
    683 		else { mo = ""; }
    684 		cp_contents += '<td style="background-color: '+colors[i]+';"><a href="javascript:void()" onclick="'+windowRef+'ColorPicker_pickColor(\''+colors[i]+'\','+windowRef+'window.popupWindowObjects['+cp.index+']);return false;" '+mo+'>&nbsp;</a></td>';
    685 		if ( ((i+1)>=total) || (((i+1) % width) == 0)) {
    686 			cp_contents += "</tr>";
    687 			}
    688 		}
    689 	// If the browser supports dynamically changing TD cells, add the fancy stuff
    690 	if (document.getElementById) {
    691 		var width1 = Math.floor(width/2);
    692 		var width2 = width = width1;
    693 		cp_contents += "<tr><td colspan='"+width1+"' style='background-color: #FFF;' ID='colorPickerSelectedColor'>&nbsp;</td><td colspan='"+width2+"' style='text-align: center;' id='colorPickerSelectedColorValue'>#FFFFFF</td></tr>";
    694 		}
    695 	cp_contents += "</table>";
    696 	if (windowMode) {
    697 		cp_contents += "</span></body></html>";
    698 		}
    699 	// end populate code
    700 
    701 	// Write the contents to the popup object
    702 	cp.populate(cp_contents+"\n");
    703 	// Move the table down a bit so you can see it
    704 	cp.offsetY = 25;
    705 	cp.autoHide();
    706 	return cp;
    707 	}