From 9ab34e20231984b8c321ca6d506379981e9ea942 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Mon, 31 May 2004 20:34:11 +0000 Subject: [PATCH] * Message entry using Kevin Roth's excellent cross-platform richtext editing script. --- webcit/ChangeLog | 5 + webcit/README.txt | 1 + webcit/auth.c | 2 +- webcit/messages.c | 37 +- webcit/roomops.c | 6 +- webcit/serv_func.c | 2 +- webcit/static/bgcolor.gif | Bin 0 -> 148 bytes webcit/static/blackdot.gif | Bin 0 -> 807 bytes webcit/static/bold.gif | Bin 0 -> 81 bytes webcit/static/centre.gif | Bin 0 -> 76 bytes webcit/static/copy.gif | Bin 0 -> 118 bytes webcit/static/cut.gif | Bin 0 -> 100 bytes webcit/static/email.gif | Bin 0 -> 374 bytes webcit/static/hr.gif | Bin 0 -> 77 bytes webcit/static/hyperlink.gif | Bin 0 -> 196 bytes webcit/static/image.gif | Bin 0 -> 203 bytes webcit/static/indent.gif | Bin 0 -> 96 bytes webcit/static/italic.gif | Bin 0 -> 84 bytes webcit/static/justifyfull.gif | Bin 0 -> 76 bytes webcit/static/left_just.gif | Bin 0 -> 76 bytes webcit/static/list.gif | Bin 0 -> 88 bytes webcit/static/numbered_list.gif | Bin 0 -> 90 bytes webcit/static/outdent.gif | Bin 0 -> 96 bytes webcit/static/palette.htm | 126 ++++++ webcit/static/paste.gif | Bin 0 -> 152 bytes webcit/static/redo.gif | Bin 0 -> 88 bytes webcit/static/richtext.js | 600 +++++++++++++++++++++++++++ webcit/static/richtext_compressed.js | 1 + webcit/static/right_just.gif | Bin 0 -> 76 bytes webcit/static/rte.css | 31 ++ webcit/static/smiley.gif | Bin 0 -> 310 bytes webcit/static/spellcheck.gif | Bin 0 -> 107 bytes webcit/static/textcolor.gif | Bin 0 -> 109 bytes webcit/static/underline.gif | Bin 0 -> 93 bytes webcit/static/undo.gif | Bin 0 -> 89 bytes webcit/webcit.c | 62 ++- webcit/webcit.h | 6 +- 37 files changed, 854 insertions(+), 25 deletions(-) create mode 100644 webcit/static/bgcolor.gif create mode 100644 webcit/static/blackdot.gif create mode 100644 webcit/static/bold.gif create mode 100644 webcit/static/centre.gif create mode 100644 webcit/static/copy.gif create mode 100644 webcit/static/cut.gif create mode 100644 webcit/static/email.gif create mode 100644 webcit/static/hr.gif create mode 100644 webcit/static/hyperlink.gif create mode 100644 webcit/static/image.gif create mode 100644 webcit/static/indent.gif create mode 100644 webcit/static/italic.gif create mode 100644 webcit/static/justifyfull.gif create mode 100644 webcit/static/left_just.gif create mode 100644 webcit/static/list.gif create mode 100644 webcit/static/numbered_list.gif create mode 100644 webcit/static/outdent.gif create mode 100644 webcit/static/palette.htm create mode 100644 webcit/static/paste.gif create mode 100644 webcit/static/redo.gif create mode 100644 webcit/static/richtext.js create mode 100644 webcit/static/richtext_compressed.js create mode 100644 webcit/static/right_just.gif create mode 100644 webcit/static/rte.css create mode 100644 webcit/static/smiley.gif create mode 100644 webcit/static/spellcheck.gif create mode 100644 webcit/static/textcolor.gif create mode 100644 webcit/static/underline.gif create mode 100644 webcit/static/undo.gif diff --git a/webcit/ChangeLog b/webcit/ChangeLog index fbd4e47fe..a81b38814 100644 --- a/webcit/ChangeLog +++ b/webcit/ChangeLog @@ -1,4 +1,8 @@ $Log$ +Revision 510.5 2004/05/31 20:34:11 ajc +* Message entry using Kevin Roth's excellent cross-platform richtext + editing script. + Revision 510.4 2004/05/31 15:54:13 ajc * "text" and "HTML" options for message entry. @@ -1821,3 +1825,4 @@ Sun Dec 6 19:50:55 EST 1998 Art Cancro 1998-12-03 Nathan Bryant * webserver.c: warning fix + diff --git a/webcit/README.txt b/webcit/README.txt index 4b5692297..aa1b553b8 100644 --- a/webcit/README.txt +++ b/webcit/README.txt @@ -6,6 +6,7 @@ Nathan Bryant Nick Grossman Andru Luvisi + Kevin Roth This program is free software released under the terms of the GNU General Public License. Please read COPYING.txt for more licensing information. diff --git a/webcit/auth.c b/webcit/auth.c index 5f4477394..c6a280e9c 100644 --- a/webcit/auth.c +++ b/webcit/auth.c @@ -49,7 +49,7 @@ void display_login(char *mesg) output_headers(3); if (mesg != NULL) if (strlen(mesg) > 0) { - stresc(buf, mesg, 0); + stresc(buf, mesg, 0, 0); svprintf("mesg", WCS_STRING, "%s", buf); } diff --git a/webcit/messages.c b/webcit/messages.c index 7f373d2f8..fbb15c96b 100644 --- a/webcit/messages.c +++ b/webcit/messages.c @@ -1482,13 +1482,13 @@ void display_enter(void) now = time(NULL); fmt_date(buf, now); strcat(&buf[strlen(buf)], " from "); - stresc(&buf[strlen(buf)], WC->wc_username, 1); + stresc(&buf[strlen(buf)], WC->wc_username, 1, 1); if (strlen(bstr("recp")) > 0) { strcat(&buf[strlen(buf)], " to "); - stresc(&buf[strlen(buf)], bstr("recp"), 1); + stresc(&buf[strlen(buf)], bstr("recp"), 1, 1); } strcat(&buf[strlen(buf)], " in "); - stresc(&buf[strlen(buf)], WC->wc_roomname, 1); + stresc(&buf[strlen(buf)], WC->wc_roomname, 1, 1); svprintf("BOXTITLE", WCS_STRING, buf); do_template("beginbox"); @@ -1496,13 +1496,15 @@ void display_enter(void) wprintf("
\n"); + "NAME=\"enterform\"" + "onSubmit=\"return submitForm();\"" + ">\n"); wprintf("\n", bstr("recp")); wprintf("\n", now); - wprintf("\""); + wprintf("\""); + /* "onLoad=\"document.enterform.msgtext.focus();\" " */ wprintf("Subject (optional):" "text \n"); wprintf("HTML \n"); wprintf("" "
\n"); + wprintf("\n" + " \n" + " \n" + " \n"); + +/* wprintf("
\n"); +*/ /* Enumerate any attachments which are already in place... */ for (att = WC->first_attachment; att != NULL; att = att->next) { diff --git a/webcit/roomops.c b/webcit/roomops.c index 042144d63..eab01a968 100644 --- a/webcit/roomops.c +++ b/webcit/roomops.c @@ -114,7 +114,7 @@ void room_tree_list(struct roomlisting *rp) urlescputs(rmname); wprintf("\""); wprintf(">"); - escputs1(rmname, 1); + escputs1(rmname, 1, 1); if ((f & QR_DIRECTORY) && (f & QR_NETWORK)) wprintf("}"); else if (f & QR_DIRECTORY) @@ -1360,7 +1360,7 @@ void display_whok(void) } output_headers(1); - stresc(buf, WC->wc_roomname, 1); + stresc(buf, WC->wc_roomname, 1, 1); svprintf("BOXTITLE", WCS_STRING, "Access control list for %s", buf); do_template("beginbox"); @@ -1986,7 +1986,7 @@ void do_rooms_view(struct folder *fold, int max_folders, int num_floors) { /* Begin inner box */ extract(buf, fold[i].name, levels-1); - stresc(boxtitle, buf, 1); + stresc(boxtitle, buf, 1, 0); svprintf("BOXTITLE", WCS_STRING, boxtitle); do_template("beginbox"); diff --git a/webcit/serv_func.c b/webcit/serv_func.c index 98fb3c071..924f0a089 100644 --- a/webcit/serv_func.c +++ b/webcit/serv_func.c @@ -193,7 +193,7 @@ void text_to_server(char *ptr, int convert_to_html) } } else if ((convert_to_html)&&(strchr("#&;`'|*?-~<>^()[]{}$\\", ch) != NULL)) { sprintf(conv, "%c", ch); - stresc(&buf[strlen(buf)], conv, 0); + stresc(&buf[strlen(buf)], conv, 0, 0); } else { a = strlen(buf); buf[a + 1] = 0; diff --git a/webcit/static/bgcolor.gif b/webcit/static/bgcolor.gif new file mode 100644 index 0000000000000000000000000000000000000000..55fcf1ba65532afcb65eb8f958258aa2230fb89c GIT binary patch literal 148 zcmZ?wbhEHblw^=#Sj5Kg|33o*Ljw>1sRIWN{09RdTk$6gBLf2)gAS0*08-1q9GS7} z&Od`wo~v_}SPEkUqL0@&8x$-`6uLc=&t+rkEmm>WHCM013K%fGHU22d!jiZwMDovs tQ;l6WyxkmEEKAT1P0?Mxj@3bL_W1^ms@Sm2*WZ1&bX|Y@eGdzRH2_EwIXD0S literal 0 HcmV?d00001 diff --git a/webcit/static/blackdot.gif b/webcit/static/blackdot.gif new file mode 100644 index 0000000000000000000000000000000000000000..f79319f818d144f6cb1241bf81f8bb642bc4f4ed GIT binary patch literal 807 wcmZ?wbhEHbWMp7uXlED&qaiS&LqPE-3()`n8FWCQ0Ll{#94risEG!Jx02WLH%>V!Z literal 0 HcmV?d00001 diff --git a/webcit/static/bold.gif b/webcit/static/bold.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdb3259c3d686e7d66d33667243a6ac3909b01e5 GIT binary patch literal 81 zcmZ?wbhEHblw^=#XkcUjg8%>jEB<5wG8q|kKzxu41CvHi|H{*E`4`XG62-CUT$r?f g;{%nVhiUT;O!s=aYSV`9ZP$CB|2p@*hLOP<0LaQ7kN^Mx literal 0 HcmV?d00001 diff --git a/webcit/static/centre.gif b/webcit/static/centre.gif new file mode 100644 index 0000000000000000000000000000000000000000..f98c86a7848ad61de8e8406446bc98d43c0718f1 GIT binary patch literal 76 zcmZ?wbhEHblw^=#XkcUjg8%>jEB<5wG8q|kKzxu41Cw%3|H{*E`4`XGBGs_@+P3z+ am0})DNuf#VQ`=Tw+4srk`nPBX25SH&PZ_5G literal 0 HcmV?d00001 diff --git a/webcit/static/copy.gif b/webcit/static/copy.gif new file mode 100644 index 0000000000000000000000000000000000000000..faebb18c4748bef16377ef00d0e577676c5dce1a GIT binary patch literal 118 zcmZ?wbhEHblw^=#n8?iV|Nnmm5NH506o0ZXGB7YR=zs)3@(fJwbNW}Fe#^gj&X!pX zn`Id*8Y1srXAOe6=537GaN~3d3*XYUCl;$1yKx#G Ro3m!y=HBnzeBIm()&NSnEENC% literal 0 HcmV?d00001 diff --git a/webcit/static/cut.gif b/webcit/static/cut.gif new file mode 100644 index 0000000000000000000000000000000000000000..ca60a1aa3a0a1bec0a2a313a0014a4dfa863ac58 GIT binary patch literal 100 zcmZ?wbhEHblw^=#n8?h)z|a812M!$g|Np<@PZmZ724)5wpa=sZ|wm9z3(**RCZIC=HJD;GZheBpQFoF^}@ef@fCR)6K56RTdl*!}a&H*H5BGd3>J$TiAdCm!?S{8?5harw&J>LgY*L7tu-1v#!( zm%IWlOD3eC6u3>o;yVGFSruLI0o% literal 0 HcmV?d00001 diff --git a/webcit/static/hr.gif b/webcit/static/hr.gif new file mode 100644 index 0000000000000000000000000000000000000000..c98da9d00c7ab9c298d7d582f4162440dd3991f6 GIT binary patch literal 77 zcmZ?wbhEHblw^=#n8?I1bLLEAW8?q-|1&T!DE?$&WME)o&;ha;K=KSsa#Q+Oo_@=} gc+Qqv-J9=e{NQinbC~w*+8$Vz;NKe0S1Qu4Gj(d|NmzI@}Ud{OrZFag^_`QgFy!* z1u}zyrBL9c=jy!{ug~tD@1jwsP{@(NFu_G}hvS;6hY$FE2nfp>E?{!@F@OAnWmCgL zg&4`g6DsF+etbHqoiWteASRWWc|G$9#&ZnJRkJ;rAB53L1;s<+3^YR3=WEJVjoR!5RP?FhWEC literal 0 HcmV?d00001 diff --git a/webcit/static/image.gif b/webcit/static/image.gif new file mode 100644 index 0000000000000000000000000000000000000000..8cbba167cc657142948cae1399abec619c4cf7cc GIT binary patch literal 203 zcmZ?wbhEHblw^=#*v!T7|Ns9v=f0%PWSDbKlwl@=YBIwd3#|ta9vB-N&zw0ED9eBf z6o0ZXGB9v4=zxSlW-zc+1f29-z1QOP+1>038hug%b27S^mTIv$P1-cGa^GQvH^)7b z%^dS0Dt<<7c(}k}#@3$0vY#WkWy+cv95;xH@a^Z$IIb+i)2_S1giT^w+uROaBL%nD svy9pe-W(QVNU<&~Y;F)`VDahc?(^voshC_TH*NZinX_g~3Nly&0Pegob`D7U0#*E2@M7YYXI`)Ab|h? literal 0 HcmV?d00001 diff --git a/webcit/static/italic.gif b/webcit/static/italic.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b1485b4371c65e512d6811d622af8270def2a33 GIT binary patch literal 84 zcmZ?wbhEHblw^=#n8?Hc1Pu)h|Ns97G8BKZFfuSOG3bCqLGlbts#E$`o_@=}c+Qq6 iuA+Tv?0PKHFB+8?xKzuRtzMe>(&zfO-sj$o4Auakk{Pf7 literal 0 HcmV?d00001 diff --git a/webcit/static/justifyfull.gif b/webcit/static/justifyfull.gif new file mode 100644 index 0000000000000000000000000000000000000000..b12528b9f4e0666f3ab5642d80f0f34b2d0c3544 GIT binary patch literal 76 zcmZ?wbhEHblw^=#XkcUjg8%>jEB<5wG8q|kKzxu41Cw%3|H{*E`4`XGBGs_@+O>D{ aOGP=lM1IZ`-nCNb^v+K{*UMrV7_0#`iW%jEB<5wG8q|kKzxu41Cw%3|H{*E`4`XGBGs_@+O>Cg bTMxQ3Jqk%$KD|i$%DzuN*T2OuFjxZsOtTwu literal 0 HcmV?d00001 diff --git a/webcit/static/list.gif b/webcit/static/list.gif new file mode 100644 index 0000000000000000000000000000000000000000..b3018d9f2aa504d1fdc1fdf52d56be68675c3162 GIT binary patch literal 88 zcmZ?wbhEHblw^=#n8?Jyz|a81|Ns97l8QfB7#SFt7<7Pa29P`hljfBEm8akGFP^hS ou0i+EffoKI{^e8ETxMmS=)1{z+%0O|nim&7o%{YTkb%J(01IdyB>(^b literal 0 HcmV?d00001 diff --git a/webcit/static/numbered_list.gif b/webcit/static/numbered_list.gif new file mode 100644 index 0000000000000000000000000000000000000000..d1a4dbcad69be87aad112c16ec6b70d5d3b9af77 GIT binary patch literal 90 zcmZ?wbhEHblw^=#n8?Hc1`YrJ{|7P@f3h$#FfcLbfCNGE3{2Wn`d6NQ%fEPz!3EJZ njC;OUY0eaz=98v2>v+>jgMFI>_p7{iP3b)MkDtemi@_QIFrXYm literal 0 HcmV?d00001 diff --git a/webcit/static/outdent.gif b/webcit/static/outdent.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa3c1b6aad8e4a6209277e391c7bcb733dc4fd96 GIT binary patch literal 96 zcmZ?wbhEHblw^=#n8?Jyz|a81|Ns97l8QfB7#SFt7<7Pa29P`hli`&9m8akGFAhn( wB~f(M=Dt3I$8pPsiV0E0+ZGh|&25o-!aZ$OyLZ)9?prNK7JWRS!N6b*0P?6HaR2}S literal 0 HcmV?d00001 diff --git a/webcit/static/palette.htm b/webcit/static/palette.htm new file mode 100644 index 000000000..af4954b47 --- /dev/null +++ b/webcit/static/palette.htm @@ -0,0 +1,126 @@ + + + + + Text Color + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/webcit/static/paste.gif b/webcit/static/paste.gif new file mode 100644 index 0000000000000000000000000000000000000000..9bcc76ac2072414f8b6c5323250769d322aeff2a GIT binary patch literal 152 zcmZ?wbhEHblw^=#Sj5f%1`YrJ|8D>Rh64u<{Qu7Y(6um%7?gFkTq literal 0 HcmV?d00001 diff --git a/webcit/static/redo.gif b/webcit/static/redo.gif new file mode 100644 index 0000000000000000000000000000000000000000..b51d6b842f97aa2fb73ae646ad5cab9ce46a592b GIT binary patch literal 88 zcmZ?wbhEHblw^=#n8?Jyz|a5$|Ns97vJ`)^FfuSOG3Wr<3?O+1Ce11RD^I`WUp!~a ot?td73z|v9`l(m#vFq|1PKq+K8{3}$I`{owFav`%0H?kn+yDRo literal 0 HcmV?d00001 diff --git a/webcit/static/richtext.js b/webcit/static/richtext.js new file mode 100644 index 000000000..fe4cae332 --- /dev/null +++ b/webcit/static/richtext.js @@ -0,0 +1,600 @@ +// Cross-Browser Rich Text Editor +// http://www.kevinroth.com/rte/demo.htm +// Written by Kevin Roth (kevin@NOSPAMkevinroth.com - remove NOSPAM) + +//init variables +var isRichText = false; +var rng; +var currentRTE; +var allRTEs = ""; + +var isIE; +var isGecko; +var isSafari; +var isKonqueror; + +var imagesPath; +var includesPath; +var cssFile; + + +function initRTE(imgPath, incPath, css) { + //set browser vars + var ua = navigator.userAgent.toLowerCase(); + isIE = ((ua.indexOf("msie") != -1) && (ua.indexOf("opera") == -1) && (ua.indexOf("webtv") == -1)); + isGecko = (ua.indexOf("gecko") != -1); + isSafari = (ua.indexOf("safari") != -1); + isKonqueror = (ua.indexOf("konqueror") != -1); + + //check to see if designMode mode is available + if (document.getElementById && document.designMode && !isSafari && !isKonqueror) { + isRichText = true; + } + + if (!isIE) document.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT | Event.MOUSEDOWN | Event.MOUSEUP); + document.onmouseover = raiseButton; + document.onmouseout = normalButton; + document.onmousedown = lowerButton; + document.onmouseup = raiseButton; + + //set paths vars + imagesPath = imgPath; + includesPath = incPath; + cssFile = css; + + if (isRichText) document.writeln(''); + + //for testing standard textarea, uncomment the following line + //isRichText = false; +} + +function writeRichText(rte, html, width, height, buttons, readOnly) { + if (isRichText) { + if (allRTEs.length > 0) allRTEs += ";"; + allRTEs += rte; + writeRTE(rte, html, width, height, buttons, readOnly); + } else { + writeDefault(rte, html, width, height, buttons, readOnly); + } +} + +function writeDefault(rte, html, width, height, buttons, readOnly) { + if (!readOnly) { + document.writeln(''); + } else { + document.writeln(''); + } +} + +function raiseButton(e) { + if (isIE) { + var el = window.event.srcElement; + } else { + var el= e.target; + } + + className = el.className; + if (className == 'rteImage' || className == 'rteImageLowered') { + el.className = 'rteImageRaised'; + } +} + +function normalButton(e) { + if (isIE) { + var el = window.event.srcElement; + } else { + var el= e.target; + } + + className = el.className; + if (className == 'rteImageRaised' || className == 'rteImageLowered') { + el.className = 'rteImage'; + } +} + +function lowerButton(e) { + if (isIE) { + var el = window.event.srcElement; + } else { + var el= e.target; + } + + className = el.className; + if (className == 'rteImage' || className == 'rteImageRaised') { + el.className = 'rteImageLowered'; + } +} + +function writeRTE(rte, html, width, height, buttons, readOnly) { + if (readOnly) buttons = false; + + //adjust minimum table widths + if (isIE) { + if (buttons && (width < 600)) width = 600; + var tablewidth = width; + } else { + if (buttons && (width < 500)) width = 500; + var tablewidth = width + 4; + } + + if (buttons == true) { + document.writeln(''); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln('
'); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln('
'); + document.writeln(''); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + if (isIE) { + document.writeln(' '); + } +// document.writeln(' '); +// document.writeln(' '); +// document.writeln(' '); +// document.writeln(' '); +// document.writeln(' '); +// document.writeln(' '); +// document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln('
BoldItalicUnderlineAlign LeftCenterAlign RightJustify FullHorizontal RuleOrdered ListUnordered ListOutdentIndent
Text Color
Background Color
Insert LinkAdd ImageSpell CheckCutCopyPasteUndoRedo
'); + } + document.writeln(''); + if (!readOnly) document.writeln('
 View Source'); + document.writeln(''); + document.writeln(''); + document.getElementById('hdn' + rte).value = html; + enableDesignMode(rte, html, readOnly); +} + +function enableDesignMode(rte, html, readOnly) { + var frameHtml = "\n"; + frameHtml += "\n"; + //to reference your stylesheet, set href property below to your stylesheet path and uncomment + if (cssFile.length > 0) { + frameHtml += "\n"; + } else { + frameHtml += "\n"; + } + frameHtml += "\n"; + frameHtml += "\n"; + frameHtml += html + "\n"; + frameHtml += "\n"; + frameHtml += ""; + + if (document.all) { + var oRTE = frames[rte].document; + oRTE.open(); + oRTE.write(frameHtml); + oRTE.close(); + if (!readOnly) oRTE.designMode = "On"; + } else { + try { + if (!readOnly) document.getElementById(rte).contentDocument.designMode = "on"; + try { + var oRTE = document.getElementById(rte).contentWindow.document; + oRTE.open(); + oRTE.write(frameHtml); + oRTE.close(); + if (isGecko && !readOnly) { + //attach a keyboard handler for gecko browsers to make keyboard shortcuts work + oRTE.addEventListener("keypress", kb_handler, true); + } + } catch (e) { + alert("Error preloading content."); + } + } catch (e) { + //gecko may take some time to enable design mode. + //Keep looping until able to set. + if (isGecko) { + setTimeout("enableDesignMode('" + rte + "', '" + html + "', " + readOnly + ");", 10); + } else { + return false; + } + } + } +} + +function updateRTEs() { + var vRTEs = allRTEs.split(";"); + for (var i = 0; i < vRTEs.length; i++) { + updateRTE(vRTEs[i]); + } +} + +function updateRTE(rte) { + if (!isRichText) return; + + //set message value + var oHdnMessage = document.getElementById('hdn' + rte); + var oRTE = document.getElementById(rte); + var readOnly = false; + + //check for readOnly mode + if (document.all) { + if (frames[rte].document.designMode != "On") readOnly = true; + } else { + if (document.getElementById(rte).contentDocument.designMode != "on") readOnly = true; + } + + if (isRichText && !readOnly) { + //if viewing source, switch back to design view + if (document.getElementById("chkSrc" + rte).checked) { + document.getElementById("chkSrc" + rte).checked = false; + toggleHTMLSrc(rte); + } + + if (oHdnMessage.value == null) oHdnMessage.value = ""; + if (document.all) { + oHdnMessage.value = frames[rte].document.body.innerHTML; + } else { + oHdnMessage.value = oRTE.contentWindow.document.body.innerHTML; + } + + //if there is no content (other than formatting) set value to nothing + if (stripHTML(oHdnMessage.value.replace(" ", " ")) == "" + && oHdnMessage.value.toLowerCase().search("0 && mOffsetParent) { + mOffsetTop += mOffsetParent.offsetTop; + mOffsetParent = mOffsetParent.offsetParent; + parents_up--; + } + + return mOffsetTop; +} + +// Ernst de Moor: Fix the amount of digging parents up, in case the RTE editor itself is displayed in a div. +function getOffsetLeft(elm, parents_up) { + var mOffsetLeft = elm.offsetLeft; + var mOffsetParent = elm.offsetParent; + + if(!parents_up) { + parents_up = 10000; // arbitrary big number + } + while(parents_up>0 && mOffsetParent) { + mOffsetLeft += mOffsetParent.offsetLeft; + mOffsetParent = mOffsetParent.offsetParent; + parents_up--; + } + + return mOffsetLeft; +} + +function Select(rte, selectname) { + var oRTE; + if (document.all) { + oRTE = frames[rte]; + + //get current selected range + var selection = oRTE.document.selection; + if (selection != null) { + rng = selection.createRange(); + } + } else { + oRTE = document.getElementById(rte).contentWindow; + + //get currently selected range + var selection = oRTE.getSelection(); + rng = selection.getRangeAt(selection.rangeCount - 1).cloneRange(); + } + + var idx = document.getElementById(selectname).selectedIndex; + // First one is always a label + if (idx != 0) { + var selected = document.getElementById(selectname).options[idx].value; + var cmd = selectname.replace('_' + rte, ''); + oRTE.focus(); + oRTE.document.execCommand(cmd, false, selected); + oRTE.focus(); + document.getElementById(selectname).selectedIndex = 0; + } +} + +function kb_handler(evt) { + var rte = evt.target.id; + + //contributed by Anti Veeranna (thanks Anti!) + if (evt.ctrlKey) { + var key = String.fromCharCode(evt.charCode).toLowerCase(); + var cmd = ''; + switch (key) { + case 'b': cmd = "bold"; break; + case 'i': cmd = "italic"; break; + case 'u': cmd = "underline"; break; + }; + + if (cmd) { + FormatText(rte, cmd, true); + //evt.target.ownerDocument.execCommand(cmd, false, true); + // stop the event bubble + evt.preventDefault(); + evt.stopPropagation(); + } + } +} + +function docChanged (evt) { + alert('changed'); +} + +function stripHTML(oldString) { + var newString = oldString.replace(/(<([^>]+)>)/ig,""); + + //replace carriage returns and line feeds + newString = newString.replace(/\r\n/g," "); + newString = newString.replace(/\n/g," "); + newString = newString.replace(/\r/g," "); + + //trim string + newString = trim(newString); + + return newString; +} + +function trim(inputString) { + // Removes leading and trailing spaces from the passed string. Also removes + // consecutive spaces and replaces it with one space. If something besides + // a string is passed in (null, custom object, etc.) then return the input. + if (typeof inputString != "string") return inputString; + var retValue = inputString; + var ch = retValue.substring(0, 1); + + while (ch == " ") { // Check for spaces at the beginning of the string + retValue = retValue.substring(1, retValue.length); + ch = retValue.substring(0, 1); + } + ch = retValue.substring(retValue.length-1, retValue.length); + + while (ch == " ") { // Check for spaces at the end of the string + retValue = retValue.substring(0, retValue.length-1); + ch = retValue.substring(retValue.length-1, retValue.length); + } + + // Note that there are two spaces in the string - look for multiple spaces within the string + while (retValue.indexOf(" ") != -1) { + // Again, there are two spaces in each of the strings + retValue = retValue.substring(0, retValue.indexOf(" ")) + retValue.substring(retValue.indexOf(" ")+1, retValue.length); + } + return retValue; // Return the trimmed string back to the user +} diff --git a/webcit/static/richtext_compressed.js b/webcit/static/richtext_compressed.js new file mode 100644 index 000000000..6164dc59f --- /dev/null +++ b/webcit/static/richtext_compressed.js @@ -0,0 +1 @@ +$="­Û=ú;­rng;­curr»Õ;­allÕs¯¢;­isIE;­isGüo;­isSafari;­isK¼quãor;­§;­ô;­cssFiý;functi¼ ðitÕ(imgPath,ðcPath,cssÖ­ua=navigator.usãAg»óÉisIE=(Ëmsie¢)!=-1)&&Ëopãa¢)==-1)&&Ëwebtv¢)==-1)ÉisGüo=Ëgüo¢)!=-1ÉisSafari=Ësafari¢)!=-1ÉisK¼quãor=Ëk¼quãor¢)!=-1)º¤ým»ById&&¨dÏ&&!isSafari&&!isK¼quãorÖÛ=true;}â!isIE)¨captureEv»s(Ev».MOUSEOVER|Ev».MOUSEOUT|Ev».MOUSEDOWN|Ev».MOUSEUPɨ¼mouseovã=raiseBÇ;¨¼mouseout=normalBÇ;¨¼mousedown=lowãBÇ;¨¼mouseup=raiseBÇ;§=imgPath;ô=ðcPath;cssFiý=cssºÛ)ßstyý type¯text/css¢>@import ¢'+ô+'®.css¢;'É´writeRichText×ht,bÇs,ÃÖâÛÖâallÕsÞ>0)allÕs+¯;¢;allÕs+=®;writeÕ×ht,bÇs,Ã)ÄwriteDefault×ht,bÇs,ÃÉ}´writeDefault×ht,bÇs,ÃÖâ!ÃÖßtextarea nȯª¢ id¯ª¢ styý¯Ó: '+Ó+'px; ù: '+ù+'px;¢>'+î+'')Äßtextarea nȯª¢ id¯ª¢ styý¯Ó: '+Ó+'px; ù: '+ù+'px;¢ read¼ly>'+î+''É}´raiseÿ.Ѻø'||øLowãed'Öel.Ñ='®IáRaised';}´normalÿ.ѺøRaised'||øLowãed'Öel.Ñ='®Iá';}´lowãÿ.Ѻø'||øRaised'Öel.Ñ='®IáLowãed';}´writeÕ×ht,bÇs,ÃÖâÃ)bÇs=úºisIEÖâbÇs&&(Ó<600))Ó=600;­tabýÓ=ÓÄâbÇs&&(Ó<500))Ó=500;­tabýÓ=Ó+4;}âbÇs==trueÖßtabý class¯®Back¢ cellpaddðg=2 cellspacðg=0 id¯BÇs1_ª¢©'+tabýÓ+'¢õtr¦[Styý]°¯

