]> git.pond.sub.org Git - eow/blob - static/dojo-release-1.1.1/dojox/dtl/tests/html/util.js
b4efe5a7344d927530f668eb5fc77dde2daa7b99
[eow] / static / dojo-release-1.1.1 / dojox / dtl / tests / html / util.js
1 if(!dojo._hasResource["dojox.dtl.tests.html.util"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
2 dojo._hasResource["dojox.dtl.tests.html.util"] = true;
3 dojo.provide("dojox.dtl.tests.html.util");
4
5 dojo.require("dojox.dtl.html");
6 dojo.require("dojox.dtl.render.html");
7 dojo.require("dojox.string.Builder");
8
9 dojox.dtl.HtmlBuffer.prototype.onClone = function(from, to){
10         var clones = this._clones = this._clones || [];
11
12         for(var i = 0, group; group = clones[i]; i++){
13                 for(var j = 0, item; item = group[j]; j++){
14                         if(item === from){
15                                 group.push(to);
16                                 return
17                         }else if(item === to){
18                                 group.push(from);
19                                 return;
20                         }
21                 }
22         }
23
24         clones.push([from, to]);
25 }
26 dojox.dtl.HtmlBuffer.prototype.onAddEvent = function(node, type, description){
27         var events = this._events = this._events || [];
28
29         var found = false;
30         for(var i = 0, evt; evt = events[i]; i++){
31                 if(evt[0] === node){
32                         found = true;
33                         evt[1] = type;
34                         evt[2] = description;
35                 }
36         }
37
38         if(!found){
39                 events.push([node, type, description]);
40         }
41 }
42
43 dojox.dtl.tests.html.util.render = function(/*HtmlTemplate*/ template, /*Context*/ context) {
44         try {
45                 var div = document.createElement("div");
46                 dojo.style(div, "visibility", "hidden");
47                 var attach = document.createElement("div");
48                 div.appendChild(attach);
49                 dojo.body().appendChild(div);
50
51                 var buffer = template.getBuffer();
52                 var canvas = new dojox.dtl.render.html.Render(attach, template);
53                 canvas.render(context, template, buffer);
54                 var clones = buffer._clones;
55                 var events = buffer._events;
56
57                 var first = dojox.dtl.tests.html.util.serialize(canvas.domNode, template.tokens, clones, events).toString();
58
59                 buffer = template.getBuffer();
60                 buffer._clones = clones;
61                 buffer._events = events;
62                 canvas.render(context, template, buffer);
63
64                 var second = dojox.dtl.tests.html.util.serialize(canvas.domNode, template.tokens, clones, events).toString();
65
66                 doh.is("Compare re-render: " + first, "Compare re-render: " + second);
67                 return first;
68         }
69         catch(e){
70                 throw e;
71         }finally{
72                 div.parentNode.removeChild(div);
73         }
74 }
75
76 dojox.dtl.tests.html.util.serialize = function(node, tokens, clones, events, output) {
77         var types = dojox.dtl.html.types;
78         clones = clones || [];
79         events = events || [];
80
81         if (node.nodeType == 3) {
82                 output.append(node.nodeValue);
83         }else{
84                 var name = node.nodeName.toLowerCase();
85
86                 if (!output) {
87                         output = new dojox.string.Builder();
88                 }
89                 output.append("<").append(name);
90
91                 var attributes = dojo.filter(tokens, function(token){
92                         if(token[0] == types.attr){
93                                 for(var i = 0, group; group = clones[i]; i++){
94                                         // group is any set of nodes that were originally the sam
95                                         var count = 0;
96                                         for(var j = 0, item; item = group[j]; j++){
97                                                 if(item === token[1] || item === node){
98                                                         if(count++){
99                                                                 // This is entered when we have 2 hits within a clone group.
100                                                                 //              The first would be the original node
101                                                                 //              The second would be if our current node is a clone
102                                                                 //              of the original
103                                                                 return true;
104                                                         }
105                                                 }
106                                         }
107                                 }
108                         }
109                 });
110
111                 for(var i = 0, attribute; attribute = attributes[i]; i++){
112                         var value = "";
113                         if(attribute[2] == "class"){
114                                 value = node.className || value;
115                         }else if(attribute[2] == "for"){
116                                 value = node.htmlFor || value;
117                         }else if(node.getAttribute){
118                                 value = node.getAttribute(attribute[2], 2) || value;
119                                 if(dojo.isIE && (attribute[2] == "href" || attribute[2] == "src")){
120                                         if(dojo.isIE){
121                                                 var hash = location.href.lastIndexOf(location.hash);
122                                                 var href = location.href.substring(0, hash).split("/");
123                                                 href.pop();
124                                                 href = href.join("/") + "/";
125                                                 if(value.indexOf(href) == 0){
126                                                         value = value.replace(href, "");
127                                                 }
128                                                 value = decodeURIComponent(value);
129                                         }
130                                 }
131                         }
132                         if(value){
133                                 output.append(" ").append(attribute[2]).append('="').append(value.replace(/"/g, '\\"')).append('"');
134                         }
135                 }
136
137                 // Deal with events
138                 if(events){
139                         for(var i = 0, evt; evt = events[i]; i++){
140                                 if(evt[0] === node){
141                                         output.append(" ").append(evt[1]).append('="').append(evt[2]).append('"');
142                                 }
143                         }
144                 }
145
146                 if(!node.childNodes.length){
147                         output.append("/>");
148                 }else{
149                         output.append(">");
150                         dojo.forEach(node.childNodes, function(node){
151                                 dojox.dtl.tests.html.util.serialize(node, tokens, clones, events, output);
152                         });
153                         output.append("</").append(name).append(">");
154                 }
155
156                 return output;
157         }
158 }
159
160 }