var certifiedCombos = new Class({
    initialize: function(){
        this.makes = new Array();
	}
});
var Make = new Class({
    initialize: function(id, display){
        this.models =  new Array();
		this.display = display;
		this.id = id;
    }
});
var Model = new Class({
    initialize: function(id, display){
        this.years = new Array();
		this.display = display;
		this.id = id;
    }
});

function show(){
	var i, j, k;
	var jmakes, kmodels, iyears, out=" ";
	jmakes = this.makes.length;
	
	for(j=0; j < jmakes; j++){
		out = out + "\n\n" + this.makes[j].display + "\n\n";
		kmodels = this.makes[j].models.length;
		for(k=0; k < kmodels; k++){
			out = out + "\n" + this.makes[j].models[k].display + "/";
			iyears = this.makes[j].models[k].years.length;
			for (i=0; i < iyears; i++){
				out = out + this.makes[j].models[k].years[i] + "-";
			}
		}
	}
	return out;
}

//return the position of the id inside the makes vector, if doesn't exists return -1
function indexOfMake(makeId){
	for(i=0; i<this.makes.length; i++){
		if(this.makes[i].id == makeId){
			return i;
		}
	}
	return -1;
}
function indexOfModel(modelId){
	for(i=0; i<this.models.length; i++){
		if(this.models[i].id == modelId){
			return i;
		}
	}
	return -1;
}
function indexOfYear(yearId){
	for(i=0; i<this.years.length; i++){
		if(this.years[i] == yearId){
			return i;
		}
	}
	return -1;
}

certifiedCombos.prototype.indexOfMake = indexOfMake;
certifiedCombos.prototype.show = show;
Make.prototype.indexOfModel = indexOfModel;
Model.prototype.indexOfYear = indexOfYear;

/****************************************** GLOBAL *********************************************/

var xmlCombosFile = "/certified/xml/makedata.xml";
var combosData = new certifiedCombos();
var xmlMakeData = createXMLDoc(xmlCombosFile);

function fillCube(fYear,tYear){
	var i, j, k, yearXML, actYearObj, iyears, makeXML, actMakeObj, jmakes, modelXML, actModelObj, kmodels, actMakeIndex, actModelIndex;
	if(fYear>tYear){ 
		alert("Wrong Range of Years");
	}
	var cycles = tYear-fYear; 
	var m = 0;
	/*alert(cycles);
	alert(fYear);
	alert(tYear);*/
	if(cycles==0){
		if ((tYear=="2009")&&(fYear=="2009")){
			iyears = cycles + 1;
		}
		if ((tYear=="2008")&&(fYear=="2008")){
			iyears = cycles + 2;
			m=1;
		}
		if ((tYear=="2007")&&(fYear=="2007")){
			iyears = cycles + 3;
			m=2;
		}
		if ((tYear=="2006")&&(fYear=="2006")){
			iyears = cycles + 4;
			m=3;
		}
		if ((tYear=="2005")&&(fYear=="2005")){
			iyears = cycles + 5;
			m=4;
		}
	}
	if(cycles==1){
		if((fYear=="2008")&&(tYear=="2009")){
			iyears = cycles + 1;
		}
		if((fYear=="2007")&&(tYear=="2008")){
			iyears = cycles + 2;
			m = 1;
		}
		if((fYear=="2006")&&(tYear=="2007")){
			iyears = cycles + 3;
			m = 2;
		}
	}
	if(cycles==2){
		if((fYear=="2007")&&(tYear=="2009")){
			iyears = cycles + 1;
		}
		if((fYear=="2006")&&(tYear=="2008")){
			iyears = cycles + 2;
			m = 1;
		}
		if((fYear=="2005")&&(tYear=="2007")){
			iyears = cycles + 3;
			m = 2;
		}
	}
	if(cycles==3){
		if((fYear=="2006")&&(tYear=="2009")){
			iyears = cycles + 1;
		}
		if((fYear=="2005")&&(tYear=="2008")){
			iyears = cycles + 2;
			m = 1;
		}
	}
	if(cycles==4){
		if((fYear=="2005")&&(tYear=="2009")){
			iyears = cycles + 1;
		}
		if((fYear=="2004")&&(tYear=="2008")){
			iyears = cycles + 2;
			m = 1;
		}
	}
	}
	if(xmlMakeData!=null){
		combosData.makes.length = 0;
		for (var z=m; z < iyears; z++){	//go trought all  years
			yearXML = xmlMakeData.getElementsByTagName("year")[z];
			//ryears = yearXML.getAttribute("from");
			//alert(ryears);
			jmakes = yearXML.getElementsByTagName("make").length;
			for(j=0; j < jmakes; j++){ //go trought all makes for every year
				makeXML = yearXML.getElementsByTagName("make")[j];//clear the make, to have only model nodes (not blanks nodes in firefox)
				actMakeIndex = combosData.indexOfMake(makeXML.getAttribute("id"));
				if(actMakeIndex==-1){//if the make is not in the makes array, push it
					combosData.makes.push( new Make(makeXML.getAttribute("id"),makeXML.getAttribute("display")) )
					actMakeIndex=combosData.makes.length - 1
				}
				actMakeObj = combosData.makes[actMakeIndex];//stores a reference to the actual make object
				kmodels = makeXML.getElementsByTagName("model").length;
				//alert(kmodels);
				
				for(k=0; k < kmodels; k++){ //go trought all makes for every year
					modelXML = makeXML.getElementsByTagName("model")[k];
					actModelIndex = actMakeObj.indexOfModel(modelXML.getAttribute("id"));
					if(actModelIndex==-1){//if the make is not in the makes array, push it
						actMakeObj.models.push( new Model(modelXML.getAttribute("id"),modelXML.getAttribute("display")) );
						actModelIndex = actMakeObj.models.length - 1;
					}
					actModelObj = actMakeObj.models[actModelIndex];
					if(actModelObj.indexOfYear(yearXML.getAttribute("from"))==-1){
						actModelObj.years.push(yearXML.getAttribute("from"));
					}
				}
				
			}
		}
	}
}

