//---------------------------------
// JavaScript to get Pricing info
// from Protomold server .
//---------------------------------
//
// Requirements:
// - onLoad gets called from <body>
// - all html_elements in onLoad exist on the page.
// - variable "ajax_request_url" is defined outside.
//


// Load these vars outside.
//var ajax_request_url = "";
var current_request_key = "";
// [end load outside]

var http_request = createRequestObject();
var originalDeliveryOptions = null;


function createRequestObject()
{
	var ro;
	var browser = navigator.appName;
	if (browser == "Microsoft Internet Explorer") {
		ro = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		ro = new XMLHttpRequest();
	}
	return ro;
}



function httpResponseToArray()
{
	// Reads http_request response, expecting the format:
	// var1:value1
	// var2:value2
	// ...
	// and returns an JS array of these values.
	var response = "";

	if (typeof (http_request.responseText) == "unknown") 
	{
		response = "";
	} 
	else 
	{
		response = http_request.responseText;
	}
	 
	var response_array = new Array();

	response_array['error'] = "";


	// Make an array out of lines in the response.
	if (response.indexOf('\r\n' != -1))
	{
		var response_lines = response.split('\r\n');
		// Get rid of empty last element.
		if (response_lines[response_lines.size] == "") {response_lines.pop();}
	}
	else {alert('error!'); return false;}
	
	
	// Populate response_array with values from response.
	for (var i = 0; i < response_lines.length; i++)
	{
		if (response_lines[i].indexOf(':' != -1))
		{
			response_lines[i] = response_lines[i].split(':');
			response_array[response_lines[i][0]] = response_lines[i][1];
		}
		else {alert('error!'); return false;}
	}


	/*!!!!!!!!!!!!!!!!!!!!!
	 THIS ISN'T WORKING!!!!
	 !!!!!!!!!!!!!!!!!!!!!!*/
	if (response_array['error'] !== "")
	{
		alert("ERROR! \r\n" + http_request.responseText);
	}

	return response_array;

}





//----------------------------------------
// (More-so) FirstQuote-specific functions
//----------------------------------------

var html_elements = new Array();

var response_values = new Array();
var active_timer;



function handleResponse()
{
	if (http_request != null && http_request.readyState == 4)
	{
		// Delay a quarter second so that super fast connections
		// can still tell what's going on.
		if (active_timer != null)
		{
			clearTimeout(active_timer);
		}
		active_timer = setTimeout("processResponse()",250);
	}
}

function handleProtoViewResponse()
{
	if (http_request != null && http_request.readyState == 4)
	{
		// Stop earlier instances so we don't make a new request on every readyState change.
		//clearTimeout(active_timer);

		// Delay a quarter second so that super fast connections
		// can still tell what's going on.
		if (active_timer != null)
		{
			clearTimeout(active_timer);
		}
		active_timer = setTimeout("processProtoViewResponse()",250);
	}
}


function processResponse()
{
	// Load up response array.
	response_values = httpResponseToArray();

	// Exit function if the response answers a different
	// question than the one we want.  (Incase we are making multiple requests
	// before we get the first answer...)
	if (response_values['request_key'] !== current_request_key)	
	{
		// Show "Pricing not available." warning, etc...
		hideShowBasedOnSelections();		
		
		// Exit the function
		return false;
	}

	// Update the PQV to reflect the current toolset
	if (currentIssueID != response_values['toolset_id'])
	{
		currentIssueID = response_values['toolset_id'];
		pvint.MoveToIssueID(currentIssueID);
	}

	// Update the ProtoView and PDF hyperlinks
	if (html_elements['fullscreen_protoview_link'] != null)
	{
		html_elements['fullscreen_protoview_link'].href = replaceToolsetIDInUrlString(html_elements['fullscreen_protoview_link'].href, response_values['toolset_id']);
	}
	if (html_elements['download_protoview_link'] != null)
	{
		html_elements['download_protoview_link'].href = replaceToolsetIDInUrlString(html_elements['download_protoview_link'].href, response_values['toolset_id']);
	}
	if (html_elements['view_pdf_link'] != null) 
	{
        // Set the 3D PDF URL
	    html_elements['view_pdf_link'].href = replaceToolsetIDInUrlString(html_elements['view_pdf_link'].href, response_values['toolset_id']);	

        // Set the 3D PDF link visibility
	    var firstQuoteVersion = response_values['firstquote_version'];
	    if (firstQuoteVersion >= 2) 
	    {
	        html_elements['view_pdf_link'].style.display = 'block';
	    }
	    else 
	    {
	        html_elements['view_pdf_link'].style.display = 'none';
	    }
	}
	

	// Upadate all the values that read exactly from 
	// the response values.
	var update_element_values_verbatim = ["tooling_cost", "quantity", "total_price"];
	for (var i = 0; i < update_element_values_verbatim.length; i++)
	{
		html_elements[update_element_values_verbatim[i]].innerHTML = response_values[update_element_values_verbatim[i]];
	}
	html_elements["price_qty"].innerHTML = response_values["quantity"];
	hideShowBasedOnSelections();
}

