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