home *** CD-ROM | disk | FTP | other *** search
/ ftp.swcp.com / ftp.swcp.com.zip / ftp.swcp.com / mac / mozilla-macos9-1.3.1.sea.bin / Mozilla1.3.1 / Chrome / comm.jar / content / editor / EdAEHTMLAttributes.js < prev    next >
Text File  |  2003-06-08  |  12KB  |  403 lines

  1. /*
  2.  * The contents of this file are subject to the Netscape Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/NPL/
  6.  *
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  *
  12.  * The Original Code is Mozilla Communicator client code, released
  13.  * March 31, 1998.
  14.  *
  15.  * The Initial Developer of the Original Code is Netscape
  16.  * Communications Corporation. Portions created by Netscape are
  17.  * Copyright (C) 1998-1999 Netscape Communications Corporation. All
  18.  * Rights Reserved.
  19.  *
  20.  * Contributor(s):
  21.  *   Ben "Count XULula" Goodger
  22.  */
  23.  
  24. function BuildHTMLAttributeNameList()
  25. {
  26.   gDialog.AddHTMLAttributeNameInput.removeAllItems();
  27.   
  28.   var elementName = gElement.localName.toLowerCase();
  29.   var attNames = gHTMLAttr[elementName];
  30.  
  31.   if (attNames && attNames.length)
  32.   {
  33.     var menuitem;
  34.  
  35.     for (var i = 0; i < attNames.length; i++)
  36.     {
  37.       var name = attNames[i];
  38.       var limitFirstChar;
  39.  
  40.       if (name == "_core")
  41.       {
  42.         // Signal to append the common 'core' attributes.
  43.         for (var j = 0; j < gCoreHTMLAttr.length; j++)
  44.         {
  45.           name = gCoreHTMLAttr[j];
  46.  
  47.           // "limitFirstChar" is the only filtering rule used for core attributes as of 8-20-01
  48.           // Add more rules if necessary          
  49.           limitFirstChar = name.indexOf("^") >= 0;
  50.           if (limitFirstChar)
  51.           {
  52.             menuitem = gDialog.AddHTMLAttributeNameInput.appendItem(name.replace(/\^/g, ""));
  53.             menuitem.setAttribute("limitFirstChar", "true");
  54.           }
  55.           else
  56.             gDialog.AddHTMLAttributeNameInput.appendItem(name);
  57.         }
  58.       }
  59.       else if (name == "-")
  60.       {
  61.         // Signal for separator
  62.         var popup = gDialog.AddHTMLAttributeNameInput.firstChild;
  63.         if (popup)
  64.         {
  65.           var sep = document.createElementNS(XUL_NS, "menuseparator");
  66.           if (sep)
  67.             popup.appendChild(sep);
  68.         }        
  69.       }
  70.       else
  71.       {
  72.         // Get information about value filtering
  73.         var forceOneChar = name.indexOf("!") >= 0;
  74.         var forceInteger = name.indexOf("#") >= 0;
  75.         var forceSignedInteger = name.indexOf("+") >= 0;
  76.         var forceIntOrPercent = name.indexOf("%") >= 0;
  77.         limitFirstChar = name.indexOf("\^") >= 0;
  78.         //var required = name.indexOf("$") >= 0;
  79.  
  80.         // Strip flag characters
  81.         name = name.replace(/[!^#%$+]/g, "");
  82.  
  83.         menuitem = gDialog.AddHTMLAttributeNameInput.appendItem(name);
  84.         if (menuitem)
  85.         {
  86.           // Signify "required" attributes by special style
  87.           //TODO: Don't do this until next version, when we add
  88.           //      explanatory text and an 'Autofill Required Attributes' button
  89.           //if (required)
  90.           //  menuitem.setAttribute("class", "menuitem-highlight-1");
  91.  
  92.           // Set flags to filter value input
  93.           if (forceOneChar)
  94.             menuitem.setAttribute("forceOneChar","true");
  95.           if (limitFirstChar)
  96.             menuitem.setAttribute("limitFirstChar", "true");
  97.           if (forceInteger)
  98.             menuitem.setAttribute("forceInteger", "true");
  99.           if (forceSignedInteger)
  100.             menuitem.setAttribute("forceSignedInteger", "true");
  101.           if (forceIntOrPercent)
  102.             menuitem.setAttribute("forceIntOrPercent", "true");
  103.         }
  104.       }
  105.     }
  106.   }
  107. }
  108.  
  109. // build attribute list in tree form from element attributes
  110. function BuildHTMLAttributeTable()
  111. {
  112.   var nodeMap = gElement.attributes;
  113.   var i;
  114.   if (nodeMap.length > 0) 
  115.   {
  116.     var added = false;
  117.     for(i = 0; i < nodeMap.length; i++)
  118.     {
  119.       if ( CheckAttributeNameSimilarity( nodeMap[i].nodeName, HTMLAttrs ) ||
  120.           IsEventHandler( nodeMap[i].nodeName ) ||
  121.           TrimString( nodeMap[i].nodeName.toLowerCase() ) == "style" ) {
  122.         continue;   // repeated or non-HTML attribute, ignore this one and go to next
  123.       }
  124.       var name  = nodeMap[i].name.toLowerCase();
  125.       if ( name.indexOf("_moz") != 0 &&
  126.            AddTreeItem(name, nodeMap[i].value, "HTMLAList", HTMLAttrs) )
  127.       {
  128.         added = true;
  129.       }
  130.     }
  131.  
  132.     if (added)
  133.       SelectHTMLTree(0);
  134.   }
  135. }
  136.  
  137. // add or select an attribute in the tree widget
  138. function onChangeHTMLAttribute()
  139. {
  140.   var name = TrimString(gDialog.AddHTMLAttributeNameInput.value);
  141.   if (!name)
  142.     return;
  143.  
  144.   var value = TrimString(gDialog.AddHTMLAttributeValueInput.value);
  145.  
  146.   // First try to update existing attribute
  147.   // If not found, add new attribute
  148.   if (!UpdateExistingAttribute( name, value, "HTMLAList" ) && value)
  149.     AddTreeItem (name, value, "HTMLAList", HTMLAttrs);
  150. }
  151.  
  152. function ClearHTMLInputWidgets()
  153. {
  154.   gDialog.AddHTMLAttributeTree.treeBoxObject.selection.clearSelection();
  155.   gDialog.AddHTMLAttributeNameInput.value ="";
  156.   gDialog.AddHTMLAttributeValueInput.value = "";
  157.   SetTextboxFocus(gDialog.AddHTMLAttributeNameInput);
  158. }
  159.  
  160. function onSelectHTMLTreeItem()
  161. {
  162.   if (!gDoOnSelectTree)
  163.     return;
  164.  
  165.   var tree = gDialog.AddHTMLAttributeTree;
  166.   if (tree && tree.treeBoxObject.selection.count)
  167.   {
  168.     var inputName = TrimString(gDialog.AddHTMLAttributeNameInput.value).toLowerCase();
  169.     var selectedItem = getSelectedItem(tree);
  170.     var selectedName = selectedItem.firstChild.firstChild.getAttribute("label");
  171.  
  172.     if (inputName == selectedName)
  173.     {
  174.       // Already editing selected name - just update the value input
  175.       gDialog.AddHTMLAttributeValueInput.value = GetTreeItemValueStr(selectedItem);
  176.     }
  177.     else
  178.     {
  179.       gDialog.AddHTMLAttributeNameInput.value = selectedName;
  180.  
  181.       // Change value input based on new selected name
  182.       onInputHTMLAttributeName();
  183.     }
  184.   }
  185. }
  186.  
  187. function onInputHTMLAttributeName()
  188. {
  189.   var attName = TrimString(gDialog.AddHTMLAttributeNameInput.value).toLowerCase();
  190.  
  191.   // Clear value widget, but prevent triggering update in tree
  192.   gUpdateTreeValue = false;
  193.   gDialog.AddHTMLAttributeValueInput.value = "";
  194.   gUpdateTreeValue = true; 
  195.  
  196.   if (attName)
  197.   {
  198.     // Get value list for current attribute name
  199.     var valueListName;
  200.  
  201.     // Most elements have the "dir" attribute,
  202.     //   so we have just one array for the allowed values instead
  203.     //   requiring duplicate entries for each element in EdAEAttributes.js
  204.     if (attName == "dir")
  205.       valueListName = "all_dir";
  206.     else
  207.       valueListName = gElement.localName.toLowerCase() + "_" + attName;
  208.  
  209.     // Strip off leading "_" we sometimes use (when element name is reserved word)
  210.     if (valueListName[0] == "_")
  211.       valueListName = valueListName.slice(1);
  212.  
  213.     var newValue = "";
  214.     var listLen = 0;
  215.  
  216.     // Index to which widget we were using to edit the value
  217.     var deckIndex = gDialog.AddHTMLAttributeValueDeck.getAttribute("selectedIndex");
  218.  
  219.     if (valueListName in gHTMLAttr)
  220.     {
  221.       var valueList = gHTMLAttr[valueListName];
  222.  
  223.       listLen = valueList.length;
  224.       if (listLen > 0)
  225.         newValue = valueList[0];
  226.  
  227.       // Note: For case where "value list" is actually just 
  228.       // one (default) item, don't use menulist for that
  229.       if (listLen > 1)
  230.       {
  231.         gDialog.AddHTMLAttributeValueMenulist.removeAllItems();
  232.  
  233.         if (deckIndex != "1")
  234.         {
  235.           // Switch to using editable menulist
  236.           gDialog.AddHTMLAttributeValueInput = gDialog.AddHTMLAttributeValueMenulist;
  237.           gDialog.AddHTMLAttributeValueDeck.setAttribute("selectedIndex", "1");
  238.         }
  239.         // Rebuild the list
  240.         for (var i = 0; i < listLen; i++)
  241.         {
  242.           if (valueList[i] == "-")
  243.           {
  244.             // Signal for separator
  245.             var popup = gDialog.AddHTMLAttributeValueInput.firstChild;
  246.             if (popup)
  247.             {
  248.               var sep = document.createElementNS(XUL_NS, "menuseparator");
  249.               if (sep)
  250.                 popup.appendChild(sep);
  251.             }        
  252.           } else {
  253.             gDialog.AddHTMLAttributeValueMenulist.appendItem(valueList[i]);
  254.           }
  255.         }
  256.       }
  257.     }
  258.     
  259.     if (listLen <= 1 && deckIndex != "0")
  260.     {
  261.       // No list: Use textbox for input instead
  262.       gDialog.AddHTMLAttributeValueInput = gDialog.AddHTMLAttributeValueTextbox;
  263.       gDialog.AddHTMLAttributeValueDeck.setAttribute("selectedIndex", "0");
  264.     }
  265.  
  266.     // If attribute already exists in tree, use associated value,
  267.     //  else use default found above
  268.     var existingValue = GetAndSelectExistingAttributeValue(attName, "HTMLAList");
  269.     if (existingValue)
  270.       newValue = existingValue;
  271.       
  272.     gDialog.AddHTMLAttributeValueInput.value = newValue;
  273.   }
  274. }
  275.  
  276. function onInputHTMLAttributeValue()
  277. {
  278.   if (!gUpdateTreeValue)
  279.     return;
  280.  
  281.   var name = TrimString(gDialog.AddHTMLAttributeNameInput.value);
  282.   if (!name)
  283.     return;
  284.  
  285.   // Trim spaces only from left since we must allow spaces within the string
  286.   //  (we always reset the input field's value below)
  287.   var value = TrimStringLeft(gDialog.AddHTMLAttributeValueInput.value);
  288.   if (value)
  289.   {
  290.     // Do value filtering based on type of attribute
  291.     // (Do not use "LimitStringLength()" and "forceInteger()"
  292.     //  to avoid multiple reseting of input's value and flickering)
  293.     var selectedItem = gDialog.AddHTMLAttributeNameInput.selectedItem;
  294.  
  295.     if (selectedItem)
  296.     {
  297.       if ( selectedItem.getAttribute("forceOneChar") == "true" &&
  298.            value.length > 1 )
  299.         value = value.slice(0, 1);
  300.  
  301.       if ( selectedItem.getAttribute("forceIntOrPercent") == "true" )
  302.       {
  303.         // Allow integer with optional "%" as last character
  304.         var percent = TrimStringRight(value).slice(-1);
  305.         value = value.replace(/\D+/g,"");
  306.         if (percent == "%")
  307.           value += percent;
  308.       }
  309.       else if ( selectedItem.getAttribute("forceInteger") == "true" )
  310.       {
  311.         value = value.replace(/\D+/g,"");
  312.       }
  313.       else if ( selectedItem.getAttribute("forceSignedInteger") == "true" )
  314.       {
  315.         // Allow integer with optional "+" or "-" as first character
  316.         var sign = value[0];
  317.         value = value.replace(/\D+/g,"");
  318.         if (sign == "+" || sign == "-")
  319.           value = sign + value;
  320.       }
  321.       
  322.       // Special case attributes 
  323.       if (selectedItem.getAttribute("limitFirstChar") == "true")
  324.       {
  325.         // Limit first character to letter, and all others to 
  326.         //  letters, numbers, and a few others
  327.         value = value.replace(/^[^a-zA-Z\u0080-\uFFFF]/, "").replace(/[^a-zA-Z0-9_\.\-\:\u0080-\uFFFF]+/g,'');
  328.       }
  329.  
  330.       // Update once only if it changed
  331.       if (value != gDialog.AddHTMLAttributeValueInput.value)
  332.         gDialog.AddHTMLAttributeValueInput.value = value;
  333.     }
  334.   }
  335.  
  336.   // Update value in the tree list
  337.   // If not found, add new attribute
  338.   if ( !UpdateExistingAttribute(name, value, "HTMLAList" ) && value)
  339.     AddTreeItem(name, value, "HTMLAList", HTMLAttrs);
  340. }
  341.  
  342. function editHTMLAttributeValue(targetCell)
  343. {
  344.   if (IsNotTreeHeader(targetCell))
  345.     gDialog.AddHTMLAttributeValueInput.inputField.select();
  346. }
  347.  
  348.  
  349. // update the object with added and removed attributes
  350. function UpdateHTMLAttributes()
  351. {
  352.   var HTMLAList = document.getElementById("HTMLAList");
  353.   var i;
  354.  
  355.   // remove removed attributes
  356.   for (i = 0; i < HTMLRAttrs.length; i++)
  357.   {
  358.     var name = HTMLRAttrs[i];
  359.  
  360.     if (gElement.hasAttribute(name))
  361.       doRemoveAttribute(name);
  362.   }
  363.  
  364.   // Set added or changed attributes
  365.   for( i = 0; i < HTMLAList.childNodes.length; i++)
  366.   {
  367.     var item = HTMLAList.childNodes[i];
  368.     doSetAttribute( GetTreeItemAttributeStr(item), GetTreeItemValueStr(item));
  369.   }
  370. }
  371.  
  372. function RemoveHTMLAttribute()
  373. {
  374.   var treechildren = gDialog.AddHTMLAttributeTree.lastChild;
  375.  
  376.   // We only allow 1 selected item
  377.   if (gDialog.AddHTMLAttributeTree.treeBoxObject.selection.count)
  378.   {
  379.     var item = getSelectedItem(gDialog.AddHTMLAttributeTree);
  380.     var attr = GetTreeItemAttributeStr(item);
  381.  
  382.     // remove the item from the attribute array
  383.     HTMLRAttrs[HTMLRAttrs.length] = attr;
  384.     RemoveNameFromAttArray(attr, HTMLAttrs);
  385.  
  386.     // Remove the item from the tree
  387.     treechildren.removeChild(item);
  388.  
  389.     // Clear inputs and selected item in tree
  390.     ClearHTMLInputWidgets();
  391.   }
  392. }
  393.  
  394. function SelectHTMLTree( index )
  395. {
  396.  
  397.   gDoOnSelectTree = false;
  398.   try {
  399.     gDialog.AddHTMLAttributeTree.selectedIndex = index;
  400.   } catch (e) {}
  401.   gDoOnSelectTree = true;
  402. }
  403.