// ===================================================================
// Author: Matt Kruse <matt@mattkruse.com>
// WWW: http://www.mattkruse.com/
//
// NOTICE: You may use this code for any purpose, commercial or
// private, without any further permission from the author. You may
// remove this notice from your final code if you wish, however it is
// appreciated by the author if at least my web site address is kept.
//
// You may *NOT* re-distribute this code in any way except through its
// use. That means, you can include it in your product, or your web
// site, or any other form where the code is actually being used. You
// may not put the plain javascript up on your site for download or
// include it in your javascript libraries for download. 
// If you wish to share this code with others, please just point them
// to the URL instead.
// Please DO NOT link directly to my .js files from your site. Copy
// the files to your server and use them there. Thank you.
// ===================================================================
/* SOURCE FILE: AnchorPosition.js */
function getAnchorPosition(anchorname) {
   var useWindow = false; 
   var coordinates = new Object(); 
   var x = 0, y = 0; 
   var use_gebi = false, use_css = false, use_layers = false; 
   if(document.getElementById) {
      use_gebi = true; 
      }
   else if(document.all) {
      use_css = true; 
      }
   else if(document.layers) {
      use_layers = true; 
      }
   if(use_gebi && document.all) {
      x = AnchorPosition_getPageOffsetLeft(document.all[anchorname]); 
      y = AnchorPosition_getPageOffsetTop(document.all[anchorname]); 
      }
   else if(use_gebi) {
      var o = document.getElementById(anchorname); 
      x = AnchorPosition_getPageOffsetLeft(o); 
      y = AnchorPosition_getPageOffsetTop(o); 
      }
   else if(use_css) {
      x = AnchorPosition_getPageOffsetLeft(document.all[anchorname]); 
      y = AnchorPosition_getPageOffsetTop(document.all[anchorname]); 
      }
   else if(use_layers) {
      var found = 0; 
      for(var i = 0; i < document.anchors.length; i++) {
         if(document.anchors[i].name == anchorname) {
            found = 1; 
            break; 
            }
         }
      if(found == 0) {
         coordinates.x = 0; 
         coordinates.y = 0; 
         return coordinates; 
         }
      x = document.anchors[i].x; 
      y = document.anchors[i].y; 
      }
   else {
      coordinates.x = 0; 
      coordinates.y = 0; 
      return coordinates; 
      }
   coordinates.x = x; 
   coordinates.y = y; 
   return coordinates; 
   }
function getAnchorWindowPosition(anchorname) {
   var coordinates = getAnchorPosition(anchorname); 
   var x = 0; 
   var y = 0; 
   if(document.getElementById) {
      if(isNaN(window.screenX)) {
         x = coordinates.x - document.body.scrollLeft + window.screenLeft; 
         y = coordinates.y - document.body.scrollTop + window.screenTop; 
         }
      else {
         x = coordinates.x + window.screenX + (window.outerWidth - window.innerWidth) - window.pageXOffset; 
         y = coordinates.y + window.screenY + (window.outerHeight - 24 - window.innerHeight) - window.pageYOffset; 
         }
      }
   else if(document.all) {
      x = coordinates.x - document.body.scrollLeft + window.screenLeft; 
      y = coordinates.y - document.body.scrollTop + window.screenTop; 
      }
   else if(document.layers) {
      x = coordinates.x + window.screenX + (window.outerWidth - window.innerWidth) - window.pageXOffset; 
      y = coordinates.y + window.screenY + (window.outerHeight - 24 - window.innerHeight) - window.pageYOffset; 
      }
   coordinates.x = x; 
   coordinates.y = y; 
   return coordinates; 
   }
function AnchorPosition_getPageOffsetLeft(el) {
   var ol = el.offsetLeft; 
   while((el = el.offsetParent) != null) {
      ol += el.offsetLeft; 
      }
   return ol; 
   }
function AnchorPosition_getWindowOffsetLeft(el) {
   return AnchorPosition_getPageOffsetLeft(el) - document.body.scrollLeft; 
   }