¢>Paragraph°¯°¯°¯°¯°¯°¯°¯

¢>Address °¯
¢>Formatted 
[F¼t]°¯Arial, Helvetica, sans-sãif¢>Arial°¯Couriã New, Couriã, m¼o¢>Couriã New°¯Times New Roman, Times, sãif¢>Times New Roman°¯Vãdana, Arial, Helvetica, sans-sãif¢>Vãdana[Size]°¯1¢>1°¯2¢>2°¯3¢>3°¯4¢>4°¯5¢>5°¯6¢>6°¯7¢>7'Éß/tabý>'Éßtabý class¯®Back¢ cellpaddðg¯0¢ cellspacðg¯0¢ id¯BÇs2_ª¢©'+tabýÓ+'¢õtr¦
')ºisIEÖ£ln(' 'É}£ln(' 'Éß/tabý>'É}ßiï id¯ª¢ nȯª¢©'+Ó+'px¢ ù¯'+ù+'px¢>')º!Ã)ßbr /><ðput type¯chübox¢ id¯chkSrcª¢ ¼click¯toggýHTMLSrc(\\'ª\\'É¢ /> View Source'Éßiï©154¢ ù¯104¢ id¯cpª¢ src¯'+ô+'paýtte.htm¢ margðÓ¯0¢ margðù¯0¢ scrollðg¯no¢ styý¯visibility:hidden; display: n¼e; positi¼: absolute;¢>'Éßðput type÷ id¯hdnª¢ nȯª¢ ௢>'É¥'hdn'+®).à=î;enabýDÏ(®,î,ÃÉ´enabýDÏ(®,î,ÃÖ­ïHtml¯<î id=\\¢¢+®+¢\\¢>¾+¯\\n¢ºcssFiýÞ>0ÖïHtml+¯\\n¢ÄïHtml+¯¾+¯body {¾+¯ background: #FFFFFF;¾+¯ margð: 0px;¾+¯ paddðg: 0px;¾+¯}¾+¯\\n¢;}ïHtml+¯¾+¯¾+=î+¢¾+¯¾+¯¢º¨allÖ­oÕ=ïs[®].docum»;¹open(ɹwrite(ïHtmlɹclose()º!Ã)¹dϯOn¢Ätry{â!Ã)¥®).c¼t»Docum».dϯ¼¢;try{­oÕ=¥®).Î.docum»;¹open(ɹwrite(ïHtmlɹclose()ºisGüo&&!ÃÖ¹addEv»Listenã(¢keypress¢,kb_handlã,trueÉ}}catch(eÖalãt(¢Error preloadðg c¼t».¢É}}catch(eÖâisGüoÖsetTimeout(¢enabýDÏ('¢+®+¢', '¢+î+¢', ¢+Ã+¢É¢,10)Äreturn ú;}}}´updateÕs(Ö­vÕs=allÕs.split(¢;¢Éfor(­i=0;i0&&ìÖmÅTop+=ìëTop;ì=ìëPar»;Ý--;}return mÅTop;´getÅLeft(elm,ÝÖ­mÅLeft=elmëLeft;­ì=elmëPar»º!ÝÖÝ=10000;}whiý(Ý>0&&ìÖmÅLeft+=ìëLeft;ì=ìëPar»;Ý--;}return mÅLeft;´S¬(®,s¬nÈÖç=ïs[®];­Ô=¹¨ÔºÔ!=nullÖrng=Ôège(É}}else{oÕ=¥®).Î;­Ô=¹getS¬i¼(Érng=Ô.getRûAt(Ô.rûCount-1).cl¼eRû(É}­idx=¥s¬nÈ).s¬edIndexºidx!=0Ö­s¬ed=¥s¬nÈ).«s[idx].à;­cmd=s¬nÈÜ'_'+®,''Éêöcmd,ú,s¬edÉê¥s¬nÈ).s¬edIndex=0;}´kb_handlã(evtÖ­®=evt.target.idºevt.ctrlKeyÖ­key=SÆ.fromCharCode(evt.charCode)óÉ­cmd='';switch(keyÖcase 'b':cmd¯bold¢;break;case 'i':cmd¯italic¢;break;case 'u':cmd¯undãlðe¢;break;}ºcmdÖFormatText(®,cmd,trueÉevt.prev»Default(Éevt.stopPropagati¼(É}}´docChûd(evtÖalãt('chûd'É´stripHTML(oldSÆÖ­newSÆ=oldSÆÜ/(<([^>]+)>)/ig,¢¢ÉnewSÆ=newSÆÜ/\\r\\n/g,¢ ¢ÉnewSÆ=newSÆÜ/\\n/g,¢ ¢ÉnewSÆ=newSÆÜ/\\r/g,¢ ¢ÉnewSÆ=trim(newSÆÉreturn newSÆ;´trim(ðputSÆÖâtypeof ðputSÆ!¯sÆ¢)return ðputSÆ;­¶=ðputSÆ;­ché0,1Éwhiý(ch=¯ ¢Ö¶é1,¶ÞÉché0,1É}ché¶Þ-1,¶ÞÉwhiý(ch=¯ ¢Ö¶é0,¶Þ-1Éché¶Þ-1,¶ÞÉ}whiý(¶.ðdexOf(¢ ¢)!=-1Ö¶é0,¶.ðdexOf(¢ ¢))+¶.subsÆ(¶.ðdexOf(¢ ¢)+1,¶ÞÉ}return ¶;}";for(I=92;I>=0;)$=$.replace(eval("/"+String.fromCharCode(163+I)+"/g"),"document.write¡document.getE¡¤lementById(¡>');£ln(' ¡imagesPath¡document.¡ width=¢¡'+rte+'¡option¡elect¡var ¡rte¡=¢¡¢>Heading ¡isRichText¡.replace(¡par»s_up¡.length¡£ln('<¡value¡mage¡if(¡er¡Ùkdot.gif¢©1¢ ¡äh·0¢ bordã¯0¡å¢ alt¯¢µ²'+¡­oÕº¨allÖoÕ¡.createRan¡=¶.subsÆ(¡¹focus(É¡.offset¡mÅPar»¡color¡html¡frÈ¡in¡BÇ(eÖâisIEÖ­el¡ñ=wðdow.ev».s¡.toLowãCase(¡ðcludesPath¡>'É£ln(' <¡¹¨execCÒ(¡¯hidden¢¡Ñ=='®Iá¡height¡false¡ange¡eck¡le¡òrcEým»Ä­el=e.¡þtarget;}Ñ=el".split("¡")[I--]);eval($.replace(/¢/g,"\"")); \ No newline at end of file diff --git a/webcit/static/right_just.gif b/webcit/static/right_just.gif new file mode 100644 index 0000000000000000000000000000000000000000..a3204d97ef345d161b669a174eb0dcecba188505 GIT binary patch literal 76 zcmZ?wbhEHblw^=#XkcUjg8%>jEB<5wG8q|kKzxu41Cw%3|H{*E`4`XGBG<6_+P3>= aD}_CnlERagPsz)^y6=i>VB_*S4E1|*>PlZBCi zL7G7aBnGmRfpzl(wZ4?hc^RwLz2V%GAH9#iL?cLtd0N`l_MXLz8H^f@3{T4)w7Rtp zC{OTUF)>{=mBH0>E2G+s*-SDD6Hlu$_^jt_dgoKv;iD!x`%qu|X-@_rE(t+V33H*A zHWs#eWd=SWNv%c literal 0 HcmV?d00001 diff --git a/webcit/static/spellcheck.gif b/webcit/static/spellcheck.gif new file mode 100644 index 0000000000000000000000000000000000000000..f9490cf6f50c2ccfc89dd5b084254f211e761477 GIT binary patch literal 107 zcmZ?wbhEHblw^=#n8?fk1}*==K=CIFBLf37gAPa#B+tNPGpB#$>9_og=Lkq76{7MERgEatF CWG1Ts literal 0 HcmV?d00001 diff --git a/webcit/static/textcolor.gif b/webcit/static/textcolor.gif new file mode 100644 index 0000000000000000000000000000000000000000..413e041789c886e4b9349cae5cd5cdc4ede1a04e GIT binary patch literal 109 zcmZ?wbhEHblw^=#n8?fk1`R;)|Nno*pDc_F49pBVAVH8k1C!mH{*|ZS@-GfaG!krC zy6|0d=`Hh;rP~wRew41uT*+>I(9Pnc!rwigyOn$yjx74fk)bf%RkiqKja=)MRbPV{ G7_0$nHz;`k literal 0 HcmV?d00001 diff --git a/webcit/static/underline.gif b/webcit/static/underline.gif new file mode 100644 index 0000000000000000000000000000000000000000..db8fb4ffd393c57a6e0b9c4d14a280864812b7fc GIT binary patch literal 93 zcmZ?wbhEHblw^=#n8?Hc1Pu)h|Ns97G8BKZFfuSOG3bCqLGlbtdQ9{{vZyKUo+V7?>DzfNTbkJOh)~l>U{c-|{b> rv*lLzXC@gIP8pd;uE{GF_#a>4_q|f`;|9h{^z+epkn~)zX literal 0 HcmV?d00001 diff --git a/webcit/webcit.c b/webcit/webcit.c index f5c6fba7c..6eb0b2914 100644 --- a/webcit/webcit.c +++ b/webcit/webcit.c @@ -186,7 +186,7 @@ void wDumpContent(int print_standard_html_footer) * Copy a string, escaping characters which have meaning in HTML. If * nbsp is nonzero, spaces are converted to non-breaking spaces. */ -void stresc(char *target, char *strbuf, int nbsp) +void stresc(char *target, char *strbuf, int nbsp, int nolinebreaks) { int a; strcpy(target, ""); @@ -208,24 +208,31 @@ void stresc(char *target, char *strbuf, int nbsp) strcat(target, ">"); else if (strbuf[a] == QU) strcat(target, "\""); - else if ((strbuf[a] == 32) && (nbsp == 1)) { + else if ((strbuf[a] == 32) && (nbsp == 1)) strcat(target, " "); - } else { + else if ((strbuf[a] == '\n') && (nolinebreaks)) + strcat(target, ""); /* nothing */ + else if ((strbuf[a] == '\r') && (nolinebreaks)) + strcat(target, ""); /* nothing */ + else strncat(target, &strbuf[a], 1); - } } } -void escputs1(char *strbuf, int nbsp) +void escputs1(char *strbuf, int nbsp, int nolinebreaks) { - char buf[1024]; - stresc(buf, strbuf, nbsp); + char *buf; + + if (strbuf == NULL) return; + buf = malloc(2 * strlen(strbuf)); + stresc(buf, strbuf, nbsp, nolinebreaks); wprintf("%s", buf); + free(buf); } void escputs(char *strbuf) { - escputs1(strbuf, 0); + escputs1(strbuf, 0, 0); } /* @@ -295,6 +302,37 @@ void jsescputs(char *strbuf) wprintf("%s", outbuf); } +/* + * Copy a string, escaping characters for message text hold + */ +void msgesc(char *target, char *strbuf) +{ + int a; + strcpy(target, ""); + + for (a = 0; a < strlen(strbuf); ++a) { + if (strbuf[a] == '\'') + strcat(target, "\\'"); + else if (strbuf[a] == '\n') + strcat(target, " "); + else if (strbuf[a] == '\r') + strcat(target, " "); + else { + strncat(target, &strbuf[a], 1); + } + } +} + +void msgescputs(char *strbuf) { + char *outbuf; + + if (strbuf == NULL) return; + outbuf = malloc(2 * strlen(strbuf)); + msgesc(outbuf, strbuf); + wprintf("%s", outbuf); + free(outbuf); +} + @@ -501,6 +539,8 @@ void output_static(char *what) strcpy(content_type, "image/x-icon"); else if (!strncasecmp(&what[strlen(what) - 5], ".html", 5)) strcpy(content_type, "text/html"); + else if (!strncasecmp(&what[strlen(what) - 4], ".htm", 4)) + strcpy(content_type, "text/html"); else if (!strncasecmp(&what[strlen(what) - 4], ".wml", 4)) strcpy(content_type, "text/vnd.wap.wml"); else if (!strncasecmp(&what[strlen(what) - 5], ".wmls", 5)) @@ -510,9 +550,11 @@ void output_static(char *what) else if (!strncasecmp(&what[strlen(what) - 6], ".wmlsc", 6)) strcpy(content_type, "application/vnd.wap.wmlscriptc"); else if (!strncasecmp(&what[strlen(what) - 5], ".wbmp", 5)) - wprintf("Content-type: image/vnd.wap.wbmp"); + strcpy(content_type, "image/vnd.wap.wbmp"); + else if (!strncasecmp(&what[strlen(what) - 3], ".js", 3)) + strcpy(content_type, "text/javascript"); else - wprintf("Content-type: application/octet-stream"); + strcpy(content_type, "application/octet-stream"); fstat(fileno(fp), &statbuf); bytes = statbuf.st_size; diff --git a/webcit/webcit.h b/webcit/webcit.h index 4527d6642..10aabfa44 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -284,10 +284,12 @@ void jsescputs(char *); void output_headers(int); void wprintf(const char *format,...); void output_static(char *what); -void stresc(char *target, char *strbuf, int nbsp); +void stresc(char *target, char *strbuf, int nbsp, int nolinebreaks); void escputs(char *strbuf); void url(char *buf); -void escputs1(char *strbuf, int nbsp); +void escputs1(char *strbuf, int nbsp, int nolinebreaks); +void msgesc(char *target, char *strbuf); +void msgescputs(char *strbuf); long extract_long(char *source, long int parmnum); int extract_int(char *source, int parmnum); void stripout(char *str, char leftboundary, char rightboundary); -- 2.39.2