function clearSelect(select){
	select.length = 0;
}

function setSelectToDefault(select, defaultValue, defaultText){
	clearSelect(select);
	select.options[0] = new Option(defaultText,defaultValue);
}

function testXMLdoc(xmlNode){
	var xmlNodeClean;//node fill with only element childs
	alert("Node name: " + xmlNode.tagName + " Childs:  " + xmlNode.childNodes.length);
	xmlNodeClean = getElementChildNodes(xmlNode);//if xmlNode has element node childs, getElementChildNodes retrieve a new xml object filled with only those element node childs
	if(xmlNodeClean != null){xmlNode = xmlNodeClean;}
	if(xmlNode.childNodes.length==0){alert(xmlNode.tagName + xmlNode.getAttribute("display"));}
	else{for (i=0; i < xmlNode.childNodes.length; i++){testXMLdoc(xmlNode.childNodes[i]);}}
}


function fillModels(makeValue, select){
	select.length = 1;
	var makes = combosData.makes;
	for (var i = 0; i < makes.length; i++){
		if (makes[i].id == makeValue){
			var models = makes[i].models;
			for (var j = 0; j < models.length; j++){
				select.options[j + 1] = new Option(models[j].display,models[j].id);
				if(document.formMake.savedModel.value==models[j].id){
					select.options[j + 1].selected = true;
				}
			}
		}
	}
}
function loadCombos(){
	//xmlMakeData = xmlMakeData.childNodes[0];//clear non element type nodes
	var make = document.formMake.Make;
	var fromYear = document.formMake.FromYear;
	var toYear = document.formMake.ToYear;
	for (var k = 0; k < fromYear.length; k++) {
		if (fromYear[k].selected){
			var fYearSelected = fromYear[k].value;
		}
		if (toYear[k].selected){
			var tYearSelected = toYear[k].value;
		}
	}
	fillCube(fYearSelected,tYearSelected);
	for (var i = 0; i < make.length; i++){
		if (make[i].checked){
			fillModels(make[i].value, document.formMake.Model);
			return;
		}
	}

}

/*********************/
AttachEvent(window, "load", loadCombos);

