home *** CD-ROM | disk | FTP | other *** search
/ ftp6.securdisc.net / ftp6.securdisc.net.tar / ftp6.securdisc.net / SecurDiscViewer_Csy.chm / scripts / common.tree.js < prev    next >
Text File  |  2010-08-08  |  16KB  |  686 lines

  1. Schema.Tree = function ( init )
  2. {
  3.     var self = this;
  4.  
  5.     var contextMenuHandler = null;
  6.     var element = null;
  7.     var focusedNode = null;
  8.     var hasIcons;
  9.     var isRendered = false;
  10.     var loader = null;
  11.     var nodes = [];
  12.     var visualization = {};
  13.     
  14.     
  15.     this.AppendNode = function ( init )
  16.     {
  17.         var node;
  18.         if ( init instanceof Schema.TreeNode )
  19.             node = init;
  20.         else
  21.             node = new Schema.TreeNode ( init );
  22.             
  23.         node.InternalInit ( this, null, 1 );
  24.         node.Render ( );
  25.         nodes.push ( node );
  26.             
  27.         Schema.DOM.AppendChild ( node.GetElement(), this.GetElement() );
  28.         return ( node );
  29.     };
  30.     
  31.     
  32.     this.ClearNodes = function ( )
  33.     {
  34.         for ( var i = 0; i < nodes.length; i++ )
  35.             nodes[i].Destroy ( );
  36.             
  37.         nodes.splice ( 0, nodes.length );
  38.         focusedNode = null;
  39.     };
  40.     
  41.     
  42.     this.ExpandToNode = function ( node )
  43.     {
  44.         if ( node && node instanceof Schema.TreeNode )
  45.         {
  46.             var store = [];
  47.             var temp = node;
  48.             while ( temp )
  49.             {
  50.                 store.push ( temp );
  51.                 temp = temp.GetParent();
  52.             }
  53.             
  54.             for ( var i = store.length-1; i >= 0; i-- )
  55.                 store[i].Expand ( );
  56.         }
  57.     };
  58.  
  59.  
  60.     this.GetContextMenuHandler = function ( )
  61.     {
  62.         return ( contextMenuHandler );
  63.     };
  64.     
  65.     
  66.     this.GetElement = function ( )
  67.     {
  68.         return ( element );
  69.     };
  70.     
  71.     
  72.     this.GetFocusedNode = function ( )
  73.     {
  74.         return ( focusedNode );
  75.     };
  76.     
  77.     
  78.     this.GetNodeById = function ( id )
  79.     {
  80.         for ( var i = 0; i < nodes.length; i++ )
  81.         {
  82.             var search = nodes[i].GetNodeById ( id );
  83.             if ( search )
  84.                 return ( search );
  85.         }
  86.         
  87.         return ( null );
  88.     };
  89.  
  90.  
  91.     this.GetLoader = function ( )
  92.     {
  93.         return ( loader );
  94.     };
  95.  
  96.  
  97.     this.GetNodes = function ( )
  98.     {
  99.         return ( nodes );
  100.     };
  101.  
  102.  
  103.     this.GetVisualization = function ( )
  104.     {
  105.         return ( visualization ); 
  106.     };
  107.     
  108.     
  109.     this.HasIcons = function ( )
  110.     {
  111.         return ( hasIcons );
  112.     };
  113.     
  114.  
  115.     var Initialize = function ( init )
  116.     {
  117.         // Initialize render element...
  118.         if ( typeof(init.element) == "string" )
  119.             element = document.getElementById ( init.element );
  120.         else
  121.             element = init.element;
  122.         element.innerHTML = "";
  123.             
  124.         if ( !element )
  125.             throw "No element given for tree!";
  126.             
  127.         // Other data...
  128.         contextMenuHandler = init.contextMenuHandler ? init.contextMenuHandler : null;
  129.         loader             = init.loader ? init.loader : null;
  130.         visualization      = init.visualization ? init.visualization : Schema.TreeVisualization;
  131.         hasIcons           = init.hasIcons ? true : false;
  132.     };
  133.  
  134.  
  135.     this.InsertNode = function ( pos, init )
  136.     {
  137.         if ( pos < 0 || pos >= nodes.length )
  138.             return;
  139.             
  140.         var node;
  141.         if ( init instanceof Schema.TreeNode )
  142.             node = init;
  143.         else
  144.             node = new Schema.TreeNode ( init );
  145.             
  146.         node.InternalInit ( this, null, 1 );
  147.         node.Render ( );
  148.         
  149.         if ( pos == 0 )
  150.             Schema.DOM.PrependChild ( node.GetElement(), this.GetElement() );
  151.         else
  152.             Schema.DOM.InsertBefore ( node.GetElement(), nodes[pos].GetElement() );
  153.  
  154.         nodes.splice ( pos, 0, node );
  155.  
  156.         return ( node );
  157.     };
  158.  
  159.  
  160.     this.LoadStatic = function ( data )
  161.     {
  162.         this.ClearNodes ( );
  163.         if ( data.length > 0 )
  164.         {
  165.             for ( var i = 0; i < data.length; i++ )
  166.             {
  167.                 var node = this.AppendNode ( data[i] );
  168.                 node.LoadStatic ( data[i].nodes );
  169.             }
  170.         }
  171.         else
  172.         {
  173.             var node = this.AppendNode ( data );
  174.             node.LoadStatic ( data.nodes );
  175.         }
  176.     };
  177.     
  178.  
  179.     this.OnFocusedNodeChanged = function ( treeNode )
  180.     {
  181.     };
  182.  
  183.  
  184.     this.OnHighlightNode = function ( treeNode, select )
  185.     {
  186.         if ( select )
  187.             treeNode.GetSelectionElement().style.backgroundColor = "#B0B0FF";
  188.         else
  189.             treeNode.GetSelectionElement().style.backgroundColor = "Transparent";
  190.     };        
  191.  
  192.         
  193.     this.RemoveNode = function ( treeNode )
  194.     {
  195.         if ( treeNode && treeNode.GetParent() == this )
  196.         {
  197.             treeNode.Destroy ( );
  198.             var index = nodes.indexOf ( treeNode );
  199.             if ( index >= 0 )
  200.                 nodes.splice ( index, 1 );
  201.         }
  202.         else if ( treeNode )
  203.             treeNode.GetParent().RemoveNode ( treeNode );
  204.             
  205.         if ( treeNode == focusedNode )
  206.         {
  207.             focusedNode = null;
  208.             this.OnFocusedNodeChanged ( null );
  209.         }
  210.     };
  211.     
  212.  
  213.     this.Reload = function ( )
  214.     {
  215.         if ( loader )
  216.         {
  217.             this.ClearNodes ( );
  218.             loader.Request ( null );
  219.         }
  220.     };
  221.  
  222.  
  223.     this.Render = function ( )
  224.     {
  225.         if ( isRendered )
  226.             return;
  227.  
  228.         isRendered = true;
  229.                                 
  230.         if ( loader )
  231.         {
  232.             loader.Request ( null );
  233.         }
  234.         else
  235.         {
  236.             for ( var i = 0; i < nodes.length; i++ )
  237.                 nodes[i].Render ( );
  238.         }            
  239.     };
  240.     
  241.     Initialize ( init );
  242. };
  243.  
  244. Schema.Tree.IconPath = "resources/tree/";
  245.  
  246.  
  247.  
  248. Schema.TreeNode = function ( init )
  249. {
  250.     var self = this;
  251.     
  252.     var attributes;
  253.     var childContainer = null;
  254.     var collapsed = true;
  255.     var element = null;
  256.     var href = "";
  257.     var icon = null;
  258.     var id;
  259.     var imgElement;
  260.     var isRendered = false;
  261.     var leaf = false;
  262.     var level = 0;
  263.     var nodes = [];
  264.     var parent = null;
  265.     var selectionElement;
  266.     var text = "";
  267.     var tree = null;
  268.     
  269.     
  270.     this.AppendNode = function ( init )
  271.     {
  272.         var node;
  273.         if ( init instanceof Schema.TreeNode )
  274.             node = init;
  275.         else
  276.             node = new Schema.TreeNode ( init );
  277.             
  278.         nodes.push ( node );
  279.         node.InternalInit ( tree, this, level+1 );
  280.         node.Render ( );
  281.         
  282.         Schema.DOM.AppendChild ( node.GetElement(), childContainer );
  283.             
  284.         leaf = false;
  285.         UpdateToggleImage ( );
  286.  
  287.         return ( node );
  288.     };
  289.  
  290.  
  291.     this.ClearNodes = function ( )
  292.     {
  293.         for ( var i = 0; i < nodes.length; i++ )
  294.             nodes[i].Destroy ( );
  295.             
  296.         nodes.splice ( 0, nodes.length );
  297.     };
  298.  
  299.  
  300.     this.ClearSelect = function ( )
  301.     {
  302.         tree.OnHighlightNode ( this, false );
  303.     };
  304.     
  305.  
  306.     this.Collapse = function ( )
  307.     {
  308.         collapsed = true;
  309.         childContainer.style.display = 'none';
  310.  
  311.         UpdateToggleImage ( );        
  312.     };
  313.  
  314.  
  315.     this.Destroy = function ( )
  316.     {
  317.         // Destroy own panel...
  318.         var elem = this.GetElement ( );
  319.         if ( elem )
  320.         {
  321.             Schema.DOM.RemoveElement ( elem );
  322.             elem = null;
  323.         }
  324.     };
  325.  
  326.  
  327.     this.Expand = function ( )
  328.     {
  329.         for ( var i = 0; i < nodes.length; i++ )
  330.             nodes[i].Collapse ( );
  331.  
  332.         var loader = tree.GetLoader();
  333.         if ( loader )
  334.             loader.Request ( this );
  335.  
  336.         collapsed = false;
  337.         childContainer.style.display = 'block';
  338.  
  339.         UpdateToggleImage ( );
  340.     };
  341.     
  342.     
  343.     this.GetElement = function ( )
  344.     {
  345.         return ( element );
  346.     };
  347.     
  348.     
  349.     this.GetSelectionElement = function ( )
  350.     {
  351.         return ( selectionElement );
  352.     };
  353.     
  354.     this.GetId = function ( )
  355.     {
  356.         return ( id );
  357.     }
  358.     
  359.     
  360.     this.GetHRef = function ( )
  361.     {
  362.         return ( href );
  363.     }
  364.     
  365.     
  366.     this.GetNodeById = function ( _id )
  367.     {
  368.         if ( id == _id )
  369.             return ( this );
  370.             
  371.         for ( var i = 0; i < nodes.length; i++ )
  372.         {
  373.             var search = nodes[i].GetNodeById ( _id );
  374.             if ( search )
  375.                 return ( search );
  376.         }
  377.         
  378.         return ( null );
  379.     };
  380.     
  381.     
  382.     this.GetParent = function ( )
  383.     {
  384.         return ( parent );
  385.     };
  386.     
  387.     
  388.     var Initialize = function ( init )
  389.     {
  390.         if ( !init ) 
  391.             init = {};
  392.             
  393.         text = init.text ? init.text : " ";
  394.         id = init.id ? init.id : null;        
  395.         leaf = init.leaf ? true : false;
  396.         icon = init.icon ? init.icon : null;
  397.         tree = init.tree;
  398.         level = init.level ? init.level : 0;
  399.         attributes = init.attributes ? init.attributes : [];
  400.         href = init.href ? init.href : "";
  401.  
  402.         element = document.createElement ( "div" );
  403.     };
  404.  
  405.  
  406.     this.InsertNode = function ( pos, init )
  407.     {
  408.         if ( pos < 0 || pos >= nodes.length )
  409.             return;
  410.             
  411.         var node;
  412.         if ( init instanceof Schema.TreeNode )
  413.             node = init;
  414.         else
  415.             node = new Schema.TreeNode ( init );
  416.             
  417.         node.InternalInit ( tree, this, level+1 );
  418.         node.Render ( );
  419.  
  420.         if ( pos == null )
  421.             Schema.DOM.PrependChild ( node.GetElement(), childContainer );
  422.         else
  423.         {
  424.             var point = nodes[pos];
  425.             Schema.DOM.InsertBefore ( node.GetElement(), point.GetElement() );
  426.         }
  427.  
  428.         nodes.splice ( pos, 0, node );
  429.         
  430.         // imgElement.style.display = 'block';
  431.         leaf = false;
  432.         UpdateToggleImage ( );
  433.         
  434.         return ( node );
  435.     };
  436.     
  437.     
  438.     
  439.     this.InternalInit = function ( _tree, _parent, _level )
  440.     {
  441.         if ( isRendered )
  442.             throw "Tree node already bound!";
  443.             
  444.         tree = _tree;
  445.         parent = _parent;
  446.         level = _level;
  447.     };
  448.     
  449.  
  450.     this.IsLeaf = function ( )
  451.     {
  452.         if ( tree.GetLoader() )
  453.             return ( leaf );
  454.         else
  455.             return ( nodes.length == 0 );
  456.     };
  457.     
  458.     this.LoadStatic = function ( data )
  459.     {
  460.         this.ClearNodes ( );
  461.         if ( data )
  462.         {
  463.             for ( var i = 0; i < data.length; i++ )
  464.             {
  465.                 var node = this.AppendNode ( data[i] );
  466.                 node.LoadStatic ( data[i].nodes );
  467.             }
  468.         }
  469.     };
  470.     
  471.     
  472.     this.RemoveNode = function ( treeNode )
  473.     {
  474.         if ( treeNode && treeNode.GetParent() == this )
  475.         {
  476.             treeNode.Destroy ( );
  477.             var index = nodes.indexOf ( treeNode );
  478.             if ( index >= 0 )
  479.                 nodes.splice ( index, 1 );
  480.         }
  481.         else if ( treeNode )
  482.             treeNode.parent.RemoveNode ( treeNode );
  483.     };
  484.  
  485.     
  486.     this.Render = function ( )
  487.     {
  488.         if ( isRendered )
  489.             return;
  490.         isRendered = true;            
  491.             
  492.         var table = element.appendChild ( document.createElement("table") );
  493.         table.cellPadding = 1;
  494.         table.cellSpacing = 0;
  495.         // table.style.whiteSpace = "nowrap";
  496.                 
  497.         var tbody = table.appendChild ( document.createElement("tbody") );
  498.         var row = tbody.appendChild ( document.createElement("tr") );
  499.         
  500.         var cell;
  501.         for ( var i = 0; i < level-1; i++ )
  502.         {
  503.             cell = row.appendChild ( document.createElement("td") );
  504.             cell.className = 'treeNodeIconEmpty';
  505.  
  506.             var img = cell.appendChild ( new Image() );
  507.             img.src = tree.GetVisualization().Empty;
  508.             img.style.width = "16px";
  509.             img.style.height = "16px";
  510.         }
  511.  
  512.         // Render icon cell...        
  513.         cell = row.appendChild ( document.createElement("td") );
  514.         cell.className = 'treeNodeIcon';
  515.         
  516.         imgElement = new Image ( );
  517.         if ( self.IsLeaf() )
  518.         {   
  519.             imgElement.src = tree.GetVisualization().LeafIcon;
  520.             imgElement.style.height = "16px";
  521.             imgElement.style.width = "16px";
  522.         }
  523.         else
  524.             imgElement.src = tree.GetVisualization().CollapsedIcon;
  525.             
  526.         var toggleFn = self.Toggle;
  527.         Schema.Event.AddListener ( imgElement, 'click', function(e) { toggleFn.call(self); }, self ); 
  528.             
  529.         cell.appendChild ( imgElement );
  530.  
  531.  
  532.         // Render image cell...
  533.         if ( tree.HasIcons() )
  534.         {
  535.             cell = row.appendChild ( document.createElement("td") );
  536.             cell.className = "treeNodeIcon";
  537.              
  538.             var img = new Image ( );
  539.             img.src = icon ? icon : tree.GetVisualization().Empty;
  540.             img.style.height = "16px";
  541.             img.style.width  = "16px";
  542.             cell.appendChild ( img );
  543.         }
  544.         
  545.         
  546.         // Render text cell...
  547.         cell = row.appendChild ( document.createElement("td") );
  548.         cell.className = "treeNodeText";
  549.         cell.innerHTML = text;
  550.         selectionElement = cell;
  551.     
  552.         var selectFn = self.Select;
  553.         var contextFn = self.ShowContextMenu; 
  554.         Schema.Event.AddListener ( cell, 'click', function(e) { selectFn.call(self); }, self );
  555.         Schema.Event.AddListener ( cell, 'contextmenu', function(e) { contextFn.call(self, e.clientX, e.clientY); return ( false ); }, self );
  556.         
  557.         childContainer = document.createElement ( "div" );
  558.         childContainer.style.display = 'none'; 
  559.         element.appendChild ( childContainer );
  560.         
  561.         for ( var i = 0; i < nodes.length; i++ )
  562.             nodes[i].Render ( );
  563.     };
  564.  
  565.       
  566.     this.Select = function ( internal )
  567.     {
  568.         if ( tree.focusedNode == this )
  569.             return;
  570.             
  571.         if ( tree.focusedNode )
  572.             tree.focusedNode.ClearSelect ( );
  573.  
  574.         tree.focusedNode = this;
  575.         tree.OnHighlightNode ( this, true ); 
  576.         if ( !internal )
  577.             tree.OnFocusedNodeChanged ( this );
  578.     };
  579.  
  580.  
  581.     this.ShowContextMenu = function ( x, y )
  582.     {
  583.         var handler = tree.GetContextMenuHandler ( );
  584.         if ( handler )
  585.             handler.Execute ( this, x, y );
  586.     };
  587.     
  588.     
  589.     this.Toggle = function ( )
  590.     {
  591.         if ( collapsed )
  592.             this.Expand ( );
  593.         else
  594.             this.Collapse ( );
  595.     };
  596.  
  597.  
  598.     var UpdateToggleImage = function ( )
  599.     {
  600.         if ( imgElement )
  601.         {
  602.             var img = new Image ( );
  603.             if ( self.IsLeaf() )
  604.                 img.src = tree.GetVisualization().LeafIcon;
  605.             else if ( collapsed )
  606.                 img.src = tree.GetVisualization().CollapsedIcon;
  607.             else
  608.                 img.src = tree.GetVisualization().ExpandedIcon;
  609.             
  610.             imgElement.src = img.src;
  611.         }
  612.     };    
  613.     
  614.     Initialize ( init );
  615. };
  616.  
  617.  
  618.  
  619. Schema.TreeLoader = function ( url, tree )
  620. {
  621.     this.url = url;
  622.     this.tree = tree;
  623.     this.autoExpandFirstLevel = false;
  624.     
  625.     
  626.     this.GetNodeInfo = function ( id )
  627.     {
  628.         var request = new Schema.Request ( this.url, {'async':false} );
  629.         request.params["id"] = id;
  630.         request.Execute ( );
  631.         
  632.         return ( request.GetJsonObjects() );
  633.     };
  634.     
  635.     
  636.     this.Request = function ( treeNode )
  637.     {
  638.         var request = new Schema.Request ( this.url, {'async':true, 'callback': this.OnLoad} );
  639.         request.treeNode = treeNode;
  640.         request.tree = tree;
  641.         
  642.         if ( treeNode )
  643.         {
  644.             request.params["id"] = treeNode.id;
  645.             request.autoExpand = false;
  646.         }
  647.         else
  648.             request.autoExpand = this.autoExpandFirstLevel;
  649.         
  650.         request.Execute ( );
  651.     };
  652.     
  653.     
  654.     this.OnLoad = function ( request )
  655.     {
  656.         var parent = (request.treeNode) ? request.treeNode : request.tree;
  657.         if ( parent )
  658.         {
  659.             parent.ClearNodes ( );
  660.             
  661.             var objs = request.GetJsonObjects ( );
  662.             if ( objs )
  663.             {
  664.                 for ( var i = 0; i < objs.length; i++ )
  665.                 {
  666.                     var node = parent.AppendNode ( objs[i] );
  667.                     if ( request.autoExpand )
  668.                         node.Expand ( );
  669.                 }
  670.             }
  671.         }
  672.         
  673.         
  674.         if ( this.OnLoadComplete )
  675.             this.OnLoadComplete ( request );    
  676.     };
  677. }
  678.  
  679.  
  680. Schema.TreeVisualization = 
  681. {
  682.     'CollapsedIcon'           : Schema.Tree.IconPath + "node_collapsed.gif",
  683.     'Empty'                   : Schema.Tree.IconPath + "empty.gif",
  684.     'ExpandedIcon'            : Schema.Tree.IconPath + "node_expanded.gif",
  685.     'LeafIcon'                : Schema.Tree.IconPath + "empty.gif"
  686. };