
var DEBUG = false;
var MegaFilterOn = false;
var BodyStyle = null;
var SpecGroup = null;
var Filters = [];
var DefaultPermaChoices = true;

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(elt /*, from*/) {
    var len = this.length;
    var from = Number(arguments[1]) || 0;
    from = (from < 0) ? Math.ceil(from) : Math.floor(from);
    if (from < 0) from += len;
    for (; from < len; from++) {
      if (from in this && this[from] === elt) return from;
    }
    return -1;
  };
}

function M (name, r) {
	this.name = name;
	this.acodes = null;
	this.trims = null;
	this.r = r;
}

function SR (group, title, data) {
	this.group = group;
	this.title = title;
	this.data = data;
}

var ms = [];
var mc = 0;
var rc = 0;

function writeSpecPage() {
	for (var i = 0; i < ms.length; i++) {
		// if this is the chosen BodyStyle, or no BodyStyle chosen yet 
		// and this is the first (default) BodyStyle.
		if (BodyStyle == ms[i].name || (BodyStyle == null && i == 0)) {
			writeSpecGridHtml(ms[i]);
			break;
		}
	}
}

function contains(array, value) {
    if(array && value) {
        for(var i=0; i<array.length; i++) {
            if(array[i] == value) return true;
        }
    }
}

function writeChooseBodyHtml() {
	var html = "";
	// only write out body choosing UI if there is more than one body to choose from
	if (ms.length > 1) {
		html += "<div id=\"specgrid_tabheader_top\"><ul>";
		for (var i = 0; i < ms.length; i++) {
			// if this is the chosen BodyStyle, or no BodyStyle chosen yet 
			// and this is the first (default) BodyStyle.
			if (BodyStyle == ms[i].name || (acode && !BodyStyle && contains(ms[i].acodes, acode)) || (!acode && !BodyStyle && i == 0)) {
				BodyStyle = ms[i].name;
				html += "<li class=\"on\"><a href=\"javascript:void(0);\" class=\"on\"><span>" + ms[i].name + "<"+"/span><"+"/a><"+"/li>";
			} else {
				html += "<li><a href=\"javascript:changeBodyStyle('" + ms[i].name + "');\"><span>" + ms[i].name + "<"+"/span><"+"/a><"+"/li>";
			}
		}
		html += "<"+"/ul><div class=\"clear\"><"+"/div><"+"/div>";
		document.getElementById("chooseBodyDiv").innerHTML = html;
		document.getElementById("chooseBodyDiv").style.display = "block";
	} else {
		document.getElementById("chooseBodyDiv").innerHTML = "";
		document.getElementById("chooseBodyDiv").style.display = "none";
	}
}

function writePermaChoicesHtml() {

	var html = "";
	var prevChoiceName = null;
	
	var choices = getPermaChoices();
	
	if (choices != null && choices.length > 0) {
	
		html += "<div id=\"specgrid_tabheader_content\">\n";
		
		for (var i = 0; i < choices.length; i++) {
		
			var choiceName = choices[i].group + " " + choices[i].title;
			var choiceFilter = "{'group':'"+choices[i].group+"','title':'"+choices[i].title+"','datum':'"+choices[i].datum+"'}";
			var choiceOnclick = "javascript:changePermaChoice("+choiceFilter+");";
			
			if (DefaultPermaChoices && choiceName != prevChoiceName) {
				addFilter(choices[i]);
			}
	
			if (choiceName != prevChoiceName) {
				if (i == 0) {
					html += "<ul class=\"first\">\n";
				} else {
					html += "<"+"/ul><ul>\n";
				}
				html += "<li class=\"title\">" + choices[i].header + "<"+"/li>\n";
			}
			
			if (isUsedInFilter(choices[i].group, choices[i].title, choices[i].datum)) {
				html += "<li><a href=\"javascript:void(0);\" class=\"on\"><span>" + choices[i].label + "<"+"/span><"+"/a><"+"/li>\n";
			} else {
				html += "<li><a href=\""+choiceOnclick+"\"><span>" + choices[i].label + "<"+"/span><"+"/a><"+"/li>\n";
			}
			
			if (i+1 == choices.length) {
				html += "<"+"/ul>\n";
			}
	
			prevChoiceName = choiceName;
			
		}
		
		html += "<div class=\"clear\"><"+"/div><"+"/div>\n";
		
		document.getElementById("permaChoiceDiv").innerHTML = html;
		document.getElementById("permaChoiceDiv").style.display = "block";
		
	} else {
	
		document.getElementById("permaChoiceDiv").innerHTML = "";
		document.getElementById("permaChoiceDiv").style.display = "none";
		
	}
	
}

