
var currentState = null;
var iterator = 1;

var ddlType_ctr;
var ddlMake_ctr;
var ddlModel_ctr;
var ddlSubModel_ctr;
var ddlLowYear_ctr;
var ddlHighYear_ctr;
var ddlCondition_ctr;
var ddlPrice_ctr;

window.dhtmlHistory.create({
	toJSON: function(o) {
		return JSON.stringify(o);
	}
	, fromJSON: function(s) {
		return JSON.parse(s);
	}
});

$(document).ready(function() {
	initialize();
});

function initialize() {

	init_form();
	dhtmlHistory.initialize();
	dhtmlHistory.addListener(historyChange);

	if ( typeof (dhtmlHistory.currentLocation) == 'undefined'
		|| dhtmlHistory.currentLocation == null
		|| dhtmlHistory.currentLocation == '' ) {
		loadBaseInventory();
	}

	if ( (dhtmlHistory.isChrome || dhtmlHistory.isIE ) && dhtmlHistory.currentLocation != '') {
		dhtmlHistory.fireHistoryEvent(dhtmlHistory.currentLocation);
	}
}

function init_form() {
	if (ddlType_ctr == null) ddlType_ctr = document.getElementById(ddlType);
	if (ddlMake_ctr == null) ddlMake_ctr = document.getElementById(ddlMake);
	if (ddlModel_ctr == null) ddlModel_ctr = document.getElementById(ddlModel);
	if (ddlSubModel_ctr == null) ddlSubModel_ctr = document.getElementById(ddlSubModel);
	if (ddlLowYear_ctr == null) ddlLowYear_ctr = document.getElementById(ddlLowYear);
	if (ddlHighYear_ctr == null) ddlHighYear_ctr = document.getElementById(ddlHighYear);
	if (ddlCondition_ctr == null) ddlCondition_ctr = document.getElementById(ddlCondition);
	if (ddlPrice_ctr == null) ddlPrice_ctr = document.getElementById(ddlPrice);

	if (currentState == null) {
		init_currentState();
		currentState.loadState(null);
		// addUrlToHistory(location.href);
	}
}

// basically to handle the gallery first time through
function loadBaseInventory ( ) {

	var url = getInventoryUrl() + getQueryString(currentState);

	if (isGallery == '1' && (typeof (dhtmlHistory.currentLocation) == 'undefined' || dhtmlHistory.currentLocation == '')) {
		url = appendParamDelimiterToUrl(url) + 'gl=1';
		isGallery = '0';
	}

	if ( typeof(divPage) != 'undefined' ) {
		var page_ctr = document.getElementById ( divPage );
			returnDataToContainer ( url, page_ctr, dhtmlHistory.currentLocation != '' );
		}
}

function loadInventory ()
{
	var url = document.URL;
	
	if ( url.indexOf ( '#' ) > 0 )
		url = url.substr ( 0, url.indexOf ( '#' ) );
	
	location.href = url;
}

function appendParamDelimiterToUrl ( theUrl )
{
	return theUrl + ( theUrl.indexOf ( '?' ) < 0 ? '?' : '&' );
}

function getQueryString(state) {

	var rv = '';

	if (state == null) {
//		if (currentState != null)
//			return getQueryString(currentState);
//		else 
			return '';
	} else {
		rv = '?typeFilter=' + escape(state.type)
			 + '&makeFilter=' + escape(state.make)
			 + '&modelFilter=' + escape(state.model)
			 + '&subModelFilter=' + escape(state.subModel)
			 + '&conditionFilter=' + escape(state.condition)
			 + '&minimumYearFilter=' + escape(state.minYear)
			 + '&maximumYearFilter=' + escape(state.maxYear)
			 + '&maxPriceFilter=' + escape(state.maxPrice)
			 + '&sortCommand=' + escape(state.sortCommand)
			 + '&sortDirection=' + escape(state.sortDirection)
			 + '&pageNumber=' + escape(state.page)
			 + '&phaseID=' + escape(state.phaseId);
	}

	return rv;
}

function init_currentState () {
	
	// not the cleanest implementation to have the default sort command set in two spots..
	// we could probably take it out of the application
	currentState = {
		type : typeof(typefilter) != 'undefined' && typefilter != null ? typefilter : "",
		make : typeof (makefilter) != 'undefined' && makefilter != null ? makefilter : "",
		model : typeof (modelfilter) != 'undefined' && modelfilter != null ? modelfilter : "",
		subModel: typeof (submodelfilter) != 'undefined' && submodelfilter != null ? submodelfilter : "",
		condition : typeof(defaultCondition) != 'undefined' && defaultCondition != null ? defaultCondition : "",
		minYear: typeof (minimumyearfilter) != 'undefined' && minimumyearfilter != null ? minimumyearfilter : "",
		maxYear: typeof (maximumyearfilter) != 'undefined' && maximumyearfilter != null ? maximumyearfilter : "",
		maxPrice: typeof (maxpricefilter) != 'undefined' && maxpricefilter != null ? maxpricefilter : "",
		sortCommand : typeof(sortcommand) != 'undefined' && sortcommand != null ? sortcommand : "make",
		sortDirection: typeof (sortdirection) != 'undefined' && sortdirection != null ? sortcommand : "",
		page : typeof (pagenumber) != 'undefined' && pagenumber != null ? pagenumber : "",
		phaseId : typeof (phaseid) != 'undefined' && phaseid != null ? phaseid : "",
		id : 1
	};

	currentState.toJSONString = function() {
		return JSON.stringify(this);
	}
		
	currentState.loadState = function ( sender ) {
			
		if ( ddlType_ctr != null )
			currentState.type = ddlType_ctr.value;
		
		if ( sender && ( sender.id == ddlType ) )//|| sender.id == ddlCondition ) )
			currentState.make = '';
		else
			currentState.make = ddlMake_ctr.value;
		
		currentState.condition = ddlCondition_ctr[ddlCondition_ctr.selectedIndex].value;
		currentState.maxPrice = ddlPrice_ctr.value;

		if ( sender == null || ( sender.id != ddlType && sender.id != ddlMake && sender.id != ddlCondition ) ) {
			currentState.model = ddlModel_ctr.value;
			currentState.subModel = ddlSubModel_ctr.value;
			currentState.minYear = ddlLowYear_ctr.value;
			currentState.maxYear = ddlHighYear_ctr.value;
		}
		else {
			currentState.model = '';
			currentState.subModel = '';
			currentState.minYear = 0;
			currentState.maxYear = 0;
		}
		
		if ( typeof(defaultPhaseID) != 'undefined' && defaultPhaseID != null )
			currentState.phaseId = defaultPhaseID;
	}
}

function doSearch ()
{
	currentState.loadState ( null );
	currentState.page = 1;

	var url = getInventoryUrl () + getQueryString (currentState);

	if ( typeof(divPage) != 'undefined' ) {	
		var page_ctr = document.getElementById ( divPage );
		returnDataToContainer ( url, page_ctr );
	}
	
	addUrlToHistory ( url );
}

function historyChange(newLocation, historyData) {

	if (typeof (newLocation) != 'undefined' && newLocation != null && parseInt(newLocation) > iterator) {
		iterator = parseInt(newLocation) + 1;
	}

	var newUrl = getInventoryUrl();

	if (historyData != null) {
		var lastState = JSON.parse(historyData);
		lastState.toJSONString = function() {
			return JSON.stringify(this);
		}
		
		newUrl += getQueryString(lastState);
		currentState = lastState;
	}
	else {
		init_currentState();
		newUrl += getQueryString(currentState);
	}

	var page_ctr = document.getElementById(divPage);
	returnDataToContainer(newUrl, page_ctr, true);	
}