function AnchorPosition_getPageOffsetTop(el) {
   var ot = el.offsetTop; 
   while((el = el.offsetParent) != null) {
      ot += el.offsetTop; 
      }
   return ot; 
   }
function AnchorPosition_getWindowOffsetTop(el) {
   return AnchorPosition_getPageOffsetTop(el) - document.body.scrollTop; 
   }
/* SOURCE FILE: PopupWindow.js */
function PopupWindow_getXYPosition(anchorname) {
   var coordinates; 
   if(this.type == "WINDOW") {
      coordinates = getAnchorWindowPosition(anchorname); 
      }
   else {
      coordinates = getAnchorPosition(anchorname); 
      }
   this.x = coordinates.x; 
   this.y = coordinates.y; 
   }
function PopupWindow_setSize(width, height) {
   this.width = width; 
   this.height = height; 
   }
function PopupWindow_populate(contents) {
   this.contents = contents; 
   this.populated = false; 
   }
function PopupWindow_setUrl(url) {
   this.url = url; 
   }
function PopupWindow_setWindowProperties(props) {
   this.windowProperties = props; 
   }
function PopupWindow_refresh() {
   if(this.divName != null) {
      if(this.use_gebi) {
         document.getElementById(this.divName).innerHTML = this.contents; 
         }
      else if(this.use_css) {
         document.all[this.divName].innerHTML = this.contents; 
         }
      else if(this.use_layers) {
         var d = document.layers[this.divName]; 
         d.document.open(); 
         d.document.writeln(this.contents); 
         d.document.close(); 
         }
      }
   else {
      if(this.popupWindow != null && !this.popupWindow.closed) {
         if(this.url != "") {
            this.popupWindow.location.href = this.url; 
            }
         else {
            this.popupWindow.document.open(); 
            this.popupWindow.document.writeln(this.contents); 
            this.popupWindow.document.close(); 
            }
         this.popupWindow.focus(); 
         }
      }
   }
function PopupWindow_showPopup(anchorname) {
   this.getXYPosition(anchorname); 
   this.x += this.offsetX; 
   this.y += this.offsetY; 
   if(!this.populated && (this.contents != "")) {
      this.populated = true; 
      this.refresh(); 
      }
   if(this.divName != null) {
      if(this.use_gebi) {
         document.getElementById(this.divName).style.left = this.x + "px"; 
         document.getElementById(this.divName).style.top = this.y; 
         document.getElementById(this.divName).style.visibility = "visible"; 
         }
      else if(this.use_css) {
         document.all[this.divName].style.left = this.x; 
         document.all[this.divName].style.top = this.y; 
         document.all[this.divName].style.visibility = "visible"; 
         }
      else if(this.use_layers) {
         document.layers[this.divName].left = this.x; 
         document.layers[this.divName].top = this.y; 
         document.layers[this.divName].visibility = "visible"; 
         }
      }
   else {
      if(this.popupWindow == null || this.popupWindow.closed) {
         if(this.x < 0) {
            this.x = 0; 
            }
         if(this.y < 0) {
            this.y = 0; 
            }
         if(screen && screen.availHeight) {
            if((this.y + this.height) > screen.availHeight) {
               this.y = screen.availHeight - this.height; 
               }
            }
         if(screen && screen.availWidth) {
            if((this.x + this.width) > screen.availWidth) {
               this.x = screen.availWidth - this.width; 
               }
            }
         var avoidAboutBlank = window.opera || ( document.layers && !navigator.mimeTypes['*']) || navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled); 
         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 + ""); 
         }
      this.refresh(); 
      }
   }
function PopupWindow_hidePopup() {
   if(this.divName != null) {
      if(this.use_gebi) {
         document.getElementById(this.divName).style.visibility = "hidden"; 
         }
      else if(this.use_css) {
         document.all[this.divName].style.visibility = "hidden"; 
         }
      else if(this.use_layers) {
         document.layers[this.divName].visibility = "hidden"; 
         }
      }
   else {
      if(this.popupWindow && !this.popupWindow.closed) {
         this.popupWindow.close(); 
         this.popupWindow = null; 
         }
      }
   }
