var jq = jQuery;
// Navigation
function clearDeSearchfVal(myObj){
	if(myObj.value=='search by make, model, etc.') myObj.value='';
}
function restoreDefVal(myObj){
	if(myObj.value=='') {
		if (jq.trim(jq('.activeSearch').text()) == 'Autos')
			myObj.value='search by make, model, etc.';
		else
			myObj.value='Search Here';
	}
}
function nav_init(actTab){

	if(actTab != '') {
		jq('ul.top_nav li.nav_item:eq(' + actTab + ')').addClass('actTab');
	}
	
	jq('#head_nav ul.top_nav > li').each(function(){
		var liNode = jq(this);
		liNode.find('a.top_link')
			.bind('mouseover',function(){
				obj = jq(this).parent();
				if (obj.showtimer) nav_killTimer(obj);
				jq('#head_nav ul.top_nav > li').each(function(){
					jq(this).removeClass('dd_open');
				});
				obj.addClass('dd_open');
			})
			.bind('mouseout',function(){
				nav_startTimer(obj);
			});
		liNode.find('ul.sub_nav')
			.before(jq('<iframe src="blank.html"></iframe>'))
			.find('li a').each(function(){
				jq(this).parent().parent().hide()
				obj = jq(this).parent().parent().parent();
				jq(this).bind('mouseover',function(){
					nav_killTimer(obj);
				}).bind('mouseout',function(){
					nav_startTimer(obj);
				});
			});
		}).end();
		jq('#head_nav iframe').each(function(){
			jq(this).attr('height',jq(this).next().height()).attr('width',jq(this).next().width())
		})

	var formObj = jq('#nav_search');
	var queryObj = jq('#nav_search').find(':first');
	queryObj.attr('disabled','');
	formObj.bind('submit',function(){
		if (queryObj.val() == 'search by make, model, etc.' || queryObj.val() == 'Search Here') {
			queryObj.val('');
		}
	});

	jq(document).ready(function(){
		queryObj.bind('blur',function(){restoreDefVal(this);jq(this).css({color:'#b6b8bb'})});
		queryObj.bind('click',function(){clearDeSearchfVal(this);jq(this).css({color:'#000'})});
		jq('.webMenu > li a.nav_search').each(function(){
			if (jq(this).text() != 'Autos') {
				jq(this).bind('click',function(){nav_submitLink(this);return false;});
			} else {
				jq(this).bind('click',function(){return false;});
			}
		});
	});
}
function nav_startTimer(obj){
	obj.showtimer = setTimeout(
	function(){
		nav_killTimer(obj);
		obj.removeClass('dd_open');
	},250);
}
function nav_killTimer(obj){
	if (obj.showtimer) {
		clearInterval(obj.showtimer);
		obj.showtimer = null;
	}
}
function nav_submitLink(obj) {
	var lObj = jq('#topquery');
	if(lObj.val() == 'search by make, model, etc.') {
		lObj.val();
	}
	var oAct = jq('#nav_search').attr('action');
	jq('#nav_search').attr('action',jq(obj).attr('href')).attr('target',jq(obj).attr('target'));
	jq('#nav_search').submit();
	jq('#nav_search').attr('action',oAct).attr('target','');
	return false;
}
function nav_setActive(obj) {
	jq('.webMenu > li a.nav_search').each(function(){
		jq(this).parent().attr('class','inactiveSearch');
	});
	jq(obj).parent().attr('class','activeSearch');
	jq('#nav_search').attr('target',jq(obj).attr('target'));
	jq('#nav_search').attr('action',jq(obj).attr('href'));
	if (jq(obj).text() == 'Autos')
		jq('#topquery').attr('value','search by make, model, etc.');
	else
		jq('#topquery').attr('value','Search Here');
	if (jq('#smore').css('display') == 'block') {
		jq('#smore').hide();
	}
}

/*** JS required for Smart Box : Starts ***/

/**
 *  author:		Radhakrishna
 *	version:	1.0 - 2008-12-29
 *
 */

if (typeof(bsn) == "undefined")
_b = bsn = {};


if (typeof(_b.Autosuggest) == "undefined")
_b.Autosuggest = {};
else
alert("Autosuggest is already set!");


