(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 = ''; break; case "text": var out = readonly == 0 ? '' : ''+value+''; break; case "textarea": var out = readonly == 0 ? '' : ''+value+''; break; case "calc": var out = readonly == 0 ? '' : ''+value+''; break; case "select": var option = field.value[j].split(','); var r = []; r.push(''); out = readonly == 0 ? r.join("\n") : ''+value+''; 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(''); } out = readonly == 0 ? r.join("\n") : ''+value+''; 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(''); } out = readonly == 0 ? r.join("\n") : ''+value+''; break; case "datetime": out = readonly == 0 ? '' : ''+value+''; 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('