function replaceToolsetIDInUrlString(urlString, newID)
{
	var linkString = urlString.replace(/toolsetID=[0-9]/, 'toolsetID=' + newID);
	return linkString;
}


var lastTransform = "";
var lastSetting = "";
var iAttemptCounter = 0;
var iMaxAttemptsBeforeStopping = 120;

function processProtoViewResponse()
{
	// Load up response array.
	response_values = httpResponseToArray();

	if (response_values['active'] == 'False' || response_values['active'] == 'false')
	{
		sessionActive = false;
		return;
	}
	
	if (iAttemptCounter >= iMaxAttemptsBeforeStopping)
	{
		sessionActive = false;
		return;
	}


	
	try
	{
		window.status = "attempt " + iAttemptCounter++;
	
		if (lastTransform != response_values['transform'])
		{
			document.getElementById("control_3d").CameraTransform = response_values['transform'];
			lastTransform = response_values['transform'];
			window.status += " (transform)";
			iAttemptCounter = 0; // Reset attempt counter
		}
		
		if (lastSetting != response_values['displaySetting'])
		{
			if (response_values['displaySetting'] == 'ASMILLED' || response_values['displaySetting'] == null)
			{
				window.status += " (setting=" +response_values['displaySetting']+ ")";
				var chkAsMilledView = document.getElementById("ctl00_MainContentPlaceHolder_ProtoViewModeRadioButtonList_0");
				if (chkAsMilledView != null)
				{
					chkAsMilledView.click();
				}
			}
			else
			{
				window.status += " (setting=NORMAL)";
				var chkOriginalView = document.getElementById("ctl00_MainContentPlaceHolder_ProtoViewModeRadioButtonList_1");
				if (chkOriginalView != null)
				{
					chkOriginalView.click();
				}
			}
			lastSetting = response_values['displaySetting'];
			iAttemptCounter = 0; // Reset attempt counter
		}
		
		window.status += " completed";
	}
	catch (Exception) {}
	
}


function onLoad ()
{	
	// Make reference array for all dynamic html elements.
	html_elements['tooling_cost'] = document.getElementById("ctl00_MainContentPlaceHolder_ToolingCostLabel");
	html_elements['quantity'] = document.getElementById("ctl00_MainContentPlaceHolder_QuantityLabel");
	html_elements['total_price'] = document.getElementById("ctl00_MainContentPlaceHolder_TotalCostLabel");
	html_elements['lead_time'] = document.getElementById("ctl00_MainContentPlaceHolder_LeadTimeLabel");
	html_elements['lead_time_message'] = document.getElementById("LeadTimeMessage");
	html_elements['lead_time_date'] = document.getElementById("LeadTimeDate");
	html_elements['price_qty'] = document.getElementById("ctl00_MainContentPlaceHolder_price_qty");
	html_elements['material_warning'] = document.getElementById("MaterialWarning");
	html_elements['invalid_pricing'] = document.getElementById("ctl00_MainContentPlaceHolder_InvalidPricePanel");
	html_elements['fullscreen_protoview_link'] = document.getElementById("ctl00_MainContentPlaceHolder_FullScreenProtoViewResourceHyperLink");
	html_elements['download_protoview_link'] = document.getElementById("ctl00_MainContentPlaceHolder_DownloadProtoViewResourceHyperLink");
	html_elements['view_pdf_link'] = document.getElementById("ctl00_MainContentPlaceHolder_View3DPdfResourceHyperLink");
	html_elements['surface_finish_row'] = document.getElementById("ctl00_MainContentPlaceHolder_SurfaceFinishRow");

	originalDeliveryOptions = new Array(document.aspnetForm.ctl00$MainContentPlaceHolder$DropDownListDelivery.options.length);
	for (var i = 0; i < document.aspnetForm.ctl00$MainContentPlaceHolder$DropDownListDelivery.options.length; i++) 
	{
		originalDeliveryOptions[i] = document.aspnetForm.ctl00$MainContentPlaceHolder$DropDownListDelivery.options[i];
	}

	hideShowBasedOnSelections();
}



