/* Real Dialog */
addLoadEvent(onRealDialogLoad);

function onRealDialogLoad()
{
	console.log("onRealDialogLoad");
	document.getElementById("rdsubmit").addEventListener("click", onSubmitRealDialog, true);
	document.getElementById("viewtranscript").addEventListener("click", onLoadTranscriptRealDialog, true);
	document.getElementById("printtranscript").addEventListener("click", onPrintTranscriptRealDialog, true);
	document.getElementById("hidetranscript").addEventListener("click", onHideTranscriptRealDialog, true);
	console.log("prevent default form behavior");
	document.getElementById("rdform").addEventListener("submit", onSubmitRealDialog, true);
	document.getElementById("rdform").addEventListener("keypress", onFormKeyPress, true);
	RealDialogLoadHistory();
//	RealDialogLoadPreamble();
}


function onFormKeyPress(e)
{// begin onFormKeyPress
	var e_out;
	var ie_var = "srcElement";
	var w3c_var = "target";
	var prop_var = "form";
	var object = e[w3c_var] ? e[w3c_var] : e[ie_var];

	var key;
	if(window.event)
		key = window.event.keyCode;	// IE
	else
		key = e.which;	// W3C

	if(key != 13)
		return true;
	
	// we should only get here on an [enter] keypress
	
	// hide the transcript
	if(window.transcript_visible && window.transcript_visible == true)
	{
		onHideTranscriptRealDialog(e);
	}

	var utterance = document.getElementById("rdquestion").value;
	SubmitRealDialogResponse(utterance);

	// prevent the default action
	if(e.preventDefault)
		e.preventDefault();
	if(e.stopPropagation)
		e.stopPropagation();
	e.cancelBubble = true;
	return false;
}// end onFormKeyPress

function onSubmitRealDialog(e)
{// begin onSubmitRealDialog
	var e_out;
	var ie_var = "srcElement";
	var w3c_var = "target";
	var prop_var = "form";
	var object = e[w3c_var] ? e[w3c_var] : e[ie_var];

	// hide the transcript
	if(window.transcript_visible && window.transcript_visible == true)
	{
		onHideTranscriptRealDialog(e);
	}

	var utterance = document.getElementById("rdquestion").value;
	SubmitRealDialogResponse(utterance);

//	grabAndReplacePage(object.hrefValue, object.core_node_id, object.current_id, object.new_id, object.uri, object.extraCallback, object.extraOnClick, true);
	if(e.preventDefault)
		e.preventDefault();
	if(e.stopPropagation)
		e.stopPropagation();
	e.cancelBubble = true;
	return false;
}// end onSubmitRealDialog

function onLoadTranscriptRealDialog(e)
{// begin onLoadTranscriptRealDialog
	var e_out;
	var ie_var = "srcElement";
	var w3c_var = "target";
	var prop_var = "form";
	var object = e[w3c_var] ? e[w3c_var] : e[ie_var];

	document.getElementById("printtranscript").style.display = "inline";
	document.getElementById("hidetranscript").style.display = "inline";
	document.getElementById("viewtranscript").style.display = "none";
	add_transcript_css();
	RealDialogLoadTranscript();
	window.transcript_visible = true;

	if(e.preventDefault)
		e.preventDefault();
	if(e.stopPropagation)
		e.stopPropagation();
	e.cancelBubble = true;
	return false;
}// end onLoadTranscriptRealDialog

function onHideTranscriptRealDialog(e)
{// begin onHideTranscriptRealDialog
	var e_out;
	var ie_var = "srcElement";
	var w3c_var = "target";
	var prop_var = "form";
	var object = e[w3c_var] ? e[w3c_var] : e[ie_var];

	document.getElementById("printtranscript").style.display = "none";
	document.getElementById("hidetranscript").style.display = "none";
	document.getElementById("viewtranscript").style.display = "inline";
	document.getElementById("rdtranscript").style.display = "none";
	window.transcript_visible = false;

	if(e.preventDefault)
		e.preventDefault();
	if(e.stopPropagation)
		e.stopPropagation();
	e.cancelBubble = true;
	return false;
}// end onPrintTranscriptRealDialog