function writeSpecGridHtml(body) {

	document.getElementById("specGridDiv").innerHTML = TEXT_loading;

	if (DEBUG) {
		var msg = "";
		for (var i = 0; i < Filters.length; i++) {
			msg += "Group: "+Filters[i].group+", Title: "+Filters[i].title+", Datum: "+Filters[i].datum + "\n";
		}
		alert("New filters applied:\n\n" + msg);
	}

	if (SpecGroup == null) {
		SpecGroup = "All";
	}
	
	var filteredColumnIndexes = getFilteredColumnIndexes(body);

	if (filteredColumnIndexes.length == 0) {
		document.getElementById("specGridDiv").innerHTML = "<br/>" + TEXT_no_vehicles;
		return;
	}
	
	var html = "<div id=\"specgrid_matrix\" class='specgrid_matrix'><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"705\" ><thead>";

	if (false) {
		html += "<tr>";
		html += "<td>&nbsp;<"+"/td>";	
		for (var q = 0; q < body.acodes.length; q++) {
			if (filteredColumnIndexes.indexOf(q) != -1) {
				html += "<td>" + body.acodes[q] + "<"+"/td>";
			}
		}	 
		html += "</tr>";
	}
	var prevGroup = "";
	var permaChoices = getPermaChoices();
	for (var x = 0; x < body.r.length; x++) {
		
		var r = body.r[x];
		
		if (r.group == null || r.group == "") {
			continue;
		}

		if (SpecGroup == "All") {
			if (prevGroup != r.group) {
				// Removed link to change spec grid to only show this group
				//var groupHtml = "<a href=\"javascript:changeSpecGroup('"+r.group+"');\" style=\"color:#ffffff;\">"+r.group+"<"+"/a>";
				var groupHtml = r.group;
				if(x==1){
					html += "<tr style='background:#006aa8 url(/images/vehiclepage/section_titlebar.gif) repeat-x; font-weight:bold; color:#fff; }'><th class=\"firstblue\" colspan=\"" + (filteredColumnIndexes.length - body.trims.length + 1) + "\">&nbsp;</th>";
					for (var t = 0; t < body.trims.length; t++) {
						if (filteredColumnIndexes.indexOf(t) != -1) {
							html += "<th>" + body.trims[t] + "</th>";
						}
					}
					html+="</tr></thead><tbody>";
				}
				html += "<tr class=\"blue\"><td class=\"blue\" colspan=\"" + (filteredColumnIndexes.length - body.trims.length + 1) + "\">" + groupHtml + "</td>";
				for (var t = 0; t < body.trims.length; t++) {
					if (filteredColumnIndexes.indexOf(t) != -1) {
						html += "<td>&nbsp;</td>";
					}
				}
				html += "</tr>";
			}
		}
		
		// if we are showing all groups
		// or this is the selected SpecGroup
		if (SpecGroup == "All" || r.group == SpecGroup) {
		
			html += "<tr";
			if (x % 2 == 0) {
				html += " class=\"ltgray\"";
			}
			// Removed bold on row that contain differences in data
			//if (rowHasDifferences(filteredColumnIndexes, r.data)) {
			//	html += " style=\"font-weight:bold;\"";
			//}
			html += ">";

			html += "<td class=\"first\" style=\"font-weight:bold;\">" + r.title + "<"+"/td>";
			
			for (var y = 0; y < r.data.length; y++) {
			
				if (filteredColumnIndexes.indexOf(y) != -1) {

					var datumLabel = r.data[y];
					var strippedDatumLabel = datumLabel.replace(/(<([^>]+)>)/ig, "");
					
					if (isUsedInFilter(r.group, r.title, strippedDatumLabel)) {
						datumLabel = datumLabel + " *";
					}
					
					var quoteFixedLabel = datumLabel.replace("?", "'").replace(/\!/g, "\"");
					var datumHtml = quoteFixedLabel;

					if (strippedDatumLabel == 'S') {
						datumHtml = "<img style=\"border: 0pt none ;\" src=\"/images/vehiclepage/btn_standard.gif\"/>";
					} else if (strippedDatumLabel == 'O') {
						datumHtml = "<img style=\"border: 0pt none ;\" src=\"/images/vehiclepage/btn_option.gif\"/>";
					} else if (strippedDatumLabel == '-') {
						datumHtml = "<img style=\"border: 0pt none ;\" src=\"/images/vehiclepage/btn_na.gif\"/>";
					}
					
					if (MegaFilterOn && !isPermaChoice(permaChoices, r.group, r.title)) {
						var datumFilter = "{'group':'"+r.group+"','title':'"+r.title+"','datum':'"+strippedDatumLabel+"'}";
						datumHtml = "<a href=\"javascript:toggleFilter("+datumFilter+")\">"+datumHtml+"</a>";
					}
					html += "<td>" + datumHtml + "</td>";
				}
				
			}
			
			html += "</tr>";
			
		}
		
		prevGroup = r.group;
		
	}
		
	html += "</tbody></table></div>";
	
	document.getElementById("specGridDiv").innerHTML = html;

}