function returnDataToContainer ( path, ctr, handleJson ) {

	$.ajax({
		type: "GET",
		url: path,
		success: function(response) {
			var sc_index = response.indexOf(';') + 1;
			var json = response.substr(0, sc_index);

			if (handleJson == null || handleJson)
				handleSearchJson(json, null);

			var trimmedRe = response.substr(sc_index, response.length - sc_index);
			sc_index = trimmedRe.indexOf(';') + 1;
			var statusChanges = trimmedRe.substr(0, sc_index)
			eval(statusChanges);
			ctr.innerHTML = trimmedRe.substr(sc_index, trimmedRe.length - sc_index);
		}
	});
}

function cascadeSelection ( sender )
{
	currentState.loadState ( sender );

	if (sender) {
		if (sender.id == ddlModel) {
			currentState.minYear = 0;
			currentState.maxYear = 0;
		}

		$.ajax({
			type: "GET",
			url: getInventoryHandlerUrl() + getQueryString(currentState),
			success: function(msg) {
				handleSearchJson(msg, sender);
			}
		});
	}
}

function handleSearchJson ( json, sender )
{
	eval( 'var newList = ' + json );

	relistYear (newList);
		
	if ( typeof(sender) != 'undefined' && sender ) {
	
		switch ( sender.id ) {
			case ddlType:
				relistMake (newList);
				emptyList ( ddlModel_ctr, 1 );
				emptyList ( ddlSubModel_ctr, 1 );
				break;
			case ddlMake: 
				if ( sender.value == '' )
					emptyList ( ddlModel_ctr, 1 );
				else
					relistModel (newList);
				
				emptyList ( ddlSubModel_ctr, 1 );
				break;
			case ddlModel: 
				if ( sender.value == '' )
					emptyList ( ddlSubModel_ctr, 1 )
				else
					relistSubModel (newList);
				
				break;
			case ddlCondition:
				/*relistMake ( newList );
				emptyList ( ddlModel_ctr, 1 );			
				emptyList ( ddlSubModel_ctr, 1 ); */
				break;
		}
	}
	else {
		
	
		// this case should only occur when baseLoadState is triggered
		if ( currentState.type == '' && currentState.make == '' 
			&& currentState.model == '' ) {
			relistMake ( newList );
			
			emptyList ( ddlModel_ctr, 1 );
			emptyList ( ddlSubModel_ctr, 1 );
			
			if ( ddlMake_ctr.options.length > 0 )
				ddlMake_ctr.options[0].selected = true;
				
			if ( ddlLowYear_ctr.options.length > 0 )
				ddlLowYear_ctr.options[0].selected = true;
				
			ddlHighYear_ctr.options[ddlHighYear_ctr.options.length - 1].selected = true;
					
			if ( currentState.maxPrice == 0 && ddlPrice_ctr.options.length > 0 )
				ddlPrice_ctr.options[0].selected = true;
					
			if ( typeof(defaultCondition) != 'undefined' 
				&& defaultCondition != '' )
				selectOption ( ddlCondition_ctr, defaultCondition );
		}			
		else if ( currentState.make != '' && currentState.model == '' ) {
		selectOption(ddlMake_ctr, currentState.make);
			relistModel(newList);
			relistSubModel(newList);
		}
		else if ( currentState.model != '' && currentState.subModel == '' ) {
			selectOption ( ddlModel_ctr, currentState.model );
			relistSubModel ( newList );
		}
		else if (currentState.subModel != '')
			selectOption(ddlSubModel_ctr, currentState.subModel);
	}
}

function selectOption ( ctr, value )
{
	for ( var i = 0; i < ctr.options.length; i++ ) {
		if ( ctr.options[i].value == value ||
			ctr.options[i].text == value ) {
			ctr.options[i].selected = true;
			return;
		}
	}
}

function emptyList ( ddl, offset )
{
	while ( ddl.options.length > offset )
		ddl.options[offset] = null;
}

