diff --git a/docs/credits.txt b/docs/credits.txt
index 63e7a8544..1229cf53c 100644
--- a/docs/credits.txt
+++ b/docs/credits.txt
@@ -59,6 +59,8 @@ HTML::TagFilter......................William Ross
HTML::Template.......................Sam Tregar
+HTTP::BrowserDetect..................Lee Semel
+
Net::LDAP............................Graham Barr
Tie::CPHash..........................Christopher J. Madsen
diff --git a/lib/WebGUI/Form.pm b/lib/WebGUI/Form.pm
index 38ac95e47..7eeb82d67 100644
--- a/lib/WebGUI/Form.pm
+++ b/lib/WebGUI/Form.pm
@@ -15,6 +15,7 @@ package WebGUI::Form;
=cut
use strict;
+use HTTP::BrowserDetect;
use WebGUI::DateTime;
use WebGUI::International;
use WebGUI::Session;
@@ -639,7 +640,9 @@ sub hiddenList {
=cut
sub HTMLArea {
- my ($output, $rows, $columns);
+ my ($output, $rows, $columns, $htmlArea);
+ my $button = '
';
$output = '';
if ($session{setting}{richEditor} eq "edit-on-pro") {
$output .= '';
} else {
- $output .= ''."\n";
- $output .= ''."\n";
- }
- if ($session{setting}{richEditor} ne "built-in") {
- $output .= '
';
- }
+ my $browser = HTTP::BrowserDetect->new($session{env}{HTTP_USER_AGENT});
+ if ($browser->ie && $browser->version >= 5.5) {
+ $output .= ''."\n";
+ $output .= ''."\n";
+ $output .= '';
+ $htmlArea = 1;
+ } elsif ($browser->ie && $browser->version >= 5) {
+ $output .= '';
+ $output .= $button;
+### UNCOMMENT THIS WHEN MOZILLA 1.3 COMES OUT
+# } elsif ($browser->gecko && $browser->version >= 1.3) {
+# $output .= '';
+ # $output .= $button;
+ } else {
+ $output .= '';
+ $output .= $button;
+ }
+ }
$rows = $_[0]->{rows} || ($session{setting}{textAreaRows}+7);
$columns = $_[0]->{columns} || ($session{setting}{textAreaCols}+5);
$output .= textarea({
@@ -669,7 +721,7 @@ sub HTMLArea {
rows=>$rows,
extras=>$_[0]->{extras}.' onBlur="fixChars(this.form.'.$_[0]->{name}.')"'
});
- if ($session{setting}{richEditor} eq "built-in") {
+ if ($htmlArea) {
$output .= ''."\n";
diff --git a/www/extras/colorPicker.gif b/www/extras/colorPicker.gif
new file mode 100644
index 000000000..a36307109
Binary files /dev/null and b/www/extras/colorPicker.gif differ
diff --git a/www/extras/colorPicker.html b/www/extras/colorPicker.html
new file mode 100644
index 000000000..18829c301
--- /dev/null
+++ b/www/extras/colorPicker.html
@@ -0,0 +1,364 @@
+
+
+
Color Picker
+
+
+
+
+
+
+
+
diff --git a/www/extras/ie5edit.html b/www/extras/ie5edit.html
new file mode 100644
index 000000000..df284f615
--- /dev/null
+++ b/www/extras/ie5edit.html
@@ -0,0 +1,545 @@
+
+
+
+
+
+
+
+
+
+Edit Window
+
+
+
+
+
+
diff --git a/www/extras/ie5edit.js b/www/extras/ie5edit.js
new file mode 100644
index 000000000..37a3934a1
--- /dev/null
+++ b/www/extras/ie5edit.js
@@ -0,0 +1,669 @@
+// EDITOR PUBLIC (API)
+
+// POPUP (Link, table and image popup need to be worked on)
+function _CPopup_Init()
+{
+var sz = ""+ ""+ "";
+idPopup.document.open("text/html","replace");
+idPopup.document.write(sz);
+idPopup.document.close();
+}
+
+
+function _CPopup_InsertDatabound(eSelect)
+{
+if (eSelect.selectedIndex != 0)
+{
+var sElemName = eSelect.options[eSelect.selectedIndex].text;
+var iLen = sElemName.length
+sElemName = sElemName.replace(/"/g, '"')
+insertHTML('')
+eSelect.selectedIndex = 0;
+idEditbox.focus()
+}
+}
+function _CPopup_Hide()
+{
+document.all.idPopup.style.zIndex=-1
+document.all.idPopup.style.visibility = "hidden"
+idPopup.document._type = ""
+idPopup.document.onkeydown=idPopup.document.onmouseover=idPopup.document.onclick = null
+idEditbox.focus()
+}
+function _CPopup_Show(szType)
+{
+var oRenderer, szCacheKey = "PopupRenderer." + szType
+if (idPopup.document._type == szType)
+_CPopup_Hide()
+else
+{
+document.all.idPopup.style.zIndex = -1
+oRenderer = g_state.aCache[szCacheKey]
+if ((!oRenderer) || ("Link"==szType))
+g_state.aCache[szCacheKey] = oRenderer = new _CPopupRenderer(szType)
+// Force Sizing
+document.all.idPopup.style.visibility = ""
+idPopup.document.all.puRegion.style.pixelHeight = idPopup.document.all.puRegion.style.pixelWidth = 100
+idPopup.document._type = szType
+idPopup.document._renderer = oRenderer
+idPopup.document.all.caption.innerText = oRenderer.GetCaption()
+idPopup.document.all.content.innerHTML = oRenderer.GetHTML()
+idPopup.document.onkeydown = new Function("this._renderer.OnKeyDown()")
+idPopup.document.onmouseover = new Function("this._renderer.OnMouseOver()")
+idPopup.document.onclick = new Function("this._renderer.OnClick()")
+oRenderer.ResetContext(idPopup.document)
+setTimeout("_CPopupRenderer_Display('" + szType + "')",0)
+}
+}
+function _CPopupRenderer_Display(szType) {
+var oRenderer, szCacheKey = "PopupRenderer." + szType
+oRenderer = g_state.aCache[szCacheKey]
+if (oRenderer.autoSize) {
+idPopup.document.all.puRegion.style.pixelHeight = document.all.idPopup.style.pixelHeight = idPopup.document.all.puRegion.offsetHeight
+idPopup.document.all.puRegion.style.pixelWidth = document.all.idPopup.style.pixelWidth = idPopup.document.all.puRegion.offsetWidth + 50
+document.all.idPopup.style.pixelLeft = (document.body.clientWidth - idPopup.document.all.puRegion.offsetWidth) / 2
+}
+else {
+idPopup.document.all.puRegion.style.pixelHeight = document.all.idPopup.style.pixelHeight = document.body.clientHeight - idToolbar.offsetHeight- document.all.idMode.offsetHeight-20
+idPopup.document.all.puRegion.style.pixelWidth = document.all.idPopup.style.pixelWidth = document.body.clientWidth - 50
+document.all.idPopup.style.pixelLeft = 25
+}
+document.all.idPopup.style.zIndex=2
+idPopup.focus()
+}
+function _CPopupRenderer(szType)
+{
+this.szType = szType
+this.elCurrent = this.oDocument = null
+this.ResetContext = _CPopupRenderer_ResetContext
+this.GetCaption = _CPopupRenderer_GetCaption
+this.GetHTML = _CPopupRenderer_GetHTML
+this.autoSize = true
+this.OnMouseOver = new Function()
+this.OnKeyDown = _CListPopupRenderer_GenericOnKeyDown
+switch(szType)
+{
+case "formatblock":
+case "font":
+case "fontsize":
+this.OnMouseOver= _CListPopupRenderer_OnMouseOver
+this.OnKeyDown = _CListPopupRenderer_OnKeyDown
+case "BackColor":
+case "ForeColor":
+this.OnClick = _CListPopupRenderer_OnClick
+this.Highlight = _CListPopupRenderer_Highlight
+this.Select = _CListPopupRenderer_Select
+break
+default:
+this.OnClick = new Function()
+break
+}
+switch(szType)
+{
+case "formatblock":
+this.szCaption = L_PUTITLEPARAGRAPHSTYLE_TEXT
+this.PrepareHTML = _CFormatBlockPopupRenderer_PrepareHTML
+this.szHTML = this.PrepareHTML()
+break
+case "font":
+this.szCaption = L_PUTITLEFONTFACE_TEXT
+this.PrepareHTML = _CFontFacesPopupRenderer_PrepareHTML
+this.szHTML = this.PrepareHTML()
+break
+case "fontsize":
+this.szCaption = L_PUTITLEFONTSIZE_TEXT
+this.PrepareHTML =_CFontSizesPopupRenderer_PrepareHTML
+this.szHTML = this.PrepareHTML()
+break
+case "Link":
+this.szCaption = L_PUTITLELINK_TEXT
+this.PrepareHTML = _CLinkPopupRenderer_PrepareHTML
+this.szHTML = this.PrepareHTML()
+break
+case "Table":
+this.szCaption = L_PUTITLENEWTABLE_TEXT
+this.PrepareHTML = _CTablePopupRenderer_PrepareHTML
+this.szHTML = this.PrepareHTML()
+break
+case "Image":
+this.szCaption = L_PUTITLEIMAGE_TEXT
+this.PrepareHTML = _CImagePopupRenderer_PrepareHTML
+this.szHTML = this.PrepareHTML()
+this.autoSize = false
+break
+case "BackColor":
+this.szCaption = L_PUTITLEBGCOLOR_TEXT
+this.szHTML = ""
+break
+case "ForeColor":
+this.szCaption = L_PUTITLETEXTCOLOR_TEXT
+this.szHTML = ""
+break
+default:
+this.szCaption = ""
+break
+}
+}
+function _CPopupRenderer_ResetContext(oDoc)
+{
+this.oDocument = oDoc
+this.elCurrent = null
+if (this.szType=="Table") {
+var oSel = idEditbox.document.selection.createRange()
+var oBlock = (oSel.parentElement != null ? _CUtil_GetElement(oSel.parentElement(),"TABLE") : _CUtil_GetElement(oSel.item(0),"TABLE"))
+if (oBlock!=null) {
+oDoc.all.tabEdit.className=""
+oDoc.all.tabEditBodytxtPadding.value = oBlock.cellPadding
+oDoc.all.tabEditBodytxtSpacing.value = oBlock.cellSpacing
+oDoc.all.tabEditBodytxtBorder.value = oBlock.border
+oDoc.all.tabEditBodytxtBorderColor.value = oBlock.borderColor
+oDoc.all.tabEditBodytxtBackgroundImage.value = oBlock.background
+oDoc.all.tabEditBodytxtBackgroundColor.value = oBlock.bgColor
+}
+oDoc.elCurrent = oBlock
+}
+}
+function _CPopupRenderer_GetCaption()
+{
+return this.szCaption
+}
+function _CPopupRenderer_GetHTML()
+{
+return this.szHTML
+}
+function _CFontSizesPopupRenderer_PrepareHTML()
+{
+var sz = ""
+for (var i=1; i <= 7; i++)
+{
+sz += ""
++ ""
++ "| "
++ ""
++ L_STYLESAMPLE_TEXT
++ ""
++ " | "
++ "
"
+}
+sz += "
"
+return sz
+}
+function _CFontFacesPopupRenderer_PrepareHTML()
+{
+var sz = ""
+for (var i=0; i < defaultFonts.length; i++)
+{
+sz += ""
++ ""
++ "| "
++ ""
++ "ABC abc 123"
+// + defaultFonts[i][1]
++ " "
++ (defaultFonts[i][2] ? ("(" + defaultFonts[i][1] + ")") : "")
++ " | "
++ "
"
+}
+// sz += "| " + L_CUSTOMFONT_TEXT + " |
"
+sz += "
"
+return sz
+}
+function _CFontFacesPopupRenderer_InsertOther(el) {
+if (el._item=="custom") {
+el._item = "input"
+var sz = ""
+el.innerHTML = sz
+el.children[0].focus()
+}
+el.document.parentWindow.event.cancelBubble = true
+}
+function _CFormatBlockPopupRenderer_PrepareHTML()
+{
+var sz, defaultParagraphs = new Array()
+defaultParagraphs[0] = new Array("", L_STYLENORMAL_TEXT)
+defaultParagraphs[1] = new Array("
", L_STYLEFORMATTED_TEXT)
+for (var i=2; i <= 7; i++)
+defaultParagraphs[i] = new Array("", L_STYLEHEADING_TEXT + (i-1))
+sz = ""
+for (var i=0; i < defaultParagraphs.length; i++)
+{
+sz += ""
++ ""
++ "| "
++ defaultParagraphs[i][0]
++ defaultParagraphs[i][1]
++ "" + defaultParagraphs[i][0].substring(1)
++ " | "
++ "
"
+}
+sz += "
"
+return sz
+}
+function _CTablePopupRenderer_PrepareHTMLPage(szID,bDisplay) {
+var sz=""
++ ""
+return sz
+}
+function _CTablePopupRenderer_PrepareHTML()
+{
+var sz = "New Table | "
++ "Edit Table | |
| "
++ _CTablePopupRenderer_PrepareHTMLPage("tabNewBody",true)
++ _CTablePopupRenderer_PrepareHTMLPage("tabEditBody",false)
++ " |
"
+return sz
+}
+function _CTablePopupRenderer_Select(el,szID, id)
+{
+var d = el.document
+for (var i = 1; i < 5; i++)
+d.all[szID + "prop" + i].style.display = "none"
+d.all[szID + id].style.display = ""
+}
+function _CTablePopupRenderer_ColorSelect(el,id)
+{
+el.document.all[id].value = el.bgColor
+}
+function _CTablePopupRenderer_AddRow(el) {
+var elRow = el.document.elCurrent.insertRow()
+for (var i=0;i"
+for (var r=0; r < d.all[szID + "txtRows"].value; r++)
+{
+sz += ""
+for (var c=0; c < d.all[szID + "txtColumns"].value; c++)
+sz += "| | "
+sz += "
"
+}
+sz += ""
+insertHTML(sz)
+} else
+if (d.elCurrent) {
+d.elCurrent.cellPadding = d.all.tabEditBodytxtPadding.value
+d.elCurrent.cellSpacing = d.all.tabEditBodytxtSpacing.value
+d.elCurrent.border = d.all.tabEditBodytxtBorder.value
+d.elCurrent.className = (d.elCurrent.border=="" || d.elCurrent.border==0) ? "NOBORDER" : ""
+d.elCurrent.borderColor = d.all.tabEditBodytxtBorderColor.value
+d.elCurrent.bgColor = d.all.tabEditBodytxtBackgroundColor.value
+d.elCurrent.background = d.all.tabEditBodytxtBackgroundImage.value
+}
+_CPopup_Hide()
+}
+function _CListPopupRenderer_OnClick()
+{
+var elTD = _CUtil_GetElement(this.oDocument.parentWindow.event.srcElement, "TD")
+if (elTD && elTD._item) this.Select(elTD)
+}
+function _CListPopupRenderer_GenericOnKeyDown() {
+var ev = this.oDocument.parentWindow.event
+if (ev.keyCode==27) _CPopup_Hide()
+}
+function _CListPopupRenderer_OnKeyDown()
+{
+var el
+var iRow = iCell = 0
+var ev = this.oDocument.parentWindow.event
+var idList = this.oDocument.all.idList
+var elTR = _CUtil_GetElement(this.elCurrent,"TR")
+var elTD = _CUtil_GetElement(this.elCurrent,"TD")
+if (elTR != null)
+{
+iRow = elTR.rowIndex
+iCell = elTD.cellIndex
+}
+switch (ev.keyCode)
+{
+case 37:
+iCell--
+if (iCell < 0)
+iCell = idList.rows[iRow].cells.length-1
+break
+case 38:
+iRow--
+if (iRow < 0)
+iRow = idList.rows.length-1
+break
+case 39:
+iCell++
+if (iCell > idList.rows[iRow].cells.length-1)
+iCell = 0
+break
+case 40:
+iRow++
+if (iRow > idList.rows.length-1)
+iRow = 0
+break
+case 13:
+break;
+case 27:
+_CPopup_Hide()
+break;
+default:
+return;
+}
+el = idList.rows[iRow].cells[iCell]
+if (el && el._item)
+if (13 == ev.keyCode) {
+ev.keyCode=0
+this.Select(el)
+}
+else
+this.Highlight(el)
+}
+function _CListPopupRenderer_OnMouseOver()
+{
+var el = _CUtil_GetElement(this.oDocument.parentWindow.event.srcElement, "TD")
+if (el && el._item && el != this.elCurrent)
+this.Highlight(el)
+}
+function _CListPopupRenderer_Highlight(el)
+{
+var elC = this.elCurrent
+if (elC) elC.style.borderWidth = elC.style.borderColor = elC.style.borderStyle = ""
+el.style.borderWidth = "1px"
+el.style.borderColor = "green"
+el.style.borderStyle = "solid"
+this.elCurrent = el
+}
+function _CListPopupRenderer_Select(elTD)
+{
+g_state.RestoreSelection()
+var el = elTD.children[0]
+switch (this.szType)
+{
+case "font":
+_Format("FontName",el.face)
+break
+case "fontsize":
+_Format("FontSize",el.size)
+break
+case "formatblock":
+_Format("FormatBlock","<" + el.tagName + ">")
+break
+case "ForeColor":
+_Format("ForeColor", elTD.bgColor)
+break
+case "BackColor":
+_Format("BackColor",elTD.bgColor)
+break
+}
+_CPopup_Hide()
+}
+function _CLinkPopupRenderer_AddLink(d)
+{
+var szURL = d.all.urlValue.value
+var szType = d.all.urlType[d.all.urlType.selectedIndex].text
+var oSel = g_state.GetSelection()
+var sType = oSel.type
+szURL = ((0 == szURL.indexOf("mailto:") || 0 == szURL.indexOf("http://") || 0 == szURL.indexOf("ftp://")) ? "" : szType) + szURL
+if (szURL!="")
+{
+if ((oSel.parentElement) && (oSel.text==""))
+{
+oSel.expand("word")
+if (oSel.text=="")
+{
+var oStore = oSel.duplicate()
+if (d.all.pageList) {
+var idx = d.all.pageList.selectedIndex
+if (d.all.pageList[idx].value==szURL)
+oSel.text = d.all.pageList[idx].text
+else
+oSel.text = szURL
+}
+else
+oSel.text = szURL
+oSel.setEndPoint("StartToStart",oStore)
+}
+oSel.select()
+sType="Text"
+}
+if ((oSel.item) && (oSel.item(0).tagName=="IMG"))
+{
+oSel.item(0).width = oSel.item(0).offsetWidth
+oSel.item(0).height = oSel.item(0).offsetHeight
+oSel.item(0).border = (d.all.displayBorder.checked) ? 1 : ""
+}
+if (d.all.urlValue.value!="")
+oSel.execCommand("CreateLink",false,szURL)
+else
+oSel.execCommand("UnLink",false,szURL)
+}
+idEditbox.focus()
+}
+function _CLinkPopupRenderer__UpdateURL(oDoc,szURL) {
+var szType = szURL.substring(0,szURL.indexOf(":"))
+for (var i=0;i"
+if (g_state.aLinks.length>0)
+{
+sz += ""
++ ""
++ ""
+/*
++ L_LINKSELECT_TEXT
++ ""
+*/
+}
+var arTypes = new Array("","http","ftp","mailto")
+var arText = new Array("","http://","ftp://","mailto:")
+var szType = szURL.substring(0,szURL.indexOf(":"))
+if (("http"==szType) || ("ftp"==szType))
+szURL = szURL.substring(szURL.indexOf("//")+2)
+else
+szURL = szURL.substring(szURL.indexOf(":")+1)
+sz += ""
++ " "
++ L_LINKWEB_TEXT
++ ""
+if (bImg)
+{
+sz += ""
++ " "
++ ""
++ L_LINKIMGBORDER_TEXT
+}
+sz += ""
++ " | "
++ "
"
++ ""
++ "| "
++ " "
++ " | "
++ "
"
++ ""
+return sz
+}
+// UTIL
+function _CUtil_GetElement(oEl,sTag)
+{
+while (oEl!=null && oEl.tagName!=sTag)
+oEl = oEl.parentElement
+return oEl
+}
+function _CUtil_BuildColorTable(sID,fmt,szClick)
+{
+var sz, cPick = new Array("00","33","66","99","CC","FF"), iCnt=2
+var iColors = cPick.length, szColor = ""
+sz = " | "
++ ""
+for (var r=0;r"
+for (var g=iColors-1;g>=0;g--)
+for (var b=iColors-1;b>=0;b--) {
+szColor = cPick[r]+cPick[g]+cPick[b]
+sz+="| | "
+}
+sz+=""
+}
+sz+=" |
"
+return sz
+}
+function _CUtil_GetBlock(oEl)
+{
+var sBlocks = "|H1|H2|H3|H4|H5|H6|P|PRE|LI|TD|DIV|BLOCKQUOTE|DT|DD|TABLE|HR|IMG|"
+while ((oEl!=null) && (sBlocks.indexOf("|"+oEl.tagName+"|")==-1))
+oEl = oEl.parentElement
+return oEl
+}
diff --git a/www/extras/lastResortEdit.html b/www/extras/lastResortEdit.html
new file mode 100644
index 000000000..10d17118c
--- /dev/null
+++ b/www/extras/lastResortEdit.html
@@ -0,0 +1,108 @@
+
+
+Edit Window
+
+
+
+
+
+
diff --git a/www/extras/toolbar.gif b/www/extras/toolbar.gif
new file mode 100644
index 000000000..8dae9ec4c
Binary files /dev/null and b/www/extras/toolbar.gif differ