// JavaScript Document
var http = getXMLHTTPRequest();
var response = null;

function getXMLHTTPRequest()
{
	var request = false;
	try{
		request = new XMLHttpRequest(); //Firefox
	}
	catch(err1){
		try{
			request = new ActiveXObject("Msxml2.XMLHTTP"); //Some versions of IE
		}
		catch(err2){
			try{
				request = new ActiveXObject("Microsoft.XMLHTTP"); //Some versions of IE
			}
			catch(err3){
				request = false;
			}
		}
	}
	return request;
}

function sendAJAX(urlvars){    
	var myurl = 'ajaxhandler.php';

	//Cache buster. Using random numbers helps prevent the browser from caching
	//var myRand = parseInt(Math.random()*999999999999999);
	//var modurl = myurl+urlvars+"&rand="+myRand;
	http.open("POST", myurl, true);

	//We're waiting for a response here...
	//When we've got it, go do something!
	try{
		http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		http.setRequestHeader("Content-length", urlvars.length);
		http.setRequestHeader("Connection", "close");
		http.onreadystatechange = useHttpResponse;
		http.send(urlvars);
	}catch(err){
		//Bad response
		//alert("ERROR: " + err);
	}
}

function useHttpResponse(){
	try{
		if(http.readyState == 4 && http.status != 200) {
			//Server isn't ready, or returned an error.
			if(http.status != 0){
				alert('The server could not be reached. Your last change was probably lost.\n(Status Code: ' + http.status + ')');
			}
		}
		if(http.readyState == 4 && http.status == 200) {
			//Server is OK. Should have a response, so something.
			response = http.responseText;
			response = response.replace(/^\s*/, "").replace(/\s*$/, ""); //Trim function.
			//alert(response);
			try{
				if(response == "No Response"){
					alert("The server did not understand your last request. Your last change was probably lost.");
				}
				else if(response.indexOf("NEWCARDID") != -1){
					//We've added a new card.
					var newID = response.replace(/NEWCARDID /g, '');
					var getAll = document.getElementsByTagName('*');
					for (var i = 0; i < getAll.length; i++) {
						if (getAll[i].getAttribute('ts') == submittingDivTS) {
								getAll[i].setAttribute('cardid', newID);
								break;
						}
					}
					
					submittingDivTS = null;
				}
				else if(response.indexOf("FAIL") != -1){
					alert("The server indicated that the requested operation failed.\nYour last change was probably lost.\nDetails: " + response);
				}
			}catch(err){
				//Didn't exist probably.
			}
		}
	}catch(err){
		//??
	}
}

function sendQuizAJAX(urlvars){    
	var myurl = 'ajaxquizhandler.php';
	
	http.open("POST", myurl, true);

	//We're waiting for a response here...
	//We disable the retry button so that people cannot hit it again too soon.
	retrybutton.disabled = true;
	showCardLoading();
	buttonTimer = setTimeout("enableRetryButton();", 8000);
	//When we've got it, go do something!
	try{
		http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		http.setRequestHeader("Content-length", urlvars.length);
		http.setRequestHeader("Connection", "close");
		http.onreadystatechange = useQuizHttpResponse;
		http.send(urlvars);
	}catch(err){
		//Bad response
		//alert("ERROR: " + err);
	}
}

function useQuizHttpResponse(){
	try{
		if(http.readyState == 4 && http.status != 200) {
			//Server isn't ready, or returned an error.
			if(http.status != 0)
			{
				alert('The server could not be reached. Please try again.\n(Status Code: ' + http.status + ')');
			}
		}
		if(http.readyState == 4 && http.status == 200) {
			//Server is OK. Should have a response, so something.
			response = http.responseText;
			//alert(response);
			try{
				if(response == "No Response"){
					alert("The server did not understand your last request. Please try again.");
				}
				else if(response == "END OF QUIZ CARDS"){
					//Do something to notify that our quiz has ended.
					showQuizEnd();
				}
				else
				{
					//Get our XML data
					var cardNodes = http.responseXML.getElementsByTagName("Card");
					
					var cardID = cardNodes[0].getAttribute("id");
					var question = cardNodes[0].getAttribute("question");
					var answer = cardNodes[0].getAttribute("answer");
					var cardsleft = cardNodes[0].getAttribute("cardsleft");
					
					//Set our questions and answer
					fullcard.setAttribute('cardID', cardID);
					questionbody.innerHTML = UnescapeNewline(HTMLDecode(wordwrap(question, 50,' ', true)));
					answerbody.innerHTML = UnescapeNewline(HTMLDecode(wordwrap(answer, 50,' ', true)));
					cardsleftdiv.innerHTML = cardsleft + ' Cards Left';
					
					showCardQuestion();
				}
			}catch(err){
				//Didn't exist probably.
				alert("An unknown error occured. Please try again.\nDetails: " + err + "\nPage Response: " + response);
			}
		}
	}catch(err){
		//??
	}
}

function HTMLDecode(html)
{
	var newtext = trim(html);
	/*newtext = newtext.replace(/&amp;/g, '&');
	newtext = newtext.replace(/&quot;/g, '"');
	newtext = newtext.replace(/&#039;/g, '\'');
	newtext = newtext.replace(/&lt;/g, '<');
	newtext = newtext.replace(/&gt;/g, '>');*/
	newtext = newtext.replace(/<br\/>/g, '\n');
	newtext = newtext.replace(/<br \/>/g, '\n');
	newtext = newtext.replace(/<br>/g, '\n');
	
	return newtext;
}

function HTMLEncode(html, newline)
{
	var newtext = trim(html);
	newtext = newtext.replace(/&/g, '&amp;');
	newtext = newtext.replace(/"/g, '&quot;');
	newtext = newtext.replace(/'/g, '&#039;');
	newtext = newtext.replace(/</g, '&lt;');
	newtext = newtext.replace(/>/g, '&gt;');
	if(newline)
	{
		newtext = newtext.replace(/\n/g, '<br/>');
	}
	
	return newtext;
}

function UnescapeNewline(str)
{
	return str.replace(/\\n/g, '<br/>')
}

function trim(str)
{
	str = this != window? this : str;
	return str.replace(/^\s+|\s+$/g,'');
}

function wordwrap(str, int_width, str_break, cut) {
    // http://kevin.vanzonneveld.net
    // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   improved by: Nick Callen
    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // *     example 1: wordwrap('Kevin van Zonneveld', 6, '|', true);
    // *     returns 1: 'Kevin |van |Zonnev|eld'
    
    var m = int_width, b = str_break, c = cut;
    var i, j, l, s, r;
    
    if(m < 1) {
        return str;
    }
    for(i = -1, l = (r = str.split("\n")).length; ++i < l; r[i] += s) {
        for(s = r[i], r[i] = ""; s.length > m; r[i] += s.slice(0, j) + ((s = s.slice(j)).length ? b : "")){
            j = c == 2 || (j = s.slice(0, m + 1).match(/\S*(\s)?$/))[1] ? m : j.input.length - j[0].length || c == 1 && m || j.input.length + (j = s.slice(m).match(/^\S*/)).input.length;
        }
    }
    
    return r.join("\n");
}
