| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131 |
- /*jslint eqeq: true, plusplus: true, undef: true, sloppy: true, vars: true, forin: true */
- /*!
- * jQuery MobiScroll v2.5.1
- * http://mobiscroll.com
- *
- * Copyright 2010-2013, Acid Media
- * Licensed under the MIT license.
- *
- */
- (function ($) {
- function Scroller(elem, settings) {
- var m,
- hi,
- v,
- dw,
- ww, // Window width
- wh, // Window height
- rwh,
- mw, // Modal width
- mh, // Modal height
- anim,
- debounce,
- that = this,
- ms = $.mobiscroll,
- e = elem,
- elm = $(e),
- theme,
- lang,
- s = extend({}, defaults),
- pres = {},
- warr = [],
- iv = {},
- pixels = {},
- input = elm.is('input'),
- visible = false;
- // Private functions
- function isReadOnly(wh) {
- if ($.isArray(s.readonly)) {
- var i = $('.dwwl', dw).index(wh);
- return s.readonly[i];
- }
- return s.readonly;
- }
- function generateWheelItems(i) {
- var html = '<div class="dw-bf">',
- l = 1,
- j;
- for (j in warr[i]) {
- if (l % 20 == 0) {
- html += '</div><div class="dw-bf">';
- }
- html += '<div class="dw-li dw-v" data-val="' + j + '" style="height:' + hi + 'px;line-height:' + hi + 'px;"><div class="dw-i">' + warr[i][j] + '</div></div>';
- l++;
- }
- html += '</div>';
- return html;
- }
- function setGlobals(t) {
- min = $('.dw-li', t).index($('.dw-v', t).eq(0));
- max = $('.dw-li', t).index($('.dw-v', t).eq(-1));
- index = $('.dw-ul', dw).index(t);
- h = hi;
- inst = that;
- }
- function formatHeader(v) {
- var t = s.headerText;
- return t ? (typeof t === 'function' ? t.call(e, v) : t.replace(/\{value\}/i, v)) : '';
- }
- function read() {
- that.temp = ((input && that.val !== null && that.val != elm.val()) || that.values === null) ? s.parseValue(elm.val() || '', that) : that.values.slice(0);
- that.setValue(true);
- }
- function scrollToPos(time, index, manual, dir, orig) {
-
- // Call validation event
- if (event('validate', [dw, index, time]) !== false) {
- // Set scrollers to position
- $('.dw-ul', dw).each(function (i) {
- var t = $(this),
- cell = $('.dw-li[data-val="' + that.temp[i] + '"]', t),
- cells = $('.dw-li', t),
- v = cells.index(cell),
- l = cells.length,
- sc = i == index || index === undefined;
-
- // Scroll to a valid cell
- if (!cell.hasClass('dw-v')) {
- var cell1 = cell,
- cell2 = cell,
- dist1 = 0,
- dist2 = 0;
-
- while (v - dist1 >= 0 && !cell1.hasClass('dw-v')) {
- dist1++;
- cell1 = cells.eq(v - dist1);
- }
- while (v + dist2 < l && !cell2.hasClass('dw-v')) {
- dist2++;
- cell2 = cells.eq(v + dist2);
- }
-
- // If we have direction (+/- or mouse wheel), the distance does not count
- if (((dist2 < dist1 && dist2 && dir !== 2) || !dist1 || (v - dist1 < 0) || dir == 1) && cell2.hasClass('dw-v')) {
- cell = cell2;
- v = v + dist2;
- } else {
- cell = cell1;
- v = v - dist1;
- }
- }
-
- if (!(cell.hasClass('dw-sel')) || sc) {
- // Set valid value
- that.temp[i] = cell.attr('data-val');
- // Add selected class to cell
- $('.dw-sel', t).removeClass('dw-sel');
- cell.addClass('dw-sel');
- // Scroll to position
- //that.scroll(t, i, v, time);
- that.scroll(t, i, v, sc ? time : 0.1, sc ? orig : undefined);
- }
- });
-
- // Reformat value if validation changed something
- that.change(manual);
- }
-
- }
- function position(check) {
- if (s.display == 'inline' || (ww === $(window).width() && rwh === $(window).height() && check)) {
- return;
- }
-
- var w,
- l,
- t,
- aw, // anchor width
- ah, // anchor height
- ap, // anchor position
- at, // anchor top
- al, // anchor left
- arr, // arrow
- arrw, // arrow width
- arrl, // arrow left
- scroll,
- totalw = 0,
- minw = 0,
- st = $(window).scrollTop(),
- wr = $('.dwwr', dw),
- d = $('.dw', dw),
- css = {},
- anchor = s.anchor === undefined ? elm : s.anchor;
-
- ww = $(window).width();
- rwh = $(window).height();
- wh = window.innerHeight; // on iOS we need innerHeight
- wh = wh || rwh;
-
- if (/modal|bubble/.test(s.display)) {
- $('.dwc', dw).each(function () {
- w = $(this).outerWidth(true);
- totalw += w;
- minw = (w > minw) ? w : minw;
- });
- w = totalw > ww ? minw : totalw;
- wr.width(w);
- }
-
- mw = d.outerWidth();
- mh = d.outerHeight(true);
-
- if (s.display == 'modal') {
- l = (ww - mw) / 2;
- t = st + (wh - mh) / 2;
- } else if (s.display == 'bubble') {
- scroll = true;
- arr = $('.dw-arrw-i', dw);
- ap = anchor.offset();
- at = ap.top;
- al = ap.left;
- // horizontal positioning
- aw = anchor.outerWidth();
- ah = anchor.outerHeight();
- l = al - (d.outerWidth(true) - aw) / 2;
- l = l > (ww - mw) ? (ww - (mw + 20)) : l;
- l = l >= 0 ? l : 20;
-
- // vertical positioning
- t = at - mh; //(mh + 3); // above the input
- if ((t < st) || (at > st + wh)) { // if doesn't fit above or the input is out of the screen
- d.removeClass('dw-bubble-top').addClass('dw-bubble-bottom');
- t = at + ah;// + 3; // below the input
- } else {
- d.removeClass('dw-bubble-bottom').addClass('dw-bubble-top');
- }
- //t = t >= st ? t : st;
-
- // Calculate Arrow position
- arrw = arr.outerWidth();
- arrl = al + aw / 2 - (l + (mw - arrw) / 2);
- // Limit Arrow position to [0, pocw.width] intervall
- $('.dw-arr', dw).css({ left: arrl > arrw ? arrw : arrl });
- } else {
- css.width = '100%';
- if (s.display == 'top') {
- t = st;
- } else if (s.display == 'bottom') {
- t = st + wh - mh;
- }
- }
-
- css.top = t < 0 ? 0 : t;
- css.left = l;
- d.css(css);
-
- // If top + modal height > doc height, increase doc height
- $('.dw-persp', dw).height(0).height(t + mh > $(document).height() ? t + mh : $(document).height());
-
- // Scroll needed
- if (scroll && ((t + mh > st + wh) || (at > st + wh))) {
- $(window).scrollTop(t + mh - wh);
- }
- }
-
- function testTouch(e) {
- if (e.type === 'touchstart') {
- touch = true;
- setTimeout(function () {
- touch = false; // Reset if mouse event was not fired
- }, 500);
- } else if (touch) {
- touch = false;
- return false;
- }
- return true;
- }
- function event(name, args) {
- var ret;
- args.push(that);
- $.each([theme.defaults, pres, settings], function (i, v) {
- if (v[name]) { // Call preset event
- ret = v[name].apply(e, args);
- }
- });
- return ret;
- }
- function plus(t) {
- var p = +t.data('pos'),
- val = p + 1;
- calc(t, val > max ? min : val, 1, true);
- }
- function minus(t) {
- var p = +t.data('pos'),
- val = p - 1;
- calc(t, val < min ? max : val, 2, true);
- }
- // Public functions
- /**
- * Enables the scroller and the associated input.
- */
- that.enable = function () {
- s.disabled = false;
- if (input) {
- elm.prop('disabled', false);
- }
- };
- /**
- * Disables the scroller and the associated input.
- */
- that.disable = function () {
- s.disabled = true;
- if (input) {
- elm.prop('disabled', true);
- }
- };
- /**
- * Scrolls target to the specified position
- * @param {Object} t - Target wheel jQuery object.
- * @param {Number} index - Index of the changed wheel.
- * @param {Number} val - Value.
- * @param {Number} time - Duration of the animation, optional.
- * @param {Number} orig - Original value.
- */
- that.scroll = function (t, index, val, time, orig) {
-
- function getVal(t, b, c, d) {
- return c * Math.sin(t / d * (Math.PI / 2)) + b;
- }
- function ready() {
- clearInterval(iv[index]);
- delete iv[index];
- t.data('pos', val).closest('.dwwl').removeClass('dwa');
- }
-
- var px = (m - val) * hi,
- i;
-
- if (px == pixels[index] && iv[index]) {
- return;
- }
-
- if (time && px != pixels[index]) {
- // Trigger animation start event
- event('onAnimStart', [dw, index, time]);
- }
-
- pixels[index] = px;
-
- t.attr('style', (prefix + '-transition:all ' + (time ? time.toFixed(3) : 0) + 's ease-out;') + (has3d ? (prefix + '-transform:translate3d(0,' + px + 'px,0);') : ('top:' + px + 'px;')));
-
- if (iv[index]) {
- ready();
- }
-
- if (time && orig !== undefined) {
- i = 0;
- t.closest('.dwwl').addClass('dwa');
- iv[index] = setInterval(function () {
- i += 0.1;
- t.data('pos', Math.round(getVal(i, orig, val - orig, time)));
- if (i >= time) {
- ready();
- }
- }, 100);
- } else {
- t.data('pos', val);
- }
- };
-
- /**
- * Gets the selected wheel values, formats it, and set the value of the scroller instance.
- * If input parameter is true, populates the associated input element.
- * @param {Boolean} sc - Scroll the wheel in position.
- * @param {Boolean} fill - Also set the value of the associated input element. Default is true.
- * @param {Number} time - Animation time
- * @param {Boolean} temp - If true, then only set the temporary value.(only scroll there but not set the value)
- */
- that.setValue = function (sc, fill, time, temp) {
- if (!$.isArray(that.temp)) {
- that.temp = s.parseValue(that.temp + '', that);
- }
-
- if (visible && sc) {
- scrollToPos(time);
- }
-
- v = s.formatResult(that.temp);
-
- if (!temp) {
- that.values = that.temp.slice(0);
- that.val = v;
- }
- if (fill) {
- if (input) {
- elm.val(v).trigger('change');
- }
- }
- };
-
- that.getValues = function () {
- var ret = [],
- i;
-
- for (i in that._selectedValues) {
- ret.push(that._selectedValues[i]);
- }
- return ret;
- };
- /**
- * Checks if the current selected values are valid together.
- * In case of date presets it checks the number of days in a month.
- * @param {Number} time - Animation time
- * @param {Number} orig - Original value
- * @param {Number} i - Currently changed wheel index, -1 if initial validation.
- * @param {Number} dir - Scroll direction
- */
- that.validate = function (i, dir, time, orig) {
- scrollToPos(time, i, true, dir, orig);
- };
- /**
- *
- */
- that.change = function (manual) {
- v = s.formatResult(that.temp);
- if (s.display == 'inline') {
- that.setValue(false, manual);
- } else {
- $('.dwv', dw).html(formatHeader(v));
- }
- if (manual) {
- event('onChange', [v]);
- }
- };
- /**
- * Changes the values of a wheel, and scrolls to the correct position
- */
- that.changeWheel = function (idx, time) {
- if (dw) {
- var i = 0,
- j,
- k,
- nr = idx.length;
- for (j in s.wheels) {
- for (k in s.wheels[j]) {
- if ($.inArray(i, idx) > -1) {
- warr[i] = s.wheels[j][k];
- $('.dw-ul', dw).eq(i).html(generateWheelItems(i));
- nr--;
- if (!nr) {
- position();
- scrollToPos(time, undefined, true);
- return;
- }
- }
- i++;
- }
- }
- }
- };
-
- /**
- * Return true if the scroller is currently visible.
- */
- that.isVisible = function () {
- return visible;
- };
-
- /**
- *
- */
- that.tap = function (el, handler) {
- var startX,
- startY;
-
- if (s.tap) {
- el.bind('touchstart', function (e) {
- e.preventDefault();
- startX = getCoord(e, 'X');
- startY = getCoord(e, 'Y');
- }).bind('touchend', function (e) {
- // If movement is less than 20px, fire the click event handler
- if (Math.abs(getCoord(e, 'X') - startX) < 20 && Math.abs(getCoord(e, 'Y') - startY) < 20) {
- handler.call(this, e);
- }
- tap = true;
- setTimeout(function () {
- tap = false;
- }, 300);
- });
- }
-
- el.bind('click', function (e) {
- if (!tap) {
- // If handler was not called on touchend, call it on click;
- handler.call(this, e);
- }
- });
-
- };
-
- /**
- * Shows the scroller instance.
- * @param {Boolean} prevAnim - Prevent animation if true
- */
- that.show = function (prevAnim) {
- if (s.disabled || visible) {
- return false;
- }
- if (s.display == 'top') {
- anim = 'slidedown';
- }
- if (s.display == 'bottom') {
- anim = 'slideup';
- }
- // Parse value from input
- read();
- event('onBeforeShow', [dw]);
- // Create wheels
- var l = 0,
- i,
- label,
- mAnim = '';
- if (anim && !prevAnim) {
- mAnim = 'dw-' + anim + ' dw-in';
- }
- // Create wheels containers
- var html = '<div class="dw-trans ' + s.theme + ' dw-' + s.display + '">' + (s.display == 'inline' ? '<div class="dw dwbg dwi"><div class="dwwr">' : '<div class="dw-persp">' + '<div class="dwo"></div><div class="dw dwbg ' + mAnim + '"><div class="dw-arrw"><div class="dw-arrw-i"><div class="dw-arr"></div></div></div><div class="dwwr">' + (s.headerText ? '<div class="dwv"></div>' : ''));
-
- for (i = 0; i < s.wheels.length; i++) {
- html += '<div class="dwc' + (s.mode != 'scroller' ? ' dwpm' : ' dwsc') + (s.showLabel ? '' : ' dwhl') + '"><div class="dwwc dwrc"><table cellpadding="0" cellspacing="0"><tr>';
- // Create wheels
- for (label in s.wheels[i]) {
- warr[l] = s.wheels[i][label];
- html += '<td><div class="dwwl dwrc dwwl' + l + '">' + (s.mode != 'scroller' ? '<div class="dwwb dwwbp" style="height:' + hi + 'px;line-height:' + hi + 'px;"><span>+</span></div><div class="dwwb dwwbm" style="height:' + hi + 'px;line-height:' + hi + 'px;"><span>–</span></div>' : '') + '<div class="dwl">' + label + '</div><div class="dww" style="height:' + (s.rows * hi) + 'px;min-width:' + s.width + 'px;"><div class="dw-ul">';
- // Create wheel values
- html += generateWheelItems(l);
- html += '</div><div class="dwwo"></div></div><div class="dwwol"></div></div></td>';
- l++;
- }
- html += '</tr></table></div></div>';
- }
- html += (s.display != 'inline' ? '<div class="dwbc' + (s.button3 ? ' dwbc-p' : '') + '"><span class="dwbw dwb-s"><span class="dwb">' + s.setText + '</span></span>' + (s.button3 ? '<span class="dwbw dwb-n"><span class="dwb">' + s.button3Text + '</span></span>' : '') + '<span class="dwbw dwb-c"><span class="dwb">' + s.cancelText + '</span></span></div></div>' : '<div class="dwcc"></div>') + '</div></div></div>';
- dw = $(html);
- scrollToPos();
-
- event('onMarkupReady', [dw]);
- // Show
- if (s.display != 'inline') {
- dw.appendTo('body');
- // Remove animation class
- setTimeout(function () {
- dw.removeClass('dw-trans').find('.dw').removeClass(mAnim);
- }, 350);
- } else if (elm.is('div')) {
- elm.html(dw);
- } else {
- dw.insertAfter(elm);
- }
-
- event('onMarkupInserted', [dw]);
-
- visible = true;
-
- // Theme init
- theme.init(dw, that);
-
- if (s.display != 'inline') {
- // Init buttons
- that.tap($('.dwb-s span', dw), function () {
- if (that.hide(false, 'set') !== false) {
- that.setValue(false, true);
- event('onSelect', [that.val]);
- }
- });
- that.tap($('.dwb-c span', dw), function () {
- that.cancel();
- });
- if (s.button3) {
- that.tap($('.dwb-n span', dw), s.button3);
- }
- // prevent scrolling if not specified otherwise
- if (s.scrollLock) {
- dw.bind('touchmove', function (e) {
- if (mh <= wh && mw <= ww) {
- e.preventDefault();
- }
- });
- }
- // Disable inputs to prevent bleed through (Android bug)
- $('input,select,button').each(function () {
- if (!$(this).prop('disabled')) {
- $(this).addClass('dwtd').prop('disabled', true);
- }
- });
-
- // Set position
- position();
- $(window).bind('resize.dw', function () {
- // Sometimes scrollTop is not correctly set, so we wait a little
- clearTimeout(debounce);
- debounce = setTimeout(function () {
- position(true);
- }, 100);
- });
- }
- // Events
- dw.delegate('.dwwl', 'DOMMouseScroll mousewheel', function (e) {
- if (!isReadOnly(this)) {
- e.preventDefault();
- e = e.originalEvent;
- var delta = e.wheelDelta ? (e.wheelDelta / 120) : (e.detail ? (-e.detail / 3) : 0),
- t = $('.dw-ul', this),
- p = +t.data('pos'),
- val = Math.round(p - delta);
- setGlobals(t);
- calc(t, val, delta < 0 ? 1 : 2);
- }
- }).delegate('.dwb, .dwwb', START_EVENT, function (e) {
- // Active button
- $(this).addClass('dwb-a');
- }).delegate('.dwwb', START_EVENT, function (e) {
- e.stopPropagation();
- e.preventDefault();
- var w = $(this).closest('.dwwl');
- if (testTouch(e) && !isReadOnly(w) && !w.hasClass('dwa')) {
- click = true;
- // + Button
- var t = w.find('.dw-ul'),
- func = $(this).hasClass('dwwbp') ? plus : minus;
-
- setGlobals(t);
- clearInterval(timer);
- timer = setInterval(function () { func(t); }, s.delay);
- func(t);
- }
- }).delegate('.dwwl', START_EVENT, function (e) {
- // Prevent scroll
- e.preventDefault();
- // Scroll start
- if (testTouch(e) && !move && !isReadOnly(this) && !click) {
- move = true;
- $(document).bind(MOVE_EVENT, onMove);
- target = $('.dw-ul', this);
- scrollable = s.mode != 'clickpick';
- pos = +target.data('pos');
- setGlobals(target);
- moved = iv[index] !== undefined; // Don't allow tap, if still moving
- start = getCoord(e, 'Y');
- startTime = new Date();
- stop = start;
- that.scroll(target, index, pos, 0.001);
- if (scrollable) {
- target.closest('.dwwl').addClass('dwa');
- }
- }
- });
- event('onShow', [dw, v]);
- };
-
- /**
- * Hides the scroller instance.
- */
- that.hide = function (prevAnim, btn) {
- // If onClose handler returns false, prevent hide
- if (!visible || event('onClose', [v, btn]) === false) {
- return false;
- }
- // Re-enable temporary disabled fields
- $('.dwtd').prop('disabled', false).removeClass('dwtd');
- elm.blur();
- // Hide wheels and overlay
- if (dw) {
- if (s.display != 'inline' && anim && !prevAnim) {
- dw.addClass('dw-trans').find('.dw').addClass('dw-' + anim + ' dw-out');
- setTimeout(function () {
- dw.remove();
- dw = null;
- }, 350);
- } else {
- dw.remove();
- dw = null;
- }
- visible = false;
- pixels = {};
- // Stop positioning on window resize
- $(window).unbind('.dw');
- }
- };
- /**
- * Cancel and hide the scroller instance.
- */
- that.cancel = function () {
- if (that.hide(false, 'cancel') !== false) {
- event('onCancel', [that.val]);
- }
- };
- /**
- * Scroller initialization.
- */
- that.init = function (ss) {
- // Get theme defaults
- theme = extend({ defaults: {}, init: empty }, ms.themes[ss.theme || s.theme]);
- // Get language defaults
- lang = ms.i18n[ss.lang || s.lang];
- extend(settings, ss); // Update original user settings
- extend(s, theme.defaults, lang, settings);
- that.settings = s;
- // Unbind all events (if re-init)
- elm.unbind('.dw');
- var preset = ms.presets[s.preset];
- if (preset) {
- pres = preset.call(e, that);
- extend(s, pres, settings); // Load preset settings
- extend(methods, pres.methods); // Extend core methods
- }
- // Set private members
- m = Math.floor(s.rows / 2);
- hi = s.height;
- anim = s.animate;
- if (elm.data('dwro') !== undefined) {
- e.readOnly = bool(elm.data('dwro'));
- }
- if (visible) {
- that.hide();
- }
- if (s.display == 'inline') {
- that.show();
- } else {
- read();
- if (input && s.showOnFocus) {
- // Set element readonly, save original state
- elm.data('dwro', e.readOnly);
- e.readOnly = true;
- // Init show datewheel
- elm.bind('focus.dw', function () { that.show(); });
- }
- }
- };
-
- that.trigger = function (name, params) {
- return event(name, params);
- };
-
- that.values = null;
- that.val = null;
- that.temp = null;
- that._selectedValues = {}; // [];
- that.init(settings);
- }
- function testProps(props) {
- var i;
- for (i in props) {
- if (mod[props[i]] !== undefined) {
- return true;
- }
- }
- return false;
- }
- function testPrefix() {
- var prefixes = ['Webkit', 'Moz', 'O', 'ms'],
- p;
- for (p in prefixes) {
- if (testProps([prefixes[p] + 'Transform'])) {
- return '-' + prefixes[p].toLowerCase();
- }
- }
- return '';
- }
- function getInst(e) {
- return scrollers[e.id];
- }
-
- function getCoord(e, c) {
- var org = e.originalEvent,
- ct = e.changedTouches;
- return ct || (org && org.changedTouches) ? (org ? org.changedTouches[0]['page' + c] : ct[0]['page' + c]) : e['page' + c];
- }
- function bool(v) {
- return (v === true || v == 'true');
- }
- function constrain(val, min, max) {
- val = val > max ? max : val;
- val = val < min ? min : val;
- return val;
- }
-
- function calc(t, val, dir, anim, orig) {
- val = constrain(val, min, max);
- var cell = $('.dw-li', t).eq(val),
- o = orig === undefined ? val : orig,
- idx = index,
- time = anim ? (val == o ? 0.1 : Math.abs((val - o) * 0.1)) : 0;
- // Set selected scroller value
- inst.temp[idx] = cell.attr('data-val');
-
- inst.scroll(t, idx, val, time, orig);
-
- setTimeout(function () {
- // Validate
- inst.validate(idx, dir, time, orig);
- }, 10);
- }
- function init(that, method, args) {
- if (methods[method]) {
- return methods[method].apply(that, Array.prototype.slice.call(args, 1));
- }
- if (typeof method === 'object') {
- return methods.init.call(that, method);
- }
- return that;
- }
- var scrollers = {},
- timer,
- empty = function () { },
- h,
- min,
- max,
- inst, // Current instance
- date = new Date(),
- uuid = date.getTime(),
- move,
- click,
- target,
- index,
- start,
- stop,
- startTime,
- pos,
- moved,
- scrollable,
- mod = document.createElement('modernizr').style,
- has3d = testProps(['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective']),
- prefix = testPrefix(),
- extend = $.extend,
- tap,
- touch,
- START_EVENT = 'touchstart mousedown',
- MOVE_EVENT = 'touchmove mousemove',
- END_EVENT = 'touchend mouseup',
- onMove = function (e) {
- if (scrollable) {
- e.preventDefault();
- stop = getCoord(e, 'Y');
- inst.scroll(target, index, constrain(pos + (start - stop) / h, min - 1, max + 1));
- }
- moved = true;
- },
- defaults = {
- // Options
- width: 70,
- height: 40,
- rows: 3,
- delay: 300,
- disabled: false,
- readonly: false,
- showOnFocus: true,
- showLabel: true,
- wheels: [],
- theme: '',
- headerText: '{value}',
- display: 'modal',
- mode: 'scroller',
- preset: '',
- lang: 'en-US',
- setText: 'Set',
- cancelText: 'Cancel',
- scrollLock: true,
- tap: true,
- formatResult: function (d) {
- return d.join(' ');
- },
- parseValue: function (value, inst) {
- var w = inst.settings.wheels,
- val = value.split(' '),
- ret = [],
- j = 0,
- i,
- l,
- v;
- for (i = 0; i < w.length; i++) {
- for (l in w[i]) {
- if (w[i][l][val[j]] !== undefined) {
- ret.push(val[j]);
- } else {
- for (v in w[i][l]) { // Select first value from wheel
- ret.push(v);
- break;
- }
- }
- j++;
- }
- }
- return ret;
- }
- },
- methods = {
- init: function (options) {
- if (options === undefined) {
- options = {};
- }
- return this.each(function () {
- if (!this.id) {
- uuid += 1;
- this.id = 'scoller' + uuid;
- }
- scrollers[this.id] = new Scroller(this, options);
- });
- },
- enable: function () {
- return this.each(function () {
- var inst = getInst(this);
- if (inst) {
- inst.enable();
- }
- });
- },
- disable: function () {
- return this.each(function () {
- var inst = getInst(this);
- if (inst) {
- inst.disable();
- }
- });
- },
- isDisabled: function () {
- var inst = getInst(this[0]);
- if (inst) {
- return inst.settings.disabled;
- }
- },
- isVisible: function () {
- var inst = getInst(this[0]);
- if (inst) {
- return inst.isVisible();
- }
- },
- option: function (option, value) {
- return this.each(function () {
- var inst = getInst(this);
- if (inst) {
- var obj = {};
- if (typeof option === 'object') {
- obj = option;
- } else {
- obj[option] = value;
- }
- inst.init(obj);
- }
- });
- },
- setValue: function (d, fill, time, temp) {
- return this.each(function () {
- var inst = getInst(this);
- if (inst) {
- inst.temp = d;
- inst.setValue(true, fill, time, temp);
- }
- });
- },
- getInst: function () {
- return getInst(this[0]);
- },
- getValue: function () {
- var inst = getInst(this[0]);
- if (inst) {
- return inst.values;
- }
- },
- getValues: function () {
- var inst = getInst(this[0]);
- if (inst) {
- return inst.getValues();
- }
- },
- show: function () {
- var inst = getInst(this[0]);
- if (inst) {
- return inst.show();
- }
- },
- hide: function () {
- return this.each(function () {
- var inst = getInst(this);
- if (inst) {
- inst.hide();
- }
- });
- },
- destroy: function () {
- return this.each(function () {
- var inst = getInst(this);
- if (inst) {
- inst.hide();
- $(this).unbind('.dw');
- delete scrollers[this.id];
- if ($(this).is('input')) {
- this.readOnly = bool($(this).data('dwro'));
- }
- }
- });
- }
- };
- $(document).bind(END_EVENT, function (e) {
- if (move) {
- var time = new Date() - startTime,
- val = constrain(pos + (start - stop) / h, min - 1, max + 1),
- speed,
- dist,
- tindex,
- ttop = target.offset().top;
-
- if (time < 300) {
- speed = (stop - start) / time;
- dist = (speed * speed) / (2 * 0.0006);
- if (stop - start < 0) {
- dist = -dist;
- }
- } else {
- dist = stop - start;
- }
-
- tindex = Math.round(pos - dist / h);
-
- if (!dist && !moved) { // this is a "tap"
- var idx = Math.floor((stop - ttop) / h),
- li = $('.dw-li', target).eq(idx),
- hl = scrollable;
-
- if (inst.trigger('onValueTap', [li]) !== false) {
- tindex = idx;
- } else {
- hl = true;
- }
-
- if (hl) {
- li.addClass('dw-hl'); // Highlight
- setTimeout(function () {
- li.removeClass('dw-hl');
- }, 200);
- }
- }
-
- if (scrollable) {
- calc(target, tindex, 0, true, Math.round(val));
- }
-
- move = false;
- target = null;
-
- $(document).unbind(MOVE_EVENT, onMove);
- }
- if (click) {
- clearInterval(timer);
- click = false;
- }
-
- $('.dwb-a').removeClass('dwb-a');
-
- }).bind('mouseover mouseup mousedown click', function (e) { // Prevent standard behaviour on body click
- if (tap) {
- e.stopPropagation();
- e.preventDefault();
- return false;
- }
- });
- $.fn.mobiscroll = function (method) {
- extend(this, $.mobiscroll.shorts);
- return init(this, method, arguments);
- };
- $.mobiscroll = $.mobiscroll || {
- /**
- * Set settings for all instances.
- * @param {Object} o - New default settings.
- */
- setDefaults: function (o) {
- extend(defaults, o);
- },
- presetShort: function (name) {
- this.shorts[name] = function (method) {
- return init(this, extend(method, { preset: name }), arguments);
- };
- },
- shorts: {},
- presets: {},
- themes: {},
- i18n: {}
- };
- $.scroller = $.scroller || $.mobiscroll;
- $.fn.scroller = $.fn.scroller || $.fn.mobiscroll;
- })(jQuery);
|