| 
					
				 | 
			
			
				@@ -1,81 +1,58 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * Created by Tony on 2017/1/23. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const NODE_ID = "ID", P_ID = "ParentID", NEXT_ID = "NextSiblingID", ADHOC_PRE_ID="Previous_ID", CHILDREN_NODE = "items", SUB_ID = "sub_ids", EMPTY_ID_VAL = -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 var tree_Data_Helper = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    sortDataBySerial: function (data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        data.sort(function(item1, item2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            var rst = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (item1["SerialNo"] > item2["SerialNo"]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                rst = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } else if (item1["SerialNo"] < item2["SerialNo"]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                rst = -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    buildTreeNodeDirectly: function(data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var me = this, topArr = [], rst = [], tmpNodes = {}, prefix = "id_"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private_getTopNode = function (idArr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var rst = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (var i = 0; i < idArr.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (tmpNodes[prefix + idArr[i]][ADHOC_PRE_ID] == EMPTY_ID_VAL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    rst = tmpNodes[prefix + idArr[i]]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return rst; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    buildTreeData: function (data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        var rst = [], idArr = [], me = this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        var distIdx = -1, distinctIdx = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        for (var i = 0; i < data.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            idArr.push(i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        me.distinctByCustId(data, idArr, "ParentID", distIdx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        distinctIdx = me.getDistinctId(data, idArr, distIdx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        for (var i = 0; i < distinctIdx; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            rst[i] = data[idArr[i]]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        for (var i = 0; i < rst.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            idArr = idArr.slice(distinctIdx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            me.buildBranchData(rst[i], data, idArr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return rst; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    getDistinctId: function (data, idArr, compareVal) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        var rst = 0, me = this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        for (var i = 0; i < idArr.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (data[idArr[i]]["ParentID"] != compareVal) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                rst = i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private_buildNodeData = function(parentItem, idArr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var iter = [], nextNode = private_getTopNode(idArr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            while (nextNode != null && nextNode != undefined ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (parentItem) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    parentItem[CHILDREN_NODE].push(nextNode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    rst.push(nextNode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                iter.push(nextNode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                nextNode = tmpNodes[prefix + nextNode[NEXT_ID]]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (var i = 0; i < iter.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                private_buildNodeData(iter[i], iter[i][SUB_ID]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return rst; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    buildBranchData: function (parentItem, orgData, idArr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        var distinctIdx = 0, distVal = parentItem["ID"], me = this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        me.distinctByCustId(orgData, idArr, "ParentID", distVal); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        distinctIdx = me.getDistinctId(orgData, idArr, distVal); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        parentItem["items"] = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        for (var i = 0; i < distinctIdx; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            parentItem["items"][i] = orgData[idArr[i]]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        for (var i = 0; i < parentItem["items"].length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            idArr = idArr.slice(distinctIdx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            me.buildBranchData(parentItem["items"][i], orgData, idArr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            distinctIdx = me.getDistinctId(orgData, idArr, parentItem["items"][i]["ID"]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (var i = 0; i < data.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            tmpNodes[prefix + data[i][NODE_ID]] = data[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            data[i][ADHOC_PRE_ID] = EMPTY_ID_VAL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            data[i][SUB_ID] = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            data[i][CHILDREN_NODE] = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (data[i][P_ID] == EMPTY_ID_VAL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                topArr.push(data[i][NODE_ID]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    distinctByCustId: function (data, idArray, IdStr, IdVal) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        idArray.sort(function(idx1, idx2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            var rst = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (data[idx1][IdStr] == IdVal) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (data[idx2][IdStr] == data[idx1][IdStr]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (data[idx1]["SerialNo"] > data[idx2]["SerialNo"]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        rst = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        rst = -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    rst = -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } else if (data[idx2][IdStr] == IdVal) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                rst = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (var i = 0; i < data.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (data[i][NEXT_ID] != EMPTY_ID_VAL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                tmpNodes[prefix + data[i][NEXT_ID]][ADHOC_PRE_ID] = data[i][NODE_ID]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return rst; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (data[i][P_ID] != EMPTY_ID_VAL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                tmpNodes[prefix + data[i][P_ID]][SUB_ID].push(data[i][NODE_ID]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private_buildNodeData(null, topArr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //try to release and return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tmpNodes = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        topArr.length = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return rst; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |