/*
	AJAX-Search-Mask-Refresh

	Last modification 14.06.2011 by JeDu

	Tested in FF2, FF3.5, IE6, IE7, IE8, OP9.6, SF4b
*/

// Translates dealer group query string parameter names to vehicle server query string parameter names.
var mdxParamTranslate = {
	'bauart': 'build',
	'farbe': 'color',
	'age': 'days_in_stock',
	'dealer_country': 'dealerCountry',
	'customer': 'dkey',
	'company_car': 'companyCar',
	'doors_grouped': 'doors',
	'tueren': 'doors',
	'euronorm': 'euroNorm',
	'antrieb': 'gears',
	'getriebe': 'gears',
	'km_ab': 'km_from',
	'km_bis': 'km_to',
	'kw_ab': 'kw_from',
	'kw_bis': 'kw_to',
	'hersteller': 'manufacturer',
	'preis_ab': 'price_from',
	'preis_bis': 'price_to',
	'ez_ab': 'reg_date_from',
	'ez_bis': 'reg_date_to',
	'fart': 'selltype',
	'warranty_program': 'warranty'
};

var mdxCustomSelectFields = {
	'customer': { updateOptions: function (elem, json, q) { return elem.selectedIndex; } },
	'sort': { updateOptions: function (elem, json, q) { return elem.selectedIndex; } },
	'radius': { updateOptions: function (elem, json, q) { return elem.selectedIndex; } },
	'bauart': {
		updateOptions: function (elem, json, q)
		{
			mdxClearOptions(elem);

			var selectedIndex = 0;
			var id;
			var ctypes = {};
			var noOfCtypes = json['ctype'] ? jsonArrayLength(json['ctype']['option']) : 0;
			var optgroups = elem.getElementsByTagName('optgroup');
			var option;

			for (var i = optgroups.length - 1; i >= 0; i--)
			{
				elem.removeChild(optgroups[i]);
			}

			if (json['ctype'])
			{
				for (var i = 0; i < noOfCtypes; i++)
				{
					id = jsonArray(json['ctype']['option'], i)['@value'];
					ctypes[id] = document.createElement('optgroup');
					ctypes[id].label = jsonArray(json['ctype']['option'], i)['#'];
				}
			}

			if (json['build'])
			{
				for (var i = 0; i < jsonArrayLength(json['build']['option']); i++)
				{
					var option = document.createElement('option');
					option.value = jsonArray(json['build']['option'], i)['@value'];
					option.text = jsonArray(json['build']['option'], i)['#'];
					option.selected = jsonArray(json['build']['option'], i)['@selected'];
					ctypes[jsonArray(json['build']['option'], i)['@ctype']].appendChild(option);
					option.innerHTML = jsonArray(json['build']['option'], i)['#'];

					if (jsonArray(json['build']['option'], i)['@selected'] === 'yes')
					{
						selectedIndex = i + 1;
					}
				}
			}

			for (var i in ctypes)
			{
				elem.appendChild(ctypes[i]);
			}

			return selectedIndex;
		}
	},
	'doors_grouped': {
		updateOptions: function (elem, json, q)
		{
			mdxClearOptions(elem);

			if (json['doors'])
			{
				var group23Available = false;
				var group45Available = false;

				for (var i = 0; i < jsonArrayLength(json['doors']['option']); i++)
				{
					switch (jsonArray(json['doors']['option'], i)['@value'])
					{
						case '2':
						case '3':
							group23Available = true;
							break;
						case '4':
						case '5':
							group45Available = true;
					}
				}

				if (group23Available) { mdxAddOption(elem, '2||3', '2/3' + mdxGetTranslation('doors'), q['doors'] === '2||3'); }
				if (group45Available) { mdxAddOption(elem, '4||5', '4/5' + mdxGetTranslation('doors'), q['doors'] === '4||5'); }

				switch (q['doors'])
				{
					case '2||3': return 1;
					case '4||5': return 2;
				}
			}
			return 0;
		}
	},
	'first_reg_age': {
		updateOptions: function (elem, json, q)
		{
			mdxClearOptions(elem);

			var selectedIndex = 0;
			if (json['reg_date_from'] || json['reg_date_to'])
			{
				var regDateFrom = parseInt((json['reg_date_from'] ? jsonArray(json['reg_date_from']['option'], 0) : jsonArray(json['reg_date_to']['option'], 0))['@value'], 10);
				var regDateTo = parseInt((json['reg_date_to'] ? jsonArray(json['reg_date_to']['option'], jsonArrayLength(json['reg_date_to']['option']) - 1) : jsonArray(json['reg_date_to']['option'], jsonArrayLength(json['reg_date_to']['option']) - 1))['@value'], 10); 
				var thisYear = (new Date()).getFullYear();
				var selectedYear = 0;

				if (json['reg_date_from'])
				{
					for (var i = 0; i < jsonArrayLength(json['reg_date_from']['option']); i++)
					{
						if (jsonArray(json['reg_date_from']['option'], i)['@selected'] === 'yes')
						{
							selectedYear = jsonArray(json['reg_date_from']['option'], i)['@value'];
							break;
						}
					}
				}

				for (var i = regDateTo, j = 1; i > regDateFrom; i--, j++)
				{
					if ((i - 1) === selectedYear) { selectedIndex = j; }
					mdxAddOption(
						elem,
						(i - 1) + '-01-01',
						(thisYear - i) + 1,
						((i - 1) === selectedYear)
					);
				}
			}
			return selectedIndex;
		}
	},
	'reg_date_from': { /* as well as 'reg_date_from', 'ez_ab', 'ez_bis', 'doors' referenced after the object declaration */
		updateOptions: function (elem, json, q)
		{
			mdxClearOptions(elem);

			var name = mdxParamTranslate[elem.name] || elem.name;
			var selectedIndex = 0;
			if (json[name])
			{
				var text = '';
				for (var i = 0; i < jsonArrayLength(json[name]['option']); i++)
				{
					switch (name)
					{
						case 'reg_date_from':	text = mdxGetTranslation('from') + jsonArray(json[name]['option'], i)['#']; break;
						case 'reg_date_to':		text = mdxGetTranslation('to') + jsonArray(json[name]['option'], i)['#']; break;
						case 'doors':			text = jsonArray(json[name]['option'], i)['#'] + mdxGetTranslation('doors'); break;
						default:
							text = jsonArray(json[name]['option'], i)['#'];
					}

					mdxAddOption(
						elem,
						jsonArray(json[name]['option'], i)['@value'],
						text,
						jsonArray(json[name]['option'], i)['@selected']
					);
					if (jsonArray(json[name]['option'], i)['@selected'] === 'yes')
					{
						selectedIndex = i + 1;
					}
				}
			}
			return selectedIndex;
		}
	}
};
mdxCustomSelectFields['build'] = mdxCustomSelectFields['bauart'];
mdxCustomSelectFields['reg_date_to'] = mdxCustomSelectFields['reg_date_from'];
mdxCustomSelectFields['doors'] = mdxCustomSelectFields['reg_date_from'];
mdxCustomSelectFields['ez_ab'] = mdxCustomSelectFields['reg_date_from']; // mdxCustomSelectFields['first_reg_age'];
mdxCustomSelectFields['ez_bis'] = mdxCustomSelectFields['reg_date_to'];

