﻿try { Type.registerNamespace('Vehix.Widgets'); }
catch (e)
{
	(function(namespacePath)
	{
		var p = window;
		var nsp = namespacePath.split('.');

		for (var i = 0; i < nsp.length; i++)
		{
			var c = nsp[i];
			var ns = p[c];
			if (ns && !ns.__namespace) throw 'invalid namespace';
			if (!ns)
			{
				ns = p[c] =
					{ __namespace: true
					, __typeName: nsp.slice(0, i + 1).join('.')
					, getName: function() { return this.__typeName; }
					};
				var n;
				try { n = eval(ns.__typeName); }
				catch (e) { n = null; }
				if (n !== ns)
				{
					delete p[c];
					throw 'invalid namespace: ' + namespacePath;
				}
			}
			p = ns;
		}
	})('Vehix.Widgets');
}

if (typeof (VehixPathToWidgetScripts) == "undefined")
{
	var scripts = document.getElementsByTagName('script');
	for (var i = 0; i < scripts.length; i++)
	{
		var o = scripts[i];
		if (o.src.indexOf('_js/Vehix.Widgets.Configurator') != -1)
		{
			VehixPathToWidgetScripts = o.src.replace("Vehix.Widgets.Configurator.js", "");
			break;
		}
	}
}

document.write('<s' + 'cript type="text/javascript" src="');
document.write(VehixPathToWidgetScripts + 'Vehix.Widgets.Main.js"></s' + 'cript>');
document.write('<s' + 'cript type="text/javascript" src="');
document.write(VehixPathToWidgetScripts + 'Vehix.Widgets.Communication.js"></s' + 'cript>');
document.write('<s' + 'cript type="text/javascript" src="');
document.write(VehixPathToWidgetScripts + 'Vehix.Widgets.VehicleSelector.js"></s' + 'cript>');
document.write('<s' + 'cript type="text/javascript" src="');
document.write(VehixPathToWidgetScripts + 'Vehix.Services.Presentation.js"></s' + 'cript>');
document.write('<s' + 'cript type="text/javascript" src="');
document.write(VehixPathToWidgetScripts + 'Vehix.Services.Logging.js"></s' + 'cript>');
document.write('<s' + 'cript type="text/javascript" src="');
document.write(VehixPathToWidgetScripts + 'Vehix.Widgets.Controls.js"></s' + 'cript>');
document.write('<s' + 'cript type="text/javascript" src="');
document.write(VehixPathToWidgetScripts + 'Vehix.Widgets.Utils.js"></s' + 'cript>');
document.write('<link rel="stylesheet" type="text/css" href="');
document.write(VehixPathToWidgetScripts.replace("_js", "_css") + 'CssHandler.ashx?f=Vehix.Widgets.Main.css" />');
document.write('<link rel="stylesheet" type="text/css" href="');
document.write(VehixPathToWidgetScripts.replace("_js", "_css") + 'CssHandler.ashx?f=Vehix.Presentation.Tabs.css" />');
document.write('<link rel="stylesheet" type="text/css" href="');
document.write(VehixPathToWidgetScripts.replace("_js", "_css") + 'CssHandler.ashx?f=Vehix.Widgets.Controls.css" />');
document.write('<link rel="stylesheet" type="text/css" href="');
document.write(VehixPathToWidgetScripts.replace("_js", "_css") + 'CssHandler.ashx?f=Vehix.Widgets.Configurator.css" />');

this.VehixConfiguratorWidget = new Object();
window.onunload = function()
{
	VehixConfiguratorWidget._isCommunicationConstructed = false;
}

Vehix.Widgets.Configurator = function(callback, chromeStyleId, zip, configObject)
{
	this._chromeStyleId = chromeStyleId;
	this._zip = zip;
	this._isCommunicationConstructed = false;
	if (typeof (callback) == "function")
	{
		this._callBackFunction = callback;
	}
	else
	{
		this._callBackFunction = function()
		{
			alert("No callback function was defined.");
		}
	}
	this._configObject = configObject;
	if (typeof (configObject.VehicleCondition) == "undefined")
		configObject.VehicleCondition = "New,Used";
	this._vehicleCondition = configObject.VehicleCondition == "All" ? "New,Used" : configObject.VehicleCondition;
	configObject.ShowWidgetLoading ? this._renderWidgetLoading = true : this._renderWidgetLoading = false;
	this._windowWidgetIdentifier = "VehixConfiguratorWidget";
	VehixConfiguratorWidget = this;
}

