PATH:
home
/
letacommog
/
letaweb
/
scripts
var DbFilterEdit = function( options) { this.options = $.extend({}, DbFilterEdit.defaults, options); this.validate = function() { try { var rs = FilterLogicParser.parse( this.logicInput.val() ); return rs; } catch(e) { alert(e); return false; } }; this.getFilterList = function() { var rs = []; $('tbody tr', this.filterGrid).each(function() { var filterfunction = $.trim($('.filterfunction', this).val()); var fieldname = $('.fieldname', this).val(); var filtertype = $('.filtertype', this).val(); var value = $.trim( $('.value', this).val() ); var param = $.trim( $('.param', this).val() ); var dynamic = $('.dynamic', this)[0].checked; var a = { name:fieldname, type:filtertype, value: value, dynamic: dynamic}; if(filterfunction.length > 0) a.function = filterfunction; if(param.length > 0) a.param = param; rs.push( a ); }); return rs; }; this.getOrderList = function() { var rs = []; $('tbody tr', this.orderGrid).each(function() { var fieldname = $('.fieldname', this).val(); var ordertype = $('.ordertype', this).val(); rs.push( {name:fieldname, type:ordertype} ); }); return rs; }; this.getLogic = function() { return this.logicInput.val(); }; this.init = function() { var that = this; var div = $('<div id="ui_dbfilter_editor"/>'); div.html(this.options.content); this.element = div; Dialog.create(div, { fixHeight:true, title: t('LBL_DBFILTER_DIALOG_TITLE'), confirm: true, needvalidation:true, onOpen: function(element) { that.element = element; that.logicInput = $('input.logic', that.element); that.filterGrid = $('.grid', that.element); that.orderGrid = $('.ordergrid', that.element); if(that.options.addBtnClass) { $('.' + that.options.addBtnClass, that.element).click(function(event) { that.addNewRow(); }); } if(that.options.addOrderBtnClass) { $('.' + that.options.addOrderBtnClass, that.element).click(function(event) { that.addNewOrderRow(); }); } if(that.options.filterList) { for(var i = 0;i < that.options.filterList.length;i++) { that.addNewRow(that.options.filterList[i]); } } if(that.options.filterLogic) that.logicInput.val(that.options.filterLogic); if(that.options.orderList) { for(var i = 0;i < that.options.orderList.length;i++) { that.addNewOrderRow(that.options.orderList[i]); } } }, validate: function() { return that.validate(); }, onOK: function(element) { var v = that.validate(); if(v) { if(that.options.changed) that.options.changed(that.getFilterList(), that.getLogic(), that.getOrderList() ); } } }); }; this.addNewOrderRow = function(data) { var li = $(this.options.orderli); $('tbody', this.orderGrid).append(li); var that = this; PM.communication.getSchema(this.options.name, function(json) { if(!that.schema) that.schema = json; for(var i in json) { if(!json[i]) break; var opt = $('<option></option>'); $('select.fieldname', li).append(opt); opt.val(json[i].name); opt.html(json[i].title); } }); $('.delete', li).click(function(event) { event.preventDefault(); $(this).parent().parent().remove(); }); $('.dynamic', li).change(function(event) { event.preventDefault(); }); for(var i in this.options.order_type) { if(!this.options.field_type[i]) break; var opt = $('<option></option>'); $('select.ordertype', li).append(opt); opt.val(this.options.order_type[i]); opt.html(this.options.order_type[i]); } if(data) { $('select.fieldname', li).val(data.name); $('select.ordertype', li).val(data.type); } }; this.refreshRowIndex = function() { var index = 1; $('tbody tr', this.filterGrid).each(function() { $('.index', this).html(index); index++; }); }; this.changeFieldName = function(name, tr, value) { if(!this.schema) return; var id = false; for(var i = 0;i < this.schema.length;i++) { if(this.schema[i].name == name) { id = i; break; } } if(!id) return; var type = this.schema[id].type; var value_td = $('td.value_td', tr); value_td.html(''); switch(type) { case 'string': case 'integer': var inp = $(this.options.integer_value_input); value_td.append(inp); inp.val(value); break; case 'datetime': var inp = $(this.options.datetime_value_input); value_td.append(inp); inp.datepicker({dateFormat: t('mm/dd/yy')}); inp.val(value); break; case 'list': var list = $(this.options.list_value_input); for(var i = 0;i < this.schema[id].list.length;i++) { var op = $('<option></option>'); op.val(this.schema[id].list[i].value); op.html(this.schema[id].list[i].name); list.append(op); } value_td.append(list); list.val(value); break; case 'relation': var list = $(this.options.relation_value_input); var vf = this.schema[id].value_field; var nf = this.schema[id].display_field; PM.communication.getList(this.schema[id].table, {}, function(json) { for(var i = 0;i < json.length;i++) { var op = $('<option></option>'); op.val(json[i][vf]); op.html(json[i][nf]); list.append(op); } }); value_td.append(list); list.val(value); break; } }; this.changeFunction = function(name, tr) { }; this.changeDynamic = function(checked, tr) { var value_td = $('td.value_td', tr); var parameter_inp = $('input.param', tr); var inp = $('select, input', value_td); if(!checked) { inp.removeAttr('disabled'); parameter_inp.attr('disabled', 'disabled'); } else { inp.attr('disabled', 'disabled'); parameter_inp.removeAttr('disabled'); } }; this.addNewRow = function(data) { var tr = $(this.options.li); $('tbody', this.filterGrid).append(tr); var that = this; PM.communication.getSchema(this.options.name, function(json) { if(!that.schema) that.schema = json; for(var i in json) { if(!json[i]) break; var opt = $('<option></option>'); $('select.fieldname', tr).append(opt); opt.val(json[i].name); opt.html(json[i].title); } }); $('.delete', tr).click(function(event) { event.preventDefault(); $(this).parent().parent().remove(); that.refreshRowIndex(); }); $('select.fieldname', tr).change(function() { var name = $(this).val(); that.changeFieldName(name, tr); }); $('.dynamic', tr).change(function(event) { event.preventDefault(); that.changeDynamic(this.checked, tr); }); for(var i in this.options.functions) { if(!this.options.functions[i]) break; var opt = $('<option></option>'); $('select.filterfunction', tr).append(opt); opt.val(this.options.functions[i].name); opt.html(this.options.functions[i].name); } $('select.filterfunction', tr).change(function() { var name = $(this).val(); that.changeFunction(name, tr); }); for(var i in this.options.field_type) { if(!this.options.field_type[i]) break; var opt = $('<option></option>'); $('select.filtertype', tr).append(opt); opt.val(this.options.field_type[i]); opt.html(this.options.field_type[i]); } var index = tr.index() + 1; $('.index', tr).html(index); var logic = this.logicInput.val(); if(logic.length == 0) logic += '' + index; else logic += ' AND ' + index; this.logicInput.val(logic); if(data) { $('select.filterfunction', tr).val(data.function); $('select.fieldname', tr).val(data.name); $('select.filtertype', tr).val(data.type); $('input.value', tr).val(data.value); $('input.param', tr).val(data.param); if(data.dynamic || data.dynamic == 'true' || data.dynamic == 1) { $('.dynamic', tr)[0].checked = true; this.changeDynamic(true, tr); } else this.changeDynamic(false, tr); this.changeFieldName(data.name, tr, data.value); } else this.changeDynamic(false, tr); }; this.init(); }; DbFilterEdit.defaults = { content : '<div>' +'<div class="row-fluid">' + '<div class="block well filterEdit">' + '<div class="control-group">' + '<label class="control-label">' + t('LBL_FILTER_LOGIC') +'</label>' + '<div class="controls">' + '<input type="text" class="span12 logic" />' + '</div>' + '</div>' + '<div class="control-group">' + '<label class="control-label">' + t('LBL_FILTER_PARAMETERS') +'</label>' + '<div class="controls">' + '<table class="grid">' + '<thead>' + '<tr>' + '<th>' + 'Index' + '</th>' + '<th>' + 'Function' + '</th>' + '<th>' + 'Name' + '</th>' + '<th>' + 'Operator' + '</th>' + '<th class="value_th">' + 'Value' + '</th>' + '<th class="parameter_th">' + 'Parameter name' + '</th>' + '<th>' + 'Dynamic' + '</th>' + '</tr>' + '</thead>' + '<tbody>' + '</tbody>' + '</table>' + '<div class="controls">' + '<button class="btn add_btn">' + t('LBL_FILTER_ADD_PARAMETERS') + '</button>' + '</div>' + '</div>' + '</div>' + '<div class="control-group">' + '<label class="control-label">' + t('LBL_ORDER_PARAMETERS') + '</label>' + '<div class="controls">' + '<table class="ordergrid">' + '<thead>' + '<tr>' + '<th>' + 'Function' + '</th>' + '<th>' + 'Name' + '</th>' + '</tr>' + '</thead>' + '<tbody>' + '</tbody>' + '</table>' + '<div class="controls">' + '<button class="btn addorder_btn">' +t('LBL_ORDER_ADD_PARAMETERS') + '</button>' + '</div>' + '</div>' + '</div>' + '</div>' + '</div>' + '</div>', li: '<tr><td><span class="index"></span></td><td><select class="filterfunction"></select></td><td><select class="fieldname"></select></td><td><select class="filtertype"></select></td><td class="value_td"><input type="text" class="value"/></td><td><input type="text" class="param"/></td><td><input type="checkbox" class="dynamic"/></td><td><a href="#" class="delete"><i class="font-remove"></i></a></td></tr>', integer_value_input:'<input type="text" class="value"/>', datetime_value_input:'<input type="text" class="value"/>', list_value_input:'<select class="value"></select>', relation_value_input:'<select class="value"></select>', orderli:'<tr><td><select class="fieldname"></select></td><td><select class="ordertype"></select></td><td><a href="#" class="delete"><i class="font-remove"></i></a></td></tr>', addBtnClass: 'add_btn', addOrderBtnClass: 'addorder_btn', field_type: [ 'equal', 'not equal', 'less than', 'greater than', 'less or equal', 'greater or equal', 'contains', 'does not contain', 'starts with', ], functions: [ {name:' '}, {name: 'month',type:'datetime', returntype:'integer'}, {name: 'year',type:'datetime', returntype:'integer'}, {name: 'date',type:'datetime', returntype:'integer'}, ], order_type: [ 'acsending', 'descending', ], }; var FilterLogicParser = new function() { this.keywords = ['AND', 'OR']; this.isWhiteSpace = function (c) { return /\s/.test(c); }; this.parse = function(str) { var stack = new FilterLogicStack(); var tokens = this.tokenize(str); for(var i = 0;i < tokens.length;i++) { var pre; if(i > 0) pre = tokens[i - 1]; var next; if(i < tokens.length - 1) next = tokens[i + 1]; var rs = tokens[i].interpret(stack, next, pre); if(!rs) { throw 'Parse error:syntax error at column ' + i return false; } } return true; }; this.tokenize = function(str) { var tokens = []; var begin = new FilterLogicToken.tokens['begin']; var end = new FilterLogicToken.tokens['end']; tokens.push(begin); for(var i = 0;i < str.length;i++) { if( this.isWhiteSpace(str[i]) ){ continue} var rs = this.next(str, i); i = rs.index; if(!rs.token) throw 'Parse error:unexpected token at column ' + i ; else { tokens.push(rs.token); } } tokens.push(end); return tokens; }; this.next = function(str, i) { var rs = ''; while( !this.isWhiteSpace(str[i]) ) { var c = str[i]; if(!c) break; rs += c; if( this.getToken(rs) ) { var token = this.getToken(rs); break; } i++; } return {index:i, token:token}; } this.getToken = function(v) { for(var i in FilterLogicToken.tokens) { if(!FilterLogicToken.tokens[i]) continue; var t = new FilterLogicToken.tokens[i]; if(t.check(v)) return t; } }; }; FilterLogicStack = function() { this.arr = []; this.push = function(token) { this.arr.push(token); }; this.isEmpty = function() { return this.arr.length == 0; }; this.pop = function() { if(this.arr.length > 0) { var a = this.arr[this.arr.length - 1]; this.arr.splice(this.arr.length - 1, 1); return a; } }; this.peek = function() { return this.arr[this.arr.length - 1]; }; }; var FilterLogicToken = function() { this.check = function(v) { if( v.toUpperCase() == this.value.toUpperCase()) return true; return false; }; this.interpret = function() { return true; }; }; FilterLogicToken.register = function(name, value, base, prototype) { FilterLogicToken.tokens = FilterLogicToken.tokens || {}; FilterLogicToken.tokens[name] = function() { }; if(base == '') var baseClass = window.FilterLogicToken; else baseClass = FilterLogicToken.tokens[base]; var b = new baseClass(); FilterLogicToken.tokens[name].prototype = $.extend({}, b, {name:name, value:value}, prototype); }; FilterLogicToken.register('lbracket', '(', '', { interpret : function(stack, next, pre) { stack.push(this); if(pre.name == 'and' || pre.name == 'or') { return true; } if(pre.name == 'lbracket' || pre.name == 'begin') { return true; } return false; }, }); FilterLogicToken.register('rbracket', ')', '', { interpret : function(stack, next, pre) { stack.pop(); if(pre.name == 'integer') { return true; } if(pre.name == 'rbracket') { return true; } return false; }, }); FilterLogicToken.register('and', 'AND', '', { interpret : function(stack, next, pre) { if(pre.name == 'integer') { return true; } if(pre.name == 'lbracket') { return true; } return false; }, }); FilterLogicToken.register('or', 'OR', 'and' ); FilterLogicToken.register('begin', '', '', { check : function(v) { return false; }, }); FilterLogicToken.register('end', '', 'begin', { interpret : function(stack, next, pre) { if(pre.name == 'integer' || pre.name == 'rbracket') if(stack.isEmpty()) return true; return false; }, }); FilterLogicToken.register('integer', '', '', { check : function(v) { if(is_int(v) ) return true; return false; }, interpret : function(stack, next, pre) { if(pre.name == 'and' || pre.name == 'or') { return true; } if(pre.name == 'lbracket' || pre.name == 'begin') { return true; } return false; }, }); function is_int(value){ if((parseFloat(value) == parseInt(value)) && !isNaN(value)){ return true; } else { return false; } }
[+]
..
[+]
sample_images
[-] ssultils.js
[edit]
[-] dialog.js
[edit]
[-] colorpicker.js
[edit]
[-] script.js
[edit]
[+]
libraries
[-] ui.dbfilter-editing.js
[edit]
[-] stgrid.js
[edit]
[-] ui.category-editing.js
[edit]
[-] forms.js
[edit]
[-] player.swf
[edit]
[-] language.js
[edit]
[-] im.js
[edit]
[-] terms_en.js
[edit]
[-] skinutils.js
[edit]
[-] create_page.js
[edit]
[-] ihover.js
[edit]
[-] builder.js
[edit]
[-] ui.tab-content.js
[edit]
[-] admin.js
[edit]
[-] ui.tab-editing.js
[edit]
[-] login.js
[edit]
[-] popup.js
[edit]
[-] ecommerce.js
[edit]
[-] stEditor.js
[edit]
[-] colorutils.js
[edit]
[-] livedemo.js
[edit]
[-] palette.js
[edit]
[+]
editor