function PopupWindow_isClicked(e) {
   if(this.divName != null) {
      if(this.use_layers) {
         var clickX = e.pageX; 
         var clickY = e.pageY; 
         var t = document.layers[this.divName]; 
         if((clickX > t.left) && (clickX < t.left + t.clip.width) && (clickY > t.top) && (clickY < t.top + t.clip.height)) {
            return true; 
            }
         else {
            return false; 
            }
         }
      else if(document.all) {
         var t = window.event.srcElement; 
         while(t.parentElement != null) {
            if(t.id == this.divName) {
               return true; 
               }
            t = t.parentElement; 
            }
         return false; 
         }
      else if(this.use_gebi && e) {
         var t = e.originalTarget; 
         while(t.parentNode != null) {
            if(t.id == this.divName) {
               return true; 
               }
            t = t.parentNode; 
            }
         return false; 
         }
      return false; 
      }
   return false; 
   }
function PopupWindow_hideIfNotClicked(e) {
   if(this.autoHideEnabled && !this.isClicked(e)) {
      this.hidePopup(); 
      }
   }
function PopupWindow_autoHide() {
   this.autoHideEnabled = true; 
   }
function PopupWindow_hidePopupWindows(e) {
   for(var i = 0; i < popupWindowObjects.length; i++) {
      if(popupWindowObjects[i] != null) {
         var p = popupWindowObjects[i]; 
         p.hideIfNotClicked(e); 
         }
      }
   }
function PopupWindow_attachListener() {
   if(document.layers) {
      document.captureEvents(Event.MOUSEUP); 
      }
   window.popupWindowOldEventListener = document.onmouseup; 
   if(window.popupWindowOldEventListener != null) {
      document.onmouseup = new Function("window.popupWindowOldEventListener();PopupWindow_hidePopupWindows();"); 
      }
   else {
      document.onmouseup = PopupWindow_hidePopupWindows; 
      }
   }
function PopupWindow() {
   if(!window.popupWindowIndex) {
      window.popupWindowIndex = 0; 
      }
   if(!window.popupWindowObjects) {
      window.popupWindowObjects = new Array(); 
      }
   if(!window.listenerAttached) {
      window.listenerAttached = true; 
      PopupWindow_attachListener(); 
      }
   this.index = popupWindowIndex++; 
   popupWindowObjects[this.index] = this; 
   this.divName = null; 
   this.popupWindow = null; 
   this.width = 0; 
   this.height = 0; 
   this.populated = false; 
   this.visible = false; 
   this.autoHideEnabled = false; 
   this.contents = ""; 
   this.url = ""; 
   this.windowProperties = "toolbar=no,location=no,status=no,menubar=no,scrollbars=auto,resizable,alwaysRaised,dependent,titlebar=no"; 
   if(arguments.length > 0) {
      this.type = "DIV"; 
      this.divName = arguments[0]; 
      }
   else {
      this.type = "WINDOW"; 
      }
   this.use_gebi = false; 
   this.use_css = false; 
   this.use_layers = false; 
   if(document.getElementById) {
      this.use_gebi = true; 
      }
   else if(document.all) {
      this.use_css = true; 
      }
   else if(document.layers) {
      this.use_layers = true; 
      }
   else {
      this.type = "WINDOW"; 
      }
   this.offsetX = 0; 
   this.offsetY = 0; 
   this.getXYPosition = PopupWindow_getXYPosition; 
   this.populate = PopupWindow_populate; 
   this.setUrl = PopupWindow_setUrl; 
   this.setWindowProperties = PopupWindow_setWindowProperties; 
   this.refresh = PopupWindow_refresh; 
   this.showPopup = PopupWindow_showPopup; 
   this.hidePopup = PopupWindow_hidePopup; 
   this.setSize = PopupWindow_setSize; 
   this.isClicked = PopupWindow_isClicked; 
   this.autoHide = PopupWindow_autoHide; 
   this.hideIfNotClicked = PopupWindow_hideIfNotClicked; 
   }
