  var currentFeed;
  var original = new Array();

  function AjaxRequest(u, cb) {
    this.callback = cb;
    this.url = u;
  }

  AjaxRequest.prototype.send = function() {
    this.request = (window.XMLHttpRequest ? new XMLHttpRequest() : (window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : null));
    var that = this;
    this.request.onreadystatechange = function() {
      that.callback(that);
    }
    this.request.open("GET", this.url, true);
    this.request.send(null);
  }

  function processLatestEntry(req) {
    var request = req.request;
    if (request.readyState == 4) {
      if (request.status == 200) {
        var resultText = request.responseText;
        var result = eval('(' + resultText + ')');

        var x = document.getElementById(req.resultDiv);
        if (!original["latest"+req.feedid]) {
          var baseContent = x.innerHTML.replace("<!--", "").replace("-->", "");
          original["latest"+req.feedid] = baseContent; 
        } else {
          var baseContent = original["latest"+req.feedid];
        }
        x.innerHTML = "";

        var loading = document.getElementById('loading');
        if (loading) loading.style.display = 'none';
        x.style.visibility = 'visible';

        var entries = result.entries;
                       
        var i = 0;
        
          var line = baseContent;
          currentFeed = entries[i].feedid;
          if (entries[i].feedid) line = line.replace(/@FEEDID@/g, entries[i].feedid);
          if (entries[i].title) line = line.replace(/@TITLE@/g, entries[i].title);
          if (entries[i].date) line = line.replace(/@DATE@/g, DateFormatter.format(new Date(entries[i].date), 'd/M/Y'));
          if (entries[i].id) line = line.replace(/@ID@/g, entries[i].id);
          if (entries[i].link) line = line.replace(/@URL@/g, entries[i].link);
          if (entries[i].content) line = line.replace(/@CONTENT@/g, entries[i].content);
          //alert("SHORTCONTENT = "+req.maxWords+" = "+createHtmlExcerpt(entries[i].content, req.maxWords));
          if (entries[i].content) line = line.replace(/@SHORTCONTENT@/g, createHtmlExcerpt(entries[i].content, req.maxWords));
          else if (entries[i].summary) line = line.replace(/@SHORTCONTENT@/g, createHtmlExcerpt(entries[i].summary, req.maxWords));
          else line = line.replace(/@CONTENT@/g, 'Geen korte inhoud beschikbaar.');
          if (entries[i].summary) line = line.replace(/@SUMMARY@/g, entries[i].summary);
          else if (entries[i].content) line = line.replace(/@SUMMARY@/g, createHtmlExcerpt(entries[i].content, 50));
          else line = line.replace(/@SUMMARY@/g, 'Geen korte inhoud beschikbaar.');
          if (entries[i].username) line = line.replace(/@USERNAME@/g, entries[i].username);
          x.innerHTML = x.innerHTML + line;
          if (result.showContent == "true") {
            var bcontent = document.getElementById("blogcontent"+entries[i].id);
            if (bcontent) {
              bcontent.style.display = 'inline';
            }
            var bcontent = document.getElementById("contentlink"+entries[i].id);
            if (bcontent) {
              bcontent.style.display = 'none';
            }
          }
          
      }
    }
  }
  
  function processOverview(req) {
    var request = req.request;
    if (request.readyState == 4) {
      if (request.status == 200) {
        var resultText = request.responseText;
        var result = eval('(' + resultText + ')');
        var feedname = document.getElementById("feedname");
        if (feedname && result.feedname) feedname.innerHTML = result.feedname;

        var x = document.getElementById(req.resultDiv);
        if (!original[req.feedid]) {
          var baseContent = x.innerHTML.replace("<!--", "").replace("-->", "");
          original[req.feedid] = baseContent; 
        } else {
          var baseContent = original[req.feedid];
        }
        x.innerHTML = "";

        var loading = document.getElementById('loading');
        if (loading) loading.style.display = 'none';
        x.style.visibility = 'visible';

        var entries = result.entries;
        for(i=0;i<entries.length;i++) {
          var line = baseContent;
          currentFeed = entries[i].feedid;
          if (entries[i].feedid) line = line.replace(/@FEEDID@/g, entries[i].feedid);
          if (entries[i].title) line = line.replace(/@TITLE@/g, entries[i].title);
          if (entries[i].date) line = line.replace(/@DATE@/g, DateFormatter.format(new Date(entries[i].date), 'd/M/Y'));
          if (entries[i].id) line = line.replace(/@ID@/g, entries[i].id);
          if (entries[i].link) line = line.replace(/@URL@/g, entries[i].link);
          if (entries[i].content) line = line.replace(/@CONTENT@/g, entries[i].content);
          else line = line.replace(/@CONTENT@/g, 'Geen korte inhoud beschikbaar.');
          if (entries[i].summary) line = line.replace(/@SUMMARY@/g, entries[i].summary);
          else if (entries[i].content) line = line.replace(/@SUMMARY@/g, createExcerpt(entries[i].content, 0, 500));
          else line = line.replace(/@SUMMARY@/g, 'Geen korte inhoud beschikbaar.');
          if (entries[i].username) line = line.replace(/@USERNAME@/g, entries[i].username);
          x.innerHTML = x.innerHTML + line;
          if (result.showContent == "true") {
            var bcontent = document.getElementById("blogcontent"+entries[i].id);
            if (bcontent) {
              bcontent.style.display = 'inline';
            }
            var bcontent = document.getElementById("contentlink"+entries[i].id);
            if (bcontent) {
              bcontent.style.display = 'none';
            }
          }
        }
      }
    }
  }
  


  function retrieveFeedOverview(feedid, max, div) {
    var ajax = new AjaxRequest("/produceplay/servlet/jsonfeed?action=overview&feedid="+feedid+"&max="+max, processOverview);
    ajax.resultDiv = div;
    ajax.feedid = feedid;
    ajax.send();
  }

  function retrieveFeedOverview2(params, prefix) {
    var ajax = new AjaxRequest("/produceplay/servlet/jsonfeed?action=overview&feedid="+params.id+"&max="+params.count, processOverview);
    ajax.resultDiv = prefix + params.id;
    ajax.feedid = params.id;
    ajax.send();
  }
  
  function retrieveLatestEntry(feedid, maxWords, prefix) {
    var ajax = new AjaxRequest("/produceplay/servlet/jsonfeed?action=overview&feedid="+feedid+"&max=1", processLatestEntry);
    ajax.resultDiv = prefix + feedid;
    ajax.feedid = feedid;
    ajax.maxWords = maxWords;
    ajax.send();
  }  

  function retrieveFeedEntries(feedid, div) {
    currentFeed = feedid;
    var ajax = new AjaxRequest("/produceplay/servlet/jsonfeed?action=entries&feedid="+feedid, processOverview);
    ajax.resultDiv = div;

    showLoading(div);

    ajax.send();
  }

  function retrieveEntry(id, div) {
    var ajax = new AjaxRequest("/produceplay/servlet/jsonfeed?action=entry&entryid="+id, processOverview);
    ajax.resultDiv = div;

    showLoading(div);

    ajax.send();
  }

  function showCurrentFeed(div) {
    retrieveFeedEntries(currentFeed, div);
  }


  function showLoading(div) {
    var x = document.getElementById(div);
    x.style.visibility = 'hidden';
    var loading = document.getElementById('loading');
    if (loading) {
      loading.style.display = 'block';
      loading.style.top = findPosY(x) + 'px';
      loading.style.left = findPosX(x) + 'px';
    }
  }


  function findPosX(obj) {
        var curleft = 0;
        if (obj.offsetParent) {
                while (obj.offsetParent) {
                        curleft += obj.offsetLeft
                        obj = obj.offsetParent;
                }
        } else if (obj.x) curleft += obj.x;
        return curleft;
  }

  function findPosY(obj) {
        var curtop = 0;
        if (obj.offsetParent) {
                while (obj.offsetParent) {
                        curtop += obj.offsetTop
                        obj = obj.offsetParent;
                }
        } else if (obj.y) curtop += obj.y;
        return curtop;
  }


  function getParam(name) {
    var regexS = "[\\?&]"+name+"=([^&#]*)";
    var regex = new RegExp( regexS );
    var tmpURL = window.location.href;
    var results = regex.exec( tmpURL );
    if( results == null )
      return "";
    else
      return results[1];
  }

  function initFeed(div) {
    var id = getParam("id");
    var entryid = getParam("entry");
    if (entryid != "") {
      retrieveEntry(entryid, div);
    } else if (id != "") {
      retrieveFeedEntries(id, div);
    }
  }
  
  

  function createHtmlExcerpt(content, words) {
    if (!content) {
      return "";
    }
    var s = content.replace(/(<([^>]+)>)/ig,"");    
//    alert(s);
    var tags = new Array();
    var startTag=0,endTag=0;
    var inTag = false;
    var inWhitespace = false;
    var stopIndex = 0;
    var wc = 0;
    for(i=0;i<s.length;i++) {
      var c = s.charAt(i);
      if (c == '<') {
        startTag = i;
        inTag = true;      
      }
      if (c == '>') {
        endTag = i;
        inTag = false;
        var tag = s.substring(startTag+1, endTag);
//        alert("found tag "+tag);
        if (tag.substring(0,1) == '/') {
          if (tags[tags.length-1] == tag.substring(1)) {
            tags.length = tags.length - 1;          
          }        
        } else { 
          tags[tags.length] = tag;
        }                              
      }
      if (c == ' ' || c == '\n') {
        if (!inWhitespace) {
          inWhitespace = true;
          wc++;
          if (wc >= words) {
            stopIndex = i;
            break;          
          }
        }              
      } else {
        inWhitespace = false;
      }          
    }    
    //alert('tags = '+tags);
    //alert('wc = '+wc);
    if (stopIndex > 0) {
      var newS = s.substring(0, stopIndex);
      for(i = tags.length-1;i>=0;i--) {
        newS += '</'+tags[i]+'>';
      }
      //alert("new string = "+newS);
      return newS;
    } else {
      return s;    
    }           
                   
  }  

