425 lines
14 KiB
JavaScript
425 lines
14 KiB
JavaScript
|
|
var ESN = new Object();
|
||
|
|
|
||
|
|
LiveJournal.register_hook("page_load", function () {
|
||
|
|
ESN.initCheckAllBtns();
|
||
|
|
ESN.initEventCheckBtns();
|
||
|
|
ESN.initTrackBtns();
|
||
|
|
});
|
||
|
|
|
||
|
|
// When page loads, set up "check all" checkboxes
|
||
|
|
ESN.initCheckAllBtns = function () {
|
||
|
|
var ntids = $("ntypeids");
|
||
|
|
var catids = $("catids");
|
||
|
|
|
||
|
|
if (!ntids || !catids)
|
||
|
|
return;
|
||
|
|
|
||
|
|
ntidList = ntids.value;
|
||
|
|
catidList = catids.value;
|
||
|
|
|
||
|
|
if (!ntidList || !catidList)
|
||
|
|
return;
|
||
|
|
|
||
|
|
ntids = ntidList.split(",");
|
||
|
|
catids = catidList.split(",");
|
||
|
|
|
||
|
|
catids.forEach( function (catid) {
|
||
|
|
ntids.forEach( function (ntypeid) {
|
||
|
|
var className = "SubscribeCheckbox-" + catid + "-" + ntypeid;
|
||
|
|
|
||
|
|
var cab = new CheckallButton();
|
||
|
|
cab.init({
|
||
|
|
"class": className,
|
||
|
|
"button": $("CheckAll-" + catid + "-" + ntypeid),
|
||
|
|
"parent": $("CategoryRow-" + catid)
|
||
|
|
});
|
||
|
|
});
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// set up auto show/hiding of notification methods
|
||
|
|
ESN.initEventCheckBtns = function () {
|
||
|
|
var viewObjects = document.getElementsByTagName("*");
|
||
|
|
var boxes = DOM.filterElementsByClassName(viewObjects, "SubscriptionInboxCheck") || [];
|
||
|
|
|
||
|
|
boxes.forEach( function (box) {
|
||
|
|
DOM.addEventListener(box, "click", ESN.eventChecked.bindEventListener());
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
ESN.eventChecked = function (evt) {
|
||
|
|
var target = evt.target;
|
||
|
|
if (!target)
|
||
|
|
return;
|
||
|
|
|
||
|
|
var parentRow = DOM.getFirstAncestorByTagName(target, "tr", false);
|
||
|
|
|
||
|
|
var viewObjects = parentRow.getElementsByTagName("*");
|
||
|
|
var boxes = DOM.filterElementsByClassName(viewObjects, "NotificationOptions") || [];
|
||
|
|
|
||
|
|
boxes.forEach( function (box) {
|
||
|
|
box.style.visibility = target.checked ? "visible" : "hidden";
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// attach event handlers to all track buttons
|
||
|
|
ESN.initTrackBtns = function () {
|
||
|
|
// don't do anything if no remote
|
||
|
|
if (!Site || !Site.has_remote) return;
|
||
|
|
|
||
|
|
// attach to all ljuser head icons
|
||
|
|
var trackBtns = DOM.getElementsByTagAndClassName( document, "a", "TrackButton" );
|
||
|
|
|
||
|
|
Array.prototype.forEach.call(trackBtns, function (trackBtn) {
|
||
|
|
if (!trackBtn || !trackBtn.getAttribute) return;
|
||
|
|
|
||
|
|
if (!trackBtn.getAttribute("lj_subid") && !trackBtn.getAttribute("lj_journalid")) return;
|
||
|
|
|
||
|
|
DOM.addEventListener(trackBtn, "click",
|
||
|
|
ESN.trackBtnClickHandler.bindEventListener(trackBtn));
|
||
|
|
});
|
||
|
|
};
|
||
|
|
|
||
|
|
ESN.trackBtnClickHandler = function (evt) {
|
||
|
|
var trackBtn = evt.target;
|
||
|
|
if ( ! trackBtn ) return true;
|
||
|
|
|
||
|
|
// don't show the popup if we want to open it in a new tab (ctrl+click or cmd+click)
|
||
|
|
if (evt && (evt.ctrlKey || evt.metaKey)) return false;
|
||
|
|
|
||
|
|
trackBtn.isIcon = false;
|
||
|
|
|
||
|
|
if ( trackBtn.tagName.toLowerCase() == "img" ) {
|
||
|
|
trackBtn = trackBtn.parentNode;
|
||
|
|
trackBtn.isIcon = true;
|
||
|
|
}
|
||
|
|
|
||
|
|
Event.stop(evt);
|
||
|
|
|
||
|
|
var btnInfo = {};
|
||
|
|
|
||
|
|
['arg1', 'arg2', 'etypeid', 'newentry_etypeid', 'newentry_token', 'newentry_subid',
|
||
|
|
'journalid', 'subid', 'auth_token'].forEach(function (arg) {
|
||
|
|
btnInfo[arg] = trackBtn.getAttribute("lj_" + arg);
|
||
|
|
});
|
||
|
|
|
||
|
|
// pop up little dialog to either track by inbox/email or go to more options
|
||
|
|
var dlg = document.createElement("div");
|
||
|
|
var title = _textDiv("Email me when");
|
||
|
|
DOM.addClassName(title, "track_title");
|
||
|
|
dlg.appendChild(title);
|
||
|
|
|
||
|
|
var TrackCheckbox = function (title, checked) {
|
||
|
|
var checkContainer = document.createElement("div");
|
||
|
|
|
||
|
|
var newCheckbox = document.createElement("input");
|
||
|
|
newCheckbox.type = "checkbox";
|
||
|
|
newCheckbox.id = "newentrytrack" + Unique.id();
|
||
|
|
var newCheckboxLabel = document.createElement("label");
|
||
|
|
newCheckboxLabel.setAttribute("for", newCheckbox.id);
|
||
|
|
newCheckboxLabel.innerHTML = title;
|
||
|
|
|
||
|
|
checkContainer.appendChild(newCheckbox);
|
||
|
|
checkContainer.appendChild(newCheckboxLabel);
|
||
|
|
dlg.appendChild(checkContainer);
|
||
|
|
|
||
|
|
newCheckbox.checked = checked ? true : false;
|
||
|
|
|
||
|
|
return newCheckbox;
|
||
|
|
};
|
||
|
|
|
||
|
|
// global trackPopup so we can only have one
|
||
|
|
if (ESN.trackPopup) {
|
||
|
|
ESN.trackPopup.hide();
|
||
|
|
ESN.trackPopup = null;
|
||
|
|
}
|
||
|
|
|
||
|
|
var saveChangesBtn = document.createElement("input");
|
||
|
|
saveChangesBtn.type = "button";
|
||
|
|
saveChangesBtn.value = "Save Changes";
|
||
|
|
DOM.addClassName(saveChangesBtn, "track_savechanges");
|
||
|
|
|
||
|
|
var trackingNewEntries = Number(btnInfo['newentry_subid']) ? 1 : 0;
|
||
|
|
var trackingNewComments = Number(btnInfo['subid']) ? 1 : 0;
|
||
|
|
|
||
|
|
var newEntryTrackBtn;
|
||
|
|
var commentsTrackBtn;
|
||
|
|
|
||
|
|
if (Number(trackBtn.getAttribute("lj_dtalkid"))) {
|
||
|
|
// this is a thread tracking button
|
||
|
|
// always checked: either because they're subscribed, or because
|
||
|
|
// they're going to subscribe.
|
||
|
|
commentsTrackBtn = TrackCheckbox("someone replies in this comment thread", 1);
|
||
|
|
} else {
|
||
|
|
// entry tracking button
|
||
|
|
var journal;
|
||
|
|
|
||
|
|
if ( typeof LJ_cmtinfo !== 'undefined' ) {
|
||
|
|
journal = LJ_cmtinfo["journal"];
|
||
|
|
} else if ( typeof trackBtn.getAttribute( "journal" ) != "undefined" ) {
|
||
|
|
journal = trackBtn.getAttribute( "journal" );
|
||
|
|
} else if ( typeof Site !== 'undefined' ) {
|
||
|
|
journal = Site.currentJournal;
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( journal ) {
|
||
|
|
newEntryTrackBtn = TrackCheckbox( journal + " posts a new entry", trackingNewEntries );
|
||
|
|
}
|
||
|
|
commentsTrackBtn = TrackCheckbox("someone comments on this post", trackingNewComments);
|
||
|
|
}
|
||
|
|
|
||
|
|
DOM.addEventListener(saveChangesBtn, "click", function () {
|
||
|
|
ESN.toggleSubscriptions(btnInfo, evt, trackBtn, {
|
||
|
|
newEntry: newEntryTrackBtn ? newEntryTrackBtn.checked : false,
|
||
|
|
newComments: commentsTrackBtn.checked
|
||
|
|
});
|
||
|
|
if (ESN.trackPopup) ESN.trackPopup.hide();
|
||
|
|
});
|
||
|
|
|
||
|
|
var btnsContainer = document.createElement("div");
|
||
|
|
DOM.addClassName(btnsContainer, "track_btncontainer");
|
||
|
|
dlg.appendChild(btnsContainer);
|
||
|
|
|
||
|
|
btnsContainer.appendChild(saveChangesBtn);
|
||
|
|
|
||
|
|
var custTrackLink = document.createElement("a");
|
||
|
|
custTrackLink.href = trackBtn.href;
|
||
|
|
btnsContainer.appendChild(custTrackLink);
|
||
|
|
custTrackLink.innerHTML = "More Options";
|
||
|
|
DOM.addClassName(custTrackLink, "track_moreopts");
|
||
|
|
|
||
|
|
ESN.trackPopup = new LJ_IPPU.showNoteElement(dlg, trackBtn, 0);
|
||
|
|
|
||
|
|
DOM.addEventListener(custTrackLink, "click", function (evt) {
|
||
|
|
Event.stop(evt);
|
||
|
|
document.location.href = trackBtn.href;
|
||
|
|
if (ESN.trackPopup) ESN.trackPopup.hide();
|
||
|
|
return false;
|
||
|
|
});
|
||
|
|
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
// toggles subscriptions
|
||
|
|
ESN.toggleSubscriptions = function (subInfo, evt, btn, subs) {
|
||
|
|
subInfo["subid"] = Number(subInfo["subid"]);
|
||
|
|
if ((subInfo["subid"] && ! subs["newComments"])
|
||
|
|
|| (! subInfo["subid"] && subs["newComments"])) {
|
||
|
|
ESN.toggleSubscription(subInfo, evt, btn, "newComments");
|
||
|
|
}
|
||
|
|
|
||
|
|
subInfo["newentry_subid"] = Number(subInfo["newentry_subid"]);
|
||
|
|
if ((subInfo["newentry_subid"] && ! subs["newEntry"])
|
||
|
|
|| (! subInfo["newentry_subid"] && subs["newEntry"])) {
|
||
|
|
var newentrySubInfo = new Object(subInfo);
|
||
|
|
newentrySubInfo["subid"] = Number(btn.getAttribute("lj_newentry_subid"));
|
||
|
|
ESN.toggleSubscription(newentrySubInfo, evt, btn, "newEntry");
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
// (Un)subscribes to an event
|
||
|
|
ESN.toggleSubscription = function (subInfo, evt, btn, sub) {
|
||
|
|
var action = "";
|
||
|
|
var params = {
|
||
|
|
auth_token: sub == "newEntry" ? subInfo.newentry_token : subInfo.auth_token
|
||
|
|
};
|
||
|
|
|
||
|
|
if (Number(subInfo.subid)) {
|
||
|
|
// subscription exists
|
||
|
|
action = "delsub";
|
||
|
|
params.subid = subInfo.subid;
|
||
|
|
} else {
|
||
|
|
// create a new subscription
|
||
|
|
action = "addsub";
|
||
|
|
|
||
|
|
var param_keys;
|
||
|
|
if (sub == "newEntry") {
|
||
|
|
params.etypeid = subInfo.newentry_etypeid;
|
||
|
|
param_keys = ["journalid"];
|
||
|
|
} else {
|
||
|
|
param_keys = ["journalid", "arg1", "arg2", "etypeid"];
|
||
|
|
}
|
||
|
|
|
||
|
|
param_keys.forEach(function (param) {
|
||
|
|
if (Number(subInfo[param]))
|
||
|
|
params[param] = parseInt(subInfo[param], 10);
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
params.action = action;
|
||
|
|
|
||
|
|
var reqInfo = {
|
||
|
|
"method": "POST",
|
||
|
|
"url": LiveJournal.getAjaxUrl('esn_subs'),
|
||
|
|
"data": HTTPReq.formEncoded(params)
|
||
|
|
};
|
||
|
|
|
||
|
|
var gotInfoCallback = function (info) {
|
||
|
|
if (! info) return LJ_IPPU.showNote("Error changing subscription", btn);
|
||
|
|
|
||
|
|
if (info.error) return LJ_IPPU.showNote(info.error, btn);
|
||
|
|
|
||
|
|
if (info.success) {
|
||
|
|
if (info.msg)
|
||
|
|
LJ_IPPU.showNote(info.msg, btn);
|
||
|
|
|
||
|
|
if (info.subscribed) {
|
||
|
|
if (info.subid)
|
||
|
|
DOM.setElementAttribute(btn, "lj_subid", info.subid);
|
||
|
|
if (info.newentry_subid)
|
||
|
|
DOM.setElementAttribute(btn, "lj_newentry_subid", info.newentry_subid);
|
||
|
|
|
||
|
|
DOM.setElementAttribute(btn, "title", 'Untrack This');
|
||
|
|
|
||
|
|
// update subthread tracking icons
|
||
|
|
var dtalkid = btn.getAttribute("lj_dtalkid");
|
||
|
|
if ( dtalkid ) {
|
||
|
|
ESN.updateThreadIcons(dtalkid, "on");
|
||
|
|
} else { // not thread tracking button
|
||
|
|
if ( ! btn.isIcon ) {
|
||
|
|
var swapName = btn.innerHTML;
|
||
|
|
btn.innerHTML = btn.getAttribute( "js_swapname" );
|
||
|
|
DOM.setElementAttribute( btn, "js_swapname", swapName );
|
||
|
|
} else {
|
||
|
|
btn.firstChild.src = Site.imgprefix + "/silk/entry/untrack.png";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
if (info["event_class"] == "LJ::Event::JournalNewComment")
|
||
|
|
DOM.setElementAttribute(btn, "lj_subid", 0);
|
||
|
|
else if (info["event_class"] == "LJ::Event::JournalNewEntry")
|
||
|
|
DOM.setElementAttribute(btn, "lj_newentry_subid", 0);
|
||
|
|
|
||
|
|
DOM.setElementAttribute(btn, "title", 'Track This');
|
||
|
|
|
||
|
|
// update subthread tracking icons
|
||
|
|
var dtalkid = btn.getAttribute("lj_dtalkid");
|
||
|
|
if (dtalkid) {
|
||
|
|
// set state to "off" if no parents tracking this,
|
||
|
|
// otherwise set state to "parent"
|
||
|
|
var state = "off";
|
||
|
|
var parentBtn;
|
||
|
|
var parent_dtalkid = dtalkid;
|
||
|
|
while (parentBtn = ESN.getThreadParentBtn(parent_dtalkid)) {
|
||
|
|
parent_dtalkid = parentBtn.getAttribute("lj_dtalkid");
|
||
|
|
if (! parent_dtalkid) {
|
||
|
|
log("could not find parent_dtalkid");
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (! Number(parentBtn.getAttribute("lj_subid")))
|
||
|
|
continue;
|
||
|
|
state = "parent";
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
ESN.updateThreadIcons(dtalkid, state);
|
||
|
|
|
||
|
|
} else {
|
||
|
|
// not thread tracking button
|
||
|
|
if ( ! btn.isIcon ) {
|
||
|
|
var swapName = btn.innerHTML;
|
||
|
|
btn.innerHTML = btn.getAttribute( "js_swapname" );
|
||
|
|
DOM.setElementAttribute( btn, "js_swapname", swapName );
|
||
|
|
} else {
|
||
|
|
btn.firstChild.src = Site.imgprefix + "/silk/entry/track.png";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (info.auth_token)
|
||
|
|
DOM.setElementAttribute(btn, "lj_auth_token", info.auth_token);
|
||
|
|
if (info.newentry_token)
|
||
|
|
DOM.setElementAttribute(btn, "lj_newentry_token", info.newentry_token);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
reqInfo.onData = gotInfoCallback;
|
||
|
|
reqInfo.onError = function (err) { LJ_IPPU.showNote("Error: " + err) };
|
||
|
|
|
||
|
|
HTTPReq.getJSON(reqInfo);
|
||
|
|
};
|
||
|
|
|
||
|
|
// given a dtalkid, find the track button for its parent comment (if any)
|
||
|
|
ESN.getThreadParentBtn = function (dtalkid) {
|
||
|
|
var cmtInfo = LJ_cmtinfo[dtalkid + ""];
|
||
|
|
if (! cmtInfo) {
|
||
|
|
log("no comment info");
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
var parent_dtalkid = cmtInfo.parent;
|
||
|
|
if (! parent_dtalkid)
|
||
|
|
return null;
|
||
|
|
|
||
|
|
return $("lj_track_btn_" + parent_dtalkid);
|
||
|
|
};
|
||
|
|
|
||
|
|
// update all the tracking icons under a parent comment
|
||
|
|
ESN.updateThreadIcons = function (dtalkid, tracking) {
|
||
|
|
var btn = $("lj_track_btn_" + dtalkid);
|
||
|
|
if (! btn) {
|
||
|
|
log("no button");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
var cmtInfo = LJ_cmtinfo[dtalkid + ""];
|
||
|
|
if (! cmtInfo) {
|
||
|
|
log("no comment info");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (Number(btn.getAttribute("lj_subid")) && tracking != "on") {
|
||
|
|
// subscription already exists on this button, don't mess with it
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (cmtInfo.rc && cmtInfo.rc.length) {
|
||
|
|
// update children
|
||
|
|
cmtInfo.rc.forEach(function (child_dtalkid) {
|
||
|
|
window.setTimeout(function () {
|
||
|
|
var state;
|
||
|
|
switch (tracking) {
|
||
|
|
case "on":
|
||
|
|
state = "parent";
|
||
|
|
break;
|
||
|
|
case "off":
|
||
|
|
state = "off";
|
||
|
|
break;
|
||
|
|
case "parent":
|
||
|
|
state = "parent";
|
||
|
|
break;
|
||
|
|
default:
|
||
|
|
alert("Unknown tracking state " + tracking);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
ESN.updateThreadIcons(child_dtalkid, state);
|
||
|
|
}, 300);
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// update icon
|
||
|
|
var uri;
|
||
|
|
switch (tracking) {
|
||
|
|
case "on":
|
||
|
|
uri = "/silk/entry/untrack.png";
|
||
|
|
break;
|
||
|
|
case "off":
|
||
|
|
uri = "/silk/entry/track.png";
|
||
|
|
break;
|
||
|
|
case "parent":
|
||
|
|
uri = "/silk/entry/untrack.png";
|
||
|
|
break;
|
||
|
|
default:
|
||
|
|
alert("Unknown tracking state " + tracking);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
if ( typeof btn.firstChild.tagName != "undefined" && btn.firstChild.tagName.toLowerCase() == "img" ) {
|
||
|
|
btn.firstChild.src = Site.imgprefix + uri;
|
||
|
|
} else {
|
||
|
|
var swapName = btn.innerHTML;
|
||
|
|
btn.innerHTML = btn.getAttribute( "js_swapname" );
|
||
|
|
DOM.setElementAttribute( btn, "js_swapname", swapName );
|
||
|
|
}
|
||
|
|
|
||
|
|
};
|