function onPrintTranscriptRealDialog(e)
{// begin onPrintTranscriptRealDialog
	var e_out;
	var ie_var = "srcElement";
	var w3c_var = "target";
	var prop_var = "form";
	var object = e[w3c_var] ? e[w3c_var] : e[ie_var];

	// disable the non-media specified stylesheets
	var links = document.getElementsByTagName("link");
	for(var i = 0;i < links.length;i++)
	{
		var cur_link = links[i];
		if(cur_link.getAttribute("rel") == "stylesheet" && (cur_link.getAttribute("media") == null || cur_link.getAttribute("media") == ""))
		{
			cur_link.disabled = "disabled";
		}
	}
	window.print();
/*
	for(var i = 0;i < links.length;i++)
	{
		var cur_link = links[i];
		if(cur_link.getAttribute("rel") == "stylesheet" && cur_link.getAttribute("media") != "print")
		{
			cur_link.disabled = null;
		}
	}*/

	if(e.preventDefault)
		e.preventDefault();
	if(e.stopPropagation)
		e.stopPropagation();
	e.cancelBubble = true;
	return false;
}// end onHideTranscriptRealDialog

function onSuggestionClick(e)
{// begin onSuggestionClick
	var e_out;
	var ie_var = "srcElement";
	var w3c_var = "target";
	var prop_var = "form";
	var object = e[w3c_var] ? e[w3c_var] : e[ie_var];

	var suggested = object.getAttribute("href");
	console.log("href="+suggested);
	suggested = suggested.replace("#","");

	var utterance = document.getElementById("rdlastquestion").innerHTML;
//	var suggestion_text = object.innerHTML;
//	document.getElementById("rdquestion").value = suggestion_text;
	SubmitRealDialogResponse(utterance, suggested);

//	grabAndReplacePage(object.hrefValue, object.core_node_id, object.current_id, object.new_id, object.uri, object.extraCallback, object.extraOnClick, true);
	if(e.preventDefault)
		e.preventDefault();
	if(e.stopPropagation)
		e.stopPropagation();
	e.cancelBubble = true;
	return false;
}// end onSuggestionClick

function SubmitRealDialogResponse(utterance,suggested)
{// begin SubmitRealDialogResponse
	console.log("SubmitRealDialogResponse");
	var base_uri = "rdquery.php";
	var uri = base_uri+"?q="+escape(utterance);
	if(suggested != null)
		uri += "&s="+suggested;
	console.log(uri);

	var xmlRequest = new XMLHttpRequest();
//	xmlRequest.current_id = current_id;

	xmlRequest.onreadystatechange = function() { SubmitRealDialogResponseCallback(xmlRequest); };
	xmlRequest.open('GET', uri, true);
	xmlRequest.setRequestHeader("X_REAL_DIALOG_RESPONSE", "force-xml");
	xmlRequest.send(null);
}// end SubmitRealDialogResponse

function RealDialogLoadHistory()
{// begin RealDialogLoadHistory
	console.log("RealDialogLoadHistory");
	var base_uri = "rdquery.php";
	var uri = base_uri+"?history";
	console.log(uri);

	var xmlRequest = new XMLHttpRequest();
	xmlRequest.onreadystatechange = function() { SubmitRealDialogResponseCallback(xmlRequest); };
	xmlRequest.open('GET', uri, true);
	xmlRequest.setRequestHeader("X_REAL_DIALOG_RESPONSE", "force-xml");
	xmlRequest.send(null);
}// end RealDialogLoadHistory

