(function(){
/*
 * jQuery 1.2.6 - New Wave Javascript
 *
 * Copyright (c) 2008 John Resig (jquery.com)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
 * $Rev: 5685 $
 */

var _jQuery = window.jQuery,
  _$ = window.$;

var jQuery = window.jQuery = window.$ = function( selector, context ) {
  return new jQuery.fn.init( selector, context );
};

var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,

  isSimple = /^.[^:#\[\.]*$/,

  undefined;

jQuery.fn = jQuery.prototype = {
  init: function( selector, context ) {
    selector = selector || document;

    if ( selector.nodeType ) {
      this[0] = selector;
      this.length = 1;
      return this;
    }
    if ( typeof selector == "string" ) {
      var match = quickExpr.exec( selector );

      if ( match && (match[1] || !context) ) {

        if ( match[1] )
          selector = jQuery.clean( [ match[1] ], context );

        else {
          var elem = document.getElementById( match[3] );

          if ( elem ){
            if ( elem.id != match[3] )
              return jQuery().find( selector );

            return jQuery( elem );
          }
          selector = [];
        }

      } else
        return jQuery( context ).find( selector );

    } else if ( jQuery.isFunction( selector ) )
      return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );

    return this.setArray(jQuery.makeArray(selector));
  },

  jquery: "1.2.6",

  size: function() {
    return this.length;
  },

  length: 0,

  get: function( num ) {
    return num == undefined ?

      jQuery.makeArray( this ) :

      this[ num ];
  },

  pushStack: function( elems ) {
    var ret = jQuery( elems );

    ret.prevObject = this;

    return ret;
  },

  setArray: function( elems ) {
    this.length = 0;
    Array.prototype.push.apply( this, elems );

    return this;
  },

  each: function( callback, args ) {
    return jQuery.each( this, callback, args );
  },

  index: function( elem ) {
    var ret = -1;

    return jQuery.inArray(
      elem && elem.jquery ? elem[0] : elem
    , this );
  },

  attr: function( name, value, type ) {
    var options = name;

    if ( name.constructor == String )
      if ( value === undefined )
        return this[0] && jQuery[ type || "attr" ]( this[0], name );

      else {
        options = {};
        options[ name ] = value;
      }

    return this.each(function(i){
      for ( name in options )
        jQuery.attr(
          type ?
            this.style :
            this,
          name, jQuery.prop( this, options[ name ], type, i, name )
        );
    });
  },

  css: function( key, value ) {
    if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
      value = undefined;
    return this.attr( key, value, "curCSS" );
  },

  text: function( text ) {
    if ( typeof text != "object" && text != null )
      return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );

    var ret = "";

    jQuery.each( text || this, function(){
      jQuery.each( this.childNodes, function(){
        if ( this.nodeType != 8 )
          ret += this.nodeType != 1 ?
            this.nodeValue :
            jQuery.fn.text( [ this ] );
      });
    });

    return ret;
  },

  wrapAll: function( html ) {
    if ( this[0] )
      jQuery( html, this[0].ownerDocument )
        .clone()
        .insertBefore( this[0] )
        .map(function(){
          var elem = this;

          while ( elem.firstChild )
            elem = elem.firstChild;

          return elem;
        })
        .append(this);

    return this;
  },

  wrapInner: function( html ) {
    return this.each(function(){
      jQuery( this ).contents().wrapAll( html );
    });
  },

  wrap: function( html ) {
    return this.each(function(){
      jQuery( this ).wrapAll( html );
    });
  },

  append: function() {
    return this.domManip(arguments, true, false, function(elem){
      if (this.nodeType == 1)
        this.appendChild( elem );
    });
  },

  prepend: function() {
    return this.domManip(arguments, true, true, function(elem){
      if (this.nodeType == 1)
        this.insertBefore( elem, this.firstChild );
    });
  },

  before: function() {
    return this.domManip(arguments, false, false, function(elem){
      this.parentNode.insertBefore( elem, this );
    });
  },

  after: function() {
    return this.domManip(arguments, false, true, function(elem){
      this.parentNode.insertBefore( elem, this.nextSibling );
    });
  },

  end: function() {
    return this.prevObject || jQuery( [] );
  },

  find: function( selector ) {
    var elems = jQuery.map(this, function(elem){
      return jQuery.find( selector, elem );
    });

    return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ?
      jQuery.unique( elems ) :
      elems );
  },

  clone: function( events ) {
    var ret = this.map(function(){
      if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) {
        var clone = this.cloneNode(true),
          container = document.createElement("div");
        container.appendChild(clone);
        return jQuery.clean([container.innerHTML])[0];
      } else
        return this.cloneNode(true);
    });

    var clone = ret.find("*").andSelf().each(function(){
      if ( this[ expando ] != undefined )
        this[ expando ] = null;
    });

    if ( events === true )
      this.find("*").andSelf().each(function(i){
        if (this.nodeType == 3)
          return;
        var events = jQuery.data( this, "events" );

        for ( var type in events )
          for ( var handler in events[ type ] )
            jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data );
      });

    return ret;
  },

  filter: function( selector ) {
    return this.pushStack(
      jQuery.isFunction( selector ) &&
      jQuery.grep(this, function(elem, i){
        return selector.call( elem, i );
      }) ||

      jQuery.multiFilter( selector, this ) );
  },

  not: function( selector ) {
    if ( selector.constructor == String )
      if ( isSimple.test( selector ) )
        return this.pushStack( jQuery.multiFilter( selector, this, true ) );
      else
        selector = jQuery.multiFilter( selector, this );

    var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
    return this.filter(function() {
      return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
    });
  },

  add: function( selector ) {
    return this.pushStack( jQuery.unique( jQuery.merge(
      this.get(),
      typeof selector == 'string' ?
        jQuery( selector ) :
        jQuery.makeArray( selector )
    )));
  },

  is: function( selector ) {
    return !!selector && jQuery.multiFilter( selector, this ).length > 0;
  },

  hasClass: function( selector ) {
    return this.is( "." + selector );
  },

  val: function( value ) {
    if ( value == undefined ) {

      if ( this.length ) {
        var elem = this[0];

        if ( jQuery.nodeName( elem, "select" ) ) {
          var index = elem.selectedIndex,
            values = [],
            options = elem.options,
            one = elem.type == "select-one";

          if ( index < 0 )
            return null;

          for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
            var option = options[ i ];

            if ( option.selected ) {
              value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value;

              if ( one )
                return value;

              values.push( value );
            }
          }

          return values;

        } else
          return (this[0].value || "").replace(/\r/g, "");

      }

      return undefined;
    }

    if( value.constructor == Number )
      value += '';

    return this.each(function(){
      if ( this.nodeType != 1 )
        return;

      if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )
        this.checked = (jQuery.inArray(this.value, value) >= 0 ||
          jQuery.inArray(this.name, value) >= 0);

      else if ( jQuery.nodeName( this, "select" ) ) {
        var values = jQuery.makeArray(value);

        jQuery( "option", this ).each(function(){
          this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
            jQuery.inArray( this.text, values ) >= 0);
        });

        if ( !values.length )
          this.selectedIndex = -1;

      } else
        this.value = value;
    });
  },

  html: function( value ) {
    return value == undefined ?
      (this[0] ?
        this[0].innerHTML :
        null) :
      this.empty().append( value );
  },

  replaceWith: function( value ) {
    return this.after( value ).remove();
  },

  eq: function( i ) {
    return this.slice( i, i + 1 );
  },

  slice: function() {
    return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
  },

  map: function( callback ) {
    return this.pushStack( jQuery.map(this, function(elem, i){
      return callback.call( elem, i, elem );
    }));
  },

  andSelf: function() {
    return this.add( this.prevObject );
  },

  data: function( key, value ){
    var parts = key.split(".");
    parts[1] = parts[1] ? "." + parts[1] : "";

    if ( value === undefined ) {
      var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);

      if ( data === undefined && this.length )
        data = jQuery.data( this[0], key );

      return data === undefined && parts[1] ?
        this.data( parts[0] ) :
        data;
    } else
      return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
        jQuery.data( this, key, value );
      });
  },

  removeData: function( key ){
    return this.each(function(){
      jQuery.removeData( this, key );
    });
  },

  domManip: function( args, table, reverse, callback ) {
    var clone = this.length > 1, elems;

    return this.each(function(){
      if ( !elems ) {
        elems = jQuery.clean( args, this.ownerDocument );

        if ( reverse )
          elems.reverse();
      }

      var obj = this;

      if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) )
        obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") );

      var scripts = jQuery( [] );

      jQuery.each(elems, function(){
        var elem = clone ?
          jQuery( this ).clone( true )[0] :
          this;

        if ( jQuery.nodeName( elem, "script" ) )
          scripts = scripts.add( elem );
        else {
          if ( elem.nodeType == 1 )
            scripts = scripts.add( jQuery( "script", elem ).remove() );

          callback.call( obj, elem );
        }
      });

      scripts.each( evalScript );
    });
  }
};

jQuery.fn.init.prototype = jQuery.fn;

function evalScript( i, elem ) {
  if ( elem.src )
    jQuery.ajax({
      url: elem.src,
      async: false,
      dataType: "script"
    });

  else
    jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );

  if ( elem.parentNode )
    elem.parentNode.removeChild( elem );
}

function now(){
  return +new Date;
}

jQuery.extend = jQuery.fn.extend = function() {
  var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;

  if ( target.constructor == Boolean ) {
    deep = target;
    target = arguments[1] || {};
    i = 2;
  }

  if ( typeof target != "object" && typeof target != "function" )
    target = {};

  if ( length == i ) {
    target = this;
    --i;
  }

  for ( ; i < length; i++ )
    if ( (options = arguments[ i ]) != null )
      for ( var name in options ) {
        var src = target[ name ], copy = options[ name ];

        if ( target === copy )
          continue;

        if ( deep && copy && typeof copy == "object" && !copy.nodeType )
          target[ name ] = jQuery.extend( deep,
            src || ( copy.length != null ? [ ] : { } )
          , copy );

        else if ( copy !== undefined )
          target[ name ] = copy;

      }

  return target;
};

var expando = "jQuery" + now(), uuid = 0, windowData = {},
  exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
  defaultView = document.defaultView || {};

jQuery.extend({
  noConflict: function( deep ) {
    window.$ = _$;

    if ( deep )
      window.jQuery = _jQuery;

    return jQuery;
  },

  isFunction: function( fn ) {
    return !!fn && typeof fn != "string" && !fn.nodeName &&
      fn.constructor != Array && /^[\s[]?function/.test( fn + "" );
  },

  isXMLDoc: function( elem ) {
    return elem.documentElement && !elem.body ||
      elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
  },

  globalEval: function( data ) {
    data = jQuery.trim( data );

    if ( data ) {
      var head = document.getElementsByTagName("head")[0] || document.documentElement,
        script = document.createElement("script");

      script.type = "text/javascript";
      if ( jQuery.browser.msie )
        script.text = data;
      else
        script.appendChild( document.createTextNode( data ) );

      head.insertBefore( script, head.firstChild );
      head.removeChild( script );
    }
  },

  nodeName: function( elem, name ) {
    return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
  },

  cache: {},

  data: function( elem, name, data ) {
    elem = elem == window ?
      windowData :
      elem;

    var id = elem[ expando ];

    if ( !id )
      id = elem[ expando ] = ++uuid;

    if ( name && !jQuery.cache[ id ] )
      jQuery.cache[ id ] = {};

    if ( data !== undefined )
      jQuery.cache[ id ][ name ] = data;

    return name ?
      jQuery.cache[ id ][ name ] :
      id;
  },

  removeData: function( elem, name ) {
    elem = elem == window ?
      windowData :
      elem;

    var id = elem[ expando ];

    if ( name ) {
      if ( jQuery.cache[ id ] ) {
        delete jQuery.cache[ id ][ name ];

        name = "";

        for ( name in jQuery.cache[ id ] )
          break;

        if ( !name )
          jQuery.removeData( elem );
      }

    } else {
      try {
        delete elem[ expando ];
      } catch(e){
        if ( elem.removeAttribute )
          elem.removeAttribute( expando );
      }

      delete jQuery.cache[ id ];
    }
  },

  each: function( object, callback, args ) {
    var name, i = 0, length = object.length;

    if ( args ) {
      if ( length == undefined ) {
        for ( name in object )
          if ( callback.apply( object[ name ], args ) === false )
            break;
      } else
        for ( ; i < length; )
          if ( callback.apply( object[ i++ ], args ) === false )
            break;

    } else {
      if ( length == undefined ) {
        for ( name in object )
          if ( callback.call( object[ name ], name, object[ name ] ) === false )
            break;
      } else
        for ( var value = object[0];
          i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
    }

    return object;
  },

  prop: function( elem, value, type, i, name ) {
    if ( jQuery.isFunction( value ) )
      value = value.call( elem, i );

    return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ?
      value + "px" :
      value;
  },

  className: {
    add: function( elem, classNames ) {
      jQuery.each((classNames || "").split(/\s+/), function(i, className){
        if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
          elem.className += (elem.className ? " " : "") + className;
      });
    },

    remove: function( elem, classNames ) {
      if (elem.nodeType == 1)
        elem.className = classNames != undefined ?
          jQuery.grep(elem.className.split(/\s+/), function(className){
            return !jQuery.className.has( classNames, className );
          }).join(" ") :
          "";
    },

    has: function( elem, className ) {
      return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
    }
  },

  swap: function( elem, options, callback ) {
    var old = {};
    for ( var name in options ) {
      old[ name ] = elem.style[ name ];
      elem.style[ name ] = options[ name ];
    }

    callback.call( elem );

    for ( var name in options )
      elem.style[ name ] = old[ name ];
  },

  css: function( elem, name, force ) {
    if ( name == "width" || name == "height" ) {
      var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];

      function getWH() {
        val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
        var padding = 0, border = 0;
        jQuery.each( which, function() {
          padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
          border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
        });
        val -= Math.round(padding + border);
      }

      if ( jQuery(elem).is(":visible") )
        getWH();
      else
        jQuery.swap( elem, props, getWH );

      return Math.max(0, val);
    }

    return jQuery.curCSS( elem, name, force );
  },

  curCSS: function( elem, name, force ) {
    var ret, style = elem.style;

    function color( elem ) {
      if ( !jQuery.browser.safari )
        return false;

      var ret = defaultView.getComputedStyle( elem, null );
      return !ret || ret.getPropertyValue("color") == "";
    }

    if ( name == "opacity" && jQuery.browser.msie ) {
      ret = jQuery.attr( style, "opacity" );

      return ret == "" ?
        "1" :
        ret;
    }
    if ( jQuery.browser.opera && name == "display" ) {
      var save = style.outline;
      style.outline = "0 solid black";
      style.outline = save;
    }

    if ( name.match( /float/i ) )
      name = styleFloat;

    if ( !force && style && style[ name ] )
      ret = style[ name ];

    else if ( defaultView.getComputedStyle ) {

      if ( name.match( /float/i ) )
        name = "float";

      name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();

      var computedStyle = defaultView.getComputedStyle( elem, null );

      if ( computedStyle && !color( elem ) )
        ret = computedStyle.getPropertyValue( name );

      else {
        var swap = [], stack = [], a = elem, i = 0;

        for ( ; a && color(a); a = a.parentNode )
          stack.unshift(a);

        for ( ; i < stack.length; i++ )
          if ( color( stack[ i ] ) ) {
            swap[ i ] = stack[ i ].style.display;
            stack[ i ].style.display = "block";
          }

        ret = name == "display" && swap[ stack.length - 1 ] != null ?
          "none" :
          ( computedStyle && computedStyle.getPropertyValue( name ) ) || "";

        for ( i = 0; i < swap.length; i++ )
          if ( swap[ i ] != null )
            stack[ i ].style.display = swap[ i ];
      }

      if ( name == "opacity" && ret == "" )
        ret = "1";

    } else if ( elem.currentStyle ) {
      var camelCase = name.replace(/\-(\w)/g, function(all, letter){
        return letter.toUpperCase();
      });

      ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];


      if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
        var left = style.left, rsLeft = elem.runtimeStyle.left;

        elem.runtimeStyle.left = elem.currentStyle.left;
        style.left = ret || 0;
        ret = style.pixelLeft + "px";

        style.left = left;
        elem.runtimeStyle.left = rsLeft;
      }
    }

    return ret;
  },

  clean: function( elems, context ) {
    var ret = [];
    context = context || document;
    if (typeof context.createElement == 'undefined')
      context = context.ownerDocument || context[0] && context[0].ownerDocument || document;

    jQuery.each(elems, function(i, elem){
      if ( !elem )
        return;

      if ( elem.constructor == Number )
        elem += '';

      if ( typeof elem == "string" ) {
        elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
          return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
            all :
            front + "></" + tag + ">";
        });

        var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div");

        var wrap =
          !tags.indexOf("<opt") &&
          [ 1, "<select multiple='multiple'>", "</select>" ] ||

          !tags.indexOf("<leg") &&
          [ 1, "<fieldset>", "</fieldset>" ] ||

          tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
          [ 1, "<table>", "</table>" ] ||

          !tags.indexOf("<tr") &&
          [ 2, "<table><tbody>", "</tbody></table>" ] ||

          (!tags.indexOf("<td") || !tags.indexOf("<th")) &&
          [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||

          !tags.indexOf("<col") &&
          [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||

          jQuery.browser.msie &&
          [ 1, "div<div>", "</div>" ] ||

          [ 0, "", "" ];

        div.innerHTML = wrap[1] + elem + wrap[2];

        while ( wrap[0]-- )
          div = div.lastChild;

        if ( jQuery.browser.msie ) {

          var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ?
            div.firstChild && div.firstChild.childNodes :

            wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ?
              div.childNodes :
              [];

          for ( var j = tbody.length - 1; j >= 0 ; --j )
            if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
              tbody[ j ].parentNode.removeChild( tbody[ j ] );

          if ( /^\s/.test( elem ) )
            div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );

        }

        elem = jQuery.makeArray( div.childNodes );
      }

      if ( elem.length === 0 && (!jQuery.nodeName( elem, "form" ) && !jQuery.nodeName( elem, "select" )) )
        return;

      if ( elem[0] == undefined || jQuery.nodeName( elem, "form" ) || elem.options )
        ret.push( elem );

      else
        ret = jQuery.merge( ret, elem );

    });

    return ret;
  },

  attr: function( elem, name, value ) {
    if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
      return undefined;

    var notxml = !jQuery.isXMLDoc( elem ),
      set = value !== undefined,
      msie = jQuery.browser.msie;

    name = notxml && jQuery.props[ name ] || name;

    if ( elem.tagName ) {

      var special = /href|src|style/.test( name );

      if ( name == "selected" && jQuery.browser.safari )
        elem.parentNode.selectedIndex;

      if ( name in elem && notxml && !special ) {
        if ( set ){
          if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
            throw "type property can't be changed";

          elem[ name ] = value;
        }

        if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
          return elem.getAttributeNode( name ).nodeValue;

        return elem[ name ];
      }

      if ( msie && notxml &&  name == "style" )
        return jQuery.attr( elem.style, "cssText", value );

      if ( set )
        elem.setAttribute( name, "" + value );

      var attr = msie && notxml && special
          ? elem.getAttribute( name, 2 )
          : elem.getAttribute( name );

      return attr === null ? undefined : attr;
    }


    if ( msie && name == "opacity" ) {
      if ( set ) {
        elem.zoom = 1;

        elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
          (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
      }

      return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
        (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
        "";
    }

    name = name.replace(/-([a-z])/ig, function(all, letter){
      return letter.toUpperCase();
    });

    if ( set )
      elem[ name ] = value;

    return elem[ name ];
  },

  trim: function( text ) {
    return (text || "").replace( /^\s+|\s+$/g, "" );
  },

  makeArray: function( array ) {
    var ret = [];

    if( array != null ){
      var i = array.length;
      if( i == null || array.split || array.setInterval || array.call )
        ret[0] = array;
      else
        while( i )
          ret[--i] = array[i];
    }

    return ret;
  },

  inArray: function( elem, array ) {
    for ( var i = 0, length = array.length; i < length; i++ )
      if ( array[ i ] === elem )
        return i;

    return -1;
  },

  merge: function( first, second ) {
    var i = 0, elem, pos = first.length;
    if ( jQuery.browser.msie ) {
      while ( elem = second[ i++ ] )
        if ( elem.nodeType != 8 )
          first[ pos++ ] = elem;

    } else
      while ( elem = second[ i++ ] )
        first[ pos++ ] = elem;

    return first;
  },

  unique: function( array ) {
    var ret = [], done = {};

    try {

      for ( var i = 0, length = array.length; i < length; i++ ) {
        var id = jQuery.data( array[ i ] );

        if ( !done[ id ] ) {
          done[ id ] = true;
          ret.push( array[ i ] );
        }
      }

    } catch( e ) {
      ret = array;
    }

    return ret;
  },

  grep: function( elems, callback, inv ) {
    var ret = [];

    for ( var i = 0, length = elems.length; i < length; i++ )
      if ( !inv != !callback( elems[ i ], i ) )
        ret.push( elems[ i ] );

    return ret;
  },

  map: function( elems, callback ) {
    var ret = [];

    for ( var i = 0, length = elems.length; i < length; i++ ) {
      var value = callback( elems[ i ], i );

      if ( value != null )
        ret[ ret.length ] = value;
    }

    return ret.concat.apply( [], ret );
  }
});

