/*! jQuery Ctrl - v0.1.0-1 - 2014-08-01 * https://github.com/zengohm/jquery-ctrl * Copyright (c) 2014 Zeng Ohm; Licensed MIT */ (function (factory) { if (typeof define === 'function' && define.amd) { // AMD define(['jquery'], factory); } else if (typeof exports === 'object') { // CommonJS factory(require('jquery')); } else { // Browser globals factory(jQuery); } }(function ($) { var NODE_STATUS_NORMAL = 0; var NODE_STATUS_COVER = 1; var NODE_STATUS_LAST = 2; var bindingTypes = {}; var createCtrl = function(modelData,$element){ return { model:new ModelObject(modelData), ctrl: $element }; }; // Static method. $.ctrl = function (ctrlName, init) { var root = $('[jq-ctrl="' + ctrlName + '"]'); if(root.length===0){ return false; } var thisCtrl = {}; var modelData = { __refresh_binding__:function(){ if(thisCtrl && thisCtrl.onChangeTasks){ for(var i = 0;i'); var groupKey = Object.keys(list[g])[0]; $group.attr('label',groupKey); var subList = list[g][groupKey]; if(keyName === null){ for(var gi in subList){ $group.append(''); } }else{ for (var gk in subList) { $group.append(''); } } $(element).append($group); } }else{ if(keyName === null) { for(var i in list){ $(element).append(''); } }else{ for (var k in list) { $(element).append(''); } } } $(element).val(model.get(modelName)); }); onChangeTasks[onChangeTasks.length-1](null); $(element).removeAttr('jq-options'); return NODE_STATUS_COVER; }; bindingTypes.jqIf = function(element,model,onChangeTasks){ var query; if(typeof(element.getAttribute)!=='function' || !(query = element.getAttribute('jq-if'))){ return NODE_STATUS_NORMAL; } var startComment = document.createComment('jq-if '+query+' start'); var endComment = document.createComment('jq-if '+query+' end'); var parent = $(element).parent()[0]; parent.insertBefore(startComment,element); if(element.nextElementSibling){ parent.insertBefore(endComment,element.nextElementSibling); }else{ parent.appendChild(endComment); } var fun = new Function('model','with(model){return ' + query + ';}'); onChangeTasks.push(function(){ $(element).remove(null,true); if(fun(model.getData())){ $(element).insertAfter(startComment); } }); onChangeTasks[onChangeTasks.length-1](null); return NODE_STATUS_NORMAL; }; bindingTypes.jqEvent = function(element,model,onChangeTasks){ var types = ['click','keypress','keyup','keydown','dbclick','mousedown','mouseup','mouseover','mousemove','mouseout','change','submit']; var query; var action = function(scope,funName,params){ return function() { var rVal = model.get(funName).apply(scope, params); for (var i in onChangeTasks) { onChangeTasks[i](scope); } return rVal; }; }; for(var i in types) { var type = types[i]; if (element.getAttribute && (query = element.getAttribute('jq-' + type))) { var match = query.match(/^([\w\.]+)\((.*?)\)$/); var funName = match[1]; var params = eval('['+match[2]+']'); $(element).bind(type, action(this,funName,params)); } } return NODE_STATUS_NORMAL; }; var ModelObject = function(data){ if(typeof(data) === 'undefined' || !data){ data = {}; } var model = data; this.set = function(key,value){ var keys = key.split('.'); var lastKey = keys.pop(); var current = model; for(var i in keys){ if(typeof(current[keys[i]]) === 'undefined'){ current[keys[i]] = {}; } current = current[keys[i]]; } current[lastKey] = value; return value; }; this.get = function(key){ var keys = key.split('.'); var current = model; for(var i in keys){ current = current[keys[i]]; if(typeof(current)==='undefined'){ return null; } } return current; }; this.subModel = function(key){ return new ModelObject(this.get(key)); }; this.getData = function(){ return model; }; this.clone = function(){ return new ModelObject($.extend(true,{},model)); }; }; }));