function RealDialogLoadTranscript()
{// begin RealDialogLoadTranscript
	console.log("RealDialogLoadTranscript");
	var base_uri = "rdquery.php";
	var uri = base_uri+"?transcript";
	console.log(uri);

	var xmlRequest = new XMLHttpRequest();
	xmlRequest.onreadystatechange = function() { RealDialogLoadTranscriptCallback(xmlRequest); };
	xmlRequest.open('GET', uri, true);
	xmlRequest.setRequestHeader("X_REAL_DIALOG_RESPONSE", "force-xml");
	xmlRequest.send(null);
}// end RealDialogLoadTranscript

function RealDialogLoadPreamble()
{// begin RealDialogLoadPreamble
	console.log("RealDialogLoadPreamble");
	var base_uri = "rdquery.php";
	var uri = base_uri+"?transcript&preamble";
	console.log(uri);

	var xmlRequest = new XMLHttpRequest();
	xmlRequest.onreadystatechange = function() { RealDialogLoadPreambleCallback(xmlRequest); };
	xmlRequest.open('GET', uri, true);
	xmlRequest.setRequestHeader("X_REAL_DIALOG_RESPONSE", "force-xml");
	xmlRequest.send(null);
}// end RealDialogLoadPreamble

function SubmitRealDialogResponseCallback(request)
{// begin SubmitRealDialogResponseCallback
	if (request.readyState == 4)
	{
		try
		{
			console.log("SubmitRealDialogResponseCallback");
			var rdresponse = document.getElementById("rdresponse");
			var newdoc = request.responseXML;
			
			// check for unavailable service
			is_available = newdoc.getElementsByTagName("Available");
			if(is_available.length == 0)
			{
				if(is_available[0].childNodes[0].nodeValue == false)
					throw "Service Unavailable";
			}

			var is_history = newdoc.getElementsByTagName("history").length;
			console.log("is_history="+is_history);

			var responses = newdoc.getElementsByTagName("response");
			
			var i = 0;
			// short circuit in case we want the log format again
			i = responses.length-1;
			document.getElementById("rdresponse").innerHTML = "";
			// end short circuit
			for(;i < responses.length;i++)
			{
				var response = responses[i];
				
				var associated_content_url = GetAssociatedContentURL(response);
				if(associated_content_url != "" && is_history == false)
				{
					window.location = associated_content_url;
				//	console.log(associated_content_url);
				}
				var response_set_div = BuildResponseSet(response);
				PushResponseSet(rdresponse, response_set_div);

			}

			// UI tweaks
			document.getElementById("rdquestion").value = "";
			/*rdresponse.scrollTop = 0;
			rdresponse.focus();*/
		}
		catch(e)
		{
//			alert(e.name);// alerts 'Error'
			console.log(e.message); // alerts 'The message' or a JavaScript error message)

			rdresponse.innerHTML = "Service is temporarily unavailable";
			/*
			Since browsers that don't automatically convert an XML node to a DOM node
			Will throw an exception, we will catch it and try to do the rendering the
			fallback way by creating a DOM element, assigning the innerHTML, then replacing.
			The reason we don't do this by default is that it incures a significant performace
			penalty, which if can be avoided should be.
			This also only works for top-level elements from the document body so it isn't
			yet a general solution.  To be that a getElementById() like search should be performed for the entrie document tree.
			*/
			console.log("alternate replace method");
		/*	new_element = null;
			var node = document.createElement("div");
			node.innerHTML = request.responseText;
			if(document.all && !window.opera)	// IE HACK
				ieFixObjects(node.all);
			var divs = node.getElementsByTagName("div");
			for(var i = 0;i < divs.length;i++)
			{
				if(divs[i].hasAttribute("id") == true && divs[i].getAttribute("id") == request.new_id)
				{// being found the correct node
					console.log("correct node found");
					new_element = divs[i];
					fixupReplaceElement(new_element, element, request.current_id)
					element.parentNode.replaceChild(new_element, element);
					break;
				}// end found the correct node
			}
			console.log(i);*/
		}
	}
}// end SubmitRealDialogResponseCallback