function getChooseGroupHtml(body) {
	return "";
	var html = "";
	var prevGroup = "";
	if (SpecGroup == null) {
		SpecGroup = body.r[0].group;
	}
	html += "<select onChange=\"javascript:changeSpecGroup(this.options[this.selectedIndex].value);\">";
	html += "<option value='All' selected>" + TEXT_show_all + "<"+"/option>";
	for (var x = 0; x < body.r.length; x++) {
		var r = body.r[x];
		if (prevGroup != r.group) {
			if (r.group == SpecGroup) {
				html += "<option value='" + r.group + "' selected>" + r.group + "<"+"/option>";
			} else {
				html += "<option value='" + r.group + "'>" + r.group + "<"+"/option>";
			}
		}
		prevGroup = r.group;
	}
	html += "<"+"/select>";
	return html;
}

function isUsedInFilter(group, title, datum) {
	if (Filters.length == 0) {
		return false;
	}
	for (var i = 0; i < Filters.length; i++) {
		if (Filters[i].group == group && Filters[i].title == title && Filters[i].datum == datum) {
			return true;
		}
	}
	return false;
}

function isPermaChoice(choices, group, title) {
	if (choices.length == 0) {
		return false;
	}
	for (var i = 0; i < choices.length; i++) {
		if (choices[i].group == group && choices[i].title == title) {
			return true;
		}
	}
	return false;
}

function rowHasDifferences(filteredColumnIndexes, data) {
	if (filteredColumnIndexes.length == 1) {
		return false;
	}
	var prevCol = null;
	for (var y = 0; y < data.length; y++) {
		if (filteredColumnIndexes.indexOf(y) != -1) {
			if (data[y] != prevCol && prevCol != null) {
				return true;
			}
			prevCol = data[y];
		}
	}
	return false;
}