var userAgent = navigator.userAgent.toLowerCase();

jQuery.browser = {
  version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
  safari: /webkit/.test( userAgent ),
  opera: /opera/.test( userAgent ),
  msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
  mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
};

var styleFloat = jQuery.browser.msie ?
  "styleFloat" :
  "cssFloat";

jQuery.extend({
  boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",

  props: {
    "for": "htmlFor",
    "class": "className",
    "float": styleFloat,
    cssFloat: styleFloat,
    styleFloat: styleFloat,
    readonly: "readOnly",
    maxlength: "maxLength",
    cellspacing: "cellSpacing"
  }
});

jQuery.each({
  parent: function(elem){return elem.parentNode;},
  parents: function(elem){return jQuery.dir(elem,"parentNode");},
  next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
  prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
  nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
  prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
  siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
  children: function(elem){return jQuery.sibling(elem.firstChild);},
  contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
}, function(name, fn){
  jQuery.fn[ name ] = function( selector ) {
    var ret = jQuery.map( this, fn );

    if ( selector && typeof selector == "string" )
      ret = jQuery.multiFilter( selector, ret );

    return this.pushStack( jQuery.unique( ret ) );
  };
});

jQuery.each({
  appendTo: "append",
  prependTo: "prepend",
  insertBefore: "before",
  insertAfter: "after",
  replaceAll: "replaceWith"
}, function(name, original){
  jQuery.fn[ name ] = function() {
    var args = arguments;

    return this.each(function(){
      for ( var i = 0, length = args.length; i < length; i++ )
        jQuery( args[ i ] )[ original ]( this );
    });
  };
});

jQuery.each({
  removeAttr: function( name ) {
    jQuery.attr( this, name, "" );
    if (this.nodeType == 1)
      this.removeAttribute( name );
  },

  addClass: function( classNames ) {
    jQuery.className.add( this, classNames );
  },

  removeClass: function( classNames ) {
    jQuery.className.remove( this, classNames );
  },

  toggleClass: function( classNames ) {
    jQuery.className[ jQuery.className.has( this, classNames ) ? "remove" : "add" ]( this, classNames );
  },

  remove: function( selector ) {
    if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) {
      jQuery( "*", this ).add(this).each(function(){
        jQuery.event.remove(this);
        jQuery.removeData(this);
      });
      if (this.parentNode)
        this.parentNode.removeChild( this );
    }
  },

  empty: function() {
    jQuery( ">*", this ).remove();

    while ( this.firstChild )
      this.removeChild( this.firstChild );
  }
}, function(name, fn){
  jQuery.fn[ name ] = function(){
    return this.each( fn, arguments );
  };
});

jQuery.each([ "Height", "Width" ], function(i, name){
  var type = name.toLowerCase();

  jQuery.fn[ type ] = function( size ) {
    return this[0] == window ?
      jQuery.browser.opera && document.body[ "client" + name ] ||

      jQuery.browser.safari && window[ "inner" + name ] ||

      document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] :

      this[0] == document ?
        Math.max(
          Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),
          Math.max(document.body["offset" + name], document.documentElement["offset" + name])
        ) :

        size == undefined ?
          (this.length ? jQuery.css( this[0], type ) : null) :

          this.css( type, size.constructor == String ? size : size + "px" );
  };
});

function num(elem, prop) {
  return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
}var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?
    "(?:[\\w*_-]|\\\\.)" :
    "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",
  quickChild = new RegExp("^>\\s*(" + chars + "+)"),
  quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),
  quickClass = new RegExp("^([#.]?)(" + chars + "*)");

jQuery.extend({
  expr: {
    "": function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},
    "#": function(a,i,m){return a.getAttribute("id")==m[2];},
    ":": {
      lt: function(a,i,m){return i<m[3]-0;},
      gt: function(a,i,m){return i>m[3]-0;},
      nth: function(a,i,m){return m[3]-0==i;},
      eq: function(a,i,m){return m[3]-0==i;},
      first: function(a,i){return i==0;},
      last: function(a,i,m,r){return i==r.length-1;},
      even: function(a,i){return i%2==0;},
      odd: function(a,i){return i%2;},

      "first-child": function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},
      "last-child": function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},
      "only-child": function(a){return !jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},

      parent: function(a){return a.firstChild;},
      empty: function(a){return !a.firstChild;},

      contains: function(a,i,m){return (a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},

      visible: function(a){return "hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},
      hidden: function(a){return "hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},

      enabled: function(a){return !a.disabled;},
      disabled: function(a){return a.disabled;},
      checked: function(a){return a.checked;},
      selected: function(a){return a.selected||jQuery.attr(a,"selected");},

      text: function(a){return "text"==a.type;},
      radio: function(a){return "radio"==a.type;},
      checkbox: function(a){return "checkbox"==a.type;},
      file: function(a){return "file"==a.type;},
      password: function(a){return "password"==a.type;},
      submit: function(a){return "submit"==a.type;},
      image: function(a){return "image"==a.type;},
      reset: function(a){return "reset"==a.type;},
      button: function(a){return "button"==a.type||jQuery.nodeName(a,"button");},
      input: function(a){return /input|select|textarea|button/i.test(a.nodeName);},

      has: function(a,i,m){return jQuery.find(m[3],a).length;},

      header: function(a){return /h\d/i.test(a.nodeName);},

      animated: function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}
    }
  },

  parse: [
    /^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,

    /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,

    new RegExp("^([:.#]*)(" + chars + "+)")
  ],

  multiFilter: function( expr, elems, not ) {
    var old, cur = [];

    while ( expr && expr != old ) {
      old = expr;
      var f = jQuery.filter( expr, elems, not );
      expr = f.t.replace(/^\s*,\s*/, "" );
      cur = not ? elems = f.r : jQuery.merge( cur, f.r );
    }

    return cur;
  },

  find: function( t, context ) {
    if ( typeof t != "string" )
      return [ t ];

    if ( context && context.nodeType != 1 && context.nodeType != 9)
      return [ ];

    context = context || document;

    var ret = [context], done = [], last, nodeName;

    while ( t && last != t ) {
      var r = [];
      last = t;

      t = jQuery.trim(t);

      var foundToken = false,

        re = quickChild,

        m = re.exec(t);

      if ( m ) {
        nodeName = m[1].toUpperCase();

        for ( var i = 0; ret[i]; i++ )
          for ( var c = ret[i].firstChild; c; c = c.nextSibling )
            if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName) )
              r.push( c );

        ret = r;
        t = t.replace( re, "" );
        if ( t.indexOf(" ") == 0 ) continue;
        foundToken = true;
      } else {
        re = /^([>+~])\s*(\w*)/i;

        if ( (m = re.exec(t)) != null ) {
          r = [];

          var merge = {};
          nodeName = m[2].toUpperCase();
          m = m[1];

          for ( var j = 0, rl = ret.length; j < rl; j++ ) {
            var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;
            for ( ; n; n = n.nextSibling )
              if ( n.nodeType == 1 ) {
                var id = jQuery.data(n);

                if ( m == "~" && merge[id] ) break;

                if (!nodeName || n.nodeName.toUpperCase() == nodeName ) {
                  if ( m == "~" ) merge[id] = true;
                  r.push( n );
                }

                if ( m == "+" ) break;
              }
          }

          ret = r;

          t = jQuery.trim( t.replace( re, "" ) );
          foundToken = true;
        }
      }

      if ( t && !foundToken ) {
        if ( !t.indexOf(",") ) {
          if ( context == ret[0] ) ret.shift();

          done = jQuery.merge( done, ret );

          r = ret = [context];

          t = " " + t.substr(1,t.length);

        } else {
          var re2 = quickID;
          var m = re2.exec(t);

          if ( m ) {
            m = [ 0, m[2], m[3], m[1] ];

          } else {
            re2 = quickClass;
            m = re2.exec(t);
          }

          m[2] = m[2].replace(/\\/g, "");

          var elem = ret[ret.length-1];

          if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) {
            var oid = elem.getElementById(m[2]);

            if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] )
              oid = jQuery('[@id="'+m[2]+'"]', elem)[0];

            ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
          } else {
            for ( var i = 0; ret[i]; i++ ) {
              var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2];

              if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )
                tag = "param";

              r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));
            }

            if ( m[1] == "." )
              r = jQuery.classFilter( r, m[2] );

            if ( m[1] == "#" ) {
              var tmp = [];

              for ( var i = 0; r[i]; i++ )
                if ( r[i].getAttribute("id") == m[2] ) {
                  tmp = [ r[i] ];
                  break;
                }

              r = tmp;
            }

            ret = r;
          }

          t = t.replace( re2, "" );
        }

      }

      if ( t ) {
        var val = jQuery.filter(t,r);
        ret = r = val.r;
        t = jQuery.trim(val.t);
      }
    }

    if ( t )
      ret = [];

    if ( ret && context == ret[0] )
      ret.shift();

    done = jQuery.merge( done, ret );

    return done;
  },

  classFilter: function(r,m,not){
    m = " " + m + " ";
    var tmp = [];
    for ( var i = 0; r[i]; i++ ) {
      var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;
      if ( !not && pass || not && !pass )
        tmp.push( r[i] );
    }
    return tmp;
  },

  filter: function(t,r,not) {
    var last;

    while ( t && t != last ) {
      last = t;

      var p = jQuery.parse, m;

      for ( var i = 0; p[i]; i++ ) {
        m = p[i].exec( t );

        if ( m ) {
          t = t.substring( m[0].length );

          m[2] = m[2].replace(/\\/g, "");
          break;
        }
      }

      if ( !m )
        break;

      if ( m[1] == ":" && m[2] == "not" )
        r = isSimple.test( m[3] ) ?
          jQuery.filter(m[3], r, true).r :
          jQuery( r ).not( m[3] );

      else if ( m[1] == "." )
        r = jQuery.classFilter(r, m[2], not);

      else if ( m[1] == "[" ) {
        var tmp = [], type = m[3];

        for ( var i = 0, rl = r.length; i < rl; i++ ) {
          var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];

          if ( z == null || /href|src|selected/.test(m[2]) )
            z = jQuery.attr(a,m[2]) || '';

          if ( (type == "" && !!z ||
             type == "=" && z == m[5] ||
             type == "!=" && z != m[5] ||
             type == "^=" && z && !z.indexOf(m[5]) ||
             type == "$=" && z.substr(z.length - m[5].length) == m[5] ||
             (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )
              tmp.push( a );
        }

        r = tmp;

      } else if ( m[1] == ":" && m[2] == "nth-child" ) {
        var merge = {}, tmp = [],
          test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
            m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||
            !/\D/.test(m[3]) && "0n+" + m[3] || m[3]),
          first = (test[1] + (test[2] || 1)) - 0, last = test[3] - 0;

        for ( var i = 0, rl = r.length; i < rl; i++ ) {
          var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode);

          if ( !merge[id] ) {
            var c = 1;

            for ( var n = parentNode.firstChild; n; n = n.nextSibling )
              if ( n.nodeType == 1 )
                n.nodeIndex = c++;

            merge[id] = true;
          }

          var add = false;

          if ( first == 0 ) {
            if ( node.nodeIndex == last )
              add = true;
          } else if ( (node.nodeIndex - last) % first == 0 && (node.nodeIndex - last) / first >= 0 )
            add = true;

          if ( add ^ not )
            tmp.push( node );
        }

        r = tmp;

      } else {
        var fn = jQuery.expr[ m[1] ];
        if ( typeof fn == "object" )
          fn = fn[ m[2] ];

        if ( typeof fn == "string" )
          fn = eval("false||function(a,i){return " + fn + ";}");

        r = jQuery.grep( r, function(elem, i){
          return fn(elem, i, m, r);
        }, not );
      }
    }

    return { r: r, t: t };
  },

  dir: function( elem, dir ){
    var matched = [],
      cur = elem[dir];
    while ( cur && cur != document ) {
      if ( cur.nodeType == 1 )
        matched.push( cur );
      cur = cur[dir];
    }
    return matched;
  },

  nth: function(cur,result,dir,elem){
    result = result || 1;
    var num = 0;

    for ( ; cur; cur = cur[dir] )
      if ( cur.nodeType == 1 && ++num == result )
        break;

    return cur;
  },

  sibling: function( n, elem ) {
    var r = [];

    for ( ; n; n = n.nextSibling ) {
      if ( n.nodeType == 1 && n != elem )
        r.push( n );
    }

    return r;
  }
});
/*
 * A number of helper functions used for managing events.
 * Many of the ideas behind this code orignated from
 * Dean Edwards' addEvent library.
 */
jQuery.event = {

  add: function(elem, types, handler, data) {
    if ( elem.nodeType == 3 || elem.nodeType == 8 )
      return;

    if ( jQuery.browser.msie && elem.setInterval )
      elem = window;

    if ( !handler.guid )
      handler.guid = this.guid++;

    if( data != undefined ) {
      var fn = handler;

      handler = this.proxy( fn, function() {
        return fn.apply(this, arguments);
      });

      handler.data = data;
    }

    var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
      handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
        if ( typeof jQuery != "undefined" && !jQuery.event.triggered )
          return jQuery.event.handle.apply(arguments.callee.elem, arguments);
      });
    handle.elem = elem;

    jQuery.each(types.split(/\s+/), function(index, type) {
      var parts = type.split(".");
      type = parts[0];
      handler.type = parts[1];

      var handlers = events[type];

      if (!handlers) {
        handlers = events[type] = {};

        if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem) === false ) {
          if (elem.addEventListener)
            elem.addEventListener(type, handle, false);
          else if (elem.attachEvent)
            elem.attachEvent("on" + type, handle);
        }
      }

      handlers[handler.guid] = handler;

      jQuery.event.global[type] = true;
    });

    elem = null;
  },

  guid: 1,
  global: {},

  remove: function(elem, types, handler) {
    if ( elem.nodeType == 3 || elem.nodeType == 8 )
      return;

    var events = jQuery.data(elem, "events"), ret, index;

    if ( events ) {
      if ( types == undefined || (typeof types == "string" && types.charAt(0) == ".") )
        for ( var type in events )
          this.remove( elem, type + (types || "") );
      else {
        if ( types.type ) {
          handler = types.handler;
          types = types.type;
        }

        jQuery.each(types.split(/\s+/), function(index, type){
          var parts = type.split(".");
          type = parts[0];

          if ( events[type] ) {
            if ( handler )
              delete events[type][handler.guid];

            else
              for ( handler in events[type] )
                if ( !parts[1] || events[type][handler].type == parts[1] )
                  delete events[type][handler];

            for ( ret in events[type] ) break;
            if ( !ret ) {
              if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem) === false ) {
                if (elem.removeEventListener)
                  elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
                else if (elem.detachEvent)
                  elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
              }
              ret = null;
              delete events[type];
            }
          }
        });
      }

      for ( ret in events ) break;
      if ( !ret ) {
        var handle = jQuery.data( elem, "handle" );
        if ( handle ) handle.elem = null;
        jQuery.removeData( elem, "events" );
        jQuery.removeData( elem, "handle" );
      }
    }
  },

  trigger: function(type, data, elem, donative, extra) {
    data = jQuery.makeArray(data);

    if ( type.indexOf("!") >= 0 ) {
      type = type.slice(0, -1);
      var exclusive = true;
    }

    if ( !elem ) {
      if ( this.global[type] )
        jQuery("*").add([window, document]).trigger(type, data);

    } else {
      if ( elem.nodeType == 3 || elem.nodeType == 8 )
        return undefined;

      var val, ret, fn = jQuery.isFunction( elem[ type ] || null ),
        event = !data[0] || !data[0].preventDefault;

      if ( event ) {
        data.unshift({
          type: type,
          target: elem,
          preventDefault: function(){},
          stopPropagation: function(){},
          timeStamp: now()
        });
        data[0][expando] = true; // no need to fix fake event
      }

      data[0].type = type;
      if ( exclusive )
        data[0].exclusive = true;

      var handle = jQuery.data(elem, "handle");
      if ( handle )
        val = handle.apply( elem, data );

      if ( (!fn || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
        val = false;

      if ( event )
        data.shift();

      if ( extra && jQuery.isFunction( extra ) ) {
        ret = extra.apply( elem, val == null ? data : data.concat( val ) );
        if (ret !== undefined)
          val = ret;
      }

      if ( fn && donative !== false && val !== false && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
        this.triggered = true;
        try {
          elem[ type ]();
        } catch (e) {}
      }

      this.triggered = false;
    }

    return val;
  },

  handle: function(event) {
    var val, ret, namespace, all, handlers;

    event = arguments[0] = jQuery.event.fix( event || window.event );

    namespace = event.type.split(".");
    event.type = namespace[0];
    namespace = namespace[1];
    all = !namespace && !event.exclusive;

    handlers = ( jQuery.data(this, "events") || {} )[event.type];

    for ( var j in handlers ) {
      var handler = handlers[j];

      if ( all || handler.type == namespace ) {
        event.handler = handler;
        event.data = handler.data;

        ret = handler.apply( this, arguments );

        if ( val !== false )
          val = ret;

        if ( ret === false ) {
          event.preventDefault();
          event.stopPropagation();
        }
      }
    }

    return val;
  },

  fix: function(event) {
    if ( event[expando] == true )
      return event;

    var originalEvent = event;
    event = { originalEvent: originalEvent };
    var props = "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");
    for ( var i=props.length; i; i-- )
      event[ props[i] ] = originalEvent[ props[i] ];

    event[expando] = true;

    event.preventDefault = function() {
      if (originalEvent.preventDefault)
        originalEvent.preventDefault();
      originalEvent.returnValue = false;
    };
    event.stopPropagation = function() {
      if (originalEvent.stopPropagation)
        originalEvent.stopPropagation();
      originalEvent.cancelBubble = true;
    };

    event.timeStamp = event.timeStamp || now();

    if ( !event.target )
      event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either

    if ( event.target.nodeType == 3 )
      event.target = event.target.parentNode;

    if ( !event.relatedTarget && event.fromElement )
      event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;

    if ( event.pageX == null && event.clientX != null ) {
      var doc = document.documentElement, body = document.body;
      event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
      event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
    }

    if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
      event.which = event.charCode || event.keyCode;

    if ( !event.metaKey && event.ctrlKey )
      event.metaKey = event.ctrlKey;

    if ( !event.which && event.button )
      event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));

    return event;
  },

  proxy: function( fn, proxy ){
    proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
    return proxy;
  },

  special: {
    ready: {
      setup: function() {
        bindReady();
        return;
      },

      teardown: function() { return; }
    },

    mouseenter: {
      setup: function() {
        if ( jQuery.browser.msie ) return false;
        jQuery(this).bind("mouseover", jQuery.event.special.mouseenter.handler);
        return true;
      },

      teardown: function() {
        if ( jQuery.browser.msie ) return false;
        jQuery(this).unbind("mouseover", jQuery.event.special.mouseenter.handler);
        return true;
      },

      handler: function(event) {
        if ( withinElement(event, this) ) return true;
        event.type = "mouseenter";
        return jQuery.event.handle.apply(this, arguments);
      }
    },

    mouseleave: {
      setup: function() {
        if ( jQuery.browser.msie ) return false;
        jQuery(this).bind("mouseout", jQuery.event.special.mouseleave.handler);
        return true;
      },

      teardown: function() {
        if ( jQuery.browser.msie ) return false;
        jQuery(this).unbind("mouseout", jQuery.event.special.mouseleave.handler);
        return true;
      },

      handler: function(event) {
        if ( withinElement(event, this) ) return true;
        event.type = "mouseleave";
        return jQuery.event.handle.apply(this, arguments);
      }
    }
  }
};

jQuery.fn.extend({
  bind: function( type, data, fn ) {
    return type == "unload" ? this.one(type, data, fn) : this.each(function(){
      jQuery.event.add( this, type, fn || data, fn && data );
    });
  },

  one: function( type, data, fn ) {
    var one = jQuery.event.proxy( fn || data, function(event) {
      jQuery(this).unbind(event, one);
      return (fn || data).apply( this, arguments );
    });
    return this.each(function(){
      jQuery.event.add( this, type, one, fn && data);
    });
  },

  unbind: function( type, fn ) {
    return this.each(function(){
      jQuery.event.remove( this, type, fn );
    });
  },

  trigger: function( type, data, fn ) {
    return this.each(function(){
      jQuery.event.trigger( type, data, this, true, fn );
    });
  },

  triggerHandler: function( type, data, fn ) {
    return this[0] && jQuery.event.trigger( type, data, this[0], false, fn );
  },

  toggle: function( fn ) {
    var args = arguments, i = 1;

    while( i < args.length )
      jQuery.event.proxy( fn, args[i++] );

    return this.click( jQuery.event.proxy( fn, function(event) {
      this.lastToggle = ( this.lastToggle || 0 ) % i;

      event.preventDefault();

      return args[ this.lastToggle++ ].apply( this, arguments ) || false;
    }));
  },

  hover: function(fnOver, fnOut) {
    return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut);
  },

  ready: function(fn) {
    bindReady();

    if ( jQuery.isReady )
      fn.call( document, jQuery );

    else
      jQuery.readyList.push( function() { return fn.call(this, jQuery); } );

    return this;
  }
});

