function find_parent(from, tag) {
  var p = from.parentNode;
  while (p && p.tagName && p.tagName.toLowerCase() != tag)
    p = p.parentNode;
  return p;
}

function portfolio_more(node) {
  var li = find_parent(node, 'li');
  if (li.moreHTML) {
    li.innerHTML = li.moreHTML;
  } else {
    li.smallHTML = li.innerHTML;
    li.linkNode = node;
    http_get(node.href, portfolio_receive, li);
  }
  return false;
}

function portfolio_less(node) {
  var li = find_parent(node, 'li');
  li.innerHTML = li.smallHTML;
  return false;
}

function portfolio_receive(html, http, li) {
  if (http.status != 200)
    return location.href = li.linkNode.href;
  li.moreHTML = extract_content(html);
  li.moreHTML += '<p><a href="#" onclick="return portfolio_less(this)">Close</a></p>';
  li.innerHTML = li.moreHTML;
}

function extract_content(html) {
  var div = document.createElement('div');
  div.innerHTML = html;
  return div.getElementsByTagName('div')[0].innerHTML;
}

if (typeof XMLHttpRequest == 'undefined') {
  XMLHttpRequest = function () {
    var msxmls = ['MSXML3', 'MSXML2', 'Microsoft'];
    for (var i=0; i < msxmls.length; i++) {
      try {
        return new ActiveXObject(msxmls[i]+'.XMLHTTP');
      } catch (e) { }
    }
    throw new Error('No XML component installed.');
  }
}

function http_get(uri, callbackFunction, callbackParameter) {
  var http = new XMLHttpRequest();
  http.open('GET', uri, true);
  http.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
  http.setRequestHeader('If-Modified-Since', 'Tue, 18 Feb 2005 12:00:00 GMT');
  http.send(null);
  http.onreadystatechange = function() {
    if (http.readyState == 4)
      callbackFunction(http.responseText, http, callbackParameter);
  }
}
