define(function(require, exports, module) {
module.exports = {
init: function(DOM, opts) {
var opts = $.extend({
htmlTpl: '', //控件模板
selected: 0, //选中项ID
disableId: 0, //禁止ID加载
defaultText: false, //默认文本
firstText: false, //首个加载控件文本
script: '', //请求脚本地址
mapping: new Array(), //控件映射 [['province', '请选择省份...'], ['city', '请选择城市...']]
callback: function(el, data) {}, //回调方法
rootId: 0, //载入的根ID
limit: 0
}, opts);
var data = new Object();
var path = new Array();
//载入数据
$.getJSON(opts.script, function(result) {
data = result;
el = loadNote(opts.rootId, $(this));
if (opts.selected) {
//name转换成ID
if (!parseInt(opts.selected)) {
var sId = 0;
$.each(data, function(key, val) {
if (opts.selected.indexOf(val.name) >= 0) {
path = new Array();
parsePath(val.id);
path = path.reverse();
var str = '';
for(idx in path) {
str += path[idx].name;
}
if (opts.selected == str) {
sId = val.id;
}
}
});
opts.selected = sId;
}
path = new Array();
parsePath(opts.selected);
path = path.reverse();
for(idx in path) {
var id = path[idx].id;
if (id != opts.rootId) {
$('[value='+id+']', el).attr('selected', true);
if (opts.limit != 0 && idx > opts.limit) return false;
el = loadNote(id, el);
}
}
}
});
function parsePath(id) {
if (opts.rootId != id) {
$.each(data, function(key, val) {
if (id == val.id) {
path.push(val);
parsePath(val.parent_id);
}
});
}
}
function loadNote(id, obj) {
var extend = data[id];
var level = parseInt(extend ? extend.level : 1);
$(obj).nextAll().remove();
opts.callback(obj, extend ? extend : false);
if (opts.limit != 0 && level >= opts.limit+1) return false;
var mp = opts.mapping[level-1];
var el = $(opts.htmlTpl)
.data('level', level)
.change(function() {
if (!$(this).val()) return false;
loadNote($(this).val(), $(this));
});
el.appendTo(DOM);
if (opts.firstText && id == opts.rootId) {
el.empty();
$(el).append('');
} else if (opts.defaultText) {
el.empty();
var defText = opts.defaultText;
if (typeof(defText) == 'object') {
var defText = defText[level-1];
}
$(el).append('');
}
if (mp) {
if (typeof(mp) == 'object') {
el.attr('name', mp[0]);
if (mp[1]) {
el.empty();
el.append('');
}
} else {
el.attr('name', mp);
}
}
var find = false;
$.each(data, function(key, val) {
if (opts.disableId != val.id) {
if (val.parent_id == id) {
$(el).append('');
find = true;
}
}
});
if (!find) $(el).remove();
return el;
}
}
};
})