var mdxCustomExtras = {
	'seven_seats': {
		isAvailable: function (json, q)
		{
			if (json['seats'])
			{
				var value;
				for (var i = 0; i < jsonArrayLength(json['seats']['option']); i++)
				{
					value = jsonArray(json['seats']['option'], i)['@value'];
					if (value === '7') { return true; }
				}
			}
			return false;
		},
		isChecked: function (json, q)
		{
			return (q['seats'] === '7');
		},
		setQuery: function (q, checked)
		{
			if (checked) { q['seats'] = '7'; }
		}
	},
	'automatic': {
		isAvailable: function (json, q)
		{
			if (json['gears'])
			{
				var value;
				for (var i = 0; i < jsonArrayLength(json['gears']['option']); i++)
				{
					value = jsonArray(json['gears']['option'], i)['@value'];
					if (value === '1' || value === '7' || value === '1||7') { return true; }
				}
			}
			return false;
		},
		checked: false,
		isChecked: function (json, q)
		{
			return this.checked;
		},
		setQuery: function (q, checked)
		{
			if (checked) { q['gears'] = '1||7'; }
			this.checked = checked;
		}
	}
};

function mdxRefreshSearchForm(which)
{
	if (which && document.getElementById(which + 'Reset'))
	{
		document.getElementById(which + 'Reset').className = 'resetLoading';
	}

	// Initialize the query-string object.
	var query = {
		'gw': 'search_form',
		'mkey': mdxMKey,
		'random': '1',
		'allow_no_price': '1',
		'noAvTs': '1',
		'show_extras': '10,44,13,73,50,102,35,37,67,414,8,99,metallic,has_pic,vat,36,51,340,private_ad,64,38,53,39,60,62,148,46,accident,371,42,43',
		'locale': mdxLocale,
		'xsl': 'http://content.modix.de/userdata/11111/layout/xhr/xml2json_searchform.xsl',
		'preventCache': (new Date()).getTime()
	};

	var searchMask = document.getElementById('suchmaske');
	var selectElems = searchMask.getElementsByTagName('SELECT');
	var inputElems = searchMask.getElementsByTagName('INPUT');

	var elem;

	// Extend the query-string by custom Extra-CHECKBOX-fields
	for (var extra in mdxCustomExtras)
	{
		mdxCustomExtras[extra].setQuery(query, (searchMask[extra] && searchMask[extra].checked));
	}

	// Extend the query-string object by SELECT-fields
	for (var i = 0; i < selectElems.length; i++)
	{
		elem = selectElems[i];
		if (
			(elem.name.length > 0) &&
			(elem.options[elem.selectedIndex].value.length > 0)
		)
		{
			query[mdxParamTranslate[elem.name] || elem.name] = elem.options[elem.selectedIndex].value;
		}
		selectElems[i].disabled = 'true';
	}

	// Extend the query-string object by INPUT- and CHECKBOX-fields
	for (var i = 0; i < inputElems.length; i++)
	{
		elem = inputElems[i];
		if (
			(elem.name.length > 0) &&
			(elem.value.length > 0) &&
			(elem.type !== 'checkbox' || (elem.checked && !mdxCustomExtras[elem.name])) &&
			(elem.name !== 'search_vehicles' && elem.name !== 'version' && elem.name !== 'max' && elem.name !== 'sort' && elem.name !== 'request_uid' && elem.name !== 'logLimit') &&
			(elem.name !== 'zip' || (/^\d+$/.test(elem.value)))
		)
		{
			query[mdxParamTranslate[elem.name] || elem.name] = elem.value;
		}
		if (elem.type !== 'hidden')
		{
			elem.disabled = 'true';
			if (elem.type === 'checkbox')
			{
				document.getElementById('extras_label_' + elem.name).className = 'DISABLED';
			}
		}
	}

	if (!query['manufacturer'] && query['model'] != '99999') { query['model'] = null; }
	if (query['days_in_stock'])
	{
		query['created_timestamp'] = Math.floor((new Date()).getTime() / 1000) - (parseInt(query['days_in_stock'], 10) * 24 * 60 * 60);
		query['days_in_stock'] = null;
	}

	if (typeof mdxPreProcess === 'function') { mdxPreProcess(query); }

	// Request data from server
	httpRequest('/soap/kfz/' + getQueryString(query), function (json)
	{
		json = json['mdx_form'];

		// Output the number of found vehicles
		if (document.getElementById('vehiclesFound')) { document.getElementById('vehiclesFound').innerHTML = json['found']['#']; }
		if (document.getElementById('submitButton')) { document.getElementById('submitButton').value = document.getElementById('submitButton').value.replace(/[0-9]+/, json['found']['#']); }
		if (document.getElementById('noVehiclesFound')) { document.getElementById('noVehiclesFound').style.display = (json['found']['#'] === 0) ? 'block' : 'none'; }

		var name = '';
		var selectedIndex = 0;
		for (var i = 0; i < selectElems.length; i++)
		{
			elem = selectElems[i];
			if (mdxCustomSelectFields[elem.name])
			{
				selectedIndex = mdxCustomSelectFields[elem.name].updateOptions(elem, json, query);
			}
			else
			{
				mdxClearOptions(elem);
				name = mdxParamTranslate[elem.name] || elem.name;
				selectedIndex = 0;
				if (json[name] && json[name]['option'])
				{
					for (var j = 0; j < jsonArrayLength(json[name]['option']); j++)
					{
						mdxAddOption(
							elem,
							jsonArray(json[name]['option'], j)['@value'],
							jsonArray(json[name]['option'], j)['#'],
							jsonArray(json[name]['option'], j)['@selected']
						);
						if (jsonArray(json[name]['option'], j)['@selected'] === 'yes')
						{
							selectedIndex = j + 1;
						}
					}
				}
			}
			if (elem.name && document.getElementById(elem.name + 'Reset'))
			{
				document.getElementById(elem.name + 'Reset').className = (selectedIndex === 0 ? 'resetDisabled' : 'resetEnabled');
			}
			elem.disabled = '';
		}

		var checked = false;
		var disabled = true;
		for (var i = 0; i < inputElems.length; i++)
		{
			elem = inputElems[i];
			if (elem.type !== 'hidden' && !mdxCustomExtras[elem.name])
			{
				name = mdxParamTranslate[elem.name] || elem.name;
				if (elem.type === 'checkbox')
				{
					checked = false;
					disabled = true;
					for (var j = 0; j < jsonArrayLength(json['extras']['extra']); j++)
					{
						if (jsonArray(json['extras']['extra'], j)['@id'] === name)
						{
							checked = (jsonArray(json['extras']['extra'], j)['@checked'] === 'yes');
							disabled = (jsonArray(json['extras']['extra'], j)['@disabled'] === 'yes');
							break;
						}
					}

					elem.checked = checked ? 'checked' : '';
					if (!disabled)
					{
						elem.disabled = '';
						document.getElementById('extras_label_' + elem.name).className = '';
					}
				}
				else
				{
					if (elem.name === 'zip')
					{
						elem.value = json[name]['#'] || mdxGetTranslation('searchzip');
					}
					elem.disabled = '';
				}
			}
		}

		// Extend the query-string by custom Extra-CHECKBOX-fields
		for (var extra in mdxCustomExtras)
		{
			elem = searchMask[extra];
			if (elem)
			{
				elem.checked = mdxCustomExtras[extra].isChecked(json, query);
				if (mdxCustomExtras[extra].isAvailable(json, query) || elem.checked)
				{
					elem.disabled = '';
					document.getElementById('extras_label_' + elem.name).className = '';
				}
			}
		}

		if (typeof mdxPostProcess === 'function') { mdxPostProcess(query, json); }
	}, function (e)
	{
		if (mdxDebugging) { alert('AJAX Error\n\n' + e.msg + '\n\nConstructor: ' + e.constructor + '\nSystem message:\n' + e.sys_msg + '\n\nURL: ' + e.url + '\n\nResponse:\n' + e.responseText); }
	}, { "cache":true });

	function getQueryString(obj) {
		var queryString;
		for (var param in obj) {
			if (obj[param]) {
				queryString = (queryString ? queryString + '&' : '?') + param + '=' + obj[param];
			}
		}
		return (queryString || '');
	}
}

function mdxGetTranslation(token) {
	return (mdxTranslations[token] || '');
}

// Remove all options from a SELECT-field excepting the first
function mdxClearOptions(elem) {
	var opt = elem.firstChild, nextOpt;
	var removeOpt = false;
	while (opt) {
		nextOpt = opt.nextSibling;
		if (removeOpt) {
			elem.removeChild(opt);
		}
		if (opt.nodeName.toLowerCase() == 'option') {
			removeOpt = true;
		}
		opt = nextOpt;
	}
}

// Add a new option to a SELECT-field
function mdxAddOption(elem, value, text, selected) {
	var option = document.createElement('option');
	option.value = value;
	option.text = text;
	option.selected = selected;
	try {
		// standards compliant; doesn't work in IE
		elem.add(option, null);
	} catch (e) {
		// IE only
		elem.add(option);
	}
	option.innerHTML = text;
	return option;
}
