PK
ι9 chrome/UT HHUx PK
й9j m chrome/.DS_StoreUT HHUx Bud1 % @ @ @ @ E % DSDB ` @ @ @ PK
ɹ9G chrome/deliciousblogrescue.jarUT HHUx PK
9 content/UT {HHUx PK
9j m content/.DS_StoreUT HwHUx Bud1 % @ @ @ @ E % DSDB ` @ @ @ PK
k9= = content/dialogue.jsUT wWHuHUx var DeliciousBlogRescue = {
urlDeliciousAPI: "https://api.del.icio.us/v1/",
// SJW:20080804
// Switch to ALL api since get + datetime API is currently broken
//urlGet: "posts/get?",
urlGet: "posts/all?",
urlDel: "http://delicious.com/",
prefs: null,
blogFaultStr: "",
restoreState: function() {
this.prefs = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
try {
var del = this.prefs.getCharPref("extensions.deliciousblogrescue.delAcc");
var tindex = this.prefs.getIntPref("extensions.deliciousblogrescue.runTimeIndex");
var blog = this.prefs.getCharPref("extensions.deliciousblogrescue.blogAcc");
var dest = this.prefs.getCharPref("extensions.deliciousblogrescue.destURL");
var blogid = this.prefs.getCharPref("extensions.deliciousblogrescue.blogID");
var catid = this.prefs.getCharPref("extensions.deliciousblogrescue.catID");
document.getElementById("delAcc").value = del;
document.getElementById("runTime").selectedIndex = tindex;
document.getElementById("blogAcc").value = blog;
document.getElementById("destURL").value = dest;
document.getElementById("blogID").value = blogid;
document.getElementById("catID").value = catid;
}
catch(e) {}
},
saveState: function() {
var delAcc = document.getElementById("delAcc").value;
var runTimeIndex = document.getElementById("runTime").selectedIndex;
var blogAcc = document.getElementById("blogAcc").value;
var destURL = document.getElementById("destURL").value;
var blogID = document.getElementById("blogID").value;
var catID = document.getElementById("catID").value;
this.prefs.setCharPref("extensions.deliciousblogrescue.delAcc", delAcc);
this.prefs.setIntPref("extensions.deliciousblogrescue.runTimeIndex", runTimeIndex);
this.prefs.setCharPref("extensions.deliciousblogrescue.blogAcc", blogAcc);
this.prefs.setCharPref("extensions.deliciousblogrescue.destURL", destURL);
this.prefs.setCharPref("extensions.deliciousblogrescue.blogID", blogID);
this.prefs.setCharPref("extensions.deliciousblogrescue.catID", catID);
},
openDialogue: function() {
// Only open the dialogue if it's not already open -- otherwise just focus it
var wm = Components.classes['@mozilla.org/appshell/window-mediator;1']
.getService(Components.interfaces.nsIWindowMediator);
var dbrDialog = wm.getMostRecentWindow("mozilla:deliciousblogrescue-dialog");
if (dbrDialog) {
dbrDialog.focus();
}
else {
var features = "chrome,resizable,dialog=no";
dbrDialog = window.openDialog("chrome://deliciousblogrescue/content/dialogue.xul", "deliciousblogrescue-dialogue", features);
}
},
// Executed when user confirms the dialog box.
accept: function() {
var delAccElmt = document.getElementById("delAcc");
var delPassElmt = document.getElementById("delPass");
var blogAccElmt = document.getElementById("blogAcc");
var blogPassElmt = document.getElementById("blogPass");
var runDateElmt = document.getElementById("runDate");
var runTimeElmt = document.getElementById("runTime");
var destURLElmt = document.getElementById("destURL");
if ((delAccElmt.value == "") || (delPassElmt.value == "") || (blogAccElmt.value == "") || (blogPassElmt.value == "") || (destURLElmt.value == "")) {
this.reportResults("requiredFieldError");
return false;
}
var runTime = runTimeElmt.selectedItem.label;
var delAcc = delAccElmt.value;
var delPass = delPassElmt.value;
// Sub one day off the date, since the API uses the 24 hour period starting from the time you pass it
var inDate = runDateElmt.dateValue;
var runDate = new Date(inDate.getFullYear(), inDate.getMonth(), inDate.getDate() - 1);
var padMonth = (runDate.getMonth() + 1) < 10 ? "0" + (runDate.getMonth() + 1) : runDate.getMonth() + 1
var padDate = runDate.getDate() < 10 ? "0" + runDate.getDate() : runDate.getDate();
var startDate = runDate.getFullYear() + "-" + padMonth + "-" + padDate;
var startDateTime = startDate + "T" + runTime + ":00:00Z";
// SJW:20080804
// Need to calculate both start and end date since get API is currently broken.
// The all API uses start and end datetimes correctly.
var endTime = (runTime == 00) ? 23 : parseInt(runTime, 10) - 1;
endTime = (endTime < 10) ? "0" + endTime : endTime;
var endDate = (runTime == 00) ? startDate : runDateElmt.value;
var endDateTime = endDate + "T" + endTime + ":59:59Z";
// SJW:20080804
// Switch to all API.
//var url = this.urlDeliciousAPI + this.urlGet + "dt=" + startDateTime;
var url = this.urlDeliciousAPI + this.urlGet + "fromdt=" + startDateTime + "&todt=" + endDateTime;
// disable all the input fields so data can't be changed as the async calls are made
document.documentElement.getButton("accept").disabled = true;
delAccElmt.disabled = true;
delPassElmt.disabled = true;
runDateElmt.disabled = true;
runTimeElmt.disabled = true;
blogAccElmt.disabled = true;
blogPassElmt.disabled = true;
destURLElmt.disabled = true;
document.getElementById("blogID").disabled = true;
document.getElementById("catID").disabled = true;
// the last attempt may have displayed the seeError text; hide it again.
document.getElementById("status-error").hidden = true;
this.setStatus("gettingLinksMessage");
doHTTPRequest("GET", url, delAcc, delPass, null, this, "delAuthFailure", "delFailure", "delSuccess");
return false;
},
delSuccess: function(resp) {
// Executed when the del.icio.us xml data has been returned
if (resp != null) {
this.forwardToDest(resp);
}
else {
this.delFailure();
}
},
delAuthFailure: function() {
this.reportResults("delAuthError");
},
delFailure: function() {
this.reportResults("delGeneralError");
},
forwardToDest: function(deliciousXML) {
var req = new XMLHttpRequest();
var delAccURL = this.urlDel + document.getElementById("delAcc").value + "/";
// Get the xslt that maps from XML to HTML
req.open("GET", "chrome://deliciousblogrescue/content/transform.xsl", false);
req.send(null);
var transform = req.responseXML;
var outputXML;
var myXslProc;
myXslProc = new XSLTProcessor();
myXslProc.importStylesheet(transform);
myXslProc.setParameter(null, "delurl", delAccURL);
try {
outputXML = myXslProc.transformToDocument(deliciousXML);
}
catch(err) {
this.reportResults("delXSLError");
return;
}
var myXMLSerial = new XMLSerializer();
var outputStr = myXMLSerial.serializeToString(outputXML.documentElement);
// stop if there were no links posted to delicious during the given time period
var delLinks = new XML(outputStr);
if (delLinks.children()[0].name() != "li") {
this.reportResults("delNoLinks");
return;
}
// Create the content of the MetaWeblog API
var methodCall = this.constructMetaWeblogCall(outputStr);
// Send that data to the destURL via MetaWeblog API XML-RPC call
this.setStatus("sendingPostToBlogMessage");
var destURL = document.getElementById("destURL").value;
doHTTPRequest("POST", destURL, "", "", methodCall, this, "metaWeblogFailure", "metaWeblogFailure", "metaWeblogSuccess");
},
constructMetaWeblogCall: function(postContent) {
var blogAcc = document.getElementById("blogAcc").value;
var blogPass = document.getElementById("blogPass").value;
var blogID = document.getElementById("blogID").value;
var catID = document.getElementById("catID").value;
var runDate = document.getElementById("runDate").dateValue;
var dateStr = runDate.getFullYear() + "-" + (runDate.getMonth() + 1) + "-" + runDate.getDate();
// Need to encode the post content as UTF-8, not Unicode (else btoa chokes)
postContent = unescape(encodeURIComponent(postContent));
// metaWeblog.newPost (blogid, username, password, struct, publish)
// Right now we're just pushing the description -- later should find out if del.icio.us
// also pushes date and categories.
var apimethod = "metaWeblog.newPost";
var blogid = "" + blogID + "";
var user = "" + window.btoa(blogAcc) + "";
var pass = "" + window.btoa(blogPass) + "";
var content = "";
content = content + "titlelinks for " + dateStr + ""
content = content + "description" + window.btoa(postContent) + "";
content = content + "categories" + catID + "";
content = content + "";
var publish = "" + "true" + "";
var params = "" + blogid + user + pass + content + publish + "";
var methodCall = '' + "" + apimethod + params + "";
return methodCall;
},
metaWeblogSuccess: function(resp) {
// Executed when the MetaWeblog XML-RPC call has been returned
if (resp != null) {
// parse the response XML -- a fault code may have been returned.
var response = new XML (Components.classes['@mozilla.org/xmlextras/xmlserializer;1'].createInstance (Components.interfaces.nsIDOMSerializer).serializeToString(resp.documentElement));
if (response.name() != 'methodResponse' || !(response.children()[0].name() == "params" || response.children()[0].name() == "fault")) {
this.reportResults("blogXMLError");
return;
}
if (response.children()[0].name() == "fault") {
// the call returned a fault string that we need to display
this.blogFaultStr = response.fault.value.struct.children()[1].value.string;
this.reportResults("blogFault");
document.getElementById("status-error").hidden = false;
return;
}
// if we got this far, the post was made successfully!
var catID = document.getElementById("catID").value;
if (catID != "") {
// if a category was specified, we now need to try to add it to the post
if (response.params.param.value.children()[0].name() != "string") {
// couldn't pull the post id from the response
this.reportResults("blogSuccessWithCatErr");
return;
}
// Do the mt.setPostCatergories call
var postID = response.params.param.value.string;
var methodCall = this.constructMTCategoryCall(postID);
var destURL = document.getElementById("destURL").value;
this.setStatus("sendingCatToBlogMessage");
doHTTPRequest("POST", destURL, "", "", methodCall, this, "mtSetCatFailure", "mtSetCatFailure", "mtSetCatSuccess");
return;
}
else {
// no category specified, so we're done!
this.reportResults("blogSuccess");
return;
}
}
else {
this.reportResults("blogXMLError");
return;
}
},
metaWeblogFailure: function() {
this.reportResults("blogHTTPError");
},
constructMTCategoryCall: function(postID) {
var blogAcc = document.getElementById("blogAcc").value;
var blogPass = document.getElementById("blogPass").value;
var catID = document.getElementById("catID").value;
// mt.setPostCategories (postid, username, password, categories array)
var apimethod = "mt.setPostCategories";
var postIDParam = "" + postID + "";
var user = "" + window.btoa(blogAcc) + "";
var pass = "" + window.btoa(blogPass) + "";
var categories = "";
categories = categories + "categoryId" + catID + ""
categories = categories + "isPrimary1";
categories = categories + "";
var params = "" + postIDParam + user + pass + categories + "";
var methodCall = '' + "" + apimethod + params + "";
return methodCall;
},
mtSetCatSuccess: function(resp) {
if (resp != null) {
var response = new XML (Components.classes['@mozilla.org/xmlextras/xmlserializer;1'].createInstance (Components.interfaces.nsIDOMSerializer).serializeToString(resp.documentElement));
if (response.name() == 'methodResponse' && response.children()[0].name() == "params") {
this.reportResults("blogSuccess");
return;
}
}
this.reportResults("blogSuccessWithCatErr");
},
mtSetCatFailure: function() {
this.reportResults("blogSuccessWithCatErr");
},
showErr: function() {
if (this.blogFaultStr != "") {
alert(this.blogFaultStr);
}
},
reportResults: function(statusPropName) {
// re-enable all the controls
document.documentElement.getButton("accept").disabled = false;
document.getElementById("delAcc").disabled = false;
document.getElementById("delPass").disabled = false;
document.getElementById("runDate").disabled = false;
document.getElementById("runTime").disabled = false;
document.getElementById("blogAcc").disabled = false;
document.getElementById("blogPass").disabled = false;
document.getElementById("destURL").disabled = false;
document.getElementById("blogID").disabled = false;
document.getElementById("catID").disabled = false;
this.setStatus(statusPropName);
},
setStatus: function(statusPropName) {
var msg = document.getElementById("deliciousblogrescue-strings").getString(statusPropName);
document.getElementById("status-text").value = msg;
window.sizeToContent();
}
}
function doHTTPRequest(type, url, username, password, data, aListener, methodAuthErr, methodErr, methodSuccess) {
var request = new XMLHttpRequest();
// Open an asynchronous request
request.open(type, url, true, username, password);
request.overrideMimeType('text/xml');
request.setRequestHeader("User-Agent", navigator.userAgent + " deliciousblogrescue.mozdev.org");
// Basic authentication should be used
if (username.length > 0) {
var text = username + ":" + password;
text = window.btoa(text);
request.setRequestHeader("Authorization", "Basic " + text);
}
request.onreadystatechange = function() {
// 4 is the "completed" state
if (request.readyState == 4) {
switch(request.status) {
case 200:
// HTTP "OK". Successfully posted.
aListener[methodSuccess](request.responseXML);
break;
case 401:
aListener[methodAuthErr]();
break;
default:
aListener[methodErr]();
break;
}
}
return;
};
request.send(data);
}PK
`S8i content/dialogue.xulUT lHuHUx
PK
`S8˪< content/overlay.xulUT lHuHUx
PK
z9ǀܛ
content/transform.xslUT HuHUx
delicious
delicious-link
delicious-extended
delicious-tags(tags:)
PK
9 locale/UT HHUx PK
9j m locale/.DS_StoreUT HHUx Bud1 % @ @ @ @ E % DSDB ` @ @ @ PK
9
locale/en-US/UT HHUx PK
9j m locale/en-US/.DS_StoreUT HHUx Bud1 % @ @ @ @ E % DSDB ` @ @ @ PK
`S8 $ locale/en-US/deliciousblogrescue.dtdUT lHuHUx
PK
`S8Ys˔ + locale/en-US/deliciousblogrescue.propertiesUT lHuHUx requiredFieldError=Please fill in all required fields.
gettingLinksMessage=Getting del.icio.us links.
sendingPostToBlogMessage=Making blog post.
sendingCatToBlogMessage=Assigning category to post.
delAuthError=Failed to get del.icio.us links (account/password problem).
delGeneralError=Failed to get del.icio.us links.
delNoLinks=No links posted to del.icio.us in that 24 hour period.
delXSLError=Failed to transform links to html.
blogHTTPError=Failed to make post (HTTP error).
blogXMLError=Failed to make post (no response or malformed response).
blogFault=Failed to make post.
blogSuccessWithCatErr=Done! (But failed to assign category.)
blogSuccess=Done!
PK
9 skin/UT HHUx PK
9j m skin/.DS_StoreUT HHUx Bud1 % @ @ @ @ E % DSDB ` @ @ @ PK
9
skin/classic/UT HHUx PK
9j m skin/classic/.DS_StoreUT HHUx Bud1 % @ @ @ @ E % DSDB ` @ @ @ PK
k8՛ skin/classic/dbr-icon-lrg.pngUT cHwHUx PNG
IHDR 8 ) ` pHYs gAMA |Q cHRM z% u0 ` : o_F IDATxbd-`VQQal߿&((xۗ/_K Fc4_iFFͿgd17~^s/߿3~KZx Xh9_?o~'˗?~Tc~?}v@ Q݃cևOCK
2}O`ec53/Ï'~\;U @T7X1ʋ{X{3o_/n2<^ [aV'o3K|& &j,8X~)]ш?$0c 2p3
HC_Q!yvvva R8 B1D4]MJZz#ρ>E!ێz
Jy\!\bNu _Dm2(*rppI0q0=zϗw9~y_?}/Zx F&ߜLB\aF*3/ï@Mb WCYyX>`bcČTAbzv<_xyyiA z|̃
s G_F&ѯ_2iA ݻ7?~3q0222KLw`U
$#ÿ?|+
A4 6͘22'\l"@=,h@
_~z@&I Y ,t-#?>=Ó<^=g/,m2|~2lhhI3uJ?(><[`fag_Nd*^>bwõL_?111`bf:@,ܹsT۷0oD15䣷_D^|3W/_~*kvhj{ (P/*y>z>)323>gx+K7gx'>{]}fx7߿D)ࣤw}4}~e\A;ąxAߞcc9Cԗo@K nޅڿ?L־Kv;o{~GIIի_ Rc24S՛no߽Ὓ_Q*a0qb`TzCZGI/cPAy`U4Pgddz؋511*311a_9f_
rI(+qr21#<@DǠ1,ϯ_;~jX8د0Xlj30b6MM`eX2ᛂ:Ư_dA ƪorOOL1hVϟxW^َ b,
?|` 9\J*jqI333|v=``2eP.! VL>' {,rv`PukC`*հ3`
|LׁC`~ď{߿?_)
՛?qrr=n)1Gy Ba>{ҋg/\367fb`bz߯/_cxj,Ǎ, v3Oy]W2\psPd3| 5Fo؟y@Я/$01jZYbnnQNN0FΫ σgϞUcOV^_~koi~oVNy??5$~0 5`PX']b`6׀ϿXX4 ;`mlo@ف*j?!qO-p' ( `g5`` pzPEE.X|ĽSxmH`7W%477(02qp=ʘ`7=*0Xr`gDiG0(faQܺepZ$Wr?_i]v k,[쬥C AFOOOwۋMYGJ!OϿ3?`0i~e`%)`ǖKC+ ^0d`bO_?2e 2D
9b LP),`/tϿBkȠOgVV֓,,,+ S_ks ~#h)h&?1|:
O2-z+ԅAφ]XOD0mƹ)A:,ei4@ 06AB~@SY1̓Ѡ`,V+`G(5cπc@7m}#3vV\p `l|)ϟ
gz+ƓUL?(a:+;&Ga߾2}zWTV`UR`r$_>:H>hɇi4
$uo!{l<\Yn01֞O8xo l?~0%"L2~#j4Ye֟~< /;`o02X9X