jQuery.extend({
  isReady: false,
  readyList: [],
  ready: function() {
    if ( !jQuery.isReady ) {
      jQuery.isReady = true;

      if ( jQuery.readyList ) {
        jQuery.each( jQuery.readyList, function(){
          this.call( document );
        });

        jQuery.readyList = null;
      }

      jQuery(document).triggerHandler("ready");
    }
  }
});

var readyBound = false;

function bindReady(){
  if ( readyBound ) return;
  readyBound = true;

  if ( document.addEventListener && !jQuery.browser.opera)
    document.addEventListener( "DOMContentLoaded", jQuery.ready, false );

  if ( jQuery.browser.msie && window == top ) (function(){
    if (jQuery.isReady) return;
    try {
      document.documentElement.doScroll("left");
    } catch( error ) {
      setTimeout( arguments.callee, 0 );
      return;
    }
    jQuery.ready();
  })();

  if ( jQuery.browser.opera )
    document.addEventListener( "DOMContentLoaded", function () {
      if (jQuery.isReady) return;
      for (var i = 0; i < document.styleSheets.length; i++)
        if (document.styleSheets[i].disabled) {
          setTimeout( arguments.callee, 0 );
          return;
        }
      jQuery.ready();
    }, false);

  if ( jQuery.browser.safari ) {
    var numStyles;
    (function(){
      if (jQuery.isReady) return;
      if ( document.readyState != "loaded" && document.readyState != "complete" ) {
        setTimeout( arguments.callee, 0 );
        return;
      }
      if ( numStyles === undefined )
        numStyles = jQuery("style, link[rel=stylesheet]").length;
      if ( document.styleSheets.length != numStyles ) {
        setTimeout( arguments.callee, 0 );
        return;
      }
      jQuery.ready();
    })();
  }

  jQuery.event.add( window, "load", jQuery.ready );
}

jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
  "mousedown,mouseup,mousemove,mouseover,mouseout,change,select," +
  "submit,keydown,keypress,keyup,error").split(","), function(i, name){

  jQuery.fn[name] = function(fn){
    return fn ? this.bind(name, fn) : this.trigger(name);
  };
});

var withinElement = function(event, elem) {
  var parent = event.relatedTarget;
  while ( parent && parent != elem ) try { parent = parent.parentNode; } catch(error) { parent = elem; }
  return parent == elem;
};

jQuery(window).bind("unload", function() {
  jQuery("*").add(document).unbind();
});
jQuery.fn.extend({
  _load: jQuery.fn.load,

  load: function( url, params, callback ) {
    if ( typeof url != 'string' )
      return this._load( url );

    var off = url.indexOf(" ");
    if ( off >= 0 ) {
      var selector = url.slice(off, url.length);
      url = url.slice(0, off);
    }

    callback = callback || function(){};

    var type = "GET";

    if ( params )
      if ( jQuery.isFunction( params ) ) {
        callback = params;
        params = null;

      } else {
        params = jQuery.param( params );
        type = "POST";
      }

    var self = this;

    jQuery.ajax({
      url: url,
      type: type,
      dataType: "html",
      data: params,
      complete: function(res, status){
        if ( status == "success" || status == "notmodified" )
          self.html( selector ?
            jQuery("<div/>")
              .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))

              .find(selector) :

            res.responseText );

        self.each( callback, [res.responseText, status, res] );
      }
    });
    return this;
  },

  serialize: function() {
    return jQuery.param(this.serializeArray());
  },
  serializeArray: function() {
    return this.map(function(){
      return jQuery.nodeName(this, "form") ?
        jQuery.makeArray(this.elements) : this;
    })
    .filter(function(){
      return this.name && !this.disabled &&
        (this.checked || /select|textarea/i.test(this.nodeName) ||
          /text|hidden|password/i.test(this.type));
    })
    .map(function(i, elem){
      var val = jQuery(this).val();
      return val == null ? null :
        val.constructor == Array ?
          jQuery.map( val, function(val, i){
            return {name: elem.name, value: val};
          }) :
          {name: elem.name, value: val};
    }).get();
  }
});

jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
  jQuery.fn[o] = function(f){
    return this.bind(o, f);
  };
});

var jsc = now();

jQuery.extend({
  get: function( url, data, callback, type ) {
    if ( jQuery.isFunction( data ) ) {
      callback = data;
      data = null;
    }

    return jQuery.ajax({
      type: "GET",
      url: url,
      data: data,
      success: callback,
      dataType: type
    });
  },

  getScript: function( url, callback ) {
    return jQuery.get(url, null, callback, "script");
  },

  getJSON: function( url, data, callback ) {
    return jQuery.get(url, data, callback, "json");
  },

  post: function( url, data, callback, type ) {
    if ( jQuery.isFunction( data ) ) {
      callback = data;
      data = {};
    }

    return jQuery.ajax({
      type: "POST",
      url: url,
      data: data,
      success: callback,
      dataType: type
    });
  },

  ajaxSetup: function( settings ) {
    jQuery.extend( jQuery.ajaxSettings, settings );
  },

  ajaxSettings: {
    url: location.href,
    global: true,
    type: "GET",
    timeout: 0,
    contentType: "application/x-www-form-urlencoded",
    processData: true,
    async: true,
    data: null,
    username: null,
    password: null,
    accepts: {
      xml: "application/xml, text/xml",
      html: "text/html",
      script: "text/javascript, application/javascript",
      json: "application/json, text/javascript",
      text: "text/plain",
      _default: "*/*"
    }
  },

  lastModified: {},

  ajax: function( s ) {
    s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));

    var jsonp, jsre = /=\?(&|$)/g, status, data,
      type = s.type.toUpperCase();

    if ( s.data && s.processData && typeof s.data != "string" )
      s.data = jQuery.param(s.data);

    if ( s.dataType == "jsonp" ) {
      if ( type == "GET" ) {
        if ( !s.url.match(jsre) )
          s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
      } else if ( !s.data || !s.data.match(jsre) )
        s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
      s.dataType = "json";
    }

    if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
      jsonp = "jsonp" + jsc++;

      if ( s.data )
        s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
      s.url = s.url.replace(jsre, "=" + jsonp + "$1");

      s.dataType = "script";

      window[ jsonp ] = function(tmp){
        data = tmp;
        success();
        complete();
        window[ jsonp ] = undefined;
        try{ delete window[ jsonp ]; } catch(e){}
        if ( head )
          head.removeChild( script );
      };
    }

    if ( s.dataType == "script" && s.cache == null )
      s.cache = false;

    if ( s.cache === false && type == "GET" ) {
      var ts = now();
      var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
      s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
    }

    if ( s.data && type == "GET" ) {
      s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;

      s.data = null;
    }

    if ( s.global && ! jQuery.active++ )
      jQuery.event.trigger( "ajaxStart" );

    var remote = /^(?:\w+:)?\/\/([^\/?#]+)/;

    if ( s.dataType == "script" && type == "GET"
        && remote.test(s.url) && remote.exec(s.url)[1] != location.host ){
      var head = document.getElementsByTagName("head")[0];
      var script = document.createElement("script");
      script.src = s.url;
      if (s.scriptCharset)
        script.charset = s.scriptCharset;

      if ( !jsonp ) {
        var done = false;

        script.onload = script.onreadystatechange = function(){
          if ( !done && (!this.readyState ||
              this.readyState == "loaded" || this.readyState == "complete") ) {
            done = true;
            success();
            complete();
            head.removeChild( script );
          }
        };
      }

      head.appendChild(script);

      return undefined;
    }

    var requestDone = false;

    var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();

    if( s.username )
      xhr.open(type, s.url, s.async, s.username, s.password);
    else
      xhr.open(type, s.url, s.async);

    try {
      if ( s.data )
        xhr.setRequestHeader("Content-Type", s.contentType);

      if ( s.ifModified )
        xhr.setRequestHeader("If-Modified-Since",
          jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );

      xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");

      xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
        s.accepts[ s.dataType ] + ", */*" :
        s.accepts._default );
    } catch(e){}

    if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
      s.global && jQuery.active--;
      xhr.abort();
      return false;
    }

    if ( s.global )
      jQuery.event.trigger("ajaxSend", [xhr, s]);

    var onreadystatechange = function(isTimeout){
      if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
        requestDone = true;

        if (ival) {
          clearInterval(ival);
          ival = null;
        }

        status = isTimeout == "timeout" && "timeout" ||
          !jQuery.httpSuccess( xhr ) && "error" ||
          s.ifModified && jQuery.httpNotModified( xhr, s.url ) && "notmodified" ||
          "success";

        if ( status == "success" ) {
          try {
            data = jQuery.httpData( xhr, s.dataType, s.dataFilter );
          } catch(e) {
            status = "parsererror";
          }
        }

        if ( status == "success" ) {
          var modRes;
          try {
            modRes = xhr.getResponseHeader("Last-Modified");
          } catch(e) {} // swallow exception thrown by FF if header is not available

          if ( s.ifModified && modRes )
            jQuery.lastModified[s.url] = modRes;

          if ( !jsonp )
            success();
        } else
          jQuery.handleError(s, xhr, status);

        complete();

        if ( s.async )
          xhr = null;
      }
    };

    if ( s.async ) {
      var ival = setInterval(onreadystatechange, 13);

      if ( s.timeout > 0 )
        setTimeout(function(){
          if ( xhr ) {
            xhr.abort();

            if( !requestDone )
              onreadystatechange( "timeout" );
          }
        }, s.timeout);
    }

    try {
      xhr.send(s.data);
    } catch(e) {
      jQuery.handleError(s, xhr, null, e);
    }

    if ( !s.async )
      onreadystatechange();

    function success(){
      if ( s.success )
        s.success( data, status );

      if ( s.global )
        jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
    }

    function complete(){
      if ( s.complete )
        s.complete(xhr, status);

      if ( s.global )
        jQuery.event.trigger( "ajaxComplete", [xhr, s] );

      if ( s.global && ! --jQuery.active )
        jQuery.event.trigger( "ajaxStop" );
    }

    return xhr;
  },

  handleError: function( s, xhr, status, e ) {
    if ( s.error ) s.error( xhr, status, e );

    if ( s.global )
      jQuery.event.trigger( "ajaxError", [xhr, s, e] );
  },

  active: 0,

  httpSuccess: function( xhr ) {
    try {
      return !xhr.status && location.protocol == "file:" ||
        ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223 ||
        jQuery.browser.safari && xhr.status == undefined;
    } catch(e){}
    return false;
  },

  httpNotModified: function( xhr, url ) {
    try {
      var xhrRes = xhr.getResponseHeader("Last-Modified");

      return xhr.status == 304 || xhrRes == jQuery.lastModified[url] ||
        jQuery.browser.safari && xhr.status == undefined;
    } catch(e){}
    return false;
  },

  httpData: function( xhr, type, filter ) {
    var ct = xhr.getResponseHeader("content-type"),
      xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
      data = xml ? xhr.responseXML : xhr.responseText;

    if ( xml && data.documentElement.tagName == "parsererror" )
      throw "parsererror";

    if( filter )
      data = filter( data, type );

    if ( type == "script" )
      jQuery.globalEval( data );

    if ( type == "json" )
      data = eval("(" + data + ")");

    return data;
  },

  param: function( a ) {
    var s = [];

    if ( a.constructor == Array || a.jquery )
      jQuery.each( a, function(){
        s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );
      });

    else
      for ( var j in a )
        if ( a[j] && a[j].constructor == Array )
          jQuery.each( a[j], function(){
            s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) );
          });
        else
          s.push( encodeURIComponent(j) + "=" + encodeURIComponent( jQuery.isFunction(a[j]) ? a[j]() : a[j] ) );

    return s.join("&").replace(/%20/g, "+");
  }

});
jQuery.fn.extend({
  show: function(speed,callback){
    return speed ?
      this.animate({
        height: "show", width: "show", opacity: "show"
      }, speed, callback) :

      this.filter(":hidden").each(function(){
        this.style.display = this.oldblock || "";
        if ( jQuery.css(this,"display") == "none" ) {
          var elem = jQuery("<" + this.tagName + " />").appendTo("body");
          this.style.display = elem.css("display");
          if (this.style.display == "none")
            this.style.display = "block";
          elem.remove();
        }
      }).end();
  },

  hide: function(speed,callback){
    return speed ?
      this.animate({
        height: "hide", width: "hide", opacity: "hide"
      }, speed, callback) :

      this.filter(":visible").each(function(){
        this.oldblock = this.oldblock || jQuery.css(this,"display");
        this.style.display = "none";
      }).end();
  },

  _toggle: jQuery.fn.toggle,

  toggle: function( fn, fn2 ){
    return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
      this._toggle.apply( this, arguments ) :
      fn ?
        this.animate({
          height: "toggle", width: "toggle", opacity: "toggle"
        }, fn, fn2) :
        this.each(function(){
          jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
        });
  },

  slideDown: function(speed,callback){
    return this.animate({height: "show"}, speed, callback);
  },

  slideUp: function(speed,callback){
    return this.animate({height: "hide"}, speed, callback);
  },

  slideToggle: function(speed, callback){
    return this.animate({height: "toggle"}, speed, callback);
  },

  fadeIn: function(speed, callback){
    return this.animate({opacity: "show"}, speed, callback);
  },

  fadeOut: function(speed, callback){
    return this.animate({opacity: "hide"}, speed, callback);
  },

  fadeTo: function(speed,to,callback){
    return this.animate({opacity: to}, speed, callback);
  },

  animate: function( prop, speed, easing, callback ) {
    var optall = jQuery.speed(speed, easing, callback);

    return this[ optall.queue === false ? "each" : "queue" ](function(){
      if ( this.nodeType != 1)
        return false;

      var opt = jQuery.extend({}, optall), p,
        hidden = jQuery(this).is(":hidden"), self = this;

      for ( p in prop ) {
        if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
          return opt.complete.call(this);

        if ( p == "height" || p == "width" ) {
          opt.display = jQuery.css(this, "display");

          opt.overflow = this.style.overflow;
        }
      }

      if ( opt.overflow != null )
        this.style.overflow = "hidden";

      opt.curAnim = jQuery.extend({}, prop);

      jQuery.each( prop, function(name, val){
        var e = new jQuery.fx( self, opt, name );

        if ( /toggle|show|hide/.test(val) )
          e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
        else {
          var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
            start = e.cur(true) || 0;

          if ( parts ) {
            var end = parseFloat(parts[2]),
              unit = parts[3] || "px";

            if ( unit != "px" ) {
              self.style[ name ] = (end || 1) + unit;
              start = ((end || 1) / e.cur(true)) * start;
              self.style[ name ] = start + unit;
            }

            if ( parts[1] )
              end = ((parts[1] == "-=" ? -1 : 1) * end) + start;

            e.custom( start, end, unit );
          } else
            e.custom( start, val, "" );
        }
      });

      return true;
    });
  },

  queue: function(type, fn){
    if ( jQuery.isFunction(type) || ( type && type.constructor == Array )) {
      fn = type;
      type = "fx";
    }

    if ( !type || (typeof type == "string" && !fn) )
      return queue( this[0], type );

    return this.each(function(){
      if ( fn.constructor == Array )
        queue(this, type, fn);
      else {
        queue(this, type).push( fn );

        if ( queue(this, type).length == 1 )
          fn.call(this);
      }
    });
  },

  stop: function(clearQueue, gotoEnd){
    var timers = jQuery.timers;

    if (clearQueue)
      this.queue([]);

    this.each(function(){
      for ( var i = timers.length - 1; i >= 0; i-- )
        if ( timers[i].elem == this ) {
          if (gotoEnd)
            timers[i](true);
          timers.splice(i, 1);
        }
    });

    if (!gotoEnd)
      this.dequeue();

    return this;
  }

});

var queue = function( elem, type, array ) {
  if ( elem ){

    type = type || "fx";

    var q = jQuery.data( elem, type + "queue" );

    if ( !q || array )
      q = jQuery.data( elem, type + "queue", jQuery.makeArray(array) );

  }
  return q;
};

jQuery.fn.dequeue = function(type){
  type = type || "fx";

  return this.each(function(){
    var q = queue(this, type);

    q.shift();

    if ( q.length )
      q[0].call( this );
  });
};

jQuery.extend({

  speed: function(speed, easing, fn) {
    var opt = speed && speed.constructor == Object ? speed : {
      complete: fn || !fn && easing ||
        jQuery.isFunction( speed ) && speed,
      duration: speed,
      easing: fn && easing || easing && easing.constructor != Function && easing
    };

    opt.duration = (opt.duration && opt.duration.constructor == Number ?
      opt.duration :
      jQuery.fx.speeds[opt.duration]) || jQuery.fx.speeds.def;

    opt.old = opt.complete;
    opt.complete = function(){
      if ( opt.queue !== false )
        jQuery(this).dequeue();
      if ( jQuery.isFunction( opt.old ) )
        opt.old.call( this );
    };

    return opt;
  },

  easing: {
    linear: function( p, n, firstNum, diff ) {
      return firstNum + diff * p;
    },
    swing: function( p, n, firstNum, diff ) {
      return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
    }
  },

  timers: [],
  timerId: null,

  fx: function( elem, options, prop ){
    this.options = options;
    this.elem = elem;
    this.prop = prop;

    if ( !options.orig )
      options.orig = {};
  }

});

jQuery.fx.prototype = {

  update: function(){
    if ( this.options.step )
      this.options.step.call( this.elem, this.now, this );

    (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );

    if ( this.prop == "height" || this.prop == "width" )
      this.elem.style.display = "block";
  },

  cur: function(force){
    if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null )
      return this.elem[ this.prop ];

    var r = parseFloat(jQuery.css(this.elem, this.prop, force));
    return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
  },

  custom: function(from, to, unit){
    this.startTime = now();
    this.start = from;
    this.end = to;
    this.unit = unit || this.unit || "px";
    this.now = this.start;
    this.pos = this.state = 0;
    this.update();

    var self = this;
    function t(gotoEnd){
      return self.step(gotoEnd);
    }

    t.elem = this.elem;

    jQuery.timers.push(t);

    if ( jQuery.timerId == null ) {
      jQuery.timerId = setInterval(function(){
        var timers = jQuery.timers;

        for ( var i = 0; i < timers.length; i++ )
          if ( !timers[i]() )
            timers.splice(i--, 1);

        if ( !timers.length ) {
          clearInterval( jQuery.timerId );
          jQuery.timerId = null;
        }
      }, 13);
    }
  },

  show: function(){
    this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
    this.options.show = true;

    this.custom(0, this.cur());

    if ( this.prop == "width" || this.prop == "height" )
      this.elem.style[this.prop] = "1px";

    jQuery(this.elem).show();
  },

  hide: function(){
    this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
    this.options.hide = true;

    this.custom(this.cur(), 0);
  },

  step: function(gotoEnd){
    var t = now();

    if ( gotoEnd || t > this.options.duration + this.startTime ) {
      this.now = this.end;
      this.pos = this.state = 1;
      this.update();

      this.options.curAnim[ this.prop ] = true;

      var done = true;
      for ( var i in this.options.curAnim )
        if ( this.options.curAnim[i] !== true )
          done = false;

      if ( done ) {
        if ( this.options.display != null ) {
          this.elem.style.overflow = this.options.overflow;

          this.elem.style.display = this.options.display;
          if ( jQuery.css(this.elem, "display") == "none" )
            this.elem.style.display = "block";
        }

        if ( this.options.hide )
          this.elem.style.display = "none";

        if ( this.options.hide || this.options.show )
          for ( var p in this.options.curAnim )
            jQuery.attr(this.elem.style, p, this.options.orig[p]);
      }

      if ( done )
        this.options.complete.call( this.elem );

      return false;
    } else {
      var n = t - this.startTime;
      this.state = n / this.options.duration;

      this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
      this.now = this.start + ((this.end - this.start) * this.pos);

      this.update();
    }

    return true;
  }

};