function getFilteredColumnIndexes(body) {

	var filteredOverall = [];

	if (Filters.length > 0) {
	
		for (var i = 0; i < Filters.length; i++) {
		
			var filteredGroupTitle = [];

			for (var z = 0; z < body.r.length; z++) {
			
				// is this the row for this filter?  keep in mind that
				// some filters apply to more than one row because of
				// optional features.  that is why we do the funny thing
				// with the Single and GroupTitle index arrays in a few lines.
				if (isFilterRow(Filters[i], body.r[z])) {
				
					// apply this filter to this row
					var filteredSingle = filterColumns(Filters[i], body.r[z].data);
					
					// now, add each filteredSingle index to the filteredGroupTitle array, 
					for (var x = 0; x < filteredSingle.length; x++) {
					
						// but only if the filteredGroupTitle array doesn't already have it
						if (filteredGroupTitle.indexOf(filteredSingle[x]) == -1) {
							filteredGroupTitle.push(filteredSingle[x]);
						}
						
					}
					
				}
				
			}
			
			// at this point, we have a complete filteredGroupTitle 
			// with indexes of trim columns that passed this filter.
			// now we need to merge these results with the overall filtering results
			// if we have no filteredOverall values yet, make the results from 
			// this first filter become our filteredOverall
			if (filteredOverall.length == 0) {
				filteredOverall = filteredGroupTitle;
				
			// otherwise, 
			//     remove indexes from filteredGroupTitle that are not already in filteredOverall.
			// and remove indexes from filteredOverall that were not returned in filteredGroupTitle.
			} else {
			
				var tmpArr1 = [];

				for (var r = 0; r < filteredGroupTitle.length; r++) {
					if (filteredOverall.indexOf(filteredGroupTitle[r]) != -1) {
						tmpArr1.push(filteredGroupTitle[r]);
					}
				}
				filteredGroupTitle = tmpArr1;
				if (DEBUG) alert("filteredGroupTitle="+filteredGroupTitle);

				if (filteredGroupTitle.length == 0) {
					return [];
				}			
				
				var tmpArr2 = [];

				for (var r = 0; r < filteredOverall.length; r++) {
					if (filteredGroupTitle.indexOf(filteredOverall[r]) != -1) {
						tmpArr2.push(filteredOverall[r]);
					}
				}
				filteredOverall = tmpArr2;
				if (DEBUG) alert("filteredOverall="+filteredOverall);

				if (filteredOverall.length == 0) {
					return [];
				}			

			}
			
		}
		
	} else {
		// No filters have been set, so we need 
		// a full set of column indexes, unfiltered
		filteredOverall = filterColumns(null, body.r[0].data);
	}

	return filteredOverall;

}
function filterColumns(filter, colData) {
	var indexes = [];
	for (var i = 0; i < colData.length; i++) {
		if (filter == null || matchesFilter(filter, colData[i])) {
			if (indexes.indexOf(i) == -1) {
				indexes.push(i);
			}
		}
	}
	return indexes;
}

function isFilterRow(filter, row) {
	return (filter.group == row.group && filter.title == row.title);
}

function matchesFilter(filter, datum) {
	if (filter.datum.substring(0, 1) == "!") {
		return (datum.indexOf(filter.datum.substring(1, filter.datum.length)) == -1);
	} else {
		return (datum.indexOf(filter.datum) > -1);
	}
}

function changeBodyStyle(bodyStyle) {
	DefaultPermaChoices = true;
	BodyStyle = bodyStyle;
	SpecGroup = null;
	resetFilters();
	writeChooseBodyHtml();
	writePermaChoicesHtml();
	writeSpecPage();
	DefaultPermaChoices = false;
	
	var windowWidth = $(window).width() - 50;
	var windowHeight = $(window).height() - 50;
	
	$('.specgrid_matrix').css({'width': windowWidth+'px', 'height': windowHeight+'px'});
	
	$(window).resize(function() {
		var windowWidth = $(window).width() - 50;
		var windowHeight = $(window).height() - 50;
	
		$('.specgrid_matrix').css({'width': windowWidth+'px', 'height': windowHeight+'px'});
	});	
	
	$('.specgrid_matrix').fixedHeaderTable({autoResize:false});
}

function changeSpecGroup(specGroup) {
	SpecGroup = specGroup;
	writeSpecPage();
}

function changePermaChoice(filter) {
	SpecGroup = null;
	toggleFilter(filter);	
	writePermaChoicesHtml();
}

function toggleFilter(filter) {
	var updatedFilter = false;
	for (var i = 0; i < Filters.length; i++) {
		if (Filters[i].group == filter.group && Filters[i].title == filter.title) {
			if (Filters[i].datum == filter.datum) {
				Filters.splice(i, 1);
			} else {
				Filters[i].datum = filter.datum;
			}
			updatedFilter = true;
			break;
		}
	}
	if (!updatedFilter) {
		addFilter(filter);
	}
	writeSpecPage();
}

function addFilter(filter) {
	if (DEBUG) alert("Adding Filter:\n\nGroup: "+filter.group+", Title: "+filter.title+", Datum: "+filter.datum);
	Filters.push(filter);
}

function resetFilters() {
	Filters = null;
	if (DEBUG) alert("Filters = " + Filters);
	Filters = [];
	Filters.length = 0;
}

function initialize() {
	DefaultPermaChoices = true;
	BodyStyle = null;
	SpecGroup = null;
	resetFilters();
	writeChooseBodyHtml();
	writePermaChoicesHtml();
	writeSpecPage();
	DefaultPermaChoices = false;
}

