(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();
}
);
}
);
}
;
}
)();