/* SOURCE FILE: ColorPicker2.js */
ColorPicker_targetInput = null; 
function ColorPicker_writeDiv() {
   document.writeln("<DIV ID=\"colorPickerDiv\" STYLE=\"position:absolute;visibility:hidden;\"> </DIV>"); 
   }
function ColorPicker_show(anchorname) {
   this.showPopup(anchorname); 
   }
function ColorPicker_pickColor(color, obj) {
   obj.hidePopup(); 
   pickColor(color); 
   }
function pickColor(color) {
   if(ColorPicker_targetInput == null) {
      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!"); 
      return; 
      }
   ColorPicker_targetInput.value = color; 
   ColorPicker_targetInput.onchange(); 
   }
function ColorPicker_select(inputobj, linkname) {
   if(inputobj.type != "text" && inputobj.type != "hidden" && inputobj.type != "textarea") {
      alert("colorpicker.select: Input object passed is not a valid form input object"); 
      window.ColorPicker_targetInput = null; 
      return; 
      }
   window.ColorPicker_targetInput = inputobj; 
   this.show(linkname); 
   }
function ColorPicker_highlightColor(c) {
   var thedoc = (arguments.length > 1) ? arguments[1] : window.document; 
   var d = thedoc.getElementById("colorPickerSelectedColor"); 
   d.style.backgroundColor = c; 
   d = thedoc.getElementById("colorPickerSelectedColorValue"); 
   d.innerHTML = c; 
   }
