Advertisement
Advertisement
| 04.07.2008 at 10:19AM PDT, ID: 23302045 |
|
[x]
Attachment Details
|
||
|
[x]
The Solution Rating System
|
||
With so many solutions, how can you tell which solutions are most likely to help you and which ones are not? To provide you with a tool to use, we rate our solutions based on various elements that most accurately determine if a solution is a quality solution. To explain what factors affect the solution rating, here are the elements we take into consideration when formulating our solution rating.
Your Input Matters If you have any suggestions that you would like to make for our rating system, please ask a question in the Suggestions Zone of Community Support. Thank you! |
||
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445: 446: 447: 448: 449: 450: 451: 452: 453: 454: 455: 456: 457: 458: 459: 460: 461: 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 473: 474: 475: 476: 477: 478: 479: 480: 481: 482: 483: 484: 485: 486: 487: 488: 489: 490: 491: 492: 493: 494: 495: 496: 497: 498: 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: 514: 515: 516: 517: 518: 519: 520: 521: 522: 523: 524: 525: 526: 527: 528: 529: 530: 531: 532: 533: 534: 535: 536: 537: 538: 539: 540: 541: 542: 543: 544: 545: 546: 547: 548: 549: 550: 551: 552: 553: 554: 555: 556: 557: 558: 559: 560: 561: 562: 563: 564: 565: 566: 567: 568: 569: 570: 571: 572: 573: 574: 575: 576: 577: 578: 579: 580: 581: 582: 583: 584: 585: 586: 587: 588: 589: 590: 591: 592: 593: 594: 595: 596: 597: 598: 599: 600: 601: 602: 603: 604: 605: 606: 607: 608: 609: 610: 611: 612: 613: 614: 615: 616: 617: 618: 619: 620: 621: 622: 623: 624: 625: 626: 627: 628: 629: 630: 631: 632: 633: 634: 635: 636: 637: 638: 639: 640: 641: 642: 643: 644: 645: 646: 647: 648: 649: 650: 651: 652: 653: 654: 655: 656: 657: 658: 659: 660: 661: 662: 663: 664: 665: 666: 667: 668: 669: 670: 671: 672: 673: 674: 675: 676: 677: 678: 679: 680: 681: 682: 683: 684: 685: 686: 687: 688: 689: 690: 691: 692: 693: 694: 695: 696: 697: 698: 699: 700: 701: 702: 703: 704: 705: 706: 707: 708: 709: 710: 711: 712: 713: 714: 715: 716: 717: 718: 719: 720: 721: 722: 723: 724: 725: 726: 727: 728: 729: 730: 731: 732: 733: 734: 735: 736: 737: 738: 739: 740: 741: 742: 743: 744: 745: 746: 747: 748: 749: 750: 751: 752: 753: 754: 755: 756: 757: 758: 759: 760: 761: 762: 763: 764: 765: 766: 767: 768: 769: 770: 771: 772: 773: 774: 775: 776: 777: 778: 779: 780: 781: 782: 783: 784: 785: 786: 787: 788: 789: 790: 791: 792: 793: 794: 795: 796: 797: 798: 799: 800: 801: 802: 803: 804: 805: 806: 807: 808: 809: 810: 811: 812: 813: 814: 815: 816: 817: 818: 819: 820: 821: 822: 823: 824: 825: 826: 827: 828: 829: 830: 831: 832: 833: 834: 835: 836: 837: 838: 839: 840: 841: 842: 843: 844: 845: 846: 847: 848: 849: 850: 851: 852: 853: 854: 855: 856: 857: 858: 859: 860: 861: 862: 863: 864: 865: 866: 867: 868: 869: 870: 871: 872: 873: 874: 875: 876: 877: 878: 879: 880: 881: 882: 883: 884: 885: 886: 887: 888: 889: 890: 891: 892: 893: 894: 895: 896: 897: 898: 899: 900: 901: 902: 903: 904: 905: 906: 907: 908: 909: 910: 911: 912: 913: 914: 915: 916: 917: 918: 919: 920: 921: 922: 923: 924: 925: 926: 927: 928: 929: 930: 931: 932: 933: 934: 935: 936: 937: 938: 939: 940: 941: 942: 943: 944: 945: 946: 947: 948: 949: 950: 951: 952: 953: 954: 955: 956: 957: 958: 959: 960: 961: 962: 963: 964: 965: 966: 967: 968: 969: 970: 971: 972: 973: 974: 975: 976: 977: 978: 979: 980: 981: 982: 983: 984: 985: 986: 987: 988: 989: 990: 991: 992: 993: 994: 995: 996: 997: 998: 999: 1000: 1001: 1002: 1003: 1004: 1005: 1006: 1007: 1008: 1009: 1010: 1011: 1012: 1013: 1014: 1015: 1016: 1017: 1018: 1019: 1020: 1021: 1022: 1023: 1024: 1025: 1026: 1027: 1028: 1029: 1030: 1031: 1032: 1033: 1034: 1035: 1036: 1037: 1038: 1039: 1040: 1041: 1042: 1043: 1044: 1045: 1046: 1047: 1048: 1049: 1050: 1051: 1052: 1053: 1054: 1055: 1056: 1057: 1058: 1059: 1060: 1061: 1062: 1063: 1064: 1065: 1066: 1067: 1068: 1069: 1070: 1071: 1072: 1073: 1074: 1075: 1076: 1077: 1078: 1079: 1080: 1081: 1082: 1083: 1084: 1085: 1086: 1087: 1088: 1089: 1090: 1091: 1092: 1093: 1094: 1095: 1096: 1097: 1098: 1099: 1100: 1101: 1102: 1103: 1104: 1105: 1106: 1107: 1108: 1109: 1110: 1111: 1112: 1113: 1114: 1115: 1116: 1117: 1118: 1119: 1120: 1121: 1122: 1123: 1124: 1125: 1126: 1127: 1128: 1129: 1130: 1131: 1132: 1133: 1134: 1135: 1136: 1137: 1138: 1139: 1140: 1141: 1142: 1143: 1144: 1145: 1146: 1147: 1148: 1149: 1150: 1151: 1152: 1153: 1154: 1155: 1156: 1157: 1158: 1159: 1160: 1161: 1162: 1163: 1164: 1165: 1166: 1167: 1168: 1169: 1170: 1171: 1172: 1173: 1174: 1175: 1176: 1177: 1178: 1179: 1180: 1181: 1182: 1183: 1184: 1185: 1186: 1187: 1188: 1189: 1190: 1191: 1192: 1193: 1194: 1195: 1196: 1197: 1198: 1199: 1200: 1201: 1202: 1203: 1204: 1205: 1206: 1207: 1208: 1209: 1210: 1211: 1212: 1213: 1214: 1215: 1216: 1217: 1218: 1219: 1220: 1221: 1222: 1223: 1224: 1225: 1226: 1227: 1228: 1229: 1230: 1231: 1232: 1233: 1234: 1235: 1236: 1237: 1238: 1239: 1240: 1241: 1242: 1243: 1244: 1245: 1246: 1247: 1248: 1249: 1250: 1251: 1252: 1253: 1254: 1255: 1256: 1257: 1258: 1259: 1260: 1261: 1262: 1263: 1264: 1265: 1266: 1267: 1268: 1269: 1270: 1271: 1272: 1273: 1274: 1275: 1276: 1277: 1278: 1279: 1280: 1281: 1282: 1283: 1284: 1285: 1286: 1287: 1288: 1289: 1290: 1291: 1292: 1293: 1294: 1295: 1296: 1297: 1298: 1299: 1300: 1301: 1302: 1303: 1304: 1305: 1306: 1307: 1308: 1309: 1310: 1311: 1312: 1313: 1314: 1315: 1316: 1317: 1318: 1319: 1320: 1321: 1322: 1323: 1324: 1325: 1326: 1327: 1328: 1329: 1330: 1331: 1332: 1333: 1334: 1335: 1336: 1337: 1338: 1339: 1340: 1341: 1342: 1343: 1344: 1345: 1346: 1347: 1348: 1349: 1350: 1351: 1352: 1353: 1354: 1355: 1356: 1357: 1358: 1359: 1360: 1361: 1362: 1363: 1364: 1365: 1366: 1367: 1368: 1369: 1370: 1371: 1372: 1373: 1374: 1375: 1376: 1377: 1378: 1379: 1380: 1381: 1382: 1383: 1384: 1385: 1386: 1387: 1388: 1389: 1390: 1391: 1392: 1393: 1394: 1395: 1396: 1397: 1398: 1399: 1400: 1401: 1402: 1403: 1404: 1405: 1406: 1407: 1408: 1409: 1410: 1411: 1412: 1413: 1414: 1415: 1416: 1417: 1418: 1419: 1420: 1421: 1422: 1423: 1424: 1425: 1426: 1427: 1428: 1429: 1430: 1431: 1432: 1433: 1434: 1435: 1436: 1437: 1438: 1439: 1440: 1441: 1442: 1443: 1444: 1445: 1446: 1447: 1448: 1449: 1450: 1451: 1452: 1453: 1454: 1455: 1456: 1457: 1458: 1459: 1460: 1461: 1462: 1463: 1464: 1465: 1466: 1467: 1468: 1469: 1470: 1471: 1472: 1473: 1474: 1475: 1476: 1477: 1478: 1479: 1480: 1481: 1482: 1483: 1484: 1485: 1486: 1487: 1488: 1489: 1490: 1491: 1492: 1493: 1494: 1495: 1496: 1497: 1498: 1499: 1500: 1501: 1502: 1503: 1504: 1505: 1506: 1507: 1508: 1509: 1510: 1511: 1512: 1513: 1514: 1515: 1516: 1517: 1518: 1519: 1520: 1521: 1522: 1523: 1524: 1525: 1526: 1527: 1528: 1529: 1530: 1531: 1532: 1533: 1534: 1535: 1536: 1537: 1538: 1539: 1540: 1541: 1542: 1543: 1544: 1545: 1546: 1547: 1548: 1549: 1550: 1551: 1552: 1553: 1554: 1555: 1556: 1557: 1558: 1559: 1560: 1561: 1562: 1563: 1564: 1565: 1566: 1567: 1568: 1569: 1570: 1571: 1572: 1573: 1574: 1575: 1576: 1577: 1578: 1579: 1580: 1581: 1582: 1583: 1584: 1585: 1586: 1587: 1588: 1589: 1590: 1591: 1592: 1593: 1594: 1595: 1596: 1597: 1598: 1599: 1600: 1601: 1602: 1603: 1604: 1605: 1606: 1607: 1608: 1609: 1610: 1611: 1612: 1613: 1614: 1615: 1616: 1617: 1618: 1619: 1620: 1621: 1622: 1623: 1624: 1625: 1626: 1627: 1628: 1629: 1630: 1631: 1632: 1633: 1634: 1635: 1636: 1637: 1638: 1639: 1640: 1641: 1642: 1643: 1644: 1645: 1646: 1647: 1648: 1649: 1650: 1651: 1652: 1653: 1654: 1655: 1656: 1657: 1658: 1659: 1660: 1661: 1662: 1663: 1664: 1665: 1666: 1667: 1668: 1669: 1670: 1671: 1672: 1673: 1674: 1675: 1676: 1677: 1678: 1679: 1680: 1681: 1682: 1683: 1684: 1685: 1686: 1687: 1688: 1689: 1690: 1691: 1692: 1693: 1694: 1695: 1696: 1697: 1698: 1699: 1700: 1701: 1702: 1703: 1704: 1705: |
/*
** File: widgEdit.js
** Created by: Cameron Adams (http://www.themaninblue.com/)
** Created on: 2005-01-16
** Last modified: 2008-03-01
**
**
**
**
** License Information:
** -------------------------------------------------------------------------
** Copyright (C) 2008 Cameron Adams
**
** This program is free software; you can redistribute it and/or modify it
** under the terms of the GNU General Public License as published by the
** Free Software Foundation; either version 2 of the License, or (at your
** option) any later version.
**
** This program is distributed in the hope that it will be useful, but
** WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** General Public License for more details.
**
** You should have received a copy of the GNU General Public License along
** with this program; if not, write to the Free Software Foundation, Inc.,
** 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**
**
**
**
** Purpose:
** -------------------------------------------------------------------------
**
** Replaces all textareas (class="widgEditor") in a HTML document with
** enhanced editing windows to allow basic HTML formatting in a WYSIWYG
** manner.
**
**
**
**
** Function list:
** -------------------------------------------------------------------------
**
** run()
**
** widgInit()
**
** widgEditor(replacedTextareaID)
** widtEditor.cleanPaste()
** widgEditor.cleanSource()
** widgEditor.convertSPANs(theSwitch)
** widgEditor.detectPaste(e)
** widgEditor.initEdit()
** widgEditor.insertNewParagraph()
** widgEditor.modifyFormSubmit()
** widgEditor.paragraphise()
** widgEditor.refreshDisplay()
** widgEditor.switchMode()
** widgEditor.updateWidgInput()
** widgEditor.writeDocument()
**
** widgToolbar()
** widgToolbar.addButton(theID, theClass, theLabel, theAction)
** widgToolbar.addSelect(theID, theClass, theContentArray, theAction)
** widgToolbar.disable()
** widgToolbar.enable()
** widgToolbar.setState(theState, theStatus)
**
** widgToolbarAction()
**
** widgToolbarCheckState(theWidgEditor, resubmit)
**
** widgToolbarMouseover()
**
** acceptableChildren(theNode)
**
** changeNodeType(theNode, nodeType)
**
** replaceNodeWithChildren()
**
** String.addClass(theClass)
** String.classExists(theClass)
** String.isAcceptedElementName()
** String.isInlineName()
** String.removeClass(theClass)
** String.reverse()
** String.validTags()
*/
/******************************************************************************
** CONFIGURATION VARIABLES
******************************************************************************/
/* Location of stylesheet file for editor content */
var widgStylesheet = "widgContent.css";
/* Items to appear in toolbar. */
var widgToolbarItems = new Array();
widgToolbarItems.push("bold");
widgToolbarItems.push("italic");
widgToolbarItems.push("hyperlink");
widgToolbarItems.push("unorderedlist");
widgToolbarItems.push("htmlsource");
widgToolbarItems.push("blockformat");
/* Options on block format select element. Consists of string pairs (option value, option label) */
var widgSelectBlockOptions = new Array();
widgSelectBlockOptions.push("", "Type Face");
widgSelectBlockOptions.push("<h1>", "Heading 1");
widgSelectBlockOptions.push("<h2>", "Heading 2");
widgSelectBlockOptions.push("<h3>", "Heading 3");
widgSelectBlockOptions.push("<h4>", "Heading 4");
widgSelectBlockOptions.push("<h5>", "Heading 5");
widgSelectBlockOptions.push("<h6>", "Heading 6");
widgSelectBlockOptions.push("<p>", "Paragraph");
/* If widgInsertParagraphs = true, when content is submitted paragraphs will be
** inserted around text without a parent element. Mozilla does not
** automatically do this, so if this is set to false you will end up with some
** plain text blocks. Uses a double <br /> as a pargraph marker.
*/
var widgInsertParagraphs = false;
/* If widgAutoClean = true, when content is pasted into the WYSIWYG view, it
** will automatically be cleaned. If widgAutoClean = false, the user will be
** prompted as to whether they wish to clean the content.
*/
var widgAutoClean = false;
/******************************************************************************
** END CONFIGURATION
******************************************************************************/
run();
function run()
{
var oldOnload = window.onload;
if (typeof(window.onload) != "function")
{
window.onload = widgInit;
}
else
{
window.onload = function()
{
oldOnload();
widgInit();
}
}
}
function widgInit()
{
/* Detects if designMode is available, and also if browser is IE or Mozilla (excludes Safari) */
if (typeof(document.designMode) == "string" && (document.all || document.designMode == "off"))
{
var theTextareas = document.getElementsByTagName("textarea");
for (var i = 0; i < theTextareas.length; i++)
{
var theTextarea = theTextareas[i];
if (theTextarea.className.classExists("widgEditor"))
{
if (theTextarea.id == "")
{
theTextarea.id = theTextarea.name;
}
setTimeout("new widgEditor('" + theTextarea.id + "')", 500 * (i));
}
}
}
else
{
return false;
}
return true;
}
function widgEditor(replacedTextareaID)
{
var self = this;
this.theTextarea = document.getElementById(replacedTextareaID);
this.theContainer = document.createElement("div");
this.theIframe = document.createElement("iframe");
this.theInput = document.createElement("input");
this.theExtraInput = document.createElement("input");
this.IE = false;
this.locked = true;
this.pasteCache = "";
this.wysiwyg = true;
if (document.all)
{
this.IE = true;
}
if (this.theTextarea.id == null)
{
this.theTextarea.id = this.theTextarea.name;
}
this.theTextarea.style.visibility = "hidden";
/* Modify DOM objects for editor */
this.theContainer.id = this.theTextarea.id + "WidgContainer";
this.theContainer.className = "widgContainer";
this.theIframe.id = this.theTextarea.id + "WidgIframe";
this.theIframe.className = "widgIframe";
this.theInput.type = "hidden";
this.theInput.id = this.theTextarea.id;
this.theInput.name = this.theTextarea.name;
this.theInput.value = this.theTextarea.value;
this.theToolbar = new widgToolbar(this);
/* An extra input to determine if the submitted data is from the normal textarea or from the widgEditor */
this.theExtraInput.type = "hidden";
this.theExtraInput.id = this.theTextarea.id + "WidgEditor";
this.theExtraInput.name = this.theTextarea.name + "WidgEditor";
this.theExtraInput.value = "true";
this.theTextarea.id += "WidgTextarea";
this.theTextarea.name += "WidgTextarea";
this.theContainer.appendChild(this.theToolbar.theList);
this.theContainer.appendChild(this.theIframe);
this.theContainer.appendChild(this.theInput);
this.theContainer.appendChild(this.theExtraInput);
this.theContainer.style.visibility = "hidden";
this.theInput.widgEditorObject = this;
this.theTextarea.parentNode.replaceChild(this.theContainer, this.theTextarea);
/* Fill editor with old textarea content */
this.writeDocument(this.theInput.value);
/* Make editor editable */
this.initEdit();
/* Attach onsubmit to parent form */
this.modifyFormSubmit();
return true;
}
/* Clean pasted content */
widgEditor.prototype.cleanPaste = function()
{
if (widgAutoClean || confirm("Do you wish to clean the HTML source of the content you just pasted?"))
{
var matchedHead = "";
var matchedTail = "";
var newContent = this.theIframe.contentWindow.document.getElementsByTagName("body")[0].innerHTML;
var newContentStart = 0;
var newContentFinish = 0;
var newSnippet = "";
var tempNode = document.createElement("div");
/* Find start of both strings that matches */
for (newContentStart = 0; newContent.charAt(newContentStart) == this.pasteCache.charAt(newContentStart); newContentStart++)
{
matchedHead += this.pasteCache.charAt(newContentStart);
}
/* If newContentStart is inside a HTML tag, move to opening brace of tag */
for (var i = newContentStart; i >= 0; i--)
{
if (this.pasteCache.charAt(i) == "<")
{
newContentStart = i;
matchedHead = this.pasteCache.substring(0, newContentStart);
break;
}
else if(this.pasteCache.charAt(i) == ">")
{
break;
}
}
newContent = newContent.reverse();
this.pasteCache = this.pasteCache.reverse();
/* Find end of both strings that matches */
for (newContentFinish = 0; newContent.charAt(newContentFinish) == this.pasteCache.charAt(newContentFinish); newContentFinish++)
{
matchedTail += this.pasteCache.charAt(newContentFinish);
}
/* If newContentFinish is inside a HTML tag, move to closing brace of tag */
for (var i = newContentFinish; i >= 0; i--)
{
if (this.pasteCache.charAt(i) == ">")
{
newContentFinish = i;
matchedTail = this.pasteCache.substring(0, newContentFinish);
break;
}
else if(this.pasteCache.charAt(i) == "<")
{
break;
}
}
matchedTail = matchedTail.reverse();
/* If there's no difference in pasted content */
if (newContentStart == newContent.length - newContentFinish)
{
return false;
}
newContent = newContent.reverse();
newSnippet = newContent.substring(newContentStart, newContent.length - newContentFinish);
newSnippet = newSnippet.validTags();
/* Replace opening bold tags with strong */
newSnippet = newSnippet.replace(/<b(\s+|>)/g, "<strong$1");
/* Replace closing bold tags with closing strong */
newSnippet = newSnippet.replace(/<\/b(\s+|>)/g, "</strong$1");
/* Replace italic tags with em */
newSnippet = newSnippet.replace(/<i(\s+|>)/g, "<em$1");
/* Replace closing italic tags with closing em */
newSnippet = newSnippet.replace(/<\/i(\s+|>)/g, "</em$1");
/* Strip out unaccepted attributes */
newSnippet = newSnippet.replace(/<[^>]*>/g, function(match)
{
match = match.replace(/ ([^=]+)="[^"]*"/g, function(match2, attributeName)
{
if (attributeName == "alt" || attributeName == "href" || attributeName == "src" || attributeName == "title")
{
return match2;
}
return "";
});
return match;
}
);
tempNode.innerHTML = newSnippet;
acceptableChildren(tempNode);
this.theInput.value = matchedHead + tempNode.innerHTML + matchedTail;
/* Final cleanout for MS Word cruft */
this.theInput.value = this.theInput.value.replace(/<\?xml[^>]*>/g, "");
this.theInput.value = this.theInput.value.replace(/<[^ >]+:[^>]*>/g, "");
this.theInput.value = this.theInput.value.replace(/<\/[^ >]+:[^>]*>/g, "");
this.refreshDisplay();
/* Convert semantics to spans in Mozilla */
if (!this.IE)
{
this.convertSPANs();
}
}
return true;
}
/* Clean the HTML code of the content area */
widgEditor.prototype.cleanSource = function()
{
var theHTML = "";
if (this.wysiwyg)
{
theHTML = this.theIframe.contentWindow.document.getElementsByTagName("body")[0].innerHTML;
}
else
{
theHTML = this.theTextarea.value;
}
theHTML = theHTML.validTags();
/* Remove leading and trailing whitespace */
theHTML = theHTML.replace(/^\s+/, "");
theHTML = theHTML.replace(/\s+$/, "");
/* Remove style attribute inside any tag */
theHTML = theHTML.replace(/ style="[^"]*"/g, "");
/* Replace improper BRs */
//theHTML = theHTML.replace(/<br \/><br \/>/g, "<br />");
theHTML = theHTML.replace(/<br>/g, "");
/* Remove BRs right before the end of blocks */
theHTML = theHTML.replace(/<br \/>\s*<\/(h1|h2|h3|h4|h5|h6|li|p)/g, "</$1");
/* Replace improper IMGs */
theHTML = theHTML.replace(/(<img [^>]+[^\/])>/g, "$1 />");
/* Remove empty tags */
theHTML = theHTML.replace(/(<[^\/]>|<[^\/][^>]*[^\/]>)\s*<\/[^>]*>/g, "");
if (this.wysiwyg)
{
this.theIframe.contentWindow.document.getElementsByTagName("body")[0].innerHTML = theHTML;
}
else
{
this.theTextarea.value = theHTML;
}
this.theInput.value = theHTML;
return true;
}
widgEditor.prototype.convertSPANs = function(theSwitch)
{
if (theSwitch)
{
/* Replace styled spans with their semantic equivalent */
var theSPANs = this.theIframe.contentWindow.document.getElementsByTagName("span");
while(theSPANs.length > 0)
{
var theChildren = new Array();
var theReplacementElement = null;
var theParentElement = null;
for (var j = 0; j < theSPANs[0].childNodes.length; j++)
{
theChildren.push(theSPANs[0].childNodes[j].cloneNode(true));
}
/* Detect type of span style */
switch (theSPANs[0].getAttribute("style"))
{
case "font-weight: bold;":
theReplacementElement = this.theIframe.contentWindow.document.createElement("strong");
theParentElement = theReplacementElement;
break;
case "font-style: italic;":
theReplacementElement = this.theIframe.contentWindow.document.createElement("em");
theParentElement = theReplacementElement;
break;
case "font-weight: bold; font-style: italic;":
theParentElement = this.theIframe.contentWindow.document.createElement("em");
theReplacementElement = this.theIframe.contentWindow.document.createElement("strong");
theReplacementElement.appendChild(theParentElement);
break;
case "font-style: italic; font-weight: bold;":
theParentElement = this.theIframe.contentWindow.document.createElement("strong");
theReplacementElement = this.theIframe.contentWindow.document.createElement("em");
theReplacementElement.appendChild(theParentElement);
break;
default:
replaceNodeWithChildren(theSPANs[0]);
break;
}
if (theReplacementElement != null)
{
for (var j = 0; j < theChildren.length; j++)
{
theParentElement.appendChild(theChildren[j]);
}
theSPANs[0].parentNode.replaceChild(theReplacementElement, theSPANs[0]);
}
theSPANs = this.theIframe.contentWindow.document.getElementsByTagName("span");
}
}
else
{
/* Replace em and strong tags with styled spans */
var theEMs = this.theIframe.contentWindow.document.getElementsByTagName("em");
while(theEMs.length > 0)
{
var theChildren = new Array();
var theSpan = this.theIframe.contentWindow.document.createElement("span");
theSpan.setAttribute("style", "font-style: italic;");
for (var j = 0; j < theEMs[0].childNodes.length; j++)
{
theChildren.push(theEMs[0].childNodes[j].cloneNode(true));
}
for (var j = 0; j < theChildren.length; j++)
{
theSpan.appendChild(theChildren[j]);
}
theEMs[0].parentNode.replaceChild(theSpan, theEMs[0]);
theEMs = this.theIframe.contentWindow.document.getElementsByTagName("em");
}
var theSTRONGs = this.theIframe.contentWindow.document.getElementsByTagName("strong");
while(theSTRONGs.length > 0)
{
var theChildren = new Array();
var theSpan = this.theIframe.contentWindow.document.createElement("span");
theSpan.setAttribute("style", "font-weight: bold;");
for (var j = 0; j < theSTRONGs[0].childNodes.length; j++)
{
theChildren.push(theSTRONGs[0].childNodes[j].cloneNode(true));
}
for (var j = 0; j < theChildren.length; j++)
{
theSpan.appendChild(theChildren[j]);
}
theSTRONGs[0].parentNode.replaceChild(theSpan, theSTRONGs[0]);
theSTRONGs = this.theIframe.contentWindow.document.getElementsByTagName("strong");
}
}
return true;
}
/* Check for pasted content */
widgEditor.prototype.detectPaste = function(e)
{
var keyPressed = null;
var theEvent = null;
if (e)
{
theEvent = e;
}
else
{
theEvent = event;
}
if (theEvent.ctrlKey && theEvent.keyCode == 86 && this.wysiwyg)
{
var self = this;
this.pasteCache = this.theIframe.contentWindow.document.getElementsByTagName("body")[0].innerHTML;
/* Because Mozilla can't access the clipboard directly, must rely on timeout to check pasted differences in main content */
setTimeout(function(){self.cleanPaste(); return true;}, 100);
}
return true;
}
/* Turn on document editing */
widgEditor.prototype.initEdit = function()
{
var self = this;
try
{
this.theIframe.contentWindow.document.designMode = "on";
}
catch (e)
{
/* setTimeout needed to counteract Mozilla bug whereby you can't immediately change designMode on newly created iframes */
setTimeout(function(){self.initEdit()}, 250);
return false;
}
if (!this.IE)
{
this.convertSPANs(false);
}
this.theContainer.style.visibility = "visible";
this.theTextarea.style.visibility = "visible";
/* Mozilla event capturing */
if (typeof document.addEventListener == "function")
{
this.theIframe.contentWindow.document.addEventListener("mouseup", function(){widgToolbarCheckState(self); return true;}, false);
this.theIframe.contentWindow.document.addEventListener("keyup", function(){widgToolbarCheckState(self); return true;}, false);
this.theIframe.contentWindow.document.addEventListener("keydown", function(e){self.detectPaste(e); return true;}, false);
}
/* IE event capturing */
else
{
this.theIframe.contentWindow.document.attachEvent("onmouseup", function(){widgToolbarCheckState(self); return true;});
this.theIframe.contentWindow.document.attachEvent("onkeyup", function(){widgToolbarCheckState(self); return true;});
this.theIframe.contentWindow.document.attachEvent("onkeydown", function(e){self.detectPaste(e); return true;}, false);
}
this.locked = false;
return true;
}
/* Add elements to a paragraph and inserts the paragraph before a given element in the body */
widgEditor.prototype.insertNewParagraph = function(elementArray, succeedingElement)
{
var theBody = this.theIframe.contentWindow.document.getElementsByTagName("body")[0];
var theParagraph = this.theIframe.contentWindow.document.createElement("p");
for (var i = 0; i < elementArray.length; i++)
{
theParagraph.appendChild(elementArray[i]);
}
if (typeof(succeedingElement) != "undefined")
{
theBody.insertBefore(theParagraph, succeedingElement);
}
else
{
theBody.appendChild(theParagraph);
}
return true;
}
/* Add submit listener to parent form */
widgEditor.prototype.modifyFormSubmit = function()
{
var self = this;
var theForm = this.theContainer.parentNode;
var oldOnsubmit = null;
/* Find the parent form element */
while (theForm.nodeName.toLowerCase() != "form")
{
theForm = theForm.parentNode;
}
/* Add onsubmit without overwriting existing function calls */
oldOnsubmit = theForm.onsubmit;
if (typeof theForm.onsubmit != "function")
{
theForm.onsubmit = function()
{
return self.updateWidgInput();
}
}
else
{
theForm.onsubmit = function()
{
self.updateWidgInput();
return oldOnsubmit();
}
}
return true;
}
/* Format the HTML with paragraphs. Any parentless text is enclosed in a paragraph, double breaks are paragraph markers */
widgEditor.prototype.paragraphise = function()
{
if (widgInsertParagraphs && this.wysiwyg)
{
var theBody = this.theIframe.contentWindow.document.getElementsByTagName("body")[0];
/* Remove all text nodes containing just whitespace */
for (var i = 0; i < theBody.childNodes.length; i++)
{
if (theBody.childNodes[i].nodeName.toLowerCase() == "#text" &&
theBody.childNodes[i].data.search(/^\s*$/) != -1)
{
theBody.removeChild(theBody.childNodes[i]);
i--;
}
}
var removedElements = new Array();
for (var i = 0; i < theBody.childNodes.length; i++)
{
if (theBody.childNodes[i].nodeName.isInlineName())
{
removedElements.push(theBody.childNodes[i].cloneNode(true));
theBody.removeChild(theBody.childNodes[i]);
i--;
}
else if (theBody.childNodes[i].nodeName.toLowerCase() == "br")
{
if (i + 1 < theBody.childNodes.length)
{
/* If the current break tag is followed by another break tag */
if (theBody.childNodes[i + 1].nodeName.toLowerCase() == "br")
{
/* Remove consecutive break tags */
while (i < theBody.childNodes.length && theBody.childNodes[i].nodeName.toLowerCase() == "br")
{
theBody.removeChild(theBody.childNodes[i]);
}
if (removedElements.length > 0)
{
this.insertNewParagraph(removedElements, theBody.childNodes[i]);
removedElements = new Array();
}
}
/* If the break tag appears before a block element */
else if (!theBody.childNodes[i + 1].nodeName.isInlineName())
{
theBody.removeChild(theBody.childNodes[i]);
}
else if (removedElements.length > 0)
{
removedElements.push(theBody.childNodes[i].cloneNode(true));
theBody.removeChild(theBody.childNodes[i]);
}
else
{
theBody.removeChild(theBody.childNodes[i]);
}
i--;
}
else
{
theBody.removeChild(theBody.childNodes[i]);
}
}
else if (removedElements.length > 0)
{
this.insertNewParagraph(removedElements, theBody.childNodes[i]);
removedElements = new Array();
}
}
if (removedElements.length > 0)
{
this.insertNewParagraph(removedElements);
}
}
return true;
}
/* Update hidden input to reflect editor contents, for submission */
widgEditor.prototype.refreshDisplay = function()
{
if (this.wysiwyg)
{
this.theIframe.contentWindow.document.getElementsByTagName("body")[0].innerHTML = this.theInput.value;
}
else
{
this.theTextarea.value = this.theInput.value;
}
return true;
}
/* Switch between WYSIWYG and HTML source */
widgEditor.prototype.switchMode = function()
{
if (!this.locked)
{
this.locked = false;
/* Switch to HTML source */
if (this.wysiwyg)
{
this.updateWidgInput();
this.theTextarea.value = this.theInput.value;
this.theContainer.replaceChild(this.theTextarea, this.theIframe);
this.theToolbar.disable();
this.wysiwyg = false;
this.locked = false;
}
/* Switch to WYSIWYG */
else
{
this.updateWidgInput();
this.theContainer.replaceChild(this.theIframe, this.theTextarea);
this.writeDocument(this.theInput.value);
this.theToolbar.enable();
this.initEdit();
this.wysiwyg = true;
}
}
return true;
}
/* Update hidden input to reflect editor contents, for submission */
widgEditor.prototype.updateWidgInput = function()
{
if (this.wysiwyg)
{
/* Convert spans to semantics in Mozilla */
if (!this.IE)
{
this.convertSPANs(true);
}
this.paragraphise();
this.cleanSource();
}
else
{
this.theInput.value = this.theTextarea.value;
}
return true;
}
/* Write initial content to editor */
widgEditor.prototype.writeDocument = function(documentContent)
{
/* HTML template into which the HTML Editor content is inserted */
var documentTemplate = '\
<html>\
<head>\
INSERT:STYLESHEET:END\
</head>\
<body id="iframeBody">\
INSERT:CONTENT:END\
</body>\
</html>\
';
/* Insert dynamic variables/content into document */
/* IE needs stylesheet to be written inline */
if (typeof document.all != "undefined")
{
documentTemplate = documentTemplate.replace(/INSERT:STYLESHEET:END/, '<link rel="stylesheet" type="text/css" href="' + widgStylesheet + '"></link>');
}
/* Firefox can't have stylesheet written inline */
else
{
documentTemplate = documentTemplate.replace(/INSERT:STYLESHEET:END/, "");
}
documentTemplate = documentTemplate.replace(/INSERT:CONTENT:END/, documentContent);
this.theIframe.contentWindow.document.open();
this.theIframe.contentWindow.document.write(documentTemplate);
this.theIframe.contentWindow.document.close();
/* In Firefox stylesheet needs to be loaded separate to other HTML, because if it's loaded inline it causes Firefox to have problems with an empty document */
if (typeof document.all == "undefined")
{
var stylesheet = this.theIframe.contentWindow.document.createElement("link");
stylesheet.setAttribute("rel", "stylesheet");
stylesheet.setAttribute("type", "text/css");
stylesheet.setAttribute("href", widgStylesheet);
this.theIframe.contentWindow.document.getElementsByTagName("head")[0].appendChild(stylesheet);
}
return true;
}
/* Toolbar items */
function widgToolbar(theEditor)
{
var self = this;
this.widgEditorObject = theEditor;
/* Create toolbar ul element */
this.theList = document.createElement("ul");
this.theList.id = this.widgEditorObject.theInput.id + "WidgToolbar";
this.theList.className = "widgToolbar";
this.theList.widgToolbarObject = this;
/* Create toolbar items */
for (var i = 0; i < widgToolbarItems.length; i++)
{
switch (widgToolbarItems[i])
{
case "bold":
this.addButton(this.theList.id + "ButtonBold", "widgButtonBold", "Bold", "bold");
break;
case "italic":
this.addButton(this.theList.id + "ButtonItalic", "widgButtonItalic", "Italic", "italic");
break;
case "hyperlink":
this.addButton(this.theList.id + "ButtonLink", "widgButtonLink", "Hyperlink", "link");
break;
case "unorderedlist":
this.addButton(this.theList.id + "ButtonUnordered", "widgButtonUnordered", "Unordered List", "insertunorderedlist");
break;
case "orderedlist":
this.addButton(this.theList.id + "ButtonOrdered", "widgButtonOrdered", "Ordered List", "insertorderedlist");
break;
case "image":
this.addButton(this.theList.id + "ButtonImage", "widgButtonImage", "Insert Image", "image");
break;
case "htmlsource":
this.addButton(this.theList.id + "ButtonHTML", "widgButtonHTML", "HTML Source", "html");
break;
case "blockformat":
this.addSelect(this.theList.id + "SelectBlock", "widgSelectBlock", widgSelectBlockOptions, "formatblock");
break;
}
}
return true;
}
/* Add button to toolbar */
widgToolbar.prototype.addButton = function(theID, theClass, theLabel, theAction)
{
var menuItem = document.createElement("li");
var theLink = document.createElement("a");
var theText = document.createTextNode(theLabel);
menuItem.id = theID;
menuItem.className = "widgEditButton";
theLink.href = "#";
theLink.title = theLabel;
theLink.className = theClass;
theLink.action = theAction;
theLink.onclick = widgToolbarAction;
theLink.onmouseover = widgToolbarMouseover;
theLink.appendChild(theText);
menuItem.appendChild(theLink);
this.theList.appendChild(menuItem);
return true;
}
/* Add select box to toolbar. theContentArray is an array of string pairs (option value, option label) */
widgToolbar.prototype.addSelect = function(theID, theClass, theContentArray, theAction)
{
var menuItem = document.createElement("li");
var theSelect = document.createElement("select");
menuItem.className = "widgEditSelect";
theSelect.id = theID;
theSelect.name = theID;
theSelect.className = theClass;
theSelect.action = theAction;
theSelect.onchange = widgToolbarAction;
for (var i = 0; i < theContentArray.length; i += 2)
{
var theOption = document.createElement("option");
var theText = document.createTextNode(theContentArray[i + 1]);
theOption.value = theContentArray[i];
theOption.appendChild(theText);
theSelect.appendChild(theOption);
}
menuItem.appendChild(theSelect);
this.theList.appendChild(menuItem);
return true;
}
/* Turn off toolbar items */
widgToolbar.prototype.disable = function()
{
/* Change class to disable buttons using CSS */
this.theList.className += " widgSource";
/* Loop through lis */
for (var i = 0; i < this.theList.childNodes.length; i++)
{
var theChild = this.theList.childNodes[i];
if (theChild.nodeName.toLowerCase() == "li" && theChild.className == "widgEditSelect")
{
/* Loop through li children to find select */
for (j = 0; j < theChild.childNodes.length; j++)
{
if (theChild.childNodes[j].nodeName.toLowerCase() == "select")
{
theChild.childNodes[j].disabled = "disabled";
break;
}
}
}
}
return true;
}
/* Turn on toolbar items */
widgToolbar.prototype.enable = function()
{
/* Change class to enable buttons using CSS */
this.theList.className = this.theList.className.replace(/ widgSource/, "");
/* Loop through lis */
for (var i = 0; i < this.theList.childNodes.length; i++)
{
var theChild = this.theList.childNodes[i];
if (theChild.nodeName.toLowerCase() == "li" && theChild.className == "widgEditSelect")
{
/* Loop through li children to find select */
for (j = 0; j < theChild.childNodes.length; j++)
{
if (theChild.childNodes[j].nodeName.toLowerCase() == "select")
{
theChild.childNodes[j].disabled = "";
break;
}
}
}
}
return true;
}
/* Change the status of the selected toolbar item */
widgToolbar.prototype.setState = function(theState, theStatus)
{
if (theState != "SelectBlock")
{
var theButton = document.getElementById(this.theList.id + "Button" + theState);
if (theButton != null)
{
if (theStatus == "on")
{
theButton.className = theButton.className.addClass("on");
}
else
{
theButton.className = theButton.className.removeClass("on");
}
}
}
else
{
var theSelect = document.getElementById(this.theList.id + "SelectBlock");
if (theSelect != null)
{
theSelect.value = "";
theSelect.value = theStatus;
}
}
return true;
}
/* Action taken when toolbar item activated */
function widgToolbarAction()
{
var theToolbar = this.parentNode.parentNode.widgToolbarObject;
var theWidgEditor = theToolbar.widgEditorObject;
var theIframe = theWidgEditor.theIframe;
var theSelection = "";
/* If somehow a button other than "HTML source" is clicked while viewing HTML source, ignore click */
if (!theWidgEditor.wysiwyg && this.action != "html")
{
return false;
}
switch (this.action)
{
case "formatblock":
theIframe.contentWindow.document.execCommand(this.action, false, this.value);
theWidgEditor.theToolbar.setState("SelectBlock", this.value);
break;
case "html":
theWidgEditor.switchMode();
break;
case "link":
if (this.parentNode.className.classExists("on"))
{
theIframe.contentWindow.document.execCommand("Unlink", false, null);
theWidgEditor.theToolbar.setState("Link", "off");
}
else
{
if (theIframe.contentWindow.document.selection)
{
theSelection = theIframe.contentWindow.document.selection.createRange().text;
if (theSelection == "")
{
alert("Please select the text you wish to hyperlink.");
break;
}
}
else
{
theSelection = theIframe.contentWindow.getSelection();
if (theSelection == "")
{
alert("Please select the text you wish to hyperlink.");
break;
}
}
var theURL = prompt("Enter the URL for this link:", "http://");
if (theURL != null)
{
theIframe.contentWindow.document.execCommand("CreateLink", false, theURL);
theWidgEditor.theToolbar.setState("Link", "on");
}
}
break;
case "image":
var theImage = prompt("Enter the location for this image:", "");
if (theImage != null && theImage != "")
{
var theAlt = prompt("Enter the alternate text for this image:", "");
var theSelection = null;
var theRange = null;
/* IE selections */
if (theIframe.contentWindow.document.selection)
{
/* Escape quotes in alt text */
theAlt = theAlt.replace(/"/g, "'");
theSelection = theIframe.contentWindow.document.selection;
theRange = theSelection.createRange();
theRange.collapse(false);
theRange.pasteHTML("<img alt=\"" + theAlt + "\" src=\"" + theImage + "\" />");
break;
}
/* Mozilla selections */
else
{
try
{
theSelection = theIframe.contentWindow.getSelection();
}
catch (e)
{
return false;
}
theRange = theSelection.getRangeAt(0);
theRange.collapse(false);
var theImageNode = theIframe.contentWindow.document.createElement("img");
theImageNode.src = theImage;
theImageNode.alt = theAlt;
theRange.insertNode(theImageNode);
break;
}
}
else
{
return false;
}
default:
theIframe.contentWindow.document.execCommand(this.action, false, null);
var theAction = this.action.replace(/^./, function(match){return match.toUpperCase();});
/* Turn off unordered toolbar item if ordered toolbar item was activated */
if (this.action == "insertorderedlist")
{
theAction = "Ordered";
theWidgEditor.theToolbar.setState("Unordered", "off");
}
/* Turn off ordered toolbar item if unordered toolbar item was activated */
if (this.action == "insertunorderedlist")
{
theAction = "Unordered";
theWidgEditor.theToolbar.setState("Ordered", "off");
}
/* If toolbar item was turned on */
if (theIframe.contentWindow.document.queryCommandState(this.action, false, null))
{
theWidgEditor.theToolbar.setState(theAction, "on");
}
else
{
theWidgEditor.theToolbar.setState(theAction, "off");
}
}
if (theWidgEditor.wysiwyg == true)
{
theIframe.contentWindow.focus();
}
else
{
theWidgEditor.theTextarea.focus();
}
return false;
}
/* Check the nesting of the current cursor position/selection */
function widgToolbarCheckState(theWidgEditor, resubmit)
{
if (!resubmit)
{
/* Allow browser to update selection before using the selection */
setTimeout(function(){widgToolbarCheckState(theWidgEditor, true); return true;}, 500);
}
var theSelection = null;
var theRange = null;
var theParentNode = null;
var theLevel = 0;
/* Turn off all the buttons */
var menuListItems = theWidgEditor.theToolbar.theList.childNodes;
for (var i = 0; i < menuListItems.length; i++)
{
menuListItems[i].className = menuListItems[i].className.removeClass("on");
}
/* IE selections */
if (theWidgEditor.theIframe.contentWindow.document.selection)
{
theSelection = theWidgEditor.theIframe.contentWindow.document.selection;
theRange = theSelection.createRange();
try
{
theParentNode = theRange.parentElement();
}
catch (e)
{
return false;
}
}
/* Mozilla selections */
else
{
try
{
theSelection = theWidgEditor.theIframe.contentWindow.getSelection();
}
catch (e)
{
return false;
}
theRange = theSelection.getRangeAt(0);
theParentNode = theRange.commonAncestorContainer;
}
while (theParentNode.nodeType == 3)
{
theParentNode = theParentNode.parentNode;
}
while (theParentNode.nodeName.toLowerCase() != "body")
{
switch (theParentNode.nodeName.toLowerCase())
{
case "a":
theWidgEditor.theToolbar.setState("Link", "on");
break;
case "em":
theWidgEditor.theToolbar.setState("Italic", "on");
break;
case "li":
break;
case "ol":
theWidgEditor.theToolbar.setState("Ordered", "on");
theWidgEditor.theToolbar.setState("Unordered", "off");
break;
case "span":
if (theParentNode.getAttribute("style") == "font-weight: bold;")
{
theWidgEditor.theToolbar.setState("Bold", "on");
}
else if (theParentNode.getAttribute("style") == "font-style: italic;")
{
theWidgEditor.theToolbar.setState("Italic", "on");
}
else if (theParentNode.getAttribute("style") == "font-weight: bold; font-style: italic;")
{
theWidgEditor.theToolbar.setState("Bold", "on");
theWidgEditor.theToolbar.setState("Italic", "on");
}
else if (theParentNode.getAttribute("style") == "font-style: italic; font-weight: bold;")
{
theWidgEditor.theToolbar.setState("Bold", "on");
theWidgEditor.theToolbar.setState("Italic", "on");
}
break;
case "strong":
theWidgEditor.theToolbar.setState("Bold", "on");
break;
case "ul":
theWidgEditor.theToolbar.setState("Unordered", "on");
theWidgEditor.theToolbar.setState("Ordered", "off");
break;
default:
theWidgEditor.theToolbar.setState("SelectBlock", "<" + theParentNode.nodeName.toLowerCase() + ">");
break;
}
theParentNode = theParentNode.parentNode;
theLevel++;
}
return true;
}
/* Turn off browser status display for toolbar items */
function widgToolbarMouseover()
{
window.status = "";
return true;
}
function acceptableChildren(theNode)
{
var theChildren = theNode.childNodes;
for (var i = 0; i < theChildren.length; i++)
{
if (!theChildren[i].nodeName.isAcceptedElementName())
{
if (!theChildren[i].nodeName.isInlineName())
{
if (theNode.nodeName.toLowerCase() == "p")
{
acceptableChildren(replaceNodeWithChildren(theNode));
return true;
}
changeNodeType(theChildren[i], "p");
}
else
{
replaceNodeWithChildren(theChildren[i]);
}
i = -1;
}
}
for (var i = 0; i < theChildren.length; i++)
{
acceptableChildren(theChildren[i]);
}
return true;
}
/* Change the type of a node, e.g. h3 to p */
function changeNodeType(theNode, nodeType)
{
var theChildren = new Array();
var theNewNode = document.createElement(nodeType);
var theParent = theNode.parentNode;
if (theParent != null)
{
for (var i = 0; i < theNode.childNodes.length; i++)
{
theChildren.push(theNode.childNodes[i].cloneNode(true));
}
for (var i = 0; i < theChildren.length; i++)
{
theNewNode.appendChild(theChildren[i]);
}
theParent.replaceChild(theNewNode, theNode);
}
return true;
}
/* Replace a node with its children -- delete the item and move its children up one level in the hierarchy */
function replaceNodeWithChildren(theNode)
{
var theChildren = new Array();
var theParent = theNode.parentNode;
if (theParent != null)
{
for (var i = 0; i < theNode.childNodes.length; i++)
{
theChildren.push(theNode.childNodes[i].cloneNode(true));
}
for (var i = 0; i < theChildren.length; i++)
{
theParent.insertBefore(theChildren[i], theNode);
}
theParent.removeChild(theNode);
return theParent;
}
return true;
}
/* Add a class to a string */
String.prototype.addClass = function(theClass)
{
if (this != "")
{
if (!this.classExists(theClass))
{
return this + " " + theClass;
}
}
else
{
return theClass;
}
return this;
}
/* Check if a class exists in a string */
String.prototype.classExists = function(theClass)
{
var regString = "(^| )" + theClass + "\W*";
var regExpression = new RegExp(regString);
if (regExpression.test(this))
{
return true;
}
return false;
}
/* Check if a string is the nodeName of an accepted element */
String.prototype.isAcceptedElementName = function()
{
var elementList = new Array("#text", "a", "em", "h1", "h2", "h3", "h4", "h5", "h6", "img", "li", "ol", "p", "strong", "ul");
var theName = this.toLowerCase();
for (var i = 0; i < elementList.length; i++)
{
if (theName == elementList[i])
{
return true;
}
}
return false;
}
/* Check if a string is the nodeName of an inline element */
String.prototype.isInlineName = function()
{
var inlineList = new Array("#text", "a", "em", "font", "span", "strong", "u");
var theName = this.toLowerCase();
for (var i = 0; i < inlineList.length; i++)
{
if (theName == inlineList[i])
{
return true;
}
}
return false;
}
/* Remove a class from a string */
String.prototype.removeClass = function(theClass)
{
var regString = "(^| )" + theClass + "\W*";
var regExpression = new RegExp(regString);
return this.replace(regExpression, "");
}
/* Reverse a string */
String.prototype.reverse = function()
{
var theString = "";
for (var i = this.length - 1; i >= 0; i--)
{
theString += this.charAt(i);
}
return theString;
}
/* Make tags valid by converting uppercase element and attribute names to lowercase and quoting attributes */
String.prototype.validTags = function()
{
var theString = this;
/* Replace uppercase element names with lowercase */
theString = theString.replace(/<[^> ]*/g, function(match){return match.toLowerCase();});
/* Replace uppercase attribute names with lowercase */
theString = theString.replace(/<[^>]*>/g, function(match)
{
match = match.replace(/ [^=]+=/g, function(match2){return match2.toLowerCase();});
return match;
});
/* Put quotes around unquoted attributes */
theString = theString.replace(/<[^>]*>/g, function(match)
{
match = match.replace(/( [^=]+=)([^"][^ >]*)/g, "$1\"$2\"");
return match;
});
return theString;
}
|