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 = "
" + _CUtil_BuildColorTable("") + "
" +break +case "ForeColor": +this.szCaption = L_PUTITLETEXTCOLOR_TEXT +this.szHTML = "
" + _CUtil_BuildColorTable("") + "
" +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 += "" ++ "" ++ "" ++ "" +} +sz += "
" ++ "" ++ L_STYLESAMPLE_TEXT ++ "" ++ "
" +return sz +} +function _CFontFacesPopupRenderer_PrepareHTML() +{ +var sz = "" +for (var i=0; i < defaultFonts.length; i++) +{ +sz += "" ++ "" ++ "" ++ "" +} +// sz += "" +sz += "
" ++ "" ++ "ABC abc 123" +// + defaultFonts[i][1] ++ " " ++ (defaultFonts[i][2] ? ("(" + defaultFonts[i][1] + ")") : "") ++ "
" + L_CUSTOMFONT_TEXT + "
" +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 += ""
++ ""
++	""
+}
+sz += "
" ++ defaultParagraphs[i][0] ++ defaultParagraphs[i][1] ++ "" ++ "
" +return sz +} +function _CTablePopupRenderer_PrepareHTMLPage(szID,bDisplay) { +var sz="" ++ "" ++ "" ++ "" ++ "" ++ "" ++ "
" ++ "" ++ L_TABLEROWSANDCOLS_TEXT ++ "" ++ "
" ++ "" ++ L_TABLEPADDINGANDSPACING_TEXT ++ "" ++ "
" ++ "" ++ L_TABLEBORDERS_TEXT ++ "" ++ "
" ++ "" ++ L_TABLEBG_TEXT ++ "" ++ "
" ++ "
" ++ "" +if (szID=="tabNewBody") { +sz+= "
" ++ "

" + L_TABLEROWSANDCOLS_TEXT + "

" ++ "
" ++ L_TABLEINPUTROWS_TEXT ++ "" ++ "
" ++ L_TABLEINPUTCOLUMNS_TEXT ++ "" ++ "
" +} +else { +sz+= "
" ++ "

" + L_TABLEROWSANDCOLS_TEXT + "

" ++ "

" ++ "
" ++ "

" +} +sz += "
" ++ "

" + L_TABLEPADDINGANDSPACING_TEXT + "

" ++ L_TABLEINPUTCELLPADDING_TEXT ++ "" ++ "
" ++ L_TABLEINPUTCELLSPACING_TEXT ++ "" ++ "
" ++ "
" ++ "

" + L_TABLEBORDERS_TEXT + "

" ++ L_TABLEINPUTBORDER_TEXT ++ "" ++ "
" ++ L_TABLEINPUTBORDERCOLOR_TEXT ++ "
" ++ _CUtil_BuildColorTable("idBorder"+szID, "", "parent._CTablePopupRenderer_ColorSelect(this,'" + szID + "txtBorderColor')") ++ "
" ++ "
" ++ "

" + L_TABLEBG_TEXT + "

" ++ L_TABLEINPUTBGIMGURL_TEXT ++ "" ++ "
" ++ L_TABLEINPUTBGCOLOR_TEXT ++ "
" ++ _CUtil_BuildColorTable("idBackground"+szID, "", "parent._CTablePopupRenderer_ColorSelect(this,'" + szID + "txtBackgroundColor')") ++ "
" ++ "
" +if (szID=="tabNewBody") { +sz += "" ++ " " +} else { +sz += "" ++ " " +} +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;i0) +{ +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=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