var CONST_maxPerPage = 100;
var CONST_listingTableId = 'bztable1';
var CONST_pageArg = 'page';
var CONST_perPageArg = 'perpage';
var CONST_atozId = 'atoz';
var CONST_pagerId = 'pager';
var CONST_defaultArgSep = '&';
var CONST_directoryArgSep = ';';
var CONST_orderByArg = 'orderby';
var CONST_orderByValue = 'last';

var GLOBAL_intTotalResults;
var GLOBAL_pageToLetterFor15PerPage;
var GLOBAL_pageToLetterFor20PerPage;
var GLOBAL_pageToLetterFor50PerPage;
var GLOBAL_baseUrlforDirectory;

// Return an HTTP request object if one exists otherwise null.
function GetHTTPRequestObject() {
   try {
      HTTPRequest = new XMLHttpRequest();
   } catch (e) {
      try {
         HTTPRequest = new ActiveXObject('Msxml2.XMLHTTP');
      } catch (e) {
         try {
            HTTPRequest = new ActiveXObject('Microsoft.XMLHTTP');
         } catch (e) {
               HTTPRequest = null;
         }
      }
   }

   return HTTPRequest;
}

function NEWGetHTTPRequestObject() {
   var HTTPRequest, z, Z;

   try {
      if (typeof(XMLHttpRequest) != 'undefined') {
         HTTPRequest = new XMLHttpRequest();
      } else { z = Z; }
   } catch (e) {
      try {
         if (typeof(ActiveXObject) != 'undefined') {
            HTTPRequest = new ActiveXObject('Msxml2.XMLHTTP');
         } else { z = Z; }
      } catch (e) {
         try {
            if (typeof(ActiveXObject) != 'undefined') {
               HTTPRequest = new ActiveXObject('Msxml3.XMLHTTP');
            } else { z = Z; }
         } catch (e) {
            try {
               if (typeof(ActiveXObject) != 'undefined') {
                  HTTPRequest = new ActiveXObject('Microsoft.XMLHTTP');
               } else { z = Z; }
            } catch (e) {
               try {
                  if (window.createRequest) {
                     HTTPRequest = window.createRequest();
                  } else { z = Z; }
               } catch (e) {
                  HTTPRequest = null;
               }
            }
         }
      }
   }

   return HTTPRequest;
}

function NEWGetHTTPRequestObject2() {
   var HTTPRequest = null,
       next = false;

   try {
      if (typeof(XMLHttpRequest) != 'undefined') {
         HTTPRequest = new XMLHttpRequest();
      } else { next = true; }
   } catch (e) {
      next = true;
   }

   if (next) {
      next = false;
      try {
         if (typeof(ActiveXObject) != 'undefined') {
            HTTPRequest = new ActiveXObject('Msxml2.XMLHTTP');
         } else { next = true; }
      } catch (e) {
         next = true;
      }
   }

   if (next) {
      next = false;
      try {
         if (typeof(ActiveXObject) != 'undefined') {
            HTTPRequest = new ActiveXObject('Msxml3.XMLHTTP');
         } else { next = true; }
      } catch (e) {
         next = true;
      }
   }

   if (next) {
      next = false;
      try {
         if (typeof(ActiveXObject) != 'undefined') {
            HTTPRequest = new ActiveXObject('Microsoft.XMLHTTP');
         } else { next = true; }
      } catch (e) {
         next = true;
      }
   }

   if (next) {
      next = false;
      try {
         if (window.createRequest) {
            HTTPRequest = window.createRequest();
         } else { next = true; }
      } catch (e) {
         HTTPRequest = null;
      }
   }

   return HTTPRequest;
}

// Request HTTP resource
// (optional args)
// 2. true - use GET, false use POST
// 3. data to send as part of request
function PerformHTTPRequest(request) {
   var HTTPRequest = NEWGetHTTPRequestObject2(),
       UseGetMethod = (arguments.length >= 2 ? arguments[1] ? true : false : true),
       data = (arguments.length >= 3 ? arguments[2] : ""),
       result = '',
       tmp;

   if (HTTPRequest == null) {
      result = null;
   } else {
      try {
         if (UseGetMethod) {
            HTTPRequest.open('GET', (data.length ? request + '?' + data : request), false);
            try {
               HTTPRequest.send();
            } catch(e) {
               HTTPRequest.send('');
            }
         } else {
            HTTPRequest.open('POST', request, false);
            HTTPRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            if (data.length) HTTPRequest.send(data);
         }
         tmp = String(HTTPRequest.status).substr(0,1);
         if (tmp != 2 && tmp != 3) {
            result = null;
         } else if (result == '') {
            result = HTTPRequest.responseText;
         }
      } catch (e) {
         result = null;
      }
   }
   
   return result;
}

// Change all hyperlinks of requested page to "keep within" page.
function UpdateLinks(strHTML) {
   var intLast = 0,
       intStartOfLink = 0,
       intEndOfLink,
       strLink,
       intHref,
       strHyperLink,
       strResult = '';

   do {
      intStartOfLink = strHTML.indexOf('<' + 'a', intStartOfLink); // CASE SENSITIVE
      if (intStartOfLink != -1) {
         intEndOfLink = strHTML.indexOf('>', intStartOfLink) + 1;
         strLink = strHTML.substring(intStartOfLink, intEndOfLink);
         intHref = strLink.indexOf('href'); // CASE SENSITIVE

         if (intHref != -1) {
            intStartHrefLink = strLink.indexOf('"', intHref) + 1;
            intEndHrefLink = strLink.indexOf('"', intStartHrefLink);
            strHyperLink = strLink.substring(intStartHrefLink, intEndHrefLink);
            if (strHyperLink.charAt(0) == '/') { // strHyperLink.charAt(0) != '#' || 
               strLink = strLink.substring(0, intStartHrefLink) +
                         document.location.href.substring(0, document.location.href.indexOf('?')) +
                         '?' + escape(removeUrlArgsWithoutValue(strHyperLink, CONST_orderByArg, CONST_directoryArgSep)) +
                         strLink.substring(intEndHrefLink, strLink.length);

               strResult += strHTML.substring(intLast, intStartOfLink) + strLink;

               intStartOfLink = intEndOfLink;
            } else {
               strResult += strHTML.substring(intLast, intStartOfLink) + strLink;
               intStartOfLink = intEndOfLink;
            }
         } else {
            strResult += strHTML.substring(intLast, intEndOfLink);
            intStartOfLink++;
         }
      }
      intLast = intEndOfLink;
   } while(intStartOfLink != -1);

   return (strResult + strHTML.substring(intEndOfLink, strHTML.length));
}

// Extract tags such as link, style & script, inline external scripts.
function ExtractTags(pstrHTML, pstrStart, pstrEnd) {
   var intStart = 0,
       intEnd,
       intSrcStart,
       intSrcEnd,
       strResult = '',
       tmp;
   
   do {
      intStart = pstrHTML.indexOf(pstrStart, intStart);
      if (intStart != -1 && pstrStart.indexOf('script') != -1) { // CASE SENSITIVE
         tmp = pstrHTML.substring(intStart, pstrHTML.indexOf('>', intStart)).indexOf('src'); // CASE SENSITIVE
         if (tmp != -1) {
            intSrcStart = pstrHTML.indexOf('"', intStart + tmp) + 1;
            intSrcEnd = pstrHTML.indexOf('"', intSrcStart);
            strResult += arguments[3] + PerformHTTPRequest(pstrHTML.substring(intSrcStart, intSrcEnd)) + arguments[4];
            intStart++;
            continue;
         }
      }
      if (intStart != -1) {
         intEnd = pstrHTML.indexOf(pstrEnd, intStart) + pstrEnd.length;
         if (intEnd != -1) {
            tmp = pstrHTML.substring(intStart, intEnd);
            if (tmp.indexOf('standard.css') == -1) strResult += tmp;
            intStart = intEnd;
         } else {
            intStart = intStart + 1;
         }
      }
   } while(intStart != -1);
   
   return strResult;
}

function prepareOutput(pstrHTML) {
   return removals(UpdateLinks(pstrHTML));
}

