1 if(!dojo._hasResource["dojox.dtl.contrib.dijit"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
2 dojo._hasResource["dojox.dtl.contrib.dijit"] = true;
3 dojo.provide("dojox.dtl.contrib.dijit");
5 dojo.require("dojox.dtl.html");
6 dojo.require("dojo.parser");
10 var ddcd = dd.contrib.dijit;
12 ddcd.AttachNode = dojo.extend(function(keys, object){
14 this._object = object;
17 render: function(context, buffer){
19 this._rendered = true;
20 for(var i=0, key; key = this._keys[i]; i++){
21 context.getThis()[key] = this._object || buffer.getParent();
26 unrender: function(context, buffer){
28 this._rendered = false;
29 for(var i=0, key; key = this._keys[i]; i++){
30 if(context.getThis()[key] === (this._object || buffer.getParent())){
31 delete context.getThis()[key];
37 clone: function(buffer){
38 return new this.constructor(this._keys, this._object);
42 ddcd.EventNode = dojo.extend(function(command, obj){
43 this._command = command;
45 var type, events = command.split(/\s*,\s*/);
49 while(type = events.pop()){
52 if(type.indexOf(":") != -1){
53 // oh, if only JS had tuple assignment
54 var funcNameArr = type.split(":");
55 type = trim(funcNameArr[0]);
56 fn = trim(funcNameArr[1]);
75 // Make sure we kill the actual tags (onclick problems, etc)
77 render: function(context, buffer){
78 for(var i = 0, type; type = this._types[i]; i++){
79 if(!this._clear && !this._object){
80 buffer.getParent()[type] = null;
82 var fn = this._fns[i];
84 if(fn.indexOf(" ") != -1){
85 if(this._rendered[i]){
86 dojo.disconnect(this._rendered[i]);
87 this._rendered[i] = false;
89 args = dojo.map(fn.split(" ").slice(1), function(item){
90 return new dd._Filter(item).resolve(context);
94 if(!this._rendered[i]){
96 this._rendered[i] = buffer.addEvent(context, type, fn, args);
98 this._rendered[i] = dojo.connect(this._object, type, context.getThis(), fn);
106 unrender: function(context, buffer){
107 while(this._rendered.length){
108 dojo.disconnect(this._rendered.pop());
113 return new this.constructor(this._command, this._object);
117 function cloneNode(n1){
118 var n2 = n1.cloneNode(true);
120 dojo.query("script", n2).forEach("item.text = this[index].text;", dojo.query("script", n1));
125 ddcd.DojoTypeNode = dojo.extend(function(node, parsed){
127 this._parsed = parsed;
129 var events = node.getAttribute("dojoAttachEvent");
131 this._events = new ddcd.EventNode(dojo.trim(events));
133 var attach = node.getAttribute("dojoAttachPoint");
135 this._attach = new ddcd.AttachNode(dojo.trim(attach).split(/\s*,\s*/));
139 this._dijit = dojo.parser.instantiate([cloneNode(node)])[0];
141 node = cloneNode(node);
142 var old = ddcd.widgetsInTemplate;
143 ddcd.widgetsInTemplate = false;
144 this._template = new dd.HtmlTemplate(node);
145 ddcd.widgetsInTemplate = old;
149 render: function(context, buffer){
151 var _buffer = new dd.HtmlBuffer();
152 this._template.render(context, _buffer);
153 var root = cloneNode(_buffer.getRootNode());
154 var div = document.createElement("div");
155 div.appendChild(root);
156 var rendered = div.innerHTML;
157 div.removeChild(root);
158 if(rendered != this._rendered){
159 this._rendered = rendered;
161 this._dijit.destroyRecursive();
163 this._dijit = dojo.parser.instantiate([root])[0];
167 var node = this._dijit.domNode;
170 this._events._object = this._dijit;
171 this._events.render(context, buffer);
174 this._attach._object = this._dijit;
175 this._attach.render(context, buffer);
178 return buffer.concat(node);
180 unrender: function(context, buffer){
181 return buffer.remove(this._dijit.domNode);
184 return new this.constructor(this._node, this._parsed);
189 widgetsInTemplate: true,
190 dojoAttachPoint: function(parser, text){
191 return new ddcd.AttachNode(dojo.trim(text).slice(16).split(/\s*,\s*/));
193 dojoAttachEvent: function(parser, text){
194 return new ddcd.EventNode(text.slice(16));
196 dojoType: function(parser, text){
197 if(ddcd.widgetsInTemplate){
198 var node = parser.swallowNode();
200 if(text.slice(-7) == " parsed"){
202 node.setAttribute("dojoType", dojo.trim(text).slice(0, -7));
204 return new ddcd.DojoTypeNode(node, parsed);
208 on: function(parser, text){
209 // summary: Associates an event type to a function (on the current widget) by name
210 var parts = text.split(" ");
211 return new ddcd.EventNode(parts[0] + ":" + parts.slice(1).join(" "));
215 dd.register.tags("dojox.dtl.contrib", {
216 "dijit": ["attr:dojoType", "attr:dojoAttachPoint", ["attr:attach", "dojoAttachPoint"], "attr:dojoAttachEvent", [/(attr:)?on(click|key(up))/i, "on"]]