jQuery.extend( jQuery.fx, {
  speeds:{
    slow: 600,
    fast: 200,
    def: 400
  },
  step: {
    scrollLeft: function(fx){
      fx.elem.scrollLeft = fx.now;
    },

    scrollTop: function(fx){
      fx.elem.scrollTop = fx.now;
    },

    opacity: function(fx){
      jQuery.attr(fx.elem.style, "opacity", fx.now);
    },

    _default: function(fx){
      fx.elem.style[ fx.prop ] = fx.now + fx.unit;
    }
  }
});
jQuery.fn.offset = function() {
  var left = 0, top = 0, elem = this[0], results;

  if ( elem ) with ( jQuery.browser ) {
    var parent       = elem.parentNode,
        offsetChild  = elem,
        offsetParent = elem.offsetParent,
        doc          = elem.ownerDocument,
        safari2      = safari && parseInt(version) < 522 && !/adobeair/i.test(userAgent),
        css          = jQuery.curCSS,
        fixed        = css(elem, "position") == "fixed";

    if ( elem.getBoundingClientRect ) {
      var box = elem.getBoundingClientRect();

      add(box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
        box.top  + Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop));

      add( -doc.documentElement.clientLeft, -doc.documentElement.clientTop );

    } else {

      add( elem.offsetLeft, elem.offsetTop );

      while ( offsetParent ) {
        add( offsetParent.offsetLeft, offsetParent.offsetTop );

        if ( mozilla && !/^t(able|d|h)$/i.test(offsetParent.tagName) || safari && !safari2 )
          border( offsetParent );

        if ( !fixed && css(offsetParent, "position") == "fixed" )
          fixed = true;

        offsetChild  = /^body$/i.test(offsetParent.tagName) ? offsetChild : offsetParent;
        offsetParent = offsetParent.offsetParent;
      }

      while ( parent && parent.tagName && !/^body|html$/i.test(parent.tagName) ) {
        if ( !/^inline|table.*$/i.test(css(parent, "display")) )
          add( -parent.scrollLeft, -parent.scrollTop );

        if ( mozilla && css(parent, "overflow") != "visible" )
          border( parent );

        parent = parent.parentNode;
      }

      if ( (safari2 && (fixed || css(offsetChild, "position") == "absolute")) ||
        (mozilla && css(offsetChild, "position") != "absolute") )
          add( -doc.body.offsetLeft, -doc.body.offsetTop );

      if ( fixed )
        add(Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
          Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop));
    }

    results = { top: top, left: left };
  }

  function border(elem) {
    add( jQuery.curCSS(elem, "borderLeftWidth", true), jQuery.curCSS(elem, "borderTopWidth", true) );
  }

  function add(l, t) {
    left += parseInt(l, 10) || 0;
    top += parseInt(t, 10) || 0;
  }

  return results;
};


jQuery.fn.extend({
  position: function() {
    var left = 0, top = 0, results;

    if ( this[0] ) {
      var offsetParent = this.offsetParent(),

      offset       = this.offset(),
      parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();

      offset.top  -= num( this, 'marginTop' );
      offset.left -= num( this, 'marginLeft' );

      parentOffset.top  += num( offsetParent, 'borderTopWidth' );
      parentOffset.left += num( offsetParent, 'borderLeftWidth' );

      results = {
        top:  offset.top  - parentOffset.top,
        left: offset.left - parentOffset.left
      };
    }

    return results;
  },

  offsetParent: function() {
    var offsetParent = this[0].offsetParent;
    while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
      offsetParent = offsetParent.offsetParent;
    return jQuery(offsetParent);
  }
});


jQuery.each( ['Left', 'Top'], function(i, name) {
  var method = 'scroll' + name;

  jQuery.fn[ method ] = function(val) {
    if (!this[0]) return;

    return val != undefined ?

      this.each(function() {
        this == window || this == document ?
          window.scrollTo(
            !i ? val : jQuery(window).scrollLeft(),
             i ? val : jQuery(window).scrollTop()
          ) :
          this[ method ] = val;
      }) :

      this[0] == window || this[0] == document ?
        self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
          jQuery.boxModel && document.documentElement[ method ] ||
          document.body[ method ] :
        this[0][ method ];
  };
});
jQuery.each([ "Height", "Width" ], function(i, name){

  var tl = i ? "Left"  : "Top",  // top or left
    br = i ? "Right" : "Bottom"; // bottom or right

  jQuery.fn["inner" + name] = function(){
    return this[ name.toLowerCase() ]() +
      num(this, "padding" + tl) +
      num(this, "padding" + br);
  };

  jQuery.fn["outer" + name] = function(margin) {
    return this["inner" + name]() +
      num(this, "border" + tl + "Width") +
      num(this, "border" + br + "Width") +
      (margin ?
        num(this, "margin" + tl) + num(this, "margin" + br) : 0);
  };

});})();
whitepages = function() {};
whitepages.version = '1.0';

whitepages.common = function() {};

/**
 * getCookieData gets the value from a cookie name and key
 *
 * @returns {string} the value of the cookie
 */
whitepages.common.getCookieData = function(name, key)
{
  var c = document.cookie.split('; ');
  var i,nvp,j;

  for ( i=0, cl = c.length; i < cl; i++ ) {
    if ( c[i].indexOf(name) > -1 ) {
      nvp = c[i].split('=')[1].split('%26');  // Get the name value pairs
      for ( j=0, nl=nvp.length; j<nl; j++ ) {
        if ( nvp[j].split('%3D')[0] == key ) { return nvp[j].split('%3D')[1]; }
      }
    }
  }
  return '';  /** WP: No cookie with that name */
}; /** WP: end getCookieData */

/**
 * setCookieData sets a key value pair to a named cookie
 */
whitepages.common.setCookieData = function(name, key, value, pExpires, domain)
{
	var date = new Date();
  var path = '; path=/';
  var cookies = document.cookie.split('; ');
  var cookie_val = '';
  var cookie_domain = (domain && domain != '') ? domain : false
  var hasKey  = false;
  var i = 0;
  var pairs = [];
  var expires = '';

  if (!pExpires) {
    switch (name) {
      case 'wp_perm':
        date.setTime(date.getTime() + (360*24*60*60*1000));
        expires = '; expires=' + date.toGMTString();
        break;
      case 'wp_interstitial':
        date.setTime(date.getTime() + (24*60*60*1000));
        expires = '; expires=' + date.toGMTString();
        break;
      default:
        expires = '';
        break;
    }
  }

  cookie_domain_for_output = '';
  if (cookie_domain) {
    cookie_domain_for_output = "; domain=" + cookie_domain;
  } else if (whitepages.page.data.wildcard_cookie_domain != null) {
    cookie_domain_for_output = "; domain=" + whitepages.page.data.wildcard_cookie_domain;
  }

  for (i = 0, cl = cookies.length; i < cl; i++) {
    if (cookies[i].indexOf(name + '=') != -1 ) {
      pairs = cookies[i].split('=')[1].split('%26');
      break;
    }
  }

  for (i = 0, pl = pairs.length; i < pl; i++) {
    if (pairs[i].split('%3D')[0] == key) {
      pairs[i] = key + '%3D' + value;
      hasKey = true;
      break;
    }
  }
  if (!hasKey) {
    pairs[pairs.length] = key + '%3D' + value;
  }

  cookie_val = '='
  for (i = 0, pl = pairs.length; i < pl; i++) {
    cookie_val += pairs[i] + '%26';
  }
  cookie_val = cookie_val.replace(/%26$/, '');

  document.cookie = name + cookie_val + expires + path + cookie_domain_for_output;
}

/*
 * cookies_disabled
 *
 * DESCRIPTION: This method checks if cookies are disabled
 *
 * RETURNS:     boolean
 *
 */
whitepages.common.cookies_disabled = function() {
  document.cookie = "wp_cookies_enabled=true;";
  var results = document.cookie.match ( '(^|;) ?wp_cookies_enabled=([^;]*)(;|$)' );
  if (!results) {
    return true;
  }
  else {
    document.cookie = "wp_cookies_enabled=; expires=01/01/2001 00:00:00;";
  }
  return false;
}

/**
 * dump takes a basic JS object and dumps the key's and values out to a string
 *
 * @param pObj {object} is the object you would like to see analyzed.
 * @return {string} a slightly formatted string that shows key value pairs
 */
whitepages.common.dump = function(pObj)
{
  var dump = ''
  for (x in pObj) {
    dump += x + ': ' + pObj[x] + '\n';
  }
  return dump;
}


/**
 * setOriginPage sets the current page into a cookie to be used in "back" links from certain pages
 */
whitepages.common.setOriginPage = function()
{
  whitepages.common.setCookieData('wp_session', 'origin_url', escape(escape(location.href)));
  return true;
}


/** WP:
 * get_rdb_cookie
 *
 * Array returned contains hexadecimal values. Use hex2dec() to convert.
 *
 * BUG: The RDB cookie does not have a different name for each stage (qa, dev, production)
 *      but one does exists in every whitepages.com subdomain (qa.whitpages, dev.whitepages)
 *      so even though the perl code will write to the cookie for the correct domain
 *      the javascript will not necessarily read from the correct one.
 *      One solution for this is to rename the cookie to include a stage name but that
 *      would require significant changes.
 */
whitepages.common.get_rdb_cookie = function(stage)
{
  var name = 'RDB';
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for(var i=0;i < ca.length;i++) {
    var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
    if ( c.indexOf(nameEQ) == 0 ) {

      /** WP: RDB Cookie
                # 0   Original string
        (.{4})  # 1   c802
        (.{6})  # 2   zip
        (.{4})  # 3   zip4
        (.{4})  # 4   country
        (.{2})  # 5   gender
        (.{2})  # 6   primary_usage
        (.{2})  # 7   income_low
        (.{2})  # 8   income_high
        (.{2})  # 9   age_low or business_size_low
        (.{2})  # 10  age_high or business_size_high
        (.{1})  # 11  user trait 0 connection_type
        (.{1})  # 12  user trait 0 purchasing power
        (.{1})  # 13  user trait 1 home_owner + renter + lives_in_apartment + lives_in_house
        (.{1})  # 14  user trait 1 married + single + home > 0k + home > 100k
        (.{1})  # 15  user trait 2 home > 250k + home > 500k + home > 750k + home > 1M
        (.{1})  # 16  user trait 2 home > median + home < median + residency 0-6mo + residency 7-12mo
        (.{1})  # 17  user trait 3 residency 13-24mo + residency > 5y + residency > 10y + residency > 20y
        (.{1})  # 18  user trait 3 children + census pop > 100k + census pop > 250k + census females > males
        (.{8})  # 19  user trait 4-7
        (.{3})  # 20  carrier
        (.{5})  # 21  birth_year
      */
            var rdb_fields = [];
            var rdb_regex =
              /(.{4})(.{6})(.{4})(.{4})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{1})(.{1})(.{1})(.{1})(.{1})(.{1})(.{1})(.{1})(.{8})(.{3})(.{5})/;
            rdb_fields = c.substring( nameEQ.length,c.length ).match( rdb_regex );

            if (rdb_fields) {
                return rdb_fields;
            }
    }
  }
  return null;
};

/** WP: Decimal to Hexadecimal */
whitepages.common.dec2hex = function(dec)
{
  return dec.toString(16);
};

/** "WP: Hexadecimal to Decimal */
whitepages.common.hex2dec = function(hex)
{
  return parseInt(hex,16);
};

/** WP
* Do not display empty Omniture GIF in the layout --- EXPANDED!
* This must be called after the DOM is ready to accept it, for Propietary sites
* it must be called from within the pre-compiled common.js (one dir down) after
* s_wpn has loaded. For all other sites it's called immediately
*/
whitepages.common.hide_omniture_tracking_img = function(imagename) {
  try {
    var omniname = 's_i_' + imagename;
    var img = document.getElementsByName(omniname);
    if (img.length == 1) {
      /** WP: Hide it from the layout */
      img[0].style.position = 'absolute';
      img[0].style.top = '0';
      img[0].style.left = '0';
    }
  }
  catch (err) {
    /** WP: debug
    alert(err.description);
    */
  }
};

whitepages.common.open_help = function(url) {
  window.open(url,'_blank', 'width=1020,height=600,scrollbars=1,toolbar=yes,menubar=yes,location=yes,resizeable=yes');
}

var common_ad;

if (location.pathname == 'help') {
  self.name = 'WhitepagesHelp';
} else {
  self.name = 'WhitepagesMain';
}
jQuery.autocomplete = function(input, options) {
  var me = this;

  var $input = $(input).attr("autocomplete", "off");

  if (options.inputClass) {
    $input.addClass(options.inputClass);
  }

  var results = document.createElement("div");

  var $results = $(results).hide().addClass(options.resultsClass).css("position", "absolute");
  if( options.width > 0 ) {
    $results.css("width", options.width);
  }

  $("body").append(results);

  input.autocompleter = me;

  var timeout = null;
  var prev = "";
  var active = -1;
  var cache = {};
  var keyb = false;
  var hasFocus = false;
  var lastKeyPressCode = null;
  var mouseDownOnSelect = false;
  var hidingResults = false;

  function flushCache(){
    cache = {};
    cache.data = {};
    cache.length = 0;
  };

  flushCache();

  if( options.data != null ){
    var sFirstChar = "", stMatchSets = {}, row = [];

    if( typeof options.url != "string" ) {
      options.cacheLength = 1;
    }

    for( var i=0; i < options.data.length; i++ ){
      row = ((typeof options.data[i] == "string") ? [options.data[i]] : options.data[i]);

      if( row[0].length > 0 ){
        sFirstChar = row[0].substring(0, 1).toLowerCase();
        if( !stMatchSets[sFirstChar] ) stMatchSets[sFirstChar] = [];
        stMatchSets[sFirstChar].push(row);
      }
    }

    for( var k in stMatchSets ) {
      options.cacheLength++;
      addToCache(k, stMatchSets[k]);
    }
  }

  $input
  .keydown(function(e) {
    lastKeyPressCode = e.keyCode;
    switch(e.keyCode) {
      case 38: // up
        e.preventDefault();
        moveSelect(-1);
        break;
      case 40: // down
        e.preventDefault();
        moveSelect(1);
        break;
      case 9:  // tab
        if( selectCurrent() ){
          $('input:eq(' + ($('input').index(this) + 1) + ')').focus();
          e.preventDefault();
        }
        break;
      case 13: // return
        if( selectCurrent() ){
          e.preventDefault();
        }
        break;
      default:
        active = -1;
        if (timeout) clearTimeout(timeout);
        timeout = setTimeout(function(){onChange();}, options.delay);
        break;
    }
  })
  .focus(function(){
    hasFocus = true;
  })
  .blur(function() {
    hasFocus = false;
    if (!mouseDownOnSelect) {
      hideResults();
    }
  });

  hideResultsNow();

  function onChange() {
    if( lastKeyPressCode == 46 || (lastKeyPressCode > 8 && lastKeyPressCode < 32) ) return $results.hide();
    var v = $input.val();
    if (v == prev) return;
    prev = v;

    var numLetters = v.replace(/[^a-z]/gi, '').length;
    if (numLetters >= options.minChars) {
      requestData(v);
    } else {
      $results.hide();
    }
  };

  function moveSelect(step) {

    var lis = $("li", results);
    if (!lis) return;

    active += step;

    if (active < 0) {
      active = 0;
    } else if (active >= lis.size()) {
      active = lis.size() - 1;
    }

    lis.removeClass("autocomplete_over");

    $(lis[active]).addClass("autocomplete_over");


  };

  function selectCurrent() {
    var li = $("li.autocomplete_over", results)[0];
    if (!li) {
      var $li = $("li", results);
      if (options.selectOnly) {
        if ($li.length == 1) li = $li[0];
      } else if (options.selectFirst) {
        li = $li[0];
      }
    }
    if (li) {
      selectItem(li);
      return true;
    } else {
      return false;
    }
  };

  function selectItem(li) {
    if (!li) {
      li = document.createElement("li");
      li.extra = [];
      li.selectValue = "";
    }
    var v = $.trim(li.selectValue ? li.selectValue : li.innerHTML);
    input.lastSelected = v;
    prev = v;
    $results.html("");
    $input.val(v);
    hideResultsNow();
    if (options.onItemSelect) {
      setTimeout(function() { options.onItemSelect(li) }, 1);
    }
  };

  function createSelection(start, end){
    var field = $input.get(0);
    if( field.createTextRange ){
      var selRange = field.createTextRange();
      selRange.collapse(true);
      selRange.moveStart("character", start);
      selRange.moveEnd("character", end);
      selRange.select();
    } else if( field.setSelectionRange ){
      field.setSelectionRange(start, end);
    } else {
      if( field.selectionStart ){
        field.selectionStart = start;
        field.selectionEnd = end;
      }
    }
    field.focus();
  };

  function showResults() {
    var pos = findPos(input);
    if (options.width > 0) {
      var iWidth = options.width;
    } else {
      var iWidth = $input.width();

      iWidth += parseInt($input.css('paddingLeft')) + parseInt($input.css('paddingRight'));
    }

    $results.css('borderColor', $input.css('border-left-color'));

    $results.css({
      width: parseInt(iWidth) + "px",
      top: (pos.y + input.offsetHeight) + "px",
      left: (pos.x + 1) + "px"
    }).show();
  };

  function hideResults() {
    if (timeout) clearTimeout(timeout);
    timeout = setTimeout(hideResultsNow, 200);
  };

  function hideResultsNow() {
    if (hidingResults) {
      return;
    }
    hidingResults = true;

    if (timeout) {
      clearTimeout(timeout);
    }

    var v = $input.val();

    if ($results.is(":visible")) {
      $results.hide();
    }

    if (options.mustMatch) {
      if (!input.lastSelected || input.lastSelected != v) {
        selectItem(null);
      }
    }

    hidingResults = false;
  };

  function receiveData(q, data) {
    if (data) {
      results.innerHTML = "";

      if( !hasFocus || data.length == 0 ) return hideResultsNow();

      if ($.browser.msie) {
        $results.append(document.createElement('iframe'));
      }
      results.appendChild(dataToDom(data));

      showResults();
    } else {
      options.no_results_string = q;
      hideResultsNow();
    }
  };

  function parseData(data) {
    if (!data) return null;
    var parsed = [];
    var rows = data.split(options.lineSeparator);
    for (var i=0; i < rows.length; i++) {
      var row = $.trim(rows[i]);
      if (row) {
        parsed[parsed.length] = row.split(options.cellSeparator);
      }
    }
    return parsed;
  };

  function dataToDom(data) {
    var ul = document.createElement("ul");
    var num = data.length;

    if( (options.maxItemsToShow > 0) && (options.maxItemsToShow < num) ) num = options.maxItemsToShow;

    for (var i=0; i < num; i++) {
      var row = data[i];
      if (!row) continue;
      var li = document.createElement("li");
      if (options.formatItem) {
        li.innerHTML = options.formatItem(row, i, num);
        li.selectValue = row[0];
      } else {
        li.innerHTML = row[0];
        li.selectValue = row[0];
      }
      var extra = null;
      if (row.length > 1) {
        extra = [];
        for (var j=1; j < row.length; j++) {
          extra[extra.length] = row[j];
        }
      }
      li.extra = extra;
      ul.appendChild(li);

      $(li).hover(
        function() { $("li", ul).removeClass("autocomplete_over"); $(this).addClass("autocomplete_over"); active = $("li", ul).indexOf($(this).get(0)); },
        function() { $(this).removeClass("autocomplete_over"); }
      ).click(function(e) {
        e.preventDefault();
        e.stopPropagation();
        selectItem(this)
      });

    }
    $(ul).mousedown(function() {
      mouseDownOnSelect = true;
    }).mouseup(function() {
      mouseDownOnSelect = false;
    });
    return ul;
  };

  function requestData(q) {
    if (!options.matchCase) q = q.toLowerCase();
    var data = options.cacheLength ? loadFromCache(q) : null;
    if (data) {
      receiveData(q, data);
    } else if( (typeof options.url == "string") && (options.url.length > 0) ){
      if (options.no_results_string) {
        var no_results_regex = new RegExp('^' + options.no_results_string);
        if (q.match(no_results_regex))
        {
          return false;
        }
      }
      $.get(makeUrl(q), function(data) {
        data = parseData(data);
        if (data && data.length < options.maxItemsReturned)
        {
          addToCache(q, data);
        }
        receiveData(q, data);
      });
    }
  };

  function makeUrl(q) {
    var sep = options.url.indexOf('?') == -1 ? '?' : '&';
    var url = options.url + sep + "q=" + encodeURI(q);
    for (var i in options.extraParams) {
      url += "&" + i + "=" + encodeURI(options.extraParams[i]);
    }
    return url;
  };

  function loadFromCache(q) {
    if (!q) return null;
    if (cache.data[q]) return cache.data[q];
    if (options.matchSubset) {
      for (var i = q.length - 1; i >= options.minChars; i--) {
        var qs = q.substr(0, i);
        var c = cache.data[qs];
        if (c) {
          var csub = [];
          for (var j = 0; j < c.length; j++) {
            var x = c[j];
            var x0 = x[0];
            if (matchSubset(x0, q)) {
              csub[csub.length] = x;
            }
          }
          return csub;
        }
      }
    }
    return null;
  };

  function matchSubset(s, sub) {
    if (!options.matchCase) s = s.toLowerCase();
    var i = s.indexOf(sub);
    if (i == -1) return false;
    return i == 0 || options.matchContains;
  };

  this.flushCache = function() {
    flushCache();
  };

  this.setExtraParams = function(p) {
    options.extraParams = p;
  };

  this.findValue = function(){
    var q = $input.val();

    if (!options.matchCase) q = q.toLowerCase();
    var data = options.cacheLength ? loadFromCache(q) : null;
    if (data) {
      findValueCallback(q, data);
    } else if( (typeof options.url == "string") && (options.url.length > 0) ){
      $.get(makeUrl(q), function(data) {
        data = parseData(data)
        addToCache(q, data);
        findValueCallback(q, data);
      });
    } else {
      findValueCallback(q, null);
    }
  }

  function findValueCallback(q, data){

    var num = (data) ? data.length : 0;
    var li = null;

    for (var i=0; i < num; i++) {
      var row = data[i];

      if( row[0].toLowerCase() == q.toLowerCase() ){
        li = document.createElement("li");
        if (options.formatItem) {
          li.innerHTML = options.formatItem(row, i, num);
          li.selectValue = row[0];
        } else {
          li.innerHTML = row[0];
          li.selectValue = row[0];
        }
        var extra = null;
        if( row.length > 1 ){
          extra = [];
          for (var j=1; j < row.length; j++) {
            extra[extra.length] = row[j];
          }
        }
        li.extra = extra;
      }
    }

    if( options.onFindValue ) setTimeout(function() { options.onFindValue(li) }, 1);
  }

  function addToCache(q, data) {
    if (!data || !q || !options.cacheLength) return;
    if (!cache.length || cache.length > options.cacheLength) {
      flushCache();
      cache.length++;
    } else if (!cache[q]) {
      cache.length++;
    }
    cache.data[q] = data;
  };

  function findPos(obj) {
    var curleft = obj.offsetLeft || 0;
    var curtop = obj.offsetTop || 0;
    while (obj = obj.offsetParent) {
      curleft += obj.offsetLeft
      curtop += obj.offsetTop
    }
    return {x:curleft,y:curtop};
  }
}