function refillList ( ddl, list, offset, reselect )
{	
	var selection = ddl.value != '' ? ddl.value : ddl.text;
	var new_sel = -1;

	emptyList ( ddl, offset );

	if ( list == null )
		return;

	for ( var i=0; i < list.length; i++ )
	{		
		ddl.options[i+offset] = new Option ( list[i].text );
		
		if ( list[i].value != null )
			ddl.options[i+offset].value = list[i].value;
		else
			ddl.options[i+offset].value = list[i].text;
				
		if ( typeof(selection) != 'undefined' && ( list[i].value == selection || 
			list[i].text == selection ) && reselect && new_sel < 0 )
		{
			ddl.options[i+offset].selected = true;
			var new_sel = i+offset;
		}
	}
}

function relistYear ( list )
{
	if ( list.year == undefined )
		return;


	refillList ( ddlLowYear_ctr, list.year, 0, true );
	refillList ( ddlHighYear_ctr, list.year, 0, true );
	
	if ( ddlLowYear_ctr.options.length > 0 ) {
		ddlLowYear_ctr.options[0].selected = true;
		ddlHighYear_ctr.options[ddlHighYear_ctr.options.length - 1].selected = true;
	}
}

function relistPrice ( list )
{
	if ( list.price == undefined )
	{
		emptyList ( ddlPrice_ctr, 1 );
		return;
	}

	refillList ( ddlPrice_ctr, list.price, 1, true );
}

function relistMake ( list )
{
	if ( list.make == undefined )
		return;

	refillList(ddlMake_ctr, list.make, 1, false);
}

function relistModel ( list )
{
	if ( list.model == undefined )
		return;

	refillList(ddlModel_ctr, list.model, 1, false);
}

function relistSubModel ( list )
{
	if ( list.submodel == undefined )
		return;
		
	refillList ( ddlSubModel_ctr, list.submodel, 1, false );
}


function resort( sender )
{
	if ( currentState.sortCommand.toLowerCase () == sender.id.toLowerCase () ) {
		currentState.sortDirection = currentState.sortDirection == "asc" 
				|| currentState.sortDirection == "" ? "desc" : "asc";
	}
	else {
		currentState.sortDirection = "";
		currentState.sortCommand = sender.id;
	}
	
	var query = getInventoryUrl () + getQueryString ( currentState );

	if ( divPage != undefined ) {	
		var page_ctr = document.getElementById ( divPage );
		returnDataToContainer ( query, page_ctr );
		
		addUrlToHistory ( query );
	}
}

function requeryBySelection ( value, type, overwrite )
{
	if ( overwrite ) {
		currentState.make  = '';
		currentState.model = '';
		currentState.subModel = '';
		currentState.minYear = 0;
		currentState.maxYear = 0;
	}
	
	currentState.page = 1;

	eval ( 'currentState.' + type + '="' + value + '"' );

	var query = getInventoryUrl () + getQueryString ( currentState );

	if ( divPage != undefined ) {	
		var page_ctr = document.getElementById ( divPage );
		returnDataToContainer ( query, page_ctr );
		
		addUrlToHistory ( query );
	}
}

function addUrlToHistory ( historyUrl )
{
	var index = historyUrl.indexOf ('?');

	if ( index < 0 ) index = historyUrl.length;

	currentState.id = iterator;
	
	dhtmlHistory.add(iterator.toString(), currentState.toJSONString());
	iterator += 1;
}

function navigateToPage ( where )
{
	goToPage ( currentState.page + where );
	window.scrollTo ( 0, 0 );
}

function goToPage ( num )
{
	currentState.page = num;

	var query = getInventoryUrl () + getQueryString ( currentState );
	
	if ( divPage != undefined ) {	
		var page_ctr = document.getElementById ( divPage );
		returnDataToContainer ( query, page_ctr );
		
		addUrlToHistory ( query );
	}
	
	window.scrollTo ( 0, 0 );
}