function createRequest() {

	var request = null;
	try {
		request = new XMLHttpRequest();
	}
	catch (trymicrosoft) {
		try {
			request = new ActiveXObject("Msxm12.XMLHTTP");
		}
		catch (othermicrosoft) {
			try {
				request = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (failed) {
				request = null;
			}
		}
	}

	if(request == null) {
		alert("Error Making Request Object!");
	} else {
		return request;
	}
}

function randomVote(vote) {
    var reqRandom = createRequest();
    
    // hide word and shit but show the loading icon
    var parent = document.getElementById("reallyRandomId").parentNode;
    var spans = parent.getElementsByTagName("span");
    for(var x = 0; x<spans.length; x++) {
        spans[x].style.display = 'none';
    }
    parent.getElementsByTagName("img")[0].style.display = 'block';
    
    // only well rated?
    var wellRatedOnly = document.getElementById("wellRatedOnly");
    if(wellRatedOnly.checked == true) {
        var showRatedOnly = 1;
    }
    else {
        var showRatedOnly = 0;
    }
    
    function updateRandom() {
        if(reqRandom.readyState == 4 && reqRandom.status == 200) {
            var reply = reqRandom.responseText;
            var parts = reply.split("+");
            var newRandomWord = parts[0];
            var newRandomId = parts[1];
            
            var newRandomIdNode = document.createTextNode(newRandomId);
            var newRandomWordNode = document.createTextNode(newRandomWord);
            
            var idHolder = document.getElementById("reallyRandomId");
            idHolder.removeChild(idHolder.firstChild);
            idHolder.appendChild(newRandomIdNode);
            
            var wordHolder = document.getElementById("reallyRandomWord");
            wordHolder.removeChild(wordHolder.firstChild);
            wordHolder.appendChild(newRandomWordNode);
            parent.getElementsByTagName("img")[0].style.display = 'none';
            wordHolder.style.display = 'inline';
            wordHolder.nextSibling.nextSibling.style.display = 'inline';
        }
    }
    
    var databaseId = document.getElementById("reallyRandomId").firstChild.nodeValue;
    reqRandom.open("POST","ajax-random-vote.php", true);
    reqRandom.onreadystatechange = updateRandom;
    reqRandom.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    reqRandom.send(
        "id=" + escape(databaseId)
        + "&vote=" + escape(vote)
        + "&rated=" + escape(showRatedOnly));
}

function refreshRandom() {
    var reqRandom = createRequest();
    var wellRatedOnly = document.getElementById("wellRatedOnly");
    var parent = document.getElementById("reallyRandomId").parentNode;
    var spans = parent.getElementsByTagName("span");
    for(var x = 0; x<spans.length; x++) {
        spans[x].style.display = 'none';
    }
    parent.getElementsByTagName("img")[0].style.display = 'block';
    
    function updateRandom() {
        if(reqRandom.readyState == 4 && reqRandom.status == 200) {
            var reply = reqRandom.responseText;
            var parts = reply.split("+");
            var newRandomWord = parts[0];
            var newRandomId = parts[1];
            
            var newRandomIdNode = document.createTextNode(newRandomId);
            var newRandomWordNode = document.createTextNode(newRandomWord);
            
            var idHolder = document.getElementById("reallyRandomId");
            idHolder.removeChild(idHolder.firstChild);
            idHolder.appendChild(newRandomIdNode);
            
            var wordHolder = document.getElementById("reallyRandomWord");
            wordHolder.removeChild(wordHolder.firstChild);
            wordHolder.appendChild(newRandomWordNode);
            parent.getElementsByTagName("img")[0].style.display = 'none';
            wordHolder.style.display = 'inline';
            wordHolder.nextSibling.nextSibling.style.display = 'inline';
        }
    }
    
    if(wellRatedOnly.checked == true) {
        reqRandom.open("GET","ajax-random-rated-refresh.php?dummy=" + new Date().getTime(), true);
    }
    else {
        reqRandom.open("GET","ajax-random-refresh.php?dummy=" + new Date().getTime(), true);
    }
    reqRandom.onreadystatechange = updateRandom;
    reqRandom.send(null);
}


function checkStatus(elementId,obj) {
    var word = document.getElementById(elementId).firstChild.nodeValue;
    
    obj.style.cursor = 'wait';
    
    var checkReq = createRequest();
    
    function gotStatus() {
        if(checkReq.readyState == 4 && checkReq.status == 200) {
            obj.style.cursor = 'pointer';
            var reply = checkReq.responseText;
            if(elementId.substr(0,8) == "favorite") {
                // update the favorite's status in the table
                var theElement = document.getElementById(elementId);
                var statusTd = theElement.parentNode.childNodes[3]; // get the 2nd td (line break children pushed it to key 3
                if(reply == '1') {
                    var status = 'Taken';
                }
                else {
                    var status = 'Available';
                }
                var statusTextNode = document.createTextNode(status);
                statusTd.removeChild(statusTd.firstChild);
                statusTd.insertBefore(statusTextNode,statusTd.childNodes[0]);
            }
            if(reply == '1') {
                alert("Sorry, the gamertag '" + word + "' is already taken. It will be removed from our database.");
                if(elementId == "reallyRandomWord") {
                    refreshRandom();
                }
                else if(elementId == "superShortTag") {
                    refreshSuperShort();
                }
                else if(elementId == "suggestedTag") {
                    refreshSuggested();
                }
            } else if(reply == '2') {
                alert("The status of the gamertag '" + word + "' could not be determined. Most likely Xbox.com is temporarily unavailable.");
            } else {
                alert("Congratulations, '" + word + "' is available!");
            }
        }
    }
    
    checkReq.open("POST","ajax-check-status.php",true);
    checkReq.onreadystatechange = gotStatus;
    checkReq.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    checkReq.send("tag="+escape(word));
}

function refreshSuperShort() {
    var reqShort = createRequest();
    
    function updateShort() {
        if(reqShort.readyState == 4 && reqShort.status == 200) {
            var reply = reqShort.responseText;
            var parts = reply.split("+");
            var newShortWord = parts[0];
            var newShortId = parts[1];
            
            var newShortIdNode = document.createTextNode(newShortId);
            var newShortWordNode = document.createTextNode(newShortWord);
            
            var idHolder = document.getElementById("superShortId");
            idHolder.removeChild(idHolder.firstChild);
            idHolder.appendChild(newShortIdNode);
            
            var wordHolder = document.getElementById("superShortTag");
            wordHolder.removeChild(wordHolder.firstChild);
            wordHolder.appendChild(newShortWordNode);
        }
    }
    
    reqShort.open("GET","ajax-short-refresh.php?dummy=" + new Date().getTime(), true);
    reqShort.onreadystatechange = updateShort;
    reqShort.send(null);
}

function submitSuggestion() {
    var suggestedTag = document.getElementById("suggestGamertagField").value;
    document.getElementById("suggestGamertagField").value = '';
    document.getElementById("submitSuggestion").style.display = 'none';
    var buttonsMommy = document.getElementById("suggestGamertagField").parentNode;
    // lets get that loading icon going
    var babyImages = buttonsMommy.getElementsByTagName("img");
    babyImages[0].style.display = 'block';
    var request = createRequest();
    
    function confirmSubmission() {
        if(request.readyState == 4 && request.status == 200 ) {
            var reply = request.responseText;
            if(reply == 0) {
                alert("Thank you! '" + suggestedTag + "' has been added to the database.");
            }
            else if(reply == 1) {
                alert("The gamertag '" + suggestedTag + "' is already taken.");
            }
            else if(reply == 3) {
                alert("The gamertag '" + suggestedTag + "' is already in the database.");
            }
            else if(reply == 4) {
                alert("The gamertag '" + suggestedTag + "' contains a keyword that is not allowed in our gamertags. If you feel this gamertag should be allowed please use the contact form to contact me.");
            }
            else if(reply == 2) {
                alert("'" + suggestedTag + "' is not a valid gamertag. Every gamertag must start with a letter, and must only contain letters A-z, numbers 0-9, and single spaces.");
            }
            babyImages[0].style.display = 'none';
            document.getElementById("submitSuggestion").style.display = 'block';
        }
    }
    
    request.open("POST","ajax-submit-suggestion.php",true);
    request.onreadystatechange = confirmSubmission;
    request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    request.send("tag=" + escape(suggestedTag));
}

function refreshSuggested() {
    var req = createRequest();
    /*
    // hide word and shit but show the loading icon
    var parent = document.getElementById("suggestedId").parentNode;
    var spans = parent.getElementsByTagName("span");
    for(var x = 0; x<spans.length; x++) {
        spans[x].style.display = 'none';
    }
    parent.getElementsByTagName("img")[0].style.display = 'block';*/
    
    function updateSuggested() {
        if(req.readyState == 4 && req.status == 200) {
            var reply = req.responseText;
            var parts = reply.split("+");
            var newWord = parts[0];
            var newId = parts[1];
            
            var newIdNode = document.createTextNode(newId);
            var newWordNode = document.createTextNode(newWord);
            
            var idHolder = document.getElementById("suggestedId");
            idHolder.removeChild(idHolder.firstChild);
            idHolder.appendChild(newIdNode);
            
            var wordHolder = document.getElementById("suggestedTag");
            wordHolder.removeChild(wordHolder.firstChild);
            wordHolder.appendChild(newWordNode);
            /*parent.getElementsByTagName("img")[0].style.display = 'none';
            wordHolder.style.display = 'inline';
            wordHolder.nextSibling.nextSibling.style.display = 'inline';*/
        }
    }
    
    req.open("GET","ajax-suggestion-refresh.php?dummy=" + new Date().getTime(), true);
    req.onreadystatechange = updateSuggested;
    req.send(null);
}

function markAsFavorite(source) {
    var tag = document.getElementById(source).firstChild.nodeValue;
    var req = createRequest();
    
    function processFavorite() {
        if(req.readyState == 4 && req.status == 200) {
            var reply = req.responseText;
            if(reply == 1) {
                refreshFavorites();
                alert("'" + tag + "' has been marked as a favorite.");
            }
            else if (reply == 2) {
                alert("'" + tag + "' is already a favorite.");
            }
        }
    }
    req.open("POST","ajax-favorite.php?dummy=" + new Date().getTime(), true);
    req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    req.onreadystatechange = processFavorite;
    req.send("tag=" + escape(tag));
}

function removeFavorite(buttonObj) {
    var tbody= buttonObj.parentNode.parentNode.parentNode;
    var tr = buttonObj.parentNode.parentNode;
    var tag = tr.getElementsByTagName("td")[0].firstChild.nodeValue;
    tbody.removeChild(tr);
    
    var req = createRequest();
    
    /*function processFavoriteRemoval() {
        if(req.readyState == 4 && req.status == 200) {
            if(req.responseText == "1") {
                alert("'"+tag+"' has been removed from your favorites.");
            }
            else {
                alert("Error. Please notify the webmaster about this error.");
            }
        }
    }*/
    
    req.open("POST","ajax-remove-favorite.php", true);
    req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    //req.onreadystatechange = processFavoriteRemoval;
    req.send("tag=" + escape(tag));
}

function refreshFavorites() {
    var req = createRequest();
    
    function updateFavorites() {
        if(req.readyState == 4 && req.status == 200) {
            // clear existing favorites
            var favoritesTbody = document.getElementById("favoritesTbody");
            while(favoritesTbody.hasChildNodes()) {
                favoritesTbody.removeChild(favoritesTbody.firstChild);
            }
        
            // add new favorites
            var reply = req.responseXML;
            var favs = req.responseXML.getElementsByTagName("favorites")[0].getElementsByTagName("fav");
            for(var i = 0;i<favs.length;i++) {
                var theTr = document.createElement("tr");
                var tagTd = document.createElement("td");
                var statusTd = document.createElement("td");
                var removeTd = document.createElement("td");
            
                var tag = favs[i].getElementsByTagName("tag")[0].firstChild.nodeValue;
                var tagNode = document.createTextNode(tag);
                tagTd.appendChild(tagNode);
                tagTd.id = 'favorite' + favs[i].getElementsByTagName("id")[0].firstChild.nodeValue;
                theTr.appendChild(tagTd);
                
                if(favs[i].getElementsByTagName("status")[0].firstChild.nodeValue == 1) {
                    var status = 'Taken';
                }
                else {
                    var status = 'Available';
                }
                statusTd.innerHTML = status + "<p>(<a href=\"#\" onclick=\"checkStatus('favorite" + favs[i].getElementsByTagName("id")[0].firstChild.nodeValue +"',this); return false;\">Recheck</a>)</p>";
                theTr.appendChild(statusTd);
            
                removeTd.innerHTML = '<button class="removeButton" onclick="removeFavorite(this)">Remove</button>';
                theTr.appendChild(removeTd);
            
                favoritesTbody.appendChild(theTr);
            }
        }
    }
    
    req.open("GET","ajax-fetch-favorites.php?dummy=" + new Date().getTime(), true);
    req.onreadystatechange = updateFavorites;
    req.send(null);
}