jQuery.fn.autocomplete = function(url, options, data) {
  options = options || {};
  options.url = url;
  options.data = ((typeof data == "object") && (data.constructor == Array)) ? data : null;

  options.no_results_string = null;

  options = $.extend({
    inputClass: "autocomplete_input",
    resultsClass: "autocomplete_results",
    lineSeparator: "\n",
    cellSeparator: "|",
    minChars: 3,
    delay: 150,
    matchCase: 0,
    matchSubset: 1,
    matchContains: 0,
    cacheLength: 500,
    mustMatch: 0,
    extraParams: {},
    selectFirst: false,
    selectOnly: false,
    maxItemsToShow: 14,
    width: 0,
    maxItemsReturned: 100 // Maximum items returned from the server when the
  }, options);
  options.width = parseInt(options.width, 10);

  this.each(function() {
    var input = this;
    new jQuery.autocomplete(input, options);
  });

  return this;
}

jQuery.fn.autocompleteArray = function(data, options) {
  return this.autocomplete(null, options, data);
}

jQuery.fn.indexOf = function(e){
  for( var i=0; i<this.length; i++ ){
    if( this[i] == e ) return i;
  }
  return -1;
};
 /** WP:
 *
 *  wpn_ads.js 0.1
 *
 *  Constructor:
 *
 */

function WPN_AD (url, site, page, positions, query, test_mode, ad_call, ad_params)
{
  var random_number = new String(Math.random());

  this.area      = page ? '/area=' + page : '';
  this.site      = site ? '/site=' + site : '';
  this.aambx     = '';
  this.positions = positions;
  this.posn_list = new Object();
  this.aryAdPos  = [];
  this.rand_num  = random_number.substring(2,11);
  this.query     = query;
  this.test_mode = test_mode ? test_mode : false; //test_mode;
  this.url       = url;
  this.ad_call   = ad_call ? ad_call : '/bserver/AAMALL'; /** WP test ads by using hserver, default to bserver */
  this.ad_params = ad_params ? ad_params : '';

  this.timestamp();
}

/** WP:
 *
 *  Fields:
 *
 */

WPN_AD.prototype.displayed;
WPN_AD.prototype.headers   = 0;
WPN_AD.prototype.area;
WPN_AD.prototype.site;
WPN_AD.prototype.aambx;
WPN_AD.prototype.positions;
WPN_AD.prototype.posn_list;
WPN_AD.prototype.aryAdPos;
WPN_AD.prototype.query;
WPN_AD.prototype.rand_num;
WPN_AD.prototype.test_mode;
WPN_AD.prototype.url;
WPN_AD.prototype.ad_call;
WPN_AD.prototype.ad_params;
WPN_AD.prototype.version   = (navigator.userAgent.indexOf('Mozilla/3')         != -1 ||
               navigator.userAgent.indexOf('Mozilla/4.0 WebTV') != -1    )
              ? 10
              : 11;

/** WP
 *
 *  Methods:
 *
 */

/** WP: Update "last displayed" value. */
WPN_AD.prototype.timestamp = function ( ) {
  var date = new Date();
  this.displayed = date.getTime();
}

/** WP:
 *
 *  Return MJX URL.
 *  Needed in two places, including ads.xslt.
 *
 */

WPN_AD.prototype.MJX_URL = function ( ) {
  return this.url + this.ad_call
          + '/random=' + this.rand_num
          + '/pageid=' + this.rand_num
          + this.ad_params
          + this.site
          + this.area
                  + this.aambx;
}

/** WP:
 *
 *  MJX header call if we're in that mode, otherwise nothing.
 *
 */

WPN_AD.prototype.header = function ( ) {
  this.aryAdPos = this.positions.split(/,/);

  for ( i=0,len=this.aryAdPos.length; i<len; i++ ) {
    var j = i+1;
    this.aambx += '/AAMB' + j + '/AAMSZ=' + this.aryAdPos[i];
  }

  document.write(
    '<script id="ad_server_header_script" type=text/javascript src="'
    + this.MJX_URL() + '"></script>'
  );

  this.timestamp();
}

/** WP:
 *
 *  Specific ad calls
 *
 */

WPN_AD.prototype.ad = function (position, order) {
  if (! this.posn_list[position]) {
    this.posn_list[position] = 0;
  };
  document.writeln(order);

  this.timestamp();
}
 /** WP:
 *
 *  common_ads.js 0.1
 *
 *  Constructor:
 *
 */

function COMMON_AD ( ) {
  this.swap_list = [];


  /**
   * getAgeFromRDBCookie returns the age from the RDB cookie based on either the age, or the year of birth
   *
   * @param RDBCookie the cookie string
   * @returns age {number} age from the cookie or 0 if not found
   */
  this.getAgeFromRDBCookie = function(RDBCookie) {
    var age = 0,
        rdb = RDBCookie,
        h2d = whitepages.common.hex2dec;
    if (rdb) {
      if (h2d(rdb[9]) > 0) {
        age = h2d(rdb[9]);
      } else if (h2d(rdb[21]) > 0) {
        var now = new Date();
        age = now.getFullYear() - h2d(rdb[21]);
      }
    }
    return age || 0;
  }
}


/**
 * STATIC METHODS
 */


/**
 * relocateAd is an Atlas method for rendering ads for IE into their appropriate positions on the page.
 * This script is from Atlas but has been stuffed in here for code organization and namespace reasons.
 *
 */
COMMON_AD.relocateAd = function(iframeObj, divName) {
  var iframeDoc,
  allScripts;
  iframeDoc = iframeObj.contentWindow.document;
  allScripts = iframeDoc.getElementsByTagName('script');
  for (s = 0; s < allScripts.length; s++)
    if (allScripts[s].src)
      allScripts[s].src = '';
  document.getElementById(divName).insertAdjacentElement('beforeEnd', iframeDoc.getElementById('adDiv'));
  iframeObj.style.display = 'none';
}

/**
 * render_interstitial is a special helper to render the interstitial ad with all of its fade-magic.
 */
COMMON_AD.render_interstitial = function(elAdDiv, code)
{
  if (!/AE\d\.gif/.test(code)) {
    whitepages.common.setCookieData('wp_interstitial', 'viewed_interstitial', true);
    $('#logo').css('zIndex',10001);
    $('#interstitial_ad').appendTo('body').css('position', 'absolute').width('100%').height('100%').css('zIndex',10000).hide().css('opacity', 1).fadeIn(1000, function () {
        $('#interstitial_close').show();  // close button
        $('#interstitial_instruct').show(); // instructions
        elAdDiv.innerHTML = code; // ad
        setTimeout(function () {
            $('#interstitial_ad').fadeOut(500);
          },
          15000
        );
    });
  }
}

/**
 *
 */


/** WP:
 *
 *  Fields:
 *
 */
COMMON_AD.prototype.swap_array = {};
COMMON_AD.prototype.listing = {};
COMMON_AD.prototype.attrs = ['href', 'src', 'value']; /** WP: Check these attributes for __TOKEN__ */

COMMON_AD.prototype.render_wpn_ad = function ( div_name, aamb_tag ) {
  var invObj = 'INV' + div_name;
  try {
    var code = eval(aamb_tag);
    var elAdDiv = document.getElementById(div_name);
    if ((typeof(code) != 'undefined') && (elAdDiv !== null)) {
      if(navigator.userAgent.indexOf('MSIE') > -1) {
        if (div_name.match('text_link')) {
          document.write('<div id="' + invObj + '" style="display:none">' + code + '</div>');
          elAdDiv.appendChild(document.getElementById(invObj)).style.display = '';
				} else if (div_name.match('endemic_panel')) {
				  document.write('<div id="' + invObj + '" style="display:none">' + code + '</div>');
				  elAdDiv.appendChild(document.getElementById(invObj)).style.display = '';
				} else if (div_name.match('interstitial')) {
          document.write('<div id="' + invObj + '" style="display:none">' + code + '</div>');
          $(document).ready(function () {
              COMMON_AD.render_interstitial(elAdDiv, code);
            });
        } else if (div_name.match('search_module')) {
          document.write('<div id="' + invObj + '" style="display:none">' + code + '</div>');
          elAdDiv.appendChild(document.getElementById(invObj)).style.display = '';
        } else if (div_name.match('top_rail_link')) {
          document.write('<div id="' + invObj + '" style="display:none">' + code + '</div>');
          elAdDiv.appendChild(document.getElementById(invObj)).style.display = '';
        } else if (div_name.match('pop_under')) {
          document.write('<div id="' + invObj + '" style="display:none">' + code + '</div>');
          elAdDiv.appendChild(document.getElementById(invObj)).style.display = '';
        } else if (div_name.match('results_custom_right_rail')) {
          document.write('<div id="' + invObj + '" style="display:none">' + code + '</div>');
          elAdDiv.appendChild(document.getElementById(invObj)).style.display = '';
        } else if (div_name.match('teaser_link')) {
          document.write('<div id="' + invObj + '" style="display:none">' + code + '</div>');
          elAdDiv.appendChild(document.getElementById(invObj)).style.display = '';
        } else {
          elAdDiv.innerHTML +=
            '<div id="TMP' + div_name + '" style="display:none">' +
            escape('<body><div id="adDiv">' + code + '</div>') +
            '</div><iframe name="' + invObj + '"width="0" height="0" frameborder="0" ' +
            'onload="javascript: COMMON_AD.relocateAd(this, \'' + div_name + '\');"></iframe>';
          window.frames[invObj].document.location =
            'javascript:unescape(parent.document.getElementById(\'TMP' +
            div_name + '\').innerHTML)';
        }
      }
      else {
        if (div_name.match('search_module') || div_name.match('endemic_panel')) {
          elAdDiv.innerHTML = code;
          document.write('<div id="' + invObj + '" style="display:none">' + code + '</div>');
				} else if (div_name.match('interstitial')) {
          document.write('<div id="' + invObj + '" style="display:none">' + code + '</div>');
          $(document).ready(function() {
              COMMON_AD.render_interstitial(elAdDiv, code);
            });
        } else if (div_name.match('text_link')) {
          elAdDiv.innerHTML = code;
          document.write('<div id="' + invObj + '" style="display:none">' + code + '</div>');
        } else if (div_name.match('teaser_link')) {
          elAdDiv.innerHTML = code;
          document.write('<div id="' + invObj + '" style="display:none">' + code + '</div>');
        } else if (div_name.match('results_custom_right_rail')) {
          elAdDiv.innerHTML = code;
          document.write('<div id="' + invObj + '" style="display:none">' + code + '</div>');
        } else {
          document.writeln('<div id="' + invObj + '" style="display:none">' +
          code + '<script type="text/javascript" defer="true">' +
          'document.getElementById(\'' + div_name + '\').innerHTML = ' +
          'document.getElementById(\'' + invObj + '\').innerHTML;' +
          'document.getElementById(\'' + invObj +
          '\').innerHTML = \'\';</scr' + 'ipt></div>');
        }
      }
    }

      if ( this.swap_list[div_name] instanceof Object ) {
      this.swap(div_name);
    }
  }
  catch(aamErr) {
  }
}

/** WP:
 *
 * OAS ads are served as the page content is rendered, and Atlas
 * after the page content is rendered. For backwards compatability
 * with OAS, swap_values() is still called as the page is rendered.
 * This populates this.swap_list which Atlas uses after the
 * page content is rendered.
 *
 */


/** WP:
 *
 *  Set swap keywords in generated ad content for listing values.
 *
 */

COMMON_AD.prototype.swap_values = function ( div_id ) {
  /** WP:
   *
   *  First store the data
   *  (note that the DIV ID is different than the ones we create
   *  normally in this object, this is because multiple ad
   *  positions may be handled within one div):
   *
   */
  this.swap_list[div_id] = {};

  for (var i = 1; i < arguments.length; i += 2) {
    this.swap_list[div_id]['__' + arguments[i] + '__'] = arguments[i+1];
  }
  this.token_replace(div_id);
}

/** WP:
 *
 *  Swap keywords in generated ad content for listing values.
 *
 */

COMMON_AD.prototype.swap = function ( div_id ) {
  var div = document.getElementById( div_id );
  listingData = this.swap_list[div_id];
  /** WP: Get children from the DOM */
  this.checkNodeList( div.childNodes, listingData );
}

COMMON_AD.prototype.checkNodeList = function ( nodeList, listingData ) {
  for ( var i=0, len=nodeList.length; i<len; i++ ) {
    this.checkNode( nodeList[i], listingData );
  }
}

/** WP: Check the attributes for each element */
COMMON_AD.prototype.checkNode = function ( node, listingData ) {
  if ( node.nodeType == 3 ) {
    for ( key in listingData ) {
      if ( node.nodeValue.match('__' + key + '__') ) {
        node.nodeValue = node.nodeValue.replace( '__' + key + '__', listingData[key] );
      }
    }
  }
  else {
      for ( var k=0, leng=this.attrs.length; k<leng; k++ ) {
        if ( node.attributes[ this.attrs[k] ] ) {
          for ( key in listingData ) {
            if ( node.attributes[this.attrs[k]].value.match('__' + key + '__') ) {
              node.attributes[this.attrs[k]].value = node.attributes[this.attrs[k]].value.replace( '__' + key + '__', listingData[key] );
            }
          }
        }
      }
  }

  if ( node.hasChildNodes() ) {
    this.checkNodeList( node.childNodes, listingData );
  }
  /** WP:
   *
   * If element nodetype = text, check the text
   * If element has children, run the loop again
   */
}

COMMON_AD.prototype.set_swap_object = function ( div_id, obj ) {
  /** WP:
   *
   * Put comma separated values into an array and build a multidimensional array. Since the ads are rendered
   * after the page content is loaded, __TOKEN__ replacement will need to occur after the page content is
   * rendered also.
   *
   */
  this.swap_list[div_id] = obj;
  return;
}

COMMON_AD.prototype.swap_after_content = function ( ) {
  var swapRegex = new RegExp("resultslink");
  for ( var div_id in this.swap_list ) {
    if ( div_id.match(swapRegex) ) {
      this.token_replace( div_id );
    }
  }
}

COMMON_AD.prototype.token_replace = function ( div_id ) {
  var div = document.getElementById(div_id);

  if(div)
  {
    for (var tag in this.swap_list[div_id])
    {
      var regexp = new RegExp(tag, 'g');
      /** WP:  why not have txt defined inline below??? */
      div.innerHTML = div.innerHTML.replace(regexp, this.swap_list[div_id][tag]);
    }
  }
}

COMMON_AD.prototype.get_rdb_params = function ( rdb ) {
  var rdb_params = '';

  /** WP: Verify this is an array */
  if ( rdb instanceof Array ) {
    var age_regex = /^(\d+\+*)/;
    rdb_params += whitepages.common.hex2dec( rdb[2] )  ? '/zip_code=' + whitepages.common.hex2dec( rdb[2] )  : '';
    rdb_params += whitepages.common.hex2dec( rdb[5] )  ? '/gn=' + ['','M','F'][whitepages.common.hex2dec( rdb[5] )] : '';
    rdb_params += whitepages.common.hex2dec( rdb[6] )  ? '/us=' + ['', '', 'B', '', 'P'][whitepages.common.hex2dec( rdb[6] )] : '';
    rdb_params += whitepages.common.hex2dec( rdb[11] ) ? '/connspeed=' + whitepages.common.hex2dec( rdb[11] ) : '';
    rdb_params += (age = this.getAgeFromRDBCookie(rdb)) ? '/age=' + age : '';
    rdb_params += rdb[20] ? '/car=' + rdb[20] : '';

    return rdb_params;
  }
  return '';
}
if (typeof(whitepages.ui) == 'undefined') { whitepages.ui = function() {}; }

whitepages.ui.show_div = function(div) {
  $('.shown_div').hide();
  $('#body').unbind();
  fulldiv = '#' + div;
  $('#body').bind('click', function() {
      if ($(fulldiv).css('display') == 'none') {
        $(fulldiv).show();
      } else {
        $(fulldiv).hide();
        $('#body').unbind();
      }
    });
};

whitepages.ui.add_child = function(from, to) {
  var cloned = $(from).clone();
  $(from).removeClass();
  cloned.insertBefore(to);
};

whitepages.ui.listingToSend = function(listing) {
  var content = listing.split('<br />');
  var display = '';
  for ( i=0; i < content.length; i++ ) {
    if (content[i] != '') {
      display += content[i] + "\n";
    }
  }
  $("#message_text").val( display );
};

whitepages.ui.runLoader =  function() {
  var loaderDiv = document.createElement("div");
  loaderDiv.id = "wp_popup_loading";
  $("#wp_popup_inner").append(loaderDiv);
  $("#wp_popup_loading").html('<img src="/common/images/Loader_vertical_ani.gif" />');
};

whitepages.ui.cancelLoader = function() {
  $("#wp_popup_loading").remove();
};

