var req;  // Request object to be sent to/returned from Servlets
var lastSendTime = new Date();  // Stores date when a request was last sent ... used in implementing a 'thottle', to
                                // prevent Servlet being bombarded too quickly with many checkUrl requests
var alertTimerId = 0;           // Used in implementing 'thottle', to prevent Servlet being bombarded too quickly with many checkUrl requests
var reqType = "check";          // sed to tell response handling code what type of request it is handling a response to
var clearedChar = false;
// Sends a 'reserveurl' request, actioned from a 'Grab it!' button press on the home page 
function grabit() {
    sendGrabUrlRequest();
}

// Opens the popup window where the user can enter the details for a reserved URL
function openGrabit(sessionKey) {
    var langid = lang.replace('lang_', '');  
    var newhost = document.location.host.replace('.com', '.me');
    var urlStr = 'http://' + newhost + '/present/grabit.html?lang='+langid+'&url=' + document.schmapme_form.schmapme_input.value + '&s=' + sessionKey;
    //window.location = urlStr;
    var adcode1 = document.location.href.match(/a1=([^&]*)/);
    if(adcode1) {
        urlStr += "&a1=" + adcode1[1];
    }

    var adcode2 = document.location.href.match(/a2=([^&]*)/);
    if(adcode2) {
        urlStr += "&a2=" + adcode2[1];
    }

    var referrer = document.location.href.match(/r=([^&]*)/);
    if(referrer) {
        urlStr += "&r=" + referrer[1];
    }

    window.open(urlStr,"_parent");
}

// General function to send a XMLHttpRequest to a Servlet and set up response handler
function loadXMLDoc(url, sendType, urlParam, syn){
    if (alertTimerId != 0) {
        clearTimeout (alertTimerId);
        alertTimerId = 0;
    }
    if(!sendType) sendType= "get";
    if(!urlParam) urlParam= null;
 
	reqObj = getXMLHttpRequest(processReqChange);
    if(syn) {
     syn = false;
   }else {
    syn = true;   
} 
    reqObj.open(sendType, url, syn);
    reqObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

    reqObj.send(urlParam);	
	if(!syn){
	    processReqChange();
	}
}

function getXMLHttpRequest(callback) {
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
        req.onreadystatechange = callback;
    // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req) {
            req.onreadystatechange = callback;
        }
    }
    return req;
}

// Handles state change in the request
function processReqChange() {
    // only if req shows "complete"
    if (reqObj.readyState == 4) {
        // only if "OK"
        if (reqObj.status == 200) {
            response  = reqObj.responseText;
            testResp(response);
        } else {
            showGeneralErrorScreen();
        }
    }
}

// Analyses response from Servlet for the various requests
function testResp (response) {
    while (response.length > 0 && 
           (response.charCodeAt(response.length - 1) == 10 || response.charCodeAt(response.length - 1) == 13)) {
        response = response.substr (0, response.length - 1);
    }
    
    var status = "1";
    var responseParams = response.split("&");
    for (var idx=0; idx < responseParams.length; idx++) {
        var currParam = responseParams[idx].split("=");
        if (currParam[0] == "status") {
            status = currParam[1];
        }
    }
    if(reqType == 'get'){
        if (status != "0"){
            //alert ('status=' + status);
            showGetErrorScreen();
        } else {
            handleSerletResponse(response); 
        }
    }
    else if(reqType == 'delete'){
        if (status != "0"){
            showGeneralErrorScreen();
        } else {
            handleDeleteResponse(response);
        }
    }
    else if (reqType == "check" || reqType == "grab")
    {
        if (status != "0"){

            if(document.schmapme_form.schmapme_input) {
                document.schmapme_form.schmapme_input.className='schmapme_input_unavailable';
            }
        } else {
            if(document.schmapme_form.schmapme_input) {
                document.schmapme_form.schmapme_input.className='schmapme_input';
            }

            if (reqType == "grab") {
                //alert ('response string is ' + response);
                var sessKeyArr = responseParams[1].split("=");
                var sessionKey = sessKeyArr[1];
                openGrabit(sessionKey);
            }
        }
    } 
    else if (reqType == "update") {
        if (status == "0"){
            showSuccessScreen();
            
        } else {
            //alert ("Update unsuccessful: status=" + status);
            showGeneralErrorScreen();
        }
    } else if (reqType == "checkTwitter"){
	    tweetchecked(response);
	} else if (reqType == "updatetwitter"){
	    tweetupdated(response);
	} else if (reqType == "following"){
	    tweetfollowed(response);
	} else if (reqType == "hubsubmit") {
	    tweetSubmitted(response);
	} else if (reqType == "iconupload") {
	    iconMoveSuccessed(response);
	} 
}