_b.AutoSuggest = function (id, param)
{
// no DOM - give up!
//
if (!document.getElementById)
	return 0;	

// get field via DOM
this.fld = _b.DOM.gE(id);

if (!this.fld)
	return 0;	

// init variables
this.sInp 	= "";
this.nInpC 	= 0;
this.aSug 	= [];
this.iHigh 	= 0;

// parameters object
this.oP = param ? param : {};	

// defaults	
var k, def = {minchars:1, meth:"get", varname:"query", className:"autosuggest", timeout:2500, delay:10, offsety:-5, shownoresults: true, noresults: "No results!", maxheight: 250, cache: true, maxentries: 25};
for (k in def)
{
	if (typeof(this.oP[k]) != typeof(def[k]))
		this.oP[k] = def[k];
}

// set keyup handler for field
// and prevent autocomplete from client
var p = this;

// NOTE: not using addEventListener because UpArrow fired twice in Safari
//_b.DOM.addEvent( this.fld, 'keyup', function(ev){ return pointer.onKeyPress(ev); } );	
this.fld.onkeypress 	= function(ev){ return p.onKeyPress(ev); };
this.fld.onkeyup 		= function(ev){ return p.onKeyUp(ev); };

this.fld.setAttribute("autocomplete","off");
};

_b.AutoSuggest.prototype.onKeyPress = function(ev)
{
var key = (window.event) ? window.event.keyCode : ev.keyCode;
// set responses to keydown events in the field
// this allows the user to use the arrow keys to scroll through the results
// ESCAPE clears the list
// TAB sets the current highlighted value
var RETURN = 13;
var TAB = 9;
var ESC = 27;

var bubble = 1;
switch(key)
{
	case RETURN:
		this.selectCurrent();
		bubble = 0;
		break;

	case ESC:
		this.clearSuggestions();
		break;
}
return bubble;
};

_b.AutoSuggest.prototype.onKeyUp = function(ev)
{
var key = (window.event) ? window.event.keyCode : ev.keyCode;	
// set responses to keydown events in the field
// this allows the user to use the arrow keys to scroll through the results
// ESCAPE clears the list
// TAB sets the current highlighted value
//

var ARRUP = 38;  //up arrow
var ARRDN = 40;  //down arrow	
var bubble = 1;

switch(key)
{
	case ARRUP:
		this.changeHighlight(key);
		bubble = 0;
		break;

	case ARRDN:
		this.changeHighlight(key);
		bubble = 0;
		break;
		
	default:
		this.getSuggestions(this.fld.value);
}
return bubble;
};

_b.AutoSuggest.prototype.getSuggestions = function (val)
{

// if input stays the same, do nothing
if (val == this.sInp)
	return 0;

// kill list
_b.DOM.remE(this.idAs);

this.sInp = val;	
// input length is less than the min required to trigger a request
// do nothing
if (val.length < this.oP.minchars)
{
	this.aSug = [];
	this.nInpC = val.length;
	return 0;
}

var ol = this.nInpC; // old length
this.nInpC = val.length ? val.length : 0;

// if caching enabled, and user is typing (ie. length of input is increasing)
// filter results out of aSuggestions from last request
var l = this.aSug.length;	
var pointer = this;
var input = this.sInp;
clearTimeout(this.ajID);
this.ajID = setTimeout( function() { pointer.doAjaxRequest(input) }, this.oP.delay );

return false;
};

_b.AutoSuggest.prototype.doAjaxRequest = function (input)
{
// check that saved input is still the value of the field
if (input != this.fld.value)
	return false;

var pointer = this;	

// create ajax request	
var url = this.oP.script+"?"+this.oP.varname+"="+encodeURIComponent(this.sInp);	

if (!url)
	return false;

var meth = this.oP.meth;
var input = this.sInp;

var onSuccessFunc = function (req) { pointer.setSuggestions(req, input) };
var onErrorFunc = function (status) { /*alert("AJAX error: "+status);*/ };

var myAjax = new _b.Ajax();

myAjax.makeRequest( url, meth, onSuccessFunc, onErrorFunc );
};

_b.AutoSuggest.prototype.setSuggestions = function (req, input)
{
// if field input no longer matches what was passed to the request
// don't show the suggestions
if (input != this.fld.value)
	return false;

this.aSug = [];	
if (this.oP.json)
{
	var jsondata = eval('(' + req.responseText + ')');
	jsonDataLen = jsondata.length;
	for (var i=0;i<jsonDataLen;i++)		{
		this.aSug.push(jsondata[i]);
	}
}	
this.idAs = "as_"+this.fld.id;
this.createList(this.aSug);
};

_b.AutoSuggest.prototype.selectCurrent = function()
{	
	var li = $j("li.as_highlight", _b.DOM.gE("as_ul"))[0];
	if (!li) {
			li = document.createElement("li");
			li.extra = [];
			li.selectValue = "";
	}
	this.setHighlightedValue(li);
	return true;
};

