SOURCE CODE: Uize.Data.PathsTree
VIEW REFERENCE

/*______________
|       ______  |   U I Z E    J A V A S C R I P T    F R A M E W O R K
|     /      /  |   ---------------------------------------------------
|    /    O /   |    MODULE : Uize.Data.PathsTree Package
|   /    / /    |
|  /    / /  /| |    ONLINE : http://www.uize.com
| /____/ /__/_| | COPYRIGHT : (c)2009-2012 UIZE
|          /___ |   LICENSE : Available under MIT License or GNU General Public License
|_______________|             http://www.uize.com/license.html
*/

/* Module Meta Data
  type: Package
  importance: 2
  codeCompleteness: 100
  testCompleteness: 100
  docCompleteness: 2
*/

/*?
  Introduction
    The =Uize.Data.PathsTree= package provides methods for converting between a...

    *DEVELOPERS:* `Chris van Rensburg`
*/

Uize.module ({
  name:'Uize.Data.PathsTree',
  builder:function () {

    /*** Variables for Scruncher Optimization ***/
      var
        _undefined,
        _package = function () {},
        _sacredEmptyObject = {}
      ;

    /*** Public Static Methods ***/
      _package.toList = function (_tree,_delimiter) {
        if (_delimiter == _undefined)
          _delimiter = '.'
        ;
        var _paths = [];
        function _processTreeNode (_treeNode,_namespace) {
          _namespace && _paths.push (_namespace);
          for (var _subNodeName in _treeNode)
            _processTreeNode (_treeNode [_subNodeName],_namespace + (_namespace && _delimiter) + _subNodeName)
          ;
        }
        _processTreeNode (_tree,'');
        return _paths;
      };

      _package.fromList = function (_paths,_delimiter) {
        if (_delimiter == _undefined)
          _delimiter = '.'
        ;
        var _tree = {};
        for (var _pathNo = -1, _pathsLength = _paths.length; ++_pathNo < _pathsLength;) {
          var
            _path = _paths [_pathNo],
            _treeNode = _tree
          ;
          for (
            var
              _pathPartNo = -1,
              _pathParts = _path.split (_delimiter),
              _pathPartsLength = _pathParts.length,
              _pathPart
            ;
            ++_pathPartNo < _pathPartsLength;
          )
            _treeNode =
              _treeNode [_pathPart = _pathParts [_pathPartNo]] ||
              (_treeNode [_pathPart] = _pathPartsLength - 1 - _pathPartNo && {})
          ;
        }
        return _tree;
      };

    return _package;
  }
});