function hideShowBasedOnSelections()
{
	// Show "Pricing not available." warning
	if (response_values['total_price'] == null)
	{
		html_elements['invalid_pricing'].style.display = 'block';
	}
	else
	{
		html_elements['invalid_pricing'].style.display = 'none';
	}

	// Set lead time text
	if (response_values['min_lead_time'] == '1' || response_values['min_lead_time'] == '2')
	{
		html_elements['lead_time'].innerHTML = "1&#150;3";
	}
	else if (response_values['min_lead_time'] == '3' || response_values['min_lead_time'] == '4')
	{
		html_elements['lead_time'].innerHTML = "3&#150;5";
	}
	else
	{
		html_elements['lead_time'].innerHTML = "5&#150;10";
	}
	
	// Set the lead time date
	html_elements['lead_time_date'].innerHTML = response_values['est_delivery_date'];


	// Correct any lead time discrepancies.
	if (document.aspnetForm.ctl00$MainContentPlaceHolder$DropDownListDelivery.value != '' && response_values['min_lead_time'] != '')
	{
		var ddlDelivery = document.aspnetForm.ctl00$MainContentPlaceHolder$DropDownListDelivery;
		var iDeliverySelection = ddlDelivery.value * 1;
		var iLeadTimeValue = response_values['min_lead_time'] * 1;
		
		if (response_values['delivery_options'] != null) 
		{
			// Clear the delivery options.
			for (var i = ddlDelivery.options.length - 1; i >= 0; i--) 
			{
				ddlDelivery.remove(i);
			}

			// Rebuild the delivery options.
			var deliveryOpts = response_values['delivery_options'].toString().split(',');
			for (var i = 0; i < originalDeliveryOptions.length; i++) 
			{
				if (array_contains(deliveryOpts, originalDeliveryOptions[i].value)) 
				{
					var optionSelected = (iDeliverySelection * 1 == originalDeliveryOptions[i].value * 1);
					ddlDelivery.options.add(new Option(originalDeliveryOptions[i].text, originalDeliveryOptions[i].value, false, optionSelected));
				}
			} 
		}
	}


	// Deal with the material warning message, if present
	html_elements['material_warning'].style.display = 'none';
	html_elements['material_warning'].innerHTML = '';
	if (response_values['material_warning_tag'] != null && response_values['material_warning_tag'] != '')
	{
		html_elements['material_warning'].style.display = 'block';
		html_elements['material_warning'].innerHTML = response_values['material_warning_tag'];
	}

	// if not aluminum toolset hide the surface finish selection
	html_elements['surface_finish_row'].style.display = 'none';
	if (response_values['toolset_id'] != null && response_values['toolset_id'] != '') 
	{
		if (response_values['toolset_id'] != '1') {
			html_elements['surface_finish_row'].style.display = '';
		}
		else {
			html_elements['surface_finish_row'].style.display = 'none';
		}
	}
}


function updatePQPrices()
{
	enter_waiting_state();
	var hasTappedHoles = false;
	var tappedHoleCount = 0;
	
	
	// Build the URL
	var raw_prices_url;
	var post_string;
	raw_prices_url = ajax_request_url + "";
	post_string = "&delivery=" + document.aspnetForm.ctl00$MainContentPlaceHolder$DropDownListDelivery.value +
				  "&qty=" + document.aspnetForm.ctl00$MainContentPlaceHolder$DropDownListQuantity.value +
				  "&materialID=" + document.aspnetForm.ctl00$MainContentPlaceHolder$DropDownListMaterial.value;
				  

	// Assign some string that uniquely identifies the request,
	// so we can match it up to the response later.
	current_request_key = document.aspnetForm.ctl00$MainContentPlaceHolder$DropDownListDelivery.value +
				  "/" + document.aspnetForm.ctl00$MainContentPlaceHolder$DropDownListQuantity.value +
				  "/" + document.aspnetForm.ctl00$MainContentPlaceHolder$DropDownListMaterial.value;

	var selectedCountLabel = document.getElementById('ctl00_MainContentPlaceHolder_SelectedHoleCountLabel');
	if (selectedCountLabel != null && (typeof (selectedCountLabel) !== 'undefined'))
	{
		//include tapped holes
		curToolsetID = GetToolsetID(document.aspnetForm.ctl00$MainContentPlaceHolder$DropDownListMaterial.selectedIndex);
		tappedHoleCount = GetSelectedTappedHoleCount(curToolsetID);
		if (tappedHoleCount != null && tappedHoleCount > 0)
		{
			hasTappedHoles = true;
		}
	}
	if (hasTappedHoles) 
	{
		//include tapped holes
		post_string += "&tappedHoleQty=" + tappedHoleCount;
		current_request_key += "/" + tappedHoleCount;
	}
	
	// Send http request.
	http_request.open('post', raw_prices_url, true);
	http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	http_request.onreadystatechange = handleResponse;
	http_request.send(post_string);
}


function getProtoViewCommand()
{
	if (ajax_protoview_url == '')
	{
		//sessionActive = false;
		return;
	}
	
	//enter_waiting_state();
	// Build the URL
	var raw_prices_url;
	var post_string;
	raw_prices_url = ajax_protoview_url + "";
	post_string = "any";
	
	// Send http request.
	try
	{
		http_request.open('post', raw_prices_url, true);
		http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		http_request.onreadystatechange = handleProtoViewResponse;
		http_request.send(post_string);
	}
	catch (Exception) {}
}


function enter_waiting_state ()
{

	var price_elements_to_blank_out = ["tooling_cost", "quantity", "total_price", "lead_time", "price_qty", "lead_time_date"];

	for (var i = 0; i < price_elements_to_blank_out.length; i++)
	{
		html_elements[price_elements_to_blank_out[i]].innerHTML = "----";
	}

}


function array_contains(arr, obj) 
{
	for (var i = 0; i < arr.length; i++) 
	{
		if (arr[i] == obj) 
		{
			return true;
		}
	}
	return false;
}