_b.AutoSuggest.prototype.createList = function(arr)
{
var pointer = this;

// get rid of old list
// and clear the list removal timeout
_b.DOM.remE(this.idAs);
this.killTimeout();

// if no results, and shownoresults is false, do nothing
if (arr.length == 0 && !this.oP.shownoresults)
	return false;

// create holding div
var div = _b.DOM.cE("div", {id:this.idAs, className:this.oP.className});	

// create and populate ul
var ul = _b.DOM.cE("ul", {id:"as_ul"});

// loop throught arr of suggestions
// creating an LI element for each suggestion
for (var i=0;i<arr.length;i++)
{
	// format output with the input enclosed in a EM element
	// (as HTML, not DOM)
	var liText=arr[i];
	var li = _b.DOM.cE(  "li", {className:"li"}, liText  );
	ul.appendChild( li );

	$j(li).hover(
			function() { $j("li",  ul).removeClass("as_highlight"); $j(this).addClass("as_highlight"); 	},
			function() { $j(this).removeClass("as_highlight"); }
		).click(function(e) { 
				pointer.selectCurrent();

		});
}
// no results
if (arr.length == 0 && this.oP.shownoresults)
{
	var li = _b.DOM.cE(  "li", {className:"as_highlight"}, this.oP.noresults  );
	ul.appendChild( li );
}

	div.appendChild( ul );
	
	// get position of target textfield
	// position holding div below it
	// set width of holding div to width of field
	//
	
	var pos = _b.DOM.getPos(this.fld);	
	
	if($j.browser.msie)
	{		
		div.style.left 		= (pos.x + 1)+ "px";
		div.style.top 		= ( pos.y + this.fld.offsetHeight + 1) + "px";		
	}	
	else{
		div.style.left 		= (pos.x)+ "px";		
		div.style.top 		=	( pos.y + this.fld.offsetHeight ) + "px";
	}
	div.style.width 	= (this.fld.offsetWidth-2)+ "px";	
	// set mouseover functions for div
	// when mouse pointer leaves div, set a timeout to remove the list after an interval
	// when mouse enters div, kill the timeout so the list won't be removed
	//
	div.onmouseover 	  = function(){ pointer.killTimeout() };
	div.onmouseout 		  = function(){ pointer.resetTimeout() };
	document.body.onclick = function(){ pointer.resetTimeout() };
	// add DIV to document
	document.getElementsByTagName("body")[0].appendChild(div);	
		
	// currently no item is highlighted
	this.iHigh = 0;
	
	// remove list after an interval
	var pointer = this;
	this.toID = setTimeout(function () { pointer.clearSuggestions(); }, this.oP.timeout);
};

_b.AutoSuggest.prototype.changeHighlight = function(key)
{	
var list = _b.DOM.gE("as_ul");
if (!list)
	return false;

var n;

if (key == 40)
	n = this.iHigh + 1;
else if (key == 38)
	n = this.iHigh - 1;


if (n > list.childNodes.length)
	n = list.childNodes.length;
if (n < 1)
	n = 1;
//alert('select item='+n);

this.setHighlight(n);
};

_b.AutoSuggest.prototype.setHighlight = function(n)
{
//var Rlist = _b.DOM.gE("as_ul");
var list = $j("li",  _b.DOM.gE("as_ul"));
if (!list)
	return false;

if (this.iHigh > 0)
	this.clearHighlight();

this.iHigh = Number(n);

$j(list[this.iHigh - 1]).addClass("as_highlight");

this.killTimeout();
};


_b.AutoSuggest.prototype.clearHighlight = function()
{
var list = $j("li",  _b.DOM.gE("as_ul"));
if (!list)
	return false;

if (this.iHigh > 0)
{
	$j(list[this.iHigh-1]).removeClass("as_highlight");
	this.iHigh = 0;
}
};

_b.AutoSuggest.prototype.setHighlightedValue = function (li)
{		
	var v = $j.trim(li.selectValue ? li.selectValue : li.innerHTML);		
	if(v=="")
		v = this.fld.value;		
	
	this.sInp = this.fld.value = v;
	this.clearSuggestions();		
	this.fld.focus();

	// submit form on selection of list item
	if (this.oP.formId)
	{
		$j("#"+this.oP.formId).submit();
	}
	else{
		$j("#nav_search").submit();
	}

};


_b.AutoSuggest.prototype.killTimeout = function()
{
clearTimeout(this.toID);
};

_b.AutoSuggest.prototype.resetTimeout = function()
{
clearTimeout(this.toID);
var pointer = this;
this.toID = setTimeout(function () { pointer.clearSuggestions() }, 1000);
};


_b.AutoSuggest.prototype.clearSuggestions = function ()
{

this.killTimeout();

var ele = _b.DOM.gE(this.idAs);
var pointer = this;
if (ele)
{
	var fade = new _b.Fader(ele,1,0,250,function () { _b.DOM.remE(pointer.idAs) });
}
};


