  var isIndexPage = false;
  var main_elem;
  var main_post;
  var allshown = false;
  var displayedPosts = new Array();
  var commentCounts = new Array();
  var notes_request;
  var notes_counter = 0;
  var ku_shown = 1;
  var search_request;
  var cloud_request;
  var cloud_shown = false;
  var search_request;
  var search_shown = false;
  var last_search;
  var search_all;
  var search_entries;

  function find_elem_by_class(elems, ename) {
    var ku_date;
    for (var i = 0; i < elems.length; i++) {
      var thisElem = elems[i];
      if (thisElem.className && thisElem.className == ename) {
        ku_date = thisElem;
        break;
      }
    }
    return ku_date;
  }

  function save_ku() {
    var divElem = document.getElementById('ku_post1');

    if(typeof(divElem) != 'undefined') {
      main_post = divElem.innerHTML;
      main_elem = divElem;
    }
  }

  function set_ku(postid) {
    if(allshown)
      return;
    ku_shown = postid;
    var srcElem = document.getElementById('ku_post' +postid);
    if(typeof(srcElem) != 'undefined' && typeof(main_elem) != 'undefined') {
      main_elem.innerHTML = srcElem.innerHTML;
      var main_divs = main_elem.getElementsByTagName('div');
      var dateelem = find_elem_by_class(main_divs, 'date');
      dateelem.style.display = 'block';
      var commelem = find_elem_by_class(main_divs, 'disqus_link');
      commelem.style.display = 'block';
    }
  }

  function reset_ku() {
    if(allshown || ku_shown == 1)
      return;

    if(typeof(main_elem) != 'undefined') {
      ku_shown = 1;
      main_elem.innerHTML = main_post;
    }
  }

  function stripTags(h) {
    var t = h.replace(/<.*?>/g, '');
    return t.replace(/\s+/g, ' ');
  }

  function show_all() {
    allshown = true;
    var main_divs = main_elem.getElementsByTagName('div');
    var main_date = find_elem_by_class(main_divs, 'date');
    var lastdate = '';
    if(main_date != null)
      lastdate = stripTags(main_date.innerHTML);

    for(var i=1; i<=15; ++i) {
      var elem = document.getElementById('ku_post'+i);
      if(elem != null) {
        var subElems = elem.getElementsByTagName('div');
        var dateelem = find_elem_by_class(subElems, 'date');
        var dateplain = stripTags(dateelem.innerHTML);
        if(dateplain == lastdate && i > 1)
          dateelem.style.display = 'none';
        elem.className = 'post ku_shown short_notes';
        lastdate = dateplain;
      } else
        break;
    }
    var showelem = find_elem_by_class(main_divs, 'showall');
    showelem.innerHTML = '[ <a href="javascript:hide_all()">-</a> ]';
  }

  function hide_all() {
    allshown = false;
    var main_divs = main_elem.getElementsByTagName('div');
    for(var i=2; i<=15; ++i) {
      var elem = document.getElementById('ku_post'+i);
      if(elem != null) {
        elem.className = 'post ku_hidden';
      } else
        break;
    }
    main_elem.className = 'post ku_shown';
    var showelem = find_elem_by_class(main_divs, 'showall');
    showelem.innerHTML = '[ <a href="javascript:show_all()">+</a> ]&nbsp;<div class="shy">show all</div>';
  }

function buildNotes() {
  var durl = encodeURI('http://scifai.com/post/' + displayedPosts[notes_counter]);
  notes_request = new JSONscriptRequest('http://disqus.com/api/v1/get_posts?forum_url=scifai&amp;thread_url='
    + durl + '&amp;response_type=json&amp;callback=scifaiShowNotes');
  notes_request.buildScriptTag();
  notes_request.addScriptTag();
}

