2 * Displays vertical multi-level list.
4 * To apply, add the attribute data-expandable="true" and id="parentid" to a <li> element for parent list item
5 * and add the arrribute data-expanded-by="parentid" to a <li> element for child list item.
8 * data-expandable: Parent list item must have 'true' value for this attribute
9 * data-expanded-by: Child list item expanded by parent list item must have 'true' value for this attribute
10 * data-initial-expansion: If you want expandable list to be expanded initially, set this value as 'true'
13 * <li data-expandable="true" id="exp1" data-initial-expansion="true">Parent</li>
14 * <li data-expanded-by="exp1">Child</li>
17 (function ($, undefined) {
19 $.widget("todons.expandablelist", $.mobile.widget, {
21 initSelector: ":jqmData(expandable='true')",
25 $(e).removeClass('ui-li-expand-transition-show')
26 .addClass('ui-li-expand-transition-hide');
29 $(e).removeClass('ui-li-expand-transition-hide')
30 .addClass('ui-li-expand-transition-show');
32 _hide_expand_img: function(e) {
33 $(e).removeClass('ui-li-expandable-hidden')
34 .addClass('ui-li-expandable-shown');
36 $(e).find( ".ui-li-expand-icon" )
37 .addClass( "ui-li-expanded-icon" )
38 .removeClass( "ui-li-expand-icon" );
40 _show_expand_img: function(e) {
41 $(e).removeClass('ui-li-expandable-shown')
42 .addClass('ui-li-expandable-hidden');
44 $(e).find( ".ui-li-expanded-icon" )
45 .addClass( "ui-li-expand-icon" )
46 .removeClass( "ui-li-expanded-icon" );
49 _set_expand_arrow: function(self, e, parent_is_expanded) {
50 if (parent_is_expanded) {
51 self._hide_expand_img(e);
53 self._show_expand_img(e);
55 if($(e[0]).data("expandable") && parent_is_expanded == false) {
56 var children = $(e).nextAll(":jqmData(expanded-by='"+$(e).attr('id')+"')");
57 children.each(function(idx, child) {
58 self._set_expand_arrow(self, child, e.is_expanded);
63 _toggle: function(self, e, parent_is_expanded) {
64 if (! parent_is_expanded) {
69 if($(e).data("expandable") && e.is_expanded == true) {
70 var children = $(e).nextAll(":jqmData(expanded-by='"+$(e).attr('id')+"')");
71 children.each(function(idx, child) {
72 self._toggle(self, child, e.is_expanded);
74 e.is_expanded = false;
78 _is_hidden: function(e) {
79 return ( $(e).height() == 0);
82 _create: function () {
84 var children = $(this.element).nextAll(":jqmData(expanded-by='"+$(this.element).attr('id')+"')");
85 if (children.length == 0) {
91 expanded = e.nextAll(":jqmData(expanded-by='" + e[0].id + "')"),
92 initial_expansion = e.data("initial-expansion");
95 if(initial_expansion == true ) {
96 var parent_id = e.data("expanded-by");
98 if($("#"+parent_id).is_expanded == true) is_expanded = true;
104 e[0].is_expanded = is_expanded;
105 if (e[0].is_expanded) {
106 self._hide_expand_img(e);
107 $(e).append("<div class='ui-li-expanded-icon'></div>");
109 self._show_expand_img(e);
110 $(e).append("<div class='ui-li-expand-icon'></div>");
113 if(e[0].is_expanded) expanded.each(function(i, e) { self._show(e); });
114 else expanded.each(function(i, e) { self._hide(e); });
116 expanded.addClass("ui-li-expanded");
118 e.bind('vclick', function() {
119 var _is_expanded = e[0].is_expanded;
120 expanded.each(function(i, e) { self._toggle(self, e, _is_expanded); });
121 e[0].is_expanded = ! e[0].is_expanded;
123 self._set_expand_arrow(self, e, e[0].is_expanded);
128 }); // end: $.widget()
131 $(document).bind("pagecreate create", function (e) {
132 $($.todons.expandablelist.prototype.options.initSelector, e.target)
133 .not(":jqmData(role='none'), :jqmData(role='nojs')")