--- trunk/hide.js 2004/09/12 02:18:42 14 +++ trunk/hide.js 2004/09/12 20:30:47 17 @@ -1,17 +1,72 @@ -function toggle_display(name) { - var el = eval("document.getElementById('"+name+"')"); +/* + simple yet powerful implementation of show/hide effect + with history navigation (back/forward/default) + + Dobrica Pavlinusic 2004-09-12 +*/ + +var changed_display_ids = []; +var changed_display_pos = 0; +var id_cache = []; + +function element_id(id) { + if (id_cache[id]) { + return id_cache[id]; + } else { + var el = document.getElementById(id); + if (el) { + id_cache[id] = el; + return el; + } + } +} + +function toggle_display(name,dont_save) { + var el = element_id(name); if (el) { if (el.style.display=='none') el.style.display = ''; else el.style.display = 'none'; + + if (! dont_save) changed_display_ids[changed_display_pos++] = name; } return false; } +function default_display() { + for (var i = 0; i <= changed_display_pos; i++) { + toggle_display( changed_display_ids[i], 1 ); + } + changed_display_pos = 0; + return false; +} + +function back_display() { + if (changed_display_pos == 0) { + alert("can't go back in history"); + return; + } + toggle_display( changed_display_ids[--changed_display_pos], 1 ); +} + +function forward_display() { + if (changed_display_pos == changed_display_ids.length) { + alert("can't go forward in history"); + return; + } + + toggle_display( changed_display_ids[changed_display_pos++], 1 ); +} + +function reset_changed() { + changed_display_ids.length = 0; + changed_display_pos = 0; +} + function set_display(name,display) { - var el = eval("document.getElementById('"+name+"')"); + var el = element_id(name); if (el) el.style.display = display else alert("can't set_display("+name+","+display+")"); @@ -23,15 +78,35 @@ for (var i = 0; i < show.length; i++) { set_display(show[i],''); } + reset_changed(); } function hide_display(hide) { for (var i = 0; i < hide.length; i++) { set_display(hide[i],'none'); } + reset_changed(); } function show_hide_display(show,hide) { show_display(show); hide_display(hide); } + +function outline_display(name) { + + var el = element_id(name); + + if (el) { + el.style.background = "#e0e0e0"; + el.style.border = "1px dashed #c0c0c0"; + + if (el.style.display=='none') toggle_display(el.id); + + // recursivly show elements to root + while (el.parentNode) { + var el=el.parentNode; + if (el.style.display=='none') toggle_display(el.id); + } + } +}