var Checklist = Class.create(JSControl, { initialize: function($super, element, types, desc){ $super(element); this.setHandlers(); this.types = types; this.desc = desc; this.delimiter_ = this.element.getAttribute("delimiter") || ", "; this.update_table_ref(); }, update_table_ref: function(){ var table = null; for (var child = this.element.firstChild; child; child = child.nextSibling){ if (child.nodeType == Node.ELEMENT_NODE && Node.localName(child) == "table"){ table = child; break; } } if (table){ this.col_ = null; for (var child = table.firstChild; child; child = child.nextSibling){ if (child.nodeType == Node.ELEMENT_NODE && Node.localName(child) == "col"){ this.col_ = child; break; } } if (!this.col_ && table.firstChild) this.col_ = table.insertBefore(document.createElement("col"), table.firstChild); this.tbody_ = table.tBodies[0]; }else this.tbody_ = this.col_ = null; }, setHandlers: function(){ $A(this.element.elements).each(function(element){ Event.observe(element, "change", this.onchange.bind(this)); }, this); }, onchange: function($super){ delete this.value_; $super(); }, SetTabOrder: function(tabbase){ $A(this.element.elements).each(function(element){ element.tabIndex = tabbase++; }); return tabbase; }, serialize: function(obj){ while (obj instanceof Optional) obj = obj.Value(); return URLSerialize(obj); }, getval: function(element){ if (!element) return null; if (this.dynamic_) return URLRestore(element.getAttribute("full-value") || element.name); else{ var str = String(element.name); switch (this.element.getAttribute("key-type")){ case "int": return int(parseInt(str, 10)); case "int64": return int64(parseInt(str, 10)); case "string": default: return str; } } }, Value: function(){ if (this.value_) return this.value_; var result = []; var checked = $A(this.element.elements).findAll(function(element){ return element.checked; }); return checked.collect(this.getval, this); }, val2str: function(val){ if (this.dynamic_) return this.serialize(val); else{ if (val instanceof Optional) val = val.Value(); return String(val); } }, SetValue: function(array){ if (this.dynamic_ && !this.loaded_){ this.value_ = array; return; } this.element.reset(); if (Object.isString(array)) array = [array]; else if (!Object.isArray(array)) return; $A(array).each(function(obj){ var element = this.element.elements[this.val2str(obj)]; if (element) element.checked = true; }, this); if (["vo", "link"].indexOf(this.visibility_) != -1) this.reset_layout(this.get_cols(), this.visibility_); }, init_dynamic: function(apacket){ var data = apacket.Data(); if (data.length == 0) return; var val_colnam = this.element.getAttribute("key-column") || this.element.getAttribute("key") || ""; var lbl_colnam = this.element.getAttribute("show") || ""; var header = data.shift(); var val_col = -1; var lbl_col = -1; for (var iii = 0; iii < header.length; ++iii){ if (header[iii] == val_colnam) val_col = iii; if (header[iii] == lbl_colnam) lbl_col = iii; if (val_col >= 0 && lbl_col >= 0) break; } if (val_col < 0 || lbl_col < 0) return; this.loaded_ = true; var old_value = this.Value(); var desc = Object.clone(this.desc); desc["childNodes"] = $A(data).collect(function(row){ var val = this.serialize(row[val_col]); return {"nodeName": "st:item", "id": val, "value": val, "label": row[lbl_col], "full-value": URLSerialize(row[val_col])}; }, this); var aux = new Element("span"); aux.innerHTML = JSControl.TransformElementAndUnwrap(desc, this.types); Element.clear(this.element); for (var child = aux.firstChild; child; child = child.nextSibling) if (child.nodeType == Node.ELEMENT_NODE){ var scripts = String(child.innerHTML).extractScripts(); this.element.innerHTML = String(child.innerHTML).stripScripts(); try{ scripts.each(eval); }catch (err){ alert(["Checklist:", err.name, err.message].join("\n")); } break; } this.setHandlers(); this.SetValue(old_value); if (typeof this.value_ != "undefined") delete this.value_; this.update_table_ref(); if (this.visibility_ && ["yes", "no"].indexOf(this.visibility_) == -1) this.reset_layout(this.get_cols(), this.visibility_);//!!!!! }, clear: function(elem){ if (!elem) return; while (elem.firstChild) elem.removeChild(elem.firstChild); }, reset_layout: function(ncols, vis){ if ("no" == vis) return void Element.setStyle(this.element, {"display": "none"}); var chkbx = $A(this.element.elements); var items = chkbx.pluck("parentNode"); var vo = ["vo", "link"].indexOf(vis) != -1; for (var iii = 0; iii < chkbx.length; ++iii){ if (items[iii].parentNode) items[iii] = items[iii].parentNode.removeChild(items[iii]); chkbx[iii].disabled = "ro" == vis; Element.setStyle(items[iii], {"display": vo && !chkbx[iii].checked ? "none" : ""}); } if (isNaN(ncols) || ncols < 1){ this.clear(this.element); if (this.tbody_){ this.tbody_ = null; this.col_ = null; } var lastchecked = -1; for (var iii = chkbx.length - 1; iii >= 0; --iii) if (chkbx[iii].checked){ lastchecked = iii; break; } for (var iii = 0; iii < items.length; ++iii){ this.element.appendChild(items[iii]); if (vo && chkbx[iii].checked && iii < lastchecked) this.element.appendChild(document.createTextNode(this.delimiter_)); } }else{ if (!this.tbody_){ this.clear(this.element); var table = this.element.appendChild(document.createElement("table")); this.col_ = table.appendChild(document.createElement("col")); this.col_.width = "1*"; this.tbody_ = table.appendChild(document.createElement("tbody")); }else while (this.tbody_.rows.length > 0) this.tbody_.deleteRow(0); if (this.col_) this.col_.span = ncols; var tr = null; var td = null; var num = -1; for (var iii = 0; iii < items.length; ++iii){ if (Element.getStyle(items[iii], "display") != "none"){ ++num; if (num % ncols == 0) tr = this.tbody_.insertRow(-1); td = tr.insertCell(-1) }else if (!tr){ tr = this.tbody_.insertRow(-1); Element.setStyle(tr, {"display": "none"}); td = tr.insertCell(-1); } if (td) td.appendChild(items[iii]); else alert("no parent"); } } Element.setStyle(this.element, {"display": ""}); }, get_cols: function(){ var str = this.desc["cols"]; return str ? parseInt(str, 10) : 0; }, SetAttribute: function($super, nam, val){ switch (nam){ case "src": if (val == this.src_) break; this.src_ = val; this.dynamic_ = true; this.loaded_ = false; new ServerCall(val, null, { "onSuccess": this.init_dynamic, "thisObject": this }); break; case "visibility": if (!["yes", "ro", "vo", "link", "no"].include(val)) break; if (typeof this.visibility_ == "undefined") this.visibility_ = "yes"; if (this.visibility_ == val) break; this.visibility_ = val; Element.setStyle(this.element, {"display": val == "no" ? "none" : ""}); Element[val == "vo" || val == "link" ? "addClassName" : "removeClassName"](this.element, "VO"); Element[val == "link" ? "addClassName" : "removeClassName"](this.element, "Link"); if (val == "link"){ if (!this.link_click_handler_) this.link_click_handler_ = function(event){ new AEvent("CLICK", {}, this); }.bind(this); Event.observe(this.element, "click", this.link_click_handler_); }else if(this.link_click_handler_) Event.stopObserving(this.element, "click", this.link_click_handler_); this.reset_layout(this.get_cols(), this.visibility_); break; case "cols": if (this.desc[nam] == val) return; this.desc[nam] = val; this.element.setAttribute(nam, val); this.reset_layout(this.get_cols(), this.visibility_); break; case "delimiter": this.delimiter_ = val; break; default: $super(nam, val); } } });