function RealDialogLoadTranscriptCallback(request)
{// begin RealDialogLoadTranscriptCallback
	if (request.readyState == 4)
	{

		try
		{
			console.log("RealDialogLoadTranscriptCallback");
			var rdtranscript = document.getElementById("rdtranscript");
			var newdoc = request.responseXML;

			rdtranscript.innerHTML = "";

			// check for unavailable service
			var is_available = false;
			is_available = newdoc.getElementsByTagName("error");
			if(is_available.length > 0)
			{
				
				//throw "Service Unavailable";
				rdtranscript.innerHTML = "Transcript not available.";
			}
			else
			{
				var i = 0;
				var responses = newdoc.getElementsByTagName("item");
				// end short circuit
				for(;i < responses.length;i++)
				{
					var response = responses[i];
					try
					{
						var response_set_div = BuildTranscriptSet(response);
						PushTranscriptSet(rdtranscript, response_set_div);
					}
					catch(e)
					{
						console.log("build error: "+e.message);
					}
				}
			}
			rdtranscript.style.display = "block";
		}
		catch(e)
		{
//			alert(e.name);// alerts 'Error'
			console.log(e+":"+e.message); // alerts 'The message' or a JavaScript error message)

			rdtranscript.innerHTML = "Transcript unavailable";
			/*
			Since browsers that don't automatically convert an XML node to a DOM node
			Will throw an exception, we will catch it and try to do the rendering the
			fallback way by creating a DOM element, assigning the innerHTML, then replacing.
			The reason we don't do this by default is that it incures a significant performace
			penalty, which if can be avoided should be.
			This also only works for top-level elements from the document body so it isn't
			yet a general solution.  To be that a getElementById() like search should be performed for the entrie document tree.
			*/
			console.log("alternate replace method");
		}
	}
}// end RealDialogLoadTranscriptCallback

function RealDialogLoadPreambleCallback(request)
{// begin RealDialogLoadPreambleCallback
	if (request.readyState == 4)
	{

		try
		{
			console.log("RealDialogLoadPreambleCallback");
			var rdpreamble = document.getElementById("rdresponse");
			var newdoc = request.responseXML;

			// check for unavailable service
			var is_available = false;
			is_available = newdoc.getElementsByTagName("error");
			if(is_available.length > 0)
			{
				
				//throw "Service Unavailable";
				rdpreamble.innerHTML = "Welcome";
			}
			else
			{
				var i = 0;
				var responses = newdoc.getElementsByTagName("item");
				// end short circuit
				if(responses.length == 1)
				{
					var response = responses[0];
					try
					{
						rdpreamble.innerHTML =  response.getElementsByTagName("ResponseUtterance")[0].childNodes[0].nodeValue;
					}
					catch(e)
					{
						console.log("build error: "+e.message);
					}
				}
			}
			rdpreamble.style.display = "block";
		}
		catch(e)
		{
//			alert(e.name);// alerts 'Error'
			console.log(e+":"+e.message); // alerts 'The message' or a JavaScript error message)

			rdtranscript.innerHTML = "Preamble unavailable";
			console.log("alternate replace method");
		}
	}
}// end RealDialogLoadPreambleCallback

function PushResponseSet(set_continer, r_set)
// add r_set to the top of set_container
{// begin PushResponseSet
	// add this response to the stack
	if(set_continer.childNodes.length > 0)
	{
		set_continer.insertBefore(document.createElement("hr"), set_continer.childNodes[0]);
		set_continer.insertBefore(r_set, set_continer.childNodes[0]);
	}
	else
		set_continer.appendChild(r_set);
}// end PushResponseSet

function PushTranscriptSet(set_continer, r_set)
{// begin PushTranscriptSet
	// add this response to the stack
	if(set_continer.childNodes.length > 0)
	{
		set_continer.appendChild(document.createElement("hr"));
	}
	set_continer.appendChild(r_set);
}// end PushTranscriptSet