function removals(pstrHTML) {
   return pstrHTML.replace(/<p.*>\[<a .*>Return to parent<\/a>\]<\/p>/g, '');
}

// This is so wrong, but hey this whole script is a hack
function additions() {
   return '<' + 'style><' + '!--' +
          '#textzoom {' +
             'float: right;' +
          '}' +
          '--' + '><' + '/style>';
}

// Retrieve the directory page and prepare it for display.
function LoadDirectory(pstrBegin, pstrEnd, pstrPath, pstrResource, pstrInError) {
   var intFirstBegin,
       intLastBegin,
       intFirstEnd,
       intLastEnd,
       intStart,
       strStartScript = '<' + 'script type="text/javascript"><' + '!--\n',
       strEndScript = '\n//--' + '><' + '/script>',
       strLocn = document.location.href,
       strResource,
       strResponse,
       strHeader,
       strRest,
       strResult,
       blnError = false;

   try {
      if (strLocn.indexOf('?') == -1) {
         strResource = pstrPath + pstrResource;
      } else {
         strResource = strLocn.substring(strLocn.indexOf('?') + 1, strLocn.length);
         //strResource = getURlArg(getURLQuery(strLocn), 'url');
      }
      strResource = unescape(strResource);
      if (typeof(getURLArg(strResource, CONST_orderByArg, CONST_directoryArgSep)) == 'undefined') {
         strResource += (strResource.indexOf('?') > -1 ? CONST_directoryArgSep : '?') + CONST_orderByArg + '=' + CONST_orderByValue;
      }
      strResponse = PerformHTTPRequest(strResource);

      if (strResponse != null) {
         intFirstBegin = strResponse.indexOf(pstrBegin);
         intLastBegin = strResponse.lastIndexOf(pstrBegin);
         intFirstEnd = strResponse.indexOf(pstrEnd);
         intLastEnd = strResponse.lastIndexOf(pstrEnd);

         if (intFirstBegin != -1 && intFirstBegin == intLastBegin && intFirstEnd != -1 && intFirstEnd == intLastEnd) {
            intStart = strResponse.indexOf('<' + 'head>');
            strHeader = strResponse.substring(intStart, intFirstBegin);
            strRest = strResponse.substring(intFirstBegin, strResponse.length - 1);

            // PARAMETERS TO ExtractTags are CASE SENSITIVE
            strResult = additions() +
                        ExtractTags(strHeader, '<' + 'link', '>') +
                        ExtractTags(strHeader, '<' + 'style', '<' + '/style>') +
                        ExtractTags(strHeader + strRest, '<' + 'script', '<' + '/script>', strStartScript, strEndScript) +
                        strStartScript +
                        'WriteOut(unescape(\'' + escape(prepareOutput(strResponse.substring(intFirstBegin - 1, intFirstEnd + pstrEnd.length))) + '\'), ' +
                                 'unescape(\'' + pstrPath + pstrResource + '\'));' +
                        strEndScript;
         } else {
            blnError = true;
         }
      } else {
         blnError = true;
      }
   } catch (e) {
      blnError = true;
   }

   if (blnError) {
      strResult = pstrInError;
   //} else { No longer required as Uni directory now provides A to Z buttons
   //   window.onload = loadAToZOptions;
   }

   return strResult;
}

// Write out HTML and execute the scripts within the page.
function WriteOut(pstrHTML, pstrListingURL) {
   var intBeforeOpen = 0,
       intAfterOpen = 0,
       intBeforeClose = 0,
       intLast = 0,
       strjs;

   do {
      intBeforeOpen = pstrHTML.indexOf('<' + 'script', intBeforeClose); // CASE SENSITIVE
      if (intBeforeOpen != -1) {
         intAfterOpen = pstrHTML.indexOf('>', intBeforeOpen) + 1;
         intBeforeClose = pstrHTML.indexOf('<' + '/script>', intAfterOpen); // CASE SENSITIVE
         document.write(pstrHTML.substring(intLast, intBeforeOpen));
         try {
            strjs = pstrHTML.substring(intAfterOpen, intBeforeClose);
            (new Function('', strjs))();
         } catch (e) {
            document.write('<' + 'span style="font-weight:bold;" title="' + e.message + '">Error<' + '/span>');
         }
         intLast = intBeforeClose + 9;
      }
   } while(intBeforeOpen != -1);

   document.write(pstrHTML.substring(intLast, pstrHTML.length));
   
   // TIDY THIS UP!
   
   /* No longer work, change to introduce A to Z for all directory listings has somehow causes the collectLetter function to fail
   var strPerPage = '';
   var pagerDiv = document.getElementById(CONST_pagerId);
   if (pagerDiv != null) {
      var objDiv = document.createElement('div');
      var objTmp = document.createElement('p');
      objTmp.innerHTML = 'Loading A to Z buttons...';
      objDiv.appendChild(objTmp);
      objDiv.id = 'loading_a_to_z_buttons';
      document.getElementById(CONST_atozId).appendChild(objDiv);
         
      if (getCookie('BaseUrlForDirectory') == null) {
         
         var strTotalResults = trim(searchTree(pagerDiv, /of \d+ total/));
         
         var intTotalResults = strTotalResults.substring(strTotalResults.indexOf('of ') + 3, strTotalResults.indexOf(' ', strTotalResults.indexOf('of ') + 3));
         GLOBAL_intTotalResults = intTotalResults;
         var strRequest = '';
         var strLocn = document.location.href;
         if (strLocn.indexOf('?') > -1) {
            strRequest = unescape(strLocn.substr(strLocn.indexOf('?') + 1));
         }
         
         var intNumberPages;
         var objIframe;
         
         intNumberPages = Math.ceil(intTotalResults / CONST_maxPerPage);
         
         objDiv = document.createElement('div');
         objDiv.id = 'hidden_directory_results';
         objDiv.style.display = 'none';
         
         strRequest = removeUrlArg(unescape(strRequest), CONST_pageArg, CONST_directoryArgSep);
         
         for (var i = 1; i <= intNumberPages; i++) {
            objIframe = document.createElement('iframe');
            objIframe.name = 'a_to_z_directory_listing_page_' + i;
            objIframe.src = pstrListingURL + (pstrListingURL.indexOf('?') > -1 ? CONST_directoryArgSep : '?') + CONST_pageArg + '=' + i + CONST_directoryArgSep + CONST_perPageArg + '=' + CONST_maxPerPage;
            objDiv.appendChild(objIframe);
         }
         
         document.body.appendChild(objDiv);
      }
   }
   */
}

function trim (str) {
   str = this != window? this : str;
   return str.replace(/^\s+|\s+$/, '');
}

function searchTree(element, re) {
   var match;
   var objChildNodes;

   if (re.test(element.nodeValue)) {
      match = element.nodeValue;
   } else if (element.hasChildNodes()) {
      objChildNodes = element.childNodes;
      for (var i = 0; i < objChildNodes.length; i++) {
         match = searchTree(objChildNodes[i], re);
         if (typeof(match) != 'undefined') break;
      }
   }

   return match;
}

// More compact than using indexOf for unstringing, but not supported by older browsers. Probably safe to use split since we're using XMLHttpRequest
function removeUrlArg(strRequest, strArg) {
   var argSeparator;
   var arrRequest = strRequest.split('?');
   var strNewRequest = arrRequest[0];
   var arrArgs;
   
   if (arguments.length > 1) {
      argSeparator = arguments[2];
   } else {
      argSeparator = CONST_defaultArgSep;
   }
   
   if (arrRequest.length > 1) {
      strNewRequest += '?';
      arrArgs = arrRequest[1].split(argSeparator);
      for (var i = 0; i < arrArgs.length; i++) {
         arrArgAndValue = arrArgs[i].split('=');
         if (arrArgAndValue[0] != strArg) {
            if (strNewRequest.substr(strNewRequest.length - 1) != '?') strNewRequest += argSeparator;
            if (arrArgAndValue.length == 2) {
               strNewRequest += arrArgAndValue[0] + '=' + arrArgAndValue[1];
            } else {
               strNewRequest += arrArgAndValue[0];
            }
         }
      }
   }
   
   return strNewRequest;
}

// This function has been added as the Uni directory appears to add orderby=; to links
function removeUrlArgsWithoutValue(strRequest, strArg) {
   var argSeparator;
   var arrRequest = strRequest.split('?');
   var strNewRequest = arrRequest[0];
   var arrArgs;
   
   if (arguments.length > 1) {
      argSeparator = arguments[2];
   } else {
      argSeparator = CONST_defaultArgSep;
   }
   
   if (arrRequest.length > 1) {
      strNewRequest += '?';
      arrArgs = arrRequest[1].split(argSeparator);
      for (var i = 0; i < arrArgs.length; i++) {
         arrArgAndValue = arrArgs[i].split('=');
         if (arrArgAndValue[0] != strArg || (arrArgAndValue.length == 2 && arrArgAndValue[1] != '')) {
            if (strNewRequest.substr(strNewRequest.length - 1) != '?') strNewRequest += argSeparator;
            if (arrArgAndValue.length == 2) {
               strNewRequest += arrArgAndValue[0] + '=' + arrArgAndValue[1];
            } else {
               strNewRequest += arrArgAndValue[0];
            }
         }
      }
   }
   
   return strNewRequest;
}

function getURLArg(strRequest, strArg) {
   var argSeparator;
   var arrRequest = strRequest.split('?');
   var arrArgs;
   var arrArgAndValue;
   var strValue;
   
   if (arguments.length > 2) {
      argSeparator = arguments[2];
   } else {
      argSeparator = CONST_defaultArgSep;
   }
   
   if (arrRequest.length > 1) {
      arrArgs = arrRequest[1].split(argSeparator);
      //if (arrArgs.length > 0) {
      for (var i = 0; i < arrArgs.length; i++) {
         arrArgAndValue = arrArgs[i].split('=');
         if (arrArgAndValue[0] == strArg) {
            strValue = arrArgAndValue[1];
            break;
         }
      }
      //}
   }
   
   return strValue;
}

function loadAToZOptions() {
   var objDiv = document.getElementById('hidden_directory_results');
   var objPager = document.getElementById(CONST_pagerId);
   var objChildNodes;
   var carryon = true;
   var strLocn;
   var strHostRelResource;
   var intPage;
   var intPerPage;
   
   if (objDiv != null) {
      objChildNodes = objDiv.childNodes;
      for (var i = 0; i < objChildNodes.length; i++) {
         if (window.frames[objChildNodes[i].name].document.getElementById(CONST_listingTableId) == null) {
            carryon = false;
         }
      }
   } else if (objPager == null) {
      carryon = false;
   }
   
   if (carryon) {
      strLocn = document.location.href;
      if (strLocn.indexOf('?') == -1) {
         strHostRelResource = unescape(strPath + strResource);
      } else {
         strHostRelResource = unescape(strLocn.substr(strLocn.indexOf('?') + 1));
      }
      
      intPage = getURLArg(strHostRelResource, CONST_pageArg, CONST_directoryArgSep);
      if (typeof(intPage) == 'undefined' || intPage == '') intPage = 1;
      intPerPage = getURLArg(strHostRelResource, CONST_perPageArg, CONST_directoryArgSep);
      if (typeof(intPerPage) == 'undefined') intPerPage = 20;
      
      if (getCookie('BaseUrlForDirectory') == null) {
         addAToZOptions(intPage, intPerPage);
      } else {
         loadAToZ(intPage, intPerPage);
      }
   }
}

function addAToZOptions(intPage, intPerPage) {
   var objDiv = document.getElementById('hidden_directory_results');
   var objChildNodes = objDiv.childNodes;
   var strBaseUrl;
   
   intNumberPages = Math.ceil(GLOBAL_intTotalResults / intPerPage);
   
   strBaseUrl = getURLResource(objChildNodes[0].src);
   strBaseUrl = removeUrlArg(strBaseUrl, CONST_perPageArg, CONST_directoryArgSep);
   strBaseUrl = removeUrlArg(strBaseUrl, CONST_pageArg, CONST_directoryArgSep);
   
   if (getCookie('PageToLetterFor' + intPerPage + 'PerPage') == null) {
      GLOBAL_pageToLetterFor15PerPage = getPagesLetters(objChildNodes, 15, Math.ceil(GLOBAL_intTotalResults / 15));
      GLOBAL_pageToLetterFor20PerPage = getPagesLetters(objChildNodes, 20, Math.ceil(GLOBAL_intTotalResults / 20));
      GLOBAL_pageToLetterFor50PerPage = getPagesLetters(objChildNodes, 50, Math.ceil(GLOBAL_intTotalResults / 50))
      GLOBAL_baseUrlForDirectory = strBaseUrl;
      
      setCookie('PageToLetterFor15PerPage', GLOBAL_pageToLetterFor15PerPage);
      setCookie('PageToLetterFor20PerPage', GLOBAL_pageToLetterFor20PerPage);
      setCookie('PageToLetterFor50PerPage', GLOBAL_pageToLetterFor50PerPage);
      setCookie('BaseUrlForDirectory', GLOBAL_baseUrlForDirectory);
   }
   
   loadAToZ(intPage, intPerPage);
}

function loadAToZ(intPage, intPerPage) {
   var aToZpager = document.getElementById(CONST_atozId);
   var azControls = document.createElement('div');
   var arrAToZ = new Array();
   var objOptions;
   var pageToLetter;
   var strPreviousPageLastLetter = '';
   
   pagesToLetters = getCookie('PageToLetterFor' + intPerPage + 'PerPage');
   strBaseUrl = getCookie('BaseUrlForDirectory');
   
   // This is intended to cover the case where cookies are disabled.
   if (pagesToLetters == null || strBaseUrl == null) {
      switch (intPerPage) { // could use eval to reduce code here
         case 15:
            pagesToLetters = GLOBAL_pageToLetterFor15PerPage;
            break;
         case 20:
            pagesToLetters = GLOBAL_pageToLetterFor20PerPage;
            break;
         case 50:
            pagesToLetters = GLOBAL_pageToLetterFor50PerPage;
            break;
      }
      strBaseUrl = GLOBAL_baseUrlForDirectory;
   }
   
   if (strBaseUrl.charAt(strBaseUrl.length - 1) != '?' && strBaseUrl.charAt(strBaseUrl.length - 1) != CONST_directoryArgSep) {
      strBaseUrl += CONST_directoryArgSep;
   }
   
   pageToLetter = pagesToLetters.split('~');
   for (var i = 0; i < pageToLetter.length; i++) {
      nameAndValue = pageToLetter[i].split('|');
      arrAToZ[i + 1] = new Object();
      arrAToZ[i + 1].letters = nameAndValue[1];
      arrAToZ[i + 1].request = strBaseUrl + CONST_perPageArg + '=' + intPerPage + CONST_directoryArgSep + CONST_pageArg + '=' + nameAndValue[0];
   }
   
   //objOptions = document.createElement('br');
   //azControls.appendChild(objOptions);
   
   for (var i = 1; i < arrAToZ.length; i++) {
      for (var j = 0; j < arrAToZ[i].letters.length; j++) {
         if (i == 1 || j != 0 || strPreviousPageLastLetter.charCodeAt(0) < arrAToZ[i].letters.charCodeAt(j)) {
            objOptions = document.createElement('a');
            objOptions.href = document.location.href.substring(0, document.location.href.indexOf('?')) +
                              '?' + escape(arrAToZ[i].request);
            if (i == intPage) {
               objOptions.style.fontSize = '110%';
            }
            objOptions.innerHTML = arrAToZ[i].letters.charAt(j);
            azControls.appendChild(objOptions);
            if (i != arrAToZ.length + 1) {
               objOptions = document.createElement('span');
               objOptions.innerHTML = ' ';
               azControls.appendChild(objOptions);
            }
         }
      }
      strPreviousPageLastLetter = arrAToZ[i].letters.charAt(arrAToZ[i].letters.length - 1);
   }
   
   //objOptions = document.createElement('br');
   //azControls.appendChild(objOptions);
   //objOptions = document.createElement('br');
   //azControls.appendChild(objOptions);
   
   //azControls.id = CONST_atozId;
   document.getElementById('loading_a_to_z_buttons').style.display = 'none';
   aToZpager.appendChild(azControls);
}

function getPagesLetters(objChildNodes, intPerPage, intNumberPages) {
   var result = '';
   
   for (var i = 0; i < intNumberPages; i++) {
      if (result != '') result += '~';
      result += (i + 1) + '|' + lettersForPage(window.frames, objChildNodes, i + 1, intPerPage);
   }
   
   return result;
}

function lettersForPage(objAllFrames, objHiddenFrames, intPage, intPerPage) {
   var letters = '';
   var letter;
   
   intStart = (intPage - 1) * intPerPage;
   intEnd = intPage * intPerPage - 1;
   
   intFirstFrame = Math.floor(intStart / CONST_maxPerPage);
   if (intEnd > GLOBAL_intTotalResults) {
      intLastFrame = intFirstFrame;
      intEnd = GLOBAL_intTotalResults % CONST_maxPerPage;
   } else {
      intLastFrame = Math.floor(intEnd / CONST_maxPerPage);
      intEnd %= CONST_maxPerPage;
   }
   intStart %= CONST_maxPerPage;
   
   if (intFirstFrame == intLastFrame) {
      letters = collectLetters(objAllFrames[objHiddenFrames[intFirstFrame].name].document.getElementById(CONST_listingTableId), intStart + 1, intEnd + 1);
   } else {
      letters = collectLetters(objAllFrames[objHiddenFrames[intFirstFrame].name].document.getElementById(CONST_listingTableId), intStart + 1, CONST_maxPerPage);
      letters += collectLetters(objAllFrames[objHiddenFrames[intLastFrame].name].document.getElementById(CONST_listingTableId), 1, intEnd + 1);
   }
   
   return letters;
}

function collectLetters(objListing, intFirstRow, intLastRow) {
   var letters = '';
   var letter;
   
   for (var i = intFirstRow; i < intLastRow; i++) {
      letter = objListing.rows[i].cells[1].firstChild.innerHTML.charAt(0).toUpperCase();
      if (letters == '' || (letters != '' && letter.charCodeAt(0) > letters.charCodeAt(letters.length - 1))) {
         letters += letter;
      }
   }
   
   return letters;
}

function getURLResource(pstrURL) {
   var strResource;
   
   strResource = pstrURL.substr(pstrURL.indexOf('/', pstrURL.indexOf('//') + 2));
   
   return strResource;
}

function getCookie(pstrName) {
   var result = null;
   var tab_cookies = document.cookie.split(';');
   var cookie_tmp;
   var cookie_name;
   
   for (i = 0; i < tab_cookies.length; i++) {
      cookie_tmp = tab_cookies[i].split('=');
      cookie_name = cookie_tmp[0].replace(/^\s+|\s+$/g, '');
      if (cookie_name == pstrName) {
         if (cookie_tmp.length > 1) {
            result = unescape(cookie_tmp[1].replace(/^\s+|\s+$/g, ''));
         }
         break;
      }
   }
   
   return result;
}

function setCookie(pstrName, pstrValue, pintExpires, pstrPath, pstrDomain, pboolSecure) {
   var today = new Date();
   var expires_date;
   
   today.setTime(today.getTime());
   
   if (pintExpires) pintExpires = pintExpires * 1000 * 60 * 60 * 24;
   expires_date = new Date(today.getTime() + pintExpires);
   
   document.cookie = pstrName + '=' + escape(pstrValue) +
                     ((pintExpires) ? ';expires=' + expires_date.toGMTString() : '') + 
                     ((pstrPath) ? ';path=' + pstrPath : '') + 
                     ((pstrDomain) ? ';domain=' + pstrDomain : '') +
                     ((pboolSecure) ? ';secure' : '');
}

function deleteCookie(pstrName) {
   setCookie(pstrName, '', -1);
}