//AJAX PROTOTYPE _____________________________________________

if (typeof(_b.Ajax) == "undefined")
_b.Ajax = {};

_b.Ajax = function ()
{
this.req = {};
this.isIE = false;
};

_b.Ajax.prototype.makeRequest = function (url, meth, onComp, onErr)
{

if (meth != "POST")
	meth = "GET";

this.onComplete = onComp;
this.onError = onErr;

var pointer = this;

// branch for native XMLHttpRequest object
if (window.XMLHttpRequest)
{
	this.req = new XMLHttpRequest();
	this.req.onreadystatechange = function () { pointer.processReqChange() };
	this.req.open("GET", url, true); //
	this.req.send(null);
// branch for IE/Windows ActiveX version
}
else if (window.ActiveXObject)
{
	this.req = new ActiveXObject("Microsoft.XMLHTTP");
	if (this.req)
	{
		this.req.onreadystatechange = function () { pointer.processReqChange() };
		this.req.open(meth, url, true);
		this.req.send();
	}
}
};

_b.Ajax.prototype.processReqChange = function()
{

// only if req shows "loaded"
if (this.req.readyState == 4) {
	// only if "OK"
	if (this.req.status == 200)
	{
		this.onComplete( this.req );
	} else {
		this.onError( this.req.status );
	}
}
};


//DOM PROTOTYPE _____________________________________________

if (typeof(_b.DOM) == "undefined")
_b.DOM = {};

/* create element */
_b.DOM.cE = function ( type, attr, cont, html )
{
var ne = document.createElement( type );
if (!ne)
	return 0;
	
for (var a in attr)
	ne[a] = attr[a];

var t = typeof(cont);

if (t == "string" && !html)
	ne.appendChild( document.createTextNode(cont) );
else if (t == "string" && html)
	ne.innerHTML = cont;
else if (t == "object")
	ne.appendChild( cont );

return ne;
};

/* get element */
_b.DOM.gE = function ( e )
{
var t=typeof(e);
if (t == "undefined")
	return 0;
else if (t == "string")
{
	var re = document.getElementById( e );
	if (!re)
		return 0;
	else if (typeof(re.appendChild) != "undefined" )
		return re;
	else
		return 0;
}
else if (typeof(e.appendChild) != "undefined")
	return e;
else
	return 0;
};

/* remove element */
_b.DOM.remE = function ( ele )
{
var e = this.gE(ele);

if (!e)
	return 0;
else if (e.parentNode.removeChild(e))
	return true;
else
	return 0;
};

/* get position */
_b.DOM.getPos = function ( e )
{
var e = this.gE(e);

var obj = e;

var curleft = 0;

if (obj.offsetParent)
{
	while (obj.offsetParent)
	{
		curleft += obj.offsetLeft;
		obj = obj.offsetParent;

	}
}
else if (obj.x)
	curleft += obj.x;

var obj = e;

var curtop = 0;
if (obj.offsetParent)
{
	while (obj.offsetParent)
	{
		curtop += obj.offsetTop;
		obj = obj.offsetParent;
	}
}
else if (obj.y)
	curtop += obj.y;

return {x:curleft, y:curtop};
};

//FADER PROTOTYPE _____________________________________________

if (typeof(_b.Fader) == "undefined")
_b.Fader = {};

_b.Fader = function (ele, from, to, fadetime, callback)
{	
if (!ele)
	return 0;

this.e = ele;

this.from = from;
this.to = to;

this.cb = callback;

this.nDur = fadetime;
	
this.nInt = 50;
this.nTime = 0;

var p = this;
this.nID = setInterval(function() { p._fade() }, this.nInt);
};


_b.Fader.prototype._fade = function()
{
this.nTime += this.nInt;

var ieop = Math.round( this._tween(this.nTime, this.from, this.to, this.nDur) * 100 );
var op = ieop / 100;

if (this.e.filters) // internet explorer
{
	try
	{
		this.e.filters.item("DXImageTransform.Microsoft.Alpha").opacity = ieop;
	} catch (e) { 
		// If it is not set initially, the browser will throw an error.  This will set it if it is not set yet.
		this.e.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity='+ieop+')';
	}
}
else // other browsers
{
	this.e.style.opacity = op;
}


if (this.nTime == this.nDur)
{
	clearInterval( this.nID );
	if (this.cb != undefined)
		this.cb();
}
};

_b.Fader.prototype._tween = function(t,b,c,d)
{
return b + ( (c-b) * (t/d) );
};
/*** JS required for Smart Box : Ends ***/