whitepages.ui.createPop = function(caller, content, options) {

  if ($("#wp_popup").length > 0) {
    whitepages.ui.closePopup();
  }

  var outerDiv = document.createElement("div");
  outerDiv.id = "wp_popup";
  outerDiv.className = "standard_box";
  var innerDiv = document.createElement("div");
  innerDiv.id = "wp_popup_inner";
  innerDiv.className = "standard_box_inner";
  var loaderDiv = document.createElement("div");
  loaderDiv.id = "wp_popup_loading";

  document.body.appendChild (outerDiv);
  outerDiv.appendChild (innerDiv);
  innerDiv.appendChild (loaderDiv);

  function addPosition(element) {

    var axis = (options.arrow_position == 'x_axis') ? 'x_axis' : 'y_axis';

    var pos = $(caller).offset();
    var width = $(caller).width();
    var arrow_offset = 0;

    if (options.arrow == 'true' && axis == 'x_axis') {
      arrow_offset = -31;
    }
    else if (options.arrow == 'true') {
      arrow_offset = 44;
    }

    if (document.getElementById && !document.all) { //FF
      var scrollOffset  = window.pageYOffset;
      var scrollXOffset = window.pageXOffset;
      var browserWidth  = window.innerWidth;
      var browserHeight = window.innerHeight;
    } else { //IE
      var scrollOffset  = document.documentElement.scrollTop;
      var scrollXOffset = document.documentElement.scrollLeft;
      var browserWidth  = document.documentElement.offsetWidth;
      var browserHeight = document.documentElement.offsetHeight;
    }
    var boxHeight = $("#wp_popup").height() + 12; // 12px is for border of wp_popup
    var boxWidth = $("#wp_popup").width() + 12 + arrow_offset // 12px is for border of wp_popup

      if (options.position == 'caller') {
        var visHeight = pos.top - scrollOffset;
        var visWidth = pos.left - scrollXOffset;
        var boxHeight = $("#wp_popup").height();
        var boxWidth = $("#wp_popup").width();
        var boxLeft = axis == 'x_axis' ? pos.left -38  : pos.left + width + 20;
        var adjustment = 0;

        if (axis == 'x_axis') {
          if (visWidth > boxWidth) {
            var boxTop  = pos.top - boxHeight -52;
            var pointer = 'left';
            adjustment = -44;
          }
        }
        else {

          if (element == 'loader') {
            if (visHeight > boxHeight) {
              var boxTop = pos.top - 150;
              var pointer = 'down';
              var adjustment = -40;
            } else {
              var boxTop = pos.top;
              var pointer = 'up';
              var adjustment = '';
            }
          } else if (visHeight > boxHeight) {
            var boxTop    = pos.top - boxHeight;
            var pointer = 'down';
            adjustment = -40;
          } else if (visHeight < (boxHeight/2)) {
            var boxTop = pos.top;
            var pointer = 'up';
            adjustment = '';
          } else {
            visHeight += visHeight < 0 ? 15 : 0;
            var boxTop = (boxHeight/2) + scrollOffset;
            var pointer = 'up';
            adjustment = '';
          }
        }
        var arrow_top = pos.top - boxTop + adjustment;
      } else if (options.position == 'coords') {
        var boxLeft = options.staticLeft;
        var boxTop  = options.staticTop;
        var pointer = 'down';
        var arrow_top = 0;
      } else {
        var boxLeft = (browserWidth - boxWidth)/2;
        var boxTop  = (browserHeight - boxHeight)/2 + scrollOffset;
        var pointer = 'down';
        var arrow_top = 0;
        if (options.centerReference) { // if you don't want it centered on the page, but relative to an element;
          var element_pos    = $(options.centerReference).offset();
          var element_width  = $(options.centerReference).width();
          var boxLeft     = (element_width - boxWidth)/2 + element_pos.left;
        }
      }

    $("#wp_popup").css( { "left": boxLeft + "px", "top": boxTop + "px" } );
    addArrow(arrow_top, pointer, arrow_offset);
    addClose();
  }
  function addArrow(arrow_top, pointer, arrow_offset) {
    if (options.arrow == 'true') {
      var arrowDiv = document.createElement("div");
      arrowDiv.id = "arrow";
      $('#wp_popup').prepend(arrowDiv);
      $('#arrow').css( { "left": -(arrow_offset) + "px", "top": arrow_top + "px" } );
      $('#wp_popup').css( { "margin-left": "37px" } );
      $('#arrow').html("<img src='/common/images/forms/nimbleWindow_" + pointer + ".gif' />");
    }
  }

  function addClose() {
		if (options.close == 'true') {
      var closeDiv = document.createElement("div");
      closeDiv.id = "close_wp_popup";
			closeDiv.innerHTML = "close";
      closeDiv.onclick = function() { javascript:whitepages.ui.closePopup(); }
      $('#wp_popup').prepend(closeDiv);
      $('#close_wp_popup').html("close");
    }
  }

  function runLoader() {
    $("#wp_popup_loading").html('<img src="/common/images/Loader_vertical_ani.gif" />');
    addPosition('loader');
  }

  function cancelLoader() {
    $("#wp_popup_loading").remove();
    $("#arrow").remove();
  }

  runLoader();
  if (options.type == 'ajax') { // content MUST be the location of the file to load.
    $("#wp_popup_inner").load(content, function() {
        cancelLoader();
        addPosition('popup');
        if (options.details) {
          options.details();
        }
      });
  } else if (options.type == 'inline') { // content MUST be a class or id that exists on the page.
    cancelLoader();
    var contents = document.createElement("div");
    contents.id = "popup_content";
    innerDiv.appendChild (contents);
    content = $(content).html();
    $("#popup_content").html(content);
    cancelLoader();
    addPosition('popup');
  } else if (options.type == 'string') { // content WILL be whatever is
    cancelLoader();
    var contents = document.createElement("div");
    contents.id = "popup_content";
    innerDiv.appendChild (contents);
    $("#popup_content").html(content);
    cancelLoader();
    addPosition('popup');
  }
}

whitepages.ui.closePopup = function() {
  if ($('#wp_popup').length > 0) {
	  $("div").remove('#wp_popup');
  } else {
    window.close();
  }
};

/*
 *=== Description
 *	send_message_to_listing is used to send email or sms messages to a listing.
 *	This is to be attached to the submit event of the form element.
 *=== Parameters
 * form_el (DomElementReference): a referance to the form element this method is attached to.
 *
 */
whitepages.ui.send_message_to_listing = function(form_el){
  var action_path = $(form_el).attr('action');
  var q_params = $(form_el).serialize(); /* this will create a name/value query string from the input elements in the form */
  $(form_el).find(':input').attr('disabled','disabled')
  $.post(action_path + "?" + q_params,'', function(data){
      $(".contact_cl_popup_content").replaceWith(data)
        });

};

/*
 *=== Description
 *	Toggle the sign_in_panel and pass url params to the iframe
 *
 *=== Parameters
 * el_id (string): the id of the login panel
 * signin_url (string): url of signin
 */
whitepages.ui.open_sign_in = function(el_id, signin_url)
{
  whitepages.ui.sign_in_panel = $('#' + el_id);
  whitepages.ui.sign_in_panel.iframe = $('#' + el_id + ' iframe');

  whitepages.ui.sign_in_panel.iframe.css('visibility','hidden');
  $("#loading_el").css('display','block');

  whitepages.ui.sign_in_panel.iframe.attr('src', signin_url);
  whitepages.ui.sign_in_panel.iframe.load(function(){
      $("#loading_el").css('display','none');
      whitepages.ui.sign_in_panel.iframe.css('visibility','visible');
    });

  whitepages.ui.sign_in_panel.toggle();
};


/*
 *=== Description
 *	Toggle the sign_in_panel
 *
 *=== Parameters
 * el_id (string): the id of the login panel
 */
whitepages.ui.toggle_sign_in = function(el_id)
{
  whitepages.ui.sign_in_panel = $('#' + el_id);
  whitepages.ui.sign_in_panel.iframe = $('#' + el_id + ' iframe');
  whitepages.ui.sign_in_panel.toggle();
};


whitepages.ui.char_remaining = function(total, field) {
  if (document.getElementById(field)) {
    var sig = document.getElementById(field).value;
    var char_left = $("#char_count").html(); // the input-field, where the chars left will be shown

    if(sig.length > total) {
      var x = sig.substring(0, total);
      document.getElementById(field).value = x;
      char_left = 0;
      setTimeout("whitepages.ui.char_remaining('" + total + "', '" + field + "')",100);
    } else {
      $("#char_count").text( total - sig.length );
      setTimeout("whitepages.ui.char_remaining('" + total + "', '" + field + "')",100);
    }

    if (document.getElementById('char_count')) {
      if (char_left > 0) {
        $("#char_count").css( "color", "#7d6a55" );
        $("#red_alert").css( "color", "#7d6a55" );
      } else {
        $("#char_count").css( "color", "red" );
        $("#red_alert").css( "color", "red" );
      }
    }
  }
};

whitepages.ui.validateSelect = function(input_field, error_field) {
  var error = '';
  var errFld = $(error_field);
  var inpFld = $(input_field);

  if (input_field.value == '') {
    inpFld.addClass('input_error_border');
    errFld.addClass('error_on');
    errFld.html("This is required.");
    error = 'true';
  } else {
    inpFld.removeClass('input_error_border');
    errFld.removeClass('error_on');
    errFld.html("");
    error = ''
  }
  return error;
};

whitepages.ui.validatePhone = function(input_field, error_field) {
  var error = '';
  var errFld = $(error_field);
  var inpFld = $(input_field);
  var stripped = input_field.value.replace(/[\(\)\.\-\ ]/g, '');

  if (input_field.value == '') {
    inpFld.addClass('input_error_border');
    errFld.addClass('error_on');
    errFld.html("This is required.");
    error = 'true';
  } else if (stripped.match(/^0/)) {
    inpFld.addClass('input_error_border');
    errFld.addClass('error_on');
    errFld.html("This looks like an international number - US only please.");
    error = 'true';
  } else if (!(stripped.length == 10) || isNaN(parseInt(stripped))) {
    inpFld.addClass('input_error_border');
    errFld.addClass('error_on');
    errFld.html("Cell numbers must contain 10 digits.");
    error = 'true';
  } else {
    inpFld.removeClass('input_error_border');
    errFld.removeClass('error_on');
    errFld.html("");
    error = '';
  }
  return error;
};


whitepages.ui.validateName= function(input_field, error_field) {
  var error = '';
  var errFld = $(error_field);
  var inpFld = $(input_field);

  if (input_field.value == '') {
    inpFld.addClass('input_error_border');
    errFld.addClass('error_on');
    errFld.html("This is required.");
    error = 'true';
  } else {
    inpFld.removeClass('input_error_border');
    errFld.removeClass('error_on');
    errFld.html("");
    error = ''
  }
  return error;
};

whitepages.ui.validateEmail = function(input_field, error_field) {
  var error = '';
  var errFld = $(error_field);
  var inpFld = $(input_field);
  var emailFilter = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;

  if (input_field.value == '') {
    inpFld.addClass('input_error_border');
    errFld.addClass('error_on');
    errFld.html("This is required.");
    error = 'true';
  } else if (emailFilter.test(input_field.value) != true) {
    inpFld.addClass('input_error_border');
    errFld.addClass('error_on');
    errFld.html("Email addresses must be formatted like this: name@place.abc.");
    error = 'true';
  } else {
    inpFld.removeClass('input_error_border');
    errFld.removeClass('error_on');
    errFld.html("");
    error = ''
  }
  return error;
};

whitepages.ui.validateText = function(input_field, error_field) {
  var error = '';
  var errFld = $(error_field);
  var inpFld = $(input_field);
  var stripped = input_field.value.replace(/[\s+][\n+][\r+]/g, '');
  if (stripped == '') {
    inpFld.addClass('input_error_border');
    $('#innerTextArea').addClass('text_error');
    errFld.addClass('error_on');
    errFld.html("This is required.");
    if ($('#scroll_cover')) {
      $('#scroll_cover').addClass('scroll_cover_error');
    }
    error = 'true';
  } else {
    inpFld.removeClass('input_error_border');
    $('#innerTextArea').removeClass('text_error');
    errFld.removeClass('error_on');
    errFld.html('');
    if ($('#scroll_cover')) {
      $("#scroll_cover").removeClass('scroll_cover_error');
    }
    error = '';
  }
  return error;
};

whitepages.ui.close_claim_example = function() {
  if ($('#claim_example_listing').css('display', 'block')) {
		$('#claim_example_listing').css('display','none')
	}
	return true;
};

whitepages.results = function() {};
whitepages.results.page_done = false;
whitepages.results.events_attached = 0;

whitepages.results.attach_hover = function() {
  var result_set = $('div.result');
  if (result_set.length <= whitepages.results.events_attached || whitepages.events_attached < 10) {
    setTimeout(whitepages.results.attach_hover, 50);
    return;
  }
  result_set.hover(
    function () {
      $(this).addClass('highlighted');
    },
    function () {
      $(this).removeClass('highlighted');
    }
  );
  whitepages.results.events_attached = result_set.length;
  if (whitepages.events_attached < 10 && !whitepages.results.page_done) setTimeout(whitepages.results.attach_hover, 50);
};
whitepages.results.attach_hover(); // Begin polling.
$(document).ready(function() { whitepages.results.page_done = true; }); // Inform redundancy that everything is done.

$(window).bind("load", function() {
    var divh = $('#wpn_ad_content_right_rail').length > 0 ? document.getElementById('wpn_ad_content_right_rail').offsetHeight : '500';
    if (divh < 305) {
      var rand = (Math.random().toString()).substring(2,11);
      var pageid = (Math.random().toString()).substring(2,11);
      var ad_call = whitepages.page.data.ad_server  +'/hserver/random=' + rand + '/pageid=' + pageid + '/AAMSZ=right_rail2' + rsi_data + '/site=' + whitepages.page.data.admin_site_name  + '/area=' + whitepages.page.data.atlas_page_name;
      $('#second_ad').html('<iframe src="' + ad_call + '" scrolling="no" hspace="0" vspace="0" frameborder="0" marginheight="0" marginwidth="0" width="300" height=250" allowtransparency="true" test="test"></iframe>');
    }
  });

whitepages.results.listingToSend = function(listing) {
  var content = listing.split('<br />');
  var display = '';
  for ( i=0; i < content.length; i++ ) {
    if (content[i] != '') {
      display += content[i] + "\n";
    }
  }
  $("#message_text").val( display );
}

whitepages.results.validateListingToSend = function(myForm) {
  var errors = '';

  if (myForm.to_phone) {
	  errors += whitepages.ui.validatePhone(myForm.to_phone, '#to_error_message');
	  errors += whitepages.ui.validatePhone(myForm.from_phone, '#from_error_message');
  } else {
	  errors += whitepages.ui.validateEmail(myForm.to_cell, '#to_error_message');
	  errors += whitepages.ui.validateEmail(myForm.from_cell, '#from_error_message');
  }
  errors += whitepages.ui.validateText(myForm.message_text, '#text_error_message');

  if (errors != '') {
    return false;
  }
  return true;
}

whitepages.results.sendListing = function(type, send_listing_url, thank_you_url) {
  var send = document.getElementById('send');
  var to_cell   = send.to_phone.value;
  var from_cell = send.from_phone.value;
  var message   = escape( send.message_text.value.replace(/\n/g,"\r\n") );

  var h = $("#sendListingDiv").height();
  var w = $("#sendListingDiv").width();

  $("#sendListingDiv").empty();
  whitepages.ui.runLoader();
  $("#wp_popup_loading").height(h).width(w);

  $("#wp_popup_inner").load(thank_you_url, '', function() {
    $("#listing_type").html( type );
    var url_and_data = send_listing_url.split('?');
    $.ajax({
      type: "GET",
      url: url_and_data[0],
      data: "to=" + to_cell + "&from=" + from_cell + "&message=" + message + url_and_data[1]
      });
  });
}

whitepages.results.loadHalfRect = function(adserver) {
  var rand = (Math.random().toString()).substring(2,11);
  var pageid = (Math.random().toString()).substring(2,11);
  var ad_call = adserver + '/hserver/random=' + rand + '/pageid=' + pageid + '/AAMSZ=half_rect' + rsi_data + '/site=WEBLAB';
  $('#send_listing_thanks_ad').html('<iframe src="' + ad_call + '" scrolling="no" hspace="0" vspace="0" frameborder="0" marginheight="0" marginwidth="0" width="300" height="100" allowtransparency="true" test="test"></iframe>');
}
/** WP
 * Omniture helper JavaScript.
 */

/** WP
 * If you change this file you must edit:
 *  wpn/templates/common/includes/omniture.xslt
 * and change:
 *  <script type="text/javascript" src="/static/common/omniture.js?v=1.0"></script>
 * to increment the version number.  This will make sure that your changes
 * are actually loaded.
 */

var omni_link_filters = [
	'javascript:',
	'address.com', 'phonenumber.com', 'whitepages.ca', 'whitepages411.com'
].join(',') + ',411.com/' + [
	2321, 5138, 5153, 10002, 10668, 10786, 10789, 10815, 14874, 14957
].join(',411.com/') + ',whitepages.com/' + [
	2321, 5138, 5153, 9900, 9901, 10001, 10002, 10583, 10592, 10668, 10786, 10789, 10815, 14867, 14874, 14957
].join(',whitepages.com/');

var omni_wpn_refer    = null;

function omni_refer (referer) {
	/** WP: Updated domain list logic: */
	omni_wpn_refer = referer;

	var wp_match = omni_wpn_refer.match(/^https?\:\/\/.*\.(\w+\.\w+)(?::[0-9]+)?(?:\/([0-9]+)\b)?/);

	if (wp_match != null) {
		if (wp_match[1] == 'whitepages.com') {
			if (wp_match[2] == null) {
				omni_wpn_refer = null;
			} else if (wp_match[2].match(/^(?:2321|5138|5153|9900|9901|10001|10002|10583|10592|10668|10786|10789|10815|14867|14874|14957)$/)) {
				omni_wpn_refer = null;
			}
		} else if (wp_match[1] == '411.com') {
			if (wp_match[2] == null) {
				omni_wpn_refer = null;
			} else if (wp_match[2].match(/^(?:2321|5138|5153|10668|10002|10786|10789|10815|14874|14957)$/)) {
				omni_wpn_refer = null;
			}
		} else if (wp_match[1] == 'whitepages.ca') {
			omni_wpn_refer = null;
		} else if (wp_match[1].match(/^(?:address|phonenumber|whitepages411)\.com$/)) {
			omni_wpn_refer = null;
		}
	}
}

function omni_settings (pagename, server, channel, pagetype, section, validity, events) {
	if (server == ''){ server = 'No server set'};

	s_wpn.pageName = pagename;
	s_wpn.server   = server;
	s_wpn.channel  = channel;
	s_wpn.pageType = pagetype;
	s_wpn.prop1    = section;
	s_wpn.prop2    = validity;
	s_wpn.prop3    = s_wpn.prop2  + ':' + s_wpn.pageName;
	s_wpn.prop4    = s_wpn.server + ':' + s_wpn.pageName;
	s_wpn.prop5    = (omni_wpn_refer ? (omni_wpn_refer + ':') : '') + s_wpn.pageName;
	s_wpn.hier1    = s_wpn.channel + '|' + s_wpn.prop1;
	s_wpn.eVar3    = s_wpn.server;
	s_wpn.eVar4    = s_wpn.eVar3;

	if(s_wpn.prop2 == 'Valid'){
		if(events && events.indexOf(',') > -1){
			s_wpn.events = events;
		}else{
			s_wpn.events = 'event4';
		}
	}

	s_wpn.linkTrackVars = "eVar3,eVar4"; /** WP: per aHill 2006-10-09 */
}


var omni_debug_fields = "pageName,channel,server,pageType,prop1,prop2,prop3,prop4,prop5,hier1,eVar3,eVar4,events";

function omni_debugging ( ) {
	var show = document.getElementById('omni_debug');

	if (show) {
		var field = omni_debug_fields.split(',');
		var stuff = '<table><tr><th style="font-weight:bold">Omniture:</th></tr>'
				  + '<tr><td style="text-align:right">account:</td><td>&nbsp;</td><td style="text-align:left"><tt>'
				  +  omni_wpn_account
				  +  '</tt></td></tr>';

		for (var i = 0; i < field.length; i++) {
			stuff += '<tr><td style="text-align:right">'
			      +     field[i]
			      + ':</td><td>&nbsp;</td><td style="text-align:left"><tt>'
			      +     s_wpn[field[i]]
			      + '</tt></td></tr>';
		}

		stuff += '</table>';

		show.innerHTML     = stuff;
	}
}

function omni_execute ( ) {
	try {
		var s_wpn_code = s_wpn.t();

		if (s_wpn_code)
			document.write( s_wpn_code )
	}
	catch (err) {
	}
}
/** WP
 * SiteCatalyst code version: H.9.
 * Copyright 1997-2007 Omniture, Inc. More info available at
 * http://www.omniture.com
 */

/** WP
 * If you change this file you must edit:
 *  wpn/templates/common/includes/omniture.xslt
 * and change:
 *  <script type="text/javascript" src="/static/common/s_wpn_code.js?v=1.0"></script>
 * to increment the version number.  This will make sure that your changes
 * are actually loaded.
 */

/** WP: Specify the Report Suite ID to track here */
var s_wpn=s_gi(omni_wpn_account); /** WP: set globally elsewhere */

/** WP
 * ************************ CONFIG SECTION **************************
 * You may add or alter any code config here.
 */

s_wpn.charSet="US-ASCII";
s_wpn.currencyCode="USD";

/** WP: Link Tracking Config */
s_wpn.trackDownloadLinks    = true;
s_wpn.trackExternalLinks    = false;
s_wpn.trackInlineStats      = true;
s_wpn.linkDownloadFileTypes = "exe,zip,wav,mp3,mov,mpg,avi,wmv,doc,pdf,xls";
s_wpn.linkInternalFilters   = omni_link_filters;	/** WP: set globally elsewhere */
s_wpn.linkLeaveQueryString  = false;
s_wpn.linkTrackVars         = "None";
s_wpn.linkTrackEvents       = "None";

/** WP: Form Analysis (Omniture Phase II) */
s_wpn.formList              = ""; 		/** WP: never mind because... */
s_wpn.trackFormList         = false; 	/** WP: ...all forms */
s_wpn.trackPageName         = true;
s_wpn.useCommerce           = true; 		/** WP: Func Spec */
s_wpn.varUsed               = "eVar5"; 	/** WP: to match setup for form analysis */
/** WP: abandonment turned off
s_wpn.eventList             = "event1";	*/ /** abandonment only specified in Func Spec */

/** WP
 * WARNING: Changing any of the below variables will cause drastic
 * changes to how your visitor data is collected.  Changes should only be
 * made when instructed to do so by your account manager.
 */

s_wpn.visitorNamespace      = "whitepages";
s_wpn.trackingServer        = "metrics.whitepages.com";
s_wpn.trackingServerSecure  = "smetrics.whitepages.com";
s_wpn.dc                    = 112;

/** WP
 * ************************ PLUGINS SECTION ************************
 * You may insert any plugins you wish to use here.
 * ************************ PLUGINS SECTION ************************
 */

