framework7rails 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 463c0b0406e449aa16db0b35b57af51c60dfa00e
4
- data.tar.gz: 1aff97bb953bf9fb2f82392718f87f787a8101c2
3
+ metadata.gz: df30f6365c2f4f5fd823e8d41efd6045d83d6f16
4
+ data.tar.gz: f5a0bda553bb7606e16aa124fea514ff169088d0
5
5
  SHA512:
6
- metadata.gz: 6ede6087d6c1c6da14476c6853b52c4eaa59470066eea2f265b99abcda08b0192daaaf7ca81260807315ba2882eb74518569a17f4fbcaa1629136649efc2335d
7
- data.tar.gz: 34c5a82ae5aa18702235d1631feb506ee57386150b24130319bada89f04423d040d9e7d86ee3dbd06486bf12823e355244fb49984b1a74f8c878106efd64b9e4
6
+ metadata.gz: eee72257dae1507fba7e6b6402a93dad725c7642cbc9ba2cb258a4874945933d81fb9ba355f686aa8640e85845341db4f1982973603af4bee1804f436bd32a77
7
+ data.tar.gz: 0b58c94a767c2d8afbcac0a8c858c64f09b46beb9e63df1f0da381f250f1f3c020d7533862daf2319918adf9a2a2cd130861d21bedd6bafc6cfafcca9fba75bb
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- ## Current Version (0.9.7)
1
+ ## Current Version (0.10.0)
2
2
 
3
3
  Although there exists a gem for f7 already, but I found it complicated and it was really out of date. I try to keep it updated from https://github.com/nolimits4web/Framework7/releases but you can also do it yourself by running ``./update_from_vendor``
4
4
 
@@ -1,4 +1,4 @@
1
1
  module Framework7rails
2
- # framework7 version 0.9.8
3
- VERSION = "2.0.0"
2
+ # framework7 version 0.10.0
3
+ VERSION = "3.0.0"
4
4
  end
@@ -3,7 +3,7 @@
3
3
  if ARGV[0]
4
4
  VERSION_FRAMEWORK7 = ARGV[0]
5
5
  else
6
- VERSION_FRAMEWORK7 = "0.9.8"
6
+ VERSION_FRAMEWORK7 = "0.10.0"
7
7
  end
8
8
 
9
9
  puts "Updating Framework Version #{VERSION_FRAMEWORK7}"
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Framework7 0.9.7
2
+ * Framework7 0.10.0
3
3
  * Full Featured HTML Framework For Building iOS 7 Apps
4
4
  *
5
5
  * http://www.idangero.us/framework7
@@ -10,7 +10,7 @@
10
10
  *
11
11
  * Licensed under MIT
12
12
  *
13
- * Released on: November 2, 2014
13
+ * Released on: December 8, 2014
14
14
  */
