1 | // set cookie data |
---|
2 | function setCurrState(setting) { |
---|
3 | document.cookie = "currState=" + escape(setting) |
---|
4 | } |
---|
5 | |
---|
6 | // retrieve cookie data |
---|
7 | function getCurrState() { |
---|
8 | var label = "currState=" |
---|
9 | var labelLen = label.length |
---|
10 | var cLen = document.cookie.length |
---|
11 | var i = 0 |
---|
12 | while (i < cLen) { |
---|
13 | var j = i + labelLen |
---|
14 | if (document.cookie.substring(i,j) == label) { |
---|
15 | var cEnd = document.cookie.indexOf(";",j) |
---|
16 | if (cEnd == -1) { |
---|
17 | cEnd = document.cookie.length |
---|
18 | } |
---|
19 | return unescape(document.cookie.substring(j,cEnd)) |
---|
20 | } else { |
---|
21 | i = document.cookie.indexOf(";",j) |
---|
22 | if ( i == -1 ) { |
---|
23 | i = document.cookie.length |
---|
24 | } |
---|
25 | } |
---|
26 | } |
---|
27 | return "" |
---|
28 | } |
---|
29 | |
---|
30 | // **function that updates persistent storage of state** |
---|
31 | // toggles an outline mother entry, storing new value in the cookie |
---|
32 | function toggle(n) { |
---|
33 | if (n != 0) { |
---|
34 | var newString = "" |
---|
35 | var currState = getCurrState() // of whole outline |
---|
36 | var expanded = currState.substring(n-1,n) // of clicked item |
---|
37 | newString += currState.substring(0,n-1) |
---|
38 | newString += expanded ^ 1 // Bitwise XOR clicked item |
---|
39 | newString += currState.substring(n,currState.length) |
---|
40 | setCurrState(newString) // write new state back to cookie |
---|
41 | } |
---|
42 | } |
---|
43 | |
---|
44 | // **functions used in assembling updated outline** |
---|
45 | // returns the proper GIF file name for each entry's control |
---|
46 | function getGIF(n) { |
---|
47 | var mom = db[n].mother // is entry a parent? |
---|
48 | var expanded = getCurrState().substring(n-1,n) // of clicked item |
---|
49 | if (!mom) { |
---|
50 | return "daughter.gif" |
---|
51 | } else { |
---|
52 | if (expanded == 1) { |
---|
53 | return "exploded.gif" |
---|
54 | } |
---|
55 | } |
---|
56 | return "collapsd.gif" |
---|
57 | } |
---|
58 | |
---|
59 | // returns the proper status line text based on the icon style |
---|
60 | function getGIFStatus(n) { |
---|
61 | var mom = db[n].mother // is entry a parent |
---|
62 | var expanded = getCurrState().substring(n-1,n) // of rolled item |
---|
63 | if (!mom) { |
---|
64 | return "No further items" |
---|
65 | } else { |
---|
66 | if (expanded == 1) { |
---|
67 | return "Click to collapse nested items" |
---|
68 | } |
---|
69 | } |
---|
70 | return "Click to expand nested items" |
---|
71 | } |
---|
72 | |
---|
73 | // returns padded spaces (in multiples of 3) for indenting |
---|
74 | function pad(n) { |
---|
75 | var result = "" |
---|
76 | for (var i = 1; i <= n; i++) { |
---|
77 | result += " " |
---|
78 | } |
---|
79 | return result |
---|
80 | } |
---|
81 | |
---|
82 | // initialize 'current state' storage field |
---|
83 | if (getCurrState() == "" || getCurrState().length != db.length) { |
---|
84 | initState = "1" |
---|
85 | for (i = 2; i <= db.length; i++) { |
---|
86 | initState += "0" |
---|
87 | } |
---|
88 | setCurrState(initState) |
---|
89 | } |
---|
90 | |
---|
91 | // see if user is running a Mac browser for special case handling |
---|
92 | function isMac() { |
---|
93 | return (navigator.userAgent.indexOf("Macintosh") >= 0) ? true :false |
---|
94 | } |
---|
95 | // end --> |
---|
96 | </SCRIPT> |
---|
97 | </HEAD> |
---|
98 | |
---|
99 | <BODY> |
---|
100 | <SCRIPT LANGUAGE="JavaScript"> |
---|
101 | <!-- start |
---|
102 | // build new outline based on the values of the cookie |
---|
103 | // and data points in the outline data array. |
---|
104 | // This fires each time the user clicks on a control, |
---|
105 | // because the HREF for each one reloads the current document. |
---|
106 | var prevIndentDisplayed = 0 |
---|
107 | var showMyDaughter = 0 |
---|
108 | document.write( "<CENTER><H3>Call Tree</H3></CENTER><HR>" ) |
---|
109 | var newOutline = "<PRE><H4>" // let padded spaces make indents |
---|
110 | |
---|
111 | // cycle through each entry in the outline array |
---|
112 | for (var i = 1; i <= db.length; i++) { |
---|
113 | var theGIF = getGIF(i) // get the image |
---|
114 | var theGIFStatus = getGIFStatus(i) // get the status message |
---|
115 | var currIndent = db[i].indent // get the indent level |
---|
116 | var expanded = getCurrState().substring(i-1,i) // current state |
---|
117 | // display entry only if it meets one of three criteria |
---|
118 | if (currIndent == 0 || currIndent <= prevIndentDisplayed || (showMyDaughter == 1 && (currIndent - prevIndentDisplayed == 1))) { |
---|
119 | newOutline += pad(currIndent) |
---|
120 | newOutline += "<A HREF=\"javascript:history.go(0)\" onMouseOver=\"window.parent.status=\'" + theGIFStatus + "\';return true;\" onClick=\"toggle(" + i + ")\"><IMG SRC=\"" + theGIF + "\" HEIGHT=11 WIDTH=11 BORDER=0></A>" |
---|
121 | newOutline += " <A HREF=\"" + db[i].URL + "\" TARGET=\"bottom_target\" onMouseOver=\"window.parent.status=\'View " + db[i].display + "...\';return true;\">" + db[i].display + "</A><BR>" |
---|
122 | prevIndentDisplayed = currIndent |
---|
123 | showMyDaughter = expanded |
---|
124 | } |
---|
125 | } |
---|
126 | newOutline += "</H4></PRE><HR>" |
---|
127 | document.write(newOutline) |
---|
128 | |
---|
129 | // end --> |
---|
130 | </SCRIPT> |
---|
131 | </BODY> |
---|
132 | </HTML> |
---|
133 | |
---|