1
var webdeveloper_elementInformationBlockSelected = false;
2
var webdeveloper_informationElement = null;
4
// Creates the element information block
5
function webdeveloper_createElementInformationBlock(ownerDocument)
7
var definitionElement = ownerDocument.createElement("dd");
8
var divElement = ownerDocument.createElement("div");
9
var headerElement = ownerDocument.createElement("h2");
10
var listElement = ownerDocument.createElement("dl");
11
var stringBundle = document.getElementById("webdeveloper-string-bundle");
12
var termElement = ownerDocument.createElement("dt");
14
headerElement.addEventListener("mousedown", webdeveloper_selectElementInformation, false);
15
headerElement.addEventListener("mouseup", webdeveloper_deselectElementInformation, false);
16
headerElement.appendChild(ownerDocument.createTextNode(stringBundle.getString("webdeveloper_elementInformation")));
17
divElement.appendChild(headerElement);
19
termElement.addEventListener("click", webdeveloper_toggleElementInformationBlock, false);
20
termElement.appendChild(ownerDocument.createTextNode(stringBundle.getString("webdeveloper_attributes")));
21
definitionElement.setAttribute("id", "webdeveloper-element-information-attributes");
22
listElement.appendChild(termElement);
23
listElement.appendChild(definitionElement);
24
divElement.appendChild(listElement);
26
definitionElement = ownerDocument.createElement("dd");
27
listElement = ownerDocument.createElement("dl");
28
termElement = ownerDocument.createElement("dt");
30
termElement.addEventListener("click", webdeveloper_toggleElementInformationBlock, false);
31
termElement.appendChild(ownerDocument.createTextNode(stringBundle.getString("webdeveloper_position")));
32
definitionElement.setAttribute("id", "webdeveloper-element-information-position");
33
listElement.appendChild(termElement);
34
listElement.appendChild(definitionElement);
35
divElement.appendChild(listElement);
37
definitionElement = ownerDocument.createElement("dd");
38
listElement = ownerDocument.createElement("dl");
39
termElement = ownerDocument.createElement("dt");
41
termElement.addEventListener("click", webdeveloper_toggleElementInformationBlock, false);
42
termElement.appendChild(ownerDocument.createTextNode(stringBundle.getString("webdeveloper_other")));
43
definitionElement.setAttribute("id", "webdeveloper-element-information-other");
44
listElement.appendChild(termElement);
45
listElement.appendChild(definitionElement);
46
divElement.appendChild(listElement);
48
definitionElement = ownerDocument.createElement("dd");
49
listElement = ownerDocument.createElement("dl");
50
termElement = ownerDocument.createElement("dt");
52
termElement.addEventListener("click", webdeveloper_toggleElementInformationBlock, false);
53
termElement.appendChild(ownerDocument.createTextNode(stringBundle.getString("webdeveloper_ancestors")));
54
definitionElement.setAttribute("id", "webdeveloper-element-information-ancestors");
55
listElement.appendChild(termElement);
56
listElement.appendChild(definitionElement);
57
divElement.appendChild(listElement);
59
definitionElement = ownerDocument.createElement("dd");
60
listElement = ownerDocument.createElement("dl");
61
termElement = ownerDocument.createElement("dt");
63
termElement.addEventListener("click", webdeveloper_toggleElementInformationBlock, false);
64
termElement.appendChild(ownerDocument.createTextNode(stringBundle.getString("webdeveloper_children")));
65
definitionElement.setAttribute("id", "webdeveloper-element-information-children");
66
listElement.appendChild(termElement);
67
listElement.appendChild(definitionElement);
68
divElement.appendChild(listElement);
70
divElement.setAttribute("id", "webdeveloper-element-information");
71
webdeveloper_getDocumentBodyElement(ownerDocument).appendChild(divElement);
74
// Called when the element information is deselected
75
function webdeveloper_deselectElementInformation(event)
77
webdeveloper_elementInformationBlockSelected = false;
80
// Displays information about the element
81
function webdeveloper_displayElementInformation(element)
84
var contentDocument = webdeveloper_getContentDocument();
85
var contentWindow = webdeveloper_getContentWindow();
86
var divElement = null;
87
var documentList = webdeveloper_getDocuments(contentWindow);
88
var documentLength = documentList.length;
89
var leftOffset = contentWindow.pageXOffset;
90
var pageDocument = null;
91
var topOffset = contentWindow.pageYOffset;
93
// If the element is set
96
checked = webdeveloper_convertToBoolean(element.getAttribute("checked"));
100
var currentDocument = contentWindow.document;
102
element = document.getElementById("webdeveloper-display-element-information-menu");
104
// If the display element information element is set
105
if(currentDocument.getElementById("webdeveloper-display-element-information"))
110
webdeveloper_configureElement(element, "checked", checked);
113
webdeveloper_configureElement(document.getElementById("webdeveloper-information-text-toolbar"), "hidden", !checked);
115
// Loop through the documents
116
for(var i = 0; i < documentLength; i++)
118
pageDocument = documentList[i];
120
// If displaying element information
123
webdeveloper_createElementInformationBlock(pageDocument);
125
// If this is the content document
126
if(pageDocument == contentDocument)
128
divElement = pageDocument.getElementById("webdeveloper-element-information");
130
// If the div element was found
133
divElement.style.left = (leftOffset + 5) + "px";
134
divElement.style.top = (topOffset + 5) + "px";
138
pageDocument.addEventListener("click", webdeveloper_displayElementInformationForElement, true);
139
//pageDocument.addEventListener("keypress", webdeveloper_displayElementInformationKeyPress, false);
140
pageDocument.addEventListener("mousemove", webdeveloper_displayElementInformationMouseMove, false);
141
pageDocument.addEventListener("mouseover", webdeveloper_displayElementInformationMouseOver, false);
145
divElement = pageDocument.getElementById("webdeveloper-element-information");
147
// Try to remove the event listener
150
pageDocument.removeEventListener("click", webdeveloper_displayElementInformationForElement, true);
158
// Try to remove the event listener
161
pageDocument.removeEventListener("keypress", webdeveloper_displayElementInformationKeyPress, false);
169
// Try to remove the event listener
172
pageDocument.removeEventListener("mousemove", webdeveloper_displayElementInformationMouseMove, false);
179
// Try to remove the event listener
182
pageDocument.removeEventListener("mouseover", webdeveloper_displayElementInformationMouseOver, false);
189
webdeveloper_removeElement(divElement);
190
webdeveloper_removeElementOutline(webdeveloper_informationElement);
194
// If not displaying element information
197
webdeveloper_elementInformationBlockSelected = false;
198
webdeveloper_informationElement = null;
201
webdeveloper_toggleStyleSheet(element, "chrome://webdeveloper/content/stylesheets/display_element_information.css", "webdeveloper-display-element-information");
204
// Displays information about the specific element
205
function webdeveloper_displayElementInformationForElement(event)
207
var element = event.target;
209
// If the element is set
212
var elementName = element.tagName;
213
var ownerDocument = element.ownerDocument;
215
// If the element has a name and it is not scrollbar and it has an owner document
216
if(elementName && elementName != "scrollbar" && ownerDocument)
218
var divElement = ownerDocument.getElementById("webdeveloper-element-information");
220
// If the div element was found
223
// If the element is not the div element and the div element is not an ancestor of the element
224
if(element != divElement && !webdeveloper_isAncestor(element, divElement))
226
var definitionElement = ownerDocument.getElementById("webdeveloper-element-information-attributes");
227
var headerElements = divElement.getElementsByTagName("h2");
228
var outlineElement = null;
230
var stringBundle = document.getElementById("webdeveloper-string-bundle");
231
var tableElement = null;
232
var tableCellElement = null;
233
var tableRowElement = null;
235
webdeveloper_removeElementOutline(element);
237
// If header elements were found
238
if(headerElements.length > 0)
240
var headerElement = headerElements[0];
242
// If the header element is set
245
webdeveloper_removeAllChildElements(headerElement);
247
headerElement.appendChild(ownerDocument.createTextNode(webdeveloper_getElementDescription(element)));
251
// If the definition element is set
252
if(definitionElement)
254
var elementAttribute = null;
255
var elementAttributes = element.attributes;
256
var elementAttributesLength = elementAttributes.length;
258
webdeveloper_removeAllChildElements(definitionElement);
260
// If there are no attributes
261
if(elementAttributesLength == 0)
263
definitionElement.appendChild(ownerDocument.createTextNode(stringBundle.getString("webdeveloper_none")));
267
// Loop through the attributes
268
for(var i = 0; i < elementAttributesLength; i++)
270
elementAttribute = elementAttributes[i];
271
pElement = ownerDocument.createElement("p");
273
pElement.appendChild(ownerDocument.createTextNode(elementAttribute.name + " = " + elementAttribute.value));
274
definitionElement.appendChild(pElement);
279
definitionElement = ownerDocument.getElementById("webdeveloper-element-information-position");
281
// If the definition element is set
282
if(definitionElement)
284
tableElement = ownerDocument.createElement("table");
285
tableCellElement = ownerDocument.createElement("td");
286
tableRowElement = ownerDocument.createElement("tr");
288
webdeveloper_removeAllChildElements(definitionElement);
290
tableCellElement.appendChild(ownerDocument.createTextNode(stringBundle.getString("webdeveloper_left") + ": " + webdeveloper_getElementPositionX(element) + "px"));
291
tableRowElement.appendChild(tableCellElement);
293
tableCellElement = ownerDocument.createElement("td");
294
tableCellElement.appendChild(ownerDocument.createTextNode(stringBundle.getString("webdeveloper_top") + ": " + webdeveloper_getElementPositionY(element) + "px"));
295
tableRowElement.appendChild(tableCellElement);
296
tableElement.appendChild(tableRowElement);
298
tableCellElement = ownerDocument.createElement("td");
299
tableRowElement = ownerDocument.createElement("tr");
300
tableCellElement.appendChild(ownerDocument.createTextNode(stringBundle.getString("webdeveloper_width") + ": " + element.clientWidth + "px"));
301
tableRowElement.appendChild(tableCellElement);
303
tableCellElement = ownerDocument.createElement("td");
304
tableCellElement.appendChild(ownerDocument.createTextNode(stringBundle.getString("webdeveloper_height") + ": " + element.clientHeight + "px"));
305
tableRowElement.appendChild(tableCellElement);
306
tableElement.appendChild(tableRowElement);
307
definitionElement.appendChild(tableElement);
310
definitionElement = ownerDocument.getElementById("webdeveloper-element-information-other");
312
// If the definition element is set
313
if(definitionElement)
315
var fontFamily = element.ownerDocument.defaultView.getComputedStyle(element, null).getPropertyCSSValue("font-family");
316
var fontSize = element.ownerDocument.defaultView.getComputedStyle(element, null).getPropertyCSSValue("font-size");
318
tableElement = ownerDocument.createElement("table");
320
webdeveloper_removeAllChildElements(definitionElement);
322
// If this element has a font family
325
tableCellElement = ownerDocument.createElement("td");
326
tableRowElement = ownerDocument.createElement("tr");
327
tableCellElement.appendChild(ownerDocument.createTextNode(stringBundle.getString("webdeveloper_fontFamily") + ":"));
328
tableRowElement.appendChild(tableCellElement);
330
tableCellElement = ownerDocument.createElement("td");
331
tableCellElement.appendChild(ownerDocument.createTextNode(fontFamily.cssText));
332
tableRowElement.appendChild(tableCellElement);
333
tableElement.appendChild(tableRowElement);
336
// If this element has a font size
339
tableCellElement = ownerDocument.createElement("td");
340
tableRowElement = ownerDocument.createElement("tr");
341
tableCellElement.appendChild(ownerDocument.createTextNode(stringBundle.getString("webdeveloper_fontSize") + ":"));
342
tableRowElement.appendChild(tableCellElement);
344
tableCellElement = ownerDocument.createElement("td");
345
tableCellElement.appendChild(ownerDocument.createTextNode(fontSize.cssText));
346
tableRowElement.appendChild(tableCellElement);
347
tableElement.appendChild(tableRowElement);
350
// If the table has child nodes
351
if(tableElement.hasChildNodes())
353
definitionElement.appendChild(tableElement);
357
definitionElement = ownerDocument.getElementById("webdeveloper-element-information-ancestors");
359
// If the definition element is set
360
if(definitionElement)
362
var ancestorList = webdeveloper_getElementAncestors(element);
363
var ancestorLength = ancestorList.length;
365
webdeveloper_removeAllChildElements(definitionElement);
367
// If there are no ancestors
368
if(ancestorLength == 0)
370
definitionElement.appendChild(ownerDocument.createTextNode(stringBundle.getString("webdeveloper_none")));
374
// Loop through the ancestors
375
for(i = 0; i < ancestorLength; i++)
377
pElement = ownerDocument.createElement("p");
379
pElement.appendChild(ownerDocument.createTextNode(webdeveloper_getElementDescription(ancestorList[i])));
380
definitionElement.appendChild(pElement);
385
definitionElement = ownerDocument.getElementById("webdeveloper-element-information-children");
387
// If the definition element is set
388
if(definitionElement)
390
var children = webdeveloper_getElementChildren(element);
391
var childLength = children.length;
393
webdeveloper_removeAllChildElements(definitionElement);
395
// If there are no children
398
definitionElement.appendChild(ownerDocument.createTextNode(stringBundle.getString("webdeveloper_none")));
402
// Loop through the children
403
for(i = 0; i < childLength; i++)
405
pElement = ownerDocument.createElement("p");
407
pElement.appendChild(ownerDocument.createTextNode(webdeveloper_getElementDescription(children[i])));
408
definitionElement.appendChild(pElement);
413
element.style.MozOutline = "1px solid #ff0000";
415
// Force the style sheet to refresh
416
divElement.setAttribute("class", "force-width");
417
divElement.removeAttribute("class");
419
event.stopPropagation();
420
event.preventDefault();
427
// Keypress event for display element information
428
function webdeveloper_displayElementInformationKeyPress(event)
430
webdeveloper_copyElementAncestors(event);
433
// Move event for display element information
434
function webdeveloper_displayElementInformationMouseMove(event)
436
// If the element information block is selected
437
if(webdeveloper_elementInformationBlockSelected)
439
webdeveloper_moveElementInformationBlock(event);
443
var element = event.target;
445
// If the element is set
448
var ownerDocument = element.ownerDocument;
450
// If the owner document is set
453
var divElement = ownerDocument.getElementById("webdeveloper-element-information");
455
// If the div element was found
458
// If the element is not the div element and the div element is not an ancestor of the element
459
if(element != divElement && !webdeveloper_isAncestor(element, divElement))
461
var outlineElement = webdeveloper_addElementOutline(event, webdeveloper_informationElement);
463
// If the outline element is set
466
webdeveloper_informationElement = outlineElement;
476
// Mouseover event for display element information
477
function webdeveloper_displayElementInformationMouseOver(event)
479
var element = event.target;
481
// If the element is set
484
var ownerDocument = element.ownerDocument;
486
// If the owner document is set
489
var divElement = ownerDocument.getElementById("webdeveloper-element-information");
491
// If the div element was found
494
// If the element is not the div element and the div element is not an ancestor of the element
495
if(element != divElement && !webdeveloper_isAncestor(element, divElement))
497
webdeveloper_displayElementAncestors(event);
505
// Move the element information block
506
function webdeveloper_moveElementInformationBlock(event)
508
var element = event.target;
510
// If the element is set
513
var ownerDocument = element.ownerDocument;
515
// If the target has an owner document
518
var divElement = ownerDocument.getElementById("webdeveloper-element-information");
520
// If the div element was found
523
divElement.style.left = (event.pageX - 5) + "px";
524
divElement.style.top = (event.pageY - 5) + "px";
530
// Called when the element information is selected
531
function webdeveloper_selectElementInformation(event)
533
// If the click was not a right click
534
if(event.button != 2)
536
webdeveloper_elementInformationBlockSelected = true;
540
// Toggles an element information block
541
function webdeveloper_toggleElementInformationBlock(event)
543
var element = event.target;
545
// If there is a target element
548
// If the element has a class attribute
549
if(element.hasAttribute("class"))
551
element.removeAttribute("class");
555
element.setAttribute("class", "collapsed");