function setupPage() {
  for (var dapp in dapps) {
    ajaxCallForDapp(dapp);
  }
}

function ajaxCallForDapp(dapp) {
  var waitingDiv = document.createElement('div');
  waitingDiv.setAttribute('id','waiting_'+dapp);

  var waitingImg = document.createElement('img');
  waitingImg.setAttribute('src', '/images/smallWaiting.gif');
  waitingImg.setAttribute('align', 'absmiddle');
  waitingDiv.appendChild(waitingImg);
  
  waitingDiv.appendChild(document.createTextNode(' '+dapps[dapp]['source']));

  document.body.insertBefore(waitingDiv,$('newsTable'));
  
  // IE is so dumb, if we don't delay the execution, the images won't load
  if (document.all) {
    setTimeout(function() { ajaxCallForDappHelper(dapp); }, 1000);
  }
  else {
    ajaxCallForDappHelper(dapp);
  }
}

function ajaxCallForDappHelper(dapp) {

  var xmlUrl = '/RunDapp';
  
  var xmlPar = 'dappName='+dapp+'&'+
               'v=1';
  
  if (dapps[dapp]['args'])
    xmlPar += '&'+dapps[dapp]['args'];
  
  var thisDapp = dapps[dapp];
  
  var myAjax = new Ajax.Request(
    xmlUrl,
    {
      method: 'get',
      parameters: xmlPar,
      onComplete: function(originalRequest) {
                    insertStoriesIntoPage(originalRequest.responseXML, thisDapp);
                  }
    }      
  );              
}

function insertStoriesIntoPage(responseXML, dappInfoObject) {
  var currentlyHighlighted = document.getElementsByClassName('onHover');
  for (var i = 0; i < currentlyHighlighted.length; i++)
    currentlyHighlighted[i].className = '';
  
  var waitingDiv = $('waiting_'+dappInfoObject['dappName']);
  waitingDiv.parentNode.removeChild(waitingDiv);
  
  var fieldsArray = dappInfoObject['fields'];
  for (var i = 0; i < fieldsArray.length; i++) {
    var field = fieldsArray[i];

    var lastUrl = ''; // to fix a bug with ynetnews dapp and duplicate stories

    var els = responseXML.getElementsByTagName(field);
    for (var j = 0; j < els.length; j++) {
      var el = els[j];
      
      if (el.childNodes[0]) {
        var maxLen  = 60;
        var val     = el.childNodes[0].nodeValue;
        if (val.length > maxLen) {
          val = val.substring(0,maxLen);
          val+= '...';
        }

        if (el.getAttribute('href')) {
          
          // pnn bug which gets wrong url (how?)
          if (dappInfoObject['dappName'] == 'PalestineNewsNetworkEnglishMainPage')
            el.setAttribute('href',el.getAttribute('href').replace(/\.org\/ar/,'.org/english/ar'));
          
          
          // ynet dapp bug which includes non-stories
          if (dappInfoObject['dappName'] == 'YnetNewsEnglishMainPage' &&
              !el.getAttribute('href').match(/\/articles\//))
            break;

        
          // fix for ynetnews dapp bug which captures too much of main story
          if (lastUrl == el.getAttribute('href')) {
            lastUrl = el.getAttribute('href');
            break;
          }

          lastUrl = el.getAttribute('href');
          
          var tr  = document.createElement('tr');
          tr.onmouseover = function() { this.className = 'onHover'; };
          tr.onmouseout  = function() { this.className = ''; };
          
          var td1 = document.createElement('td');
          var insertElement = document.createElement('a');
          insertElement.setAttribute('href', el.getAttribute('href'));
          insertElement.appendChild(document.createTextNode(val));
          td1.appendChild(insertElement);
          tr.appendChild(td1);
          
          var td2 = document.createElement('td');
          td2.appendChild(document.createTextNode(dappInfoObject['source']));
          tr.appendChild(td2);
         
          var td3 = document.createElement('td');
          td3.appendChild(document.createTextNode(field.replace(/_/g,' ')));
          tr.appendChild(td3);
          
          var td4 = document.createElement('td');
          td4.style.display = 'none';
          td4.appendChild(document.createTextNode(i+'.'+j));
          tr.appendChild(td4);
          
          $('newsTableBody').appendChild(tr);
        }
      }
    }          
  }

  var st = new SortableTable($("newsTable"),
                             ["String", "String", "String", "Number"]);

  st.sort(3);
}