function s_wpn_doPlugins (s_wpn) {
	/** WP: Add calls to plugins here... */
	/** WP:  form abandonment turned off
	s_wpn.setupFormAnalysis();
	*/
	/* External Campaign Tracking */
	s_wpn.campaign=s_wpn.getQueryParam('s_cid');
}

s_wpn.doPlugins             = s_wpn_doPlugins;
s_wpn.usePlugins            = true;

/** WP
 * Plugin: getQueryParam 2.0 - return query string parameter(s)
 */

s_wpn.getQueryParam=new Function("p","d","u",""
+"var s=this,v='',i,t;d=d?d:'';u=u?u:(s.pageURL?s.pageURL:''+s.wd.loc"
+"ation);u=u=='f'?''+s.gtfs().location:u;while(p){i=p.indexOf(',');i="
+"i<0?p.length:i;t=s.p_gpv(p.substring(0,i),u);if(t)v+=v?d+t:t;p=p.su"
+"bstring(i==p.length?i:i+1)}return v");
s_wpn.p_gpv=new Function("k","u",""
+"var s=this,v='',i=u.indexOf('?'),q;if(k&&i>-1){q=u.substring(i+1);v"
+"=s.pt(q,'&','p_gvf',k)}return v");
s_wpn.p_gvf=new Function("t","k",""
+"if(t){var s=this,i=t.indexOf('='),p=i<0?t:t.substring(0,i),v=i<0?'T"
+"rue':t.substring(i+1);if(p.toLowerCase()==k.toLowerCase())return s."
+"epa(v)}return ''");

/** WP
 * Plugin: Form Analysis 2.0 (Success, Error, Abandonment)
 */
/* * WP turned off
s_wpn.setupFormAnalysis=new Function(""
+"var s=this;if(!s.fa){s.fa=new Object;var f=s.fa;f.ol=s.wd.onload;s."
+"wd.onload=s.faol;f.uc=s.useCommerce;f.vu=s.varUsed;f.vl=f.uc?s.even"
+"tList:'';f.tfl=s.trackFormList;f.fl=s.formList;f.va=new Array('',''"
+",'','')}");
s_wpn.sendFormEvent=new Function("t","pn","fn","en",""
+"var s=this,f=s.fa;t=t=='s'?t:'e';f.va[0]=pn;f.va[1]=fn;f.va[3]=t=='"
+"s'?'Success':en;s.fasl(t);f.va[1]='';f.va[3]='';");
s_wpn.faol=new Function("e",""
+"var s=s_c_il["+s_wpn._in+"],f=s.fa,r=true,fo,fn,i,en,t,tf;if(!e)e=s.wd."
+"event;f.os=new Array;if(f.ol)r=f.ol(e);if(s.d.forms&&s.d.forms.leng"
+"th>0){for(i=s.d.forms.length-1;i>=0;i--){fo=s.d.forms[i];fn=fo.name"
+";tf=f.tfl&&s.pt(f.fl,',','ee',fn)||!f.tfl&&!s.pt(f.fl,',','ee',fn);"
+"if(tf){f.os[fn]=fo.onsubmit;fo.onsubmit=s.faos;f.va[1]=fn;f.va[3]='"
+"No Data Entered';for(en=0;en<fo.elements.length;en++){el=fo.element"
+"s[en];t=el.type;if(t&&t.toUpperCase){t=t.toUpperCase();var md=el.on"
+"mousedown,kd=el.onkeydown,omd=md?md.toString():'',okd=kd?kd.toStrin"
+"g():'';if(omd.indexOf('.fam(')<0&&okd.indexOf('.fam(')<0){el.s_famd"
+"=md;el.s_fakd=kd;el.onmousedown=s.fam;el.onkeydown=s.fam}}}}}f.ul=s"
+".wd.onunload;s.wd.onunload=s.fasl;}return r;");
s_wpn.faos=new Function("e",""
+"var s=s_c_il["+s_wpn._in+"],f=s.fa,su;if(!e)e=s.wd.event;if(f.vu){s[f.v"
+"u]='';f.va[1]='';f.va[3]='';}su=f.os[this.name];return su?su(e):tru"
+"e;");
s_wpn.fasl=new Function("e",""
+"var s=s_c_il["+s_wpn._in+"],f=s.fa,a=f.va,l=s.wd.location,ip=s.trackPag"
+"eName,p=s.pageName;if(a[1]!=''&&a[3]!=''){a[0]=!p&&ip?l.host+l.path"
+"name:a[0]?a[0]:p;if(!f.uc&&a[3]!='No Data Entered'){if(e=='e')a[2]="
+"'Error';else if(e=='s')a[2]='Success';else a[2]='Abandon'}else a[2]"
+"='';var tp=ip?a[0]+':':'',t3=e!='s'?':('+a[3]+')':'',ym=!f.uc&&a[3]"
+"!='No Data Entered'?tp+a[1]+':'+a[2]+t3:tp+a[1]+t3,ltv=s.linkTrackV"
+"ars,lte=s.linkTrackEvents,up=s.usePlugins;if(f.uc){s.linkTrackVars="
+"ltv=='None'?f.vu+',events':ltv+',events,'+f.vu;s.linkTrackEvents=lt"
+"e=='None'?f.vl:lte+','+f.vl;f.cnt=-1;if(e=='e')s.events=s.pt(f.vl,'"
+",','fage',2);else if(e=='s')s.events=s.pt(f.vl,',','fage',1);else s"
+".events=s.pt(f.vl,',','fage',0)}else{s.linkTrackVars=ltv=='None'?f."
+"vu:ltv+','+f.vu}s[f.vu]=ym;s.usePlugins=false;s.tl(true,'o','Form A"
+"nalysis');s[f.vu]='';s.usePlugins=up}return f.ul&&e!='e'&&e!='s'?f."
+"ul(e):true;");
s_wpn.fam=new Function("e",""
+"var s=s_c_il["+s_wpn._in+"],f=s.fa;if(!e) e=s.wd.event;var o=s.trackLas"
+"tChanged,et=e.type.toUpperCase(),t=this.type.toUpperCase(),fn=this."
+"form.name,en=this.name,sc=false;if(document.layers){kp=e.which;b=e."
+"which}else{kp=e.keyCode;b=e.button}et=et=='MOUSEDOWN'?1:et=='KEYDOW"
+"N'?2:et;if(f.ce!=en||f.cf!=fn){if(et==1&&b!=2&&'BUTTONSUBMITRESETIM"
+"AGERADIOCHECKBOXSELECT-ONEFILE'.indexOf(t)>-1){f.va[1]=fn;f.va[3]=e"
+"n;sc=true}else if(et==1&&b==2&&'TEXTAREAPASSWORDFILE'.indexOf(t)>-1"
+"){f.va[1]=fn;f.va[3]=en;sc=true}else if(et==2&&kp!=9&&kp!=13){f.va["
+"1]=fn;f.va[3]=en;sc=true}if(sc){nface=en;nfacf=fn}}if(et==1&&this.s"
+"_famd)return this.s_famd(e);if(et==2&&this.s_fakd)return this.s_fak"
+"d(e);");
s_wpn.ee=new Function("e","n",""
+"return n&&n.toLowerCase?e.toLowerCase()==n.toLowerCase():false;");
s_wpn.fage=new Function("e","a",""
+"var s=this,f=s.fa,x=f.cnt;x=x?x+1:1;f.cnt=x;return x==a?e:'';");

*/

var s_objectID;function s_c2fe(f){var x='',s=0,e,a,b,c;while(1){e=
f.indexOf('"',s);b=f.indexOf('\\',s);c=f.indexOf("\n",s);if(e<0||(b>=
0&&b<e))e=b;if(e<0||(c>=0&&c<e))e=c;if(e>=0){x+=(e>s?f.substring(s,e):
'')+(e==c?'\\n':'\\'+f.substring(e,e+1));s=e+1}else return x
+f.substring(s)}return f}function s_c2fa(f){var s=f.indexOf('(')+1,e=
f.indexOf(')'),a='',c;while(s>=0&&s<e){c=f.substring(s,s+1);if(c==',')
a+='","';else if(("\n\r\t ").indexOf(c)<0)a+=c;s++}return a?'"'+a+'"':
a}function s_c2f(cc){cc=''+cc;var fc='var f=new Function(',s=
cc.indexOf(';',cc.indexOf('{')),e=cc.lastIndexOf('}'),o,a,d,q,c,f,h,x
fc+=s_c2fa(cc)+',"var s=new Object;';c=cc.substring(s+1,e);s=
c.indexOf('function');while(s>=0){d=1;q='';x=0;f=c.substring(s);a=
s_c2fa(f);e=o=c.indexOf('{',s);e++;while(d>0){h=c.substring(e,e+1);if(
q){if(h==q&&!x)q='';if(h=='\\')x=x?0:1;else x=0}else{if(h=='"'||h=="'"
)q=h;if(h=='{')d++;if(h=='}')d--}if(d>0)e++}c=c.substring(0,s)
+'new Function('+(a?a+',':'')+'"'+s_c2fe(c.substring(o+1,e))+'")'
+c.substring(e+1);s=c.indexOf('function')}fc+=s_c2fe(c)+';return s");'
eval(fc);return f}function s_gi(un,pg,ss){var c="function s_c(un,pg,s"
+"s){var s=this;s.wd=window;if(!s.wd.s_c_in){s.wd.s_c_il=new Array;s."
+"wd.s_c_in=0;}s._il=s.wd.s_c_il;s._in=s.wd.s_c_in;s._il[s._in]=s;s.w"
+"d.s_c_in++;s.m=function(m){return (''+m).indexOf('{')<0};s.fl=funct"
+"ion(x,l){return x?(''+x).substring(0,l):x};s.co=function(o){if(!o)r"
+"eturn o;var n=new Object,x;for(x in o)if(x.indexOf('select')<0&&x.i"
+"ndexOf('filter')<0)n[x]=o[x];return n};s.num=function(x){x=''+x;for"
+"(var p=0;p<x.length;p++)if(('0123456789').indexOf(x.substring(p,p+1"
+"))<0)return 0;return 1};s.rep=function(x,o,n){var i=x.indexOf(o);wh"
+"ile(x&&i>=0){x=x.substring(0,i)+n+x.substring(i+o.length);i=x.index"
+"Of(o,i+n.length)}return x};s.ape=function(x){var s=this,i;x=x?s.rep"
+"(escape(''+x),'+','%2B'):x;if(x&&s.charSet&&s.em==1&&x.indexOf('%u'"
+")<0&&x.indexOf('%U')<0){i=x.indexOf('%');while(i>=0){i++;if(('89ABC"
+"DEFabcdef').indexOf(x.substring(i,i+1))>=0)return x.substring(0,i)+"
+"'u00'+x.substring(i);i=x.indexOf('%',i)}}return x};s.epa=function(x"
+"){var s=this;return x?unescape(s.rep(''+x,'+',' ')):x};s.pt=functio"
+"n(x,d,f,a){var s=this,t=x,z=0,y,r;while(t){y=t.indexOf(d);y=y<0?t.l"
+"ength:y;t=t.substring(0,y);r=s.m(f)?s[f](t,a):f(t,a);if(r)return r;"
+"z+=y+d.length;t=x.substring(z,x.length);t=z<x.length?t:''}return ''"
+"};s.isf=function(t,a){var c=a.indexOf(':');if(c>=0)a=a.substring(0,"
+"c);if(t.substring(0,2)=='s_')t=t.substring(2);return (t!=''&&t==a)}"
+";s.fsf=function(t,a){var s=this;if(s.pt(a,',','isf',t))s.fsg+=(s.fs"
+"g!=''?',':'')+t;return 0};s.fs=function(x,f){var s=this;s.fsg='';s."
+"pt(x,',','fsf',f);return s.fsg};s.c_d='';s.c_gdf=function(t,a){var "
+"s=this;if(!s.num(t))return 1;return 0};s.c_gd=function(){var s=this"
+",d=s.wd.location.hostname,n=s.fpCookieDomainPeriods,p;if(!n)n=s.coo"
+"kieDomainPeriods;if(d&&!s.c_d){n=n?parseInt(n):2;n=n>2?n:2;p=d.last"
+"IndexOf('.');if(p>=0){while(p>=0&&n>1){p=d.lastIndexOf('.',p-1);n--"
+"}s.c_d=p>0&&s.pt(d,'.','c_gdf',0)?d.substring(p):d}}return s.c_d};s"
+".c_r=function(k){var s=this;k=s.ape(k);var c=' '+s.d.cookie,i=c.ind"
+"exOf(' '+k+'='),e=i<0?i:c.indexOf(';',i),v=i<0?'':s.epa(c.substring"
+"(i+2+k.length,e<0?c.length:e));return v!='[[B]]'?v:''};s.c_w=functi"
+"on(k,v,e){var s=this,d=s.c_gd(),l=s.cookieLifetime,t;v=''+v;l=l?(''"
+"+l).toUpperCase():'';if(e&&l!='SESSION'&&l!='NONE'){t=(v!=''?parseI"
+"nt(l?l:0):-60);if(t){e=new Date;e.setTime(e.getTime()+(t*1000))}}if"
+"(k&&l!='NONE'){s.d.cookie=k+'='+s.ape(v!=''?v:'[[B]]')+'; path=/;'+"
+"(e&&l!='SESSION'?' expires='+e.toGMTString()+';':'')+(d?' domain='+"
+"d+';':'');return s.c_r(k)==v}return 0};s.eh=function(o,e,r,f){var s"
+"=this,b='s_'+e+'_'+s._in,n=-1,l,i,x;if(!s.ehl)s.ehl=new Array;l=s.e"
+"hl;for(i=0;i<l.length&&n<0;i++){if(l[i].o==o&&l[i].e==e)n=i}if(n<0)"
+"{n=i;l[n]=new Object}x=l[n];x.o=o;x.e=e;f=r?x.b:f;if(r||f){x.b=r?0:"
+"o[e];x.o[e]=f}if(x.b){x.o[b]=x.b;return b}return 0};s.cet=function("
+"f,a,t,o,b){var s=this,r;if(s.apv>=5&&(!s.isopera||s.apv>=7))eval('t"
+"ry{r=s.m(f)?s[f](a):f(a)}catch(e){r=s.m(t)?s[t](e):t(e)}');else{if("
+"s.ismac&&s.u.indexOf('MSIE 4')>=0)r=s.m(b)?s[b](a):b(a);else{s.eh(s"
+".wd,'onerror',0,o);r=s.m(f)?s[f](a):f(a);s.eh(s.wd,'onerror',1)}}re"
+"turn r};s.gtfset=function(e){var s=this;return s.tfs};s.gtfsoe=new "
+"Function('e','var s=s_c_il['+s._in+'];s.eh(window,\"onerror\",1);s."
+"etfs=1;var c=s.t();if(c)s.d.write(c);s.etfs=0;return true');s.gtfsf"
+"b=function(a){return window};s.gtfsf=function(w){var s=this,p=w.par"
+"ent,l=w.location;s.tfs=w;if(p&&p.location!=l&&p.location.host==l.ho"
+"st){s.tfs=p;return s.gtfsf(s.tfs)}return s.tfs};s.gtfs=function(){v"
+"ar s=this;if(!s.tfs){s.tfs=s.wd;if(!s.etfs)s.tfs=s.cet('gtfsf',s.tf"
+"s,'gtfset',s.gtfsoe,'gtfsfb')}return s.tfs};s.ca=function(){var s=t"
+"his,imn='s_i_'+s.fun;if(s.d.images&&s.apv>=3&&(!s.isopera||s.apv>=7"
+")&&(s.ns6<0||s.apv>=6.1)){s.ios=1;if(!s.d.images[imn]&&(!s.isns||(s"
+".apv<4||s.apv>=5))){s.d.write('<im'+'g name=\"'+imn+'\" height=1 wi"
+"dth=1 border=0 alt=\"\">');if(!s.d.images[imn])s.ios=0}}};s.mr=func"
+"tion(sess,q,ta){var s=this,dc=s.dc,t1=s.trackingServer,t2=s.trackin"
+"gServerSecure,ns=s.visitorNamespace,unc=s.rep(s.fun,'_','-'),imn='s"
+"_i_'+s.fun,im,b,e,rs='http'+(s.ssl?'s':'')+'://'+(t1?(s.ssl&&t2?t2:"
+"t1):((ns?ns:(s.ssl?'102':unc))+'.'+(s.dc?s.dc:112)+'.2o7.net'))+'/b"
+"/ss/'+s.un+'/1/H.9-Pdvu-2/'+sess+'?[AQB]&ndh=1'+(q?q:'')+(s.q?s.q:'"
+"')+'&[AQE]';if(s.isie&&!s.ismac){if(s.apv>5.5)rs=s.fl(rs,4095);else"
+" rs=s.fl(rs,2047)}if(s.ios||s.ss){if (!s.ss)s.ca();im=s.wd[imn]?s.w"
+"d[imn]:s.d.images[imn];if(!im)im=s.wd[imn]=new Image;im.src=rs;if(r"
+"s.indexOf('&pe=')>=0&&(!ta||ta=='_self'||ta=='_top'||(s.wd.name&&ta"
+"==s.wd.name))){b=e=new Date;while(e.getTime()-b.getTime()<500)e=new"
+" Date}return ''}return '<im'+'g sr'+'c=\"'+rs+'\" width=1 height=1 "
+"border=0 alt=\"\">'};s.gg=function(v){var s=this;return s.wd['s_'+v"
+"]};s.glf=function(t,a){if(t.substring(0,2)=='s_')t=t.substring(2);v"
+"ar s=this,v=s.gg(t);if(v)s[t]=v};s.gl=function(v){var s=this;s.pt(v"
+",',','glf',0)};s.gv=function(v){var s=this;return s['vpm_'+v]?s['vp"
+"v_'+v]:(s[v]?s[v]:'')};s.havf=function(t,a){var s=this,b=t.substrin"
+"g(0,4),x=t.substring(4),n=parseInt(x),k='g_'+t,m='vpm_'+t,q=t,v=s.l"
+"inkTrackVars,e=s.linkTrackEvents;s[k]=s.gv(t);if(s.lnk||s.eo){v=v?v"
+"+','+s.vl_l:'';if(v&&!s.pt(v,',','isf',t))s[k]='';if(t=='events'&&e"
+")s[k]=s.fs(s[k],e)}s[m]=0;if(t=='visitorID')q='vid';else if(t=='pag"
+"eURL')q='g';else if(t=='referrer')q='r';else if(t=='vmk')q='vmt';el"
+"se if(t=='charSet'){q='ce';if(s[k]&&s.em==2)s[k]='UTF-8'}else if(t="
+"='visitorNamespace')q='ns';else if(t=='cookieDomainPeriods')q='cdp'"
+";else if(t=='cookieLifetime')q='cl';else if(t=='variableProvider')q"
+"='vvp';else if(t=='currencyCode')q='cc';else if(t=='channel')q='ch'"
+";else if(t=='campaign')q='v0';else if(s.num(x)) {if(b=='prop')q='c'"
+"+n;else if(b=='eVar')q='v'+n;else if(b=='hier'){q='h'+n;s[k]=s.fl(s"
+"[k],255)}}if(s[k]&&t!='linkName'&&t!='linkType')s.qav+='&'+q+'='+s."
+"ape(s[k]);return ''};s.hav=function(){var s=this;s.qav='';s.pt(s.vl"
+"_t,',','havf',0);return s.qav};s.lnf=function(t,h){t=t?t.toLowerCas"
+"e():'';h=h?h.toLowerCase():'';var te=t.indexOf('=');if(t&&te>0&&h.i"
+"ndexOf(t.substring(te+1))>=0)return t.substring(0,te);return ''};s."
+"ln=function(h){var s=this,n=s.linkNames;if(n)return s.pt(n,',','lnf"
+"',h);return ''};s.ltdf=function(t,h){t=t?t.toLowerCase():'';h=h?h.t"
+"oLowerCase():'';var qi=h.indexOf('?');h=qi>=0?h.substring(0,qi):h;i"
+"f(t&&h.substring(h.length-(t.length+1))=='.'+t)return 1;return 0};s"
+".ltef=function(t,h){t=t?t.toLowerCase():'';h=h?h.toLowerCase():'';i"
+"f(t&&h.indexOf(t)>=0)return 1;return 0};s.lt=function(h){var s=this"
+",lft=s.linkDownloadFileTypes,lef=s.linkExternalFilters,lif=s.linkIn"
+"ternalFilters;lif=lif?lif:s.wd.location.hostname;h=h.toLowerCase();"
+"if(s.trackDownloadLinks&&lft&&s.pt(lft,',','ltdf',h))return 'd';if("
+"s.trackExternalLinks&&(lef||lif)&&(!lef||s.pt(lef,',','ltef',h))&&("
+"!lif||!s.pt(lif,',','ltef',h)))return 'e';return ''};s.lc=new Funct"
+"ion('e','var s=s_c_il['+s._in+'],b=s.eh(this,\"onclick\");s.lnk=s.c"
+"o(this);s.t();s.lnk=0;if(b)return this[b](e);return true');s.bc=new"
+" Function('e','var s=s_c_il['+s._in+'],f;if(s.d&&s.d.all&&s.d.all.c"
+"ppXYctnr)return;s.eo=e.srcElement?e.srcElement:e.target;eval(\"try{"
+"if(s.eo&&(s.eo.tagName||s.eo.parentElement||s.eo.parentNode))s.t()}"
+"catch(f){}\");s.eo=0');s.ot=function(o){var a=o.type,b=o.tagName;re"
+"turn (a&&a.toUpperCase?a:b&&b.toUpperCase?b:o.href?'A':'').toUpperC"
+"ase()};s.oid=function(o){var s=this,t=s.ot(o),p=o.protocol,c=o.oncl"
+"ick,n='',x=0;if(!o.s_oid){if(o.href&&(t=='A'||t=='AREA')&&(!c||!p||"
+"p.toLowerCase().indexOf('javascript')<0))n=o.href;else if(c){n=s.re"
+"p(s.rep(s.rep(s.rep(''+c,\"\\r\",''),\"\\n\",''),\"\\t\",''),' ',''"
+");x=2}else if(o.value&&(t=='INPUT'||t=='SUBMIT')){n=o.value;x=3}els"
+"e if(o.src&&t=='IMAGE')n=o.src;if(n){o.s_oid=s.fl(n,100);o.s_oidt=x"
+"}}return o.s_oid};s.rqf=function(t,un){var s=this,e=t.indexOf('='),"
+"u=e>=0?','+t.substring(0,e)+',':'';return u&&u.indexOf(','+un+',')>"
+"=0?s.epa(t.substring(e+1)):''};s.rq=function(un){var s=this,c=un.in"
+"dexOf(','),v=s.c_r('s_sq'),q='';if(c<0)return s.pt(v,'&','rqf',un);"
+"return s.pt(un,',','rq',0)};s.sqp=function(t,a){var s=this,e=t.inde"
+"xOf('='),q=e<0?'':s.epa(t.substring(e+1));s.sqq[q]='';if(e>=0)s.pt("
+"t.substring(0,e),',','sqs',q);return 0};s.sqs=function(un,q){var s="
+"this;s.squ[un]=q;return 0};s.sq=function(q){var s=this,k='s_sq',v=s"
+".c_r(k),x,c=0;s.sqq=new Object;s.squ=new Object;s.sqq[q]='';s.pt(v,"
+"'&','sqp',0);s.pt(s.un,',','sqs',q);v='';for(x in s.squ)s.sqq[s.squ"
+"[x]]+=(s.sqq[s.squ[x]]?',':'')+x;for(x in s.sqq)if(x&&s.sqq[x]&&(x="
+"=q||c<2)){v+=(v?'&':'')+s.sqq[x]+'='+s.ape(x);c++}return s.c_w(k,v,"
+"0)};s.wdl=new Function('e','var s=s_c_il['+s._in+'],r=true,b=s.eh(s"
+".wd,\"onload\"),i,o,oc;if(b)r=this[b](e);for(i=0;i<s.d.links.length"
+";i++){o=s.d.links[i];oc=o.onclick?\"\"+o.onclick:\"\";if((oc.indexO"
+"f(\"s_gs(\")<0||oc.indexOf(\".s_oc(\")>=0)&&oc.indexOf(\".tl(\")<0)"
+"s.eh(o,\"onclick\",0,s.lc);}return r');s.wds=function(){var s=this;"
+"if(s.apv>3&&(!s.isie||!s.ismac||s.apv>=5)){if(s.b&&s.b.attachEvent)"
+"s.b.attachEvent('onclick',s.bc);else if(s.b&&s.b.addEventListener)s"
+".b.addEventListener('click',s.bc,false);else s.eh(s.wd,'onload',0,s"
+".wdl)}};s.vs=function(x){var s=this,v=s.visitorSampling,g=s.visitor"
+"SamplingGroup,k='s_vsn_'+s.un+(g?'_'+g:''),n=s.c_r(k),e=new Date,y="
+"e.getYear();e.setYear(y+10+(y<1900?1900:0));if(v){v*=100;if(!n){if("
+"!s.c_w(k,x,e))return 0;n=x}if(n%10000>v)return 0}return 1};s.dyasmf"
+"=function(t,m){if(t&&m&&m.indexOf(t)>=0)return 1;return 0};s.dyasf="
+"function(t,m){var s=this,i=t?t.indexOf('='):-1,n,x;if(i>=0&&m){var "
+"n=t.substring(0,i),x=t.substring(i+1);if(s.pt(x,',','dyasmf',m))ret"
+"urn n}return 0};s.uns=function(){var s=this,x=s.dynamicAccountSelec"
+"tion,l=s.dynamicAccountList,m=s.dynamicAccountMatch,n,i;s.un.toLowe"
+"rCase();if(x&&l){if(!m)m=s.wd.location.host;if(!m.toLowerCase)m=''+"
+"m;l=l.toLowerCase();m=m.toLowerCase();n=s.pt(l,';','dyasf',m);if(n)"
+"s.un=n}i=s.un.indexOf(',');s.fun=i<0?s.un:s.un.substring(0,i)};s.sa"
+"=function(un){s.un=un;if(!s.oun)s.oun=un;else if((','+s.oun+',').in"
+"dexOf(un)<0)s.oun+=','+un;s.uns()};s.t=function(){var s=this,trk=1,"
+"tm=new Date,sed=Math&&Math.random?Math.floor(Math.random()*10000000"
+"000000):tm.getTime(),sess='s'+Math.floor(tm.getTime()/10800000)%10+"
+"sed,yr=tm.getYear(),vt=tm.getDate()+'/'+tm.getMonth()+'/'+(yr<1900?"
+"yr+1900:yr)+' '+tm.getHours()+':'+tm.getMinutes()+':'+tm.getSeconds"
+"()+' '+tm.getDay()+' '+tm.getTimezoneOffset(),tfs=s.gtfs(),ta='',q="
+"'',qs='';s.uns();if(!s.q){var tl=tfs.location,x='',c='',v='',p='',b"
+"w='',bh='',j='1.0',k=s.c_w('s_cc','true',0)?'Y':'N',hp='',ct='',pn="
+"0,ps;if(s.apv>=4)x=screen.width+'x'+screen.height;if(s.isns||s.isop"
+"era){if(s.apv>=3){j='1.1';v=s.n.javaEnabled()?'Y':'N';if(s.apv>=4){"
+"j='1.2';c=screen.pixelDepth;bw=s.wd.innerWidth;bh=s.wd.innerHeight;"
+"if(s.apv>=4.06)j='1.3'}}s.pl=s.n.plugins}else if(s.isie){if(s.apv>="
+"4){v=s.n.javaEnabled()?'Y':'N';j='1.2';c=screen.colorDepth;if(s.apv"
+">=5){bw=s.d.documentElement.offsetWidth;bh=s.d.documentElement.offs"
+"etHeight;j='1.3';if(!s.ismac&&s.b){s.b.addBehavior('#default#homePa"
+"ge');hp=s.b.isHomePage(tl)?\"Y\":\"N\";s.b.addBehavior('#default#cl"
+"ientCaps');ct=s.b.connectionType}}}else r=''}if(s.pl)while(pn<s.pl."
+"length&&pn<30){ps=s.fl(s.pl[pn].name,100)+';';if(p.indexOf(ps)<0)p+"
+"=ps;pn++}s.q=(x?'&s='+s.ape(x):'')+(c?'&c='+s.ape(c):'')+(j?'&j='+j"
+":'')+(v?'&v='+v:'')+(k?'&k='+k:'')+(bw?'&bw='+bw:'')+(bh?'&bh='+bh:"
+"'')+(ct?'&ct='+s.ape(ct):'')+(hp?'&hp='+hp:'')+(p?'&p='+s.ape(p):''"
+")}if(s.usePlugins)s.doPlugins(s);var l=s.wd.location,r=tfs.document"
+".referrer;if(!s.pageURL)s.pageURL=s.fl(l?l:'',255);if(!s.referrer)s"
+".referrer=s.fl(r?r:'',255);if(s.lnk||s.eo){var o=s.eo?s.eo:s.lnk;if"
+"(!o)return '';var p=s.gv('pageName'),w=1,t=s.ot(o),n=s.oid(o),x=o.s"
+"_oidt,h,l,i,oc;if(s.eo&&o==s.eo){while(o&&!n&&t!='BODY'){o=o.parent"
+"Element?o.parentElement:o.parentNode;if(!o)return '';t=s.ot(o);n=s."
+"oid(o);x=o.s_oidt}oc=o.onclick?''+o.onclick:'';if((oc.indexOf(\"s_g"
+"s(\")>=0&&oc.indexOf(\".s_oc(\")<0)||oc.indexOf(\".tl(\")>=0)return"
+" ''}ta=n?o.target:1;h=o.href?o.href:'';i=h.indexOf('?');h=s.linkLea"
+"veQueryString||i<0?h:h.substring(0,i);l=s.linkName?s.linkName:s.ln("
+"h);t=s.linkType?s.linkType.toLowerCase():s.lt(h);if(t&&(h||l))q+='&"
+"pe=lnk_'+(t=='d'||t=='e'?s.ape(t):'o')+(h?'&pev1='+s.ape(h):'')+(l?"
+"'&pev2='+s.ape(l):'');else trk=0;if(s.trackInlineStats){if(!p){p=s."
+"gv('pageURL');w=0}t=s.ot(o);i=o.sourceIndex;if(s.gg('objectID')){n="
+"s.gg('objectID');x=1;i=1}if(p&&n&&t)qs='&pid='+s.ape(s.fl(p,255))+("
+"w?'&pidt='+w:'')+'&oid='+s.ape(s.fl(n,100))+(x?'&oidt='+x:'')+'&ot="
+"'+s.ape(t)+(i?'&oi='+i:'')}}if(!trk&&!qs)return '';if(s.p_r)s.p_r()"
+";var code='';if(trk&&s.vs(sed))code=s.mr(sess,(vt?'&t='+s.ape(vt):'"
+"')+s.hav()+q+(qs?qs:s.rq(s.un)),ta);s.sq(trk?'':qs);s.lnk=s.eo=s.li"
+"nkName=s.linkType=s.wd.s_objectID=s.ppu='';return code};s.tl=functi"
+"on(o,t,n){var s=this;s.lnk=s.co(o);s.linkType=t;s.linkName=n;s.t()}"
+";s.ssl=(s.wd.location.protocol.toLowerCase().indexOf('https')>=0);s"
+".d=document;s.b=s.d.body;s.n=navigator;s.u=s.n.userAgent;s.ns6=s.u."
+"indexOf('Netscape6/');var apn=s.n.appName,v=s.n.appVersion,ie=v.ind"
+"exOf('MSIE '),o=s.u.indexOf('Opera '),i;if(v.indexOf('Opera')>=0||o"
+">0)apn='Opera';s.isie=(apn=='Microsoft Internet Explorer');s.isns=("
+"apn=='Netscape');s.isopera=(apn=='Opera');s.ismac=(s.u.indexOf('Mac"
+"')>=0);if(o>0)s.apv=parseFloat(s.u.substring(o+6));else if(ie>0){s."
+"apv=parseInt(i=v.substring(ie+5));if(s.apv>3)s.apv=parseFloat(i)}el"
+"se if(s.ns6>0)s.apv=parseFloat(s.u.substring(s.ns6+10));else s.apv="
+"parseFloat(v);s.em=0;if(String.fromCharCode){i=escape(String.fromCh"
+"arCode(256)).toUpperCase();s.em=(i=='%C4%80'?2:(i=='%U0100'?1:0))}s"
+".sa(un);s.vl_l='visitorID,vmk,ppu,charSet,visitorNamespace,cookieDo"
+"mainPeriods,cookieLifetime,pageName,pageURL,referrer,currencyCode,p"
+"urchaseID';s.vl_t=s.vl_l+',variableProvider,channel,server,pageType"
+",campaign,state,zip,events,products,linkName,linkType';for(var n=1;"
+"n<51;n++)s.vl_t+=',prop'+n+',eVar'+n+',hier'+n;s.vl_g=s.vl_t+',trac"
+"kDownloadLinks,trackExternalLinks,trackInlineStats,linkLeaveQuerySt"
+"ring,linkDownloadFileTypes,linkExternalFilters,linkInternalFilters,"
+"linkNames';if(pg)s.gl(s.vl_g);s.ss=ss;if(!ss){s.wds();s.ca()}}",
l=window.s_c_il,n=navigator,u=n.userAgent,v=n.appVersion,e=v.indexOf(
'MSIE '),m=u.indexOf('Netscape6/'),a,i,s;if(l)for(i=0;i<l.length;i++){
s=l[i];if(s.oun==un)return s;else if(s.fs(s.oun,un)){s.sa(un);return s
}}if(e>0){a=parseInt(i=v.substring(e+5));if(a>3)a=parseFloat(i)}
else if(m>0)a=parseFloat(u.substring(m+10));else a=parseFloat(v);if(a
>=5&&v.indexOf('Opera')<0&&u.indexOf('Opera')<0){eval(c);return new
s_c(un,pg,ss)}else s=s_c2f(c);return s(un,pg,ss)}
/** WP
 * static/results/xps.js version 1.1
 *
 * IMPORTANT:
 *
 *   The version number above needs to be incremented each time this file
 *   is edited.  In addition, it needs to be updated in each template
 *   wherein it is referenced.  This should include:
 *
 *        wpn/templates/common/includes/ads.xslt
 */


