(function ($) {
DataObject = Object.subClass({
init: function(data) {
this.record = data || {};
this.old = {};
this.changed = false;
Object.call(this, {});
},
setValue: function(prop, value) {
this.record[prop] = value;
if (this.old[prop] != this.record[prop]) {
this.changed = true;
}
if (this.onDataChange) {
this.onDataChange();
}
},
getValue: function(prop) {
return this.record[prop];
},
valueChanged: function(prop) {
return this.old[prop] != this.record[prop];
},
commit: function() {
this.old = $.extend({}, this.record);
this.changed = false;
}
});
Card = $.fm.Card = Control.subClass({
template: [
'
'
],
template_title: [
'',
'',
'',
' | ',
'
'
],
template_line: '
',
template_line_validate: ' |
',
template_key: ' | ',
template_value: [
'',
'',
' | '
],
template_validate: ' | ',
template_editor: '',
template_select: '',
template_select_option: '',
init: function(options) {
this.linkElement = null;
this.editClasss = ["input", "textarea"];
this.editable = false;
this.columns = [];
this.editors = {};
this.tiptype = 2;
this.columnCount = 1;
this.cellCount = 0;
this.columnPosition = 0;
this.currentLine = null;
this.dataObject = new DataObject();
Control.call(this, options);
this.createElements();
if (this.linkElement) {
this.collectElements();
}
if (this.url) {
var me = this;
Server.getData(this.url, function(data) {
Loading.hide();
if (me.onGetData) {
data = me.onGetData(data);
}
me.setData(data);
});
}
else if (this.data) {
this.setData(this.data);
}
},
createElements: function() {
var me = this;
this.canvas.addClass("datacard");
var body = this.body = $(this.template.join(""));
this.columnCount > 1 ? (this.cellCount = this.columnCount * 2) : (this.cellCount = 3);
if (this.columnCount > 1) {
var validateLine = $(this.template_line_validate);
$("#cell", validateLine).attr("colspan", this.cellCount);
this.body.append(validateLine);
}
var tableLine = null;
for (var i = 0; i < this.columns.length; i++) {
var column = this.columns[i];
column.index = i;
column.span = column.span || 1;
tableLine = this.createOneColumn(tableLine, column);
}
if (this.columnPosition > 0 && this.columnPosition < this.columnCount) {
for (var i = this.columnPosition; i <= this.columnCount; i++) {
var column = {span: 1};
tableLine = this.createOneColumn(tableLine, column);
}
}
if(body.Validform) {
body.Validform({
tiptype: this.tiptype
});
}
this.canvas.append(body);
},
createOneColumn: function(tableLine, column) {
var me = this;
//1. create title
if (column.group) {
var title = $(this.template_title.join(""));
$("#lbl_title", title).html(column.group);
$("#title_body", title).attr("colspan", this.cellCount);
this.body.append(title);
this.columnPosition = 0;
}
//2. create row
if ((this.columnPosition == 0) || (this.columnPosition >= this.columnCount)) {
tableLine = this.currentLine = $(this.template_line);
tableLine.cells = [];
this.body.append(tableLine);
this.columnPosition = 0;
}
//2. create column
var cell = {};
tableLine.cells.push(cell);
//2.1
cell.key = $(this.template_key);
if (column.caption) {
cell.key.html(column.caption);
}
tableLine.append(cell.key);
//2.2
var content = $(this.template_value.join(""));
cell.value = $("#value", content);
cell.validator = $("#validator", content);
cell.validator.click(function() {
var el = $(this);
var message = $(".Validform_checktip", el);
if(message.html() != null && message.html() != "") {
alert(message.html());
}
});
if (column.span > 1) {
content.attr("colspan", column.span * 2 - 1);
}
this.columnPosition = this.columnPosition + column.span;
if (column.field) {
var editor = ControlCreator.create(column, this);
editor.onValueChange = function() {
if (me.onValueChange) {
me.onValueChange.call(me);
}
}
this.editors[column.field] = editor;
}
editor.appendTo(cell.value);
tableLine.append(content);
return tableLine;
},
collectElements: function() {
var linkElement = this.getEl(this.linkElement);
if (!linkElement) return;
for (var no in this.editClasss) {
var editClass = this.editClasss[no];
var valueEl = $(editClass, linkElement);
this.linkTo(valueEl, this.editors);
}
var valueEl = $("select", linkElement);
this.linkTo(valueEl, this.editors);
var valueEl = $("label", linkElement);
this.linkTo(valueEl, this.editors);
var valueEl = $("div", linkElement);
this.linkTo(valueEl, this.editors);
var valueEl = $("img", linkElement);
this.linkTo(valueEl, this.editors);
},
linkTo: function(valueEl, link) {
for (var i = 0; i < valueEl.length; i++) {
var item = $(valueEl.get(i));
var fieldname = item.attr("field");
if (!fieldname) { fieldname = item.attr("name")}
if (fieldname) {
fieldname = fieldname.toLowerCase();
link[fieldname] = item;
}
}
},
setData: function(line) {
var dataObject = this.dataObject;
dataObject.record = line;
dataObject.old = $.extend({}, line);
dataObject.changed = false;
// console.log(JSON.stringify(line));
for (var prop in line) {
var editor = this.editors[prop];
if (editor) {
editor.setValue ? editor.setValue(line[prop]) : editor.val(line[prop]);
}
}
},
setValue: function(field, value) {
var dataObject = this.dataObject;
var oldValue = dataObject.getValue(field);
if (oldValue == value) {
return;
}
dataObject.setValue(field, value);
var editor = this.editors[field];
if (editor) {
editor.setValue ? editor.setValue(value) : editor.val(value);
}
if (this.onValueChange) {
this.onValueChange();
}
},
getData: function() {
var record = this.dataObject.record, old = this.dataObject.old;
for (var prop in this.editors) {
var editor = this.editors[prop];
record[prop] = editor.getValue ? editor.getValue() : editor.val();
}
for (var prop in record) {
if (old[prop] != record[prop]) {
this.dataObject.changed = true;
break;
}
}
return this.dataObject;
},
commit: function() {
this.dataObject.commit();
},
getEditByField: function(field) {
return this.editors[field];
},
setReadOnly: function(prop, value) {
if (typeof prop == "string") {
var editor = this.editors[prop];
editor.setReadOnly(value);
}
else {
value = prop;
for (var prop in this.editors) {
var editor = this.editors[prop];
editor.setReadOnly(value);
}
}
},
notify: function(event) {
var column = this.columns[event.senderKey];
if (!column) {
return;
}
var reciver = column[event.name];
if (reciver) {
reciver(event.newValue, event.record, column, this);
}
},
empty: function() {
this.canvas.empty();
}
});
})(jQuery);