//onload
document.observe("dom:loaded", function() {
  nfq_onload("");
	nfq_layer();
});

// global variables
var aTabContents = new Array();


function nfq_onload(popup){

  if( !bLoggedIn){
	var nfq_login = $( 'h_login_email');
	var nfq_pwd = $( 'h_login_email');
	if( null != nfq_login){
		nfq_login.observe('focus', function(event){
			nfq_emptyInput( 'h_login_email', 'E-Mail');
		});
	}
    if( null != nfq_pwd){
		nfq_pwd.observe('focus', function(event){
			nfq_emptyInput( 'h_login_password', 'Passwort');
		});
	}
  }
  
  // show js fields
  var nfq_show = $$( '.nfq_show');
  for (var i = 0; i < nfq_show.length; ++i){
    nfq_show[i].show();
  }
  
  // close window
  var nfq_close = $$( '.nfq_close');
		for (var i = 0; i < nfq_close.length; ++i){
			nfq_close[i].observe('click', function(event){
			window.close();
		});
  }
	
	// sort listeners
  var nfq_sort_item = $$( '.nfq_sort_item');
		for (var i = 0; i < nfq_sort_item.length; ++i){
			nfq_sort_item[i].observe('change', function(event){
				$(this).up().up().submit();
		});
  }
  
	// add popup listeners
	var nfq_popups = $$( 'a.nfq_popup');
	for (var i = 0; i < nfq_popups.length; ++i){
		nfq_popups[i].observe('click', function(event){
			var link = this.href;
			if ( -1 == link.indexOf('?')){
				link = link + '?popup=1';
			}
			else{
				link = link + '&popup=1';
			}
			window.open( link, 'nfq_popup', 'resizable=yes,status=no,scrollbars=no,menubar=no,width=710,height=600');
			Event.stop(event);
		});
	}
	
	// add popup listeners
	var nfq_popups = $$( 'a.nfq_popup_agb');
	for (var i = 0; i < nfq_popups.length; ++i){
		nfq_popups[i].observe('click', function(event){
			var link = this.href;
			if ( -1 == link.indexOf('?')){
				link = link + '?popup=1';
			}
			else{
				link = link + '&popup=1';
			}
			window.open( link, 'nfq_popup', 'resizable=yes,status=no,scrollbars=yes,menubar=no,width=700,height=600');
			Event.stop(event);
		});
	}
	
	// add listener for into basket submit
	var nfq_submit_basket = $$( 'input.nfq_submit_basket');
	for (var i = 0; i < nfq_submit_basket.length; ++i){
		nfq_submit_basket[i].observe('click', function(event){
			CheckProductVariants();
		});
	}
	
	// close basket layer
	var nfq_close_basket = $('nfq_blocklayer_basketlink');
	var nfq_basket_layer = $('nfq_blocklayer');
	var nfq_basket_layer_container = $('nfq_blocklayer_div_wide');
	var nfq_container = $('container');
	if ( null != nfq_container){
		if ( null != nfq_basket_layer){
			var sizWin = nfq_container.clientHeight;
			nfq_basket_layer.style.height = (sizWin) + 'px';
			nfq_basket_layer_container.style.top = "200px";
		}
	}
	if( null != nfq_close_basket){
		nfq_close_basket.observe('click', function(event){
			Event.stop(event);
			if ( null != nfq_basket_layer){
				nfq_basket_layer.hide();
				Element.remove(nfq_basket_layer);
			}
		});
	}
	
	if(popup != "1"){
		// swap contents
		var nfq_replace = $( 'c_pdetails_tabbox_content');
		if ( null != nfq_replace){
			var nfq_replace_links = $$( 'a.nfq_replace_link');
			for (var i = 0; i < nfq_replace_links.length; ++i){
				nfq_replace_links[i].observe('click', function(event){
					Event.stop(event);
					nfq_replace.update( '<div style="margin: 10px 0 10px 0; text-align: center;"><img src="http://static.centercourt.de/out/1/html/0/images/_new/loader.gif" alt="Loading" width="16" height="16" /></div>');
					
					var link = this.href;
					link = link.replace(/#tabbar/, "");
					if ( -1 == link.indexOf('?')){
						link = link + '?popup2=1';
					}
					else{
						link = link + '&popup2=1';
					}
					var s = this.href.toQueryParams();

					if (aTabContents[s.showtab] != undefined){
						nfq_replace.update(aTabContents[s.showtab]);
						nfq_onload("1");
						
					}else if ( link){
						new Ajax.Request( link, {
							method:'get',
							onSuccess: function( transport){
								var s = transport.request.url.toQueryParams();															
								aTabContents[s.showtab] = transport.responseText;
								
								nfq_replace.update( transport.responseText);
								nfq_onload("1");
							},
							onFailure: function(){ 
								nfq_replace.update( 'Error'); 
							}
						});
					}
					
					var nfq_replace_links2 = $$( 'a.nfq_replace_link');
					for (var j = 0; j < nfq_replace_links2.length; ++j){
						if ( nfq_replace_links2[j].hasClassName('c_pdetails_tabbox_link_active')){
							nfq_replace_links2[j].removeClassName('c_pdetails_tabbox_link_active');
						}
					}
					
					this.addClassName('c_pdetails_tabbox_link_active');
					
				});
			}
			
			// Proload all Tab Contents into aTabContents[]
			for (var i = 0; i < nfq_replace_links.length; ++i){
				var link = nfq_replace_links[i].href;
				var title = nfq_replace_links[i].title;
				link = link.replace(/#tabbar/, "");
				if ( -1 == link.indexOf('?')){
					link = link + '?popup2=1';
				}
				else{
					link = link + '&popup2=1';
				}
				
				if (link)
				{
					new Ajax.Request( link, {
							method:'get',
							onSuccess: function( transport){
								var s = transport.request.url.toQueryParams();
								aTabContents[s.showtab] = transport.responseText;
							},
							onFailure: function(){ 
								// something todo
							}
						});
				}
			}
			
		}
	}
	
	
	var nfq_tooltip = $$( '.nfq_tooltip');
	for (var i = 0; i < nfq_tooltip.length; ++i){
		// show Tooltip
		nfq_tooltip[i].observe('mouseover', function(event){
			var nfq_tip = this.childNodes[0];
			nfq_tip.style.display = "block";
		});
		
		// hide Tooltip
		nfq_tooltip[i].observe('mouseout', function(event){
			var nfq_tip = this.childNodes[0];
			nfq_tip.style.display = "none";
		});
		
	}
	
	// plus btn
	var nfq_plusbtn = $$( '.c_plus_btn');
	for (var i = 0; i < nfq_plusbtn.length; ++i){
		nfq_plusbtn[i].observe('click', function(event){
			var input = this.name;
			$(input).value++;
		});
	}
	
	// minus btn
	var nfq_minusbtn = $$( '.c_minus_btn');
	for (var i = 0; i < nfq_minusbtn.length; ++i){
		nfq_minusbtn[i].observe('click', function(event){
			var input = this.name;
			if ($(input).value != 0){
				$(input).value--;
			}
		});
	}

	var nfq_toggle = $$( '.c_pfinderbox_minimize_link');
	for (var i = 0; i < nfq_toggle.length; ++i){
		nfq_toggle[i].observe('click', function(event){
			var div = $(this).up().next();
			var header = $(this).up();
			var text = $(this).down();
			if($(div).style.display == 'none'){
				$(div).show();
				$(header).style.backgroundRepeat = "repeat-x";
				$(text).innerHTML = 'Box minimieren';
			}else{
				$(div).hide();
				$(header).style.backgroundRepeat = "no-repeat";
				$(text).innerHTML = 'Box ausklappen';
			}
		});
	}
	
	var nfq_qwiser_hide = $$( 'a.nfq_qwiser_hide');
	for (var i = 0; i < nfq_qwiser_hide.length; ++i){
		nfq_qwiser_hide[i].observe('click', function(event){
			var div = $(this.parentNode.parentNode);
			div.cleanWhitespace();
			var header = $(div.firstChild);
			var text = $(div.childNodes[1]);
			
			if(text.style.display == 'none'){
				text.show();
				header.style.backgroundRepeat = "repeat-x";
				this.update('Box minimieren');
			}else{
				text.hide();
				header.style.backgroundRepeat = "no-repeat";
				this.update('Box ausklappen');
			}
		});
	}
	
	//basket selectlist
	var nfq_selectlist = $$( '.nfq_selectlist');
	for (var i = 0; i < nfq_selectlist.length; ++i){
		nfq_selectlist[i].observe('change', function(event){
			var form = $(this.parentNode.id);
			form.submit();
		});
	}
	
	// user: reload address
	var nfq_userreload = $( 'user_oxaddressid');
	if ( null != nfq_userreload){
		nfq_userreload.observe( 'change', function(event){
			var form_order = $('c_basket_register_form');
			var input;
			if( nfq_userreload.value != -1){
				input = form_order['fnc'];
				$(input).clear();
				form_order.submit();
			}
			// clearing fields
			else{   
				// default inputs
				var aFields = new Array(
					"deladr[oxaddress__oxfname]",
					"deladr[oxaddress__oxlname]",
					"deladr[oxaddress__oxcompany]",
					"deladr[oxaddress__oxstreet]",
					"deladr[oxaddress__oxstreetnr]",
					"deladr[oxaddress__oxzip]",
					"deladr[oxaddress__oxcity]",
					"deladr[oxaddress__oxaddinfo]",
					"deladr[oxaddress__oxfon]"
				);
				
				for ( i = 0; i < aFields.length; i++){   
					input = form_order[ aFields[i]];
					if ( $(input).present())
						$(input).clear();
					}
					// select lists
					input = form_order[ "deladr[oxaddress__oxsal]"];
					if ( $(input).present()){
						$(input).options.item( 0).selected = true;
					}
					
					input = form_order[ "deladr[oxaddress__oxcountryid]"];
					if ( $(input).present()){
						for ( i = 0; i < $(input).options.length; i++){
							if ( $(input).options.item( i).value == "a7c40f631fc920687.20179984"){
								$(input).options.item( i).selected = true;
							}else{
								$(input).options.item( i).selected = false;
							}
						}
					}
				}
		});
	}
	
	var nfq_more = $$('.c_moredetails_imgbox');
	if ( null != nfq_more){
		for (var i = 0; i < nfq_more.length; ++i){
			var newHeight = (nfq_more[i].clientHeight)+270;
			var newWidth = (nfq_more[i].clientWidth)+40;
			window.resizeTo(newWidth, newHeight);
		}
	}
	
	// swap images
	var nfq_img = $( 'nfq_swap');
	if ( null != nfq_img){
		var nfq_swap = $$( '.nfq_swap_link');
		for (var i = 0; i < nfq_swap.length; ++i){
			nfq_swap[i].observe('click', function(event){
				Event.stop(event);
        
				var nfq_swap2 = $$( '.nfq_swap_link');
				for (var j = 0; j < nfq_swap2.length; ++j){
					var other = Element.extend( nfq_swap2[j].parentNode);
					if ( other.hasClassName('c_details_morepic_icon_active')){
						other.removeClassName('c_details_morepic_icon_active');
					}
				}
				var parentel = Element.extend( this.parentNode);
				parentel.addClassName('c_details_morepic_icon_active');
				nfq_img.src = this.firstChild.getAttribute('alt');
			});
			
			nfq_swap[i].observe('mouseover', function(event){
				Event.stop(event);
        
				var nfq_swap2 = $$( '.nfq_swap_link');
				for (var j = 0; j < nfq_swap2.length; ++j){
					var other = Element.extend( nfq_swap2[j].parentNode);
					if ( other.hasClassName('c_details_morepic_icon_active')){
						other.removeClassName('c_details_morepic_icon_active');
					}
				}
				var parentel = Element.extend( this.parentNode);
				parentel.addClassName('c_details_morepic_icon_active');
				nfq_img.src = this.firstChild.getAttribute('alt');
			});
		}
	}
	
  // payment: ipayment select
  var nfq_ipaymentselects = $$( '.nfq_ipayment_select');
  for (var i = 0; i < nfq_ipaymentselects.length; ++i){
	nfq_ipaymentselects[i].observe('click', function(event){	  
	  sOldForm    = sActForm;
      sActForm    = this.parentNode.id;
      var oActForm  = $(sActForm);
      if ( oActForm != null){
        oActForm.paymentid.checked    = true;
        var oOldForm = $(sOldForm);
        if ( oOldForm != null && sActForm != sOldForm){
          oOldForm.paymentid.checked  = false;
        }
      }
    });
  }

  // payment: ipayment submit
  var nfq_ipaymentsubmits = $$( '.nfq_ipayment_submit');
  for (var i = 0; i < nfq_ipaymentsubmits.length; ++i){
    nfq_ipaymentsubmits[i].observe('click', function(event){
      Event.stop(event);
      var oActForm = $(sActForm);
      if ( oActForm != null)
          oActForm.submit();
    });
  }
	
}

function nfq_layer(){
	var nfq_popups2 = $$( 'a.nfq_popup2');
  for (var i = 0; i < nfq_popups2.length; ++i){
    nfq_popups2[i].observe('click', function(event){
      Event.stop(event);
      var link = this.href;
      if ( -1 == link.indexOf('?')){
        link = link + '?popup2=1';
      }
      else{
        link = link + '&popup2=1';
      }

      var oBlockLayer = $( 'nfq_blocklayer');
      if ( null == oBlockLayer){
      	var oBlockLayer = document.createElement("div");
      	oBlockLayer.setAttribute('id','nfq_blocklayer');
        Element.extend( oBlockLayer);
      	var objBody = document.getElementsByTagName("body").item(0);
      	objBody.appendChild(oBlockLayer);
      }
			
			var oBlockLayerDiv = document.createElement("div");
			oBlockLayerDiv.setAttribute('id','nfq_blocklayer_layer');
			Element.extend( oBlockLayerDiv);
			oBlockLayer.appendChild(oBlockLayerDiv);
			
			var nfq_container = $( 'container');
			if ( null != nfq_container){
				var sizWin = nfq_container.clientHeight;
				var dim = getWindowSize();
				if(dim.height > sizWin){
					oBlockLayer.style.height = (dim.height) + 'px';
				}else{
					oBlockLayer.style.height = (sizWin+9) + 'px';
				}
			}
			
			oBlockLayerDiv.update( '<h2 class="nfq_blocklayer_h2_glossary">Lade Inhalte...</h2><div style="padding: 10px 0  10px 0; text-align: center;"><img src="http://static.centercourt.de/out/1/html/0/images/_new/loader.gif" alt="Loading" width="16" height="16" /></div>');
			
      new Ajax.Request( link, {
        method:'get',
        onSuccess: function( transport){
          oBlockLayerDiv.update(transport.responseText);
          nfq_reload();
          oBlockLayer.show();
          oBlockLayer.scrollTo();
        },
        onFailure: function(){ 
          oBlockLayerDiv.update('Error');
          oBlockLayer.hide();
        }
      });
    });
  }
}

function nfq_reload(){
	// close blocklayer
	var nfq_close2 = $$('a.nfq_close2');
	if(nfq_close2 != null){
		for (var i = 0; i < nfq_close2.length; ++i){
			nfq_close2[i].observe('click', function(event){
				Event.stop(event);
				var oBlockLayer = $('nfq_blocklayer');
				if ( null != oBlockLayer){
					oBlockLayer.hide();
					Element.remove(oBlockLayer);
				}
			});			
		}
	}
}

function nfq_emptyInput( elName, elValue){
  if( elValue == $( elName).value){
	$( elName).value = '';
  }
}

function pMoreDetails(oObj)
{
	if (oObj != null && oObj.href.length > 0)
	{
	  fenster_attribute = "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=700,height=800";
	  open(oObj.href, "send_link", fenster_attribute);
	}
}

function hideTooltipElement(id_hover){
	var hover = document.getElementById(id_hover);
	hover.style.display = 'none';
}

function CheckProductVariants(){
	var handler = false;
	var basketelements = document.forms['into_basket'].elements;
	var jobInputs = new Array();
	for (var i = 0; i < basketelements.length; i++) 
	{
		if (basketelements[i].name.indexOf("aproducts") == 0)
		{
			if(basketelements[i].value > 0)
			{
				handler = true;
			}
		}
	}
	
	if(handler){
		$('form_into_basket').submit();
	}else{
		var oBlockLayer = $('nfq_blocklayer');
		
		if ( null == oBlockLayer){
			var oBlockLayer = document.createElement("div");
			oBlockLayer.setAttribute('id','nfq_blocklayer');
	        Element.extend( oBlockLayer);
	      	var objBody = document.getElementsByTagName("body").item(0);
	      	objBody.appendChild(oBlockLayer);
		
			var nfq_container = $( 'container');
			if ( null != nfq_container){
				var sizWin = nfq_container.clientHeight;
				oBlockLayer.style.height = (sizWin) + 'px';
				
				// create wrapper div
				var wrapper = document.createElement("div");
				wrapper.setAttribute('id', 'nfq_blocklayer_div');
				oBlockLayer.appendChild(wrapper);
				var pos = Element.positionedOffset($('c_pdetails_tabbox'));
				var top = pos[1]-200;
				var left = Math.round((objBody.clientWidth/2)-175);
				wrapper.style.top = top + 'px';
				wrapper.style.left = left + 'px';
				
				// create title
				var title = document.createElement("h2");
				title.setAttribute('id','nfq_blocklayer_h2');
				title.innerHTML='Fehler';
				wrapper.appendChild(title);
				
				// create errormsg
				var errormsg = document.createElement("div");
				errormsg.setAttribute('id', 'nfq_blocklayer_error');
				errormsg.innerHTML = 'Bitte geben Sie eine Menge f&uuml;r das Produkt ein.<br /><br />Sie k&ouml;nnen die gew&uuml;nschte Menge direkt in das Eingabfeld eintragen oder mit den +/- Buttons die Menge anpassen.<br /><br />Anschliessend k&ouml;nnen Sie die Produkte in den Warenkorb legen.';
				wrapper.appendChild(errormsg);
				
				// create closlink
				var close = document.createElement("div");
				close.setAttribute('id', 'nfq_blocklayer_close');
				wrapper.appendChild(close);
				var closelink = document.createElement("a");
				closelink.setAttribute('id', 'nfq_blocklayer_closelink');
				closelink.innerHTML = "Schliessen";
				close.appendChild(closelink);
			}		
					
			// close blocklayer
			var nfq_close = $('nfq_blocklayer_closelink');
			nfq_close.observe('click', function(event){
				Event.stop(event);
				if ( null != oBlockLayer){
					oBlockLayer.hide();
					Element.remove(oBlockLayer);
				}
			});			
	    }
	}
}

function popCompare(){
	fenster_attribute = "resizable=yes,status=no,scrollbars=yes,menubar=no,width=810,height=670";
	open('about:blank', 'PopWnd', fenster_attribute);
	
}


/*
 *
 *  Ajax Autocomplete for Prototype, version 1.0.3
 *  (c) 2008 Tomas Kirda
 *
 *  Ajax Autocomplete for Prototype is freely distributable under the terms of an MIT-style license.
 *  For details, see the web site: http://www.devbridge.com/projects/autocomplete/
 *
 */

var Autocomplete = function(el, options){
  this.el = $(el);
  this.id = this.el.identify();
  this.el.setAttribute('autocomplete','off');
  this.suggestions = [];
  this.data = [];
  this.badQueries = [];
  this.selectedIndex = -1;
  this.currentValue = this.el.value;
  this.intervalId = 0;
  this.cachedResponse = [];
  this.instanceId = null;
  this.onChangeInterval = null;
  this.ignoreValueChange = false;
  this.serviceUrl = options.serviceUrl;
  this.options = {
    autoSubmit:false,
    minChars:1,
    maxHeight:300,
    deferRequestBy:0,
    width:0,
    container:null
  };
  if(options){ Object.extend(this.options, options); }
  if(Autocomplete.isDomLoaded){
    this.initialize();
  }else{
    Event.observe(document, 'dom:loaded', this.initialize.bind(this), false);
  }
};

Autocomplete.instances = [];
Autocomplete.isDomLoaded = false;

Autocomplete.getInstance = function(id){
  var instances = Autocomplete.instances;
  var i = instances.length;
  while(i--){ if(instances[i].id === id){ return instances[i]; }}
};

Autocomplete.highlight = function(value, re){
  return value.replace(re, function(match){ return '<strong>' + match + '<\/strong>' });
};

Autocomplete.prototype = {

  killerFn: null,

  initialize: function() {
    var me = this;
    this.killerFn = function(e) {
      if (!$(Event.element(e)).up('.autocomplete')) {
        me.killSuggestions();
        me.disableKillerFn();
      }
    } .bindAsEventListener(this);

    if (!this.options.width) { this.options.width = this.el.getWidth(); }

    var div = new Element('div', { style: 'position:absolute;' });
    div.update('<div class="autocomplete-w1"><div class="autocomplete-w2"><div class="autocomplete" id="Autocomplete_' + this.id + '" style="display:none; width:' + this.options.width + 'px;"></div></div></div>');

    this.options.container = $(this.options.container);
    if (this.options.container) {
      this.options.container.appendChild(div);
      this.fixPosition = function() { };
    } else {
      document.body.appendChild(div);
    }

    this.mainContainerId = div.identify();
    this.container = $('Autocomplete_' + this.id);
    this.fixPosition();
    
    Event.observe(this.el, window.opera ? 'keypress':'keydown', this.onKeyPress.bind(this));
    Event.observe(this.el, 'keyup', this.onKeyUp.bind(this));
    Event.observe(this.el, 'blur', this.enableKillerFn.bind(this));
    Event.observe(this.el, 'focus', this.fixPosition.bind(this));
    this.container.setStyle({ maxHeight: this.options.maxHeight + 'px' });
    this.instanceId = Autocomplete.instances.push(this) - 1;
  },

  fixPosition: function() {
    var offset = this.el.cumulativeOffset();
    $(this.mainContainerId).setStyle({ top: (offset.top + this.el.getHeight() + 5) + 'px', left: offset.left + 'px' });
  },

  enableKillerFn: function() {
    Event.observe(document.body, 'click', this.killerFn);
  },

  disableKillerFn: function() {
    Event.stopObserving(document.body, 'click', this.killerFn);
  },

  killSuggestions: function() {
    this.stopKillSuggestions();
    this.intervalId = window.setInterval(function() { this.hide(); this.stopKillSuggestions(); } .bind(this), 300);
  },

  stopKillSuggestions: function() {
    window.clearInterval(this.intervalId);
  },

  onKeyPress: function(e) {
    if (!this.enabled) { return; }
    // return will exit the function
    // and event will not fire
    switch (e.keyCode) {
      case Event.KEY_ESC:
        this.el.value = this.currentValue;
        this.hide();
        break;
      case Event.KEY_TAB:
      case Event.KEY_RETURN:
        if (this.selectedIndex === -1) {
          this.hide();
          return;
        }
        this.select(this.selectedIndex);
        if (e.keyCode === Event.KEY_TAB) { return; }
        break;
      case Event.KEY_UP:
        this.moveUp();
        break;
      case Event.KEY_DOWN:
        this.moveDown();
        break;
      default:
        return;
    }
    Event.stop(e);
  },

  onKeyUp: function(e) {
    switch (e.keyCode) {
      case Event.KEY_UP:
      case Event.KEY_DOWN:
        return;
    }
    clearInterval(this.onChangeInterval);
    if (this.currentValue !== this.el.value) {
      if (this.options.deferRequestBy > 0) {
        // Defer lookup in case when value changes very quickly:
        this.onChangeInterval = setInterval((function() {
          this.onValueChange();
        }).bind(this), this.options.deferRequestBy);
      } else {
        this.onValueChange();
      }
    }
  },

  onValueChange: function() {
    clearInterval(this.onChangeInterval);
    this.currentValue = this.el.value;
    this.selectedIndex = -1;
    if (this.ignoreValueChange) {
      this.ignoreValueChange = false;
      return;
    }
    if (this.currentValue === '' || this.currentValue.length < this.options.minChars) {
      this.hide();
    } else {
      this.getSuggestions();
    }
  },

  getSuggestions: function() {
    var cr = this.cachedResponse[this.currentValue];
    if (cr && Object.isArray(cr.suggestions)) {
      this.suggestions = cr.suggestions;
      this.data = cr.data;
      this.suggest();
    } else if (!this.isBadQuery(this.currentValue)) {
      new Ajax.Request(this.serviceUrl, {
        parameters: { query: this.currentValue },
        onComplete: this.processResponse.bind(this),
        method: 'get'
      });
    }
  },

  isBadQuery: function(q) {
    var i = this.badQueries.length;
    while (i--) {
      if (q.indexOf(this.badQueries[i]) === 0) { return true; }
    }
    return false;
  },

  hide: function() {
    this.enabled = false;
    this.selectedIndex = -1;
    this.container.hide();
  },

  suggest: function() {
    if (this.suggestions.length === 0) {
      this.hide();
      return;
    }
    var content = [];
    var re = new RegExp('\\b' + this.currentValue.match(/\w+/g).join('|\\b'), 'gi');
    this.suggestions.each(function(value, i) {
      content.push((this.selectedIndex === i ? '<div class="selected"' : '<div'), ' title="', value, '" onclick="Autocomplete.instances[', this.instanceId, '].select(', i, ');" onmouseover="Autocomplete.instances[', this.instanceId, '].activate(', i, ');">', Autocomplete.highlight(value, re), '</div>');
    } .bind(this));
    this.enabled = true;
    this.container.update(content.join('')).show();
  },

  processResponse: function(xhr) {
    var response;
    try {
      response = xhr.responseText.evalJSON();
      if (!Object.isArray(response.data)) { response.data = []; }
    } catch (err) { return; }
    this.suggestions = response.suggestions;
    this.data = response.data;
    this.cachedResponse[response.query] = response;
    if (response.suggestions.length === 0) { this.badQueries.push(response.query); }
    if (response.query === this.currentValue) { this.suggest(); }
  },

  activate: function(index) {
    var divs = this.container.childNodes;
    var activeItem;
    // Clear previous selection:
    if (this.selectedIndex !== -1 && divs.length > this.selectedIndex) {
      divs[this.selectedIndex].className = '';
    }
    this.selectedIndex = index;
    if (this.selectedIndex !== -1 && divs.length > this.selectedIndex) {
      activeItem = divs[this.selectedIndex]
      activeItem.className = 'selected';
    }
    return activeItem;
  },

  deactivate: function(div, index) {
    div.className = '';
    if (this.selectedIndex === index) { this.selectedIndex = -1; }
  },

  select: function(i) {
    var selectedValue = this.suggestions[i];
    if (selectedValue) {
      this.el.value = selectedValue;
      if (this.options.autoSubmit && this.el.form) {
        this.el.form.submit();
      }
      this.ignoreValueChange = true;
      this.hide();
      this.onSelect(i);
    }
  },

  moveUp: function() {
    if (this.selectedIndex === -1) { return; }
    if (this.selectedIndex === 0) {
      this.container.childNodes[0].className = '';
      this.selectedIndex = -1;
      this.el.value = this.currentValue;
      return;
    }
    this.adjustScroll(this.selectedIndex - 1);
  },

  moveDown: function() {
    if (this.selectedIndex === (this.suggestions.length - 1)) { return; }
    this.adjustScroll(this.selectedIndex + 1);
  },

  adjustScroll: function(i) {
    var container = this.container;
    var activeItem = this.activate(i);
    var offsetTop = activeItem.offsetTop;
    var upperBound = container.scrollTop;
    var lowerBound = upperBound + this.options.maxHeight - 25;
    if (offsetTop < upperBound) {
      container.scrollTop = offsetTop;
    } else if (offsetTop > lowerBound) {
      container.scrollTop = offsetTop - this.options.maxHeight + 25;
    }
    this.el.value = this.suggestions[i];
  },

  onSelect: function(i) {
    (this.options.onSelect || Prototype.emptyFunction)(this.suggestions[i], this.data[i]);
  }

};

Event.observe(document, 'dom:loaded', function(){ Autocomplete.isDomLoaded = true; }, false);

function getWindowSize() {
	var array = [];
	var w = window;
	array.width = array[0] = w.innerWidth || (w.document.documentElement.clientWidth || w.document.body.clientWidth);
	array.height = array[1] = w.innerHeight || (w.document.documentElement.clientHeight || w.document.body.clientHeight);

	return array;
}