   // var req;
   var preqs  = new Array();
   var processed_properties = 0;
   var responded_properties = 0;

   var max_active_requests = 3;
   var request_delay = 500; // 500 * 10 ms
   var request_clock = request_delay;
   var max_add_slot_time = 10000; // 10 seconds
   var max_running_time = 30000; // 30 seconds (test value)

   var request_stack = new Array();

//   var browser_base_URL = 'http://' + window.location.host + '/stsw3/browse/';
   var browser_base_URL = 'http://' + window.location.host + '/';

   function load_property_value(uri, id, embed, dataspace, parent, give_focus, getIDOnly) {
      var url = browser_base_URL + '?';
      if (skin_num > 0) {
         url = url + 'skin=' + skin_num + "&";
      }
      if (do_load_from_js) {
          url = url + 'fromjs&';
      }
      url = url + 'embed=' + embed + '&';
      if (getIDOnly) {
         if (getIDOnly == 'none') {
            url = url + 'getid&';
         } else {
            url = url + 'getid=' + escape(getIDOnly) + '&';
         }
      }
      if (dataspace) {
         url = url + 'dataspace=' + escape(dataspace) + '&';
      }
      if (parent) {
         url = url + 'parent=' + escape(parent) + '&';
      }
      if (do_services) {
         url = url + 'services&';
      }
      /*
      if (do_debug == true) {
         url = url + 'debug=true&';
      }
      */
      url = url + 'uri=' + escape(uri);
      // preqs.push(load_browser_response_XML(url, id, true, give_focus, getIDOnly));
      request = new requestInfo(url, id, give_focus, getIDOnly);
      request_stack.push(request);
      process_requests();
   }

   function requestInfo(requestURL, requestID, requestGiveFocus, requestGetIDOnly) {
      this.requestURL         = requestURL;
      this.requestID          = requestID;
      this.requestGiveFocus   = requestGiveFocus;
      this.requestGetIDOnly   = requestGetIDOnly;
      this.requestIsRunning   = false;
      this.requestIsCompleted = false;
      // var d = new Date();
      // this.requestStartTime   = d.getTime();
      this.requestSlotAdded   = false;
   }

   function stopRequestClock() {
      request_clock = "00";
   }

   function startRequestClock() {
      if (request_clock != "00") {
         request_clock = request_clock - 1;
         if (request_clock <= 0) {
            request_clock = request_delay;
            kill_timedout_requests();
         }
         timerID = setTimeout("startRequestClock()", 10);
      }
   }

   function kill_timedout_requests() {
      var d = new Date();
      var now_time = d.getTime();
      for (var r=0;r<request_stack.length;r++) {
         if (((now_time - request_stack[r].requestStartTime) > max_running_time) && (request_stack[r].requestIsRunning == true)) {
            // request_stack[r].requestIsRunning = false;
            // request_stack[r].requestIsCompleted = true;
            // var target_div = document.getElementById(request_stack[r].requestID);
            // target_div.innerHTML = display_error_msg_embedded(msg_error_loading_timed_out);
            var seconds = Math.round((now_time - request_stack[r].requestStartTime) / 10000) * 10;
            display_property_loading_progress(true, seconds, request_stack[r].requestID);
         }
      }
      process_requests();
   }

   function process_requests() {
      // get numbers of active requests
      var active_requests = 0;
      for (var r=0;r<request_stack.length;r++) {
         if (request_stack[r].requestIsRunning == true) {
            active_requests = active_requests + 1;
         }
      }

      // if no more slots available : add slots if requests have been running for too long
      if (max_active_requests == active_requests) {
         var d = new Date();
         var now_time = d.getTime();
         var r = 0;
         var done = false;
         while (!done && (r < request_stack.length)) {
            if ((request_stack[r].requestIsRunning == true) && ((now_time - request_stack[r].requestStartTime) > max_add_slot_time) && (request_stack[r].requestSlotAdded == false)) {
               request_stack[r].requestSlotAdded = true;
               max_active_requests = max_active_requests + 1;
               done = true;
            }
            r = r + 1;
         }
      }

      // trigger requests as needed
      var triggered_requests = max_active_requests - active_requests;
      var t = 0;
      while (t < triggered_requests) {
         // find next queued request
         var r = 0;
         var found = false;
         while ((r < request_stack.length) && (!found)) {
            if ((request_stack[r].requestIsRunning == false) && (request_stack[r].requestIsCompleted == false)) {
               found = true;
            } else {
               r = r + 1;
            }
         }
         // trigger the request
         if (found == true) {
            request_stack[r].requestIsRunning = true;
            var trigged_date = new Date();
            request_stack[r].requestStartTime = trigged_date.getTime();
            preqs.push(load_browser_response_XML(request_stack[r].requestURL, request_stack[r].requestID, true, request_stack[r].requestGiveFocus, request_stack[r].requestGetIDOnly, r));
         }
         // next
         t = t + 1;
      }
   }

   function do_embed_inline(imgID, containerID, uri, id, embed, dataspace, parent) {
      var img = document.getElementById(imgID);
      img.src = skinpath + 'hourglass.png';
      img.title = msg_dynamic_property_loading;
      img.onclick = '';

      var container = document.getElementById(containerID);
      container.onmouseover = '';
      container.onmouseout = '';

      load_property_value(uri, id, embed, dataspace, parent, '', '');
   }

   function load_browser_response_XML(url, id, first, give_focus, getIDOnly, requestIndex) {

      if (window.XMLHttpRequest) {
         // branch for native XMLHttpRequest object
         var req = new XMLHttpRequest();
      } else if (window.ActiveXObject) {
         // branch for IE/Windows ActiveX version
         var req = new ActiveXObject("Microsoft.XMLHTTP");
      }

      if (req) {
         if (OAT.Browser.isIE || OAT.Browser.isGecko) {
            req.onprogress = on_property_loading_progress;
         }
         req.onreadystatechange = function() { process_browser_response(req); }

         if (id) { req.propertyID = id; }
         req.url = url;
         req.processed = false;
         if (first == true) {
            req.reloads = 0;
         } else {
            req.reloads = req.reloads + 1;
         }
         req.give_focus = give_focus;
         req.getIDOnly  = getIDOnly;
         req.reqIndex   = requestIndex;
         /*
         if (do_debug == true) {
            alert(url);
         }
         */

         req.open("GET", url, true);
      }

      if (window.XMLHttpRequest) {
         // branch for native XMLHttpRequest object
         req.send(null);
      } else if (window.ActiveXObject) {
         // branch for IE/Windows ActiveX version
         req.send();
      }

      return req;
   }

   function on_property_loading_progress(e) {
      var percentComplete = Math.round((e.position / e.totalSize)*100);
      var targetreq = e.target;
      display_property_loading_progress(false, percentComplete, targetreq.propertyID);
   }

   function display_property_loading_progress(stillloading, percentComplete, divID) {
      var target_div = document.getElementById(divID);
      if (target_div) {
         if (stillloading == true) {
            target_div.innerHTML = '<div class="progress_container">' + msg_dynamic_property_loading + ' (' + percentComplete + ' ' + msg_property_loading_elapsed + ')</div>';
         } else {
            var displayPercent = percentComplete;
            if (skin_num > 0) {
               var displayLimit = 15;
            } else {
               var displayLimit = 7;
            }
            if (displayPercent < displayLimit) {
               displayPercent = ''; // to avoid displaying a percentage that exceeds the div width
            } else {
               displayPercent = displayPercent + ' %';
            }
            if (percentComplete == 100) { percentComplete = 99; } // to avoid exceeding the container
            target_div.innerHTML = '<div class="progress_container"><div class="progress_bar" style="width: ' + percentComplete + '%;">' + displayPercent + '</div></div>';
         }
      }
   }

   function process_browser_response(req) {
      // debug
      if (do_debug == true) {
         var d = document.getElementById('debug_info');
      }

      // for (var i=0;i<preqs.length;i++) {

         if ((req.readyState == 3) && (req.processed == false)) {
            /*
            if (!OAT.Browser.isIE7) {
               var totalBytes = req.getResponseHeader("Content-Length");
            if (req.responseStream) {
               var bytesLoaded = req.responseStream.length;
            } else {
               if (req.responseText) {
                  var bytesLoaded = req.responseText.length;
               }
            }
            }
            if (!OAT.Browser.isIE7) {
               var percentComplete = Math.round((bytesLoaded / totalBytes)*100);
               display_property_loading_progress(percentComplete, req.propertyID);
            } else {
               display_property_loading_progress(null, req.propertyID);
            }
            */
            if (!OAT.Browser.isIE && !OAT.Browser.isGecko) {
               var totalBytes = req.getResponseHeader("Content-Length");
               if (req.responseStream) {
                  var bytesLoaded = req.responseStream.length;
               } else {
                  if (req.responseText) {
                     var bytesLoaded = req.responseText.length;
                  }
               }
               var percentComplete = Math.round((bytesLoaded / totalBytes)*100);
               display_property_loading_progress(false, percentComplete, req.propertyID);
            }
         }

         if ((req.readyState == 4) && (req.processed == false)) {
            window.status = '';

            responded_properties = responded_properties + 1;

            if (req.status == 200) {

               if (req.responseXML) {
                  var response = req.responseXML.documentElement;

//                  if (do_debug == true) {
    //                          alert(response);
 //                 }
                  
                  var result = 0;
                  if (response) {
                     if (response.getElementsByTagName('result')) {
                        if (response.getElementsByTagName('result').length > 0) {
                           if (response.getElementsByTagName('result')[0].hasChildNodes()) {
                              var result = response.getElementsByTagName('result')[0].firstChild.data;
                           }
                        }
                     }

                     var allcontents = '';
                     var contents = response.getElementsByTagName('contents');
                     for (var c=0;c<contents.length;c++) {
                        if (contents[c].hasChildNodes()) {
                           allcontents = allcontents + contents[c].firstChild.data;
                        }
                     }
                  }

                  // var row = document.getElementById(req.propertyID);
                  // if (row) {
                  var target_div = document.getElementById(req.propertyID);
                  if (target_div) {
                     // var children = row.childNodes;
                     // for (var j=0;j<children.length;j++) {
                     //    if ((children[j].className == 'property_value') || (children[j].className == 'property_hybrid')) {
                     //       children[j].innerHTML = '';
                           target_div.innerHTML = '';

                           // debug
                           if (do_debug == true) {
                              // children[j].innerHTML = '<p class="debug_info">' + String(processed_properties + 1) + '/' + String(preqs.length) + '/' + String(responded_properties) + '/' + String(req.reloads) + ' ::: <a href="' + req.url + '">' + req.url + '</a></p>';
                              target_div.innerHTML = '<p class="debug_info">' + String(processed_properties + 1) + '/' + String(preqs.length) + '/' + String(responded_properties) + '/' + String(req.reloads) + ' ::: <a href="' + req.url + '">' + req.url + '</a></p>';
                           }

                           if (result == '1') {
                              // add contents
                              // children[j].innerHTML = children[j].innerHTML + allcontents;
                              target_div.innerHTML = target_div.innerHTML + allcontents;

                              //alert(allcontents);
                              
                              // give focus
                              if (req.give_focus) { location.href = '#' + req.give_focus; }
                           } else {
                              if (do_debug == true) {
                                  // children[j].innerHTML = '<p class="debug_info">' + req.propertyID + '</p>';
                                  // children[j].innerHTML = children[j].innerHTML + '<p class="debug_info">' + String(processed_properties + 1) + '/' + String(preqs.length) + '/' + String(responded_properties) + '/' + String(req.reloads) + ' ::: <a href="' + req.url + '">' + req.url + '</a></p>';
                                  // children[j].innerHTML = children[j].innerHTML + '<p class="debug_info">' + req.responseText + '</p>';
                                  target_div.innerHTML = '<p class="debug_info">' + req.propertyID + '</p>';
                                  target_div.innerHTML = target_div.innerHTML + '<p class="debug_info">' + String(processed_properties + 1) + '/' + String(preqs.length) + '/' + String(responded_properties) + '/' + String(req.reloads) + ' ::: <a href="' + req.url + '">' + req.url + '</a></p>';
                                  target_div.innerHTML = target_div.innerHTML + '<p class="debug_info">' + req.responseText + '</p>';
                              } else {
                                  // children[j].innerHTML = msg_error_dynamic_bad_xml_data;
                                  target_div.innerHTML = display_error_msg_embedded(msg_error_dynamic_bad_xml_data);
                              }
                           }
                        // }
                     // }

                     // maps
                     if (result == '1') {
                        var maps = response.getElementsByTagName('map');
                        for (var k=0;k<maps.length;k++) {
                           loadMap(maps[k].firstChild.data);

                           // debug
                           if (do_debug == true) {
                              var pm = document.createElement("p");
                              pm.innerHTML = 'mapID: ' + maps[k].firstChild.data;
                              d.appendChild(pm);
                           }
                        }
                     }

                     // widgets
                     if (result == '1') {
                        process_widgets(response);
                     }

                     // triggers
                     if (result == '1') {
                        process_triggers(response, '');
                     }

                     // services
                     if (do_services && (result == '1')) {
                        var services = response.getElementsByTagName('service');
                        var serviceID;
                        var serviceValue;
                        for (var s=0;s<services.length;s++) {
                           serviceID    = services[s].getElementsByTagName('id')[0].firstChild.data;
                           serviceValue = services[s].getElementsByTagName('value')[0].firstChild.data;
                           load_webpage_url(serviceValue, serviceID);

                           // debug
                           if (do_debug == true) {
                              var ps = document.createElement("p");
                              ps.innerHTML = 'serviceID: ' + String(serviceID) +  ' / ';
                              ps.innerHTML = ps.innerHTML + 'serviceValue: ' + String(serviceValue);
                              d.appendChild(ps);
                           }
                        }
                     }

                     // resize images
                     if (result == '1') {
                        resize_images();
                     }

                     // update selector
                     if (result == '1') {
                        process_navigator_items(response, false, req.getIDOnly);
                     }

                     req.processed = true;
                     processed_properties = processed_properties + 1;
                     request_stack[req.reqIndex].requestIsRunning   = false;
                     request_stack[req.reqIndex].requestIsCompleted = true;
                     process_requests();
                  }

               } else {

                  // no XML response
                  // debug
                  if (do_debug == true) {
                     var p1 = document.createElement("p");
                     p1.innerHTML = req.status + ': (no XML) ' + '<a href="' + req.url + '">' + req.url + '</a>';
                     d.appendChild(p1);
                  } else {
                     // should we log this ? or send an email alert ?
                     // alert(msg_error_dynamic_bad_xml_data);
                  }

                  request_stack[req.reqIndex].requestIsRunning   = false;
                  request_stack[req.reqIndex].requestIsCompleted = true;
                  process_requests();

                  // reload
                  /*
                  if ((req.reloads < 5) && (req.processed == false)) {
                     req = load_browser_response_XML(req.url, req.propertyID, false, req.give_focus, req.getIDOnly, req.reqIndex);
                  } else {
                     req.processed = true;
                     // debug
                     if (do_debug == true) {
                        var pr = document.createElement("p");
                        pr.innerHTML = req.propertyID + ' was requested 5 times without success.';
                        d.appendChild(pr);
                     }
                  }
                  */

               }
            } else {

               // status <> 200
               // debug
               if (do_debug == true) {
                  var p2 = document.createElement("p");
                  p2.innerHTML = req.status + ': ' + '<a href="' + req.url + '">' + req.url + '</a>';
                  d.appendChild(p2);
               }

               request_stack[req.reqIndex].requestIsRunning   = false;
               request_stack[req.reqIndex].requestIsCompleted = true;
               process_requests();

               // reload
               /*
               if ((req.reloads < 5) && (req.processed == false)) {
                  req = load_browser_response_XML(req.url, req.propertyID, false, req.give_focus, req.getIDOnly, req.reqIndex);
               } else {
                  req.processed = true;
                  // debug
                  if (do_debug == true) {
                     var pr = document.createElement("p");
                     pr.innerHTML = req.propertyID + ' was requested 5 times without success.';
                     d.appendChild(pr);
                  }
               }
               */
            }
         }
      // }
   }

   function loadMap(id) {
      var map_div   = document.getElementById(id);
      if (map_div) {
         var latitude  = map_div.getAttribute('lat');
         var longitude = map_div.getAttribute('long');
         var desc      = map_div.getAttribute('desc');
         var label     = map_div.getAttribute('label');

         if (desc == '') {
            desc = label;
         }

         if (window.attachEvent) {
            // Internet Explorer
            loadMapFindLocation(longitude, latitude, desc, id);
         } else {
            // Firefox and standard browsers';
            loadMapFindLocation(longitude, latitude, desc, id);
         }
      }
   }