Initial dev repository
[kcls-web.git] / opac / skin / kcls / js / misc.js
1 var anonListCache;\r
2 var webCacheKey;\r
3 var userVitalStats;\r
4 \r
5 function opac_init() {\r
6         var advLink = getId("home_adv_search_link");\r
7         if(advLink) advLink.setAttribute("href", buildOPACLink({page:ADVANCED})); \r
8         getId("home_myopac_link").setAttribute("href", buildOPACLink({page:MYOPAC}, false, true));\r
9         getId("myopac_link").setAttribute("href", buildOPACLink({page:MYOPAC}, false, true));\r
10         getOrgs();\r
11         \r
12   var u = grabUser();\r
13   if(u) {\r
14         unHideMe($('dash_wrapper'));\r
15         hideMe($('your-acct-login'));\r
16           //alert(fetchOrgSettingDefault(G.user.home_ou(), 'auth.persistent_login_interval'));\r
17         try {\r
18           var stats = fieldmapper.standardRequest(['open-ils.actor', 'open-ils.actor.user.opac.vital_stats'], {async:false, params:[u.session]});\r
19         } catch(e){}\r
20         userVitalStats = stats;\r
21         if(!stats) return;\r
22 \r
23         $('dash_user').innerHTML = u.first_given_name()+' '+u.family_name();\r
24         $('dash_checked').innerHTML = stats.checkouts.out+stats.checkouts.overdue;\r
25         $('dash_holds').innerHTML = stats.holds.total;\r
26         $('dash_pickup').innerHTML = stats.holds.ready;\r
27         $('dash_fines').innerHTML = parseFloat(stats.fines.balance_owed).toFixed(2);\r
28         /*\r
29         var str = '<div id="myopac_link_div">Hi, '+u.first_given_name()+' - <a id="myopac_link" href="javascript:;">My Account</a> | <a href="javascript:;" id="theLogoutLink" style="color:red;" onclick="doLogout()"><strong>Logout</strong></a></div>\n';\r
30         str += '<a href="javascript:;" id="dash_acct_checked">('+(stats.checkouts.out+stats.checkouts.overdue)+') Item'+((stats.checkouts.out+stats.checkouts.overdue)!=1?'s':'')+' Checked Out</a><br/>\n';\r
31         str += '<a href="javascript:;" id="dash_acct_holds">('+stats.holds.total+') Item'+( stats.holds.total!=1?'s':'' )+' on Hold (25 max.)</a><br />\n';\r
32         str += '<a href="javascript:;" id="dash_acct_holds_ready">'+stats.holds.ready+' item'+( stats.holds.ready!=1?'s':'' )+' ready for pick up</a> | <a href="javascript:;" id="showMyBills">FINES:$'+parseFloat(stats.fines.balance_owed).toFixed(2)+'</a>\n';\r
33         $('quick-links').innerHTML = str;\r
34         $('myopac_link').setAttribute("href", buildOPACLink({page:MYOPAC}, false, true));\r
35         $('dash_acct_checked').setAttribute("href", buildOPACLink({page:MYOPAC,acctpage:2}, false, true));\r
36         $('dash_acct_holds').setAttribute("href", buildOPACLink({page:MYOPAC,acctpage:3}, false, true));\r
37         $('dash_acct_holds_ready').setAttribute("href", buildOPACLink({page:MYOPAC,acctpage:3}, false, true));\r
38         $('showMyBills').setAttribute("href", buildOPACLink({page:MYOPAC,acctpage:1}, false, true));\r
39          */\r
40 \r
41   }\r
42 }\r
43 \r
44 function mySuperInitFunction() {\r
45         G.ui.common.now_searching = elem('div');\r
46         webCacheKey = cookieManager.read('sessionID');\r
47         var list = getCacheValue('anonListCache');\r
48         anonListCache = isTrue(list)?list:[];\r
49         if(anonListCache.length) try { unHideMe($('cacheListLink')); } catch(e){}\r
50         \r
51         if(G.user && G.user.prefs[PREF_DEF_LOCATION]!="1") {\r
52           G.user.prefs[PREF_DEF_LOCATION]="1";\r
53           LOCATION = "1";\r
54           commitUserPrefs();\r
55           setSelector($('depth_selector'),      getLocation());\r
56           _newlocation = getLocation();\r
57         }\r
58 }\r
59 \r
60 function setCacheValue(field, value, timeout) {\r
61         if(!timeout) timeout = '30m';\r
62         var key = fieldmapper.standardRequest(['open-ils.actor','open-ils.actor.anon_cache.set_value'],{async:false, params:[webCacheKey, field, value]});\r
63         if(!isTrue(webCacheKey)) {\r
64                 webCacheKey = key;\r
65                 cookieManager.write('sessionID', webCacheKey, timeout);\r
66         }\r
67         return key;\r
68 }\r
69 \r
70 function getCacheValue(field) {\r
71         if(!isTrue(webCacheKey)) return null;\r
72         var val = fieldmapper.standardRequest(['open-ils.actor','open-ils.actor.anon_cache.get_value'], {async:false, params:[webCacheKey, field]});\r
73         return val;\r
74 }\r
75 \r
76 function isInAnonList(id) {\r
77         for(var i in anonListCache) {\r
78                 if(anonListCache[i] == id) return true;\r
79         }       \r
80         return false;\r
81 }\r
82 \r
83 var isCacheListDrawn = false;\r
84 var anonListParent;\r
85 var anonListTemp;\r
86 function showCachedList() {\r
87         if(grabUser()) goTo(buildOPACLink({page:MYOPAC, 'acctpage':6}, false, true));\r
88         if(!anonListCache.length) {try { hideResultsPage(); } catch(e) {} hideMe($('anonListTable')); hideMe($('cacheListLink')); return;}\r
89         try { hideResultsPage(true); } catch(e) {}\r
90         unHideMe($('anonListTable'));\r
91         if(!isCacheListDrawn) fieldmapper.standardRequest(["open-ils.search","open-ils.search.biblio.record.mods_slim.retrieve"],{async:true, params:[anonListCache], oncomplete:drawCacheList});       \r
92 }\r
93 \r
94 function drawCacheList(r) {\r
95         isCacheListDrawn = true;\r
96         var bibs = r.recv().content();\r
97         if(!anonListParent) anonListParent = $('anonListParent');\r
98         if(!anonListTemp) anonListTemp = anonListParent.removeChild($('anonListTemp'));\r
99         removeChildren(anonListParent);\r
100         $('anon_selector').checked = false;\r
101         \r
102         if(grabUser()) {\r
103                 unHideMe($('holdsCacheSel'));\r
104                 setSelector($('holdsCacheSel'), grabUser().home_ou());\r
105         }\r
106         \r
107         for(var i in bibs) {\r
108                 var row = anonListTemp.cloneNode(true);\r
109                 $n(row, 'anon_selector').doc_id = bibs[i].doc_id();\r
110                 $n(row, 'curr_row').innerHTML = parseInt(i)+1;\r
111                 $n(row, 'title').innerHTML = bibs[i].title();\r
112                 anonListParent.appendChild(row);\r
113         }\r
114 }\r
115 \r
116 function createBibHoldObject(org) {\r
117         if(!G.user) return null;\r
118         if(!org) org = G.user.home_ou();\r
119         \r
120         var node = findOrgUnit(org);\r
121         var ntype = findOrgType(node.ou_type());\r
122         if(!ntype.can_have_users()) return null;\r
123         \r
124         var hold = new ahr();\r
125         var interval = fetchOrgSettingDefault(G.user.home_ou(), 'circ.hold_expire_interval');\r
126         if(!interval) interval = 0;\r
127         var secs = interval_to_seconds(interval);\r
128         var expire = new Date();\r
129         expire.setTime(expire.getTime() + Number(secs + '000'));\r
130         var expireDate = holdsVerifyThawDate(dojo.date.stamp.toISOString(expire)); \r
131         \r
132         if(expireDate) hold.expire_time(expireDate);\r
133         hold.phone_notify("");\r
134         hold.email_notify(0);\r
135         hold.pickup_lib(org);\r
136         hold.usr(G.user.id());\r
137         hold.hold_type("T");\r
138         hold.frozen('f');\r
139         hold.thaw_date(null);\r
140         \r
141         return hold;\r
142 }\r
143 \r
144 function batchHoldMyList(org, parent) {\r
145         if(!grabUser()) return;\r
146         if(!org) G.user.home_ou();\r
147         if(!parent) parent = $('myopac_bookbag_div');\r
148         \r
149         var nodes = dojo.query('input[name=list_action_chbx]', parent).filter(function(node, index){ return node.checked; });\r
150         if(!nodes.length) return;\r
151         var arr = [];\r
152         nodes.forEach(function(node, index){ arr.push(node.getAttribute("recordid")); });\r
153         var error = {err:""};\r
154         var resp = placeBatchHold(arr, org, error);\r
155         if(resp == -1) alert("Unable to place holds"); else alert(resp+" hold"+(resp==1?"":"s")+" placed successfully\n\n"+error.err);\r
156 \r
157 }\r
158 \r
159 function placeBatchHold(ids, org, error) { // array of bib IDs, pickup lib (optional), error msgs from holds (optional)\r
160         if(!grabUser() || !ids.length) return -1;\r
161         if(!org) org = G.user.home_ou();\r
162         \r
163         var holds = [];\r
164         var chkArr = [];\r
165         for(var i=0; i<ids.length; i++) {\r
166                 holds[i] = createBibHoldObject(org);\r
167                 holds[i].target(ids[i]);\r
168                 chkArr.push({titleid: ids[i], volume_id: undefined, copy_id: undefined, hold_type: "T", patronid: G.user.id(), depth: 0, pickup_lib: org});\r
169         }\r
170         \r
171         var resp = fieldmapper.standardRequest(['open-ils.circ','open-ils.circ.title_hold.is_possible.batch.atomic'], {async:false, params:[grabUser().session, chkArr]});\r
172         //if(resp.last_event) alert(resp.last_event.payload.fail_part); else alert('Mulit-hold successful\n'+resp.local_avail);\r
173         \r
174         var str = "";\r
175         var errCount = 0;\r
176         var flag = false;\r
177         for(var n in resp) {\r
178                 if(!resp[n].success) {\r
179                         flag = true;\r
180                         str+=ids[n]+": "+(resp[n].last_event.desc==""?resp[n].last_event.textcode:resp[n].last_event.desc)+"\n";\r
181                         errCount++;\r
182                 }\r
183         }\r
184         \r
185         if(str != "") error.err+=errCount+" hold"+(errCount==1?"":"s")+" not placed successfully\n"+str;\r
186         if(flag) return 0;\r
187         \r
188         var resp2 = fieldmapper.standardRequest(['open-ils.circ','open-ils.circ.holds.create.batch.atomic'], {async:false, params:[grabUser().session, holds]});\r
189         var count = -1;\r
190         for(var t in resp2) {\r
191                 if(typeof(resp2[t]) != "object") count++; else {\r
192                         str+=ids[t]+": "+resp2[t][0].desc+"\n";\r
193                         errCount++;\r
194                 }\r
195         }\r
196         if(str != "") error.err+=errCount+" holds not placed successfully\n"+str;\r
197         return ++count;\r
198 }\r
199 \r
200 function placeHoldOnCache() {\r
201         //holdsDrawWindow(true);\r
202         var holdsArr = [];\r
203         dojo.query('input[name=anon_selector]',$('anonListParent')).filter(function(node, index){\r
204                 if(node.checked) holdsArr.push(node.doc_id+'');\r
205         });\r
206         \r
207         if(!holdsArr.length) return;\r
208         setCacheValue('saveAnonCache', holdsArr);\r
209         goTo(buildOPACLink({page:MYOPAC}, false, true));\r
210 }\r
211 \r
212 function delSelCache(parent, name) {\r
213         if(!parent) parent = $('anonListParent');\r
214         if(!name) name = 'anon_selector';\r
215         anonListCache = [];\r
216         var found = false;\r
217         var nodes = dojo.query('input[name='+name+']',parent);\r
218         if(!nodes.length) nodes = dojo.query('.'+name,parent);\r
219         nodes.forEach(function(node, index){\r
220                 if(!node.checked) anonListCache.push(node.doc_id); else {\r
221                         found = true;\r
222                         var holdsLink = $n($('result_table_template_'+node.doc_id), 'result_my_list_link');\r
223                         if(holdsLink) {\r
224                                 removeChildren(holdsLink);\r
225                                 holdsLink.innerHTML = '';\r
226                                 holdsLink.appendChild(elem('img', {src:'/opac/skin/kcls/graphics/add_mylist.gif'}, null));\r
227                                 holdsLink.title = "Add to my list";\r
228                         }\r
229                 }\r
230         });\r
231         \r
232         if(found) {\r
233                 isCacheListDrawn = false;\r
234                 setCacheValue('anonListCache', anonListCache);\r
235                 if(name=='anon_selector') showCachedList();\r
236         }\r
237 }\r
238 \r
239 String.prototype.trim = function() {\r
240         return this.replace(/^\s+|\s+$/g,"");\r
241 }\r
242 String.prototype.ltrim = function() {\r
243         return this.replace(/^\s+/,"");\r
244 }\r
245 String.prototype.rtrim = function() {\r
246         return this.replace(/\s+$/,"");\r
247 }\r
248 \r
249 \r
250 //////////////////////\r
251 //Stephen Chapman\r
252 document.getElementsByClassName = function(cl) {\r
253 var retnode = [];\r
254 var myclass = new RegExp('\\b'+cl+'\\b');\r
255 var elems = document.getElementsByTagName('*');\r
256 for (var i = 0; i < elems.length; i++) {\r
257 var classes = elems[i].className;\r
258 if (myclass.test(classes)) retnode.push(elems[i]);\r
259 }\r
260 return retnode;\r
261 };\r
262 \r
263 $c = document.getElementsByClassName;\r
264 ////////////////////////////////////////////////////////////////////////\r
265 \r
266 function getOrgs() {\r
267   var tree = $('depth_selector');\r
268   buildOrgSel(tree, globalOrgTree, 0);\r
269   setSelector(tree, getLocation());\r
270   //setSelector(tree, "1");\r
271 }\r
272 \r
273 function swapTabs(el) {\r
274   if(!el) return;\r
275   var tabs = dojo.query("a",el.parentNode.id);\r
276   for(var n=0; n< tabs.length;n++) {\r
277         var i = tabs[n];\r
278         if(i==el) {\r
279           unHideMe($(i.rel));\r
280           i.style.background="url('/opac/skin/kcls/graphics/"+i.id+"_on.gif') no-repeat bottom";\r
281         } else {\r
282           hideMe($(i.rel));\r
283           i.style.background="url('/opac/skin/kcls/graphics/"+i.id+"_off.gif') no-repeat bottom";\r
284         }\r
285   }\r
286 }\r
287 \r
288 // walk the marc record dom - returns a contactenated string of the requested marc subfields\r
289 // depth-first recursive function\r
290 function walkXML(xml,field,subfield) {\r
291         if(!xml || !field || !subfield) return "";\r
292         var nodes = (xml.childNodes)?xml.childNodes:null;\r
293         if(!nodes) return "";\r
294         var str = "";\r
295         \r
296         for(var i=0; i<nodes.length; i++) {\r
297                 var obj = nodes[i];\r
298                 if(obj.hasChildNodes()) {\r
299                         var tag = (obj.nodeName=="datafield")?obj.getAttribute("tag"):"";\r
300                         if(tag==field) {\r
301                           for(var n=0; n<obj.childNodes.length; n++){\r
302                             var child = obj.childNodes[n];\r
303                             var code = (child.nodeName=="subfield")?child.getAttribute("code"):"";\r
304                             if(code==subfield) str += (child.textContent)?child.textContent:child.text; // IE check\r
305                           }\r
306                         }\r
307                         str += walkXML(obj,field,subfield);\r
308                 }\r
309         }\r
310         return str;\r
311 }\r
312 \r
313 // returns the requested marc data or passes it to callback if present\r
314 // callback arg is optional\r
315 function getMarcData(docid, field, subfield, callback) {\r
316         if(!docid || !field || !subfield) return "";\r
317         var cgi = new CGI();\r
318         var xhr = buildXMLRequest();\r
319         var proto = (location.href.match(/^[Hh][Tt][Tt][Pp][Ss]:/))?"https://":"http://";\r
320         \r
321         if(typeof(callback)=="function") {\r
322                 xhr.onreadystatechange = function() {\r
323                                 if(xhr.readyState==4 && xhr.status == 200) callback(walkXML(xhr.responseXML.documentElement,field.toLowerCase(),subfield.toLowerCase()), docid);\r
324                 }\r
325         }\r
326         \r
327         xhr.open("GET",proto+cgi.server_name+"/opac/extras/supercat/retrieve/marcxml/record/"+docid,((callback)?true:false));\r
328         xhr.send(null);\r
329         \r
330         if(typeof(callback)!="function" && xhr.status == 200) {\r
331                 return walkXML(xhr.responseXML.documentElement,field.toLowerCase(),subfield.toLowerCase());\r
332         } else return "";\r
333 }\r
334 \r
335 function setFormatIcon(imgEl, type) {\r
336         if(!imgEl) return false;\r
337         if(!type) { hideMe(imgEl); return false; }\r
338         var img = "";\r
339         \r
340         switch(type) {\r
341           case "a": img="media_book.jpg"; break;\r
342           case "b": img="media_magazines.jpg"; break;\r
343           case "c": img="media_printedmusic.jpg"; break;\r
344           case "d": img="media_microform.jpg"; break;\r
345           case "e": img="media_equipment.jpg"; break;\r
346           case "f": img="media_films.jpg"; break;\r
347           case "g": img=""; break;\r
348           case "h": img="media_dvd.jpg"; break;\r
349           case "i": img="media_bookoncassette.jpg"; break;\r
350           case "j": img="media_musiccd.jpg"; break;\r
351           case "k": img="media_musiccassette.jpg"; break;\r
352           case "l": img="media_musicrecord.jpg"; break;\r
353           case "m": img="media_software.jpg"; break;\r
354           case "n": img="media_bookoncd.jpg"; break;\r
355           case "o": img="media_kit.jpg"; break;\r
356           case "p": img="media_newspaper.jpg"; break;\r
357           case "q": img="media_largeprint.jpg"; break;\r
358           case "r": img="media_3dobject.jpg"; break;\r
359           case "s": img="media_slide.jpg"; break;\r
360           case "t": img="media_online.jpg"; break;\r
361           case "u": img="media_eaudio.jpg"; break;\r
362           case "v": img="media_ebooktext.jpg"; break;\r
363           case "w": img="media_eaudio.jpg"; break;\r
364           case "x": img="media_downloadmusic.jpg"; break;\r
365           case "y": img="media_downloadvideo.jpg"; break;\r
366           case "z": img="media_map.jpg"; break;\r
367           case "2": img="media_cassettewithbook.jpg"; break;\r
368           case "5": img="media_cdwithbook.jpg"; break;\r
369         }\r
370         \r
371         if(img) {\r
372                 imgEl.title = img;\r
373                 dojo.attr(imgEl, "src","/opac/skin/kcls/graphics/"+img);\r
374                 dojo.attr(imgEl, "alt", get998dValue(type));\r
375         } else { hideMe(imgEl); return false; }\r
376         \r
377         unHideMe(imgEl);\r
378         return true;\r
379 }\r
380 \r
381 function get998dValue(code) {\r
382         if(!code) code = "";\r
383         code = code.toLowerCase();\r
384         var Label = "";\r
385         \r
386         switch(code) {\r
387                 case "a": Label = "Book"; break;\r
388                 case "i": Label = "Book on cassette"; break;\r
389                 case "n": Label = "Book on CD"; break;\r
390                 case "x": Label = "Download music"; break;\r
391                 case "y": Label = "Download video"; break;\r
392                 case "h": Label = "DVD"; break;\r
393                 case "w": Label = "eBook - Audio"; break;\r
394                 case "v": Label = "eBook - Text"; break;\r
395                 case "e": Label = "Equipment"; break;\r
396                 case "f": Label = "Films"; break;\r
397                 case "o": Label = "Kit"; break;\r
398                 case "q": Label = "Large print"; break;\r
399                 case "b": Label = "Magazine"; break;\r
400                 case "d": Label = "Microform"; break;\r
401                 case "k": Label = "Music cassette"; break;\r
402                 case "j": Label = "Music CD"; break;\r
403                 case "l": Label = "Music LP"; break;\r
404                 case "p": Label = "Newspaper"; break;\r
405                 case "t": Label = "Online"; break;\r
406                 case "u": Label = "Player"; break;\r
407                 case "c": Label = "Printed music"; break;\r
408                 case "2": Label = "Read along with cassette"; break;\r
409                 case "5": Label = "Read along with CD"; break;\r
410                 case "c": Label = "Scores"; break;\r
411                 case "m": Label = "Software"; break;\r
412                 case "g": Label = "Video"; break;\r
413                 case "r": Label = "3-D Object"; break;\r
414                 case "z": Label = "Map"; break;\r
415                 case "s": Label = "Slide set"; break;\r
416         }\r
417         return Label;\r
418 }\r
419 \r
420 function mapLibUrl(lib) {\r
421         var url = "";\r
422         switch(lib) {\r
423                 case "1489": url = "http://www.kcls.org/algonapacific/"; break;\r
424                 case "1490": url = "http://www.kcls.org/auburn/"; break;\r
425                 case "1492": url = "http://www.kcls.org/bellevue/"; break;\r
426                 case "1491": url = "http://www.kcls.org/blackdiamond/"; break;\r
427                 case "1493": url = "http://www.kcls.org/bothell/"; break;\r
428                 case "1494": url = "http://www.kcls.org/boulevardpark/"; break;\r
429                 case "1495": url = "http://www.kcls.org/burien/"; break;\r
430                 case "1496": url = "http://www.kcls.org/carnation/"; break;\r
431                 case "1497": url = "http://www.kcls.org/covington/"; break;\r
432                 case "1502": url = "http://www.kcls.org/desmoines/"; break;\r
433                 case "1503": url = "http://www.kcls.org/duvall/"; break;\r
434                 case "1508": url = "http://www.kcls.org/fairwood/"; break;\r
435                 case "1506": url = "http://www.kcls.org/fallcity/"; break;\r
436                 case "1509": url = "http://www.kcls.org/federalway/"; break;\r
437                 case "1505": url = "http://www.kcls.org/320th/"; break;\r
438                 case "1507": url = "http://www.kcls.org/foster/"; break;\r
439                 case "1513": url = "http://www.kcls.org/issaquah/"; break;\r
440                 case "1519": url = "http://www.kcls.org/kenmore/"; break;\r
441                 case "1520": url = "http://www.kcls.org/kent/"; break;\r
442                 case "1517": url = "http://www.kcls.org/kingsgate/"; break;\r
443                 case "1518": url = "http://www.kcls.org/kirkland/"; break;\r
444                 case "1521": url = "http://www.kcls.org/lakeforestpark/"; break;\r
445                 case "1522": url = "http://www.kcls.org/lakehills/"; break;\r
446                 case "1499": url = "http://www.kcls.org/crossroads/"; break;\r
447                 case "1538": url = "http://www.kcls.org/southcenter/"; break;\r
448                 case "1527": url = "http://www.kcls.org/maplevalley/"; break;\r
449                 case "1525": url = "http://www.kcls.org/mercerisland/"; break;\r
450                 case "1526": url = "http://www.kcls.org/muckleshoot/"; break;\r
451                 case "1529": url = "http://www.kcls.org/newportway/"; break;\r
452                 case "1528": url = "http://www.kcls.org/northbend/"; break;\r
453                 case "1533": url = "http://www.kcls.org/redmond/"; break;\r
454                 case "1532": url = "http://www.kcls.org/richmondbeach/"; break;\r
455                 case "1534": url = "http://www.kcls.org/sammamish/"; break;\r
456                 case "1536": url = "http://www.kcls.org/skykomish/"; break;\r
457                 case "1541": url = "http://www.kcls.org/skyway/"; break;\r
458                 case "1537": url = "http://www.kcls.org/snoqualmie/"; break;\r
459                 case "1546": url = "http://www.kcls.org/valleyview/"; break;\r
460                 case "1545": url = "http://www.kcls.org/vashon/"; break;\r
461                 case "1547": url = "http://www.kcls.org/whitecenter/"; break;\r
462                 case "1548": url = "http://www.kcls.org/woodinville/"; break;\r
463                 case "1549": url = "http://www.kcls.org/woodmont/"; break;\r
464                 case "1535": url = "http://www.kcls.org/shoreline/"; break;\r
465                 case "1540": url = "http://www.kcls.org/servicecenter/"; break;\r
466                 case "1510": url = "http://www.kcls.org/greenbridge/"; break;\r
467                 //case "": url = "http://www.kcls.org/federalway/#closure"; break;\r
468                 case "1559": url = "http://www.kcls.org/libraryexpress/"; break;\r
469                 case "1556": url = "http://www.kcls.org/renton/"; break;\r
470                 case "1557": url = "http://www.kcls.org/rentonhighlands/"; break;\r
471                 default: url = "";\r
472         }\r
473         return url;\r
474 }\r
475 \r
476 function checkAll(parent, id, name) {//Object, string\r
477         var obj = typeof(id)=="object"?id:$(id);\r
478         if(!parent || !obj) return;\r
479         if(!name) name = id.toString();\r
480         var nodes = dojo.query('input[name='+name+']', parent);\r
481         if(!nodes.length) nodes = dojo.query('.'+name, parent);\r
482         nodes.forEach(function(node, index){\r
483                 node.checked = obj.checked;\r
484         });\r
485 }\r
486 \r
487 var blinkMeArr = [];\r
488 function blinkMe(str,bool) {\r
489         var obj = $(str);\r
490         if(!obj) return;\r
491         \r
492         if(bool) {\r
493                 clearInterval(blinkMeArr[str]);\r
494                 hideMe(obj);\r
495         } else blinkMeArr[str] = setInterval(function(){\r
496                 obj.blinker?hideMe(obj):unHideMe(obj);\r
497                 obj.blinker=!obj.blinker;}, 500);\r
498 }\r
499 \r
500 // null out all children of parent obj\r
501 errCounter=0;\r
502 errCounter2=0;\r
503 function destroyObj(obj) {\r
504         errCounter++;\r
505         if(!obj) return;\r
506         errCounter2++;\r
507         for(var i in obj) {\r
508                 if(typeof(obj[i])=="function" && i=="destroyObj") continue;\r
509                 if(typeof(obj[i])=="object" && obj[i]!=null && typeof(obj[i].tagName)=="undefined") destroyObj(obj[i]);\r
510                 try { obj[i]=null; } catch(e){}\r
511         }\r
512         obj=null;\r
513 }\r
514 \r
515 attachEvt("common","init",mySuperInitFunction);\r