gdoo/public/assets/js/listview.js

521 lines
15 KiB
JavaScript

(function(window) {
var calc = {
/**
* 人民币计算大写
* @param {type} currencyDigits
* @returns {String}
*/
'rmb': function(currencyDigits) {
// Constants:
var MAXIMUM_NUMBER = 99999999999.99;
// Predefine the radix characters and currency symbols for output:
var YUANCAPITAL = {
ZERO: "零",
ONE: "壹",
TWO: "贰",
THREE: "叁",
FOUR: "肆",
FIVE: "伍",
SIX: "陆",
SEVEN: "柒",
EIGHT: "捌",
NINE: "玖",
TEN: "拾",
HUNDRED: "佰",
THOUSAND: "仟",
TEN_THOUSAND: "万",
HUNDRED_MILLION: "亿",
DOLLAR: "元",
TEN_CENT: "角",
CENT: "分",
INTEGER: "整"
};
var CN_ZERO = YUANCAPITAL.ZERO;
var CN_ONE = YUANCAPITAL.ONE;
var CN_TWO = YUANCAPITAL.TWO;
var CN_THREE = YUANCAPITAL.THREE;
var CN_FOUR = YUANCAPITAL.FOUR;
var CN_FIVE = YUANCAPITAL.FIVE;
var CN_SIX = YUANCAPITAL.SIX;
var CN_SEVEN = YUANCAPITAL.SEVEN;
var CN_EIGHT = YUANCAPITAL.EIGHT;
var CN_NINE = YUANCAPITAL.NINE;
var CN_TEN = YUANCAPITAL.TEN;
var CN_HUNDRED = YUANCAPITAL.HUNDRED;
var CN_THOUSAND = YUANCAPITAL.THOUSAND;
var CN_TEN_THOUSAND = YUANCAPITAL.TEN_THOUSAND;
var CN_HUNDRED_MILLION = YUANCAPITAL.HUNDRED_MILLION;
var CN_DOLLAR = YUANCAPITAL.DOLLAR;
var CN_TEN_CENT = YUANCAPITAL.TEN_CENT;
var CN_CENT = YUANCAPITAL.CENT;
var CN_INTEGER = YUANCAPITAL.INTEGER;
// Variables:
var integral; // Represent integral part of digit number.
var decimal; // Represent decimal part of digit number.
var outputCharacters; // The output result.
var parts;
var digits, radices, bigRadices, decimals;
var zeroCount;
var i, p, d;
var quotient, modulus;
// Validate input string:
currencyDigits = currencyDigits.toString();
if (currencyDigits == "") {
return "";
}
if (currencyDigits.match(/[^,.\d]/) != null) {
return "";
}
if ((currencyDigits).match(/^((\d{1,3}(,\d{3})*(.((\d{3},)*\d{1,3}))?)|(\d+(.\d+)?))$/) == null) {
return "";
}
// Normalize the format of input digits:
currencyDigits = currencyDigits.replace(/,/g, ""); // Remove comma delimiters.
currencyDigits = currencyDigits.replace(/^0+/, ""); // Trim zeros at the beginning.
// Assert the number is not greater than the maximum number.
if (Number(currencyDigits) > MAXIMUM_NUMBER) {
return "";
}
// Process the coversion from currency digits to characters:
// Separate integral and decimal parts before processing coversion:
parts = currencyDigits.split(".");
if (parts.length > 1) {
integral = parts[0];
decimal = parts[1];
// Cut down redundant decimal digits that are after the second.
decimal = decimal.substr(0, 2);
}
else {
integral = parts[0];
decimal = "";
}
// Prepare the characters corresponding to the digits:
digits = new Array(CN_ZERO, CN_ONE, CN_TWO, CN_THREE, CN_FOUR, CN_FIVE, CN_SIX, CN_SEVEN, CN_EIGHT, CN_NINE);
radices = new Array("", CN_TEN, CN_HUNDRED, CN_THOUSAND);
bigRadices = new Array("", CN_TEN_THOUSAND, CN_HUNDRED_MILLION);
decimals = new Array(CN_TEN_CENT, CN_CENT);
// Start processing:
outputCharacters = "";
// Process integral part if it is larger than 0:
if (Number(integral) > 0) {
zeroCount = 0;
for (i = 0; i < integral.length; i++) {
p = integral.length - i - 1;
d = integral.substr(i, 1);
quotient = p / 4;
modulus = p % 4;
if (d == "0") {
zeroCount++;
}
else {
if (zeroCount > 0) {
outputCharacters += digits[0];
}
zeroCount = 0;
outputCharacters += digits[Number(d)] + radices[modulus];
}
if (modulus == 0 && zeroCount < 4) {
outputCharacters += bigRadices[quotient];
}
}
outputCharacters += CN_DOLLAR;
}
// Process decimal part if there is:
if (decimal != "") {
for (i = 0; i < decimal.length; i++) {
d = decimal.substr(i, 1);
if (d != "0") {
outputCharacters += digits[Number(d)] + decimals[i];
}
}
}
// Confirm and return the final output string:
if (outputCharacters == "") {
outputCharacters = CN_ZERO + CN_DOLLAR;
}
if (decimal == "") {
outputCharacters += CN_INTEGER;
}
//outputCharacters = CN_SYMBOL + outputCharacters;
return outputCharacters;
},
/**
* 最大值
* @returns {unresolved}
*/
'max': function() {
if (arguments.length == 0) {
return;
}
var maxNum = arguments[0];
for (var i = 0; i < arguments.length; i++) {
maxNum = Math.max(maxNum, arguments[i]);
}
return parseFloat(maxNum);
},
/**
* 最小值
* @returns {unresolved}
*/
'min': function() {
if (arguments.length == 0) {
return;
}
var minNum = arguments[0];
for (var i = 0; i < arguments.length; i++) {
minNum = Math.min(minNum, arguments[i]);
}
return parseFloat(minNum);
},
/**
* 平均值
* @returns {unresolved}
*/
'avg': function() {
var args = arguments,
len = args.length,
i = 0,
sum = 0;
for(; i < len && (sum += parseFloat(args[i])); i++ ){
}
return sum / len;
},
/**
* 取模运算
* @returns {String}
*/
'mod': function() {
if (arguments.length == 0) {
return;
}
var firstNum = arguments[0];
var secondNum = arguments[1];
var result = firstNum % secondNum;
result = isNaN(result) ? "" : parseFloat(result);
return result;
},
/**
* 绝对值
* @param {type} val
* @returns {@exp;Math@call;abs}
*/
'abs': function(val) {
return Math.abs(parseFloat(val));
},
/**
* 获取值
* @param {type} val
* @returns {@exp;Math@call;floor|Number}
*/
'val': function(val, prec) {
return (isNaN(val) || val === Infinity) ? 0 : val.toFixed(prec);
},
/**
* 天数计算
* @param {type} val
* @returns {Number|@exp;Math@call;floor}
*/
'day': function(val) {
return val == 0 ? 0 : Math.floor(val / 86400);
},
/**
* 小时
* @param {type} val
* @returns {@exp;Math@call;floor|Number}
*/
'hour': function(val) {
return val == 0 ? 0 : Math.floor(val / 3600);
},
/**
* 日期计算
* @param {type} val
* @returns {String}
*/
'date': function(val) {
var TIME = {
YEAR: "年",
HALFYEAR: "半年",
QUARTER: "季",
MONTH: "月",
WEEK: "周",
DAY: "天",
HOUR: "小时",
MIN: "分",
MINS: "分钟",
SEC: "秒",
SECS: "秒钟",
INVALID_DATE: "日期格式无效",
WEEKS: "星期",
WEEKDAYS: "日一二三四五六"
};
return (val >= 0) ? Math.floor(val / 86400) + TIME.DAY + Math.floor((val % 86400) / 3600) + TIME.HOUR + Math.floor((val % 3600) / 60) + TIME.MIN + Math.floor(val % 60) + TIME.SEC : TIME.INVALID_DATE; //'日期格式无效'
},
/**
* 列表控件计算
* @param {type} olist
* @param {type} col
* @returns {Number}
*/
'list': function(table_id, col) {
var output = 0;
var tbody = document.getElementById('body_' + table_id);
for (var i = 0; i < tbody.rows.length; i++) {
for (var j = 0; j < tbody.rows[i].cells.length; j++) {
if (j == col) {
var child = tbody.rows[i].cells[j].firstChild;
if (child && child.tagName) {
var val = child.value || child.innerText;
val = (val == "" || val.replace(/\s/g, '') == "") ? 0 : val;
val = (isNaN(val)) ? NaN : val;
output += parseFloat(val);
} else {
output += parseFloat(child.data);
}
}
}
}
return parseFloat(output);
},
/**
* 计算控件获取item的值
* @param {type} $item
* @returns {@exp;d@call;getTime|Number|@exp;document@call;getElementById}
*/
'getVal': function(id, type) {
var $item = $('#' + id);
if ($item.length == 0) {
return 0;
}
// $item.data('flag')
if (type == 'listview') {
return document.getElementById('lv_' + id);
} else if (type == 'date') {
var val = $('#' + id).val();
//var val = $item.parent().data("datetimepicker").getDate();
var d = new Date(val);
return d.getTime() / 1000;
} else {
var val = $item.val();
if (val == "") {
val = 0;
}
return val;
}
},
/**
数字合计
*/
sum: function() {
var args = [].slice.call(arguments, 0),
len, item, sum = 0;
for (len = args.length; len--;) {
item = parseFloat(args[len]);
// if item=>NaN
sum += (item === item ? item : 0);
}
return sum;
}
}
var listView = {
calc: calc,
field: {},
data: {},
total: {},
editor: function(key, i, j) {
var field = listView.field[key];
var type = field.type[j];
var size = field.size[j];
var css = field.checks[j] == 'SYS_NOT_NULL' ? 'input-required' : 'input-text';
var readonly = field.writes[j] == true ? false : true;
var value = '';
if(listView.data[key][i])
{
value = listView.data[key][i][j] == undefined ? '' : listView.data[key][i][j];
}
var name = key+'['+i+']['+j+']';
var id = key+'_'+i+'_'+j;
switch(type)
{
case "empty":
var out = '<span tyle="width:'+size+'px;" id="'+id+'"></span>';
break;
case "text":
var out = readonly == 0 ? '<input autocomplete="off" type="text" style="width:'+size+'px;" class="'+css+'" name="'+name+'" id="'+id+'" value="'+value+'">' : '<span id="'+id+'">'+value+'</span>';
break;
case "textarea":
var out = readonly == 0 ? '<textarea style="width:'+size+'px;" class="'+css+'" name="'+name+'" id="'+id+'">'+value+'</textarea>' : '<span id="'+id+'">'+value+'</span>';
break;
case "calc":
var out = readonly == 0 ? '<input type="text" style="width:'+size+'px;" class="readonly" name="'+name+'" id="'+id+'" value="'+value+'" readonly>' : '<span id="'+id+'">'+value+'</span>';
break;
case "select":
var option = field.value[j].split(',');
var r = [];
r.push('<select style=width:'+size+'px;" name="'+name+'" id="'+id+'">');
for (var i = 0; i < option.length; i++)
{
var selected = value == option[i] ? ' selected' : '';
r.push('<option value="'+option[i]+'"'+selected+'>'+option[i]+'</option>');
}
r.push('</select>');
out = readonly == 0 ? r.join("\n") : '<span id="'+id+'">'+value+'</span>';
break;
case "radio":
var option = field.value[j].split(',');
var r = [];
for (var i = 0; i < option.length; i++)
{
var checked = value == option[i] ? ' checked' : '';
r.push('<label class="checkbox"><input type="radio" name="'+name+'" id="'+id+'"'+checked+'>'+option[i]+'</label>');
}
out = readonly == 0 ? r.join("\n") : '<span id="'+id+'">'+value+'</span>';
break;
case "checkbox":
var option = field.value[j].split(',');
var r = [];
for (var i = 0; i < option.length; i++)
{
var checked = value == option[i] ? ' checked' : '';
r.push('<label class="checkbox"><input type="checkbox" name="'+name+'" id="'+id+'"'+checked+'>'+option[i]+'</label>');
}
out = readonly == 0 ? r.join("\n") : '<span id="'+id+'">'+value+'</span>';
break;
case "datetime":
out = readonly == 0 ? '<input autocomplete="off" type="text" style=width:'+size+'px;" onfocus="datePicker({dateFmt:\'yyyy-MM-dd\'});" class="'+css+' popDate" value="'+value+'" name="'+name+'" id="'+id+'">' : '<span id="'+id+'">'+value+'</span>';
break;
}
return out;
},
rowUpdate: function(obj)
{
var e = obj.target.id.split('_');
if (e.length == 4)
{
var key = e[0]+'_'+e[1];
listView.rowSum(key, e[2]);
listView.footerSum(key);
};
},
footerSum: function(key)
{
var body = document.getElementById('body_' + key);
var field = listView.field[key];
var sum = field.sum;
var readonly = field.readonly;
for (var i = 0; i < sum.length; i++)
{
if(sum[i] == true)
{
var row = 0;
for (var j = 0; j < body.rows.length; j++)
{
var td = body.rows[j].cells[i+1];
var value = field.readonly == 0 ? $(td).find('input,select').val() : $(td).find('span').text();
value = parseFloat(value);
row += isNaN(value) ? 0 : Math.round(parseFloat(value)*10000)/10000;
}
row = row.toFixed(2);
$('#total_'+key+'_'+i).html(row);
}
}
},
rowSum: function(key, j) {
var field = listView.field[key];
var type = field.type;
var value = field.value;
var readonly = field.readonly;
var calc = [];
for (var i = 0; i < type.length; i++) {
if(type[i] == 'calc') {
calc[i] = value[i];
for (var k = 0; k < type.length; k++) {
var n = k+1;
var td = $('#'+key+'_'+j+'_'+k);
var td_value = readonly== 0 ? td.val() : td.text();
calc[i] = calc[i].replace('['+n+']', parseFloat(td_value));
}
row = isNaN(eval(calc[i])) ? 0 : Math.round(parseFloat(eval(calc[i]))*10000)/10000;
row = row.toFixed(2);
var obj = $('#'+key+'_'+j+'_'+i);
readonly== 0 ? obj.val(row) : obj.text(row);
}
}
},
rowAdd: function(key)
{
i = listView.total[key];
var tr = [];
tr.push('<tr><td align="center">'+(i+1)+'</td>');
for (var j = 0; j < listView.field[key].type.length; j++)
{
tr.push('<td>'+listView.editor(key,i,j)+'</td>');
}
// 检查字段是否为只读
if (listView.field[key].readonly == 0) {
var option = i > 0 ? '<a class="option" href="javascript:;" onclick="listView.deleteRow(\''+key+'\',this);">删除</a>' : '<a class="option" onclick="listView.rowAdd(\''+key+'\');" href="javascript:;">添加</a>';
tr.push('<td align="center" style="white-space:nowrap;">'+option+'</td></tr>');
}
$('#body_'+key).append(tr.join("\n"));
// 累加行
listView.total[key]++;
},
deleteRow:function(key, obj) {
var tr = obj.parentNode.parentNode;
tr.parentNode.removeChild(tr);
// 总计列总数
listView.footerSum(key);
},
init:function(key) {
// 初始化列表视图
listView.total[key] = 0;
// 新建的时候默认显示一行
var length = listView.data[key].length > 0 ? listView.data[key].length : 1;
for (var i = 0; i < length; i++)
{
// 添加一行
listView.rowAdd(key);
// 计算小计行
listView.rowSum(key, i);
};
// 总计列总数
listView.footerSum(key);
}
}
window.listView = listView;
})(window);