function scifaiShowNotes(obj) {
  commentCounts[notes_counter] =  obj['num_posts'];
  var divElem = document.getElementById('ku_post'+(notes_counter+1));
  if(divElem == null) // user moved out of page
    return;
  var subElems = divElem.getElementsByTagName('div');

  for (var i = 0; i < subElems.length; i++) {
    var thisElem = subElems[i];
    if (thisElem.className && thisElem.className == 'authnote') {
      if((obj['num_posts'] != 0) && obj['posts'][0]['user']['display_name'] == 'scifai')
        thisElem.innerHTML = obj['posts'][0]['message'];
      else
        thisElem.innerHTML = '';
      break;
    }
  }
  notes_request.removeScriptTag();
  if(notes_counter == 0)
    save_ku();
  else {
    var subElems = divElem.getElementsByTagName('div');
    var listelem = find_elem_by_class(subElems, 'post_wrapper');
    listelem.className = 'post_wrapper comments_loaded';
  }

  ++notes_counter;
  if(notes_counter < displayedPosts.length)
    buildNotes();
}

function tumblrInfo(obj) {
  var tags = obj['posts'][0]['tags'];
  if(typeof(tags) != 'undefined') {
    var thtml = '';
    for(var i=0; i < tags.length; ++i) {
      if(thtml != '')
        thtml += ', ';
      var safetag = tags[i].replace(/'/, "\\'");
      thtml += '<a href="javascript:sfGetByTag(\'' + safetag + '\', \'\')">'+tags[i]+'</a>';
    }
    var pt = document.getElementById('post-tags');
    pt.innerHTML = '<h3>Tags</h3>' + thtml;
  }
}

function sfGetByTag(tag) {
  var sr = document.getElementById('searchresults');
  sr.innerHTML = '<img src="http://data.tumblr.com/PAZW4QH5I73i7uvevxssEa8v_400.gif" height="11" width="43" alt="***" />';

  tag = encodeURI('^'+tag+'$');
  search_request = new JSONscriptRequest('http://pipes.yahoo.com/ibrado/sfsearch?tag=' + tag + '&_render=json&_callback=getByTagCallback');
  search_request.buildScriptTag();
  search_request.addScriptTag();
}

function getByTagCallback(obj) {
  var sr = document.getElementById('searchresults');
  sr.innerHTML = '';

  var numres = obj['count'];
  if(numres > 0) {
    var rhtml = '';
    for(var i=0; i < numres; ++i) {
      var item = obj['value']['items'][i];
      var desc = item.description;
      desc = desc.replace(/<br\s*\/>/g, '// ');
      rhtml += '<div class="post-link">&#187; <a href="' + item.link + '" title="'
      + desc +'">' +  item.title + '</a></div>';
    }
    sr.innerHTML = rhtml;
  }
  search_request.removeScriptTag();
}

function tagCloud() {
  if(cloud_shown) {
    window.location.reload();

  } else {
    var tmp = document.getElementById('navigator');
    if(tmp != 'null') tmp.innerHTML = '';
    tmp = document.getElementById('searchresults');
    if(tmp != 'null') tmp.innerHTML = '';
    tmp = document.getElementById('post-tags');
    if(tmp != 'null') tmp.innerHTML = '';

    var sp = document.getElementById('scratchpad');
    var shtml = '<div id="extras"><h3>Tag <em>Cloud</em></h3>';
    shtml += '<div id="tagcloud"><span style="position: relative; top: 60px; left: 167px;"><img src="http://data.tumblr.com/PAZW4QH5I765lhgmL19cyv0d_100.gif" height="66" width="66" alt="loading..." border="0" /></span></div>';
    shtml += '</div>';
    sp.innerHTML = shtml;

    cloud_request = new JSONscriptRequest('http://pipes.yahoo.com/ibrado/sfcloud?_render=json&_callback=cloudCallback');
    cloud_request.buildScriptTag();
    cloud_request.addScriptTag();

    cloud_shown = true;
    search_shown = false;
  }
}

function cloudCallback(obj) {
  var tc = document.getElementById('tagcloud');
  tc.innerHTML = '';

  var numtags = obj['count']-1;
  if(numtags > 0) {
    var cloud_html = '';
    if(search_shown)
      cloud_html += '<hr size="1"/>';
    var cloud_max = obj['value']['items'][0]['count'];
    for(var i=1; i <= numtags; ++i) {
      var ratio = obj['value']['items'][i]['count'] / cloud_max;

      var fclass = 'normal';
      if(ratio < 0.2) fclass = 'smaller'
        else if(ratio < 0.4) fclass = 'small'
        else if(ratio < 0.6) fclass = 'normal'
        else if(ratio < 0.8) fclass = 'big'
        else fclass = 'bigger';

      fclass = 'cloud-' + fclass;
      var safetag = obj['value']['items'][i]['tag'] + '';
      safetag = safetag.replace(/'/, "\\'");
      var via = (search_shown ? 'sfViaSearch' : 'sfViaCloud');

      cloud_html += '<span class="' + fclass + '"><a href="javascript:' + via + '(' + "'" + safetag+ "'" + ')">'+obj['value']['items'][i]['tag']+'</a></span> ';
    }

    if(search_shown)
      cloud_html += '<br/><br/><div id="show_all_search"><a href="javascript:sfAllResults()">show all</a></div>';

    tc.innerHTML = cloud_html;
  }
  if(cloud_request != null)
    cloud_request.removeScriptTag();
}

function sfViaCloud(tag) {
  var tmp = document.getElementById('post-tags');
  tmp.innerHTML = '<h3>'+tag+'</h3>';
  tmp = document.getElementById('sidebar');
  tmp.style.display = 'block';
  sfGetByTag(tag);
}

function sfViaSearch(tag) {
  var tmp = document.getElementById('post-tags');
  tmp.innerHTML = '<h3>"' + last_search + '" ('+tag+')</h3>';
  tmp = document.getElementById('sidebar');
  tmp.style.display = 'block';
  var sr = document.getElementById('searchresults');

  var obj = search_entries[tag];
  var numres = obj['count'];
  if(numres > 0) {
    var rhtml = '';
    for(var i=0; i < numres; ++i) {
      var item = obj.entry[i];
      var desc = item.description;
      desc = desc.replace(/<br\s*\/>/g, '// ');
      rhtml += '<div class="post-link">&#187; <a href="' + item.link + '" title="'
      + desc +'">' +  item.title + '</a></div>';
    }
    sr.innerHTML = rhtml;
  }

  tmp = document.getElementById('show_all_search');
  tmp.style.display = 'block';
}

function sfAllResults() {
  var tmp = document.getElementById('post-tags');
  tmp.innerHTML = '<h3>"' + last_search + '"</h3>';

  tmp = document.getElementById('searchresults');
  tmp.innerHTML = search_all;

  tmp = document.getElementById('show_all_search');
  tmp.style.display = 'none';
}

function siteSearch() {
  if(search_shown) {
    window.location.reload();

  } else {
    var tmp = document.getElementById('navigator');
    if(tmp != 'null') tmp.innerHTML = '';
    tmp = document.getElementById('searchresults');
    if(tmp != 'null') tmp.innerHTML = '';
    tmp = document.getElementById('post-tags');
    if(tmp != 'null') tmp.innerHTML = '';

    var sp = document.getElementById('scratchpad');
    var shtml = '<div id="extras"><h3>Site <em>Search</em></h3>';
    shtml += '<div id="searcharea"><form action="#" onsubmit="javascript:startSearch(); return false;">Keywords: <input type="text" name="kw" id="search-kw"/>&nbsp;'
    + '<input type="checkbox" id="search-ic" />Include&nbsp;comments<br/>'
    + '<input type="button" id="search-go" value="Go!" onclick="javascript:startSearch()"/><br/>'
    + '</form></div><div id="tagcloud"></div>';
    shtml += '</div>';
    sp.innerHTML = shtml;

    search_shown = true;
    cloud_shown = false;
  }
}

function startSearch() {
  var tc = document.getElementById('tagcloud');
  tc.innerHTML = '<span style="position: relative; top: 60px; left: 167px;"><img src="http://data.tumblr.com/PAZW4QH5I765lhgmL19cyv0d_100.gif" height="66" width="66" alt="loading..." border="0" /></span>';

  var sb = document.getElementById('sidebar');
  sb.style.display = 'block';
  var pt = document.getElementById('post-tags');
  pt.innerHTML = '';

  var ic = document.getElementById('search-ic');
  var pipe = 'sfsearch';
  if(ic.checked) {
    pipe = 'sftdsearch';
  }

  var kw = document.getElementById('search-kw');
  var kw_re = kw.value;
  if(kw_re.replace(/\s+/g, '') == '') {
    tc.innerHTML = '<span style="position: relative; top: 20px;">Please enter some search keywords.</a>';
    return;
  }

  kw_re = kw_re.replace(/\b(he|she|it|i|you|are|is|at|to|for|from|by|on|in|my|your|his|her|hers|its|is|are|was|of|am|a|an|or|and)\b/g, '');
  kw_re = kw_re.replace(/^\s+/, '');
  kw_re = kw_re.replace(/\s+$/, '');
  kw_re = kw_re.replace(/\s+/g, ' ');
  kw.value = kw_re;

  if(kw_re.replace(/\s+/g, '') == '') {
    tc.innerHTML = '<span style="position: relative; top: 20px;">Please enter some search keywords.</a>';
    return;
  }

  var sr = document.getElementById('searchresults');
  sr.innerHTML = '<img src="http://data.tumblr.com/PAZW4QH5I73i7uvevxssEa8v_400.gif" height="11" width="43" alt="***" />';

  kw_re = kw_re.replace(/[\s+\,]+/g, '|');
  last_search = kw_re;
  var search_url = 'http://pipes.yahoo.com/ibrado/' + pipe + '?q=' + encodeURI(kw_re)
      + '&_render=json&_callback=searchCallback';

  search_request = new JSONscriptRequest(search_url);
  search_request.buildScriptTag();
  search_request.addScriptTag();
}

function searchCallback(obj) {
  var sr = document.getElementById('searchresults');
  sr.innerHTML = '';
  var cloud = new Array();
  var tagInfo = new Object();
  var tagList = new Array();

  var cloudobj = new Object();

  var maxitem = new Object();
  maxitem.tag = '_max_';
  maxitem.count = 0;

  var numres = obj['count'];
  if(numres > 0) {
    var rhtml = '';
    for(var i=0; i < numres; ++i) {
      var item = obj['value']['items'][i];
      var desc = item['description'];
      desc = desc.replace(/<br\s*\/>/g, '// ');
      rhtml += '<div class="post-link">&#187; <a href="' + item['link'] + '" title="'
      + desc +'">' +  item['title'] + '</a></div>';

      var tags = new Array();
      if(typeof(item['category']) == 'object') {
        tags = item['category'];
      } else {
        tags.push(item['category']);
      }

      for(var j=0; j < tags.length; ++j) {
        var ctag = tags[j];
        if(typeof(tagInfo[ctag]) == 'undefined') {
          tagList.push(ctag);
          tagInfo[ctag] = new Object();
          tagInfo[ctag].count = 0;
          tagInfo[ctag].entry = new Array();
        }

        var entryInfo = new Object();
        entryInfo.title = item['title'];
        entryInfo.link = item['link'];
        entryInfo.description = item['description'];
        tagInfo[ctag].entry.push(entryInfo);

        tagInfo[ctag].count++;
        if(tagInfo[ctag].count > maxitem.count)
          maxitem.count = tagInfo[ctag].count;
      }
    }
    sr.innerHTML = rhtml;
    search_all = rhtml;
    search_entries = tagInfo;

    tagList.sort();

    if(maxitem.count < 3)
      maxitem.count = 3;
    cloud.push(maxitem);

    for(var i=0; i < tagList.length; ++i) {
      var tagitem = new Object();
      tagitem.count = tagInfo[ tagList[i] ].count;
      tagitem.tag = tagList[i];
      cloud.push(tagitem);
    }
    cloudobj.count = cloud.length;
    cloudobj.value = new Object();
    cloudobj.value.items = cloud;

    cloudCallback(cloudobj);

  } else {
    var tc = document.getElementById('tagcloud');
    tc.innerHTML = '<span style="position: relative; top: 20px;">No items found. Please try again.</a>';
  }
  var pt = document.getElementById('post-tags');
  pt.innerHTML = '<h3>"' + last_search + '"</h3>';
  var tmp = document.getElementById('sidebar');
  tmp.style.display = 'block';
  search_request.removeScriptTag();
}
