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