function ColorPicker() {
   var windowMode = false; 
   if(arguments.length == 0) {
      var divname = "colorPickerDiv"; 
      }
   else if(arguments[0] == "window") {
      var divname = ''; 
      windowMode = true; 
      }
   else {
      var divname = arguments[0]; 
      }
   if(divname != "") {
      var cp = new PopupWindow(divname); 
      }
   else {
      var cp = new PopupWindow(); 
      cp.setSize(225, 250); 
      }
   cp.currentValue = "#FFFFFF"; 
   cp.writeDiv = ColorPicker_writeDiv; 
   cp.highlightColor = ColorPicker_highlightColor; 
   cp.show = ColorPicker_show; 
   cp.select = ColorPicker_select; 
   var colors = new Array("#000000", "#000033", "#000066", "#000099", "#0000CC", "#0000FF", "#330000", "#330033", "#330066", "#330099", "#3300CC", "#3300FF", "#660000", "#660033", "#660066", "#660099", "#6600CC", "#6600FF", "#990000", "#990033", "#990066", "#990099", "#9900CC", "#9900FF", "#CC0000", "#CC0033", "#CC0066", "#CC0099", "#CC00CC", "#CC00FF", "#FF0000", "#FF0033", "#FF0066", "#FF0099", "#FF00CC", "#FF00FF", "#003300", "#003333", "#003366", "#003399", "#0033CC", "#0033FF", "#333300", "#333333", "#333366", "#333399", "#3333CC", "#3333FF", "#663300", "#663333", "#663366", "#663399", "#6633CC", "#6633FF", "#993300", "#993333", "#993366", "#993399", "#9933CC", "#9933FF", "#CC3300", "#CC3333", "#CC3366", "#CC3399", "#CC33CC", "#CC33FF", "#FF3300", "#FF3333", "#FF3366", "#FF3399", "#FF33CC", "#FF33FF", "#006600", "#006633", "#006666", "#006699", "#0066CC", "#0066FF", "#336600", "#336633", "#336666", "#336699", "#3366CC", "#3366FF", "#666600", "#666633", "#666666", "#666699", "#6666CC", "#6666FF", "#996600", "#996633", "#996666", "#996699", "#9966CC", "#9966FF", "#CC6600", "#CC6633", "#CC6666", "#CC6699", "#CC66CC", "#CC66FF", "#FF6600", "#FF6633", "#FF6666", "#FF6699", "#FF66CC", "#FF66FF", "#009900", "#009933", "#009966", "#009999", "#0099CC", "#0099FF", "#339900", "#339933", "#339966", "#339999", "#3399CC", "#3399FF", "#669900", "#669933", "#669966", "#669999", "#6699CC", "#6699FF", "#999900", "#999933", "#999966", "#999999", "#9999CC", "#9999FF", "#CC9900", "#CC9933", "#CC9966", "#CC9999", "#CC99CC", "#CC99FF", "#FF9900", "#FF9933", "#FF9966", "#FF9999", "#FF99CC", "#FF99FF", "#00CC00", "#00CC33", "#00CC66", "#00CC99", "#00CCCC", "#00CCFF", "#33CC00", "#33CC33", "#33CC66", "#33CC99", "#33CCCC", "#33CCFF", "#66CC00", "#66CC33", "#66CC66", "#66CC99", "#66CCCC", "#66CCFF", "#99CC00", "#99CC33", "#99CC66", "#99CC99", "#99CCCC", "#99CCFF", "#CCCC00", "#CCCC33", "#CCCC66", "#CCCC99", "#CCCCCC", "#CCCCFF", "#FFCC00", "#FFCC33", "#FFCC66", "#FFCC99", "#FFCCCC", "#FFCCFF", "#00FF00", "#00FF33", "#00FF66", "#00FF99", "#00FFCC", "#00FFFF", "#33FF00", "#33FF33", "#33FF66", "#33FF99", "#33FFCC", "#33FFFF", "#66FF00", "#66FF33", "#66FF66", "#66FF99", "#66FFCC", "#66FFFF", "#99FF00", "#99FF33", "#99FF66", "#99FF99", "#99FFCC", "#99FFFF", "#CCFF00", "#CCFF33", "#CCFF66", "#CCFF99", "#CCFFCC", "#CCFFFF", "#FFFF00", "#FFFF33", "#FFFF66", "#FFFF99", "#FFFFCC", "#FFFFFF"); 
   var total = colors.length; 
   var width = 18; 
   var cp_contents = ""; 
   var windowRef = (windowMode) ? "window.opener." : ""; 
   if(windowMode) {
      cp_contents += "<HTML><HEAD><TITLE>Select Color</TITLE></HEAD>"; 
      cp_contents += "<BODY MARGINWIDTH=0 MARGINHEIGHT=0 LEFTMARGIN=0 TOPMARGIN=0><CENTER>"; 
      }
   cp_contents += "<TABLE BGCOLOR='white' BORDER=1 CELLSPACING=1 CELLPADDING=0>"; 
   var use_highlight = (document.getElementById || document.all) ? true : false; 
   for(var i = 0; i < total; i++) {
      if((i % width) == 0) {
         cp_contents += "<TR>"; 
         }
      if(use_highlight) {
         var mo = 'onMouseOver="' + windowRef + 'ColorPicker_highlightColor(\'' + colors[i] + '\',window.document)"'; 
         }
      else {
         mo = ""; 
         }
      cp_contents += '<TD BGCOLOR="' + colors[i] + '"><FONT SIZE="-3"><A HREF="#" onClick="' + windowRef + 'ColorPicker_pickColor(\'' + colors[i] + '\',' + windowRef + 'window.popupWindowObjects[' + cp.index + ']);return false;" ' + mo + ' STYLE="text-decoration:none;">&nbsp;&nbsp;&nbsp;</A></FONT></TD>'; 
      if( ((i + 1) >= total) || (((i + 1) % width) == 0)) {
         cp_contents += "</TR>"; 
         }
      }
   if(document.getElementById) {
      var width1 = Math.floor(width / 2); 
      var width2 = width = width1; 
      cp_contents += "<TR><TD COLSPAN='" + width1 + "' BGCOLOR='#ffffff' ID='colorPickerSelectedColor'>&nbsp;</TD><TD COLSPAN='" + width2 + "' ALIGN='CENTER' ID='colorPickerSelectedColorValue'>#FFFFFF</TD></TR>"; 
      }
   cp_contents += "</TABLE>"; 
   if(windowMode) {
      cp_contents += "</CENTER></BODY></HTML>"; 
      }
   cp.populate(cp_contents + "\n"); 
   cp.offsetX =- 7; 
   cp.offsetY = - 180; 
   cp.autoHide(); 
   return cp; 
   }