var
/** XML DOCs **/
  docModels,
  docModelPeriods,
  docBodytypes,
/** Element IDs **/
  eidVehicleType,
  eidMake,
  eidModel,
  eidModelName,
  eidModelPeriod
;

var strs = new Array();
  strs['other_model'] = "Other model";
  strs['all_models'] = "";
  strs['model_periods'] = "---";//"Model periods";
  strs['user_model'] = "";
  strs['modid'] = 0;	//model ID
  strs['modperid'] = 0;	//model period ID
  strs['optgmode'] = 0;	//optgroup mode


function debug(e) { /*alert(e);*/ }

function setVehicleTypeEID(eid) { eidVehicleType = eid; }
function setMakeEID(eid) { eidMake = eid; }
function setModelEID(eid) { eidModel = eid; }
function setModelNameEID(eid) { eidModelName = eid; }
function setModelPeriodEID(eid) { eidModelPeriod = eid; }
function setStr(key, s) { strs[key] = s; }


function fetchDoc(fname){
	try{
		var xmlhttp = new XMLHttpRequest();
		xmlhttp.open("GET", "http://"+ window.location.host +"/export/deftypes/" + fname, true);

		xmlhttp.onreadystatechange = function() {
			if (xmlhttp.readyState == 4) {
				if (xmlhttp.status == 200) {
					assignDoc(fname, xmlhttp.responseXML);
				}
			}
		};

		xmlhttp.setRequestHeader('Expires', '-1');
		xmlhttp.setRequestHeader('Cache-Control', 'no-cache');
		xmlhttp.setRequestHeader('Pragma', 'no-cache');
		xmlhttp.send('');
	}
	catch(e){debug(e);}
}


function assignDoc(fname, XMLDoc){
	switch (fname) {
		case "models.xml":
			docModels = XMLDoc;
			break;
		case "model_periods.xml":
			docModelPeriods = XMLDoc;
			break;
		case "body_types.xml":
			docBodytypes = XMLDoc;
			break;
	}
}


function reload(subject)
{
	switch (subject)
	{
		case "model_periods":
			populateModelPeriods();
			break;
		case "models":
			populateModels();
			populateModelPeriods();
			break;
		default:
			break;
	}

	toggleModelName();
}


function populateModels()
{
	var modelSelection = document.getElementById(eidModel);

	clearSelection(modelSelection);


	if(strs['all_models'].length)
	{
		addToSelection(modelSelection, strs['all_models'], 0);
	}

	if(docModels)
	{
		var makeSelection = document.getElementById(eidMake);
		var makeID = (makeSelection != null) ? makeSelection.value : 0;

		if (makeID>0)
		{
			populateModelNodes(modelSelection, makeID, 0);
		}
		else
		{
			/*
			for(var i=0; i<makeSelection.options.length; i++)
			{
				var option = makeSelection.options[i];
				var omName = option.text;
				var omID = option.value;
				if(omID>0)
				{
					populateModelNodes(modelSelection, omID, 1);
				}
			}
			*/
		}
	}


	if(strs['other_model'].length)
	{
		addToSelection(modelSelection, strs['other_model'], 0);
	}


	_setSelectedValue(modelSelection, strs['modid']);
}


function populateModelNodes(selectEelement, makeID, level)
{
	var modelNodes = docModels.selectNodes("/list[@type='models']/item[@make_id='" + makeID + "']");
	//if(level==0) addToSelection(selectEelement, "", 0);

	if(modelNodes.length>0)
	{
		var id, name, label, isPrototype;
		var lang = syslang(null);

		var Serializer = new XMLSerializer();

		for(i=0; i<modelNodes.length; i++)
		{
			var modelNode = modelNodes[i];


			var idNode = modelNode.selectNodes("id/text()");
			var nameNode = modelNode.selectNodes("name/text()");
			var labelNode = modelNode.selectNodes("label[@lang='" + lang + "']/text()");
			var prototypeNode = modelNode.selectNodes("prototype/text()");

			id = 0;
			name = "";
			label = "";
			isPrototype = 0;

			try { id = Serializer.serializeToString(idNode[0]); } catch(e){debug(e);}
			try { name = Serializer.serializeToString(nameNode[0]); } catch(e){debug(e);}
			try { label = Serializer.serializeToString(labelNode[0]); } catch(e){debug(e);}
			try { isPrototype = Serializer.serializeToString(prototypeNode[0]); } catch(e){debug(e);}


			/* SKIP OVER PROTOTYPES */
			if (isPrototype > 0) continue;


			var model_label = label.length >0 ? label : name;

			if(id>0)
			{
				var childModels = modelNode.selectNodes("list[@type='children']/item");
				var childCount = childModels.length;

				if(childCount)
				{
					var OptGroup = new HTMLOptGroup(model_label, id);

					for(j=0; j<childModels.length; j++)
					{
						var childNode = childModels[j];

						var idNode = childNode.selectNodes("id/text()");
						var nameNode = childNode.selectNodes("name/text()");

						try{
							child_id = Serializer.serializeToString(idNode[0]);
							child_name = Serializer.serializeToString(nameNode[0]);
						}catch(e){debug(e);}


						OptGroup.appendOption(child_name, child_id);
					}

					OptGroup.appendTo(selectEelement, strs['optgmode']);
				}
				else
				{
					addToSelection(selectEelement, model_label, id);
				}
			}
		}
	}
}


