/*
* Created with Sublime Text 2.
* license: http://www.lovewebgames.com/jsmodule/index.html
* User: 田想兵
* Date: 2015-03-31
* Time: 09:49:11
* Contact: 55342775@qq.com
*/
;
(function(root, factory) {
//amd
if (typeof define === 'function' && define.amd) {
define(['$', 'dialog'], factory);
}else if (typeof define === 'function' && define.cmd) {
define(function(require, exports, module) {
var $ = require("$");
var Dialog=require("dialog");
return factory($,Dialog);
});
} else if (typeof exports === 'object') { //umd
module.exports = factory();
} else {
root.MobileSelectArea = factory(window.Zepto || window.jQuery || $);
}
})(this, function($, Dialog) {
var MobileSelectArea = function() {
var rnd = Math.random().toString().replace('.', '');
this.id = 'scroller_' + rnd;
this.scroller;
this.data;
this.index = 0;
this.value = [0, 0, 0];
this.oldvalue;
this.oldtext=[];
this.text = ['', '', ''];
this.level = 3;
this.mtop = 30;
this.separator = ' ';
};
MobileSelectArea.prototype = {
init: function(settings) {
this.settings = $.extend({
eventName: 'click'
}, settings);
this.trigger = $(this.settings.trigger);
this.settings.default == undefined ? this.default = 1 : this.default = 0; //0为空,1时默认选中第一项
level = parseInt(this.settings.level);
this.level = level > 0 ? level : 3;
this.trigger.attr("readonly", "readonly");
this.value = (this.settings.value && this.settings.value.split(",")) || [0, 0, 0];
this.text = this.settings.text || this.trigger.val().split(' ') || ['', '', ''];
this.oldvalue = this.value.concat([]);
this.oldtext = this.text.concat([]);
this.clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
this.clientWidth = document.documentElement.clientWidth || document.body.clientWidth;
// this.promise = this.getData();
this.bindEvent();
},
getData: function() {
var _this = this;
var dtd = $.Deferred();
if (typeof this.settings.data == "object") {
this.data = this.settings.data;
dtd.resolve();
} else {
$.ajax({
dataType: 'json',
cache: true,
url: this.settings.data,
type: 'GET',
success: function(result) {
_this.data = result.data;
dtd.resolve();
},
accepts: {
json: "application/json, text/javascript, */*; q=0.01"
}
});
}
return dtd;
},
bindEvent: function() {
var _this = this;
this.trigger[_this.settings.eventName](function(e) {
var dlgContent = '';
for (var i = 0; i < _this.level; i++) {
dlgContent += '
';
};
$.confirm('', null, function(t, c) {
if (t == "yes") {
_this.submit()
}
if (t == 'no') {
_this.cancel();
}
this.dispose();
}, {
width: 320,
height: 215
});
_this.scroller = $('#' + _this.id);
_this.getData().done(function() {
_this.format();
});
var start = 0,
end = 0
_this.scroller.children().bind('touchstart', function(e) {
start = (e.changedTouches || e.originalEvent.changedTouches)[0].pageY;
});
_this.scroller.children().bind('touchmove', function(e) {
end = (e.changedTouches || e.originalEvent.changedTouches)[0].pageY;
var diff = end - start;
var dl = $(e.target).parent();
if (dl[0].nodeName != "DL") {
return;
}
var top = parseInt(dl.css('top') || 0) + diff;
dl.css('top', top);
start = end;
return false;
});
_this.scroller.children().bind('touchend', function(e) {
end = (e.changedTouches || e.originalEvent.changedTouches)[0].pageY;
var diff = end - start;
var dl = $(e.target).parent();
if (dl[0].nodeName != "DL") {
return;
}
var i = $(dl.parent()).index();
var top = parseInt(dl.css('top') || 0) + diff;
if (top > _this.mtop) {
top = _this.mtop;
}
if (top < -$(dl).height() + 60) {
top = -$(dl).height() + 60;
}
var mod = top / _this.mtop;
var mode = Math.round(mod);
var index = Math.abs(mode) + 1;
if (mode == 1) {
index = 0;
}
_this.value[i] = $(dl.children().get(index)).attr('ref');
_this.value[i] == 0 ? _this.text[i] = "" : _this.text[i] = $(dl.children().get(index)).html();
for (var j = _this.level - 1; j > i; j--) {
_this.value[j] = 0;
_this.text[j] = "";
}
if (!$(dl.children().get(index)).hasClass('focus')) {
_this.format();
}
$(dl.children().get(index)).addClass('focus').siblings().removeClass('focus');
dl.css('top', mode * _this.mtop);
return false;
});
return false;
});
},
format: function() {
var _this = this;
var child = _this.scroller.children();
this.f(this.data);
// console.log(_this.text)
},
f: function(data) {
var _this = this;
var item = data;
if (!item) {
item = [];
};
var str = '- ——
';
var focus = 0,
childData, top = _this.mtop;
if (_this.index !== 0 && _this.value[_this.index - 1] == "0" && this.default == 0) {
str = '- ——
';
_this.value[_this.index] = 0;
_this.text[_this.index] = "";
focus = 0;
} else {
if (_this.value[_this.index] == "0") {
str = '- ——
';
focus = 0;
}
if (item.length > 0 && this.default == 1) {
str = '';
var pid = item[0].pid || 0;
var id = item[0].id || 0;
focus = item[0].id;
childData = item[0].child;
if (!_this.value[this.index]) {
_this.value[this.index] = id;
_this.text[this.index] = item[0].name;
}
str += '- ' + item[0].name + '
';
}
for (var j = _this.default, len = item.length; j < len; j++) {
var pid = item[j].pid || 0;
var id = item[j].id || 0;
var cls = '';
if (_this.value[_this.index] == id) {
cls = "focus";
focus = id;
childData = item[j].child;
top = _this.mtop * (-(j - _this.default));
};
str += '- ' + item[j].name + '
';
}
}
str += "
";
var newdom = $(str);
newdom.css('top', top);
var child = _this.scroller.children();
$(child[_this.index]).html(newdom);
_this.index++;
if (_this.index > _this.level - 1) {
_this.index = 0;
return;
}
_this.f(childData);
},
submit: function() {
this.oldvalue = this.value.concat([]);
this.oldtext = this.text.concat([]);
if (this.trigger[0].nodeType == 1) {
//input
this.trigger.val(this.text.join(this.separator));
this.trigger.attr('data-value', this.value.join(','));
}
this.trigger.next(':hidden').val(this.value.join(','));
this.settings.callback && this.settings.callback.call(this, this.scroller, this.text, this.value);
},
cancel: function() {
this.value = this.oldvalue.concat([]);
this.text = this.oldtext.concat([]);
}
};
return MobileSelectArea;
});