Advertisement
cgrunwald

Untitled

Feb 10th, 2011
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * Added some settings to it. By default, it returns the xml without
  3.  * any formatting, but if you need to look it over easily, you can
  4.  * turn it on. The rest should be self-explanatory, but if you have
  5.  * any questions, let me know.
  6.  *
  7.  * Example Usages:
  8.  *
  9.  * var xmlDoc = apex.widget.tree.serialize();
  10.  * $.post("http://example.com", xmlDoc, function(data) {
  11.  *      stuff();
  12.  * });
  13.  *
  14.  * $("textarea").val(
  15.  *      apex.widget.tree.serialize(
  16.  *          {
  17.  *              outputFormat: true,
  18.  *              txtFormat:true
  19.  *          }
  20.  *      )
  21.  * );
  22.  *
  23.  */
  24. (function($tree) {
  25.     $tree.serialize = function(settings) {
  26.         var _sets = {};
  27.         var _defaults = {
  28.             outputFormat: false,    // for debugging purposes
  29.             txtFormat: false,       // ^
  30.             sIndent: "\t",          // ^
  31.             domRoot: 'categories',
  32.             skip: [],
  33.             replace: [],
  34.             nodes: [],
  35.             errors: []
  36.         };
  37.  
  38.         var getIndent = function(depth) {
  39.             var output = '';
  40.             for (var i = 0; i < depth; i++) {
  41.                 output += _sets.sIndent;
  42.             }
  43.             return output; 
  44.         };
  45.  
  46.         var getPropertyName = function(ptPar, name) {
  47.             var _i = _sets.replace.length;
  48.             var searchName = ptPar + name;
  49.             while (_i--) {
  50.                 if (_sets.replace[_i].hasOwnProperty(searchName)) {
  51.                     return _sets.replace[_i][searchName];
  52.                 }
  53.             }
  54.             return name;
  55.         };
  56.        
  57.         var arrayToNode = function(src, name, path, depth, suff) {
  58.             var _node = '';
  59.             if (src.length > 0) {
  60.                 for (var _i in src) {
  61.                     if (typeof(src[_i]) !== 'object') {
  62.                         if (src[_i] === "") {
  63.                             _node += getIndent(depth) + '<' + name + '/>' + suff;                    
  64.                         }
  65.                         else {
  66.                             var textPrefix = (_sets.txtFormat)
  67.                         ? suff + getIndent(depth + 1) : '';
  68.                             var textsuff = (_sets.txtFormat)
  69.                                 ? suff + getIndent(depth) : '';                        
  70.                             _node += getIndent(depth) + '<' + name + '>'
  71.                                     + textPrefix + src[_i] + textsuff
  72.                                     + '</' + name + '>' + suff;                                              
  73.                         }
  74.                     }
  75.                     else {
  76.                         _node += toDOM(src[_i], name, path, depth);
  77.                     }                  
  78.                 }
  79.             }  
  80.             else {
  81.                 _node += getIndent(depth) + '<' + name + '/>' + suff;
  82.             }
  83.             return _node;
  84.         }; 
  85.         var txtNode = function(name, text, parentDepth, suff) {
  86.             var textPrefix = (_sets.txtFormat)
  87.                 ? suff + getIndent(parentDepth + 2) : '';
  88.             var textsuff = (_sets.txtFormat)
  89.                 ? suff + getIndent(parentDepth + 1) : '';
  90.             var _node = getIndent(parentDepth + 1) + '<' + name + '>'
  91.                         + textPrefix + text + textsuff
  92.                         + '</' + name + '>' + suff;
  93.             return _node;
  94.         };
  95.         var toDOM = function(json, domRoot, ptPar, depth) {
  96.             var suff = (_sets.outputFormat) ? '\r\n' : '';
  97.             var indent = (_sets.outputFormat) ? getIndent(depth) : '';
  98.             var xmlChar = indent + '<' + domRoot;
  99.             var children = '';
  100.            
  101.             for (var key in json) {
  102.                 if (json.hasOwnProperty(key)) {
  103.                     var propPath = ptPar + key;
  104.                     var propertyName = getPropertyName(ptPar, key);
  105.                     if ($.inArray(propPath, _sets.skip) == -1) {
  106.                         if ($.isArray(json[key])) {
  107.                             children += arrayToNode(json[key], propertyName,
  108.                                     propPath + '.', depth + 1, suff);
  109.                         }
  110.                         else if (typeof(json[key]) === 'object') {
  111.                             children += toDOM(json[key], propertyName,propPath + '.', depth + 1);
  112.                         }
  113.                         else {
  114.                             // shouldnt be a node
  115.                             if ($.inArray(propPath, _sets.nodes) != -1) {
  116.                                 children += txtNode(propertyName, json[key],depth, suff);
  117.                             }
  118.                             else {
  119.                                 xmlChar += ' ' + propertyName + '="' +  json[key] + '"';
  120.                             }
  121.                         }
  122.                     }
  123.                 }
  124.             }
  125.             if (children !== '') {
  126.                 xmlChar += '>' + suff + children + indent + '</' + domRoot + '>' + suff;
  127.             }
  128.             else {
  129.                 xmlChar += '/>' + suff;
  130.             }
  131.             return xmlChar;    
  132.         };
  133.        
  134.         var childTraversal = function() {
  135.             var _domCollection = {"category" : []};
  136.             $(".tree li").each(function(_i,_e) {
  137.                 var newCategory = {
  138.                     "title" : $(this).children("a").text().trim(),
  139.                     "id" : $(this).attr("id")
  140.                 };
  141.                                
  142.                 if (newCategory.id != "0") {
  143.                     newCategory.parent = $(this).parent().parent().attr("id");
  144.                     $(this).parent().children().each(function(ci,ce) {
  145.                         if ($(ce).attr("id") == newCategory.id) {
  146.                             newCategory.seq = ci;
  147.                         }
  148.                     });
  149.                 }
  150.        
  151.                 _domCollection.category.push(newCategory);
  152.                
  153.             });
  154.             return _domCollection;
  155.         };
  156.        
  157.         _sets = $.extend(true, _sets, _defaults, settings || { });
  158.         // In case you need a valid xml header, remove the last line and uncomment the line below.
  159.         //return '<?xml version="1.0" encoding="utf-8" ?>\r\n' + toDOM(childTraversal(), _sets.domRoot, '', 0);
  160.         return toDOM(childTraversal(), _sets.domRoot, '', 0);
  161.  
  162.     };
  163. })(apex.widget.tree);
  164.  
  165. /* First attempt resulted in way too much recursion.
  166.  
  167. (function() {
  168. //var rgXp = /var\s([^\s]+)\s?=\s?\[/i;
  169. //var match = rgXp.exec($('div#body td.tbl-main > script:eq(0)').text());
  170. //var _varname = match[1];
  171.    
  172.     function clickCallback(e) {
  173.         var objDOM = $.tree.reference($('td.tbl-main > div[id*="tree"]').get()).get();
  174.         var _domCollection = {
  175.             "categories" : {
  176.                 "category" : []
  177.             }
  178.         };
  179.         function childTraversal(_i,_el) {
  180.            
  181.             function createDOM(_ci,_cel) {
  182.                 var _title;
  183.                 if(_cel.data.title.length == 0) {
  184.                     if($("#" + _cel.attributes.id).length == 0) {
  185.                         _title = $(_el.attributes.id).children("li:eq("+_ci+")").children("a").text().trim();
  186.                     } else {
  187.                         _title = $("#" + _cel.attributes.id).children("a").text().trim();
  188.                     }
  189.                 } else {
  190.                     _title = _cel.data.title;
  191.                 }
  192.                
  193.                 var newCategory = {
  194.                     "id" : _cel.attributes.id,
  195.                     "parent" : _el.attributes.id,
  196.                     "title" : _title,
  197.                 };
  198.                 _domCollection.categories.push(newCategory);
  199.                 if(typeof(this.children)!= "undefined") {
  200.                     $(this.children).map(createDOM).map(childTraversal);
  201.                 }
  202.             }
  203.             if(typeof(this.children)!= "undefined") {
  204.                 objDOM.children(_el).map(childTraversal);//createDOM);
  205.             }
  206.         }
  207.         $(objDOM.children).unwrap().map(childTraversal);
  208.         return false;
  209.     }
  210.     $('button[value="Save"]').css("margin-top", "50px").click(clickCallback);
  211. })(this);
  212. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement