//Onload functions
if ( !window._onLoadFunctions ) {
   var _onLoadFunctions = [];
}

//Add an onload function.
function addOnLoadFunction( onLoadFunction ) {
   _onLoadFunctions[_onLoadFunctions.length] = onLoadFunction;
}

//Execute onload functions.
function doOnLoad() {
   for ( var i = 0; i < _onLoadFunctions.length; i++ ) {
      _onLoadFunctions[i]();
   }
}

function doRequest( url, handler ) {
    // branch for native XMLHttpRequest object
    if ( window.XMLHttpRequest ) {
        req = new XMLHttpRequest();
        req.onreadystatechange = handler;
        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 = handler;
            req.open( "GET", url, true );
            req.send();
        }
    }
}

function doResponse() {
  // only if req shows "complete"
  if ( req.readyState == 4 ) {
    // only if "OK"
    if ( req.status == 200 ) {
      // ...processing statements go here...
      alert( req.responseText );
    } else {
      alert("There was a problem retrieving the XML data:\n" + req.statusText);
    }
  }
}

function removeThumbs( href, rank ) {
    var thumbDiv = document.getElementById( 'thumbs' + rank );

    thumbDiv.style.display = 'none';

    doRequest( href, function() {} );

    return true;
}


//Object to manage the query string...
QueryString = function( theQueryString ) {
   this.parameters = new Object();
   this.getParameter = function( name ) {
      var value = this.parameters[name];
      if ( value == null ) value = null;
      return value;
   };

   if ( theQueryString == null ) theQueryString = location.search.substring( 1, location.search.length );
   if ( theQueryString.length == 0 ) return;

   var theQueryString = theQueryString.replace( /\+/g, ' ' );
   var pairs = theQueryString.split( '&' );

   for ( var i = 0; i < pairs.length; i++ ) {
      var pair = pairs[i].split( '=' );
      if ( pair.length > 1 ) {
         var name = unescape( pair[0] );
         var value = unescape( pair[1] );
         this.parameters[name] = value;
      }
   }
};

// Toggle dubug output
function toggleDebug() {
   var toggle = document.getElementById( 'debugToggle' );
   var show = toggle.innerHTML == 'off';
   //Toggle divs
   var divs = document.getElementsByTagName( 'div' );
   for ( var i = 0; i < divs.length; ++i ) {
      if ( divs[i].getAttribute( 'id' ) && divs[i].getAttribute( 'id' ).indexOf( 'debug' ) == 0 ) {
         if ( show ) {
            divs[i].className = 'debugon';
         } else {
            divs[i].className = 'debugoff';
         }
      }
   }
   //Toggle button
   toggle.innerHTML = show ? 'on' : 'off';
   return true;
}

// Popup windows
function popup( link, target ) {
   var width = 400;
   var height = 200;
   var left = (screen.availWidth - width)/2;
   var top = (screen.availHeight - height)/2;
   var style = 'toolbar=0,location=0,directories=0,status=1,menubar=0,scrollbars=0,resizable=1';
   var location = 'width=' + width + ',height=' + height + ',left=' + left + ',top=' + top;
   var thepopup = window.open( link, target, style + ',' + location );
   thepopup.focus();
   return true;
}

// Open link in opener with optional close.
function unpopup( link, close ) {
   if ( window.opener ) {
      window.opener.focus();
      window.opener.location = link;
   } else {
      var popup = window.open( link );
      popup.focus();
   }
   if ( close ) {
      window.close();
   }
   return true;
}

//Return a string with at most maxLen characters
function truncate( theString, maxLen ) {
   var newStr = '';
   if ( theString.length > maxLen ) {
      newStr = theString.substring( 0, maxLen - 3 ) + '...';
   } else {
      newStr = theString;
   }
   return newStr;
}

//Escape xml
function escapeXml( inputString ) {
   var outputString = '';
   for ( var i = 0; i < inputString.length; i++ ) {
      var ch = inputString.charAt( i );
      var code = inputString.charCodeAt( i );
      if ( ch == '&' ) {
         outputString += '&amp;';
      } else if ( ch == '<' ) {
         outputString += '&lt;';
      } else if ( ch == '>' ) {
         outputString += '&gt;';
      } else if ( ch == '"' ) {
         outputString += '&quot;';
      } else if ( ch == '\'' ) {
         outputString += '&#039;';
      } else if ( code > 0x7f ) {
         outputString += '&#' + code + ';';
      } else {
         outputString += ch;
      }
   }
   return outputString;
}

//Determine if character is a space
function isSpace( charCode ) {
   if ( charCode <= 0x20 || charCode == 0xA0 ) {
      return true;
   }
   return false;
}

//Trim whitespace from ends of a string
function trim( inputString ) {
   var begin = 0;
   var end = inputString.length - 1;
   while ( begin < inputString.length && isSpace( inputString.charCodeAt( begin ) ) ) {
      begin++;
   }
   while ( end > begin && isSpace( inputString.charCodeAt( end ) ) ) {
      end--;
   }
   return inputString.substring( begin, end + 1 );
}

//Highlight keywords with bold tag
function highlight( inputString, keyword ) {
   var outputString = '';
   var theInputString = inputString.toLowerCase();
   var matchString = keyword.toLowerCase();
   for ( var i = 0; i < inputString.length; i++ ) {
      if ( theInputString.indexOf( matchString, i ) == i ) {
         outputString += '<b>' + inputString.substring( i, i + matchString.length ) + '</b>';
         i += matchString.length - 1;
      } else {
         outputString += inputString.charAt( i );
      }
   }
   return outputString;
}

//Highlight keywords with bold tag
function highlightAll( inputString, keyword ) {
   var outputString = inputString;
   var keywords = keyword.split( ' ' );
   for ( var i = 0; i < keywords.length; i++ ) {
      outputString = highlight( outputString, keywords[i] );
   }
   return outputString;
}

//Get sponsored link ad
function getAd( genieSite, keyword, suffix, titleMax, descriptionMax ) {
   var adHtml = '';
   adHtml += '<li class="sponsored' + suffix + '">';

   adHtml += '<div class="sponsored' + suffix + 'Title">';
   adHtml += '<a href="' + escapeXml( genieSite.clickUrl ) + '" class="sponsored' + suffix + 'Title" '
          + 'onmouseover="window.status=\'http://' + escapeXml( genieSite.displayUrl )
          + '\'; return true;" onmouseout="window.status=\'\'; return true;">'
          + highlightAll( escapeXml( truncate( genieSite.title, titleMax ) ), keyword ) + '</a>';
   adHtml += '</div>';

   adHtml += '<div class="sponsored' + suffix + 'Snippet">'
   adHtml += '<a href="' + escapeXml( genieSite.clickUrl ) + '" class="sponsored' + suffix + 'Snippet" '
          + 'onmouseover="window.status=\'http://' + escapeXml( genieSite.displayUrl )
          + '\'; return true;" onmouseout="window.status=\'\'; return true;">'
          + highlightAll( escapeXml( truncate( genieSite.description, descriptionMax ) ), keyword ) + '</a>';
   adHtml += '</div>';

   adHtml += '<div class="sponsored' + suffix + 'Url">';
   adHtml += '<a href="' + escapeXml( genieSite.clickUrl ) + '" class="sponsored' + suffix + 'Url" '
          + 'onmouseover="window.status=\'http://' + escapeXml( genieSite.displayUrl )
          + '\'; return true;" onmouseout="window.status=\'\'; return true;">'
          + escapeXml( genieSite.displayUrl ) + '</a>';
   adHtml += '</div>';

   adHtml += '</li>';
   return adHtml;
}

//Get ads for page
function getTopAds( genieResult, keyword, num ) {
   var adsHtml = ''
   if ( genieResult && genieResult.size > 0 ) {
      adsHtml += '<h2 class="sponsoredHorizontal">Sponsored Results</h2>';
      adsHtml += '<ul class="sponsoredHorizontal">';
      for ( var i = 0; i < genieResult.size && i < num; i++ ) {
         adsHtml += getAd( genieResult.sites[i], keyword, 'Horizontal', 70, 90 );
      }
      adsHtml += '</ul>';
   }
   return adsHtml;
}

//Get ads for page
function getRightAds( genieResult, keyword, offset ) {
   var adsHtml = ''
   // be sure there are ads to show
   if ( genieResult && genieResult.size > offset ) {
      adsHtml += '<h2 class="sponsoredVertical">Sponsored Results</h2>';
      adsHtml += '<ul class="sponsoredVertical">';
      // begin at the offset. Those above the offset are displayed elsewhere
      for ( var i = offset; i < genieResult.size; i++ ) {
         adsHtml += getAd( genieResult.sites[i], keyword, 'Vertical', 30, 70 );
      }
      adsHtml += '</ul>';
   }
   return adsHtml;
}

//Show ads on page. 'split' is the index at which to split the results
 function showAds( keyword, split ) {
   var genieResult = getGenieResult();

   // 'split' results go at the top
   if ( genieResult && genieResult.size > 0 && split > 0 ) {
      var theDiv = document.getElementById( 'sponsoredTop' );
      var theAds = getTopAds( genieResult, keyword, split );
      if ( theAds.length > 0 ) {
          theDiv.className = 'sponsoredTop';
          theDiv.innerHTML = theAds;
      }
   }

   // 'genieResult.size - split' results go to the right
   if ( genieResult && genieResult.size > 0 ) {
      var theDiv = document.getElementById( 'sponsoredRight' );
      var theAds = getRightAds( genieResult, keyword, split );
      if ( theAds.length > 0 ) {
         theDiv.className = 'sponsoredRight';
         theDiv.innerHTML = theAds;
      }
   }
}

//Set homepage
function setHomepage( href ) {
   var url = 'http://www.genieknows.com/';
   href.style.behavior = 'url(#default#homepage)';
   href.setHomePage( url );
   return true;
}

//Write bookmark link
function writeBookmarkLink() {
   if ( document.all && window.external ) {
      document.write( '<a href="http://www.genieknows.com/" class="landingNavigation" onclick="return !setHomepage( this );">Make GenieKnows.com Your Homepage</a>' );
   }
   return true;
}

//Initialize a field.
function initField( paramName, fieldName ) {
   var queryString = new QueryString();
   var value = queryString.getParameter( paramName );
   var element = document.getElementById( fieldName );
   if ( element && value ) {
      element.value = value;
   }
   if ( element ) {
      element.focus();
   }
   return true;
}

//Attach onclick function.
function initLink( elementId, queryId, vertical, landing ) {
   var element = document.getElementById( elementId );
   if ( element ) {
      element.onclick = function() {
          return doSearch( queryId, vertical, landing );
      };
   }
}

//Execute search...
function doSearch( queryId, vertical, landing ) {
   var queryElement = document.getElementById( queryId );
   var value = queryElement && queryElement.value ? queryElement.value : '';
   var form = document.getElementById( 'hiddenForm' );

   if ( !landing && (vertical == 'health' || vertical == 'games' || vertical == 'business') ) {
      form.elements['corpus'].disabled = false;
      form.elements['corpus'].value = vertical;
   } else {
      form.elements['corpus'].disabled = true;
   }

   form.elements['query'].value = value;
      
   if ( vertical == 'health' ) {
      if ( landing ) {
         form.action = 'http://'; 
      } else {
         form.action = 'http://'; 
      }

   } else if ( vertical == 'games' ) {
      if ( landing ) {
         form.action = 'http://'; 
      } else {
         form.action = 'http://'; 
      }
   } else if ( vertical == 'business' ) {
      if ( landing ) {
         form.action = 'http://'; 
      } else {
         form.action = 'http://'; 
      }

   } else if ( vertical == 'local' ) {
      if ( landing ) {
         form.action = ''; 
      } else {
         form.action = ''; 
      }

    } else {
     return true;
   }

   form.submit();
   return false;  
}

