-
Notifications
You must be signed in to change notification settings - Fork 0
/
dalli.js
155 lines (129 loc) · 5.35 KB
/
dalli.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
//TODO: Add pods for displaying images.
//TODO: Look into AJAX calls.
//TODO: Add lightbox viewer.
$(document).ready(function(){
//Intial page rendering instructions
$('.vline').height(0);
//Retract animation duration (ms).
var animationLength = 700;
//Tracks tree depth during recursive calls of checkChildren
var depth = 0;
//Percentages for animating the wrapper bar appropriately, beginning from the centre of the vline that extends to it.
var margins = {
a:'6.55%',
b:'23.8%',
c:'41.17%',
d:'58.55%',
e:'75.8%',
f:'93.17%',
//i and j are for the master nodes position at columns two and seven respectively.
i: '36.88%',
j: '80.2%'
};
//Terminal node click function to open photo/video pod.
$('.terminal').click(function(){
});
//General click function for nodes that are not already active.
$('.node').click(function(){
//Deactives node click function to prevent a new animation from starting before the current one is complete.
$('.node').not('.terminal').css("pointer-events", "none");
//Parse id of new branch in preparation for animation
$(this).addClass('active');
var nodeId = this.id;
var extendDetails = parseId(nodeId);
//Check for active tree branches and retract them before forming a new branch.
//extend is the callback to extend branch once animation is complete
checkSiblings(this, extendDetails);
});
//Checking for active sibling branch
function checkSiblings(clickedNode, extendDetails){
var hasActiveSibling = $(clickedNode).parent().siblings().children().hasClass('active');
if(hasActiveSibling){
var activeSiblingId = $(clickedNode).parent().siblings().children('.active').attr('id');
var siblingDetails = parseId(activeSiblingId);
//Check if active sibling has active children
checkChildren(activeSiblingId, siblingDetails, extendDetails);
setTimeout(function(){extend(extendDetails);}, animationLength*depth);
}
else {
extend(extendDetails);
}
//Restore click function.
setTimeout(function(){$('.node').css("pointer-events", "auto");},1000+(animationLength*depth));
depth = 0;
}
//Check if an active node has active child
function checkChildren(activeParentId, parentDetails, extendDetails){
//Sets target child
var targetDetails = parseId(activeParentId);
targetDetails[1] = parseInt(targetDetails[1])+1; //adding 1 to treeLevel targets children nodes.
targetDetails[0] = targetDetails[1]+ 'a'; //updating coordinate at targetDetails[0] to reflect the new level. Default column target set to 'a'.
var targetChild = "#n"+ targetDetails[0];
var hasActiveChild = $(targetChild).parent().parent().children().children().hasClass('active');
//Recursive flow to retract children branches before parent branches.
if(hasActiveChild){
var activeChildId = $(targetChild).parent().parent().children().children('.active').attr('id');
var childDetails = parseId(activeChildId);
var isTerminal = $('#'+activeChildId).hasClass('terminal');
//Terminal nodes have no children.
if(isTerminal){
$("#"+activeChildId).removeClass('active');
retract(parentDetails);
++depth;
return;
}
//If active and not terminal, check children of the new node.
else{
checkChildren(activeChildId, childDetails, extendDetails);
setTimeout(function(){retract(parentDetails);}, animationLength*depth);
++depth;
return;
}
}
//If no active children.
else{
retract(parentDetails);
++depth;
return;
}
}
function extend(details){
branchOutAnimation("#l"+details[0],"#w"+details[1],".v"+details[1]);
}
function parseId(id){
var treeCoordinate = id.substring(1,3); //gets exact coordinate of the node: eg. 2c
var treeLevel = id.substring(1,2); //gets only the level or row of the node in the tree: eg. 2
return [treeCoordinate,treeLevel];
}
function retract(details) {
retractAnimation("#l"+details[0],"#w"+details[1],".v"+details[1]);
$('#n'+details[0]).removeClass('active');
}
//Branching Out animation occurs over 1000 ms
function branchOutAnimation(linker, wrapper, vline){
if ($(wrapper).hasClass('active') === false) {
$(linker).addClass('active');
$(wrapper).addClass('active');
$(vline).addClass('active');
//Check if wrapper is already active or not, and adjust margin if latter.
var treeCol = linker.substring(3,4);
var wrapperPosition = margins[treeCol];
$(wrapper).css({"margin-left":wrapperPosition});
//Animation sequence
$(linker).animate({height:"100%"}, 300);
setTimeout(function(){$(wrapper).animate({"margin-left": "0", "width": "100%"}, 450);}, 300);
setTimeout(function(){$(vline).animate({height:"100%"}, 250);}, 750);
}
}
//Retracting animation occurs over 700 ms
function retractAnimation(linker, wrapper, vline){
$(linker).removeClass('active');
$(wrapper).removeClass('active');
$(vline).removeClass('active');
var treeCol = linker.substring(3,4);
var wrapperPosition = margins[treeCol];
$(vline).animate({height:"0%"}, 200);
setTimeout(function(){$(wrapper).animate({"margin-left":wrapperPosition, "width": "0"}, 350);}, 200);
setTimeout(function(){$(linker).animate({height:"0"}, 150);}, 550);
}
});