Vehix.Widgets.Configurator.prototype =
{
	Render: function(container)
	{
		var p = VehixPresentationService;
		this._container = container;
		if (this._renderWidgetLoading)
		{
			p._replaceChildren(this._container, p._widgetLoadingPanel());
		}
		else
		{
			p._removeChildren(this._container);
		}
		var st;
		this._configObject && this._configObject.ErrorText && this._configObject.ErrorText.length ? st = this._configObject.ErrorText : st = "";
		this._container.appendChild(p._createErrorPanel(st));
		VehixCommunicationService._buildCommunicationObject(VehixConfiguratorWidget, "Configurator");
	},

	Reload: function()
	{
		VehixConfiguratorWidget._vehicleSelector._reloadWidget();
	},

	_communicationsInitialized: function()
	{
		VehixConfiguratorWidget._isCommunicationConstructed = true;
	},

	_getWidgetVehicle: function(chromeStyleId)
	{
		VehixCommunicationService._makeAjaxCall("../_webservices/ConfiguratorRequests.asmx/GetConfiguratorVehicleFromChromeSyleId", "chromeStyleId=" + chromeStyleId + "&visibilityoptions=" + VehixConfiguratorWidget._vehicleCondition, true, "VehixConfiguratorWidget._buildConfiguratorCallBack", null);
	},

	_buildConfiguratorCallBack: function(resp, args)
	{
		this._buildConfigurator(resp, args);
	},

	_buildConfigurator: function(resp, args)
	{
		this.Vehicle = resp;
		var cnfg = this._configObject;
		if (cnfg && cnfg.SelectedColorCombo)
		{
			var carr = cnfg.SelectedColorCombo.split("|");
			if (carr && carr.length == 3 && carr[2] == this.Vehicle.TrimID)
			{
				this._configObject._exteriorColor = carr[0];
				this._configObject._interiorColor = carr[1];
			}
		}
		this._fillVehicleSelectorData();
	},

	_fillVehicleSelectorData: function()
	{
		var data = "year=" + this.Vehicle.Year + "&makeId=" + this.Vehicle.MakeID + "&modelName=" + encodeURIComponent(this.Vehicle.ModelName) + "&visibilityoptions=" + VehixConfiguratorWidget._vehicleCondition;
		VehixCommunicationService._makeAjaxCall("../_webservices/VehicleSelectorRequests.asmx/GetWidgetVehicleSelectorObject", data, true, "VehixConfiguratorWidget._renderWidgetCallBack", null);
	},

	_renderWidgetCallBack: function(resp, args)
	{
		this._renderWidget(resp, args);
	},

	_renderWidget: function(resp, args)
	{
		var p = VehixPresentationService;
		var vsconfig = { "VisibilityOptions": VehixConfiguratorWidget._vehicleCondition, "ShowLongModelNames": true, "ZipLabel": "Enter Zip Code", "MainLabel": "Specify Make" }
		var vs = new Vehix.Widgets.VehicleSelector(resp, this.Vehicle.Year, this.Vehicle.MakeID, this.Vehicle.ModelID, this._zip, this._changeModel, vsconfig);
		this._vehicleSelector = vs;
		vs._attachedWidget = this;
		this._widgetdiv = p.div("vx_configurator-container", "vx_configurator-container");
		var vsd = p.div("vx_configurator-vehicle-selector-row");
		vs.Render(vsd);
		this._widgetdiv.appendChild(vsd);
		if (this.Vehicle.ModelName && this.Vehicle.ModelName.length > 0)
		{
			this._renderMainDataRow();
			this._getAllTrimData();
		}
		else
		{
			var w = VehixConfiguratorWidget;
			var p = VehixPresentationService;
			//w._widgetdiv.appendChild(dtrim);
			p._replaceChildren(w._container, w._widgetdiv);

		}
	},

	_getAllTrimData: function()
	{
		var data = "makeName=" + encodeURIComponent(this.Vehicle.MakeName) + "&modelName=" + encodeURIComponent(this.Vehicle.ModelName) + "&year=" + this.Vehicle.Year + "&visibilityoptions=" + VehixConfiguratorWidget._vehicleCondition;
		VehixCommunicationService._makeAjaxCall("../_webservices/ConfiguratorRequests.asmx/GetConfiguratorTrimsForMakeModelYear", data, true, "VehixConfiguratorWidget._renderTabs", null);
	},

	_renderTabs: function(resp, args)
	{
		var p = VehixPresentationService;
		var c = VehixConfiguratorWidget;
		var v = c.Vehicle;
		var dtrim = p.div("vx_configurator-tabs-data-container", "vx_configurator-tabs-trims-data-container");
		var dcolor = p.div("vx_configurator-tabs-data-container", "vx_configurator-tabs-color-data-container");
		var doptions = p.div("vx_configurator-tabs-data-container", "vx_configurator-tabs-options-data-container");
		var dsummary = p.div("vx_configurator-tabs-data-container", "vx_configurator-tabs-summary-data-container");
		var atrim = p.anchor("javascript:null", "1. Select Trim >>");
		var acolor = p.anchor("javascript:null", "2. Select Color >>");
		var aoptions = p.anchor("javascript:null", "3. Select Options >>");
		var asummary = p.anchor("javascript:null", "4. Summary >>");
		var tabs = new Vehix.Widgets.Controls.Tabs
		(
			[atrim, acolor, aoptions, asummary],
			[dtrim, dcolor, doptions, dsummary],
			[c._tabsTrimClicked, c._tabsPopulateColor, c._tabsPopulateOptions, c._tabsPopulateSummary]
		);
		p.Hide(p.$("vx_widgets-loading-display-container"));
		c._widgetdiv.appendChild(tabs.div);
		c._tabsPopulateTrim(dtrim, resp);
		c._container.appendChild(c._widgetdiv);
		var dlogo = p.div("vx_widgets-logo-row vx_containsFloats");
		var vanc = p.anchor("http://www.vehix.com?cid=116");
		vanc.appendChild(p.image("vx_widgets-logo-vehix"));
		dlogo.appendChild(vanc);
		dlogo.appendChild(p.image("vx_widgets-logo-chrome"));
		c._widgetdiv.appendChild(dlogo);
		c._sendCommunication("WidgetRendered");
	},

	_tabsTrimClicked: function()
	{
		var c = VehixConfiguratorWidget;
		c._sendCommunication("SelectTrimTabClicked");
	},

	_tabsPopulateColor: function(d)
	{
		var c = VehixConfiguratorWidget;
		var p = VehixPresentationService;
		var trim = c.CurrentTrim();
		c._sendCommunication("SelectColorTabClicked");
		if (typeof (c._colorTrimId) == "undefined" || c._colorTrimId != trim.TrimID)
		{
			var data = "trimid=" + trim.TrimID + "&partnerid=" + c._configObject.PartnerID;
			var d = p.$("vx_configurator-tabs-color-data-container");
			p._replaceChildren(d, c._loadingContainer());
			c._colorTrimId = trim.TrimID;
			VehixCommunicationService._makeAjaxCall("../_webservices/ShowroomRequests.asmx/GetColorsForTrimId", data, true, "VehixConfiguratorWidget._populateColorTabCallBack", null);
		}
	},

	_populateColorTabCallBack: function(resp, args)
	{
		var c = VehixConfiguratorWidget;
		var p = VehixPresentationService;
		var d = p.$("vx_configurator-tabs-color-data-container");
		var colors = resp;
		var dc = p.div("vx_configurator-color-tab-data-container");
		var dvimg = p.div("vx_configurator-color-vehicle-image-container");
		var vimg = p.image("vx_configurator-color-vehicle-image");
		var dcsc = p.div("vx_configurator-color-selector-container");
		var dcsec = p.div("vx_configurator-color-selector-exterior-container");
		var dcsech = p.div("vx_configurator-color-selector-exterior-header");
		var dcsich = p.div("vx_configurator-color-selector-interior-header");
		var dcsesc = p.div("vx_configurator-color-selector-exterior-scroll-container");
		var dcses = p.div("vx_configurator-color-selector-exterior-scroll");
		var dcsic = p.div("vx_configurator-color-selector-interior-container");
		var dcsisc = p.div("vx_configurator-color-selector-interior-scroll-container");
		var dcsis = p.div("vx_configurator-color-selector-interior-scroll");
		var dcr;
		var dcic;
		var dci;
		var dcnc;
		var row1Ext;

		dcsech.appendChild(p.textNode("Select Exterior Color"));
		dcsich.appendChild(p.textNode("Select Interior Color"));
		dvimg.appendChild(vimg);

		if (resp && resp.length)
		{
			for (var i = 0; i < resp.length; i++)
			{
				dcr = p.div("vx_configurator-color-selector-color-row");
				if (i == 0)
					row1Ext = dcr;
				VehixWidgetsUtils.AssignBoundEventHandler("click", dcr, colors[i], c._selectExteriorColor, [dcr, dcsis, vimg]);
				dcic = p.div("vx_configurator-color-selector-color-image-container");
				dci = p.image("vx_configurator-color-selector-color-image");
				dcic.appendChild(dci);
				if (resp[i].ExteriorColor.HexValue != null)
				{
					dcic.style.backgroundColor = "#" + resp[i].ExteriorColor.HexValue;
				}
				else
				{
					dci.className = "vx_configurator-color-selector-color-image-na";
				}
				dcnc = p.div("vx_configurator-color-selector-color-name-container");
				dcnc.appendChild(p.textNode(resp[i].ExteriorColor.DisplayName));
				dcses.appendChild(dcr);
				p._ac(dcr, [dcic, dcnc]);
				dcic.appendChild(dci);
			}
			p._ac(dc, [dvimg, dcsc]);
			p._ac(dcsc, [dcsech, dcsec, dcsich, dcsic]);
			dcsec.appendChild(dcsesc);
			dcsesc.appendChild(dcses);
			dcsic.appendChild(dcsisc);
			dcsisc.appendChild(dcsis);

			var secn = p.$("vx_configurator-main-data-exterior-color").firstChild.nodeValue;
			if (secn == "[ user selection ]")
			{
				extColor = colors[0].ExteriorColor;
				intColor = colors[0].InteriorColors[0];
				fe = c._selectExteriorColor.bind(colors[0]);
				fe([row1Ext, dcsis, vimg]);
			}
		}

		p._replaceChildren(d, dc);
	},

	_selectExteriorColor: function(args)
	{
		var d = args[0];
		var dic = args[1];
		var vimg = args[2];
		var c = VehixConfiguratorWidget;
		var p = VehixPresentationService;
		var dcr;
		var dcic;
		var dcnc;
		var icolors = this.InteriorColors;
		var row1Int;
		var fe;

		c._clearSelectedColor(d);
		dic.innerHTML = "";
		d.className = "vx_configurator-color-selector-color-row-on";
		p._replaceChildren(p.$("vx_configurator-main-data-exterior-color"), p.textNode(this.ExteriorColor.DisplayName));
		vimg.src = this.VehicleImageUrl;

		for (var i = 0; i < d.childNodes.length; i++)
		{
			if (d.childNodes[i].className = "vx_configurator-color-selector-color-image-container")
			{
				for (var j = 0; j < d.childNodes[i].childNodes.length; j++)
				{
					if (d.childNodes[i].childNodes[j].className == "vx_configurator-color-selector-color-image")
					{
						d.childNodes[i].childNodes[j].className = "vx_configurator-color-selector-color-image-on";
						break;
					}
					if (d.childNodes[i].childNodes[j].className == "vx_configurator-color-selector-color-image-na")
					{
						d.childNodes[i].childNodes[j].className = "vx_configurator-color-selector-color-image-on-na";
						break;
					}
				}
				break;
			}
		}

		for (var i = 0; i < icolors.length; i++)
		{
			dcr = p.div("vx_configurator-color-selector-color-row");
			if (i == 0)
				row1Int = dcr;
			dcic = p.div("vx_configurator-color-selector-color-image-container");
			dcnc = p.div("vx_configurator-color-selector-color-name-container");
			dcnc.appendChild(p.textNode(icolors[i].DisplayName));
			VehixWidgetsUtils.AssignBoundEventHandler("click", dcr, icolors[i], c._selectInteriorColor, dcr);
			p._ac(dcr, [dcic, dcnc]);
			dic.appendChild(dcr);
		}
		c.ExteriorColor = this.ExteriorColor;
		c._sendCommunication("ExteriorColorSelected", false, { "ColorCombo": { "ExteriorColor": this.ExteriorColor.DisplayName, "InteriorColor": "N/A"} });
		fe = c._selectInteriorColor.bind(icolors[0]);
		fe(row1Int, [dcic, dcnc]);
	},

	_selectInteriorColor: function(d)
	{
		var p = VehixPresentationService;
		var c = VehixConfiguratorWidget;
		var dn = "N/A";
		if (typeof (this.DisplayName) != "undefined")
			dn = this.DisplayName;
		if (typeof (d) != "undefined")
		{
			c._clearSelectedColor(d);
			d.className = "vx_configurator-color-selector-color-row-on";
		}
		c._sendCommunication("InteriorColorSelected", false, { "ColorCombo": { "ExteriorColor": c.ExteriorColor.DisplayName, "InteriorColor": dn} });
		p._replaceChildren(p.$("vx_configurator-main-data-interior-color"), p.textNode(dn));
	},

	_clearSelectedColor: function(d)
	{
		var dp = d.parentNode;
		for (var i = 0; i < dp.childNodes.length; i++)
		{
			dp.childNodes[i].className = "vx_configurator-color-selector-color-row";
			for (var j = 0; j < dp.childNodes[i].childNodes.length; j++)
			{
				if (dp.childNodes[i].childNodes[j].className = "vx_configurator-color-selector-color-image-container")
				{
					for (var k = 0; k < dp.childNodes[i].childNodes[j].childNodes.length; k++)
					{
						if (dp.childNodes[i].childNodes[j].childNodes[k].className == "vx_configurator-color-selector-color-image-on")
						{
							dp.childNodes[i].childNodes[j].childNodes[k].className = "vx_configurator-color-selector-color-image";
							break;
						}
						if (dp.childNodes[i].childNodes[j].childNodes[k].className == "vx_configurator-color-selector-color-image-on-na")
						{
							dp.childNodes[i].childNodes[j].childNodes[k].className = "vx_configurator-color-selector-color-image-na";
							break;
						}
					}
					break;
				}
			}
		}
	},

	_getUserSessionId: function()
	{
		var u = VehixWidgetsUtils;
		var result = u.GetCookie("UserSessionId");
		if (result)
			return result;
		return "";
	},

	_tabsPopulateOptions: function(d)
	{
		var c = VehixConfiguratorWidget;
		var trim = c.CurrentTrim();
		var serializedStyleState = c._configObject.SerializedStyleState;
		if (typeof (c._optionsTrimId) == "undefined" || c._optionsTrimId != trim.TrimID)
		{
			var data = "trimid=" + trim.TrimID + "&userSessionId=" + c._getUserSessionId() + "&stylestate=" + (typeof (serializedStyleState) == "undefined" ? "" : serializedStyleState);
			VehixPresentationService._replaceChildren(VehixPresentationService.$("vx_configurator-tabs-options-data-container"), c._loadingContainer());
			c._sendCommunication("SelectOptionsTabClicked");
			c._optionsTrimId = trim.TrimID;
			VehixCommunicationService._makeAjaxCall("../_webservices/ConfiguratorRequests.asmx/GetOptionsForTrimId", data, true, "VehixConfiguratorWidget._populateOptionsTabCallBack", null);
		}
	},

	_populateOptionsTabCallBack: function(resp, args)
	{
		var o = resp;
		var c = VehixConfiguratorWidget;
		var p = VehixPresentationService;
		var a = new Array();
		var selOpt = new Array();
		var shdr = "";
		var tI = 0;
		var tM = 0;
		var d = p.div("vx_configurator-options-data-container");
		var dins = p.div("vx_configurator-options-data-instruction vx_containsFloats");
		var dinsa = p.div("vx_configurator-options-data-instruction-arrow-container");
		var dinst = p.div("vx_configurator-options-data-instruction-text-container");
		c._rowon = false;
		c._newOptions = true;

		for (var i = 0; i < o.L.length; i++)
		{
			c._rowon = !c._rowon;
			if (o.L[i].H != shdr && o.L[i].H.length)
			{
				a.push(c._optionsSectionHeader(o.L[i].H));
				shdr = o.L[i].H;
				c._rowon = false;
			}
			if (o.L[i].S.toLowerCase() != "unselected" && o.L[i].S.toLowerCase() != "excluded")
			{
				selOpt.push(row.apply(c, [o, i]));
				tI += o.L[i].I;
				tM += o.L[i].M;
				if (o.L[i].D.length)
				{
					selOpt.push(dRow(o.L[i].D));
				}
			}
			a.push(row.apply(c, [o, i]));
			if (o.L[i].D.length)
			{
				a.push(dRow(o.L[i].D));
			}
		}

		var trim = c.CurrentTrim();

		p._replaceChildren(p.$("vx_configurator-main-data-options-msrp"), p.textNode(tM, "c"));
		p._replaceChildren(p.$("vx_configurator-main-data-options-invoice"), p.textNode(tI, "c"));
		p._replaceChildren(p.$("vx_configurator-main-data-total-msrp"), p.textNode(trim.BasePrice + tM, "c"));
		p._replaceChildren(p.$("vx_configurator-main-data-total-invoice"), p.textNode(trim.InvoicePrice + tI, "c"));

		var dod = p.scrollingPanel("vx_configurator-options-data", a, "", [p.div("vx_configurator-options-pending", "vx_configurator-options-pending")]);
		var dcbsk = p.div("vx_configurator-options-selection-key-container");
		dcbsk.appendChild(p.image("vx_configurator-options-selection-key"));
		dinsa.appendChild(p.image("vx_configurator-options-instruction-arrow"));
		dinst.appendChild(p.textNode("Please refer to the icon key at the bottom of the page for definitions of the different option states"));
		p._ac(dins, [dinsa, dinst]);
		p._ac(d, [dins, dod, dcbsk]);
		p._replaceChildren(p.$("vx_configurator-tabs-options-data-container"), d);
		c._optionToggling = false;
		c._selectedOptions = selOpt;
		c._optContainer = dod;
		if (c._currentScrollTop && !isNaN(c._currentScrollTop) && c._currentScrollTop > 0)
			setScrollPosition(dod);

		function setScrollPosition(obj)
		{
			if (obj && obj.childNodes)
			{
				for (var i = 0; i < obj.childNodes.length; i++)
				{
					if (obj.childNodes[i].className == "vx_configurator-options-data-scroll-container")
					{
						for (var j = 0; j < obj.childNodes[i].childNodes.length; j++)
						{
							if (obj.childNodes[i].childNodes[j].className == "vx_configurator-options-data-scroll")
							{
								obj.childNodes[i].childNodes[j].scrollTop = c._currentScrollTop;
								break;
							}
						}
					}
				}
			}
		}

		function dRow(s)
		{
			var d = p.div("vx_configurator-options-data-row");
			if (VehixConfiguratorWidget._rowon)
				d.className = "vx_configurator-options-data-row vx_containsFloats vx_widgets-data-table-data-row-on";
			var d1 = p.div("vx_configurator-options-data-column1");
			var d2 = p.div("vx_configurator-options-data-column-d");
			d1.appendChild(p.image("vx_configurator-options-spacer"));
			d2.appendChild(p.textNode(s));
			p._ac(d, [d1, d2]);
			return d;
		}

		function row(o, i, b)
		{
			var d = p.div("vx_configurator-options-data-row vx_containsFloats");
			if (this._rowon)
				d.className = "vx_configurator-options-data-row vx_containsFloats vx_widgets-data-table-data-row-on";
			var opt = o.L[i];
			var d1 = p.div("vx_configurator-options-data-column1");
			var d2 = p.div("vx_configurator-options-data-column2");
			var d3 = p.div("vx_configurator-options-data-column3-" + opt.S.toLowerCase());
			var d4 = p.div("vx_configurator-options-data-column4-" + opt.S.toLowerCase());
			var img = p.image("vx_configurator-options-" + opt.S.toLowerCase());
			var lnk = p.anchor("javascript:null", img);
			var callback = this._optionClicked.bind(o);
			lnk.onclick = function(e)
			{
				VehixWidgetsUtils._cancelEvent(e);
				callback(opt);
			}
			d1.appendChild(lnk);
			d2.appendChild(p.textNode(opt.N));
			d3.appendChild(p.textNode(opt.I, "c"));
			d4.appendChild(p.textNode(opt.M, "c"));
			p._ac(d, [d1, d2, d3, d4]);
			return d;
		}
		c._sendCommunication("SelectedOptionsChanged", false, { "SerializedStyleState": o.St });
	},

	_optionsSectionHeader: function(s)
	{
		var p = VehixPresentationService;
		var d = p.div("vx_configurator-options-data-section-header");
		var d1 = p.div("vx_configurator-options-data-section-header-column1");
		var d2 = p.div("vx_configurator-options-data-section-header-column2");
		var d3 = p.div("vx_configurator-options-data-section-header-column3");
		d1.appendChild(p.textNode(s));
		d2.appendChild(p.textNode("Invoice"));
		d3.appendChild(p.textNode("MSRP"));
		p._ac(d, [d1, d2, d3]);
		return d;
	},

	_showOptionsUserChoiceRequired: function(o)
	{
		var p = VehixPresentationService;
		var c = VehixConfiguratorWidget;
		var d = p.div("vx_configurator-options-conflict-container");
		var sp = p.span("vx_configurator-options-conflict-header");
		var oc;
		var ocrc = new Array();
		var dopt;

		sp.appendChild(p.textNode("Attention"));

		for (var i = 0; i < o.L.length; i++)
		{
			if (o.L[i].C == o.Oc)
			{
				oc = o.L[i];
			}
			else
			{
				if (o.Crc && o.Crc.length)
				{
					for (var j = 0; j < o.Crc.length; j++)
					{
						if (o.L[i].C == o.Crc[j])
						{
							ocrc.push(o.L[i]);
							break;
						}
					}
				}
			}
		}
		d.appendChild(sp);
		dopt = p.div("vx_configurator-options-conflict-option-selection-head");
		dopt.appendChild(p.textNode("Selection"));
		d.appendChild(dopt);
		dopt = p.div("vx_configurator-options-conflict-option-selection");
		dopt.appendChild(p.textNode(oc.N));
		d.appendChild(dopt);
		dopt = p.div("vx_configurator-options-conflict-option-selection-head");
		dopt.appendChild(p.textNode("Requires"));
		d.appendChild(dopt);
		var linkcall = c._optionClicked.bind(o);

		for (i = 0; i < ocrc.length; i++)
		{
			dopt = p.div("vx_configurator-options-conflict-option-resolve");
			dopt.appendChild(p.textNode(ocrc[i].N));
			d.appendChild(dopt);
			var aadd = p.anchor("javascript:null", "Add this option >>");

			var cb = function(e)
			{
				VehixWidgetsUtils._cancelEvent(e);
				c._optionToggling = false;
				linkcall(this);
				p.Hide(d);
				c._sendCommunication("Option_" + o.Oc + "_Clicked");
			}

			aadd.onclick = cb.bind(ocrc[i]);

			dopt.appendChild(aadd);

			if (i != ocrc.length - 1)
			{
				dopt = p.div("vx_configurator-options-conflict-option-and_or");
				dopt.appendChild(p.textNode("or"));
				d.appendChild(dopt);
			}
		}
		dopt = p.div("vx_configurator-options-conflict-footer");
		dopt.appendChild(p.textNode("Or you can cancel the selection?"));
		var acncl = p.anchor("javascript:null", "Cancel >>", "vx_configurator-options-conflict-footer-cancel");
		acncl.onclick = function(e)
		{
			VehixWidgetsUtils._cancelEvent(e);
			c._optionToggling = false;
			p.Hide(p.$("vx_configurator-options-pending"));
			p.Hide(d);
		}
		dopt.appendChild(acncl);
		d.appendChild(dopt);
		p.$("vx_configurator-tabs-options-data-container").appendChild(d);
	},

	_showOptionsUserConfirmationRequired: function(o)
	{
		var p = VehixPresentationService;
		var c = VehixConfiguratorWidget;
		var d = p.div("vx_configurator-options-conflict-container");
		var sp = p.span("vx_configurator-options-conflict-header");
		var oc;
		var odoc = new Array();
		var oaoc = new Array();
		var dopt;

		sp.appendChild(p.textNode("Attention"));

		for (var i = 0; i < o.L.length; i++)
		{
			if (o.L[i].C == o.Oc)
			{
				oc = o.L[i];
			}
			else
			{
				if (o.Doc && o.Doc.length)
				{
					for (var j = 0; j < o.Doc.length; j++)
					{
						if (o.L[i].C == o.Doc[j])
						{
							odoc.push(o.L[i]);
							break;
						}
					}
				}
				if (o.Aoc && o.Aoc.length)
				{
					for (j = 0; j < o.Aoc.length; j++)
					{
						if (o.L[i].C == o.Aoc[j])
						{
							oaoc.push(o.L[i]);
							break;
						}
					}
				}
			}
		}

		d.appendChild(sp);
		dopt = p.div("vx_configurator-options-conflict-option-selection-head");
		dopt.appendChild(p.textNode("Selection"));
		d.appendChild(dopt);
		dopt = p.div("vx_configurator-options-conflict-option-selection");
		dopt.appendChild(p.textNode(oc.N));
		d.appendChild(dopt);

		if (odoc.length)
		{
			dopt = p.div("vx_configurator-options-conflict-option-selection-head");
			dopt.appendChild(p.textNode("Removes"));
			d.appendChild(dopt);
		}

		for (i = 0; i < odoc.length; i++)
		{
			dopt = p.div("vx_configurator-options-conflict-option-remove");
			dopt.appendChild(p.textNode(odoc[i].N));
			d.appendChild(dopt);
			if (i != odoc.length - 1)
			{
				dopt = p.div("vx_configurator-options-conflict-option-and_or");
				dopt.appendChild(p.textNode("and"));
				d.appendChild(dopt);
			}
		}

		if (oaoc.length)
		{
			dopt = p.div("vx_configurator-options-conflict-option-selection-head");
			dopt.appendChild(p.textNode("Adds"));
			d.appendChild(dopt);
		}

		for (i = 0; i < oaoc.length; i++)
		{
			dopt = p.div("vx_configurator-options-conflict-option-add");
			dopt.appendChild(p.textNode(oaoc[i].N));
			d.appendChild(dopt);
		}

		dopt = p.div("vx_configurator-options-conflict-footer");
		dopt.appendChild(p.textNode("Would you like to continue with or cancel your selection?"));
		var acntu = p.anchor("javascript:null", "Continue >>");
		acntu.onclick = function(e)
		{
			VehixWidgetsUtils._cancelEvent(e);
			c._populateOptionsTabCallBack(o, []);
			p.Hide(d);
			c._sendCommunication("Option_" + o.Oc + "_Clicked");
		}
		var acncl = p.anchor("javascript:null", "Cancel >>");
		acncl.onclick = function(e)
		{
			VehixWidgetsUtils._cancelEvent(e);
			c._optionToggling = false;
			p.Hide(p.$("vx_configurator-options-pending"));
			p.Hide(d);
		}
		dopt.appendChild(acntu);
		dopt.appendChild(acncl);
		d.appendChild(dopt);

		p.$("vx_configurator-tabs-options-data-container").appendChild(d);
	},

	_optionClickedCallback: function(resp, args)
	{
		var o = resp;
		var c = VehixConfiguratorWidget;
		var findScrollPosition = function(obj)
		{
			var scrolltop = 0;
			if (obj && obj.childNodes)
			{
				for (var i = 0; i < obj.childNodes.length; i++)
				{
					if (obj.childNodes[i].className == "vx_configurator-options-data-scroll-container")
					{
						for (var j = 0; j < obj.childNodes[i].childNodes.length; j++)
						{
							if (obj.childNodes[i].childNodes[j].className == "vx_configurator-options-data-scroll")
							{
								scrolltop = obj.childNodes[i].childNodes[j].scrollTop;
							}
						}
					}
				}
			}
			return scrolltop;
		}
		if (o.Scs.toLowerCase() == "true")
		{
			c._currentScrollTop = findScrollPosition(c._optContainer);
			c._populateOptionsTabCallBack(resp, args);
			c._sendCommunication("Option_" + o.Oc + "_Clicked");
		}
		else
		{
			switch (o.Sv)
			{
				case "UserChoiceNeeded":
					c._showOptionsUserChoiceRequired(o);
					break;
				case "UserConfirmationNeeded":
					if (false)
					{
						//						for(k in vcOptionToggleResponse.configurationStyle.vehicleOptions)
						//						{
						//							processVehicleOptions(k);
						//						}
						//						if(gO(vcOptionToggleResponse.originatingChromeOptionCode + 'html'))
						//						{
						//							gO(vcOptionToggleResponse.originatingChromeOptionCode + 'html').className = "optionsDescriptionContainer";
						//						}
						//						vsSelectorVehicle.styleState = vcOptionToggleResponse.configurationStyle.styleState.serializedValue;
						//						vcOptionConfirmed = false;
					}
					else
					{
						c._showOptionsUserConfirmationRequired(o);
					}
					break;
				default:
					for (k in vcOptionToggleResponse.configurationStyle.vehicleOptions)
					{
						processVehicleOptions(k);
					}
					if (gO(vcOptionToggleResponse.originatingChromeOptionCode + 'html'))
					{
						gO(vcOptionToggleResponse.originatingChromeOptionCode + 'html').className = "optionsDescriptionContainer";
					}
					vsSelectorVehicle.styleState = vcOptionToggleResponse.configurationStyle.styleState.serializedValue;
			}
		}
	},

	_optionClicked: function(opt)
	{
		var c = VehixConfiguratorWidget;
		var p = VehixPresentationService;
		if (c._optionToggling)
		{
			alert("We're still validating your previous selection.\nClick \"OK\" and try again.");
		}
		else
		{
			c._optionToggling = true;
			p.Show(p.$("vx_configurator-options-pending"));
		}
		c.St = this.St;
		var data = "stylestate=" + this.St + "&optcode=" + opt.C + "&autobuilderid=" + this.Ab;
		VehixCommunicationService._makeAjaxCall("../_webservices/ConfiguratorRequests.asmx/ToggleOption", data, true, "VehixConfiguratorWidget._optionClickedCallback", null);
	},

	_tabsPopulateSummary: function(d)
	{
		var c = VehixConfiguratorWidget;
		if (c._newOptions)
		{
			d.innerHTML = "";
			var p = VehixPresentationService;
			var trim = c.CurrentTrim();
			var dc = p.div("vx_configurator-summary-data-container");
			var dh = p.div("vx_widgets-data-header-row vx_containsFloats");
			var ddthc1 = p.div("vx_widgets-data-header-column1");
			p._replaceChildren(d, c._loadingContainer());
			c._sendCommunication("SummaryTabClicked");
			ddthc1.appendChild(p.textNode(trim.TrimName));
			dh.appendChild(ddthc1);
			dc.appendChild(dh);
			c._fillTrimDataContainer(dc, trim);
			dh = p.div("vx_widgets-data-header-row vx_containsFloats");
			ddthc1 = p.div("vx_widgets-data-header-column1");
			ddthc1.appendChild(p.textNode("Selected Options"));
			dh.appendChild(ddthc1);
			dc.appendChild(dh);
			if (c._selectedOptions && c._selectedOptions.length)
				dc.appendChild(p.scrollingPanel("vx_configurator-options-data", c._selectedOptions, "", [p.div("vx_configurator-options-pending", "vx_configurator-options-pending")]));
			p._replaceChildren(d, dc);
			c._newOptions = false;
		}
	},

	_loadingContainer: function()
	{
		var p = VehixPresentationService;
		var d = p.div("vx_configurator-loading-data-container");
		d.appendChild(p.image("vx_widgets_loading_image"));
		return d;
	},

	_sendCommunication: function(a, clearTrim, extObj)
	{
		VehixWidgetsUtils._sendCommunication(VehixConfiguratorWidget, a, clearTrim, extObj);
	},

	_tabsPopulateTrim: function(dtrim, resp)
	{
		var p = VehixPresentationService;
		var c = this;
		var ts = c._createTrimDataContainer(dtrim, resp);
		ts._callback = function(e)
		{
			VehixWidgetsUtils._cancelEvent(e);
			var trim = this.GetSelectedTrim();
			this.dataContainer.innerHTML = "";
			c._fillTrimDataContainer(this.dataContainer, trim);
			p._replaceChildren(p.$("vx_configurator-main-data-base-msrp"), p.textNode(trim.BasePrice, "c"));
			p._replaceChildren(p.$("vx_configurator-main-data-base-invoice"), p.textNode(trim.InvoicePrice, "c"));
			p._replaceChildren(p.$("vx_configurator-main-data-total-msrp"), p.textNode(trim.BasePrice, "c"));
			p._replaceChildren(p.$("vx_configurator-main-data-total-invoice"), p.textNode(trim.InvoicePrice, "c"));
			p._replaceChildren(p.$("vx_configurator-main-data-interior-color"), p.textNode("[ user selection ]"));
			p._replaceChildren(p.$("vx_configurator-main-data-exterior-color"), p.textNode("[ user selection ]"));
			p._replaceChildren(p.$("vx_configurator-main-data-options-msrp"), p.textNode(0, "c"));
			p._replaceChildren(p.$("vx_configurator-main-data-options-invoice"), p.textNode(0, "c"));
			p.$("vx_configurator-tabs-color-data-container").innerHTML = "";
			p.$("vx_configurator-tabs-options-data-container").innerHTML = "";
			p.$("vx_configurator-tabs-summary-data-container").innerHTML = "";
			c._selectedOptions = "";
			c._sendCommunication("TrimSelectorChanged");
		}
		c._fillTrimDataContainer(ts.dataContainer, ts.GetSelectedTrim());
		this.CurrentTrim = ts.GetSelectedTrim.bind(ts);
	},

	_createTrimDataContainer: function(d, trims)
	{
		var p = VehixPresentationService;
		var ddt = p.div("vx_configurator-trims-trim-data-container");
		var ddth = p.div("vx_widgets-data-header-row vx_containsFloats");
		var ddthc1 = p.div("vx_widgets-data-header-column1");
		var ddthc2 = p.div("vx_widgets-data-header-column2");
		var ts = new Vehix.Widgets.Controls.TrimSelector(trims, this.Vehicle.TrimID, ddt);

		ddthc1.appendChild(p.textNode("Vehicle Details"));
		p._ac(ddthc2, [ts.anchorBack, p.textNode(" : "), ts.anchorNext]);
		p._ac(ddth, [ddthc1, ddthc2]);
		p._ac(d, [ts.div, ddth, ddt]);
		return ts;
	},

	_fillTrimDataContainer: function(d, trim)
	{
		var p = VehixPresentationService;
		var u = VehixWidgetsUtils;
		var aStyles = ["vx_configurator-data-table-data-column1", "vx_configurator-data-table-data-column2", "vx_configurator-data-table-data-column3", "vx_configurator-data-table-data-column4"];
		var d1 = p._buildDataRow
		(
		aStyles,
		["Base MSRP:", u.FormatCurrency(trim.BasePrice), "Engine/Fuel:", trim.EngineFuel],
		"vx_widgets-data-table-data-row vx_containsFloats"
		);
		var d2 = p._buildDataRow
		(
		aStyles,
		["Base Invoice:", u.FormatCurrency(trim.InvoicePrice), "Transmission:", trim.Transmission],
		"vx_widgets-data-table-data-row-on vx_containsFloats"
		);
		var d3 = p._buildDataRow
		(
		aStyles,
		["Destination:", u.FormatCurrency(trim.DestinationCharge), "Door/BodyStyle:", trim.Doors + trim.BodyStyle],
		"vx_widgets-data-table-data-row vx_containsFloats"
		);
		var d4 = p._buildDataRow
		(
		aStyles,
		["Manufacturer Code:", trim.ManufacturerCode, "Drive Type:", trim.DriveType],
		"vx_widgets-data-table-data-row-on vx_containsFloats"
		);
		p._ac(d, [d1, d2, d3, d4]);
	},

	_renderMainDataRow: function()
	{
		var p = VehixPresentationService;
		var v = this.Vehicle;
		var div = p.div("vx_configurator-main-data-row vx_containsFloats");
		var mdlc = p.div("vx_configurator-main-data-left-column");
		var mdrc = p.div("vx_configurator-main-data-right-column");
		var mdlcy = p.div("vx_configurator-main-data-vehicle-name-row");
		mdlcy.appendChild(p.textNode(v.Year));
		var mdlcmk = p.div("vx_configurator-main-data-vehicle-name-row");
		mdlcmk.appendChild(p.textNode(v.MakeName));
		var mdlcmd = p.div("vx_configurator-main-data-vehicle-name-row", "vx_configurator-main-data-model");
		mdlcmd.appendChild(p.textNode(v.ModelName));
		var mdlcic = p.div("vx_configurator-main-data-vehicle-color-row");
		var mdlcicd = p.span(null, "vx_configurator-main-data-interior-color");
		mdlcicd.appendChild(p.textNode(this._configObject._interiorColor ? this._configObject._interiorColor : "[ user selection ]"));
		p._ac(mdlcic, [p.textNode("Int: "), mdlcicd]);
		var mdlcec = p.div("vx_configurator-main-data-vehicle-color-row");
		var mdlcecd = p.span(null, "vx_configurator-main-data-exterior-color");
		mdlcecd.appendChild(p.textNode(this._configObject._exteriorColor ? this._configObject._exteriorColor : "[ user selection ]"));
		p._ac(mdlcec, [p.textNode("Ext: "), mdlcecd]);
		var mdrch = p.div("vx_configurator-main-data-right-column-header-row vx_configurator-row-on");
		var mdrch1 = p.div("vx_configurator-main-data-right-column1");
		var mdrch2 = p.div("vx_configurator-main-data-right-column2");
		mdrch2.appendChild(p.textNode("MSRP"));
		var mdrch3 = p.div("vx_configurator-main-data-right-column3");
		mdrch3.appendChild(p.textNode("Invoice"));
		var mdrcb = p.div("vx_configurator-main-data-right-column-row");
		var mdrcb1 = p.div("vx_configurator-main-data-right-column1");
		mdrcb1.appendChild(p.textNode("Base:"));
		var mdrcb2 = p.div("vx_configurator-main-data-right-column2", "vx_configurator-main-data-base-msrp");
		mdrcb2.appendChild(p.textNode(v.BasePrice, "c"));
		var mdrcb3 = p.div("vx_configurator-main-data-right-column3", "vx_configurator-main-data-base-invoice");
		mdrcb3.appendChild(p.textNode(v.InvoicePrice, "c"));
		var mdrco = p.div("vx_configurator-main-data-right-column-row vx_configurator-row-on");
		var mdrco1 = p.div("vx_configurator-main-data-right-column1");
		mdrco1.appendChild(p.textNode("Options:"));
		var mdrco2 = p.div("vx_configurator-main-data-right-column2", "vx_configurator-main-data-options-msrp");
		mdrco2.appendChild(p.textNode(0, "c"));
		var mdrco3 = p.div("vx_configurator-main-data-right-column3", "vx_configurator-main-data-options-invoice");
		mdrco3.appendChild(p.textNode(0, "c"));
		var mdrct = p.div("vx_configurator-main-data-right-column-row");
		var mdrct1 = p.div("vx_configurator-main-data-right-column1");
		mdrct1.appendChild(p.textNode("Total:"));
		var mdrct2 = p.div("vx_configurator-main-data-right-column2", "vx_configurator-main-data-total-msrp");
		mdrct2.appendChild(p.textNode(v.BasePrice, "c"));
		var mdrct3 = p.div("vx_configurator-main-data-right-column3", "vx_configurator-main-data-total-invoice");
		mdrct3.appendChild(p.textNode(v.InvoicePrice, "c"));

		p._ac(div, [mdlc, mdrc]);
		p._ac(mdlc, [mdlcy, mdlcmk, mdlcmd, mdlcic, mdlcec]);
		p._ac(mdrc, [mdrch, mdrcb, mdrco, mdrct]);
		p._ac(mdrch, [mdrch1, mdrch2, mdrch3]);
		p._ac(mdrcb, [mdrcb1, mdrcb2, mdrcb3]);
		p._ac(mdrco, [mdrco1, mdrco2, mdrco3]);
		p._ac(mdrct, [mdrct1, mdrct2, mdrct3]);

		this._widgetdiv.appendChild(div);
	},

	_changeModel: function(v)
	{
		VehixWidgetsUtils._changeModel(VehixConfiguratorWidget, v);
	}
}