function checkForIllegalChars (urlStr) {
    var ok = true;
    for (i=0; (i < urlStr.length) && ok; i++) {
        var ch = urlStr.charAt(i);
        if (!(ch >= '0' && ch <= '9') && !(ch >= 'a' && ch <= 'z') && !(ch >= 'A' && ch <= 'Z')
            && ch != '$' && ch != '-' && ch != '_' && ch != '.') {

            ok = false;
        }
    }
    return (ok);
}

function sendCheckUrlRequest() {
    var ok = checkForIllegalChars (document.schmapme_form.schmapme_input.value);
    if (ok) {
        reqType = "check";
        var theurl  = '/servlet/checkurl?url=' + document.schmapme_form.schmapme_input.value;
        loadXMLDoc(theurl,'get');
    } else {
        //
        if(document.schmapme_form.schmapme_input) {
            document.schmapme_form.schmapme_input.className='schmapme_input_unavailable';
        }
    }
}

function sendGrabUrlRequest() {
    var ok = true;
    var urlLen = document.schmapme_form.schmapme_input.value.length;
    if (urlLen < 5 ){
        ok = false;
        alert (schmapmeText.alert_lessthan5);
    }
    else if (urlLen > 40 && document.schmapme_form.schmapme_input.value !== redgreen) {
        ok = false;
        alert (schmapmeText.alert_morethan40);
    }
    if (ok) {
        ok = checkForIllegalChars (document.schmapme_form.schmapme_input.value);
    }
    if (ok) {
        reqType = "grab";
        var theurl  = '/servlet/reserveurl'
        var urlparam = 'url=' + document.schmapme_form.schmapme_input.value;
        loadXMLDoc(theurl,'post',urlparam);
    } else {
        //
        if(document.schmapme_form.schmapme_input) {
            document.schmapme_form.schmapme_input.className='schmapme_input_unavailable';
        }
    }
}

function setMessage(msg) {
    if(msg == ''){
        $('smallMsg').style.display = 'none';
    } else {
        $('smallMsg').style.display = 'block';
    }
    $('smallMsg').innerHTML = msg;
}

function checkUrl(e) {
    if(skipEnter(e)) return;
    var urlText = document.schmapme_form.schmapme_input.value;
    var urlLen = urlText.length;
    if (urlLen >= 1) {
        var ch = urlText.charAt(urlLen-1);
        if (urlText.substr(0,1) == '.' ||( !(ch >= '0' && ch <= '9') && !(ch >= 'a' && ch <= 'z') && !(ch >= 'A' && ch <= 'Z')
              && ch != '-' && ch != '_' && ch != '.' )) {
             var substr = urlText.substr(0, urlLen-1);
             document.schmapme_form.schmapme_input.value = substr;
             clearedChar = true;
             setMessage (schmapmeText.setMessage_3);
        } else {
    
            if (urlLen >= 5 && urlLen <= 40){
            
                if (!clearedChar) {
                    setMessage("");
                }
                var currDateTime = new Date();
                if (currDateTime.getTime() - lastSendTime.getTime() > 250) {
                    sendCheckUrlRequest();
                } else {
                    // Set timeout to ensure that we do send a request after 250ms has elapsed (if
                    // no url check requests are sent in the meantime)
                    if (alertTimerId == 0) {
                        alertTimerId = setTimeout ("sendCheckUrlRequest()", 250);
                    }
                }
            } else {
                if (urlLen < 5) {
                    setMessage (schmapmeText.setMessage_1);
                } else if (urlLen > 40) {
                    setMessage (schmapmeText.longest_text);
                }
                if(document.schmapme_form.schmapme_input) {
                    document.schmapme_form.schmapme_input.className='schmapme_input_unavailable';
                }
             }
            clearedChar = false;
       }
   } else {
       setMessage (schmapmeText.setMessage_1);
   }
}
