// add support for Array scan (ECMA 262 extension) if not already supported
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(elt /*, from*/) {
    var len = this.length;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++) {
      if (from in this && this[from] === elt)
        return from;
    }
    return -1;
  };
}

var BOOKMARKSNIFF = function() {
  /* Created by Niall Kennedy: http://www.niallkennedy.com/
  */
  this.runstate = {
    bookmark:{url:null,title:null},
    link:null,
	  test_elem:null,
	  visitedlinks:[]
  };

  // 16x16 image for each, followed by a visible name. visible name matches the wording of each site
  this.bookmarkbuttons = {
    ask:{link:'http:\/\/mystuff.ask.com\/mysearch\/BookmarkIt?t=webpages&',params:{title:'title',url:'url'},text:'Save to MyStuff'},
    blogmarks:{link:'http:\/\/blogmarks.net\/my\/new.php?',params:{title:'title',url:'url'},text:'Add to Blogmarks'},
    delicious:{link:'http:\/\/del.icio.us\/post?v=4&noui&jump=close&',params:{title:'title',url:'url'},text:'Post to del.icio.us'},
    digg:{link:'http:\/\/digg.com\/submit?phase=2&',params:{title:'title',url:'url'},text:'digg it'}, //vote
    facebook:{link:'http:\/\/www.facebook.com\/sharer.php?',params:{title:'t',url:'u'},text:'Share on Facebook'},
    //fark:{link:'http:\/\/cgi.fark.com\/cgi\/fark\/submit.pl?voting=1&',params:{title:'headline',url:'new_url'}}, //vote, form
    furl:{link:'http:\/\/furl.net\/savedialog.jsp?p=1&',params:{title:'t',url:'u'},text:'Save it!'},
    google:{link:'http:\/\/www.google.com\/bookmarks\/mark?op=add&',params:{title:'title',url:'bkmk'},text:'Google Bookmark'},
    magnolia:{link:'http:\/\/ma.gnolia.com\/bookmarks\/quicksave?',params:{title:'title',url:'url'},text:'Mark in Ma.gnolia'},
    mrwong:{link:'http:\/\/www.mister-wong.de\/index.php?action=addurl&',params:{title:'bm_description',url:'bm_url'},text:'Add to Mister Wong'},
    myweb:{link:'http:\/\/myweb2.search.yahoo.com\/myresults\/bookmarklet?',params:{title:'t',url:'u'},text:'Save to MyWeb'},
    newsvine:{link:'http:\/\/www.newsvine.com\/_tools\/seed?popoff=0&',params:{title:'h',url:'u'},text:'Seed Newsvine'},
    propeller:{link:'http:\/\/www.propeller.com\/submit\/?',params:{title:'T',url:'U'},text:'Submit to Propeller'}, //vote
    reddit:{link:'http:\/\/reddit.com\/submit?',params:{title:'title',url:'url'},text:'reddit this'}, //vote
    shadows:{link:'http:\/\/www.shadows.com\/bookmark\/saveLink.rails?',params:{title:'title',url:'page'},text:'Add to Shadows'},
    simpy:{link:'http:\/\/www.simpy.com\/simpy\/LinkAdd.do?',params:{title:'title',url:'href'},text:'Simpy This!'},
    stumbleupon:{link:'http:\/\/www.stumbleupon.com\/submit?',params:{title:'title',url:'url'},text:'Stumble It!'},
    winlive:{link:'https:\/\/favorites.live.com\/quickadd.aspx?marklet=1&pinnedTop=1&publicCheck=1&',params:{title:'title',url:'url'},text:'Windows Live Favorite'}
  };

  this.testlinks = {bookmarks:[
 {provider:'ask',urlset:['http:\/\/mystuff.ask.com\/','http://mystuff.ask.com/user/DisplaySignin']},
 {provider:'blogmarks',urlset:['http:\/\/blogmarks.net\/','http:\/\/www.blogmarks.net\/','http:\/\/blogmarks.net\/my\/new.php','http:\/\/blogmarks.net\/my\/new.php']},
 {provider:'delicious',urlset:['http:\/\/del.icio.us\/','http:\/\/del.icio.us\/post\/','http:\/\/del.icio.us\/post']},
 {provider:'digg',urlset:['http:\/\/digg.com\/','http:\/\/www.digg.com\/','http:\/\/digg.com\/view\/technology','http:\/\/www.digg.com\/view\/technology','http:\/\/digg.com\/news','http:\/\/www.digg.com\/news','http:\/\/digg.com\/view\/science','http:\/\/www.digg.com\/view\/science','http:\/\/digg.com\/view\/world_business','http:\/\/www.digg.com\/view\/world_business','http:\/\/digg.com\/view\/sports','http:\/\/www.digg.com\/view\/sports','http:\/\/digg.com\/view\/entertainment','http:\/\/www.digg.com\/view\/entertainment','http:\/\/digg.com\/view\/gaming','http:\/\/www.digg.com\/view\/gaming','http:\/\/digg.com\/submit','http:\/\/www.digg.com\/submit']},
 {provider:'facebook',urlset:['http:\/\/www.facebook.com\/','http:\/\/www.facebook.com\/posted.php','http:\/\/www.facebook.com\/home.php','http:\/\/www.facebook.com\/friends.php']},
 //{provider:'fark',urlset:['http:\/\/www.fark.com\/','http:\/\/www.totalfark.com\/','http:\/\/www.fark.com\/sports\/','http:\/\/www.fark.com\/entertainment\/','http:\/\/www.fark.com\/tech\/','http:\/\/www.fark.com\/politics\/','http:\/\/www.fark.com\/video\/']},
 {provider:'furl',urlset:['http:\/\/furl.net\/savedialog.jsp','http:\/\/www.furl.net\/savedialog.jsp','http:\/\/furl.net\/','http:\/\/www.furl.net\/','http:\/\/furl.net\/index.jsp','http:\/\/www.furl.net\/index.jsp']},
 {provider:'google',urlset:['http:\/\/www.google.com\/bookmarks\/','http:\/\/www.google.com\/bookmarks\/mark','http:\/\/www.google.com\/bookmarks\/lookup','http:\/\/www.google.com\/ig\/modules\/bookmarks.xml','http:\/\/www.google.com\/ig\/bookmarks.xml']},
 {provider:'magnolia',urlset:['http:\/\/ma.gnolia.com\/']},
 {provider:'mrwong',urlset:['http:\/\/www.mister-wong.de\/','http:\/\/www.mister-wong.de\/index.php']},
 {provider:'myweb',urlset:['http:\/\/myweb.yahoo.com\/','http:\/\/myweb.yahoo.com\/myresults\/insertresult']},
 {provider:'newsvine',urlset:['http:\/\/www.newsvine.com\/','http:\/\/www.newsvine.com\/_tools\/seed','http:\/\/www.newsvine.com\/_wine\/save']},
 {provider:'propeller',urlset:['http:\/\/www.propeller.com\/submit\/','http:\/\/www.propeller.com\/']},
 {provider:'reddit',urlset:['http:\/\/reddit.com\/','http:\/\/reddit.com/submit','http:\/\/programming.reddit.com\/','http:\/\/programming.reddit.com\/submit','http:\/\/science.reddit.com\/','http:\/\/science.reddit.com\/']},
 {provider:'shadows',urlset:['http:\/\/shadows.com\/bookmark\/saveLink.rails','http:\/\/www.shadows.com\/bookmark\/saveLink.rails','http:\/\/shadows.com\/','http:\/\/www.shadows.com\/']},
 {provider:'simpy',urlset:['http:\/\/www.simpy.com\/','http:\/\/simpy.com\/']},
 {provider:'stumbleupon',urlset:['http:\/\/www.stumbleupon.com\/','http:\/\/buzz.stumbleupon.com\/']},
 {provider:'winlive',urlset:['https:\/\/favorites.live.com\/quickadd.aspx','https:\/\/favorites.live.com\/','http:\/\/favorites.live.com\/']}
]};

  function buildButton(obj) {
    if (obj.link) {
      var linkref = obj.link + obj.params.title + '=' + encodeURIComponent(runstate.bookmark.title) + "&" + obj.params.url + '=' + encodeURIComponent(runstate.bookmark.url);
      var link = document.createElement('a');
	    link.href = linkref;
      if (obj.text) {
        link.appendChild(document.createTextNode(obj.text));
      }
	    return link;
    }
    else {return null;}
  };

  function buildDiggButton(obj) {
    /*
      Add DiggThis compact live button to the page as a HTML object
      Visitors who are also Digg users will be prompted to submit the current page or vote
    */
    var frame = document.createElement('object');
    frame.id = 'diggframe';
    frame.height = 18;
    frame.width = 120;
    frame.type = 'text/html';
    frame.standby = 'loading digg data...';
    var data = 'http://digg.com/tools/diggthis.php?s=compact&u=' + encodeURIComponent(runstate.bookmark.url).replace(/\+/g,'%2b');
    if (runstate.bookmark.title) {
      data += '&t=' + encodeURIComponent(runstate.bookmark.title);
    }
    frame.data = data;
    data=null;
    return frame;
  };

  function buildRedditButton(obj) {
    var frame = document.createElement('object');
    frame.id = 'redditframe';
    frame.height = 22;
    frame.width = 130;
    frame.type = 'text/html';
    frame.standby = 'loading reddit data...';
    var data = 'http://reddit.com/button?t=1&url=' + encodeURIComponent(runstate.bookmark.url);
    if (runstate.bookmark.title) {
      data += '&title=' + encodeURIComponent(runstate.bookmark.title);
    }
    frame.data = data;
    data=null;
    return frame;
  };

return {
  hasVisitedLinks:function(){
    if (runstate.visitedlinks && runstate.visitedlinks.length>0) {return true;}
    else {return false;}
  },

  bookmarkdiscovery:function() {
    if (location.href && document.title) {
      runstate.bookmark.url = location.href;
      runstate.bookmark.title = document.title;
      return true;
    }
    else {
  	  return false;
	  }
  },

  init : function() {
    runstate.test_elem=document.getElementById('linktest');
    if (!runstate.test_elem) {
      runstate.test_elem=document.createElement('div');
      runstate.test_elem.id = 'linktest';
      runstate.test_elem.style.height = '1px';
      runstate.test_elem.style.width = '1px';
      document.body.appendChild(runstate.test_elem);
    }
    runstate.link=document.createElement('a');
    runstate.link.id = 'test_link';
    runstate.test_elem.appendChild(runstate.link);
    if (runstate.link.currentStyle) {
	    this.islinkvisited = function(url) {
		    var link = document.createElement('a');
        link.href = url;
        runstate.test_elem.appendChild(link);
        var color = link.currentStyle.color;
        if (color=='#000000') {runstate.test_elem.removeChild(link);return true;}
        else {runstate.test_elem.removeChild(link);return false;}
	    }
    } else {
	    this.islinkvisited = function(url) {
		    var link = document.createElement('a');
		    link.href=url;
  		  runstate.test_elem.appendChild(link);
        var computed_style = document.defaultView.getComputedStyle(link,null);
        if (computed_style) {
          if (computed_style.color=='rgb(0, 0, 0)') {runstate.test_elem.removeChild(link);return true;}
        }
        else {runstate.test_elem.removeChild(link);return false;}
	    }
    }
  },

  scan:function() {
	  var links = testlinks.bookmarks;
  	for (var i=0;i<links.length;i++){
	  	var linktype = links[i];
      if (linktype.provider && linktype.urlset) {
        var provider = linktype.provider;
        for (var j=0;j<linktype.urlset.length;j++) {
  	      var url = linktype.urlset[j];
	        var found = this.islinkvisited(url);
  	      if (found) {
	  	      if (runstate.visitedlinks && runstate.visitedlinks.indexOf(provider)<0) {
		  	      runstate.visitedlinks.push(provider);
              break;
			      }
  	      }
          url=found=null;
        }
        provider=null;
      }
	    linktype=null;
	  }
	  links=null;
	  runstate.test_elem.innerHTML='';
  },

  addbuttons : function() {
	  var list = document.getElementById('bookmark-list');
  	// only accept ordered or unordered lists
    if (list && (list.tagName.toLowerCase()=='ul' || list.tagName.toLowerCase()=='ol')) {
      list.innerHTML='';
      for (var i=0;i<runstate.visitedlinks.length;i++) {
	      var li = document.createElement('li');
        var link = null;
        switch(runstate.visitedlinks[i]) {
          case 'ask':
            link = buildButton(bookmarkbuttons.ask);
            li.id='bookmarksniff-ask';
            break;
          case 'blogmarks':
            link = buildButton(bookmarkbuttons.blogmarks);
            li.id='bookmarksniff-blogmarks';
            break;
          case 'delicious':
            link = buildButton(bookmarkbuttons.delicious);
            li.id='bookmarksniff-delicious';
            break;
          case 'digg':
            link = buildDiggButton(bookmarkbuttons.digg);
            li.id='bookmarksniff-digg';
            break;
          case 'facebook':
            link = buildButton(bookmarkbuttons.facebook);
            li.id='bookmarksniff-facebook';
            break;
          case 'furl':
            link = buildButton(bookmarkbuttons.furl);
            li.id='bookmarksniff-furl';
            break;
          case 'google':
            link = buildButton(bookmarkbuttons.google);
            li.id='bookmarksniff-google';
            break;
          case 'magnolia':
            link = buildButton(bookmarkbuttons.magnolia);
            li.id='bookmarksniff-magnolia';
            break;
          case 'mrwong':
            link = buildButton(bookmarkbuttons.misterwong);
            li.id='bookmarksniff-misterwong';
            break;
          case 'myweb':
            link = buildButton(bookmarkbuttons.myweb);
            li.id='bookmarksniff-myweb';
            break;
          case 'newsvine':
            link = buildButton(bookmarkbuttons.newsvine);
            li.id='bookmarksniff-newsvine';
            break;
          case 'propeller':
            link = buildButton(bookmarkbuttons.propeller);
            li.id='bookmarksniff-propeller';
            break;
          case 'reddit':
            link = buildRedditButton(bookmarkbuttons.reddit);
            li.id='bookmarksniff-reddit';
            break;
          case 'shadows':
            link = buildButton(bookmarkbuttons.shadows);
            li.id='bookmarksniff-shadows';
            break;
          case 'simpy':
            link = buildButton(bookmarkbuttons.simpy);
            li.id='bookmarksniff-simpy';
            break;
          case 'stumbleupon':
            link = buildButton(bookmarkbuttons.stumbleupon);
            li.id='bookmarksniff-stumbleupon';
            break;
          case 'winlive':
            link = buildButton(bookmarkbuttons.winlive);
            li.id='bookmarksniff-winlive';
            break;
          default:
            break;
        }
        if (link) {
          li.className='bookmarksniff';
          if (link.tagName=='A') {
            // build a sprite the GWT way
            var img = document.createElement('img');
            img.alt='';
            img.src='clear.cache.gif';
            li.appendChild(img);
            img = null;
          }
          li.appendChild(link);
          list.appendChild(li);
        }
        li=link=null;
      }
    }
  },

  run : function() {
    if (this.bookmarkdiscovery()) {
      this.init();
      this.scan();
      if (this.hasVisitedLinks()) {
        this.addbuttons();
      }
    }
  }
};
}();