function BuildResponseSet(newdoc)
{// begin BuildResponseSet
	var response_set_div = document.createElement("div");
	response_set_div.className = "set";

	var current_question = null;
	var utterances = newdoc.getElementsByTagName("UtteranceQuery");
	if(utterances.length > 0 && utterances[utterances.length-1].childNodes.length > 0 && utterances[utterances.length-1].childNodes[0].nodeValue != "")
	{
		current_question = utterances[utterances.length-1].childNodes[0].nodeValue;
	}
	else
	{
		current_question = document.getElementById("rdquestion").value;
	}

	document.getElementById("rdlastquestion").innerHTML = current_question;

	var text_response = newdoc.getElementsByTagName("Utterance")[0];
	var text_response_div = document.createElement("div");
	text_response_div.className = "text-response";
	text_response_div.innerHTML = text_response.childNodes[0].nodeValue;
	response_set_div.appendChild(text_response_div);

	var associated_content_url = GetAssociatedContentURL(newdoc);

	/*
	// don't display this URL [Requested by Liz 2010-03-17]
	if(associated_content_url != "")
	{
		console.log("AssociatedContentURL: "+associated_content_url);
		var assoc_url_a = document.createElement("a");
		assoc_url_a.setAttribute("href", associated_content_url);
		assoc_url_a.appendChild(document.createTextNode(associated_content_url));
		response_set_div.appendChild(assoc_url_a);
	}
	*/
	if(newdoc.getElementsByTagName("ExpectedAnswer").length > 0)
	{// begin we have expected answers
		/*var heading = document.createElement("h3");
		heading.appendChild(document.createTextNode("Related Topics:"));
		response_set_div.appendChild(heading);*/
		var answers = newdoc.getElementsByTagName("ExpectedAnswer")[0].getElementsByTagName("item");
		if(answers.length == 0)
			answers = newdoc.getElementsByTagName("ExpectedAnswer");
		if(answers.length > 0)
		{// begin answers
			var ul = document.createElement("ul");
			for(var i = 0;i < answers.length;i++)
			{
				var answer = answers[i];
				var question_id = answer.getElementsByTagName("QuestionID")[0].childNodes[0].nodeValue;
				var txt = answer.getElementsByTagName("Text")[0].childNodes[0].nodeValue;
				var li = document.createElement("li");
				var a = document.createElement("a");
				a.setAttribute("href", "#"+question_id);
				a.appendChild(document.createTextNode(txt));
				li.appendChild(a);
				ul.appendChild(li);
				if(ieFixObjects)
					ieFixObjects(a);
				a.addEventListener("click", onSuggestionClick, false);
			}
			response_set_div.appendChild(ul);
		}// end answers
	}// end we have expected answers


	if(newdoc.getElementsByTagName("SuggestedTopic").length > 0)
	{// begin we have suggestions
		/*var heading = document.createElement("h3");
		heading.appendChild(document.createTextNode("Related Topics:"));
		response_set_div.appendChild(heading);*/
		var suggestions = newdoc.getElementsByTagName("SuggestedTopic")[0].getElementsByTagName("item");
		if(suggestions.length == 0)
			suggestions = newdoc.getElementsByTagName("SuggestedTopic");
		if(suggestions.length > 0)
		{// begin suggestions
			var ul = document.createElement("ul");
			for(var i = 0;i < suggestions.length;i++)
			{
				var suggestion = suggestions[i];
				var question_id = suggestion.getElementsByTagName("QuestionID")[0].childNodes[0].nodeValue;
				var txt = suggestion.getElementsByTagName("Text")[0].childNodes[0].nodeValue;
				var li = document.createElement("li");
				var a = document.createElement("a");
				a.setAttribute("href", "#"+question_id);
				a.appendChild(document.createTextNode(txt));
				li.appendChild(a);
				ul.appendChild(li);
				if(ieFixObjects)
					ieFixObjects(a);
				a.addEventListener("click", onSuggestionClick, false);
			}
			//response_set_div.appendChild(ul);
			// we should not change this (see Mike's email)
			document.getElementById("rdtopics").innerHTML = "";
			document.getElementById("rdtopics").appendChild(ul);
		}// end suggestions
	}// end we have suggestions
	return response_set_div;
}// end BuildResponseSet

