diff --git a/sites/all/modules/ux_elements/LICENSE.txt b/sites/all/modules/ux_elements/LICENSE.txt new file mode 100644 index 0000000000000000000000000000000000000000..2c095c8d3f42488e8168f9710a4ffbfc4125a159 --- /dev/null +++ b/sites/all/modules/ux_elements/LICENSE.txt @@ -0,0 +1,274 @@ +GNU GENERAL PUBLIC LICENSE + + Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, +Cambridge, MA 02139, USA. Everyone is permitted to copy and distribute +verbatim copies of this license document, but changing it is not allowed. + + Preamble + +The licenses for most software are designed to take away your freedom to +share and change it. By contrast, the GNU General Public License is +intended to guarantee your freedom to share and change free software--to +make sure the software is free for all its users. This General Public License +applies to most of the Free Software Foundation's software and to any other +program whose authors commit to using it. (Some other Free Software +Foundation software is covered by the GNU Library General Public License +instead.) You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the +freedom to distribute copies of free software (and charge for this service if +you wish), that you receive source code or can get it if you want it, that you +can change the software or use pieces of it in new free programs; and that +you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to +deny you these rights or to ask you to surrender the rights. These restrictions +translate to certain responsibilities for you if you distribute copies of the +software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for +a fee, you must give the recipients all the rights that you have. You must make +sure that they, too, receive or can get the source code. And you must show +them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) +offer you this license which gives you legal permission to copy, distribute +and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If the +software is modified by someone else and passed on, we want its recipients +to know that what they have is not the original, so that any problems +introduced by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We +wish to avoid the danger that redistributors of a free program will individually +obtain patent licenses, in effect making the program proprietary. To prevent +this, we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification +follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND + MODIFICATION + +0. This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the terms +of this General Public License. The "Program", below, refers to any such +program or work, and a "work based on the Program" means either the +Program or any derivative work under copyright law: that is to say, a work +containing the Program or a portion of it, either verbatim or with +modifications and/or translated into another language. (Hereinafter, translation +is included without limitation in the term "modification".) Each licensee is +addressed as "you". + +Activities other than copying, distribution and modification are not covered +by this License; they are outside its scope. The act of running the Program is +not restricted, and the output from the Program is covered only if its contents +constitute a work based on the Program (independent of having been made +by running the Program). Whether that is true depends on what the Program +does. + +1. You may copy and distribute verbatim copies of the Program's source +code as you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that refer to this License +and to the absence of any warranty; and give any other recipients of the +Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you +may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, +thus forming a work based on the Program, and copy and distribute such +modifications or work under the terms of Section 1 above, provided that you +also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices stating that +you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in whole or in +part contains or is derived from the Program or any part thereof, to be +licensed as a whole at no charge to all third parties under the terms of this +License. + +c) If the modified program normally reads commands interactively when run, +you must cause it, when started running for such interactive use in the most +ordinary way, to print or display an announcement including an appropriate +copyright notice and a notice that there is no warranty (or else, saying that +you provide a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this License. +(Exception: if the Program itself is interactive but does not normally print such +an announcement, your work based on the Program is not required to print +an announcement.) + +These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Program, and can be +reasonably considered independent and separate works in themselves, then +this License, and its terms, do not apply to those sections when you distribute +them as separate works. But when you distribute the same sections as part +of a whole which is a work based on the Program, the distribution of the +whole must be on the terms of this License, whose permissions for other +licensees extend to the entire whole, and thus to each and every part +regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to +work written entirely by you; rather, the intent is to exercise the right to +control the distribution of derivative or collective works based on the +Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of a +storage or distribution medium does not bring the other work under the scope +of this License. + +3. You may copy and distribute the Program (or a work based on it, under +Section 2) in object code or executable form under the terms of Sections 1 +and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable source +code, which must be distributed under the terms of Sections 1 and 2 above +on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three years, to give +any third party, for a charge no more than your cost of physically performing +source distribution, a complete machine-readable copy of the corresponding +source code, to be distributed under the terms of Sections 1 and 2 above on +a medium customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer to distribute +corresponding source code. (This alternative is allowed only for +noncommercial distribution and only if you received the program in object +code or executable form with such an offer, in accord with Subsection b +above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source code +means all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation and +installation of the executable. However, as a special exception, the source +code distributed need not include anything that is normally distributed (in +either source or binary form) with the major components (compiler, kernel, +and so on) of the operating system on which the executable runs, unless that +component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to +copy from a designated place, then offering equivalent access to copy the +source code from the same place counts as distribution of the source code, +even though third parties are not compelled to copy the source along with the +object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as +expressly provided under this License. Any attempt otherwise to copy, +modify, sublicense or distribute the Program is void, and will automatically +terminate your rights under this License. However, parties who have received +copies, or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. +However, nothing else grants you permission to modify or distribute the +Program or its derivative works. These actions are prohibited by law if you +do not accept this License. Therefore, by modifying or distributing the +Program (or any work based on the Program), you indicate your acceptance +of this License to do so, and all its terms and conditions for copying, +distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the original +licensor to copy, distribute or modify the Program subject to these terms and +conditions. You may not impose any further restrictions on the recipients' +exercise of the rights granted herein. You are not responsible for enforcing +compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), conditions +are imposed on you (whether by court order, agreement or otherwise) that +contradict the conditions of this License, they do not excuse you from the +conditions of this License. If you cannot distribute so as to satisfy +simultaneously your obligations under this License and any other pertinent +obligations, then as a consequence you may not distribute the Program at all. +For example, if a patent license would not permit royalty-free redistribution +of the Program by all those who receive copies directly or indirectly through +you, then the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply and +the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or +other property right claims or to contest validity of any such claims; this +section has the sole purpose of protecting the integrity of the free software +distribution system, which is implemented by public license practices. Many +people have made generous contributions to the wide range of software +distributed through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing to +distribute software through any other system and a licensee cannot impose +that choice. + +This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain +countries either by patents or by copyrighted interfaces, the original copyright +holder who places the Program under this License may add an explicit +geographical distribution limitation excluding those countries, so that +distribution is permitted only in or among countries not thus excluded. In such +case, this License incorporates the limitation as if written in the body of this +License. + +9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will be +similar in spirit to the present version, but may differ in detail to address new +problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies +a version number of this License which applies to it and "any later version", +you have the option of following the terms and conditions either of that +version or of any later version published by the Free Software Foundation. If +the Program does not specify a version number of this License, you may +choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs +whose distribution conditions are different, write to the author to ask for +permission. For software which is copyrighted by the Free Software +Foundation, write to the Free Software Foundation; we sometimes make +exceptions for this. Our decision will be guided by the two goals of +preserving the free status of all derivatives of our free software and of +promoting the sharing and reuse of software generally. + + NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT +PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE +STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT +WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL +NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR +AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR +ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE +LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, +SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OR INABILITY TO USE THE +PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA +OR DATA BEING RENDERED INACCURATE OR LOSSES +SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE +PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN +IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF +THE POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/sites/all/modules/ux_elements/css/horizontal_tab.css b/sites/all/modules/ux_elements/css/horizontal_tab.css new file mode 100644 index 0000000000000000000000000000000000000000..47b1bcb99334b721e7640d48dc4e44b58f76dbf4 --- /dev/null +++ b/sites/all/modules/ux_elements/css/horizontal_tab.css @@ -0,0 +1,54 @@ +/* $Id: horizontal_tab.css,v 1.1 2010/12/21 15:19:26 jameselliott Exp $ */ + +.horizontal-tabs-processed .horizontal-tabs-pane { + clear: both; + margin-top: 0; + padding: 0; +} + +.horizontal-tabs-processed .horizontal-tabs-pane > legend { + display: none; +} + +.horizontal-tabs .horizontal-tabs-list { + margin: 0; +} + +.horizontal-tab-button { + list-style: none; +} + +.horizontal-tab-button { + float: left; /* LTR */ + margin-right: 4px; /* LTR */ + position: relative; + top: 1px; + z-index: 0; +} + +.horizontal-tab-button.last { + margin-right: 0; +} + +.horizontal-tab-button a { + background: #efefef; + border: 1px solid #d5d5d5; + border-bottom-color: #ccc; + display: inline-block; + padding: 1px 5px 3px; + color: #000; +} + +.horizontal-tab-button a:hover { + background: #d5d5d5; + text-decoration: none; +} + +.horizontal-tab-button.selected a, +.horizontal-tab-button.selected a:active { + background: #fff; + border: 1px solid #ccc; + border-bottom-color: #fff; + outline: none; + z-index: 1; +} diff --git a/sites/all/modules/ux_elements/css/vertical_accordion.css b/sites/all/modules/ux_elements/css/vertical_accordion.css new file mode 100644 index 0000000000000000000000000000000000000000..861bbea9ae664818dd6117826384a01b9e481e9a --- /dev/null +++ b/sites/all/modules/ux_elements/css/vertical_accordion.css @@ -0,0 +1,105 @@ +/* $Id: vertical_accordion.css,v 1.1 2010/12/21 15:19:26 jameselliott Exp $ */ + +/* @group Pane header */ + +.vertical-accordion .pane-header { + background: repeat scroll 0 0 #dfdfdf; + background: + -moz-linear-gradient( + -90deg, + #fcfcfc 0pt, + #e3e3e1 100%) + repeat scroll 0 0 #d8d8d8; + background: + -webkit-gradient( + linear, + left top, + left bottom, + color-stop(0.0, rgba(252, 252, 252, 1.0)), + color-stop(1.0, rgba(227, 227, 225, 1.0)) + ); + display: block; + filter: progid:DXImageTransform.Microsoft.gradient( + GradientType='0', + startColorstr=#fcfcfc, + endColorstr=#e3e3e1); + font-size: 0.9231em; + line-height: 1; + margin-top: 0; + padding: 6px 3px 5px 11px; + text-transform: none; +} + +.vertical-accordion .pane-header:hover { + background: repeat scroll 0 0 #d9d9d9; + background: + -moz-linear-gradient( + -90deg, + #f6f6f6 0pt, + #d6d6d4 100%) + repeat scroll 0 0 #d8d8d8; + background: + -webkit-gradient( + linear, + left top, + left bottom, + color-stop(0.0, rgba(246, 246, 246, 1.0)), + color-stop(1.0, rgba(214, 214, 212, 1.0)) + ); + filter: progid:DXImageTransform.Microsoft.gradient( + GradientType='0', + startColorstr=#f6f6f6, + endColorstr=#d6d6d4); + text-decoration: none; +} + +.vertical-accordion .pane-header ~ .pane-header { + border-top-width: 0; +} + +.vertical-accordion .pane-header .ui-icon { + color: inherit; + display: none; + background: none; + /* CSS triangle */ + border-bottom: none; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid; + height: 0; + left: 11px; + margin-top: 0; + top: 45%; + width: 0; +} + +.vertical-accordion .pane-header.ui-state-active { + font-weight: normal; + padding-left: 24px; +} + +.vertical-accordion .pane-header.ui-state-active .ui-icon { + display: block; +} + +/* @end */ + +/* @group Pane content */ + +.vertical-accordion .ui-accordion-content { + margin: 0; + padding: 0 11px; + top: auto; +} + +.vertical-accordion .ui-accordion-content > :first-child { + margin-top: 10px; + padding-top: 0; +} + +.vertical-accordion .ui-accordion-content > :last-child { + margin-bottom: 10px; + padding-bottom: 0; +} + +/* @end */ diff --git a/sites/all/modules/ux_elements/js/horizontal_tab.js b/sites/all/modules/ux_elements/js/horizontal_tab.js new file mode 100644 index 0000000000000000000000000000000000000000..8ea486265053bbb510ab53f1b26b8ebacb5489da --- /dev/null +++ b/sites/all/modules/ux_elements/js/horizontal_tab.js @@ -0,0 +1,156 @@ +// $Id: horizontal_tab.js,v 1.1 2010/12/21 15:19:26 jameselliott Exp $ + +(function ($) { + +/** + * Copy of the functionality of vertical tabs in Drupal 7 core + */ +Drupal.behaviors.horizontalTabs = { + attach: function (context) { + $('.horizontal-tabs-panes', context).once('horizontal-tabs', function () { + var focusID = $(':hidden.horizontal-tabs-active-tab', this).val(); + var tab_focus; + + // Check if there are some fieldsets that can be converted to horizontal-tabs + var $fieldsets = $('> fieldset', this); + if ($fieldsets.length == 0) { + return; + } + + // Create the tab column. + var tab_list = $('<ul class="horizontal-tabs-list"></ul>'); + $(this).wrap('<div class="horizontal-tabs clearfix"></div>').before(tab_list); + + // Transform each fieldset into a tab. + $fieldsets.each(function () { + var horizontal_tab = new Drupal.horizontalTab({ + title: $('> legend', this).text(), + fieldset: $(this) + }); + tab_list.append(horizontal_tab.item); + $(this) + .removeClass('collapsible collapsed') + .addClass('horizontal-tabs-pane') + .data('horizontalTab', horizontal_tab); + if (this.id == focusID) { + tab_focus = $(this); + } + }); + + $('> li:first', tab_list).addClass('first'); + $('> li:last', tab_list).addClass('last'); + + if (!tab_focus) { + // If the current URL has a fragment and one of the tabs contains an + // element that matches the URL fragment, activate that tab. + if (window.location.hash && $(window.location.hash, this).length) { + tab_focus = $(window.location.hash, this).closest('.horizontal-tabs-\n\ +\n\ +pane'); + } + else { + tab_focus = $('> .horizontal-tabs-pane:first', this); + } + } + if (tab_focus.length) { + tab_focus.data('horizontalTab').focus(); + } + + // Set a min width so the tabs won't float below + var minWidth = 0; + $('> li', tab_list).each(function () { + var outer = $(this).outerWidth(true); + minWidth = minWidth + outer; + }); + $(this).parent().css('min-width', minWidth); + + }); + } +}; + +/** + * The horizontal tab object represents a single tab within a tab group. + * + * @param settings + * An object with the following keys: + * - title: The name of the tab. + * - fieldset: The jQuery object of the fieldset that is the tab pane. + */ +Drupal.horizontalTab = function (settings) { + var self = this; + $.extend(this, settings, Drupal.theme('horizontalTab', settings)); + + this.link.click(function () { + self.focus(); + return false; + }); + + // Keyboard events added: + // Pressing the Enter key will open the tab pane. + this.link.keydown(function(event) { + if (event.keyCode == 13) { + self.focus(); + // Set focus on the first input field of the visible fieldset/tab pane. + $("fieldset.horizontal-tabs-pane :input:visible:enabled:first").focus(); + return false; + } + }); + + // Pressing the Enter key lets you leave the tab again. + this.fieldset.keydown(function(event) { + // Enter key should not trigger inside <textarea> to allow for multi-line entries. + if (event.keyCode == 13 && event.target.nodeName != "TEXTAREA") { + // Set focus on the selected tab button again. + $(".horizontal-tab-button.selected a").focus(); + return false; + } + }); +}; + +Drupal.horizontalTab.prototype = { + /** + * Displays the tab's content pane. + */ + focus: function () { + this.fieldset + .siblings('fieldset.horizontal-tabs-pane') + .each(function () { + var tab = $(this).data('horizontalTab'); + tab.fieldset.hide(); + tab.item.removeClass('selected'); + }) + .end() + .show() + .siblings(':hidden.horizontal-tabs-active-tab') + .val(this.fieldset.attr('id')); + + this.item.addClass('selected'); + // Mark the active tab for screen readers. + $('#active-horizontal-tab').remove(); + this.link.append('<span id="active-horizontal-tab" class="element-invisible">' + Drupal.t('(active tab)') + '</span>'); + $(this.fieldset).trigger('horizontalTabActivate', this); + } +}; + +/** + * Theme function for a horizontal tab. + * + * @param settings + * An object with the following keys: + * - title: The name of the tab. + * @return + * This function has to return an object with at least these keys: + * - item: The root tab jQuery element + * - link: The anchor tag that acts as the clickable area of the tab + * (jQuery version) + */ +Drupal.theme.prototype.horizontalTab = function (settings) { + var tab = {}; + tab.item = $('<li class="horizontal-tab-button" tabindex="-1"></li>') + .append(tab.link = $('<a href="#"></a>') + .append(tab.title = $('<span></span>').text(settings.title)) + ); + return tab; +}; + +})(jQuery); diff --git a/sites/all/modules/ux_elements/js/vertical_accordion.js b/sites/all/modules/ux_elements/js/vertical_accordion.js new file mode 100644 index 0000000000000000000000000000000000000000..ceb69cc5a14da453c426cdc0ab7704e227affecb --- /dev/null +++ b/sites/all/modules/ux_elements/js/vertical_accordion.js @@ -0,0 +1,20 @@ +// $Id: vertical_accordion.js,v 1.2 2010/12/21 15:54:27 jameselliott Exp $ + +(function ($) { + +/** + * Call jQuery Accordion on vertical_accordion elements + */ +Drupal.behaviors.verticalAccordion = { + attach: function (context) { + $('.vertical-accordion', context).once('vertical-accordion', function(){ + $(this).accordion({ + header: '.pane-header', + clearStyle: true, + autoHeight: false + }); + }); + } +}; + +})(jQuery); diff --git a/sites/all/modules/ux_elements/ux_elements.info b/sites/all/modules/ux_elements/ux_elements.info new file mode 100644 index 0000000000000000000000000000000000000000..f3da328a7cf2e833fdf707de3e5979b03bec5d3f --- /dev/null +++ b/sites/all/modules/ux_elements/ux_elements.info @@ -0,0 +1,12 @@ +; $Id: ux_elements.info,v 1.2 2010/12/21 15:43:30 jameselliott Exp $ +name = UX Elements +description = Adds more element types to those provided by Drupal core +core = 7.x +files[] = ux_elements.module + +; Information added by drupal.org packaging script on January 1, 1970 - 00:00 +version = "7.x-1.0-beta1" +core = "7.x" +project = "ux_elements" +datestamp = "1296665600" + diff --git a/sites/all/modules/ux_elements/ux_elements.module b/sites/all/modules/ux_elements/ux_elements.module new file mode 100644 index 0000000000000000000000000000000000000000..b61c821a0e0adb465786716f8fc659b58ac247d9 --- /dev/null +++ b/sites/all/modules/ux_elements/ux_elements.module @@ -0,0 +1,137 @@ +<?php +// $Id: ux_elements.module,v 1.2 2010/12/21 15:43:30 jameselliott Exp $ + +/** + * @file: Module for adding horizontal_tabs and vertical_accordion element types + */ + +/* + * Implements hook_element_info(). + */ +function ux_elements_element_info() { + $types = array(); + $types['horizontal_tabs'] = array( + '#theme_wrappers' => array('horizontal_tabs'), + '#default_tab' => '', + '#pre_render' => array('form_pre_render_fieldset'), + '#process' => array('form_process_horizontal_tabs'), + ); + $types['vertical_accordion'] = array( + '#theme_wrappers' => array('vertical_accordion', 'fieldset'), + '#pre_render' => array('form_pre_render_fieldset', 'form_pre_render_vertical_accordion'), + '#process' => array('form_process_fieldset'), + ); + + return $types; +} + +/* + * Implements hook_theme(). + */ +function ux_elements_theme() { + return array( + 'horizontal_tabs' => array( + 'render element' => 'element', + ), + 'vertical_accordion' => array( + 'render element' => 'element', + ), + 'vertical_accordion_pane' => array( + 'render element' => 'element', + ), + ); +} + +/** + * Creates a group formatted as horizontal tabs. + * + * @param $element + * An associative array containing the properties and children of the + * fieldset. + * @param $form_state + * The $form_state array for the form this vertical tab widget belongs to. + * @return + * The processed element. + */ +function form_process_horizontal_tabs($element, &$form_state) { + // Inject a new fieldset as child, so that form_process_fieldset() processes + // this fieldset like any other fieldset. + $element['group'] = array( + '#type' => 'fieldset', + '#theme_wrappers' => array(), + '#parents' => $element['#parents'], + ); + + // Add JS and CSS necessary for the horizontal tabs + $element['#attached']['js'][] = drupal_get_path('module', 'ux_elements') . '/js/horizontal_tab.js'; + $element['#attached']['css'][] = drupal_get_path('module', 'ux_elements') . '/css/horizontal_tab.css'; + + return $element; +} + +/** + * Returns HTML for an element's children fieldsets as horizontal tabs. + * + * @param $variables + */ +function theme_horizontal_tabs($variables) { + $element = $variables['element']; + + $output = '<h2 class="element-invisible">' . t('Horizontal Tabs') . '</h2>'; + $output .= '<div class="horizontal-tabs-panes">' . $element['#children'] . '</div>'; + return $output; +} + +/** + * Alters fieldset children of this element to have a specific theme wrapper + * + * @param $element + */ +function form_pre_render_vertical_accordion($element) { + // Add a special theme wrapper to the children of this element. + $children = element_children($element); + foreach($children as $key) { + if ($element[$key]['#type']) { + $element[$key]['#theme_wrappers'] = array('vertical_accordion_pane'); + } + } + + // Add JS and CSS necessary for the vertical accordion. + drupal_add_js(drupal_get_path('module', 'ux_elements') . '/js/vertical_accordion.js', array('group' => 'JS_DEFAULT', 'weight' => 50)); + drupal_add_css(drupal_get_path('module', 'ux_elements') . '/css/vertical_accordion.css'); + drupal_add_library('system', 'ui.accordion'); + + return $element; +} + +/** + * Returns HTML for an element's children fieldsets as a vertical accordion. + * + * @param $variables + */ +function theme_vertical_accordion($variables) { + $element = $variables['element']; + + $output = '<div class="vertical-accordion">' . $element['#children'] . '</div>'; + return $output; +} + +/** + * Returns HTML for a vertical accordion's children fieldsets as panes. + * + * @param $variables + */ +function theme_vertical_accordion_pane($variables) { + $element = $variables['element']; + + $output = '<a href="#" class="pane-header">' . $element['#title'] . '</a>'; + $output .= '<div class="pane form-wrapper">' . $element['#children']; + + if (isset($element['#value'])) { + $output .= $element['#value']; + } + + $output .= '</div>'; + + return $output; +} \ No newline at end of file