--- /dev/null
+var webdeveloper_lastCommentShown = null;
+
+// Clears the comments from the page
+function webdeveloper_clearComments(pageDocument)
+{
+ var commentDiv = null;
+ var commentDivList = webdeveloper_evaluateXPath(pageDocument, "//div[@class='webdeveloper-comment-icon'] | //div[@class='webdeveloper-comment-text']");
+ var commentDivsLength = commentDivList.length;
+
+ webdeveloper_lastCommentShown = null;
+
+ // Loop through the comment divs
+ for(var i = 0; i < commentDivsLength; i++)
+ {
+ webdeveloper_removeElement(commentDivList[i]);
+ }
+}
+
+// Shows the comment text
+function webdeveloper_showCommentText(event)
+{
+ var target = event.target;
+
+ // If there is an event target
+ if(target)
+ {
+ var currentDocument = webdeveloper_getContentDocument();
+ var lastCommentElement = null;
+ var targetComment = target.id.replace(new RegExp("icon", "gi"), "text");
+ var targetCommentElement = currentDocument.getElementById(targetComment);
+
+ // If this is not the last comment shown
+ if(webdeveloper_lastCommentShown && webdeveloper_lastCommentShown != targetComment)
+ {
+ lastCommentElement = currentDocument.getElementById(webdeveloper_lastCommentShown);
+
+ // If the last comment element exists
+ if(lastCommentElement)
+ {
+ lastCommentElement.style.display = "none";
+ }
+ }
+
+ // If the element is currently hidden
+ if(targetCommentElement.style.display == "none")
+ {
+ targetCommentElement.style.display = "block";
+ }
+ else
+ {
+ targetCommentElement.style.display = "none";
+ }
+
+ webdeveloper_lastCommentShown = targetComment;
+ }
+}
+
+// Toggles comments
+function webdeveloper_toggleComments(element)
+{
+ var documentList = webdeveloper_getDocuments(webdeveloper_getContentWindow());
+ var documentLength = documentList.length;
+ var show = element.getAttribute("checked");
+
+ // Loop through the documents
+ for(var i = 0; i < documentLength; i++)
+ {
+ webdeveloper_toggleCommentsForDocument(documentList[i], show);
+ }
+
+ webdeveloper_toggleStyleSheet(element, "chrome://webdeveloper/content/stylesheets/show_comments.css", "webdeveloper-show-comments");
+ webdeveloper_toggleFeatureTooltipStyles(element, "webdeveloper-show-comments-tooltips", "div.webdeveloper-comment-icon, div.webdeveloper-comment-text, div.webdeveloper-comment-text *");
+}
+
+// Toggles the comments for a document
+function webdeveloper_toggleCommentsForDocument(pageDocument, show)
+{
+ var bodyElement = webdeveloper_getDocumentBodyElement(pageDocument);
+ var bodyOffsetWidth = bodyElement.offsetWidth;
+ var comment = null;
+ var commentsLength = 0;
+ var commentsList = new Array();
+ var parentElement = null;
+ var treeWalker = pageDocument.createTreeWalker(pageDocument, NodeFilter.SHOW_COMMENT, null, false);
+
+ webdeveloper_lastCommentShown = null;
+
+ // While the tree walker has more nodes
+ while((comment = treeWalker.nextNode()) != null)
+ {
+ commentsList.push(comment);
+ }
+
+ // Remove XML declaration
+ if(commentsList.length > 0 && commentsList[0].nodeValue.indexOf("encoding") != -1)
+ {
+ commentsList.shift();
+ }
+
+ // Remove DOCTYPE
+ if(commentsList.length > 0 && commentsList[0].nodeValue.indexOf("DOCTYPE") != -1)
+ {
+ commentsList.shift();
+ }
+
+ commentsLength = commentsList.length;
+
+ // If showing comments
+ if(show)
+ {
+ var commentDiv = null;
+ var commentIconDiv = null;
+ var commentLeft = 0;
+ var commentParent = null;
+ var commentParentOffsetLeft = 0;
+ var commentParentOffsetTop = 0;
+ var commentText = null;
+ var commentTop = 0;
+ var iconSize = 17;
+
+ // Loop through the comments
+ for(var i = 0; i < commentsLength; i++)
+ {
+ comment = commentsList[i];
+ commentLeft = 0;
+ commentParent = comment.parentNode;
+ commentText = comment.nodeValue;
+ commentTop = 0;
+
+ commentText = commentText.replace(new RegExp("<!--[\s]*", "gi"), "");
+ commentText = commentText.replace(new RegExp("[\s]*-->", "gi"), "");
+ commentText = commentText.replace(new RegExp("<([^\/][^>]*)class=\"[^\"]*\">", "gi"), "<$1>");
+ commentText = commentText.replace(new RegExp("<([^\/][^>]*)class=[^ >]*>", "gi"), "<$1>");
+
+ // While the comment has a parent
+ while(commentParent)
+ {
+ // If the parent node is not a document node or a table row
+ if(commentParent.nodeType != Node.DOCUMENT_NODE && commentParent.tagName && commentParent.tagName.toLowerCase() != "tr")
+ {
+ commentParentOffsetLeft = commentParent.offsetLeft;
+ commentParentOffsetTop = commentParent.offsetTop;
+
+ // If the parent node has a left offset
+ if(commentParentOffsetLeft)
+ {
+ commentLeft += commentParentOffsetLeft;
+ }
+
+ // If the parent node has a top offset
+ if(commentParentOffsetTop)
+ {
+ commentTop += commentParentOffsetTop;
+ }
+ }
+
+ commentParent = commentParent.parentNode;
+ }
+
+ // If the comment left offset is 0
+ if(commentLeft == 0)
+ {
+ commentLeft = 1;
+ }
+ else if(commentLeft + iconSize > bodyOffsetWidth)
+ {
+ commentLeft = bodyOffsetWidth;
+ }
+
+ // If the comment top offset is 0
+ if(commentTop == 0)
+ {
+ commentTop = 1;
+ }
+
+ // If this is not the first comment
+ if(i > 0)
+ {
+ // Loop through previous comments
+ for(var j = 0; j < i; j++)
+ {
+ // If the top off set of a previous comment matches this comment
+ if(parseInt(pageDocument.getElementById("webdeveloper-comment-icon" + j).style.top) == commentTop)
+ {
+ commentTop += iconSize;
+ }
+ }
+ }
+
+ commentIconDiv = pageDocument.createElement("div");
+ commentIconDiv.style.left = commentLeft + "px";
+ commentIconDiv.style.top = commentTop + "px";
+
+ commentIconDiv.addEventListener("click", webdeveloper_showCommentText, false);
+ commentIconDiv.appendChild(pageDocument.createTextNode("!"));
+ commentIconDiv.setAttribute("class", "webdeveloper-comment-icon");
+ commentIconDiv.setAttribute("id", "webdeveloper-comment-icon" + i);
+
+ bodyElement.appendChild(commentIconDiv);
+
+ commentDiv = pageDocument.createElement("div");
+ commentDiv.style.left = commentLeft + iconSize + "px";
+ commentDiv.style.top = commentTop + "px";
+
+ commentDiv.appendChild(pageDocument.createTextNode(commentText));
+ commentDiv.setAttribute("class", "webdeveloper-comment-text");
+ commentDiv.setAttribute("id", "webdeveloper-comment-text" + i);
+
+ bodyElement.appendChild(commentDiv);
+
+ // If the offset width is greater than 200
+ if(commentDiv.offsetWidth > 200)
+ {
+ commentDiv.style.width = "200px";
+ }
+
+ // If the offset height is greater than 100
+ if(commentDiv.offsetHeight > 100)
+ {
+ commentDiv.style.height = "100px";
+ commentDiv.style.overflow = "auto";
+ }
+
+ // If the comment is positioned outside the document
+ if(commentLeft + iconSize + commentDiv.offsetWidth > bodyOffsetWidth)
+ {
+ commentDiv.style.left = commentLeft - commentDiv.offsetWidth - iconSize + "px";
+ }
+
+ commentDiv.style.display = "none";
+ }
+ }
+ else
+ {
+ webdeveloper_clearComments(pageDocument);
+ }
+}
\ No newline at end of file