Craigslist Inliner Kynetx App Update

Is there a better way to view listings on Craigslist.com? Yes! Is it easy to use? Yes!

Today I released an update to my Craigslist inliner Kynetx app that I released some time ago. This new update allows anyone to view a page of craigslist posts by their images. If you have ever thought to yourself that you just want to view all of the images then here is your answer.

Install the app by visitingĀ http://apps.kynetx.com/installable_apps/4445-Craigslist_Inliner

The other viewing mode, for those who are curious, loads each listing “inline” in an i-frame so you can just scroll down through the page to view all of the listings.

Google+ Filter Kynetx App

I have decided to release my Google+ filter app to the wild today. The app can currently filter out foul language in *postsĀ and comments and also hide animated gifs in the stream. http://apps.kynetx.com/installable_apps/4624-Google+_Filter

You can turn the filtering on and off using the controls that will show up on the right side of the Google+ interface.

Preferences are remembered so the next time you come back it’s just the way you left it. I plan on adding a feature in the future to be able to collapse posts if they match a list of keywords that you list. I personally really look forward to this feature so I can filter out what ever I want. If you have ideas or suggestions for this app or a new app please let me know.

As seen on Tom Anderson’s G+ profile!

Featured on mormonlifehacker.com!

Craigslist Inliner Kynetx App

Recently while browsing a lot of Craigslist postings I got sick of clicking each link to open in a new tab just to view them. If you have spent much time on Craigslist I’m sure you have experience the same frustration. This Kynetx app is my answer to my frustration. It will present a button on listing pages that, when clicked, will load each listing inline. You can view the app and get it by visiting http://apps.kynetx.com/installable_apps/4445-Craigslist_Inliner

Kynetx’s New Sandboxed Browser Extensions

I recently released my “Old School Retweet” Kynetx app in the Kynetx app store for the newly released browser extensions. I super love the new extensions and all that they do for users and developers alike. Something that I forgot when I released the app in the app store is that the new extension are sandboxed.

Because the extensions are sandboxed, all of the scripts from the extensions run a bit differently than they used to in the previous Kynetx extensions. Without getting into the technical details too much, the previous extensions just injected JavaScript into the page and the new extensions run JavaScript in a sandbox which has access to the DOM but can’t access anything else on the page. Because of this change my retweet app broke since I was using the jQuery loaded by Twitter.com to bring up the new tweet box (I do this because Twitter.com used that library to bind a click event and to trigger that event it has to be from the same library that bound it). Thankfully, with the help of a friend, I was able to get a work around for both Firefox and Chrome’s sandbox environment.

How I did it…

If the app is run not inside a sandbox I can just access the jQuery that Twitter.com loads to open a new tweet box

$("#new-tweet").trigger("click");

From within the Firefox sandbox I can access the page outside of the sandbox

window['$']("#new-tweet").trigger("click");

If I am in the Chrome sandbox I can create a script element that has the JavaScript that I want to execute. Crude, but it works. : )

var trigger_click_script = document.createElement("script");
var fallback = "window['$']('#new-tweet').trigger('click');";
trigger_click_script.innerHTML = fallback;
document.getElementsByTagName("head")[0].appendChild(trigger_click_script);

Here is the JavaScript code that I ended up with that gets executed when a user clicks on the retweet button.

// get stuff to retweet
var tweet = $K(this).parents(".tweet-content").find(".tweet-text").text();
var name = $K(this).parents(".tweet-content").find(".tweet-screen-name").text();

// build tweet
var retweet = "RT @"+name+" "+tweet;

// open new tweet box
$("#new-tweet").trigger("click");

// hack for FF sandbox
if ($("#tweet-dialog:visible").length === 0) {
  window['$']("#new-tweet").trigger("click");
}

// put tweet in new tweet box
$K(".draggable textarea.twitter-anywhere-tweet-box-editor").val(retweet).focus();
$K("#tweet_dialog a.tweet-button.button.disabled").removeClass("disabled");

// hack for chrome sandbox
if ($("#tweet-dialog:visible").length === 0) {
  var fallback = "window['$']('#new-tweet').trigger('click'); ";
  fallback += "window['$']('.draggable textarea.twitter-anywhere-tweet-box-editor').val('"+retweet+"').focus(); ";
  fallback += "window['$']('#tweet_dialog a.tweet-button.button.disabled').removeClass('disabled'); ";
  var trigger_click_script = document.createElement("script");
  trigger_click_script.innerHTML = fallback;
  document.getElementsByTagName("head")[0].appendChild(trigger_click_script);
}