#!/tools/gnu/bin/perl-5.6.0-32bit -I/proj/icdg/bin/perlmod/lib -I/proj/icdg/bin/perlmod/lib/i386-linux # # Name: # hobbit.cgi. # # Purpose: # Test CGI::Explorer V 2. # # Note: # Tab = 4 spaces || die. # # Author: # Ron Savage # http://savage.net.au/index.html use strict; use warnings; use CGI qw(:standard :html3 Vars); use CGI::Explorer; use CGI::Carp qw(warningsToBrowser fatalsToBrowser); my $CSSdata = <= 2) { this.childNodes[this.childNodes.length - 2]._last = false; } while (root.parentNode) { root = root.parentNode; } if (root.rendered) { if (this.childNodes.length >= 2) { document.getElementById(this.childNodes[this.childNodes.length - 2].id + '-plus').src = ((this.childNodes[this.childNodes.length -2].folder)?((this.childNodes[this.childNodes.length -2].open)?webFXTreeConfig.tMinusIcon:webFXTreeConfig.tPlusIcon):webFXTreeConfig.tIcon); this.childNodes[this.childNodes.length - 2].plusIcon = webFXTreeConfig.tPlusIcon; this.childNodes[this.childNodes.length - 2].minusIcon = webFXTreeConfig.tMinusIcon; this.childNodes[this.childNodes.length - 2]._last = false; } this._last = true; var foo = this; while (foo.parentNode) { for (var i = 0; i < foo.parentNode.childNodes.length; i++) { if (foo.id == foo.parentNode.childNodes[i].id) { break; } } if (i == foo.parentNode.childNodes.length - 1) { foo.parentNode._last = true; } else { foo.parentNode._last = false; } foo = foo.parentNode; } webFXTreeHandler.insertHTMLBeforeEnd(document.getElementById(this.id + '-cont'), node.toString()); if ((!this.folder) && (!this.openIcon)) { this.icon = webFXTreeConfig.folderIcon; this.openIcon = webFXTreeConfig.openFolderIcon; } if (!this.folder) { this.folder = true; this.collapse(true); } if (!bNoIdent) { this.indent(); } } return node; } WebFXTreeAbstractNode.prototype.toggle = function() { if (this.folder) { if (this.open) { this.collapse(); } else { this.expand(); } } } WebFXTreeAbstractNode.prototype.select = function() { document.getElementById(this.id + '-anchor').focus(); } WebFXTreeAbstractNode.prototype.deSelect = function() { document.getElementById(this.id + '-anchor').className = ''; webFXTreeHandler.selected = null; } WebFXTreeAbstractNode.prototype.focus = function() { if ((webFXTreeHandler.selected) && (webFXTreeHandler.selected != this)) { webFXTreeHandler.selected.deSelect(); } webFXTreeHandler.selected = this; if ((this.openIcon) && (webFXTreeHandler.behavior != 'classic')) { document.getElementById(this.id + '-icon').src = this.openIcon; } document.getElementById(this.id + '-anchor').className = 'selected'; document.getElementById(this.id + '-anchor').focus(); if (webFXTreeHandler.onSelect) { webFXTreeHandler.onSelect(this); } } WebFXTreeAbstractNode.prototype.blur = function() { if ((this.openIcon) && (webFXTreeHandler.behavior != 'classic')) { document.getElementById(this.id + '-icon').src = this.icon; } document.getElementById(this.id + '-anchor').className = 'selected-inactive'; } WebFXTreeAbstractNode.prototype.doExpand = function() { if (webFXTreeHandler.behavior == 'classic') { document.getElementById(this.id + '-icon').src = this.openIcon; } if (this.childNodes.length) { document.getElementById(this.id + '-cont').style.display = 'block'; } this.open = true; if (webFXTreeConfig.usePersistence) { webFXTreeHandler.cookies.setCookie(this.id.substr(18,this.id.length - 18), '1'); } } WebFXTreeAbstractNode.prototype.doCollapse = function() { if (webFXTreeHandler.behavior == 'classic') { document.getElementById(this.id + '-icon').src = this.icon; } if (this.childNodes.length) { document.getElementById(this.id + '-cont').style.display = 'none'; } this.open = false; if (webFXTreeConfig.usePersistence) { webFXTreeHandler.cookies.setCookie(this.id.substr(18,this.id.length - 18), '0'); } } WebFXTreeAbstractNode.prototype.expandAll = function() { this.expandChildren(); if ((this.folder) && (!this.open)) { this.expand(); } } WebFXTreeAbstractNode.prototype.expandChildren = function() { for (var i = 0; i < this.childNodes.length; i++) { this.childNodes[i].expandAll(); } } WebFXTreeAbstractNode.prototype.collapseAll = function() { this.collapseChildren(); if ((this.folder) && (this.open)) { this.collapse(true); } } WebFXTreeAbstractNode.prototype.collapseChildren = function() { for (var i = 0; i < this.childNodes.length; i++) { this.childNodes[i].collapseAll(); } } WebFXTreeAbstractNode.prototype.indent = function(lvl, del, last, level, nodesLeft) { if (lvl == null) { lvl = -2; } var state = 0; for (var i = this.childNodes.length - 1; i >= 0 ; i--) { state = this.childNodes[i].indent(lvl + 1, del, last, level); if (state) { return; } } if (del) { if ((level >= this._level) && (document.getElementById(this.id + '-plus'))) { if (this.folder) { document.getElementById(this.id + '-plus').src = (this.open)?webFXTreeConfig.lMinusIcon:webFXTreeConfig.lPlusIcon; this.plusIcon = webFXTreeConfig.lPlusIcon; this.minusIcon = webFXTreeConfig.lMinusIcon; } else if (nodesLeft) { document.getElementById(this.id + '-plus').src = webFXTreeConfig.lIcon; } return 1; } } var foo = document.getElementById(this.id + '-indent-' + lvl); if (foo) { if ((foo._last) || ((del) && (last))) { foo.src = webFXTreeConfig.blankIcon; } else { foo.src = webFXTreeConfig.iIcon; } } return 0; } WebFXTree.prototype = new WebFXTreeAbstractNode; WebFXTree.prototype.setBehavior = function (sBehavior) { webFXTreeHandler.behavior = sBehavior; }; WebFXTree.prototype.getBehavior = function (sBehavior) { return webFXTreeHandler.behavior; }; WebFXTree.prototype.getSelected = function() { if (webFXTreeHandler.selected) { return webFXTreeHandler.selected; } else { return null; } } WebFXTree.prototype.remove = function() { } WebFXTree.prototype.expand = function() { this.doExpand(); } WebFXTree.prototype.collapse = function(b) { if (!b) { this.focus(); } this.doCollapse(); } WebFXTree.prototype.getFirst = function() { return null; } WebFXTree.prototype.getLast = function() { return null; } WebFXTree.prototype.getNextSibling = function() { return null; } WebFXTree.prototype.getPreviousSibling = function() { return null; } WebFXTree.prototype.keydown = function(key) { if (key == 39) { if (!this.open) { this.expand(); } else if (this.childNodes.length) { this.childNodes[0].select(); } return false; } if (key == 37) { this.collapse(); return false; } if ((key == 40) && (this.open) && (this.childNodes.length)) { this.childNodes[0].select(); return false; } return true; } WebFXTree.prototype.toString = function() { var str = "" + "
"; var sb = []; for (var i = 0; i < this.childNodes.length; i++) { sb[i] = this.childNodes[i].toString(i, this.childNodes.length); } this.rendered = true; return str + sb.join("") + "
"; } function WebFXTreeItem(sText, sAction, eParent, sIcon, sOpenIcon) { this.base = WebFXTreeAbstractNode; this.base(sText, sAction); /* Defaults to close */ if (webFXTreeConfig.usePersistence) { this.open = (webFXTreeHandler.cookies.getCookie(this.id.substr(18,this.id.length - 18)) == '1')?true:false; } else { this.open = false; } if (sIcon) { this.icon = sIcon; } if (sOpenIcon) { this.openIcon = sOpenIcon; } if (eParent) { eParent.add(this); } } WebFXTreeItem.prototype = new WebFXTreeAbstractNode; WebFXTreeItem.prototype.remove = function() { var iconSrc = document.getElementById(this.id + '-plus').src; var parentNode = this.parentNode; var prevSibling = this.getPreviousSibling(true); var nextSibling = this.getNextSibling(true); var folder = this.parentNode.folder; var last = ((nextSibling) && (nextSibling.parentNode) && (nextSibling.parentNode.id == parentNode.id))?false:true; this.getPreviousSibling().focus(); this._remove(); if (parentNode.childNodes.length == 0) { document.getElementById(parentNode.id + '-cont').style.display = 'none'; parentNode.doCollapse(); parentNode.folder = false; parentNode.open = false; } if (!nextSibling || last) { parentNode.indent(null, true, last, this._level, parentNode.childNodes.length); } if ((prevSibling == parentNode) && !(parentNode.childNodes.length)) { prevSibling.folder = false; prevSibling.open = false; iconSrc = document.getElementById(prevSibling.id + '-plus').src; iconSrc = iconSrc.replace('minus', '').replace('plus', ''); document.getElementById(prevSibling.id + '-plus').src = iconSrc; document.getElementById(prevSibling.id + '-icon').src = webFXTreeConfig.fileIcon; } if (document.getElementById(prevSibling.id + '-plus')) { if (parentNode == prevSibling.parentNode) { iconSrc = iconSrc.replace('minus', '').replace('plus', ''); document.getElementById(prevSibling.id + '-plus').src = iconSrc; } } } WebFXTreeItem.prototype._remove = function() { for (var i = this.childNodes.length - 1; i >= 0; i--) { this.childNodes[i]._remove(); } for (var i = 0; i < this.parentNode.childNodes.length; i++) { if (this == this.parentNode.childNodes[i]) { for (var j = i; j < this.parentNode.childNodes.length; j++) { this.parentNode.childNodes[j] = this.parentNode.childNodes[j+1]; } this.parentNode.childNodes.length -= 1; if (i + 1 == this.parentNode.childNodes.length) { this.parentNode._last = true; } break; } } webFXTreeHandler.all[this.id] = null; var tmp = document.getElementById(this.id); if (tmp) { tmp.parentNode.removeChild(tmp); } tmp = document.getElementById(this.id + '-cont'); if (tmp) { tmp.parentNode.removeChild(tmp); } } WebFXTreeItem.prototype.expand = function() { this.doExpand(); document.getElementById(this.id + '-plus').src = this.minusIcon; } WebFXTreeItem.prototype.collapse = function(b) { if (!b) { this.focus(); } this.doCollapse(); document.getElementById(this.id + '-plus').src = this.plusIcon; } WebFXTreeItem.prototype.getFirst = function() { return this.childNodes[0]; } WebFXTreeItem.prototype.getLast = function() { if (this.childNodes[this.childNodes.length - 1].open) { return this.childNodes[this.childNodes.length - 1].getLast(); } else { return this.childNodes[this.childNodes.length - 1]; } } WebFXTreeItem.prototype.getNextSibling = function() { for (var i = 0; i < this.parentNode.childNodes.length; i++) { if (this == this.parentNode.childNodes[i]) { break; } } if (++i == this.parentNode.childNodes.length) { return this.parentNode.getNextSibling(); } else { return this.parentNode.childNodes[i]; } } WebFXTreeItem.prototype.getPreviousSibling = function(b) { for (var i = 0; i < this.parentNode.childNodes.length; i++) { if (this == this.parentNode.childNodes[i]) { break; } } if (i == 0) { return this.parentNode; } else { if ((this.parentNode.childNodes[--i].open) || (b && this.parentNode.childNodes[i].folder)) { return this.parentNode.childNodes[i].getLast(); } else { return this.parentNode.childNodes[i]; } } } WebFXTreeItem.prototype.keydown = function(key) { if ((key == 39) && (this.folder)) { if (!this.open) { this.expand(); } else { this.getFirst().select(); } return false; } else if (key == 37) { if (this.open) { this.collapse(); } else { this.parentNode.select(); } return false; } else if (key == 40) { if (this.open) { this.getFirst().select(); } else { var sib = this.getNextSibling(); if (sib) { sib.select(); } } return false; } else if (key == 38) { this.getPreviousSibling().select(); return false; } return true; } WebFXTreeItem.prototype.toString = function (nItem, nItemCount) { var foo = this.parentNode; var indent = ''; if (nItem + 1 == nItemCount) { this.parentNode._last = true; } var i = 0; while (foo.parentNode) { foo = foo.parentNode; indent = "" + indent; i++; } this._level = i; if (this.childNodes.length) { this.folder = 1; } else { this.open = false; } if ((this.folder) || (webFXTreeHandler.behavior != 'classic')) { if (!this.icon) { this.icon = webFXTreeConfig.folderIcon; } if (!this.openIcon) { this.openIcon = webFXTreeConfig.openFolderIcon; } } else if (!this.icon) { this.icon = webFXTreeConfig.fileIcon; } var label = this.text.replace(//g, '>'); var str = "
" + indent + "" + "" + "" + label + "
" + "
"; var sb = []; for (var i = 0; i < this.childNodes.length; i++) { sb[i] = this.childNodes[i].toString(i,this.childNodes.length); } this.plusIcon = ((this.parentNode._last)?webFXTreeConfig.lPlusIcon:webFXTreeConfig.tPlusIcon); this.minusIcon = ((this.parentNode._last)?webFXTreeConfig.lMinusIcon:webFXTreeConfig.tMinusIcon); return str + sb.join("") + "
"; } ENDCODE # ----------------------------------------------- sub generate_hash { my(%hobbit) = ( 'Great grand gnome' => { code => 'G-g-g', # Code of 'Great grand gnome'. _url => '/test/test-menu.cgi', 'Great gnome' => { code => 'G-g-one', _node_id => 'G_g_one_00', _url => '/test/test-fancy-hash.cgi', 'Eldest great gnome' => {code => 'E-g-g-one'}, 'Youngest great gnome' => {code => 'Y-g-g'}, }, 'Grand gnome' => { code => 'G-g-two', _node_id => 'G_g_two_00', 'Smartest grand gnome' => {code => undef}, 'Prettiest grand gnome' => { code => '', 'Evil gnome' => { code => undef, 'Evil gray gnome' => {code => ''}, 'Evil grey gnome' => {code => 'E-g-g-two'}, }, }, 'Long lost grand gnome' => {code => 'L-l-g-g'}, }, }, ); return \%hobbit; } # End of generate_hash. # ----------------------------------------------- my($title) = 'Test CGI::Explorer'; my($q) = CGI -> new(); my($url) = $q -> url(); my($current_id) = $q -> path_info() || ''; $current_id =~ s|^/||; my($explorer, @html); my($hash) = generate_hash(); $explorer = CGI::Explorer -> new(behavior => 'explorer', current_icon => '/cgi_explorer/images/current.png', url => $url); my($tree) = $explorer -> hash2tree(current_id => $current_id, hashref => $hash); my($current_key) = $explorer -> id2key(); my(@current_key) = split(/$;/, $current_key); my($breadcrumb) = ''; my($crumb); for (0 .. $#current_key) { $crumb = $q -> a({href => $explorer -> key2url(current_key => join($;, @current_key[0 .. $_]) )}, $current_key[$_]); $breadcrumb .= ($_ ? (' ' x ($_ - 1) . ' > ') : '') . $crumb; } $breadcrumb = 'Your breadcrumb trail here' if (! $breadcrumb); my($name) = 'field01'; if (@current_key) { @current_key = map{$name++; $q -> td($q -> textfield({name => $name, size => 60, value => $_}) )} @current_key; my($node) = $explorer -> get_node(); push @current_key, map{$q -> td("$_: $$node{$_}")} grep{ref($$node{$_}) ne 'HASH'} sort keys %$node if (ref($node) eq 'HASH'); push @current_key, $q -> td($q -> submit({name => $name, style => 'background: #80c0ff', value => 'Update'}) ); } else { @current_key = $q -> td('No items selected yet'); } my($table) = $q -> table($q -> Tr([@current_key]) ); my($mids) = $q -> span({style => 'color: #0000ff; text-align: center; width: 80%'}, 'Hobbits and Hackers'); push(@html, $q -> div({style => 'position: absolute; top: 0.25em; left: 0.25em; padding: 0em; overflow: auto; height: 2.50em; width: 100%; border-bottom: solid thin #e0e0e0;'}, 'Your logo here' . $mids) ); my($menu) = $q -> span({style => 'color: #0000ff; text-align: left; width: 80%'}, 'Your menu here'); push(@html, $q -> div({style => 'position: absolute; top: 3.00em; left: 0.25em; padding: 0em; overflow: auto;'}, $menu) ); $breadcrumb = $q -> span({style => 'color: #0000ff; font-size: 10pt'}, $breadcrumb); push(@html, $q -> div({style => 'position: absolute; top: 4.50em; left: 0.25em; padding: 0em; overflow: auto; '}, $breadcrumb) ); push(@html, $q -> div({style => $explorer -> get('left_style')}, $q -> script({language => 'JavaScript'}, $tree) ) ); push(@html, $q -> div({style => $explorer -> get('right_style')}, $table) ); print $q -> header({type => $explorer -> get('header_type')}); #print $q -> start_html({script => "/js/xtree.js", style => {src => $explorer -> get('css')}, title => $title}); #print $q -> start_html(-script=>{-language=>'JAVASCRIPT',-src=>'/js/xtree.js'}); print $q -> start_html({script =>$TREEDATA, style => {-code=>$CSSdata}, title => $title}); #print $q -> start_html({script => {src => $explorer -> get('js')}, style => {src => $explorer -> get('css')}, title => $title}); print $q -> start_form({action => 'hobbit.cgi', name => $explorer -> get('form_name')}),@html; print $q -> end_form(); print $q -> end_html();