(function (){ var util = { getOuterHTML: function (el){ if (el.outerHTML) { return el.outerHTML; } var outerHTML, temp = _AN_Call_createelement('createElement', document, "div"); _AN_Call_appendchild("appendChild", temp, el.cloneNode(true )); outerHTML = temp.innerHTML; temp = null ; return outerHTML; } , getDataAttr: function (el, attr){ return (el.dataset)? el.dataset[attr]: _AN_Call_getattribute("getAttribute", el, "data-" + attr); } , toggleClass: function (el, className){ if (el.classList) { el.classList.toggle(className); } else { var classList = el.className.split(" "), index = classList.indexOf(className); if (index > -1) { classList.splice(index, 1); } else { classList.push(className); } el.className = classList.join(" "); } } } ; function IssueDashboard(){ var _dashboard = _AN_Call_createelement("createElement", document, "div"), _offlineIssues = { } , _onlineIssues = { } , _issueTemplate = null , _header = _AN_Call_createelement("createElement", document, "a"), _message = _AN_Call_createelement("createElement", document, "em"); _AN_Write_href("href", _header, false , "#"); _header.className = "issue-dashboard-header"; _header.textContent = "Issues Dashboard"; _AN_Call_appendchild("appendChild", _header, _message); _header.addEventListener("click", toggleDashboard, false ); _dashboard.id = "issue-dashboard"; _AN_Call_appendchild("appendChild", _dashboard, _header); _AN_Call_appendchild("appendChild", document.body, _dashboard); function toggleDashboard(e){ e.preventDefault(); util.toggleClass(_dashboard, "open"); } function getNewIssues(){ var id, issues = [] ; for (id in _onlineIssues){ if (!_offlineIssues[id]) { if (_onlineIssues[id].bug_status !== "RESOLVED") { _onlineIssues[id].issue_state = "new"; issues.push(_onlineIssues[id]); } } } return issues; } function getChangedIssues(){ var id, changed, issues = [] ; for (id in _onlineIssues){ if (_offlineIssues[id]) { changed = false ; if (_offlineIssues[id].short_desc !== _onlineIssues[id].short_desc) { _onlineIssues[id].issue_state = "updated"; changed = true ; } if (_offlineIssues[id].bug_status !== _onlineIssues[id].bug_status) { if (!(_offlineIssues[id].bug_status == "NEW" && _onlineIssues[id].bug_status == "ASSIGNED")) { _onlineIssues[id].issue_state = "updated"; changed = true ; } } if (changed) { issues.push(_onlineIssues[id]); } } } return issues; } function renderIssues(issues){ var issueItem, issueList = _AN_Call_createelement("createElement", document, "ul"); issueList.className = "issue-list"; issues.forEach(function (issue){ issueItem = _AN_Call_createelement("createElement", document, "li"); var meta = _AN_Call_createelement("createElement", document, "span"); meta.className = "meta"; _AN_Write_innerhtml("innerHTML", meta, false , issue.issue_state); if (issue.bug_status == "RESOLVED") { _AN_Write_innerhtml("innerHTML", meta, false , issue.bug_status); } var toggle = _AN_Call_createelement("createElement", document, "a"); _AN_Write_href("href", toggle, false , "#"); toggle.className = "toggle"; _AN_Write_innerhtml("innerHTML", toggle, false , "toggle HTML"); toggle.addEventListener("click", function (parent){ return function (e){ e.preventDefault(); util.toggleClass(parent, "showMarkup"); } ; } (issueItem)); var issueDOM = _issueTemplate(issue); var markup = _AN_Call_createelement("createElement", document, "pre"); markup.textContent = util.getOuterHTML(issueDOM); _AN_Call_appendchild("appendChild", issueItem, meta); _AN_Call_appendchild("appendChild", issueItem, toggle); _AN_Call_appendchild("appendChild", issueItem, markup); _AN_Call_appendchild("appendChild", issueItem, issueDOM); _AN_Call_appendchild("appendChild", issueList, issueItem); } ); _AN_Call_appendchild("appendChild", _dashboard, issueList); } return { setOnlineIssues: function (issues){ _onlineIssues = issues || [] ; } , setOfflineIssues: function (issues){ _offlineIssues = issues || [] ; } , setIssueTemplate: function (string){ _issueTemplate = TemplateManager.compile(string); } , sync: function (){ if (!_issueTemplate) { throw new Error("IssueDashboard is missing 'issueTemplate'. Expected String, got " + typeof _issueTemplate) } if (!_onlineIssues) { throw new TypeError("Missing 'serverIssues' from server. Expected Object, got " + typeof _onlineIssues) } if (!_offlineIssues) { throw new TypeError("Missing 'documentIssues' from document. Expected Object, got " + typeof _offlineIssues) } var newIssues = getNewIssues(), changedIssues = getChangedIssues(), issues = newIssues.concat(changedIssues); if (issues.length) { _dashboard.className = "warning"; renderIssues(issues); } else { _dashboard.className = "ok"; _header.removeEventListener("click", toggleDashboard, false ); } _message.textContent = _AN_Read_length("length", issues); } } ; } function getIssuesFromDocument(){ var list = { } , issues = document.querySelectorAll(".issue-marker"); if (issues) { issues = Array.prototype.slice.call(issues); issues.forEach(function (issue){ var bugId = util.getDataAttr(issue, "bug_id"); if (bugId) { list[bugId] = { "bug_status": util.getDataAttr(issue, "bug_status"), "short_desc": _AN_Call_replace("replace", issue.querySelector(".short-desc").textContent, /\n?\s+/g, " ")} ; } } ); } return list; } var dashboard = new IssueDashboard(); dashboard.setIssueTemplate(document.querySelector("#issue-template").innerHTML); var docIssues = getIssuesFromDocument(); dashboard.setOfflineIssues(docIssues); window.checkSpecificationIssues = function (product, component){ document.addEventListener("DOMContentLoaded", function (){ BugzillaTracker.search({ product: product, component: component} , function (issues){ dashboard.setOnlineIssues(issues); dashboard.sync(); } ); } ); } ; } )();