   var req;
   var sreqs              = new Array();
   // var scount             = 0;
   var processed_services = 0;
   var responded_services = 0;
//   var services_base_URL  = 'http://' + window.location.host + '/stsw3/browse/services.php?';
   var services_base_URL  = 'http://' + window.location.host + '/services.php?';

   function changeImage(i, hover) {
      var img = document.getElementById(sreqs[i].img_id);
      if (hover == true) {
         img.setAttribute('src', skinpath + sreqs[i].link_hover);
      } else {
         img.setAttribute('src', skinpath + sreqs[i].link_img);
      }
   }

   function load_webpage_url(uri, id) {
      var url       = services_base_URL;
      // url           = url + 'service=webpage&';
      url           = url + 'service=all&';
      url           = url + 'uri=' + escape(uri);
      // sreqs[scount] = load_service_response_XML(url, uri, id, null);

      var img_id = 'icon_' + id;
      var target_div = document.getElementById(id);
      if (target_div) {
         target_div.innerHTML = target_div.innerHTML + '<img alt="' + msg_services_loading + '" title="' + msg_services_loading + '" id="' + img_id + '" src="' + skinpath + 'mini_web_gray.gif" border="0">';
      }
      // sreqs[scount] = load_service_response_XML(url, uri, id);
      sreqs.push(load_service_response_XML(url, uri, id));
   }

   /*
   function load_optional_urls(i) {
      var url  = services_base_URL;
      url      = url + 'service=all&';
      url      = url + 'uri=' + escape(sreqs[i].uri);
      sreqs[i] = load_service_response_XML(url, sreqs[i].uri, sreqs[i].propertyID, sreqs[i]);
   }
   */

   // function load_service_response_XML(url, uri, id, sreq) {
   function load_service_response_XML(url, uri, id) {
      // branch for native XMLHttpRequest object
      if (window.XMLHttpRequest) {
         req = new XMLHttpRequest();
         req.onreadystatechange = process_service_response;
         req.open("GET", url, true);
         req.send(null);
      // branch for IE/Windows ActiveX version
      } else if (window.ActiveXObject) {
         req = new ActiveXObject("Microsoft.XMLHTTP");
         if (req) {
            req.onreadystatechange = process_service_response;
            req.open("GET", url, true);
            req.send();
         }
      }
      if (url) { req.url = url; }
      if (uri) { req.uri = uri; }
      if (id)  { req.propertyID = id; }
      req.urls       = new Array();
      req.captions   = new Array();
      req.imgs       = new Array();
      req.link_img   = '';
      req.link_hover = '';
      req.img_id     = 'icon_' + req.propertyID;

      /*
      if (sreq) {
         // for (var u=0;u<sreq.urls.length;u++) {
         //    req.urls.push(sreq.urls[u]);
         // }

         req.urls = sreq.urls;

         req.processed = 1;
         req.reloaded  = true;

                     // debug
                     var debug;
                     if (do_debug == true) {
                        debug = document.getElementById('debug_info');
                     }
                     if (do_debug == true) {
                        var pg = document.createElement("p");
                        pg.innerHTML = 'Reloading ' + req.propertyID + ' (' + req.urls.length + ') ' + req.url;

                        for (var v=0;v<sreq.urls.length;v++) {
                           pg.innerHTML = pg.innerHTML + '<br/>' + req.urls[v];
                        }
                        debug.appendChild(pg);
                     }

      } else {
      */
         req.processed = 0;
         req.reloaded  = false;
      //    scount        = scount + 1;
      // }
      // alert(req.propertyID);
      return req;
   }

   function process_service_response() {
      var result = 0;

      // debug
      var debug;
      if (do_debug == true) {
         debug = document.getElementById('debug_info');
      }

      for (var i=0;i<sreqs.length;i++) {

         if ((sreqs[i].readyState == 4) && ((sreqs[i].processed == 0) || (sreqs[i].reloaded == true))) {
            window.status = '';

            responded_services = responded_services + 1;

                     // debug
                     if ((do_debug == true) && (sreqs[i].reloaded == true)) {
                        var ph = document.createElement("p");
                        ph.innerHTML = 'Receiving response from ' + sreqs[i].propertyID + ' (' + sreqs[i].urls.length + ') ...';
                        debug.appendChild(ph);
                     }

            if (sreqs[i].status == 200) {

               if (sreqs[i].responseXML) {
                  var response = sreqs[i].responseXML.documentElement;

                  if (response.getElementsByTagName('error')[0]) {
                     result = 0;
                  } else {
                     result = 1;
                  }

                  // url 0 : webpage url
                  if (response.getElementsByTagName('webpage')[0]) {
                     sreqs[i].urls.push(unescape(response.getElementsByTagName('webpage')[0].firstChild.data));
                     sreqs[i].captions.push(msg_services_caption_webpage);
                     sreqs[i].imgs.push('mini_web_hover.gif');
                     sreqs[i].link_img   = 'mini_web.gif';
                     sreqs[i].link_hover = 'mini_web_hover.gif';
                  } else {
                     sreqs[i].urls.push('');
                     sreqs[i].captions.push('');
                     sreqs[i].imgs.push('');
                  }

                  // url 1 : rdf document
                  if (response.getElementsByTagName('rdfdocument')[0]) {
                     sreqs[i].urls.push(unescape(response.getElementsByTagName('rdfdocument')[0].firstChild.data));
                     sreqs[i].captions.push(msg_services_caption_rdf);
                     sreqs[i].imgs.push('mini_rdf.gif');
                     sreqs[i].link_img   = 'mini_options.gif';
                     sreqs[i].link_hover = 'mini_options_hover.gif';
                  }

                  // url 2 : amazon
                  if (response.getElementsByTagName('amazon')[0]) {
                     var amazon = response.getElementsByTagName('amazon')[0];
                     if (amazon.getElementsByTagName('buyurl')[0]) {
                        sreqs[i].urls.push(unescape(response.getElementsByTagName('buyurl')[0].firstChild.data));
                        sreqs[i].captions.push(msg_services_caption_amazon);
                        sreqs[i].imgs.push('mini_amazon.gif');
                        sreqs[i].link_img   = 'mini_options.gif';
                        sreqs[i].link_hover = 'mini_options_hover.gif';
                     }
                  }

                  // remove 'loading...' img
                  var img = document.getElementById(sreqs[i].img_id);
                  if (img) {
                     img.parentNode.removeChild(img);
                  }

                  // var row = document.getElementById(sreqs[i].propertyID);
                  var target_div = document.getElementById(sreqs[i].propertyID);
                  // if (row) {
                  if (target_div) {
                     // var children = row.childNodes;
                     // for (var j=0;j<children.length;j++) {
                     //    if (children[j].className == 'property_value') {

                           // debug
                           if (do_debug == true) {
                              var previousContent = target_div.innerHTML;
                              target_div.innerHTML = '<p class="debug_info">' + String(processed_services + 1) + '/' + String(sreqs.length) + '/' + String(responded_services) + ' ::: <a href="' + sreqs[i].url + '">' + sreqs[i].url + '</a></p>';
                              target_div.innerHTML = target_div.innerHTML + previousContent;
                           }

                           if (result == '1') {

                              /*
                              // add webpage img + link
                              if (sreqs[i].addWebpage) {
                                 children[j].innerHTML = children[j].innerHTML + '<a href="' + sreqs[i].urls[0] + '"><img src="' + skinpath + 'mini_web.gif" border="0"></a>';
                              } else {
                                 if ((do_debug == true) && (sreqs[i].urls[0] == '')) {
                                    children[j].innerHTML = children[j].innerHTML + '<p class="debug_info">' + 'empty response' + '</p>';
                                 }
                              }

                              // add optional urls
                              for (var u=1;u<sreqs[i].urls.length;u++) {
                                 // children[j].innerHTML = children[j].innerHTML + '<a href="' + sreqs[i].urls[u] + '"><img src="' + skinpath + 'mini_options.gif" border="0"></a>';
                                 var anchor_id = 'optional_urls_' + sreqs[i].propertyID;
                                 children[j].innerHTML = children[j].innerHTML + '<a id="' + anchor_id + '" href=""><img src="' + skinpath + 'mini_options.gif" border="0"></a>';
                                 // OAT.Anchor.assign(anchor_id, {activation:"hover", width:"320", height:"200"});
                              }
                              */

                              if (sreqs[i].urls.length == 1) {
                                 if (sreqs[i].urls[0] != '') {
                                    target_div.innerHTML = target_div.innerHTML + '<a href="' + sreqs[i].urls[0] + '"><img alt="' + msg_services_caption_webpage + '" title="' + msg_services_caption_webpage + '" id="' + sreqs[i].img_id + '" src="' + skinpath + sreqs[i].link_img + '" border="0" onmouseover="changeImage(' + i + ',true);" onmouseout="changeImage(' + i + ',false);"></a>';
                                 }
                              } else if (sreqs[i].urls.length > 1) {
                                 // var popup_id      = 'popup_' + sreqs[i].propertyID;
                                 var popup_link_id = 'popup_link_' + sreqs[i].propertyID;
                                 // var popup_div     = '<a id="' + popup_link_id + '"><img id="' + sreqs[i].img_id + '" src="' + skinpath + sreqs[i].imgs[0] + '" border="0" onmouseover="changeImage(' + i + ',0,true);" onmouseout="changeImage(' + i + ',0,false);" style="cursor: pointer;"></a>';
                                 var popup_link       = '<a id="' + popup_link_id + '"><img alt="' + msg_services_caption_options + '" id="' + sreqs[i].img_id + '" src="' + skinpath + sreqs[i].link_img + '" border="0" onmouseover="changeImage(' + i + ',true);" onmouseout="changeImage(' + i + ',false);" style="cursor: pointer;"></a>';
                                 // popup_div         = popup_div + '<div id="' + popup_id + '" class="popup" style="display:none;">';
                                 var popup_content = '';
                                 for (var u=0;u<sreqs[i].urls.length;u++) {
                                     if (sreqs[i].urls[u] != '') {
                                        popup_content = popup_content + '<p><a href="' + sreqs[i].urls[u] + '"><img alt="' + sreqs[i].captions[u] + '" title="' + sreqs[i].captions[u] + '" src="' + skinpath + sreqs[i].imgs[u] + '" border="0" style="vertical-align: text-bottom;"></a>';
                                        popup_content = popup_content + '<a href="' + sreqs[i].urls[u] + '">' + sreqs[i].captions[u] + '</a></p>';
                                     }
                                 }
                                 // popup_div = popup_div + '</div>';
                                 // target_div.innerHTML = target_div.innerHTML + popup_div;
                                 target_div.innerHTML = target_div.innerHTML + popup_link;
                                 // var popup_x = 0;
                                 // var popup_y = 16;
                                 // var popup_pos = String(popup_x) + ',' + String(popup_y);
                                 // new Popup(popup_id, popup_link_id, {position:popup_pos,trigger:'mouseover'});
                                 assignServicePopup(popup_link_id, popup_content);
                              }

                           } else {
                              if (do_debug == true) {
                                  target_div.innerHTML = target_div.innerHTML + '<p class="debug_info">' + sreqs[i].propertyID + '</p>';
                                  target_div.innerHTML = target_div.innerHTML + '<p class="debug_info">' + String(processed_services + 1) + '/' + String(sreqs.length) + '/' + String(responded_services) + ' ::: <a href="' + sreqs[i].url + '">' + sreqs[i].url + '</a></p>';
                                  target_div.innerHTML = target_div.innerHTML + '<p class="debug_info">' + sreqs[i].responseText + '</p>';
                              } else {
                                  target_div.innerHTML = target_div.innerHTML + msg_error_dynamic_bad_xml_data;
                              }
                           }
                     //    }
                     // }

                  } else {
                     // no matching div found
                  }

                  // if (sreqs[i].reloaded) {
                     sreqs[i].reloaded  = false;
                     sreqs[i].processed = 2;
                     processed_services = processed_services + 1;
                  /*
                  } else {
                     sreqs[i].processed = 1;

                     // if webpage is empty : remove it
                     if (sreqs[i].urls[0] == '') { sreqs[i].urls.shift(); }

                     // debug
                     if (do_debug == true) {
                        var pr = document.createElement("p");
                        pr.innerHTML = sreqs[i].propertyID + ' has been reloaded. (' + sreqs[i].urls.length + ')';
                        debug.appendChild(pr);
                     }

                     // load optional urls
                     load_optional_urls(i);
                  }
                  */

               } else {

                  // no XML response
                  // debug
                  if (do_debug == true) {
                     var p1 = document.createElement("p");
                     p1.innerHTML = sreqs[i].status + ': (no XML) ' + '<a href="' + sreqs[i].url + '">' + sreqs[i].url + '</a>';
                     debug.appendChild(p1);
                  } else {
                     // should we log this ? or send an email alert ?
                     // alert(msg_error_dynamic_bad_xml_data);
                  }

               }
            } else {

               // status <> 200
               // debug
               if (do_debug == true) {
                  var p2 = document.createElement("p");
                  p2.innerHTML = sreqs[i].status + ': ' + '<a href="' + sreqs[i].url + '">' + sreqs[i].url + '</a>';
                  debug.appendChild(p2);
               }
            }
         }
      }
   }

   function assignServicePopup(element,textContent) {
      var elm = $(element);
      var popup = OAT.Dom.create("div",{},"popup");
      OAT.Style.opacity(popup,0);
      popup.innerHTML = textContent;
      OAT.Dom.hide(popup);
      document.body.appendChild(popup);

      var a1 = new OAT.AnimationOpacity(popup,{opacity:1});
      var a2 = new OAT.AnimationOpacity(popup,{opacity:0});

      OAT.MSG.attach(a2.animation,OAT.MSG.ANIMATION_STOP,function(){ /* hide after opacity gets to 0 */
          OAT.Dom.hide(popup);
      });

      OAT.Event.attach(elm,"mouseover",function(event) { /* start displaying on mouseover */
          a2.stop();

          var position = OAT.Event.position(event);
          var offset_center = position[0] - (document.width / 2);
          if (offset_center > 0) {
             popup.style.left = String(position[0] - 150)+"px"; // 150 is the approximative width of the popup
          } else {
             popup.style.left = position[0]+"px";
          }
          popup.style.top = (position[1]+10)+"px";

          OAT.Dom.show(popup);
          a1.start();
      });

      OAT.Event.attach(popup,"mouseover",function(event) { /* start displaying on mouseover */
          a2.stop();
          OAT.Dom.show(popup);
          a1.start();
      });

      OAT.Event.attach(elm,"mouseout",function(event) { /* start hiding on mouseout */
          a1.stop();
          a2.start();
      });

      OAT.Event.attach(popup,"click",function(event) { /* start hiding on click */
          a1.stop();
          a2.start();
      });

      OAT.Event.attach(popup,"mouseout",function(event) { /* start hiding on mouseout */
          a1.stop();
          a2.start();
      });
   }
