Index: openacs-4/packages/imsld/tcl/imsld-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/imsld/tcl/imsld-procs.tcl,v diff -u -r1.50 -r1.51 --- openacs-4/packages/imsld/tcl/imsld-procs.tcl 4 Apr 2006 17:07:59 -0000 1.50 +++ openacs-4/packages/imsld/tcl/imsld-procs.tcl 5 Apr 2006 18:39:57 -0000 1.51 @@ -1275,7 +1275,6 @@ # FIX ME: when roles be supported, fix it so the mail is sent to the propper role set resource_item_list "" - set send_mail_node [$dom_doc createElement li] set a_node [$dom_doc createElement a] $a_node setAttribute href "[export_vars -base spam-recipients {referer one-community-admin}]" set img_node [$dom_doc createElement img] @@ -1285,8 +1284,7 @@ $img_node setAttribute heigth "16" $img_node setAttribute alt "[_ imsld.send-mail_service]" $a_node appendChild $img_node - $send_mail_node appendChild $a_node - $service_node appendChild $file_node + $service_node appendChild $a_node } default { @@ -2140,16 +2138,14 @@ } set file_url [acs_sc::invoke -contract FtsContentProvider -operation url -impl $object_type -call_args [list $acs_object_id]] - set file_node [$dom_doc createElement li] set a_node [$dom_doc createElement a] $a_node setAttribute href "[export_vars -base "[lindex [site_node::get_url_from_object_id -object_id $imsld_package_id] 0]imsld-finish-resource" {file_url $file_url resource_item_id $resource_item_id}]" set img_node [$dom_doc createElement img] $img_node setAttribute src "[imsld::object_type_image_path -object_type $object_type]" $img_node setAttribute border "0" $img_node setAttribute alt "$object_title" $a_node appendChild $img_node - $file_node appendChild $a_node - $dom_node appendChild $file_node + $dom_node appendChild $a_node } else { # get associated files @@ -2182,16 +2178,14 @@ }] set file_url "[apm_package_url_from_id $fs_package_id]view/${file_url}" - set file_node [$dom_doc createElement li] set a_node [$dom_doc createElement a] $a_node setAttribute href "[export_vars -base "[lindex [site_node::get_url_from_object_id -object_id $imsld_package_id] 0]imsld-finish-resource" {file_url $file_url resource_item_id $resource_item_id}]" set img_node [$dom_doc createElement img] $img_node setAttribute src "[imsld::object_type_image_path -object_type file-storage]" $img_node setAttribute border "0" $img_node setAttribute alt "$file_name" $a_node appendChild $img_node - $file_node appendChild $a_node - $dom_node appendChild $file_node + $dom_node appendChild $a_node } # get associated urls @@ -2203,16 +2197,14 @@ and ar.object_id_two = links.extlink_id } { - set file_node [$dom_doc createElement li] set a_node [$dom_doc createElement a] $a_node setAttribute href "[export_vars -base "[lindex [site_node::get_url_from_object_id -object_id $imsld_package_id] 0]imsld-finish-resource" { {file_url "[export_vars -base $url]"} resource_item_id}]" set img_node [$dom_doc createElement img] $img_node setAttribute src "[imsld::object_type_image_path -object_type url]" $img_node setAttribute border "0" $img_node setAttribute alt "$url" $a_node appendChild $img_node - $file_node appendChild $a_node - $dom_node appendChild $file_node + $dom_node appendChild $a_node } } @@ -2428,13 +2420,12 @@ } # prerequisites - set prerequisites_tab_node [$dom_doc createElement li] + set prerequisites_node [$dom_doc createElement div] + $prerequisites_node setAttribute class "tabbertab" + set prerequisites_head_node [$dom_doc createElement h2] set text [$dom_doc createTextNode "[_ imsld.Prerequisites]"] - $prerequisites_tab_node appendChild $text - set prerequisites_node [$dom_doc createElement ul] - # FIX-ME: if the ul is empty, the browser show the ul incorrectly - set text [$dom_doc createTextNode ""] - $prerequisites_node appendChild $text + $prerequisites_head_node appendChild $text + $prerequisites_node appendChild $prerequisites_head_node if { ![string eq "" $prerequisite_item_id] } { # add the prerequisite files as items of the list @@ -2444,17 +2435,15 @@ -dom_doc $dom_doc] } - $prerequisites_tab_node appendChild $prerequisites_node - $dom_node appendChild $prerequisites_tab_node + $dom_node appendChild $prerequisites_node # learning objectives - set objectives_tab_node [$dom_doc createElement li] + set objectives_node [$dom_doc createElement div] + $objectives_node setAttribute class "tabbertab" + set objectives_head_node [$dom_doc createElement h2] set text [$dom_doc createTextNode "[_ imsld.Objectives]"] - $objectives_tab_node appendChild $text - set objectives_node [$dom_doc createElement ul] - # FIX-ME: if the ul is empty, the browser show the ul incorrectly - set text [$dom_doc createTextNode ""] - $objectives_node appendChild $text + $objectives_head_node appendChild $text + $objectives_node appendChild $objectives_head_node if { ![string eq "" $learning_objective_item_id] } { # add the prerequisite files as items of the list @@ -2464,8 +2453,7 @@ -dom_doc $dom_doc] } - $objectives_tab_node appendChild $objectives_node - $dom_node appendChild $objectives_tab_node + $dom_node appendChild $objectives_node if { [string eq $resource_mode "t"] } { return [concat $prerequisites_list $objectives_list] @@ -2498,54 +2486,13 @@ and content_revision__is_live(activity_id) = 't' } - # prerequisites - set prerequisites_tab_node [$dom_doc createElement li] - set text [$dom_doc createTextNode "[_ imsld.Prerequisites]"] - $prerequisites_tab_node appendChild $text - set prerequisites_node [$dom_doc createElement ul] - # FIX-ME: if the ul is empty, the browser show the ul incorrectly - set text [$dom_doc createTextNode ""] - $prerequisites_node appendChild $text - if { ![string eq "" $prerequisite_item_id] } { - # add the prerequisite files as items of the list - - set prerequisites_list [imsld::process_prerequisite_as_ul -activity_item_id $activity_item_id \ - -resource_mode $resource_mode \ - -dom_node $prerequisites_node \ - -dom_doc $dom_doc] - - } - $prerequisites_tab_node appendChild $prerequisites_node - $dom_node appendChild $prerequisites_tab_node - - # learning objectives - set objectives_tab_node [$dom_doc createElement li] - set text [$dom_doc createTextNode "[_ imsld.Objectives]"] - $objectives_tab_node appendChild $text - set objectives_node [$dom_doc createElement ul] - # FIX-ME: if the ul is empty, the browser show the ul incorrectly - set text [$dom_doc createTextNode ""] - $objectives_node appendChild $text - if { ![string eq "" $learning_objective_item_id] } { - # add the prerequisite files as items of the list - - set objectives_list [imsld::process_learning_objective_as_ul -activity_item_id $activity_item_id \ - -resource_mode $resource_mode \ - -dom_node $objectives_node \ - -dom_doc $dom_doc] - - } - $objectives_tab_node appendChild $objectives_node - $dom_node appendChild $objectives_tab_node - # get the items associated with the activity - set description_tab_node [$dom_doc createElement li] + set description_node [$dom_doc createElement div] + $description_node setAttribute class "tabbertab" + set description_head_node [$dom_doc createElement h2] set text [$dom_doc createTextNode "[_ imsld.Description]"] - $description_tab_node appendChild $text - set description_node [$dom_doc createElement ul] - # FIX-ME: if the ul is empty, the browser show the ul incorrectly - set text [$dom_doc createTextNode ""] - $description_node appendChild $text + $description_head_node appendChild $text + $description_node appendChild $description_head_node set linear_item_list [db_list item_linear_list { select ii.imsld_item_id from imsld_items ii, imsld_activity_descs lad, imsld_learning_activitiesi la, @@ -2589,17 +2536,51 @@ } } } - $description_tab_node appendChild $description_node - $dom_node appendChild $description_tab_node + $dom_node appendChild $description_node + # prerequisites + set prerequisites_node [$dom_doc createElement div] + $prerequisites_node setAttribute class "tabbertab" + set prerequisites_head_node [$dom_doc createElement h2] + set text [$dom_doc createTextNode "[_ imsld.Prerequisites]"] + $prerequisites_head_node appendChild $text + $prerequisites_node appendChild $prerequisites_head_node + if { ![string eq "" $prerequisite_item_id] } { + # add the prerequisite files as items of the list + + set prerequisites_list [imsld::process_prerequisite_as_ul -activity_item_id $activity_item_id \ + -resource_mode $resource_mode \ + -dom_node $prerequisites_node \ + -dom_doc $dom_doc] + + } + $dom_node appendChild $prerequisites_node + + # learning objectives + set objectives_node [$dom_doc createElement div] + $objectives_node setAttribute class "tabbertab" + set objectives_head_node [$dom_doc createElement h2] + set text [$dom_doc createTextNode "[_ imsld.Objectives]"] + $objectives_head_node appendChild $text + $objectives_node appendChild $objectives_head_node + if { ![string eq "" $learning_objective_item_id] } { + # add the prerequisite files as items of the list + + set objectives_list [imsld::process_learning_objective_as_ul -activity_item_id $activity_item_id \ + -resource_mode $resource_mode \ + -dom_node $objectives_node \ + -dom_doc $dom_doc] + + } + $dom_node appendChild $objectives_node + # process feedback only if the activity is finished - set feedback_tab_node [$dom_doc createElement li] + set feedback_node [$dom_doc createElement div] + $feedback_node setAttribute class "tabbertab" + set feedback_head_node [$dom_doc createElement h2] set text [$dom_doc createTextNode "[_ imsld.Feedback]"] - $feedback_tab_node appendChild $text - set feedback_node [$dom_doc createElement ul] - # FIX-ME: if the ul is empty, the browser show the ul incorrectly - set text [$dom_doc createTextNode ""] - $feedback_node appendChild $text + $feedback_head_node appendChild $text + $feedback_node appendChild $feedback_head_node if { [db_0or1row completed_activity { select 1 from imsld_status_user @@ -2614,8 +2595,7 @@ -dom_node $feedback_node } } - $feedback_tab_node appendChild $feedback_node - $dom_node appendChild $feedback_tab_node + $dom_node appendChild $feedback_node if { [string eq "t" $resource_mode] } { # get environments @@ -2788,13 +2768,12 @@ } # get the items associated with the activity - set description_tab_node [$dom_doc createElement li] + set description_node [$dom_doc createElement div] + $description_node setAttribute class "tabbertab" + set description_head_node [$dom_doc createElement h2] set text [$dom_doc createTextNode "[_ imsld.Description]"] - $description_tab_node appendChild $text - set description_node [$dom_doc createElement ul] - # FIX-ME: if the ul is empty, the browser show the ul incorrectly - set text [$dom_doc createTextNode ""] - $description_node appendChild $text + $description_head_node appendChild $text + $description_node appendChild $description_head_node set linear_item_list [db_list item_linear_list { select ii.imsld_item_id from imsld_items ii, imsld_activity_descs sad, imsld_support_activitiesi sa, @@ -2837,17 +2816,15 @@ } } } - $description_tab_node appendChild $description_node - $dom_node appendChild $description_tab_node + $dom_node appendChild $description_node # process feedback only if the activity is finished - set feedback_tab_node [$dom_doc createElement li] + set feedback_node [$dom_doc createElement div] + $feedback_node setAttribute class "tabbertab" + set feedback_head_node [$dom_doc createElement h2] set text [$dom_doc createTextNode "[_ imsld.Feedback]"] - $feedback_tab_node appendChild $text - set feedback_node [$dom_doc createElement ul] - # FIX-ME: if the ul is empty, the browser show the ul incorrectly - set text [$dom_doc createTextNode ""] - $feedback_node appendChild $text + $feedback_head_node appendChild $text + $feedback_node appendChild $feedback_head_node if { [db_0or1row completed_activity { select 1 from imsld_status_user @@ -2862,8 +2839,7 @@ -dom_node $feedback_node } } - $feedback_tab_node appendChild $feedback_node - $dom_node appendChild $feedback_tab_node + $dom_node appendChild $feedback_node if { [string eq "t" $resource_mode] } { # get environments Index: openacs-4/packages/imsld/www/activity-frame.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/imsld/www/activity-frame.adp,v diff -u -r1.4 -r1.5 --- openacs-4/packages/imsld/www/activity-frame.adp 4 Apr 2006 10:27:53 -0000 1.4 +++ openacs-4/packages/imsld/www/activity-frame.adp 5 Apr 2006 18:39:57 -0000 1.5 @@ -3,85 +3,21 @@ - @@ -101,7 +37,7 @@ o.height = window.innerHeight - o.style.top - 50; o.width = window.innerWidth - o.style.left - 30; } -window.onload = resizeobject; +resizeobject(); window.onresize = resizeobject; function objecturl(url) { @@ -117,6 +53,7 @@ var a = as[i]; a.setAttribute('target', 'object'); } +document.getElementById('object').src = as[0].getAttribute('href'); Index: openacs-4/packages/imsld/www/activity-frame.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/imsld/www/activity-frame.tcl,v diff -u -r1.3 -r1.4 --- openacs-4/packages/imsld/www/activity-frame.tcl 31 Mar 2006 14:36:50 -0000 1.3 +++ openacs-4/packages/imsld/www/activity-frame.tcl 5 Apr 2006 18:39:57 -0000 1.4 @@ -10,9 +10,9 @@ set user_id [ad_conn user_id] -dom createDocument ul doc +dom createDocument div doc set dom_root [$doc documentElement] -$dom_root setAttribute class "nav" +$dom_root setAttribute class "tabber" set activity_item_id [content::revision::item_id -revision_id $activity_id] imsld::process_activity_as_ul -activity_item_id $activity_item_id -dom_doc $doc -dom_node $dom_root Index: openacs-4/packages/imsld/www/resources/example-print.css =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/imsld/www/resources/example-print.css,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/imsld/www/resources/example-print.css 5 Apr 2006 18:39:58 -0000 1.1 @@ -0,0 +1,8 @@ +/* $Id: example-print.css,v 1.1 2006/04/05 18:39:58 eduardop Exp $ */ +/* When printing, hide the tab navigation list + and don't use any other styles +*/ + +.tabbernav { + display:none; +} Index: openacs-4/packages/imsld/www/resources/example.css =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/imsld/www/resources/example.css,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/imsld/www/resources/example.css 5 Apr 2006 18:39:58 -0000 1.1 @@ -0,0 +1,109 @@ +/* $Id: example.css,v 1.1 2006/04/05 18:39:58 eduardop Exp $ */ + +/*-------------------------------------------------- + REQUIRED to hide the non-active tab content. + But do not hide them in the print stylesheet! + --------------------------------------------------*/ +.tabberlive .tabbertabhide { + display:none; +} + +/*-------------------------------------------------- + .tabber = before the tabber interface is set up + .tabberlive = after the tabber interface is set up + --------------------------------------------------*/ +.tabber { +} +.tabberlive { + margin-top:1em; +} + +/*-------------------------------------------------- + ul.tabbernav = the tab navigation list + li.tabberactive = the active tab + --------------------------------------------------*/ +ul.tabbernav +{ + margin:0; + padding: 3px 0; + border-bottom: 1px solid #778; + font: bold 12px Verdana, sans-serif; +} + +ul.tabbernav li +{ + list-style: none; + margin: 0; + display: inline; +} + +ul.tabbernav li a +{ + padding: 3px 0.5em; + margin-left: 3px; + border: 1px solid #778; + border-bottom: none; + background: #DDE; + text-decoration: none; +} + +ul.tabbernav li a:link { color: #448; } +ul.tabbernav li a:visited { color: #667; } + +ul.tabbernav li a:hover +{ + color: #000; + background: #AAE; + border-color: #227; +} + +ul.tabbernav li.tabberactive a +{ + background-color: #fff; + border-bottom: 1px solid #fff; +} + +ul.tabbernav li.tabberactive a:hover +{ + color: #000; + background: white; + border-bottom: 1px solid white; +} + +/*-------------------------------------------------- + .tabbertab = the tab content + Add style only after the tabber interface is set up (.tabberlive) + --------------------------------------------------*/ +.tabberlive .tabbertab { + padding:5px; + border:1px solid #aaa; + border-top:0; + + /* If you don't want the tab size changing whenever a tab is changed + you can set a fixed height */ + + /* height:200px; */ + + /* If you set a fix height set overflow to auto and you will get a + scrollbar when necessary */ + + /* overflow:auto; */ +} + +/* If desired, hide the heading since a heading is provided by the tab */ +.tabberlive .tabbertab h2 { + display:none; +} +.tabberlive .tabbertab h3 { + display:none; +} + +/* Example of using an ID to set different styles for the tabs on the page */ +.tabberlive#tab1 { +} +.tabberlive#tab2 { +} +.tabberlive#tab2 .tabbertab { + height:200px; + overflow:auto; +} Index: openacs-4/packages/imsld/www/resources/tabber.js =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/imsld/www/resources/tabber.js,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/imsld/www/resources/tabber.js 5 Apr 2006 18:39:58 -0000 1.1 @@ -0,0 +1,485 @@ +/*================================================== + $Id: tabber.js,v 1.1 2006/04/05 18:39:58 eduardop Exp $ + tabber.js by Patrick Fitzgerald pat@barelyfitz.com + + Documentation can be found at the following URL: + http://www.barelyfitz.com/projects/tabber/ + + License (http://www.opensource.org/licenses/mit-license.php) + + Copyright (c) 2006 Patrick Fitzgerald + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation files + (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + ==================================================*/ + +function tabberObj(argsObj) +{ + var arg; /* name of an argument to override */ + + /* Element for the main tabber div. If you supply this in argsObj, + then the init() method will be called. + */ + this.div = null; + + /* Class of the main tabber div */ + this.classMain = "tabber"; + + /* Rename classMain to classMainLive after tabifying + (so a different style can be applied) + */ + this.classMainLive = "tabberlive"; + + /* Class of each DIV that contains a tab */ + this.classTab = "tabbertab"; + + /* Class to indicate which tab should be active on startup */ + this.classTabDefault = "tabbertabdefault"; + + /* Class for the navigation UL */ + this.classNav = "tabbernav"; + + /* When a tab is to be hidden, instead of setting display='none', we + set the class of the div to classTabHide. In your screen + stylesheet you should set classTabHide to display:none. In your + print stylesheet you should set display:block to ensure that all + the information is printed. + */ + this.classTabHide = "tabbertabhide"; + + /* Class to set the navigation LI when the tab is active, so you can + use a different style on the active tab. + */ + this.classNavActive = "tabberactive"; + + /* Elements that might contain the title for the tab, only used if a + title is not specified in the TITLE attribute of DIV classTab. + */ + this.titleElements = ['h2','h3','h4','h5','h6']; + + /* Should we strip out the HTML from the innerHTML of the title elements? + This should usually be true. + */ + this.titleElementsStripHTML = true; + + /* If the user specified the tab names using a TITLE attribute on + the DIV, then the browser will display a tooltip whenever the + mouse is over the DIV. To prevent this tooltip, we can remove the + TITLE attribute after getting the tab name. + */ + this.removeTitle = true; + + /* You can override the defaults listed above by passing in an object: + var mytab = new tabber({property:value,property:value}); + */ + for (arg in argsObj) { this[arg] = argsObj[arg]; } + + /* Create regular expressions for the class names; Note: if you + change the class names after a new object is created you must + also change these regular expressions. + */ + this.REclassMain = new RegExp('\\b' + this.classMain + '\\b', 'gi'); + this.REclassMainLive = new RegExp('\\b' + this.classMainLive + '\\b', 'gi'); + this.REclassTab = new RegExp('\\b' + this.classTab + '\\b', 'gi'); + this.REclassTabDefault = new RegExp('\\b' + this.classTabDefault + '\\b', 'gi'); + this.REclassTabHide = new RegExp('\\b' + this.classTabHide + '\\b', 'gi'); + + /* Array of objects holding info about each tab */ + this.tabs = new Array(); + + /* If the main tabber div was specified, call init() now */ + if (this.div) { + + this.init(this.div); + + /* We don't need the main div anymore, and to prevent a memory leak + in IE, we must remove the circular reference between the div + and the tabber object. */ + this.div = null; + } +} + + +/*-------------------------------------------------- + Methods for tabberObj + --------------------------------------------------*/ + + +tabberObj.prototype.init = function(e) +{ + /* Set up the tabber interface. + + e = element (the main containing div) + + Example: + init(document.getElementById('mytabberdiv')) + */ + + var + childNodes, /* child nodes of the tabber div */ + i, i2, /* loop indices */ + t, /* object to store info about a single tab */ + defaultTab=0, /* which tab to select by default */ + DOM_ul, /* tabbernav list */ + DOM_li, /* tabbernav list item */ + DOM_a, /* tabbernav link */ + headingElement; /* searching for text to use in the tab */ + + /* Verify that the browser supports DOM scripting */ + if (!document.getElementsByTagName) { return false; } + + /* If the main DIV has an ID then save it. */ + if (e.id) { + this.id = e.id; + } + + /* Clear the tabs array (but it should normally be empty) */ + this.tabs.length = 0; + + /* Loop through an array of all the child nodes within our tabber element. */ + childNodes = e.childNodes; + for(i=0; i < childNodes.length; i++) { + + /* Find the nodes where class="tabbertab" */ + if(childNodes[i].className && + childNodes[i].className.match(this.REclassTab)) { + + /* Create a new object to save info about this tab */ + t = new Object(); + + /* Save a pointer to the div for this tab */ + t.div = childNodes[i]; + + /* Add the new object to the array of tabs */ + this.tabs[this.tabs.length] = t; + + /* If the class name contains classTabDefault, + then select this tab by default. + */ + if (childNodes[i].className.match(this.REclassTabDefault)) { + defaultTab = this.tabs.length-1; + } + } + } + + /* Create a new UL list to hold the tab headings */ + DOM_ul = document.createElement("ul"); + DOM_ul.className = this.classNav; + + /* Loop through each tab we found */ + for (i=0; i < this.tabs.length; i++) { + + t = this.tabs[i]; + + /* Get the label to use for this tab: + From the title attribute on the DIV, + Or from one of the this.titleElements[] elements, + Or use an automatically generated number. + */ + t.headingText = t.div.title; + + /* Remove the title attribute to prevent a tooltip from appearing */ + if (this.removeTitle) { t.div.title = ''; } + + if (!t.headingText) { + + /* Title was not defined in the title of the DIV, + So try to get the title from an element within the DIV. + Go through the list of elements in this.titleElements + (typically heading elements ['h2','h3','h4']) + */ + for (i2=0; i2/gi," "); + t.headingText = t.headingText.replace(/<[^>]+>/g,""); + } + break; + } + } + } + + if (!t.headingText) { + /* Title was not found (or is blank) so automatically generate a + number for the tab. + */ + t.headingText = i + 1; + } + + /* Create a list element for the tab */ + DOM_li = document.createElement("li"); + + /* Save a reference to this list item so we can later change it to + the "active" class */ + t.li = DOM_li; + + /* Create a link to activate the tab */ + DOM_a = document.createElement("a"); + DOM_a.appendChild(document.createTextNode(t.headingText)); + DOM_a.href = "javascript:void(null);"; + DOM_a.title = t.headingText; + DOM_a.onclick = this.navClick; + + /* Add some properties to the link so we can identify which tab + was clicked. Later the navClick method will need this. + */ + DOM_a.tabber = this; + DOM_a.tabIndex = i; + + /* Add the link to the list element */ + DOM_li.appendChild(DOM_a); + + /* Add the list element to the list */ + DOM_ul.appendChild(DOM_li); + } + + /* Add the UL list to the beginning of the tabber div */ + e.insertBefore(DOM_ul, e.firstChild); + + /* Make the tabber div "live" so different CSS can be applied */ + e.className = e.className.replace(this.REclassMain, this.classMainLive); + + /* Activate the default tab, and do not call the onclick handler */ + this.tabShow(defaultTab); + + /* If the user specified an onLoad function, call it now. */ + if (typeof this.onLoad == 'function') { + this.onLoad({tabber:this}); + } + + return this; +}; + + +tabberObj.prototype.navClick = function(event) +{ + /* This method should only be called by the onClick event of an + element, in which case we will determine which tab was clicked by + examining a property that we previously attached to the + element. + + Since this was triggered from an onClick event, the variable + "this" refers to the element that triggered the onClick + event (and not to the tabberObj). + + When tabberObj was initialized, we added some extra properties + to the element, for the purpose of retrieving them now. Get + the tabberObj object, plus the tab number that was clicked. + */ + + var + rVal, /* Return value from the user onclick function */ + a, /* element that triggered the onclick event */ + self, /* the tabber object */ + tabIndex, /* index of the tab that triggered the event */ + onClickArgs; /* args to send the onclick function */ + + a = this; + if (!a.tabber) { return false; } + + self = a.tabber; + tabIndex = a.tabIndex; + + /* Remove focus from the link because it looks ugly. + I don't know if this is a good idea... + */ + a.blur(); + + /* If the user specified an onClick function, call it now. + If the function returns false then do not continue. + */ + if (typeof self.onClick == 'function') { + + onClickArgs = {'tabber':self, 'index':tabIndex, 'event':event}; + + /* IE uses a different way to access the event object */ + if (!event) { onClickArgs.event = window.event; } + + rVal = self.onClick(onClickArgs); + if (rVal === false) { return false; } + } + + self.tabShow(tabIndex); + + return true; +}; + + +tabberObj.prototype.tabHideAll = function() +{ + var i; /* counter */ + + /* Hide all tabs and make all navigation links inactive */ + for (i = 0; i < this.tabs.length; i++) { + this.tabHide(i); + } +}; + + +tabberObj.prototype.tabHide = function(tabIndex) +{ + /* Hide a single tab and make its navigation link inactive */ + var div = this.tabs[tabIndex].div; + + /* Hide the tab contents by adding classTabHide to the div */ + if (!div.className.match(this.REclassTabHide)) { + div.className += ' ' + this.classTabHide; + } + this.navClearActive(tabIndex); +}; + + +tabberObj.prototype.tabShow = function(tabIndex) +{ + /* Show the tabIndex tab and hide all the other tabs */ + + var div; + + if (!this.tabs[tabIndex]) { return false; } + + /* Hide all the tabs first */ + this.tabHideAll(); + + /* Get the div that holds this tab */ + div = this.tabs[tabIndex].div; + + /* Remove classTabHide from the div */ + div.className = div.className.replace(this.REclassTabHide, ''); + + /* Mark this tab navigation link as "active" */ + this.navSetActive(tabIndex); + + return this; +}; + + +tabberObj.prototype.navSetActive = function(tabIndex) +{ + /* Note: this method does *not* enforce the rule + that only one nav item can be active at a time. + */ + + /* Set classNavActive for the navigation list item */ + this.tabs[tabIndex].li.className = this.classNavActive; + + return this; +}; + + +tabberObj.prototype.navClearActive = function(tabIndex) +{ + /* Note: this method does *not* enforce the rule + that one nav should always be active. + */ + + /* Remove classNavActive from the navigation list item */ + this.tabs[tabIndex].li.className = ''; + + return this; +}; + + +/*==================================================*/ + + +function tabberAutomatic(tabberArgs) +{ + /* This function finds all DIV elements in the document where + class=tabber.classMain, then converts them to use the tabber + interface. + + tabberArgs = an object to send to "new tabber()" + */ + var + tempObj, /* Temporary tabber object */ + divs, /* Array of all divs on the page */ + i; /* Loop index */ + + if (!tabberArgs) { tabberArgs = {}; } + + /* Create a tabber object so we can get the value of classMain */ + tempObj = new tabberObj(tabberArgs); + + /* Find all DIV elements in the document that have class=tabber */ + + /* First get an array of all DIV elements and loop through them */ + divs = document.getElementsByTagName("div"); + for (i=0; i < divs.length; i++) { + + /* Is this DIV the correct class? */ + if (divs[i].className && + divs[i].className.match(tempObj.REclassMain)) { + + /* Now tabify the DIV */ + tabberArgs.div = divs[i]; + divs[i].tabber = new tabberObj(tabberArgs); + } + } + + return this; +} + + +/*==================================================*/ + + +function tabberAutomaticOnLoad(tabberArgs) +{ + /* This function adds tabberAutomatic to the window.onload event, + so it will run after the document has finished loading. + */ + var oldOnLoad; + + if (!tabberArgs) { tabberArgs = {}; } + + /* Taken from: http://simon.incutio.com/archive/2004/05/26/addLoadEvent */ + + oldOnLoad = window.onload; + if (typeof window.onload != 'function') { + window.onload = function() { + tabberAutomatic(tabberArgs); + }; + } else { + window.onload = function() { + oldOnLoad(); + tabberAutomatic(tabberArgs); + }; + } +} + + +/*==================================================*/ + + +/* Run tabberAutomaticOnload() unless the "manualStartup" option was specified */ + +if (typeof tabberOptions == 'undefined') { + + tabberAutomaticOnLoad(); + +} else { + + if (!tabberOptions['manualStartup']) { + tabberAutomaticOnLoad(tabberOptions); + } + +}