您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
This is the post class which is created under the WM version 4.x script
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/6894/27959/WM%20Post%20Object.js
// ==UserScript== // @name WM Post Object // @namespace MerricksdadWMPostObject // @description This is the post class which is created under the WM version 4.x script // @license http://creativecommons.org/licenses/by-nc-nd/3.0/us/ // @version 4.0.0.3 // @copyright Charlie Ewing except where noted // ==/UserScript== //this script requires some functions in the WM Common Library //this script needs access to a pre-defined JSON object (function(){ //*************************************************************************************************************************************** //***** Post Class //*************************************************************************************************************************************** WM.Post = function(params){try{ this.objType="post"; var self=this; params=params||{}; //set defaults this.state=""; //classnames this.flags=0; //similar to classnames this.node=null; //collector panel node this.originalData=JSON.stringify(params); //clone the original data from facebook for viewing later //convert FQL data to what we have previously expected from graph api this.id=params.source_id + "_" + params.post_id; this.app=WM.apps[params.app_id]; this.fromID=params.source_id; this.permalink="http://www.facebook.com/"+params.source_id+"/posts/"+params.post_id; this.fromName=params.fromName; this.date=params.created_time; this.message=params.message; //status message from post creator this.name=params.title; //params.attachment.name; //first line of the post this.title=params.title; //first line of the post this.caption=params.caption; //params.attachment.caption; //just below the title, a subtitle this.description=params.description; //params.attachment.description; //just below the caption, descriptive text about the story this.picture=params.picture; //params.app_data.images; this.likeLink = params.likeLink; this.pageNode = params.pageNode; this.commentLink = params.commentLink; this.commentNode = params.commentNode; //removed for WM 4 /*try{ this.picture = JSON.parse(this.picture)[0].fbml.match(/https?\:.+\.(png|gif|jpg)/)[0]; } catch(e){ //picture data match failed, no big deal //leave the data messed up because rules manager might still be able to use it }*/ this.linkHref=params.linkHref;//||(params.action_links||null)?params.action_links[0].href:(params.attachment.media||null)?params.attachment.media[0].href:""; this.linkText=params.linkText;//||(params.action_links||null)?params.action_links[0].text:(params.attachment.media||null)?params.attachment.media[0].alt:""; this.targetID=params.target_id; //this.isLiked=params.isLiked; //params.like_info.user_likes; //convert a unix date to a readable date this.realtime=(new Date(this.date*1000).toLocaleString()); //set a timer on the post for delayed deletion this.drawTime=timeStamp(); this._isLiked=params.isLiked; this._isPinned=false; this._isPaused=false; this._isScam=false; this._isW2W=false; this._isForMe=false; this._isMyPost=false; this._isWishlist=false; this._isUndefined=false; this._status=0; this._isTimeout=false; this._isFailed=false; this._isAccepted=false; this._isExcluded=false; this._isStale=false; this._isCollect=false; this._isWorking=false; this._which=null; this._idText=""; //use passed params //for (var p in params) this[p]=params[p]; //link to our application array of objects //this.app=WM.apps[this.application.id]; //shortcuts to app details this.__defineGetter__("synApp",function(){try{ return this.app.synApp; }catch(e){log("WM.Post.synApp: "+e);}}); this.__defineGetter__("postedDay",function(){try{ var d=new Date(this.date*1000); return d.getFullYear()+"/"+d.getMonth()+"/"+d.getDay(); }catch(e){log("WM.Post.postedDay: "+e);}}); this.__defineGetter__("postedHour",function(){try{ var d=new Date(this.date*1000); var h=d.getHours(); var pm=(h/12)>1; return d.getFullYear()+"/"+d.getMonth()+"/"+d.getDay()+" "+((h>12)?h-12:h)+":00"+((pm)?"PM":"AM"); }catch(e){log("WM.Post.postedHour: "+e);}}); this.__defineGetter__("appID",function(){try{ return this.app.appID; }catch(e){log("WM.Post.appID: "+e);}}); this.__defineGetter__("appName",function(){try{ return this.app.name; }catch(e){log("WM.Post.appName: "+e);}}); //get/set priority this.__defineGetter__("priority",function(){try{ return this._priority; }catch(e){log("WM.Post.priority: "+e);}}); this.__defineSetter__("priority",function(v){try{ this._priority=v; }catch(e){log("WM.Post.priority: "+e);}}); //get/set liked status this.__defineGetter__("isLiked",function(){try{ return this._isLiked; }catch(e){log("WM.Post.isLiked: "+e);}}); this.__defineSetter__("isLiked",function(v){try{ this._isLiked=v; //remove the toolbutton if liked if (this.node) with (this.node) className=className.toggleWordB(this._isLiked,"liked"); if (this.likeButtonNode) with (this.likeButtonNode) className=className.toggleWordB(this._isLiked,"hidden"); }catch(e){log("WM.Post.isLiked: "+e);}}); //identification flags this.__defineGetter__("isScam",function(){try{ return this._isScam; }catch(e){log("WM.Post.isScam: "+e);}}); this.__defineSetter__("isScam",function(v){try{ this._isScam=v; if (this.node) with (this.node) className=className.toggleWordB(this._isScam,"scam"); }catch(e){log("WM.Post.isScam: "+e);}}); this.__defineGetter__("isMyPost",function(){try{ return this._isMyPost; }catch(e){log("WM.Post.isMyPost: "+e);}}); this.__defineSetter__("isMyPost",function(v){try{ this._isMyPost=v; if (this.node) with (this.node) className=className.toggleWordB(this._isMyPost,"isMyPost"); }catch(e){log("WM.Post.isMyPost: "+e);}}); this.__defineGetter__("isW2W",function(){try{ return this._isW2W; }catch(e){log("WM.Post.isW2W: "+e);}}); this.__defineSetter__("isW2W",function(v){try{ this._isW2W=v; if (this.node) with (this.node) className=className.toggleWordB(this._isW2W,"w2w"); }catch(e){log("WM.Post.isW2W: "+e);}}); this.__defineGetter__("isForMe",function(){try{ return this._isForMe; }catch(e){log("WM.Post.isForMe: "+e);}}); this.__defineSetter__("isForMe",function(v){try{ this._isForMe=v; if (this.node) with (this.node) className=className.toggleWordB(this._isForMe,"isForMe"); }catch(e){log("WM.Post.isForMe: "+e);}}); this.__defineGetter__("isWishlist",function(){try{ return this._isWishlist; }catch(e){log("WM.Post.isWishlist: "+e);}}); this.__defineSetter__("isWishlist",function(v){try{ this._isWishlist=v; if (this.node) with (this.node) className=className.toggleWordB(this._isWishlist,"wishlist"); }catch(e){log("WM.Post.isWishlist: "+e);}}); this.__defineGetter__("isUndefined",function(){try{ return this._isUndefined; }catch(e){log("WM.Post.isUndefined: "+e);}}); this.__defineSetter__("isUndefined",function(v){try{ this._isUndefined=v; if (this.node) with (this.node) className=className.toggleWordB(this._isUndefined,"noDef"); }catch(e){log("WM.Post.isUndefined: "+e);}}); this.__defineGetter__("isStale",function(){try{ return this._isStale; }catch(e){log("WM.Post.isStale: "+e);}}); this.__defineSetter__("isStale",function(v){try{ this._isStale=v; if (this.node) with (this.node) className=className.toggleWordB(this._isStale,"stale"); }catch(e){log("WM.Post.isStale: "+e);}}); this.__defineGetter__("isTimeout",function(){try{ return this._isTimeout; }catch(e){log("WM.Post.isTimeout: "+e);}}); this.__defineSetter__("isTimeout",function(v){try{ this._isTimeout=v; if (this.node) with (this.node) className=className.toggleWordB(this._isTimeout,"timeout"); }catch(e){log("WM.Post.isTimeout: "+e);}}); this.__defineGetter__("isCollect",function(){try{ return this._isCollect; }catch(e){log("WM.Post.isCollect: "+e);}}); this.__defineSetter__("isCollect",function(v){try{ this._isCollect=v; if (this.node) with (this.node) className=className.toggleWordB(this._isCollect,"collect"); }catch(e){log("WM.Post.isCollect: "+e);}}); this.__defineGetter__("isExcluded",function(){try{ return this._isExcluded; }catch(e){log("WM.Post.isExcluded: "+e);}}); this.__defineSetter__("isExcluded",function(v){try{ this._isExcluded=v; if (this.node) with (this.node) className=className.toggleWordB(this._isExcluded,"excluded"); }catch(e){log("WM.Post.isExcluded: "+e);}}); this.__defineGetter__("isAccepted",function(){try{ return this._isAccepted; }catch(e){log("WM.Post.isAccepted: "+e);}}); this.__defineSetter__("isAccepted",function(v){try{ this._isAccepted=v; if (this.node) with (this.node) className=className.toggleWordB(this._isAccepted,"accepted"); }catch(e){log("WM.Post.isAccepted: "+e);}}); this.__defineGetter__("isFailed",function(){try{ return this._isFailed; }catch(e){log("WM.Post.isFailed: "+e);}}); this.__defineSetter__("isFailed",function(v){try{ this._isFailed=v; if (this.node) with (this.node) className=className.toggleWordB(this._isFailed,"failed"); }catch(e){log("WM.Post.isFailed: "+e);}}); this.__defineGetter__("isWorking",function(){try{ return this._isWorking; }catch(e){log("WM.Post.isWorking: "+e);}}); this.__defineSetter__("isWorking",function(v){try{ this._isWorking=v; if (this.node) with (this.node) className=className.toggleWordB(this._isWorking,"working"); }catch(e){log("WM.Post.isWorking: "+e);}}); this.__defineGetter__("isColored",function(){try{ return this._isColored; }catch(e){log("WM.Post.isColored: "+e);}}); this.__defineSetter__("isColored",function(v){try{ this._isColored=v; if (this._isColored && this.colorOverride && this.node) this.node.style.setProperty("background-color",this.colorOverride,"important"); }catch(e){log("WM.Post.isColored: "+e);}}); //get/set post pinned this.__defineGetter__("isPinned",function(){try{ return this._isPinned; }catch(e){log("WM.Post.isPinned: "+e);}}); this.__defineSetter__("isPinned",function(v){try{ this._isPinned=v; //rotate the pin icon var btnSize=WM.opts.littleButtonSize; if (this.pinImageNode) with (this.pinImageNode) className=className.swapWordB(this._isPinned,"pinned"+btnSize,"pin"+btnSize); //pinned class if (this.node) with (this.node) className=className.toggleWordB(this._isPinned,"pinned"); }catch(e){log("WM.Post.isPinned: "+e);}}); //get/set post paused this.__defineGetter__("isPaused",function(){try{ return this._isPaused; }catch(e){log("WM.Post.isPaused: "+e);}}); this.__defineSetter__("isPaused",function(v){try{ this._isPaused=v; if (this.node) with (this.node) className=className.toggleWordB(this._isPaused,"paused"); }catch(e){log("WM.Post.isPaused: "+e);}}); //get/set status this.__defineGetter__("status",function(){try{ return this._status; }catch(e){log("WM.Post.status: "+e);}}); this.__defineSetter__("status",function(v){try{ this._status=v; if (this.statusTextNode) this.statusTextNode.textContent=this._status; }catch(e){log("WM.Post.status: "+e);}}); //get/set idText this.__defineGetter__("idText",function(){try{ return this._idText; }catch(e){log("WM.Post.idText: "+e);}}); this.__defineSetter__("idText",function(v){try{ this._idText=v; if (this.linkNode) this.linkNode.textContent=((this._idText||null) && WM.opts.debugrecog)?this._idText:this.linkText; }catch(e){log("WM.Post.idText: "+e);}}); //get/set which bonus type this is this.__defineGetter__("which",function(){try{ return this._which; }catch(e){log("WM.Post.which: "+e);}}); this.__defineSetter__("which",function(v){try{ this._which=v; if (this.whichTextNode) this.whichTextNode.textContent=this._which; }catch(e){log("WM.Post.which: "+e);}}); //check if in history already this.__defineGetter__("alreadyProcessed",function(){try{ return exists(WM.history[this.id]); }catch(e){log("WM.Post.alreadyProcessed: "+e);}}); /* //update the namespace parameter if it does not exist if (!exists(this.app.namespace)) this.app.namespace=this.application.namespace; //validate the application namespace for sidekicks that provide namespace checking if (exists(this.app.namespace) && (this.app.namespace!=this.application.namespace)) { //Graph API namespace does not match sidekick known namespace, flag as scam this.isScam=true; } //now drop the application object we got from FB if (exists(this.application)) delete this.application; */ //this.fromID=this.from.id; //this.fromName=this.from.name; this.fromNameLastFirst=this.fromName; var sp=this.fromName.split(" "); if (isArray(sp) && sp.length>1) { this.fromNameLastFirst = sp.pop()+", "+sp.join(" "); } //(re)identify this post this.identify=function(params){try{ params=params||{}; //shortcuts var post=this; var app=post.app; var synApp=app.synApp; //set/reset priority, state, status & flags this.priority=50; this.status=0; this.state=""; //prevent reset of some data holders if (!params.reid) { this.testData={}; this.isLiked=false; this.isMyPost=false; this.isW2W=false; this.isForMe=false; this.isScam=false; } //reset data holders this.isStale=false; this.isCollect=false; this.isExcluded=false; this.isFailed=false; this.isAccepted=false; this.isPaused=false; this.isPinned=false; this.isUndefined=false; this.isWishlist=false; this.isTimeout=false; //avoid posts that belong to a disabled sidekick if(!WM.quickOpts.masterSwitch[app.appID]) { //master switch is off this.isExcluded=true; return true; //draw without identifying anything } //hide posts by apps that we specifically told to hide if (WM.opts["hide"+app.appID]) {this.remove(); return false;} //avoid potential scam posts /*if (WM.opts.scamblock) { if (!params.reid) { this.isScam=(!this.linkHref.match(new RegExp("^http(s):\/\/apps\.facebook\.com\/"+app.namespace))!=null); } if (this.isScam){ this.isExcluded=true; if (WM.opts.hidescams) {this.remove(); return false;} } }*/ //avoid posts by self if (!params.reid) { var whoPosted = this.fromID; var whoName = this.fromName; this.isMyPost=(whoPosted==WM.currentUser.id); } if (this.isMyPost){ this.isExcluded=true; if (WM.opts.hidemyposts) {this.remove(); return false;} } //avoid W2W posts not for me if (!params.reid){ this.isForMe = (this.targetID==WM.currentUser.id); this.isW2W = (this.targetID||null); } if (WM.opts[app.appID+"dontsteal"] && this.isW2W && !this.isForMe){ this.isExcluded=true; if (WM.opts.hidenotforme) {this.remove(); return false;} } //avoid posts older than olderLimit if (olderLimit!=0) { if (this.isStale=this.checkStale(olderLimit)){ if (WM.opts.skipstale) this.isExcluded=true; if (WM.opts.hidestale) {this.remove(); return false;} } } //get bonus type var w=(this.which = WM.which(this,{reid:params.reid})); //check for exclude type if (w=="exclude") { this.isExcluded=true; } //check for pause if(synApp.typesPaused.inArray(w)) this.isPaused=true; //check if undefined if (w=="none") { this.isUndefined=true; } if (w==synApp.appID+"doUnknown" || w==synApp.appID+"send") { this.isUndefined=true; } //special pin undefined option if (WM.opts.pinundefined && this.isUndefined) this.isPinned=true; //check if liked by me if (this.isLiked){ if (WM.opts.skipliked){ if (WM.opts.markliked) this.status=1; //mark liked as accepted this.isExcluded=true; debug.print("skip liked"); } if (WM.opts.hideliked) {debug.print("hide liked");this.remove(); return false;} } //check history this.status=this.status||0; if (this.alreadyProcessed) { //post previously processed this.status=(WM.history[this.id].status||0); var gotItem=((this.status>0) || (this.status==-6) || (this.status==-4) || (this.status==-15 && WM.opts.accepton15)); if (gotItem) { this.isAccepted=true; } else if (this.status<0) { this.isFailed=true; } if (WM.opts.hideaccepted && gotItem) {this.remove(); return false;} if (WM.opts.hidefailed && this.status<0) {this.remove(); return false;} } //check if excluded if (this.isExcluded && WM.opts.hideexcluded) {this.remove(); return false;} //set identified text this.idText=WM.getAccText(synApp.appID,w,(this.alreadyProcessed),this.status); //check if wanted this.isCollect=(!this.alreadyProcessed && (w=="dynamic" || WM.apps[this.synApp.appID].opts[w] || (w.startsWith("send") && WM.apps[this.synApp.appID].opts["sendall"]) ) ); //check if wishlist if (w.find("wishlist")) { this.isWishlist=true; if (WM.opts.hideunwanted && !WM.opts.donthidewishlists) {this.remove(); return false;} } //if unwanted if (!this.isCollect && WM.opts.hideunwanted) {this.remove(); return false;} //debug post /*var pkg=debug.print("WM.Post.debug: "); pkg.msg.appendChild(createElement("button",{type:"button",onclick:function(){ //response.responseText.toClipboard(); promptText(JSON.stringify(self)); }},[ createElement("img",{src:"http://i1181.photobucket.com/albums/x430/merricksdad/array.png",title:"Show Data",style:"width:16px;height:16px; vertical-align:bottom;"}) ]));*/ //return true to draw, false to hide return true; }catch(e){log("WM.Post.identify: "+e);}}; //open this post using the collector system this.open=function(params){try{ params=params||{}; var post = this; var id = this.id; var app = this.app; var synApp = this.synApp; //perform the onBefore Collect event WM.rulesManager.doEvent("onBeforeCollect",post); //fix the link based on sidekick alterlink information var alterLink=(synApp.alterLink||null); var targetHref = post.linkHref; var doAlterLink=(synApp.flags.alterLink||false); if (doAlterLink && alterLink) { //alert("doing alterlink..."); //pack the alterlink into an array, or detect an array if (!isArray(alterLink)) alterLink=[alterLink]; //iterate link alteration commands for (var alt=0,alteration;(alteration=alterLink[alt]);alt++) { //alert("making alteration..."); //note that only find and replace functionality is available right now, no wildcards or array inserts will work var find = (alteration.find||""); alteration.dataSource=(alteration.dataSource||"either"); //check if user is wanting a regex or string replacement if (alteration.isRegex||false) find=new RegExp(find,""); targetHref = targetHref.replace(find,(alteration.replace||"")); //check for word specific changes if ((alteration.words||null) && (alteration.conversionChart||null)){ //alert("inserting words..."); //new alterlink capability to change data source from 'either' to another post part var dataSource = post.testData[alteration.dataSource].toLowerCase(); //alert(dataSource); for (var w=0,len=alteration.words.length; w<len; w++) { var word=(alteration.words[w]).toLowerCase(); if (dataSource.contains(word)) { //replace the word targetHref=targetHref.replace("{%1}",alteration.conversionChart[word.noSpaces()]); break; } } } } } //fix the link, removing https and switching to http only targetHref = targetHref.replace('https://','http://'); //open the bonus page in a new tab or the previously opened tab object to save memory this.isWorking=true; post.state="working"; WM.requestsOpen++; doAction(function(){WM.collector.open({url:targetHref,id:id,callback:(synApp.isVer3?WM.onFrameLoad3:WM.onFrameLoad),post:post,first:params.first||false,emergency:params.emergency||false});}); }catch(e){log("WM.Post.open: "+e);}}; //open this post using the collector system even if already tried this.forceOpen=function(params){try{ var post=self; this.isCollect=true; this.isFailed=false; this.isTimeout=false; this.isAccepted=false; post.open(params); }catch(e){log("WM.Post.forceOpen: "+e);}}; //like this post using the collector system this.like=function(){try{ //var url=this.permalink; var self=this; //setTimeout(function(){WM.collector.open({url:url+"#likeit=true",id:url,callback:WM.onLikePost,post:self});},100); //Graph.likePost(this.id,{callback:WM.onLikePost,post:self}); setTimeout(function(){Graph.likePost(self,{callback:WM.onLikePost,post:self});},100); }catch(e){log("WM.Post.like: "+e);}}; //comment on this post using the collector system this.comment=function(commentOverride){try{ if (commentOverride=="") commentOverride = null; //not ready //confirm("Feature not ready"); //return; //var url=this.permalink; var self=this; var say = commentOverride || WM.opts.autocommentlist.split("\n").pickRandom(); //setTimeout(function(){WM.collector.open({url:url+"#commentit=true&say="+say,id:url,callback:WM.onLikePost,post:self});},100); log("commenting "+say); //Graph.commentPost(this.id,say); setTimeout(function(){Graph.commentPost(self,say);},100); }catch(e){log("WM.Post.comment: "+e);}}; //cancel collection in progress this.cancelProcess=function(){ //tell the collector to cancel any processes with post equal this //this will cancel both collect and like activities WM.collector.cancelProcess({search:"post",find:this}); this.processCancelled=true; }, //cancel collection in progress this.refreshProcess=function(){ //tell the collector to reload the href on processes with post equal this //this will reload both collect and like activities WM.collector.refreshProcess({search:"post",find:this}); this.processRestarted=true; }, //change the background color of this post this.setColor=function(color){try{ this.colorOverride=color; this.isColored=(cBool(color)); }catch(e){log("WM.Post.setColor: "+e);}}; //change the bonus type of this post //and mark it for collection if needed //and update its idText this.setWhich=function(w){try{ this.which=w; if ((w=="dynamic") || WM.apps[this.synApp.appID].opts[w] || (w.startsWith("send") && WM.apps[this.synApp.appID].opts["sendall"]) ) { this.isCollect=!this.alreadyProcessed; } //update the identified text this.idText=WM.getAccText(this.synApp.appID,w,(this.alreadyProcessed),this.status); }catch(e){log("WM.Post.setWhich: "+e);}}; //get the time passed since this post was created this.__defineGetter__("age",function(){try{ return timeStamp()-(this.date*1000); }catch(e){log("WM.Post.age: "+e);}}); this.__defineGetter__("whichText",function(){try{ if (this.which=="dynamic") return "Dynamic Grab"; return this.synApp.userDefinedTypes[this.which]||this.synApp.accText[this.which]; }catch(e){log("WM.Post.whichText: "+e);}}); this.draw=function(redraw,reorder){try{ var post=this; var app=post.app; var synApp=app.synApp; //clean old display if (this.node && redraw) { remove(this.node); this.node=null; } //prefetch css words var tags=("") .toggleWordB(post.isAccepted,"accepted") .toggleWordB(post.isFailed,"failed") .toggleWordB(post.isTimeout,"timeout") .toggleWordB(post.isExcluded,"excluded") .toggleWordB(post.isStale,"stale") .toggleWordB(post.isCollect && !(post.isAccepted||post.isFailed),"collect") .toggleWordB(post.isWorking,"working") .toggleWordB(post.isW2W,"w2w") .toggleWordB(post.isForMe,"isForMe") .toggleWordB(post.isMyPost,"isMyPost") .toggleWordB(post.isColored,"colored") .toggleWordB(post.isPaused,"paused") .toggleWordB(post.isPinned,"pinned") .toggleWordB(post.isUndefined,"noDef") .toggleWordB(post.isWishlist,"wishlist") .toggleWordB(post.isScam,"scam") .toggleWordB(post.isLiked,"liked"); //detect hidden/drawn image var hideimage = (WM.opts.hideimages || (WM.opts.hideimagesunwanted && (post.which==="none" || post.which==="exclude") ) ); var fakeimage = hideimage && WM.quickOpts.displayMode!="0"; hideimage=hideimage && WM.quickOpts.displayMode=="0"; //shared elements if (redraw){ post.toolboxNode=createElement("div",{className:"toolBox small inline"}); post.imageNode=createElement("img",{className:((!fakeimage && post.picture)?"":"resourceIcon noImageSmall16"),src:((!fakeimage)?post.picture:""||""),onerror:function(){this.className=this.className+" resourceIcon noImageSmall16"}}); post.imageLinkNode=(!hideimage)? createElement("span",{href:jsVoid,className:"picture",onclick:function(){post.forceOpen();} },[ post.imageNode ]):null; post.floaterNode=null; post.bodyNode=null; post.actorNode=createElement("a",{className:"actor",textContent:post.fromName,href:"http://www.facebook.com/profile.php?id="+post.fromID}); post.titleNode=createElement("span",{className:"title",textContent:post.name}); post.captionNode=createElement("span",{className:"caption",textContent:post.caption}); post.descriptionNode=createElement("span",{className:"description",textContent:post.description}); post.dateNode=createElement("span",{className:"postDate",textContent:[post.date,post.realtime]}); post.viaNode=createElement("a",{className:"appName",textContent:" via "+app.name,href:"http://apps.facebook.com/"+app.namespace+"/",title:app.appID}); post.linkNode=createElement("a",{className:"linkText"+(post.isExcluded?" excluded":"")+(post.idText?" identified":""),textContent:((post.idText||null) && WM.opts.debugrecog)?post.idText:post.linkText,href:post.linkHref,title:post.linkText}); post.statusNode=createElement("span",{className:"status",textContent:"Status: "+(post.status||"0")+ " " + (WM.statusText[post.status||"0"])}); post.pausedNode=createElement("div",{className:"pausedHover",title:"Collection for this post is paused, click to reactivate.",onclick:function(){post.isPaused=false;}},[createElement("img",{className:"resourceIcon playRight64"})]); //create the layout switch (WM.quickOpts.displayMode||"0"){ case "0": //classic mode post.node=createElement("div",{id:"post_"+post.id,className:"wm post classic "+tags+((hideimage)?" noimage":""),title:(post.isScam?"Post is possible scam":"")},[ post.toolboxNode, post.actorNode, post.imageLinkNode, (!WM.opts.hidebody)?post.bodyNode=createElement("div",{className:"body"},[ post.titleNode, (post.caption||null)?post.captionNode:null, (post.description||null)?post.descriptionNode:null, ]):null, createElement("div",{style:"margin-top:5px;"},[ (!WM.opts.hidedate)?post.dateNode:null, (!WM.opts.hidevia)?post.viaNode:null, post.linkNode, ]), post.pausedNode, ]); break; case "1": case "3": //short mode and old priority mode post.node=createElement("div",{id:"post_"+post.id,className:"wm post short "+WM.opts.thumbsize+tags,title:(post.isScam?"Post is possible scam":"")},[ post.imageLinkNode, post.floaterNode=createElement("div",{id:"floater_"+post.id,className:"floater "+WM.opts.thumbsize},[ post.toolboxNode, post.actorNode, post.dateNode, post.viaNode, post.linkNode, post.statusNode, post.pausedNode, ]), ]); post.imageNode.onmousemove=WM.moveFloater; break; case "2": //dev mode var fnLine=function(label,text){ return createElement("div",{className:"line"},[ createElement("label",{textContent:label+": "}), createElement("span",{textContent:text}) ]); }; post.node=createElement("div",{id:"post_"+post.id,className:"listItem wm post dev "+tags,title:(post.isScam?"Post is possible scam":"")},[ post.idNode=fnLine("id", post.id), post.toolboxNode, //post.imageLinkNode, createElement("div",{className:"subsection"},(function(){ var ret = []; ret.push(post.actorNode=fnLine("fromName (fromID)", post.fromName+"("+post.fromID+")")); ret.push(post.titleNode=fnLine("title",post.name)); if (post.message||null)ret.push(post.messageNode=fnLine("msg",post.message)); if (post.caption||null)ret.push(post.captionNode=fnLine("caption",post.caption)); if (post.description||null)ret.push(post.descriptionNode=fnLine("desc",post.description)); ret.push(post.appImageNode=fnLine("img",post.picture)); ret.push(post.dateNode=fnLine("date",post.realtime)); ret.push(post.appNameNode=fnLine("appName",app.name)); ret.push(post.appIDNode=fnLine("appID",app.appID)); ret.push(post.canvasNode=fnLine("canvas",app.namespace)); ret.push(post.urlNode=fnLine("url",post.linkHref)); //show likes if (post.likes||null){ if (post.likes.data||null){ ret.push(fnLine("likes","")); ret.push(post.likesNode=createElement("div",{className:"subsection"},(function(){ var data=post.likes.data; var retData=[]; for(var d=0,lenL=data.length; d<lenL; d++){ retData.push(fnLine("likeName(likeID)",data[d].name+"("+data[d].id+")")); } return retData; })())); } } //show comments if (post.comments||null){ if (post.comments.data||null){ ret.push(fnLine("comments","")); ret.push(post.commentsNode=createElement("div",{className:"subsection"},(function(){ var data=post.comments.data; var retData=[]; for(var d=0,lenC=data.length; d<lenC; d++){ retData.push(fnLine("commentorName(commentorID)",data[d].from.name+"("+data[d].from.id+")")); retData.push(fnLine("comment",data[d].message)); } return retData; })())); } } ret.push(post.idTextNode=fnLine("idText",post.idText)); ret.push(post.whichNode=fnLine("which",post.which)); ret.push(post.linkTextNode=fnLine("linkText",post.linkText)); return ret; })() ), post.pausedNode ]); break; } //add the toolbox post.addToolBox(); //use color override if (post.colorOverride) { post.node.style.setProperty("background-color",post.colorOverride,"important"); } } //if a filter exists check against filter var filter=(WM.quickOpts.filterApp||"All"); if (filter!="All" && filter!=app.appID) { //dont show this post in this filter if (this.node) remove(this.node); return; } //insert the post into view by sort order if (redraw || reorder) { var groupBy=WM.quickOpts.groupBy; if (groupBy){ //detect/create group var group=WM.newGroup({by:post[groupBy]}); var sibling=post.nextSibling(); if (sibling) group.insertBefore(post.node,sibling.node); else group.appendChild(post.node); } else { var sibling=post.nextSibling(); if (sibling) WM.console.feedNode.insertBefore(post.node, sibling.node); else WM.console.feedNode.appendChild(post.node); } } }catch(e){log("WM.Post.draw: "+e);}}; this.openSource=function(){try{ var url=this.permalink; //FF22 version GM_openInTab(url,"_blank"); //FF21 version //((WM.opts.useGM_openInTab)?GM_openInTab:window.open)(url,"_blank"); }catch(e){log("WM.Post.openSource: "+e);}}; this.addClass=function(s){try{ if (this.node){ this.node.className=this.node.className.addWord(s); } }catch(e){log("WM.Post.addWord: "+e);}}; this.removeClass=function(s){try{ if (this.node){ this.node.className=this.node.className.removeWord(s); } }catch(e){log("WM.Post.removeWord: "+e);}}; this.pause=function(){try{ this.isPaused=true; }catch(e){log("WM.Post.pause: "+e);}}; this.unPause=function(){try{ this.isPaused=false; }catch(e){log("WM.Post.unPause: "+e);}}; this.exclude=function(){try{ this.isExcluded=true; }catch(e){log("WM.Post.exclude: "+e);}}; this.collect=function(){try{ this.isCollect=true; }catch(e){log("WM.Post.collect: "+e);}}; this.stopCollect=function(){try{ this.isCollect=false; }catch(e){log("WM.Post.collect: "+e);}}; this.togglePin=function(){try{ this.isPinned=!this.isPinned; }catch(e){log("WM.Post.togglePin: "+e);}}; this.pin=function(){try{ this.isPinned=true; }catch(e){log("WM.Post.pin: "+e);}}; this.unPin=function(){try{ this.isPinned=false; }catch(e){log("WM.Post.unPin: "+e);}}; this.addToFeeds=function(){try{ WM.feedManager.newFeed({id:this.fromID, title:this.fromName}); WM.feedManager.save(); }catch(e){log("WM.Post.addToFeeds: "+e);}}; this.accept=function(mark){try{ this.isAccepted=true; this.isFailed=false; this.isTimeout=false; this.isWorking=false; this.isCollect=false; if (mark) WM.setAsAccepted(null, 3,this); }catch(e){log("WM.Post.accept: "+e);}}; this.fail=function(mark){try{ this.isFailed=true; this.isAccepted=false; this.isTimeout=false; this.isWorking=false; this.isCollect=false; if (mark) WM.setAsFailed(null, -18,this); }catch(e){log("WM.Post.fail: "+e);}}; this.timeout=function(){try{ this.isTimeout=true; this.isAccepted=false; this.isFailed=false; this.isWorking=false; this.isCollect=false; }catch(e){log("WM.Post.timeout: "+e);}}; this.remove=function(){try{ var node=(this.node||$("post_"+this.id)); if (node && node.parentNode) remove(node); this.node=null; //turn this post into a ghost so we can keep its data //for linked objects, but not process it in reid or redraw this.isGhost=true; //delete WM.posts[this.id]; }catch(e){log("WM.Post.remove: "+e);}}; this.addToolBox=function(){try{ var post=this; if (!WM.opts.showtoolbox) return; var toolNode = post.toolboxNode; if (toolNode) toolNode.appendChild( createElement("div",{},[ createElement("div",{onclick:function(){post.forceOpen();},title:"Open Post",className:"littleButton oddBlue"+((!WM.opts.showopen)?" hidden":"")},[ createElement("img",{className:"resourceIcon action"+WM.opts.littleButtonSize})]), createElement("div",{onclick:function(){post.cancelProcess();},title:"Cancel Process or AutoLike",className:"littleButton oddBlue"+((!WM.opts.showcancelprocess)?" hidden":"")},[ createElement("img",{className:"resourceIcon cancelProcess"+WM.opts.littleButtonSize})]), createElement("div",{onclick:function(){post.refreshProcess();},title:"Restart Process or AutoLike",className:"littleButton oddBlue"+((!WM.opts.showrestartprocess)?" hidden":"")},[ createElement("img",{className:"resourceIcon refreshProcess"+WM.opts.littleButtonSize})]), createElement("div",{onclick:function(){WM.pauseByType(post.app, post.which);},title:"Pause all bonuses of this type",className:"littleButton oddOrange"+((!WM.opts.showpausetype)?" hidden":"")},[ createElement("img",{className:"resourceIcon stop"+WM.opts.littleButtonSize})]), createElement("div",{onclick:function(){WM.unPauseByType(post.app, post.which);},title:"Unpause all bonuses of this type",className:"littleButton oddGreen"+((!WM.opts.showunpausetype)?" hidden":"")},[ createElement("img",{className:"resourceIcon playRight"+WM.opts.littleButtonSize})]), createElement("div",{onclick:function(){window.open(post.permalink,"_blank");},title:"Show Post Source",className:"littleButton oddBlue"+((!WM.opts.showpostsrc)?" hidden":"")},[ createElement("img",{className:"resourceIcon openInNewWindow"+WM.opts.littleButtonSize})]), createElement("div",{onclick:function(){post.remove();},title:"Clean",className:"littleButton oddOrange"+((!WM.opts.showclean)?" hidden":"")},[ createElement("img",{className:"resourceIcon trash"+WM.opts.littleButtonSize})]), createElement("div",{onclick:function(){post.togglePin();},title:"Pin",className:"littleButton"+((!WM.opts.showpin)?" hidden":"")},[ post.pinImageNode=createElement("img",{className:"resourceIcon "+(post.isPinned?"pinned":"pin")+WM.opts.littleButtonSize})]), createElement("div",{onclick:function(){post.moveToBottom();},title:"Move to Bottom",className:"littleButton oddOrange"+((!WM.opts.showmovebottom)?" hidden":"")},[ createElement("img",{className:"resourceIcon moveBottomLeft"+WM.opts.littleButtonSize})]), createElement("div",{onclick:function(){post.moveToTop();},title:"Move to Top",className:"littleButton oddGreen"+((!WM.opts.showmovetop)?" hidden":"")},[ createElement("img",{className:"resourceIcon moveTopLeft"+WM.opts.littleButtonSize})]), createElement("div",{onclick:function(){post.reID();},title:"ReID Post",className:"littleButton"+((!WM.opts.showreid)?" hidden":"")},[ createElement("img",{className:"resourceIcon identify"+WM.opts.littleButtonSize})]), createElement("div",{onclick:function(){post.addToFeeds();},title:"Add To Feeds",className:"littleButton"+((!WM.opts.showaddfeed)?" hidden":"")},[ createElement("img",{className:"resourceIcon addFeed"+WM.opts.littleButtonSize})]), post.likeButtonNode=createElement("div",{onclick:function(){post.like();},title:"Like Post",className:"likeButton littleButton oddBlue"+(post.isLiked?" hidden":"")+((!WM.opts.showlike)?" hidden":"")},[ createElement("img",{className:"resourceIcon like"+WM.opts.littleButtonSize})]), createElement("div",{onclick:function(){post.comment();},title:"Auto Comment",className:"littleButton oddBlue"+((!WM.opts.showautocomment)?" hidden":"")},[ createElement("img",{className:"resourceIcon comment"+WM.opts.littleButtonSize})]), createElement("div",{onclick:function(){post.fail(true);},title:"Mark as Failed",className:"littleButton oddOrange"+((!WM.opts.showmarkfailed)?" hidden":"")},[ createElement("img",{className:"resourceIcon minus"+WM.opts.littleButtonSize})]), createElement("div",{onclick:function(){post.accept(true);},title:"Mark as Accepted",className:"littleButton oddGreen"+((!WM.opts.showmarkaccepted)?" hidden":"")},[ createElement("img",{className:"resourceIcon plus"+WM.opts.littleButtonSize})]), createElement("div",{onclick:function(){WM.rulesManager.ruleFromPost(post);},title:"Create Rule From Post",className:"littleButton oddBlue"+((!WM.opts.showmakerule)?" hidden":"")},[ createElement("img",{className:"resourceIcon gotoLibrary"+WM.opts.littleButtonSize})]), createElement("div",{onclick:function(){promptText(self.originalData,true);},title:"Show Original Data",className:"littleButton"+((!WM.opts.showoriginaldata)?" hidden":"")},[ createElement("img",{className:"resourceIcon object"+WM.opts.littleButtonSize})]), ]) ); }catch(e){log("WM.Post.addToolBox: "+e);}}; /* this.__defineGetter__("linkText", function(){try{ if (this.actions.length >=3) return this.actions.last().name||""; else return ""; }catch(e){log("WM.Post.linkText: "+e);}}); this.__defineGetter__("linkHref", function(){try{ return this.link||((this.actions.length>=3)?(this.actions.last().link||""):"")||""; if (this.actions.length >=3) return this.actions.last().link||""; else return this.link||""; }catch(e){log("WM.Post.linkHref: "+e);}}); */ /*this.actionLink=function(action){try{ //for (var a=0,act;(act=this.actions[a]);a++) if (act.name.toLowerCase()==action.toLowerCase()) {return act.link; break;} return this.linkHref; }catch(e){log("WM.Post.actionLink: "+e);}};*/ this.__defineGetter__("body", function(){try{ return (this.title||"")+" "+(this.caption||"")+" "+(this.description||""); }catch(e){log("WM.Post.body: "+e);}}); this.__defineGetter__("either", function(){try{ return this.linkText+" "+this.body; }catch(e){log("WM.Post.either: "+e);}}); /*this.__defineGetter__("date", function(){try{ return this["created_time"]; }catch(e){log("WM.Post.date: "+e);}});*/ this.checkStale=function(timeOverride) {try{ if (exists(timeOverride) && timeOverride==0) return false; var now = timeStamp(); var pubTime = this.date*1000; //(this.date.length < 10)?this.date+"000":this.date; //var pubTime = this.date+"000"; var aDay = (1000 * 60 * 60 * 24); return (now-pubTime)>(timeOverride||aDay); }catch(e){log("WM.Post.checkStale: "+e);}}; //req must equal "id" or "name" /*this.getTargets=function(req){try{ req = req||"id"; var ret = []; if (exists(this.to)) { for (var i=0,target; (target=this.to.data[i]);i++) ret.push(target[req]); } return ret; }catch(e){log("WM.Post.getTargets: "+e);}};*/ //ret must equal "id" or "message" or "name" or "count" this.getComments=function(req){try{ var ret = []; if (exists(this.comments)) if (this.comments.count) { switch(req){ case "message": for (var i=0,comment; (comment=this.comments.data[i]);i++) ret.push(comment[req]); break; case "id":case "name": for (var i=0,comment; (comment=this.comments.data[i]);i++) ret.push(comment.from[req]); break; case "count": return this.comments.count; break; } } return ret; }catch(e){log("WM.Post.getComments: "+e);}}; //ret must equal "id" or "name" or "count" this.getLikes=function(req){try{ req = req||"id"; var ret = []; if (exists(this.likes)) if (this.likes.count) { switch(req){ case "id":case "name": for (var i=0,like; (like=this.likes.data[i]); i++) ret.push(like[req]); break; case "count": return this.likes.count; break; } } return ret; }catch(e){log("WM.Post.getLikes: "+e);}}; this.moveToTop = function(){try{ if (this.node||null) this.node.parentNode.insertBefore(this.node,this.node.parentNode.childNodes[0]); }catch(e){log("WM.Post.moveToTop: "+e);}}; this.moveToBottom = function(){try{ if (this.node||null) this.node.parentNode.appendChild(this.node); }catch(e){log("WM.Post.moveToBottom: "+e);}}; this.setPriority = function(value){try{ this.priority=value; remove(this.node); this.draw(); }catch(e){log("WM.Post.setPriority: "+e);}}; this.reID = function(params){try{ params=params||{}; //reidentify var oldW=this.which; if (this.identify({reid:true})) { WM.rulesManager.doEvent("onIdentify",this); } //sort me into proper location WM.sortPosts(); //redraw||reorder if (!this.isGhost) { this.draw(true,true); } }catch(e){log("WM.Post.reID: "+e);}}; //return the next visible sibling post //now checks for group and visibility this.nextSibling = function(){try{ //determine if there is an app filter var filter=(WM.quickOpts.filterApp||"All"); //determine display grouping var groupBy=WM.quickOpts.groupBy; var group=(groupBy)?WM.newGroup({by:this[groupBy]}):null; //get visible posts var visiblePosts=(filter=="All")?WM.posts:matchByParam(WM.posts,"appID",filter); if (groupBy) visiblePosts=matchByParam(visiblePosts,groupBy,this[groupBy]); //search for the current post var found=false, sibling=null; for (var p in visiblePosts) { if (found && visiblePosts[p].node) { if ((!groupBy && visiblePosts[p].node.parentNode==WM.console.feedNode) || (groupBy && visiblePosts[p].node.parentNode==group)){ sibling=visiblePosts[p]; break } } else if (visiblePosts[p]==this) found=true; } //return what is found return sibling; //warning: returns null if this is the last visible post }catch(e){log("WM.Post.nextSibling: "+e);}}; //return the previous visible sibling post //now checks for group and visibility this.previousSibling = function(){try{ //determine if there is an app filter var filter=(WM.quickOpts.filterApp||"All"); //determine display grouping var groupBy=WM.quickOpts.groupBy; var group=(groupBy)?WM.newGroup({by:this[groupBy]}):null; //get visible posts var visiblePosts=(filter=="All")?WM.posts:matchByParam(WM.posts,"appID",filter); if (groupBy) visiblePosts=matchByParam(visiblePosts,groupBy,this[groupBy]); //search for the current post var sibling=null; for (var p in visiblePosts) { if (visiblePosts[p]==this) break; else if (visiblePosts[p].node) { if ((!groupBy && visiblePosts[p].node.parentNode==WM.console.feedNode) || (groupBy && visiblePosts.node.parentNode==group)){ sibling=visiblePosts[p]; } } } //return what is found return sibling; //warning: returns null if this is the first visible post }catch(e){log("WM.Post.previousSibling: "+e);}}; //get the friend object related with this post (from the friend tracker) this.__defineGetter__("relatedFriend",function(){try{ return WM.friendTracker.friends[this.fromID]||null; }catch(e){log("WM.Post.relatedFriend: "+e);}}); this.__defineGetter__("friendAcceptedCount",function(){try{ return this.relatedFriend.acceptCount; }catch(e){log("WM.Post.friendAcceptedCount: "+e);}}); this.__defineGetter__("friendFailedCount",function(){try{ return this.relatedFriend.failCount; }catch(e){log("WM.Post.friendFailedCount: "+e);}}); //a little cleanup params = null; }catch(e){log("WM.Post.init: "+e);}}; })();