function toggleModelName()
{
	var modelNameEl = document.getElementById(eidModelName);

	try{
		var modelEl = document.getElementById(eidModel);
		var disableModelName = (modelEl.value>0) ? true : false;

		var selectedIndex = modelEl.selectedIndex;

		modelNameEl.disabled = disableModelName;
		modelNameEl.value = disableModelName ? modelEl.options[selectedIndex].text : strs['user_model'];
	}catch(e){debug(e);}
}


function populateModelPeriods()
{
	var disablePeriodSelection = true;

	var modelEl = document.getElementById(eidModel);
	var modelPeriodSelection = document.getElementById(eidModelPeriod);
	var bodytypeEl = document.getElementById(eidVehicleType);

	var modelID = (modelEl != null) ? modelEl.value : 0;
	var bodytypeID = (bodytypeEl != null) ? bodytypeEl.value : 0;

	if(docModelPeriods)
	{
		clearSelection(modelPeriodSelection);
		if(strs['model_periods'].length)
		{
			addToSelection(modelPeriodSelection, strs['model_periods'], 0);
		}


		if (modelID>0)
		{
			var id, period, bodytype;


			var inBodytype = "";
			if(bodytypeID>0)
			{
				inBodytype = "@bodytype_id='0'";
				if(inBodytype.length>0) { inBodytype += " or "; }
				inBodytype += "@bodytype_id='" + bodytypeID + "'";
			}
			if(inBodytype.length>0) inBodytype = " and (" + inBodytype + ")";


			var sXpath = "/list[@type='model periods']/item[@model_id='" + modelID + "'" + inBodytype + "]";
			var periodNodes = new Array();
			try{
				periodNodes = docModelPeriods.selectNodes(sXpath);
			}catch(e){ debug(e); }

			if(periodNodes.length>0)
			{
				disablePeriodSelection = false;

				var Serializer = new XMLSerializer();

				for(i=0; i<periodNodes.length; i++)
				{
					var periodNode = periodNodes[i];
					var idNode = periodNode.selectNodes("id/text()");
					var perstrNode = periodNode.selectNodes("period_str/text()");
					var bodytypeNode = periodNode.selectNodes("bodytype_id/text()");

					try{
						id = Serializer.serializeToString(idNode[0]);
						period = Serializer.serializeToString(perstrNode[0]);
						bodytype = Serializer.serializeToString(bodytypeNode[0]);
					}catch(e){debug(e);}

					if(period)
					{
						if(bodytype>0){
							var body_name = getBodytypeName(bodytype);
							if(body_name.length>0) period += " (" + body_name + ")";
						}

						addToSelection(modelPeriodSelection, period, id);
					}
				}
			}
		}

		modelPeriodSelection.disabled = disablePeriodSelection;

		_setSelectedValue(modelPeriodSelection, strs['modperid'])
	}
}


function getBodytypeName(bodytypeID)
{
	var bodytype = "";

	if(docBodytypes && bodytypeID>0)
	{
		var lang = syslang(null);
		try{
			var sXpath = "/list[@type='body types']/item[id='" + bodytypeID + "']/name[@lang='" + lang + "']/text()";
			typeNodes = docBodytypes.selectNodes(sXpath);
		}catch(e){debug(e);}

		if(typeNodes.length>0)
		{
			var Serializer = new XMLSerializer();
			var typeNode = typeNodes[0];
			bodytype = Serializer.serializeToString(typeNode);
		}
	}

	return bodytype;
}


function _setSelectedValue(select, value){
	for(i=0; i<select.options.length; i++){
		if(select.options[i].value==value){
			select.selectedIndex = i;
			break;
		}
	}
}