15
15
  (function () {
16
16
 
@@ -24,7 +24,7 @@
24
24
  var app = this;
25
25
 
26
26
  // Version
27
- app.version = '0.9.8';
27
+ app.version = '0.10.0';
28
28
 
29
29
  // Default Parameters
30
30
  app.params = {
@@ -36,6 +36,7 @@
36
36
  uniqueHistory: false,
37
37
  uniqueHistoryIgnoreGetParameters: false,
38
38
  dynamicPageUrl: 'content-{{index}}',
39
+ allowDuplicateUrls: false,
39
40
  router: true,
40
41
  // Push State
41
42
  pushState: false,
@@ -86,6 +87,7 @@
86
87
  swipePanel: false, // or 'left' or 'right'
87
88
  swipePanelActiveArea: 0,
88
89
  swipePanelCloseOpposite: true,
90
+ swipePanelOnlyClose: false,
89
91
  swipePanelNoFollow: false,
90
92
  swipePanelThreshold: 0,
91
93
  panelsCloseByOutside: true,
@@ -163,6 +165,7 @@
163
165
  reloadPages: false,
164
166
  uniqueHistory: app.params.uniqueHistory,
165
167
  uniqueHistoryIgnoreGetParameters: app.params.uniqueHistoryIgnoreGetParameters,
168
+ allowDuplicateUrls: app.params.allowDuplicateUrls,
166
169
  swipeBackPage: app.params.swipeBackPage,
167
170
  swipeBackPageAnimateShadow: app.params.swipeBackPageAnimateShadow,
168
171
  swipeBackPageAnimateOpacity: app.params.swipeBackPageAnimateOpacity,
@@ -716,7 +719,7 @@
716
719
  leftWidth = noLeft ? 0 : left.outerWidth(true),
717
720
  rightWidth = noRight ? 0 : right.outerWidth(true),
718
721
  centerWidth = center.outerWidth(true),
719
- navbarWidth = n.width(),
722
+ navbarWidth = n[0].offsetWidth - parseInt(n.css('padding-left'), 10) - parseInt(n.css('padding-right'), 10),
720
723
  onLeft = n.hasClass('navbar-on-left'),
721
724
  currLeft, diff;
722
725
 
@@ -926,7 +929,10 @@
926
929
  attachEvents();
927
930
 
928
931
  // Search
932
+ var previousQuery;
929
933
  function search(query) {
934
+ if (query.trim() === previousQuery) return;
935
+ previousQuery = query.trim();
930
936
  var values = query.trim().toLowerCase().split(' ');
931
937
  var foundItems = [];
932
938
  if (isVirtualList) {
@@ -1981,7 +1987,7 @@
1981
1987
  if (view.params.reloadPages === true) options.reload = true;
1982
1988
 
1983
1989
  if (!view.allowPageChange) return false;
1984
- if (url && view.url === url && !options.reload) return false;
1990
+ if (url && view.url === url && !options.reload && !view.params.allowDuplicateUrls) return false;
1985
1991
  view.allowPageChange = false;
1986
1992
  if (app.xhr && view.xhr && view.xhr === app.xhr) {
1987
1993
  app.xhr.abort();
@@ -2127,21 +2133,21 @@
2127
2133
  navbarInners = viewContainer.find('.navbar-inner:not(.cached)');
2128
2134
  newNavbarInner.addClass('navbar-on-left').removeClass('cached');
2129
2135
  }
2130
-
2131
2136
  // Remove/hide previous page in force mode
2132
2137
  if (force) {
2133
2138
  var pageToRemove, navbarToRemove;
2134
2139
  pageToRemove = $(pagesInView[pagesInView.length - 2]);
2135
- if (dynamicNavbar) navbarToRemove = $(pageToRemove[0].f7RelatedNavbar || navbarInners[navbarInners.length - 2]);
2140
+
2141
+ if (dynamicNavbar) navbarToRemove = $(pageToRemove[0] && pageToRemove[0].f7RelatedNavbar || navbarInners[navbarInners.length - 2]);
2136
2142
  if (view.params.domCache && view.initialPages.indexOf(pageToRemove[0]) >= 0) {
2137
- pageToRemove.addClass('cached');
2138
- if (dynamicNavbar) {
2143
+ if (pageToRemove.length && pageToRemove[0] !== newPage[0]) pageToRemove.addClass('cached');
2144
+ if (dynamicNavbar && navbarToRemove.length && navbarToRemove[0] !== newNavbarInner[0]) {
2139
2145
  navbarToRemove.addClass('cached');
2140
2146
  }
2141
2147
  }
2142
2148
  else {
2143
- pageToRemove.remove();
2144
- if (dynamicNavbar) {
2149
+ if (pageToRemove.length) pageToRemove.remove();
2150
+ if (dynamicNavbar && navbarToRemove.length) {
2145
2151
  navbarToRemove.remove();
2146
2152
  }
2147
2153
  }
@@ -2153,14 +2159,33 @@
2153
2159
  view.history = view.history.slice(0, view.history.indexOf(url) + 2);
2154
2160
  }
2155
2161
  else {
2156
- view.history[view.history.length - 2] = url;
2162
+ if (view.history[[view.history.length - 2]]) {
2163
+ view.history[view.history.length - 2] = url;
2164
+ }
2165
+ else {
2166
+ view.history.unshift(url);
2167
+ }
2157
2168
  }
2158
2169
  }
2159
2170
 
2160
2171
  oldPage = $(pagesInView[pagesInView.length - 1]);
2172
+ if (view.params.domCache) {
2173
+ if (oldPage[0] === newPage[0]) {
2174
+ oldPage = pagesContainer.children('.page.page-on-center');
2175
+ if (oldPage.length === 0 && view.activePage) oldPage = $(view.activePage.container);
2176
+ }
2177
+ }
2161
2178
 
2162
2179
  if (dynamicNavbar && !oldNavbarInner) {
2163
2180
  oldNavbarInner = $(navbarInners[navbarInners.length - 1]);
2181
+ if (view.params.domCache) {
2182
+ if (oldNavbarInner[0] === newNavbarInner[0]) {
2183
+ oldNavbarInner = navbar.children('.navbar-inner.navbar-on-center:not(.cached)');
2184
+ }
2185
+ if (oldNavbarInner.length === 0) {
2186
+ oldNavbarInner = navbar.children('.navbar-inner[data-page="'+oldPage.attr('data-page')+'"]');
2187
+ }
2188
+ }
2164
2189
  if (oldNavbarInner.length === 0 || newNavbarInner[0] === oldNavbarInner[0]) dynamicNavbar = false;
2165
2190
  }
2166
2191
 
@@ -2236,8 +2261,11 @@
2236
2261
 
2237
2262
  if (!force) {
2238
2263
  // Go back when there is no pages on left
2239
- view.url = view.history[view.history.length - 2];
2240
- url = view.url;
2264
+ if (!preloadOnly) {
2265
+ view.url = view.history[view.history.length - 2];
2266
+ url = view.url;
2267
+ }
2268
+
2241
2269
  if (content) {
2242
2270
  parseNewPage();
2243
2271
  setPages();
@@ -2311,7 +2339,6 @@
2311
2339
  app.router._back(view, options);
2312
2340
  });
2313
2341
  }
2314
-
2315
2342
  if (pagesInView.length > 1 && !force) {
2316
2343
  // Simple go back to previos page in view
2317
2344
  app.router._back(view, options);
@@ -2332,7 +2359,7 @@
2332
2359
  proceed();
2333
2360
  return;
2334
2361
  }
2335
- else if (url.indexOf('#') < 0) {
2362
+ else if (url.indexOf('#') !== 0) {
2336
2363
  // Load ajax page
2337
2364
  app.get(options.url, view, options.ignoreCache, function (content, error) {
2338
2365
  if (error) {
@@ -2438,8 +2465,8 @@
2438
2465
  if (newNavbar) {
2439
2466
  previousNavbar = $(view.container).find('.navbar-inner[data-page="' + view.pagesCache[preloadUrl] + '"]');
2440
2467
  previousNavbar.insertBefore(newNavbar);
2468
+ if(!previousNavbar || previousNavbar.length === 0) previousNavbar = newNavbar.prev('.navbar-inner.cached');
2441
2469
  }
2442
- if(!previousNavbar || previousNavbar.length === 0) previousNavbar = newNavbar.prev('.navbar-inner.cached');
2443
2470
  }
2444
2471
  else {
2445
2472
  // Just load previous page
@@ -2476,7 +2503,8 @@
2476
2503
  var textHTML = params.text ? '<div class="modal-text">' + params.text + '</div>' : '';
2477
2504
  var afterTextHTML = params.afterText ? params.afterText : '';
2478
2505
  var noButtons = !params.buttons || params.buttons.length === 0 ? 'modal-no-buttons' : '';
2479
- modalHTML = '<div class="modal ' + noButtons + '"><div class="modal-inner">' + (titleHTML + textHTML + afterTextHTML) + '</div><div class="modal-buttons">' + buttonsHTML + '</div></div>';
2506
+ var verticalButtons = params.verticalButtons ? 'modal-buttons-vertical' : '';
2507
+ modalHTML = '<div class="modal ' + noButtons + '"><div class="modal-inner">' + (titleHTML + textHTML + afterTextHTML) + '</div><div class="modal-buttons ' + verticalButtons + '">' + buttonsHTML + '</div></div>';
2480
2508
  }
2481
2509
 
2482
2510
  _modalTemplateTempDiv.innerHTML = modalHTML;
@@ -2717,7 +2745,7 @@
2717
2745
  if (typeof removeOnClose === 'undefined') removeOnClose = true;
2718
2746
  if (typeof modal === 'string' && modal.indexOf('<') >= 0) {
2719
2747
  var _modal = document.createElement('div');
2720
- _modal.innerHTML = $.trim(modal);
2748
+ _modal.innerHTML = modal.trim();
2721
2749
  if (_modal.childNodes.length > 0) {
2722
2750
  modal = _modal.childNodes[0];
2723
2751
  if (removeOnClose) modal.classList.add('remove-on-close');
@@ -2831,7 +2859,7 @@
2831
2859
  if (typeof removeOnClose === 'undefined') removeOnClose = true;
2832
2860
  if (typeof modal === 'string' && modal.indexOf('<') >= 0) {
2833
2861
  var _modal = document.createElement('div');
2834
- _modal.innerHTML = $.trim(modal);
2862
+ _modal.innerHTML = modal.trim();
2835
2863
  if (_modal.childNodes.length > 0) {
2836
2864
  modal = _modal.childNodes[0];
2837
2865
  if (removeOnClose) modal.classList.add('remove-on-close');
@@ -3007,23 +3035,32 @@
3007
3035
  ************ Swipe panels ************
3008
3036
  ======================================================*/
3009
3037
  app.initSwipePanels = function () {
3010
- var panel = $('.panel.panel-' + app.params.swipePanel);
3011
- if (panel.length === 0) return;
3012
-
3038
+ var panel, side;
3039
+ if (app.params.swipePanel) {
3040
+ panel = $('.panel.panel-' + app.params.swipePanel);
3041
+ side = app.params.swipePanel;
3042
+ if (panel.length === 0) return;
3043
+ }
3044
+ else {
3045
+ if (app.params.swipePanelOnlyClose) {
3046
+ if ($('.panel').length === 0) return;
3047
+ }
3048
+ else return;
3049
+ }
3050
+
3013
3051
  var panelOverlay = $('.panel-overlay');
3014
- var isTouched, isMoved, isScrolling, touchesStart = {}, touchStartTime, touchesDiff, translate, opened, panelWidth, effect, direction, side;
3052
+ var isTouched, isMoved, isScrolling, touchesStart = {}, touchStartTime, touchesDiff, translate, opened, panelWidth, effect, direction;
3015
3053
  var views = $('.' + app.params.viewsClass);
3016
- side = app.params.swipePanel;
3017
3054
 
3018
3055
  function handleTouchStart(e) {
3019
- if (!app.allowPanelOpen || !app.params.swipePanel || isTouched) return;
3056
+ if (!app.allowPanelOpen || (!app.params.swipePanel && !app.params.swipePanelOnlyClose) || isTouched) return;
3020
3057
  if ($('.modal-in, .photo-browser-in').length > 0) return;
3021
- if (!app.params.swipePanelCloseOpposite) {
3058
+ if (!(app.params.swipePanelCloseOpposite || app.params.swipePanelOnlyClose)) {
3022
3059
  if ($('.panel.active').length > 0 && !panel.hasClass('active')) return;
3023
3060
  }
3024
3061
  touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
3025
3062
  touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
3026
- if (app.params.swipePanelCloseOpposite) {
3063
+ if (app.params.swipePanelCloseOpposite || app.params.swipePanelOnlyClose) {
3027
3064
  if ($('.panel.active').length > 0) {
3028
3065
  side = $('.panel.active').hasClass('panel-left') ? 'left' : 'right';
3029
3066
  }
@@ -3032,7 +3069,8 @@
3032
3069
  }
3033
3070
  }
3034
3071
  panel = $('.panel.panel-' + side);
3035
- if (app.params.swipePanelActiveArea) {
3072
+ opened = panel.hasClass('active');
3073
+ if (app.params.swipePanelActiveArea && !opened) {
3036
3074
  if (side === 'left') {
3037
3075
  if (touchesStart.x > app.params.swipePanelActiveArea) return;
3038
3076
  }
@@ -3102,10 +3140,11 @@
3102
3140
 
3103
3141
  if (!isMoved) {
3104
3142
  effect = panel.hasClass('panel-cover') ? 'cover' : 'reveal';
3105
- panel.show();
3106
- panelOverlay.show();
3107
- opened = panel.hasClass('active');
3108
- panelWidth = panel.width();
3143
+ if (!opened) {
3144
+ panel.show();
3145
+ panelOverlay.show();
3146
+ }
3147
+ panelWidth = panel[0].offsetWidth;
3109
3148
  panel.transition(0);
3110
3149
  if (panel.find('.' + app.params.viewClass).length > 0) {
3111
3150
  if (app.sizeNavbars) app.sizeNavbars(panel.find('.' + app.params.viewClass)[0]);
@@ -3241,8 +3280,8 @@
3241
3280
  var messages = page.find('.messages');
3242
3281
  if (messages.length === 0) return;
3243
3282
  var pageContent = page.find('.page-content');
3244
- if (!messages.hasClass('new-messages-first')) pageContent[0].scrollTop = messages.height() - pageContent.height();
3245
3283
  if (messages.hasClass('messages-auto-layout')) app.updateMessagesLayout(messages);
3284
+ if (!messages.hasClass('new-messages-first')) pageContent[0].scrollTop = pageContent[0].scrollHeight - pageContent[0].offsetHeight;
3246
3285
  };
3247
3286
  app.addMessage = function (props) {
3248
3287
  props = props || {};
@@ -3326,7 +3365,7 @@
3326
3365
  var messages = messagesContent.find('.messages');
3327
3366
  var newOnTop = messages.hasClass('new-messages-first');
3328
3367
  var currentScroll = messagesContent[0].scrollTop;
3329
- var newScroll = newOnTop ? 0 : messages.height() - messagesContent.height();
3368
+ var newScroll = newOnTop ? 0 : messagesContent[0].scrollHeight - messagesContent[0].offsetHeight;
3330
3369
  if (newScroll === currentScroll) return;
3331
3370
  messagesContent.scrollTop(newScroll, 300);
3332
3371
  };
@@ -3345,7 +3384,7 @@
3345
3384
  app.swipeoutOpenedEl.is(target[0]) ||
3346
3385
  target.parents('.swipeout').is(app.swipeoutOpenedEl) ||
3347
3386
  target.hasClass('modal-in') ||
3348
- target.parents('.modal-in').length > 0 ||
3387
+ target.parents('.modal.modal-in').length > 0 ||
3349
3388
  target.hasClass('modal-overlay')
3350
3389
  )) {
3351
3390
  app.swipeoutClose(app.swipeoutOpenedEl);
@@ -3385,12 +3424,12 @@
3385
3424
  noFoldLeft = actionsLeft.hasClass('swipeout-actions-no-fold') || app.params.swipeoutActionsNoFold;
3386
3425
  noFoldRight = actionsRight.hasClass('swipeout-actions-no-fold') || app.params.swipeoutActionsNoFold;
3387
3426
  if (actionsLeft.length > 0) {
3388
- actionsLeftWidth = actionsLeft.width();
3427
+ actionsLeftWidth = actionsLeft.outerWidth();
3389
3428
  buttonsLeft = actionsLeft.children('a');
3390
3429
  overswipeLeftButton = actionsLeft.find('.swipeout-overswipe');
3391
3430
  }
3392
3431
  if (actionsRight.length > 0) {
3393
- actionsRightWidth = actionsRight.width();
3432
+ actionsRightWidth = actionsRight.outerWidth();
3394
3433
  buttonsRight = actionsRight.children('a');
3395
3434
  overswipeRightButton = actionsRight.find('.swipeout-overswipe');
3396
3435
  }
@@ -3622,7 +3661,7 @@
3622
3661
  el.trigger('open').addClass('swipeout-opened').removeClass('transitioning');
3623
3662
  swipeOutActions.addClass('swipeout-actions-opened');
3624
3663
  var buttons = swipeOutActions.children('a');
3625
- var swipeOutActionsWidth = swipeOutActions.width();
3664
+ var swipeOutActionsWidth = swipeOutActions.outerWidth();
3626
3665
  var translate = dir === 'right' ? -swipeOutActionsWidth : swipeOutActionsWidth;
3627
3666
  var i;
3628
3667
  if (buttons.length > 1) {
@@ -3653,7 +3692,7 @@
3653
3692
  var swipeOutActions = el.find('.swipeout-actions-opened').removeClass('swipeout-actions-opened');
3654
3693
  var noFold = swipeOutActions.hasClass('swipeout-actions-no-fold') || app.params.swipeoutActionsNoFold;
3655
3694
  var buttons = swipeOutActions.children('a');
3656
- var swipeOutActionsWidth = swipeOutActions.width();
3695
+ var swipeOutActionsWidth = swipeOutActions.outerWidth();
3657
3696
  app.allowSwipeout = false;
3658
3697
  el.trigger('close');
3659
3698
  el.removeClass('swipeout-opened').addClass('transitioning');
@@ -3737,7 +3776,7 @@
3737
3776
  sortingItems = sortingEl.parent().find('li');
3738
3777
  sortableContainer = sortingEl.parents('.sortable');
3739
3778
  e.preventDefault();
3740
- app.allowsPanelOpen = app.allowSwipeout = false;
3779
+ app.allowPanelOpen = app.allowSwipeout = false;
3741
3780
  }
3742
3781
  function handleTouchMove(e) {
3743
3782
  if (!isTouched || !sortingEl) return;
@@ -3785,7 +3824,7 @@
3785
3824
  });
3786
3825
  }
3787
3826
  function handleTouchEnd(e) {
3788
- app.allowsPanelOpen = app.allowSwipeout = true;
3827
+ app.allowPanelOpen = app.allowSwipeout = true;
3789
3828
  if (!isTouched || !isMoved) {
3790
3829
  isTouched = false;
3791
3830
  isMoved = false;
@@ -3871,27 +3910,7 @@
3871
3910
  view = view[0].f7View;
3872
3911
  if (!view) return;
3873
3912
 
3874
- // Collect all values
3875
- var select = smartSelect.find('select')[0];
3876
- var $select = $(select);
3877
- if (select.disabled || smartSelect.hasClass('disabled') || $select.hasClass('disabled')) {
3878
- return;
3879
- }
3880
- var values = {};
3881
- values.length = select.length;
3882
- var option;
3883
- for (var i = 0; i < select.length; i++) {
3884
- option = $(select[i]);
3885
- values[i] = {
3886
- value: select[i].value,
3887
- text: select[i].textContent.trim(),
3888
- selected: select[i].selected,
3889
- group: option.parent('optgroup')[0],
3890
- image: option.attr('data-option-image') || $select.attr('data-option-image'),
3891
- icon: option.attr('data-option-icon') || $select.attr('data-option-icon'),
3892
- disabled: select[i].disabled
3893
- };
3894
- }
3913
+ // Parameters
3895
3914
  var openIn = smartSelect.attr('data-open-in');
3896
3915
  if (!openIn) openIn = app.params.smartSelectInPopup ? 'popup' : 'page';
3897
3916
 
@@ -3901,61 +3920,110 @@
3901
3920
  var backOnSelect = smartSelect.attr('data-back-onselect') ? (smartSelect.attr('data-back-onselect') === 'true' ? true : false) : app.params.smartSelectBackOnSelect;
3902
3921
  var formTheme = smartSelect.attr('data-form-theme') || app.params.smartSelectFormTheme;
3903
3922
  var navbarTheme = smartSelect.attr('data-navbar-theme') || app.params.smartSelectNavbarTheme;
3923
+ var virtualList = smartSelect.attr('data-virtual-list') === 'true';
3924
+ var virtualListItemHeight = smartSelect.attr('data-virtual-list-height');
3904
3925
 
3905
- // Generate dynamic page layout
3926
+ // Collect all options/values
3927
+ var select = smartSelect.find('select')[0];
3928
+ var $select = $(select);
3929
+ if (select.disabled || smartSelect.hasClass('disabled') || $select.hasClass('disabled')) {
3930
+ return;
3931
+ }
3932
+ var values = [];
3906
3933
  var id = (new Date()).getTime();
3907
3934
  var inputType = select.multiple ? 'checkbox' : 'radio';
3908
3935
  var inputName = inputType + '-' + id;
3909
- var inputsHTML = '';
3910
- var previousGroup;
3911
- for (var j = 0; j < values.length; j++) {
3912
- if (values[j].disabled) continue;
3913
- var checked = values[j].selected ? 'checked' : '';
3914
- if (values[j].group) {
3915
- if (values[j].group !== previousGroup) {
3916
- inputsHTML += '<li class="item-divider">' + values[j].group.label + '</li>';
3917
- previousGroup = values[j].group;
3918
- }
3919
- }
3920
- var media = '';
3921
- if (inputType === 'checkbox') media += '<i class="icon icon-form-checkbox"></i>';
3922
- if (values[j].icon) media += '<i class="icon ' + values[j].icon + '"></i>';
3923
- if (values[j].image) media += '<img src="' + values[j].image + '">';
3924
- inputsHTML +=
3936
+ var option, optionHasMedia, optionImage, optionIcon, optionGroup, optionGroupLabel, optionPreviousGroup, optionShowGroupLabel, previousGroup;
3937
+ for (var i = 0; i < select.length; i++) {
3938
+ option = $(select[i]);
3939
+ if (option[0].disabled) continue;
3940
+ optionImage = option.attr('data-option-image') || $select.attr('data-option-image');
3941
+ optionIcon = option.attr('data-option-icon') || $select.attr('data-option-icon');
3942
+ optionHasMedia = optionImage || optionIcon || inputType === 'checkbox';
3943
+ optionGroup = option.parent('optgroup')[0];
3944
+ optionGroupLabel = optionGroup && optionGroup.label;
3945
+ optionShowGroupLabel = false;
3946
+ if (optionGroup) {
3947
+ if (optionGroup !== previousGroup) {
3948
+ optionShowGroupLabel = true;
3949
+ previousGroup = optionGroup;
3950
+ }
3951
+ }
3952
+ values.push({
3953
+ value: option[0].value,
3954
+ text: option[0].textContent.trim(),
3955
+ selected: option[0].selected,
3956
+ group: optionGroup,
3957
+ groupLabel: optionGroupLabel,
3958
+ showGroupLabel: optionShowGroupLabel,
3959
+ image: optionImage,
3960
+ icon: optionIcon,
3961
+ disabled: option[0].disabled,
3962
+ inputType: inputType,
3963
+ id: id,
3964
+ hasMedia: optionHasMedia,
3965
+ checkbox: inputType === 'checkbox',
3966
+ inputName: inputName,
3967
+ test: this
3968
+ });
3969
+ }
3970
+
3971
+
3972
+ // Item template/HTML
3973
+ if (!app._compiledTemplates.smartSelectItem) {
3974
+ app._compiledTemplates.smartSelectItem = t7.compile(app.params.smartSelectItemTemplate ||
3975
+ '{{#if showGroupLabel}}' +
3976
+ '<li class="item-divider">{{groupLabel}}</li>' +
3977
+ '{{/if}}' +
3925
3978
  '<li>' +
3926
- '<label class="label-' + inputType + ' item-content">' +
3927
- '<input type="' + inputType + '" name="' + inputName + '" value="' + values[j].value + '" ' + checked + '>' +
3928
- (media !== '' ? '<div class="item-media">' + media + '</div>' : '') +
3979
+ '<label class="label-{{inputType}} item-content">' +
3980
+ '<input type="{{inputType}}" name="{{inputName}}" value="{{value}}" {{#if selected}}checked{{/if}}>' +
3981
+ '{{#if hasMedia}}' +
3982
+ '<div class="item-media">' +
3983
+ '{{#if checkbox}}<i class="icon icon-form-checkbox"></i>{{/if}}' +
3984
+ '{{#if icon}}<i class="icon {{icon}}"></i>{{/if}}' +
3985
+ '{{#if image}}<img src="{{image}}">{{/if}}' +
3986
+ '</div>' +
3987
+ '{{/if}}' +
3929
3988
  '<div class="item-inner">' +
3930
- '<div class="item-title">' + values[j].text + '</div>' +
3989
+ '<div class="item-title">{{text}}</div>' +
3931
3990
  '</div>' +
3932
3991
  '</label>' +
3933
- '</li>';
3992
+ '</li>'
3993
+ );
3934
3994
  }
3935
- // Navbar HTML
3936
- var navbarLeftTemplate = openIn === 'popup' ? app.params.smartSelectPopupCloseTemplate.replace(/{{closeText}}/g, closeText) : app.params.smartSelectBackTemplate.replace(/{{backText}}/g, backText);
3937
- var navbarHTML =
3938
- '<div class="navbar ' + (navbarTheme ? 'theme-' + navbarTheme : '') + '">' +
3939
- ' <div class="navbar-inner">' +
3940
- navbarLeftTemplate +
3941
- ' <div class="center sliding">' + pageTitle + '</div>' +
3942
- ' </div>' +
3943
- '</div>';
3944
-
3945
- if (app.params.smartSelectNavbarTemplate) {
3946
- if (!app._compiledTemplates.smartSelectNavbar) {
3947
- app._compiledTemplates.smartSelectNavbar = t7.compile(app.params.smartSelectNavbarTemplate);
3995
+ var smartSelectItemTemplate = app._compiledTemplates.smartSelectItem;
3996
+
3997
+ var inputsHTML = '';
3998
+ if (!virtualList) {
3999
+ for (var j = 0; j < values.length; j++) {
4000
+ inputsHTML += smartSelectItemTemplate(values[j]);
3948
4001
  }
3949
- navbarHTML = app._compiledTemplates.smartSelectNavbar({
3950
- pageTitle: pageTitle,
3951
- backText: backText,
3952
- openIn: openIn,
3953
- inPopup: openIn === 'popup',
3954
- inPage: openIn === 'page',
3955
- id: id,
3956
- inputType: inputType
3957
- });
3958
4002
  }
4003
+
4004
+ // Navbar HTML
4005
+ if (!app._compiledTemplates.smartSelectNavbar) {
4006
+ app._compiledTemplates.smartSelectNavbar = t7.compile(app.params.smartSelectNavbarTemplate ||
4007
+ '<div class="navbar {{#if navbarTheme}}theme-{{navbarTheme}}{{/if}}">' +
4008
+ '<div class="navbar-inner">' +
4009
+ '{{leftTemplate}}' +
4010
+ '<div class="center sliding">{{pageTitle}}</div>' +
4011
+ '</div>' +
4012
+ '</div>'
4013
+ );
4014
+ }
4015
+ var navbarHTML = app._compiledTemplates.smartSelectNavbar({
4016
+ pageTitle: pageTitle,
4017
+ backText: backText,
4018
+ closeText: closeText,
4019
+ openIn: openIn,
4020
+ navbarTheme: navbarTheme,
4021
+ inPopup: openIn === 'popup',
4022
+ inPage: openIn === 'page',
4023
+ leftTemplate: openIn === 'popup' ? app.params.smartSelectPopupCloseTemplate.replace(/{{closeText}}/g, closeText) : app.params.smartSelectBackTemplate.replace(/{{backText}}/g, backText)
4024
+ });
4025
+
4026
+
3959
4027
  // Determine navbar layout type - static/fixed/through
3960
4028
  var noNavbar = '', noToolbar = '', navbarLayout;
3961
4029
  if (openIn === 'page') {
@@ -3998,9 +4066,9 @@
3998
4066
  (useSearchbar ? searchbarHTML : '') +
3999
4067
  ' <div class="page-content">' +
4000
4068
  (navbarLayout === 'static' ? navbarHTML : '') +
4001
- ' <div class="list-block smart-select-list-' + id + ' ' + (formTheme ? 'theme-' + formTheme : '') + '">' +
4069
+ ' <div class="list-block ' + (virtualList ? 'virtual-list' : '') + ' smart-select-list-' + id + ' ' + (formTheme ? 'theme-' + formTheme : '') + '">' +
4002
4070
  ' <ul>' +
4003
- inputsHTML +
4071
+ (virtualList ? '' : inputsHTML) +
4004
4072
  ' </ul>' +
4005
4073
  ' </div>' +
4006
4074
  ' </div>' +
@@ -4012,7 +4080,21 @@
4012
4080
 
4013
4081
  // Event Listeners on new page
4014
4082
  function handleInputs(container) {
4015
- $(container).find('input[name="' + inputName + '"]').on('change', function () {
4083
+ if (virtualList) {
4084
+ var virtualListInstance = app.virtualList($(container).find('.virtual-list'), {
4085
+ items: values,
4086
+ template: smartSelectItemTemplate,
4087
+ height: virtualListItemHeight || undefined,
4088
+ searchByItem: function (query, index, item) {
4089
+ if (item.text.toLowerCase().indexOf(query.trim()) >=0 ) return true;
4090
+ return false;
4091
+ }
4092
+ });
4093
+ $(container).once(openIn === 'popup' ? 'closed': 'pageBeforeRemove', function () {
4094
+ if (virtualListInstance && virtualListInstance.destroy) virtualListInstance.destroy();
4095
+ });
4096
+ }
4097
+ $(container).on('change', 'input[name="' + inputName + '"]', function () {
4016
4098
  var input = this;
4017
4099
  var value = input.value;
4018
4100
  var optionText = [];
@@ -4048,18 +4130,23 @@
4048
4130
  handleInputs(page.container);
4049
4131
  }
4050
4132
  }
4051
- $(document).on('pageInit', pageInit);
4052
-
4133
+
4053
4134
  // Load content
4054
4135
  if (openIn === 'popup') {
4055
- popup = app.popup('<div class="popup smart-select-popup smart-select-popup-' + inputName + '">' +
4136
+ popup = app.popup(
4137
+ '<div class="popup smart-select-popup smart-select-popup-' + inputName + '">' +
4056
4138
  '<div class="view navbar-fixed">' +
4057
4139
  pageHTML +
4058
4140
  '</div>' +
4059
- '</div>');
4141
+ '</div>'
4142
+ );
4143
+ app.initPage($(popup).find('.page'));
4060
4144
  handleInputs(popup);
4061
4145
  }
4062
- else view.router.load({content: pageHTML});
4146
+ else {
4147
+ $(document).on('pageInit', pageInit);
4148
+ view.router.load({content: pageHTML});
4149
+ }
4063
4150
  };
4064
4151
 
4065
4152
  /*===============================================================================
@@ -4102,7 +4189,7 @@
4102
4189
  }
4103
4190
 
4104
4191
  // Append <ul>
4105
- vl.ul = vl.listBlock.children('ul');
4192
+ vl.ul = vl.params.ul ? $(vl.params.ul) : vl.listBlock.children('ul');
4106
4193
  if (vl.ul.length === 0) {
4107
4194
  vl.listBlock.append('<ul></ul>');
4108
4195
  vl.ul = vl.listBlock.children('ul');
@@ -4158,7 +4245,7 @@
4158
4245
  }
4159
4246
  }
4160
4247
  else {
4161
- listHeight = items.length * vl.params.height;
4248
+ listHeight = items.length * vl.params.height / vl.params.cols;
4162
4249
  rowsPerScreen = Math.ceil(pageHeight / vl.params.height);
4163
4250
  rowsBefore = vl.params.rowsBefore || rowsPerScreen * 2;
4164
4251
  rowsAfter = vl.params.rowsAfter || rowsPerScreen;
@@ -4174,13 +4261,15 @@
4174
4261
  // Render items
4175
4262
  vl.render = function (force) {
4176
4263
  if (force) vl.lastRepaintY = null;
4177
- var scrollTop = vl.pageContent[0].scrollTop;
4178
- if (vl.lastRepaintY === null || Math.abs(scrollTop - vl.lastRepaintY) > maxBufferHeight || (!updatableScroll && (scrollTop + pageHeight >= vl.pageContent[0].scrollHeight))) {
4264
+ // var scrollTop = vl.pageContent[0].scrollTop;
4265
+ var scrollTop = -(vl.listBlock[0].getBoundingClientRect().top + vl.pageContent[0].getBoundingClientRect().top);
4266
+ if (vl.lastRepaintY === null || Math.abs(scrollTop - vl.lastRepaintY) > maxBufferHeight || (!updatableScroll && (vl.pageContent[0].scrollTop + pageHeight >= vl.pageContent[0].scrollHeight))) {
4179
4267
  vl.lastRepaintY = scrollTop;
4180
4268
  }
4181
4269
  else {
4182
4270
  return;
4183
4271
  }
4272
+
4184
4273
  var items = vl.filteredItems || vl.items,
4185
4274
  fromIndex, toIndex, heightBeforeFirstItem = 0, heightBeforeLastItem = 0;
4186
4275
  if (dynamicHeight) {
@@ -4256,16 +4345,19 @@
4256
4345
  // Append item to fragment
4257
4346
  vl.fragment.appendChild(item);
4258
4347
 
4259
- // Update list height with not updatable scroll
4260
- if (!updatableScroll) {
4261
- if (dynamicHeight) {
4262
- vl.ul[0].style.height = heightBeforeLastItem + 'px';
4263
- }
4264
- else {
4265
- vl.ul[0].style.height = (i + 1) * vl.params.height + 'px';
4266
- }
4348
+
4349
+ }
4350
+
4351
+ // Update list height with not updatable scroll
4352
+ if (!updatableScroll) {
4353
+ if (dynamicHeight) {
4354
+ vl.ul[0].style.height = heightBeforeLastItem + 'px';
4355
+ }
4356
+ else {
4357
+ vl.ul[0].style.height = i * vl.params.height / vl.params.cols + 'px';
4267
4358
  }
4268
4359
  }
4360
+
4269
4361
 
4270
4362
  // Update list html
4271
4363
  if (vl.params.onBeforeClear) vl.params.onBeforeClear(vl, vl.fragment);
@@ -4492,7 +4584,7 @@
4492
4584
  if (!eventsTarget.hasClass('pull-to-refresh-content')) {
4493
4585
  eventsTarget = eventsTarget.find('.pull-to-refresh-content');
4494
4586
  }
4495
- if (eventsTarget.length === 0) return;
4587
+ if (!eventsTarget || eventsTarget.length === 0) return;
4496
4588
 
4497
4589
  var isTouched, isMoved, touchesStart = {}, isScrolling, touchesDiff, touchStartTime, container, refresh = false, useTranslate = false, startTranslate = 0, translate, scrollTop, wasScrolled, layer;
4498
4590
  var page = eventsTarget.hasClass('page') ? eventsTarget : eventsTarget.parents('.page');
@@ -4501,8 +4593,6 @@
4501
4593
  if (page.hasClass('no-navbar')) hasNavbar = false;
4502
4594
  if (!hasNavbar) eventsTarget.addClass('pull-to-refresh-no-navbar');
4503
4595
 
4504
- if (eventsTarget)
4505
-
4506
4596
  container = eventsTarget;
4507
4597
 
4508
4598
  function handleTouchStart(e) {
@@ -4617,11 +4707,14 @@
4617
4707
 
4618
4708
  // Detach Events on page remove
4619
4709
  if (page.length === 0) return;
4620
- function detachEvents() {
4710
+ function destroyPullToRefresh() {
4621
4711
  eventsTarget.off(app.touchEvents.start, handleTouchStart);
4622
4712
  eventsTarget.off(app.touchEvents.move, handleTouchMove);
4623
4713
  eventsTarget.off(app.touchEvents.end, handleTouchEnd);
4624
-
4714
+ }
4715
+ eventsTarget[0].f7DestroyPullToRefresh = destroyPullToRefresh;
4716
+ function detachEvents() {
4717
+ destroyPullToRefresh();
4625
4718
  page.off('pageBeforeRemove', detachEvents);
4626
4719
  }
4627
4720
  page.on('pageBeforeRemove', detachEvents);
@@ -4648,6 +4741,13 @@
4648
4741
  });
4649
4742
  };
4650
4743
 
4744
+ app.destroyPullToRefresh = function (pageContainer) {
4745
+ pageContainer = $(pageContainer);
4746
+ var pullToRefreshContent = pageContainer.hasClass('pull-to-refresh-content') ? pageContainer : pageContainer.find('.pull-to-refresh-content');
4747
+ if (pullToRefreshContent.length === 0) return;
4748
+ if (pullToRefreshContent[0].f7DestroyPullToRefresh) pullToRefreshContent[0].f7DestroyPullToRefresh();
4749
+ };
4750
+
4651
4751
  /* ===============================================================================
4652
4752
  ************ Infinite Scroll ************
4653
4753
  =============================================================================== */
@@ -4880,9 +4980,10 @@
4880
4980
  };
4881
4981
  app.accordionOpen = function (item) {
4882
4982
  item = $(item);
4883
- var list = item.parents('.accordion-list');
4884
- var content = item.find('.accordion-item-content');
4885
- var expandedItem = list.find('.accordion-item-expanded');
4983
+ var list = item.parents('.accordion-list').eq(0);
4984
+ var content = item.children('.accordion-item-content');
4985
+ if (content.length === 0) content = item.find('.accordion-item-content');
4986
+ var expandedItem = list.length > 0 && item.parent().children('.accordion-item-expanded');
4886
4987
  if (expandedItem.length > 0) {
4887
4988
  app.accordionClose(expandedItem);
4888
4989
  }
@@ -4904,7 +5005,8 @@
4904
5005
  };
4905
5006
  app.accordionClose = function (item) {
4906
5007
  item = $(item);
4907
- var content = item.find('.accordion-item-content');
5008
+ var content = item.children('.accordion-item-content');
5009
+ if (content.length === 0) content = item.find('.accordion-item-content');
4908
5010
  item.removeClass('accordion-item-expanded');
4909
5011
  content.transition(0);
4910
5012
  content.css('height', content[0].scrollHeight + 'px');
@@ -5378,7 +5480,8 @@
5378
5480
  }
5379
5481
  // Accordion
5380
5482
  if (clicked.hasClass('accordion-item-toggle') || (clicked.hasClass('item-link') && clicked.parent().hasClass('accordion-item'))) {
5381
- var accordionItem = clicked.parents('.accordion-item');
5483
+ var accordionItem = clicked.parent('.accordion-item');
5484
+ if (accordionItem.length === 0) accordionItem = clicked.parents('.accordion-item');
5382
5485
  if (accordionItem.length === 0) accordionItem = clicked.parents('li');
5383
5486
  app.accordionToggle(accordionItem);
5384
5487
  }
@@ -5406,9 +5509,7 @@
5406
5509
  }
5407
5510
  }
5408
5511
  if (!view) {
5409
- for (var i = 0; i < app.views.length; i++) {
5410
- if (app.views[i].main) view = app.views[i];
5411
- }
5512
+ if (app.mainView) view = app.mainView;
5412
5513
  }
5413
5514
  if (!view) return;
5414
5515
 
@@ -5715,10 +5816,7 @@
5715
5816
  });
5716
5817
  function handlePopState(e) {
5717
5818
  if (blockPopstate) return;
5718
- var mainView;
5719
- for (var i = 0; i < app.views.length; i++) {
5720
- if (app.views[i].main) mainView = app.views[i];
5721
- }
5819
+ var mainView = app.mainView;
5722
5820
  if (!mainView) return;
5723
5821
  var state = e.state;
5724
5822
  if (!state) {
@@ -5875,8 +5973,8 @@
5875
5973
  }
5876
5974
  }
5877
5975
  // First/last
5878
- s.isFirst = s.activeSlideIndex === 0;
5879
- s.isLast = s.activeSlideIndex === s.slides.length - s.params.slidesPerView;
5976
+ s.isFirst = s.isBeginning = s.activeSlideIndex === 0;
5977
+ s.isLast = s.isEnd = s.activeSlideIndex === s.slides.length - s.params.slidesPerView;
5880
5978
  };
5881
5979
 
5882
5980
  s.updatePagination = function () {
@@ -6123,8 +6221,8 @@
6123
6221
  if (typeof speed === 'undefined') speed = s.params.speed;
6124
6222
  s.previousSlideIndex = s.activeSlideIndex;
6125
6223
  s.activeSlideIndex = Math.round(index);
6126
- s.isFirst = s.activeSlideIndex === 0;
6127
- s.isLast = s.activeSlideIndex === s.slides.length - s.params.slidesPerView;
6224
+ s.isFirst = s.isBeginning = s.activeSlideIndex === 0;
6225
+ s.isLast = s.isEnd = s.activeSlideIndex === s.slides.length - s.params.slidesPerView;
6128
6226
  s.onTransitionStart();
6129
6227
  var translateX = isH ? translate * inverter : 0, translateY = isH ? 0 : translate;
6130
6228
  if (speed === 0) {
@@ -6299,6 +6397,9 @@
6299
6397
  else s.updateClasses();
6300
6398
  s.attachEvents();
6301
6399
  if (s.params.autoplay) s.startAutoplay();
6400
+ if (typeof s.params.onInit === 'function') {
6401
+ s.params.onInit();
6402
+ }
6302
6403
  };
6303
6404
  s.update = function () {
6304
6405
  if (s.params.loop) s.createLoop();
@@ -6417,14 +6518,6 @@
6417
6518
 
6418
6519
  pb.params = params;
6419
6520
 
6420
- function findView() {
6421
- var view;
6422
- for (i = 0; i < app.views.length; i ++) {
6423
- if (app.views[i].main) view = app.views[i];
6424
- }
6425
- return view;
6426
- }
6427
-
6428
6521
  var iconColor = pb.params.theme === 'dark' ? 'color-white' : '';
6429
6522
 
6430
6523
  var navbarTemplate = pb.params.navbarTemplate ||
@@ -6540,7 +6633,7 @@
6540
6633
  if (pb.params.type === 'page') {
6541
6634
  $(document).on('pageBeforeInit', pb.onPageBeforeInit);
6542
6635
  $(document).on('pageBeforeRemove', pb.onPageBeforeRemove);
6543
- if (!pb.params.view) pb.params.view = findView();
6636
+ if (!pb.params.view) pb.params.view = app.mainView;
6544
6637
  pb.params.view.loadContent(htmlTemplate);
6545
6638
  return;
6546
6639
  }
@@ -7095,7 +7188,7 @@
7095
7188
  list.prepend(item[0]);
7096
7189
  container.show();
7097
7190
 
7098
- var itemHeight = item.height();
7191
+ var itemHeight = item.outerHeight();
7099
7192
  item.css('marginTop', -itemHeight + 'px');
7100
7193
  item.transition(0);
7101
7194
 
@@ -7114,7 +7207,7 @@
7114
7207
  if (item.hasClass('notification-item-removing')) return;
7115
7208
  var container = $('.notifications');
7116
7209
 
7117
- var itemHeight = item.height();
7210
+ var itemHeight = item.outerHeight();
7118
7211
  item.css('height', itemHeight + 'px').transition(0);
7119
7212
  var clientLeft = item[0].clientLeft;
7120
7213
 
@@ -7139,7 +7232,7 @@
7139
7232
  if (!window.Template7) return;
7140
7233
  Template7.templates = Template7.templates || app.params.templates || {};
7141
7234
  Template7.data = Template7.data || app.params.template7Data || {};
7142
- Template7.template7Cache = {};
7235
+ Template7.cache = Template7.cache || {};
7143
7236
 
7144
7237
  app.templates = Template7.templates;
7145
7238
  app.template7Data = Template7.data;
@@ -7235,7 +7328,7 @@
7235
7328
  if (app.initSortable && app.params.sortable) app.initSortable();
7236
7329
 
7237
7330
  // Init Live Swipe Panels
7238
- if (app.initSwipePanels && app.params.swipePanel) app.initSwipePanels();
7331
+ if (app.initSwipePanels && (app.params.swipePanel || app.params.swipePanelOnlyClose)) app.initSwipePanels();
7239
7332
 
7240
7333
  // App Init callback
7241
7334
  if (app.params.onAppInit) app.params.onAppInit();
@@ -7276,9 +7369,32 @@
7276
7369
  if (selector) {
7277
7370
  // String
7278
7371
  if (typeof selector === 'string') {
7279
- var els = (context || document).querySelectorAll(selector);
7280
- for (i = 0; i < els.length; i++) {
7281
- arr.push(els[i]);
7372
+ var els, tempParent, html = selector.trim();
7373
+ if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {
7374
+ var toCreate = 'div';
7375
+ if (html.indexOf('<li') === 0) toCreate = 'ul';
7376
+ if (html.indexOf('<tr') === 0) toCreate = 'tbody';
7377
+ if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) toCreate = 'tr';
7378
+ if (html.indexOf('<tbody') === 0) toCreate = 'table';
7379
+ if (html.indexOf('<option') === 0) toCreate = 'select';
7380
+ tempParent = document.createElement(toCreate);
7381
+ tempParent.innerHTML = selector;
7382
+ for (i = 0; i < tempParent.childNodes.length; i++) {
7383
+ arr.push(tempParent.childNodes[i]);
7384
+ }
7385
+ }
7386
+ else {
7387
+ if (!context && selector[0] === '#' && !selector.match(/[ .<>:~]/)) {
7388
+ // Pure ID selector
7389
+ els = [document.getElementById(selector.split('#')[1])];
7390
+ }
7391
+ else {
7392
+ // Other selectors
7393
+ els = (context || document).querySelectorAll(selector);
7394
+ }
7395
+ for (i = 0; i < els.length; i++) {
7396
+ if (els[i]) arr.push(els[i]);
7397
+ }
7282
7398
  }
7283
7399
  }
7284
7400
  // Node/element
@@ -7330,14 +7446,26 @@
7330
7446
  }
7331
7447
  return this;
7332
7448
  },
7333
- attr: function (attr, value) {
7334
- if (typeof value === 'undefined') {
7335
- if (this[0]) return this[0].getAttribute(attr);
7449
+ attr: function (attrs, value) {
7450
+ if (arguments.length === 1 && typeof attrs === 'string') {
7451
+ // Get attr
7452
+ if (this[0]) return this[0].getAttribute(attrs);
7336
7453
  else return undefined;
7337
7454
  }
7338
7455
  else {
7456
+ // Set attrs
7339
7457
  for (var i = 0; i < this.length; i++) {
7340
- this[i].setAttribute(attr, value);
7458
+ if (arguments.length === 2) {
7459
+ // String
7460
+ this[i].setAttribute(attrs, value);
7461
+ }
7462
+ else {
7463
+ // Object
7464
+ for (var attrName in attrs) {
7465
+ this[i][attrName] = attrs[attrName];
7466
+ this[i].setAttribute(attrName, attrs[attrName]);
7467
+ }
7468
+ }
7341
7469
  }
7342
7470
  return this;
7343
7471
  }
@@ -7347,14 +7475,25 @@
7347
7475
  this[i].removeAttribute(attr);
7348
7476
  }
7349
7477
  },
7350
- prop: function (prop, value) {
7351
- if (typeof value === 'undefined') {
7352
- if (this[0]) return this[0][prop];
7478
+ prop: function (props, value) {
7479
+ if (arguments.length === 1 && typeof props === 'string') {
7480
+ // Get prop
7481
+ if (this[0]) return this[0][props];
7353
7482
  else return undefined;
7354
7483
  }
7355
7484
  else {
7485
+ // Set props
7356
7486
  for (var i = 0; i < this.length; i++) {
7357
- this[i][prop] = value;
7487
+ if (arguments.length === 2) {
7488
+ // String
7489
+ this[i][props] = value;
7490
+ }
7491
+ else {
7492
+ // Object
7493
+ for (var propName in props) {
7494
+ this[i][propName] = props[propName];
7495
+ }
7496
+ }
7358
7497
  }
7359
7498
  return this;
7360
7499
  }
@@ -7542,17 +7681,16 @@
7542
7681
  }
7543
7682
  else {
7544
7683
  if (this.length > 0) {
7545
- return parseFloat(this.css('width')) - parseFloat(this.css('padding-left')) - parseFloat(this.css('padding-right'));
7684
+ return parseFloat(this.css('width'));
7546
7685
  }
7547
7686
  else {
7548
7687
  return null;
7549
7688
  }
7550
7689
  }
7551
-
7552
7690
  },
7553
- outerWidth: function (margins) {
7691
+ outerWidth: function (includeMargins) {
7554
7692
  if (this.length > 0) {
7555
- if (margins)
7693
+ if (includeMargins)
7556
7694
  return this[0].offsetWidth + parseFloat(this.css('margin-right')) + parseFloat(this.css('margin-left'));
7557
7695
  else
7558
7696
  return this[0].offsetWidth;
@@ -7565,17 +7703,16 @@
7565
7703
  }
7566
7704
  else {
7567
7705
  if (this.length > 0) {
7568
- return this[0].offsetHeight - parseFloat(this.css('padding-top')) - parseFloat(this.css('padding-bottom'));
7706
+ return parseFloat(this.css('height'));
7569
7707
  }
7570
7708
  else {
7571
7709
  return null;
7572
7710
  }
7573
7711
  }
7574
-
7575
7712
  },
7576
- outerHeight: function (margins) {
7713
+ outerHeight: function (includeMargins) {
7577
7714
  if (this.length > 0) {
7578
- if (margins)
7715
+ if (includeMargins)
7579
7716
  return this[0].offsetHeight + parseFloat(this.css('margin-top')) + parseFloat(this.css('margin-bottom'));
7580
7717
  else
7581
7718
  return this[0].offsetHeight;
@@ -7740,7 +7877,6 @@
7740
7877
  while (tempDiv.firstChild) {
7741
7878
  this[i].appendChild(tempDiv.firstChild);
7742
7879
  }
7743
- // this[i].insertAdjacentHTML('beforeend', newChild);
7744
7880
  }
7745
7881
  else if (newChild instanceof Dom7) {
7746
7882
  for (j = 0; j < newChild.length; j++) {
@@ -8674,24 +8810,27 @@ window.Template7 = (function () {
8674
8810
  }
8675
8811
  function getCompileVar(name, ctx) {
8676
8812
  var parents, variable, context;
8677
-
8678
- if (name.indexOf('.') > 0) {
8679
- if (name.indexOf('this') === 0) variable = name.replace('this', ctx);
8680
- else variable = ctx + '.' + name;
8813
+ if (name.indexOf('@global') >= 0) {
8814
+ variable = '(Template7.global && Template7.global.' + (name.split('@global.')[1]) + ')';
8681
8815
  }
8682
- else if (name.indexOf('../') === 0) {
8683
- var levelUp = name.split('../').length - 1;
8684
- var newName = name.split('../')[name.split('../').length - 1];
8685
- var newDepth = ctx.split('_')[1] - levelUp;
8686
- variable = 'ctx_' + (newDepth >= 1 ? newDepth : 1) + '.' + newName;
8816
+ else if (name.indexOf('@') >= 0) {
8817
+ variable = '(data && data.' + name.replace('@', '') + ')';
8687
8818
  }
8688
8819
  else {
8689
- variable = name === 'this' ? ctx : ctx + '.' + name;
8690
- }
8691
- if (name && name.indexOf('@') >= 0) {
8692
- variable = '(data && data.' + name.replace('@', '') + ')';
8820
+ if (name.indexOf('.') > 0) {
8821
+ if (name.indexOf('this') === 0) variable = name.replace('this', ctx);
8822
+ else variable = ctx + '.' + name;
8823
+ }
8824
+ else if (name.indexOf('../') === 0) {
8825
+ var levelUp = name.split('../').length - 1;
8826
+ var newName = name.split('../')[name.split('../').length - 1];
8827
+ var newDepth = ctx.split('_')[1] - levelUp;
8828
+ variable = 'ctx_' + (newDepth >= 1 ? newDepth : 1) + '.' + newName;
8829
+ }
8830
+ else {
8831
+ variable = name === 'this' ? ctx : ctx + '.' + name;
8832
+ }
8693
8833
  }
8694
-
8695
8834
  return variable;
8696
8835
  }
8697
8836
  function getCompiledArguments(contextArray, ctx) {
@@ -8819,7 +8958,7 @@ window.Template7 = (function () {
8819
8958
  },
8820
8959
  'join': function (context, options) {
8821
8960
  if (isFunction(context)) { context = context.call(this); }
8822
- return context.join(options.hash.delimeter);
8961
+ return context.join(options.hash.delimiter || options.hash.delimeter);
8823
8962
  }
8824
8963
  }
8825
8964
  };