function xps_acquire( div_name, creative, atlas_url ) {
  var request = getHTTPObject();
  if ( request ) {
    request.onreadystatechange = function() {
      parseResponse( request, div_name );
    };
    var url = '/search/PublicSearch?dp=USSearch&creative=' + creative +
              '&oas_url=' + encodeURI( atlas_url ) +
              '&ad=' + div_name;
    for ( var i = 3; i < arguments.length; i++ ) {
      var arg = arguments[i].split( '=' );
      if ( arg[0] == 'name' && arg.slice(1) == '' ) {
         xps_fallback( document.getElementById( div_name ) );
         return false;
      }
      url += '&' +  arg[0]
        +  '=' +  encodeURIComponent( arg.slice(1).join('=') );
    }
    request.open( "GET", url, true );
    request.send( null );
    return true;
  } else {
    xps_fallback( document.getElementById( div_name ) );
    return false;
  }
}

function parseResponse( request, div_name ) {
  if ( request.readyState == 4 ) {
    if ( request.status == 200 || request.status == 304 ) {
      var xps_div = document.getElementById( div_name );
      xps_div.innerHTML = '';
      var newdiv = document.createElement( 'div' );
      newdiv.innerHTML = request.responseText;
      xps_div.appendChild( newdiv );
      xps_div.style.display = 'block';
    }
    xps_fallback( document.getElementById( div_name ) );
  }
}

function getHTTPObject() {
  var xhr = false;
  if ( window.XMLHttpRequest ) {
    xhr = new XMLHttpRequest();
  } else if ( window.ActiveXObject ) {
    try {
      xhr = new ActiveXObject( "Msxml2.XMLHTTP" );
    } catch( e ) {
      try {
        xhr = new ActiveXObject( "Microsoft.XMLHTTP" );
      } catch( e ) {
        xhr = false;
      }
    }
  }
  return xhr;
}

function xps_fallback( xps_div ) {
  xps_div.style.display = 'block';
}

if (typeof(whitepages.survey) == 'undefined') { whitepages.survey = function() {}; }

/**
 * ShowProfileSurvey will launch the demo profile survey if the correct conditions are met.
 * User should have never seen the popup during this session, and have never filled out
 * the survey before, and completed at least one search successfully.
 *
 * @param stage {string} the name of the environment you're in.  Required because it must be set in ruby and passed into getCookieData.
 */
whitepages.survey.showProfileSurvey = function (stage) {
  var hasViewedPopup = whitepages.common.getCookieData('wp_session', 'viewed_demo_survey');
  var hasCompletedSurvey = whitepages.common.getCookieData('wp_perm', 'completed_demo_survey');
  var hasViewedResults = whitepages.common.getCookieData('wp_session', 'viewed_results_page');
  if (!hasViewedPopup && !hasCompletedSurvey && hasViewedResults) {
    var top = ((screen.height*1) / 2) - (550/2);
    var left = ((screen.width*1) / 2) - (739/2);
    var options = 'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,copyhistory=yes,width=739,height=550,left=' + left + ',top=' + top;
    whitepages.common.setCookieData('wp_session', 'viewed_demo_survey', true);
    window.open('/survey', 'DemoSurvey', options);
  }
}

whitepages.survey.compareDate = function ( a, b ) {
	/** WP: Will assume a will be the current date */
	if ( a===null || a==='' ) { a = new Date(); }
	return ( b===null || b==='' )
		? false
		: ( a > b ) ? true : false;
} /** WP: end compareDate */

whitepages.survey.getDateOffset = function ( d, offset ) {
	if ( offset===null || offset==='' ) { offset = 0; } /** WP: In days */

	d.setDate(
		parseInt( d.getDate(), 10 )
		+ parseInt( offset, 10 )
	); /** WP: JavaScript 1.1 will roll-over appropirately */

	return d;
} /** WP: end getDateOffset */

whitepages.survey.translateDate = function ( dateString, parser ) {
	if ( dateString===null || dateString==='' ) { return ''; } /** WP: Can't parse nothing */
	if ( parser===null || parser==='' ) { parser = '/'; }      /** WP: Default to '/' */
	var d = new Date();
	d.setFullYear(parseInt(dateString.split(parser)[0],10));
	d.setMonth(parseInt(dateString.split(parser)[1],10) - 1); // January == 0
	d.setDate(parseInt(dateString.split(parser)[2],10));
	return d;
} /** WP: end translateDate */

whitepages.survey.releaseSurvey = function ( siteId, disable, stage, exp, demo ){/** WP: For Satisfaction Survey */
  var hasViewedPopup = whitepages.common.getCookieData('wp_session', 'viewed_sat_survey');
	if ( disable===true || disable=='true' || hasViewedPopup == 'true' || hasViewedPopup === true ) {
    if (demo == '1') {
		  whitepages.survey.showProfileSurvey();
    } else {
	    return false; // Disable blocker
    }
		return false;
  }


	var cDate = whitepages.survey.translateDate( whitepages.common.getCookieData( 'wp_perm', 'survey_rdate' ), '-' );
	if ( cDate===null || cDate==='' ) { /** WP: Make a fake date w/ no cookie date */
		cDate = new Date();
		cDate.setMonth(
			parseInt( cDate.getMonth(), 10 ) - 12
		); /** WP: Make sure this will fail in comparison */
	}
	else {
		cDate = whitepages.survey.getDateOffset( cDate, exp );
	}

	var dom,domain,uri,wW,wH;
	if ( whitepages.survey.compareDate( new Date(), cDate ) ) { // Is the cDate bigger than the expiration limit??
		dom    = ( location.href.substring( 0, 7 ) == 'http:\/\/' )
								? location.href.substring(7)
								: location.href;
		dom    = dom.substring( 0, dom.indexOf('\/') );
		domain = ( dom.indexOf('\\:') > -1 ) ? dom.substring( 0, dom.indexOf('\\:') ) : dom;
		uri    = (siteId) ? dom + '/' + siteId : dom;

		/** WP
		* default to 350/400
		*/
		wW = 350;
		wH = 400;

		w = window.open(
			'http://' + uri + '/survey/satisfaction' + '?wsb13=' + uri +
			'&wsb15=' + domain + '&localtime=survey',
			'',
			"width="+wW+",height="+wH+",toolbars=no,location=no,scrollbars=yes,resizable=yes,status=no"
		);              /** WP: Send the survey */

		w.blur();       /** WP: Get the window into scope */
		window.focus(); /** WP: Send it to the back */

	  whitepages.common.setCookieData('wp_session', 'viewed_sat_survey', true);

		return true;    /** WP: Return out of the function */
	}

  if (demo == '1') {
    whitepages.survey.showProfileSurvey();
  } else {
    return false; /** WP: No survey */
  }
} /** WP: end releaseSurvey */


/**
 * handleSubmit hanldes form submits and runs any code required before submit.
 *
 * @return true if code is ready for submit
 * first option is the Satisfaction Survey. If that exists, it should take priority.
 * second option is the Demo Survey. If the Satisfaction Survey doesn't exist, or
 * the user has already taken it, the Demo Survey will pop.
 */
whitepages.survey.handleSubmit = function(options) {
  try {
    if (options && (options['satSurveyEnabled'] == '1')) {
      whitepages.survey.releaseSurvey(options['siteId'],options['formName'],options['disable'],options['stage'],options['surveyDays'],options['surveyEnabled']);
    } else if (options && (options['surveyEnabled'] == '1')) {
      whitepages.survey.showProfileSurvey();
    } else {
      return false;
    }
   return true;
  }
  catch(e) {
    return false;
  }
}
