Thank you to anyone who has already donated - your generous donations helped make three months of treatment possible.
My brother Nate continues to fight stage IV Hodgkin's lymphoma. He's just 31, with a wife and baby girl. They have no active income (since he's been unable to return to work), no insurance, and cannot afford the treatment he needs. Nate and his family need your help. Please consider a donation, every dollar helps. Thanks.
/* This file has been modified by Henrik Bechmann (bechmann.ca; henrik@bechmann.ca) January 1, 2011 Modified Features: This file adds "toggle" and "toggle-each" capability for accordions. Also slide speed can be specified with configuration slideUpSpeed and slideDownSpeed options. See end of file for most modifications. For embedded modifications, search for "// modification by HB" (there are 5 embedded modifications) Note: there is a design issue here, namely that the following should be separated: orientation: "vertical", "horizontal" effect: as listed, not including "horizontal" mode: "openpane" (default, standard), "toggle","toggle-each" This fix does not address this design issue, therefore this fix is a temporary hack to enable basic modes (openpane, toggle, toggle-each). Installation: link this file in webpage header directly after the jquery tools link. Usage: - for toggle and toggle-each, set the configuration effect to "toggle" or "toggle-each". - to alter slide speed set the configurations of slideUpSpeed and slideDownSpeed */ /** * @license * jQuery Tools 1.2.5 Tabs- The basics of UI design. * * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE. * * http://flowplayer.org/tools/tabs/ * * Since: November 2008 * Date: Wed Sep 22 06:02:10 2010 +0000 */ (function($) { // static constructs $.tools = $.tools || {version: '1.2.5'}; $.tools.tabs = { conf: { tabs: 'a', current: 'current', onBeforeClick: null, onClick: null, effect: 'default', initialIndex: 0, event: 'click', rotate: false, // 1.2 history: false }, addEffect: function(name, fn) { effects[name] = fn; } }; var effects = { // simple "toggle" effect 'default': function(i, done) { this.getPanes().hide().eq(i).show(); done.call(); }, /* configuration: - fadeOutSpeed (positive value does "crossfading") - fadeInSpeed */ fade: function(i, done) { var conf = this.getConf(), speed = conf.fadeOutSpeed, panes = this.getPanes(); if (speed) { panes.fadeOut(speed); } else { panes.hide(); } panes.eq(i).fadeIn(conf.fadeInSpeed, done); }, // for basic accordions slide: function(i, done) { this.getPanes().slideUp(200); this.getPanes().eq(i).slideDown(400, done); }, /** * AJAX effect */ ajax: function(i, done) { this.getPanes().eq(0).load(this.getTabs().eq(i).attr("href"), done); } }; var w; /** * Horizontal accordion * * @deprecated will be replaced with a more robust implementation */ $.tools.tabs.addEffect("horizontal", function(i, done) { // store original width of a pane into memory if (!w) {w = this.getPanes().eq(0).width(); } // set current pane's width to zero this.getCurrentPane().animate({width: 0}, function() { $(this).hide(); }); // grow opened pane to it's original width this.getPanes().eq(i).animate({width: w}, function() { $(this).show(); done.call(); }); }); function Tabs(root, paneSelector, conf) { var self = this, istoggle = (conf.effect == 'toggle' || conf.effect == 'toggle-each'), // modification by HB trigger = root.add(this), tabs = root.find(conf.tabs), panes = paneSelector.jquery ? paneSelector : root.children(paneSelector), current; // make sure tabs and panes are found if (!tabs.length) {tabs = root.children(); } if (!panes.length) {panes = root.parent().find(paneSelector); } if (!panes.length) {panes = $(paneSelector); } // public methods $.extend(this, { click: function(i, e) { var tab = tabs.eq(i); if (typeof i == 'string' && i.replace("#", "")) { tab = tabs.filter("[href*=" + i.replace("#", "") + "]"); i = Math.max(tabs.index(tab), 0); } if (conf.rotate) { var last = tabs.length -1; if (i < 0) {return self.click(last, e); } if (i > last) {return self.click(0, e); } } if (!tab.length) { if (current >= 0) {return self; } i = conf.initialIndex; tab = tabs.eq(i); } // current tab is being clicked if (!istoggle) {// modification by HB if (i === current) {return self; } } // modification by HB // possibility to cancel click action e = e || $.Event(); e.type = "onBeforeClick"; trigger.trigger(e, [i]); if (e.isDefaultPrevented()) {return; } // call the effect effects[conf.effect].call(self, i, function() { // onClick callback e.type = "onClick"; trigger.trigger(e, [i]); }); // default behaviour current = i; if (!istoggle) {// modification by HB tabs.removeClass(conf.current); tab.addClass(conf.current); } // modification by HB return self; }, getConf: function() { return conf; }, getTabs: function() { return tabs; }, getPanes: function() { return panes; }, getCurrentPane: function() { return panes.eq(current); }, getCurrentTab: function() { return tabs.eq(current); }, getIndex: function() { return current; }, next: function() { return self.click(current + 1); }, prev: function() { return self.click(current - 1); }, destroy: function() { tabs.unbind(conf.event).removeClass(conf.current); panes.find("a[href^=#]").unbind("click.T"); return self; } }); // callbacks $.each("onBeforeClick,onClick".split(","), function(i, name) { // configuration if ($.isFunction(conf[name])) { $(self).bind(name, conf[name]); } // API self[name] = function(fn) { if (fn) {$(self).bind(name, fn); } return self; }; }); if (conf.history && $.fn.history) { $.tools.history.init(tabs); conf.event = 'history'; } // setup click actions for each tab tabs.each(function(i) { $(this).bind(conf.event, function(e) { self.click(i, e); return e.preventDefault(); }); }); // cross tab anchor link panes.find("a[href^=#]").bind("click.T", function(e) { self.click($(this).attr("href"), e); }); // open initial tab if (location.hash && conf.tabs == "a" && root.find("[href=" +location.hash+ "]").length) { self.click(location.hash); } else { if (conf.initialIndex === 0 || conf.initialIndex > 0) { self.click(conf.initialIndex); } } } // jQuery plugin implementation $.fn.tabs = function(paneSelector, conf) { // return existing instance var el = this.data("tabs"); if (el) { el.destroy(); this.removeData("tabs"); } if ($.isFunction(conf)) { conf = {onBeforeClick: conf}; } // setup conf conf = $.extend({}, $.tools.tabs.conf, conf); this.each(function() { el = new Tabs($(this), paneSelector, conf); $(this).data("tabs", el); }); return conf.api ? el: this; }; }) (jQuery); /* ===========================[ Extensions by Henrik Bechmann (bechmann.ca) ]===================================*/ // extend jquery tools tabs $.extend($.tools.tabs.conf,{slideUpSpeed:400,slideDownSpeed:400}); $.tools.tabs.addEffect('slide',function(i, done) { var conf = this.getConf(); this.getPanes().slideUp(conf.slideUpSpeed); this.getPanes().eq(i).slideDown(conf.slideDownSpeed, done); }); $.tools.tabs.addEffect('toggle',function(i, done) { var conf = this.getConf(); var $tabs = this.getTabs(); var $tab = $tabs.eq(i); if ($tab.hasClass(conf.current)) { this.getPanes().eq(i).slideUp(conf.slideUpSpeed, done); $tabs.removeClass(conf.current); } else { this.getPanes().slideUp(conf.slideUpSpeed); this.getPanes().eq(i).slideDown(conf.slideDownSpeed, done); $tabs.removeClass(conf.current); $tab.addClass(conf.current); } }); $.tools.tabs.addEffect('toggle-each',function(i, done) { var conf = this.getConf(); var $tabs = this.getTabs(); var $tab = $tabs.eq(i); if ($tab.hasClass(conf.current)) { this.getPanes().eq(i).slideUp(conf.slideUpSpeed, done); $tab.removeClass(conf.current); } else { this.getPanes().eq(i).slideDown(conf.slideDownSpeed, done); $tab.addClass(conf.current); } });