function BuildTranscriptSet(newdoc)
{// begin BuildTranscriptSet
	var response_set_div = document.createElement("div");
	response_set_div.className = "set";
	var has_request = false;

	if(newdoc.getElementsByTagName("RequestUtterance").length > 0)
	{// begin show request
		has_request = true;
		var utterance = newdoc.getElementsByTagName("RequestUtterance")[0];
		var text_response_header = document.createElement("h3");
		text_response_header.innerHTML = "You asked:";
		response_set_div.appendChild(text_response_header);
		var utterance_div = document.createElement("div");
		utterance_div.className = "utterance-request";
		if(utterance.childNodes.length > 0)
			utterance_div.innerHTML = utterance.childNodes[0].nodeValue;
		response_set_div.appendChild(utterance_div);
	}// end show request

	if(newdoc.getElementsByTagName("ResponseUtterance").length > 0)
	{// begin show response
		if(has_request == true)
		{
			var text_response_header = document.createElement("h3");
			text_response_header.innerHTML = "Response:";
			response_set_div.appendChild(text_response_header);
		}
		var text_response = newdoc.getElementsByTagName("ResponseUtterance")[0];
		var text_response_div = document.createElement("div");
		text_response_div.className = "text-response";
		text_response_div.innerHTML = text_response.childNodes[0].nodeValue;
		response_set_div.appendChild(text_response_div);
	}// end show response

	return response_set_div;
}// end BuildTranscriptSet

function GetAssociatedContentURL(newdoc)
{// begin GetAssociatedContentURL
	var associated_content_url = newdoc.getElementsByTagName("AssociatedContentURL");
	if(associated_content_url.length > 0 && associated_content_url[0].childNodes.length > 0)
		associated_content_url = associated_content_url[0].childNodes[0].nodeValue;
	else
		associated_content_url = "";
		
//	console.log(associated_content_url);

	if(associated_content_url != null && associated_content_url != "http://www.astutesolutions.com/default.asp" && 
	associated_content_url != "http://www.astutesolutions.com/")
		return associated_content_url;
	return "";
}// end GetAssociatedContentURL


// allow the ability to dynamically add a stylesheet
function add_transcript_css()
{
	var head = document.getElementsByTagName("head")[0];
	var new_css = document.createElement("link");
	new_css.setAttribute("rel", "stylesheet");
	new_css.setAttribute("type", "text/css");
	new_css.setAttribute("href", "styles/print-transcript.css");
	new_css.setAttribute("media", "print");
	head.appendChild(new_css);
/*	var new_css_other_path = document.createElement("link");
	new_css_other_path.setAttribute("rel", "stylesheet");
	new_css_other_path.setAttribute("type", "text/css");
	new_css_other_path.setAttribute("href", "../styles/print-transcript.css");
	new_css_other_path.setAttribute("media", "print");
	head.appendChild(new_css_other_path);*/
}
/*
// not used currently
function switch_style ( css_title )
{
// You may use this script on your site free of charge provided
// you do not remote this notice or the URL below. Script from
// http://www.thesitewizard.com/javascripts/change-style-sheets.shtml
  var i, link_tag ;
  for (i = 0, link_tag = document.getElementsByTagName("link") ;
    i < link_tag.length ; i++ ) {
    if ((link_tag[i].rel.indexOf( "stylesheet" ) != -1) &&
      link_tag[i].title) {
      link_tag[i].disabled = true ;
      if (link_tag[i].title == css_title) {
        link_tag[i].disabled = false ;
      }
    }
  }
}
*/
