var request = null;
var oFields = null;
/**
 *Decide whether we should show the getting address animated gif
 *@param Boolean 
 */
function ajaxShowAnimation(state) {
    if(state){
        obi('form1:imgGettingAddress').style.visibility='visible';
        obi('form1:imgGettingAddress').style.display='block';
    }else{
        obi('form1:imgGettingAddress').style.visibility='hidden';
    }
}

/**
 *Trim leading and trailing whitespace from a string
 *@param String string to trim
 *@return String trimmed string
 */
function ajaxTrim(sToTrim) {
    return sToTrim.replace(/^\s+|\s+$/g,"");
}

/**
 *Browser independent method of creating the XmlHttp Object
 *@return Object XmlHttp
 */
function ajaxCreateRequest(){ 
    try{ 
        request = new ActiveXObject("Msxml2.XMLHTTP"); 
    }catch(e){ 
        try{ 
            request = new ActiveXObject("Microsoft.XMLHTTP"); 
        }catch(e2){ 
            request = false; 
        } 
    }          
    
    if(!request && typeof XMLHttpRequest != 'undefined'){ 
        request = new XMLHttpRequest(); 
    } 
    
    if(!request){ 
        alert("Error initializing XMLHttpRequest!"); 
    } 
    return request; 
}

/**
 *Begin the request to PCA for lookup of address list
 */
function ajaxPcaByPostcodeBegin(oPCAFieldDefs){
    var sPostcode = obi("form1:txtPostcode").value;
    ajaxShowAnimation(true);
    oFields = oPCAFieldDefs;
    ajaxClearAddress(oPCAFieldDefs);
    if(sPostcode != ""){
        request = ajaxCreateRequest();
        request.onreadystatechange = ajaxDisplayAddressList;
        request.open("POST", "../AjaxHandler.do", true);
        request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        request.send("Mode=3&Action=lookup&Postcode=" + sPostcode);
    }
}

function ajaxPcaByPostcodeBegin(){
    var sPostcode = obi("form1:txtPostcode").value;
    ajaxShowAnimation(true);
    clearStandardAddressFields();
    if(sPostcode != ""){
        request = ajaxCreateRequest();
        request.onreadystatechange = ajaxDisplayAddressList;
        request.open("POST", "../AjaxHandler.do", true);
        request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        request.send("Mode=3&Action=lookup&Postcode=" + sPostcode);
    }
}

function ajaxDisplayAddressList(){
    var data=null;
    if (request.readyState == 4){
        if (request.status == 200) {
            ajaxShowAnimation(false);
            
            
            if(request.responseText != ""){
                try{
                    eval(request.responseText);
                }catch(evalEx){
                    try{
                        data = eval('(' + request.responseText + ')');
                    }catch(evalEx){
                        alert(errorMessages.cantObtainAddDetails);
                    }
                }
            }else{
                alert(errorMessages.cantObtainAddDetails);
            }
            if (data != null) {
                ajaxPCAByPostcodeEnd(data);
            } else {
                if (pcaIsError){
                    // alert(pcaErrorMessage);
                    // to allow multilingual error messages
                    if(pca_error_number[0] == "27"){
                        alert(errorMessages.completePostCode);
                    }
                    else{
                        alert(errorMessages.pcaBadAccount);
                        console.log("Error number:"+pca_error_number[0]+" Error text:"+pcaErrorMessage);
                    }
                }else{
                
                    try{
                        var oList = obi('form1:lstAddresses');
                        if (pcaRecordCount==0){
                            oList.style.visibility='hidden';
                            alert(errorMessages.noMatchTryAagin);
                        }else{
                            for (var i = oList.options.length-1; i >= 0; i--){
                                oList.options[i] = null;
                            }
                            for (i = 0; i < pca_id.length; i++){
                                oList.options[oList.length] = new Option(pca_description[i], pca_id[i]);
                            }
                            oList.style.visibility='visible';
                            oList.style.display='block';
                            oList.focus();
                        }
                    }catch(e){
                        alert(errorMessages.cantObtainAddDetails);
                    }
                }
            }
        }else{
            alert(errorMessages.cantObtainAddDetails);
        }
    }
}

function ajaxPCAByPostcodeEnd(data) {
    if(data.errordata){
        if(data.errordata.faultstring){
            var aParts = data.errordata.faultstring.split(":");
            if(aParts.length > 1){
                switch(aParts[0]){
                    case "1002":
                        alert(errorMessages.completePostCode);
                        break;
                    default:
                        alert(errorMessages.pcaGeneric);
                        break;
                }
            }else{
                alert(errorMessages.pcaGeneric);
            }
        }
    }else{
        var oList = obi('form1:lstAddresses');
        for (var i = oList.options.length-1; i >= 0; i--){
            oList.options[i] = null;
        }
        for (ii = 0; ii < data.addrfinddata.length; ii++){
            oList.options[oList.length] = new Option(data.addrfinddata[ii].streetaddress + ', ' + data.addrfinddata[ii].place, data.addrfinddata[ii].id);
        }
        oList.style.visibility='visible';
        oList.style.display='block';
        oList.focus();
    }
}

function ajaxPcaFetchBegin(){
    var sPcaId = obi('form1:lstAddresses').value;
    if(sPcaId != ""){
        ajaxShowAnimation(true);
        request = ajaxCreateRequest();
        request.onreadystatechange = ajaxPopulateAddress;
        request.open("POST", "../AjaxHandler.do", true);
        request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        request.send("Mode=3&Action=fetch&Id=" + sPcaId);
        obi('form1:lstAddresses').style.visibility='hidden';
        
        ajaxFocusNext(document.getElementById('form1:txtAddress4'));
    }
}

function ajaxPopulateAddress(){
    var data=null;
    if (request.readyState == 4){
        if (request.status == 200) {
            ajaxShowAnimation(false);


            if(request.responseText != ""){
                try{
                    eval(request.responseText);
                }catch(evalEx){
                    try{
                        data = eval('(' + request.responseText + ')');
                    }catch(evalEx){
                        alert(errorMessages.cantObtainAddDetails);
                    }
                }
            }else{
                alert(errorMessages.cantObtainAddDetails);
            }
            if (data != null) {
                ajaxPCAFetchEnd_PL(data);
            } else {
                if (pcaIsError){
                    // alert(pcaErrorMessage);
                    // to allow multilingual error messages
                    if(pca_error_number[0] == "27"){
                        alert(errorMessages.completePostCode);
                    }
                    else{
                        alert(errorMessages.pcaBadAccount);
                        console.log("Error number:"+pca_error_number[0]+" Error text:"+pcaErrorMessage);
                    }
                }else{
                
                    if (pcaRecordCount == 0){
                        alert(errorMessages.sorryNoMatch);
                    }else{
                        var sAddress = "";
                        var sPostCode = "";
                    
                        if (pca_line1[0] != '') sAddress += pca_line1[0]+',';
                        if (pca_line2[0] != '') sAddress += pca_line2[0]+',';
                        if (pca_line3[0] != '') sAddress += pca_line3[0]+',';
                        if (pca_line4[0] != '') sAddress += pca_line4[0]+',';
                        if (pca_line5[0] != '')  sAddress += pca_line5[0]+',';
                        if (pca_post_town[0] != '') sAddress += pca_post_town[0]+',';
                        if (pca_county[0] != '') sAddress += pca_county[0];
                        if (pca_postcode[0] != '') sPostCode = pca_postcode[0];
                    
                        try{
                            document.getElementById("form1:hidPayAddr1").value = pca_line1[0];
                        }catch(e){}
                        try{
                            document.getElementById("form1:hidPayAddr2").value = pca_post_town[0];
                        }catch(e){}
                        try{
                            document.getElementById("form1:hidPayAddr3").value = pca_county[0];
                        }catch(e){}
                        try{
                            document.getElementById("form1:hidPayAddr4").value = pca_postcode[0];
                        }catch(e){}
                    
                        var formatter = sAddress.split(",");
                        var position = 0;
                        var elements = formatter.length;
                        var maxLines = 4;
                        var address = "";
                        for (i = 0; i < elements; i++) {
                            if (elements > maxLines && (i+2) < elements) {
                                if ((formatter[i].length + formatter[i+1].length) < 29) {
                                    address += formatter[i] + ", " + formatter[i + 1] + "|";
                                    position++;
                                    i++;
                                }else{
                                    address += formatter[i] + "|";
                                    position++;
                                }
                            }else{
                                address += formatter[i] + "|";
                                position++;
                            }
                        }
                    
                        var addressArray = address.split("|");
                    
                        obi('form1:txtAddress1').value=ajaxTrim(addressArray[0]);
                        obi('form1:txtAddress2').value=ajaxTrim(addressArray[1]);
                        obi('form1:txtAddress3').value=ajaxTrim(addressArray[2]);
                        obi('form1:txtAddress4').value=ajaxTrim(addressArray[3]);
                        obi('form1:lblAddressQ1').innerHTML=ajaxTrim(addressArray[0]);
                        obi('form1:lblAddressQ2').innerHTML=ajaxTrim(addressArray[1]);
                        obi('form1:lblAddressQ3').innerHTML=ajaxTrim(addressArray[2]);
                        obi('form1:lblAddressQ4').innerHTML=ajaxTrim(addressArray[3]);
                        obi('form1:txtPostcode').value=ajaxTrim(sPostCode);
                    
                        ajaxFocusNext(document.getElementById('form1:txtAddress4'));
                        customPostCodeAction(sPostCode);
                    }
                }
            }
        }else{
            alert(errorMessages.cantObtainAddDetails);
        }
    }
}

function ajaxPCAFetchEnd_PL(data) {
    if(data.errordata){
        if(data.errordata.faultstring){
            var aParts = data.errordata.faultstring.split(":");
            if(aParts.length > 1){
                switch(aParts[0]){
                    default:
                        alert(errorMessages.pcaGeneric);
                        break;
                }
            }else{
                alert(errorMessages.pcaGeneric);
            }
        }
    }else{

        var strAddress = "";
        var address = "";
        var postCode = "";

        if (data.addrretrievedata.line1 != '') strAddress += data.addrretrievedata.line1;
        if (data.addrretrievedata.line2 != '') strAddress += ',' + data.addrretrievedata.line2;
        if (data.addrretrievedata.line3 != '') strAddress += ',' + data.addrretrievedata.line3;
        if (data.addrretrievedata.line4 != '') strAddress += ',' + data.addrretrievedata.line4;
        if (data.addrretrievedata.line5 != '') strAddress += ',' + data.addrretrievedata.line5;
        if (data.addrretrievedata.postTown != '') strAddress += ',' + data.addrretrievedata.postTown;
        if (data.addrretrievedata.county != '') strAddress += ',' + data.addrretrievedata.county;
        if (data.addrretrievedata.postcode != '') {
            postCode = data.addrretrievedata.postcode;
        }

        var formatter = strAddress.split(",");
        var position = 0;
        var elements = formatter.length;
        var maxLines = 4;
        for (i = 0; i < elements; i++) {
            if (elements > maxLines && (i+2) < elements) {
                if ((formatter[i].length + formatter[i+1].length) < 29) {
                    address += formatter[i] + ", " + formatter[i + 1] + "|";
                    position++;
                    i++;
                } else {
                    address += formatter[i] + "|";
                    position++;
                }
            } else {
                address += formatter[i] + "|";
                position++;
            }
        }

        //populate payment fields
        try{
            document.getElementById("form1:hidPayAddr1").value = data.addrretrievedata.line1;
        }catch(e){}
        try{
            document.getElementById("form1:hidPayAddr2").value = data.addrretrievedata.postTown;
        }catch(e){}
        try{
            document.getElementById("form1:hidPayAddr3").value = data.addrretrievedata.county;
        }catch(e){}
        try{
            document.getElementById("form1:hidPayAddr4").value = data.addrretrievedata.postcode;
        }catch(e){}

        //capture additional detail
        try{
            document.getElementById('form1:hidAddrName').value = data.addrretrievedata.buildingName;
        }catch(e){}
        try{
            document.getElementById('form1:hidAddrNumber').value = data.addrretrievedata.buildingNumber;
        }catch(e){}
        try{
            document.getElementById('form1:hidAddrStreet').value = data.addrretrievedata.primaryStreet;
        }catch(e){}
        try{
            document.getElementById('form1:hidAddrTown').value = data.addrretrievedata.postTown;
        }catch(e){}
        try{
            document.getElementById('form1:hidAddrCounty').value = data.addrretrievedata.county;
        }catch(e){}
        try{
            document.getElementById('form1:hidAddrSubBuilding').value = data.addrretrievedata.subbuilding;
        }catch(e){}

        strAddress += ',' + data.addrretrievedata.postcode;
        ajaxPopulatePCAAddress(address, postCode, strAddress);
        ajaxFocusNext(document.getElementById('form1:txtAddress4'));
        try {
            if (window.customPostCodeAction) {
                customPostCodeAction(postCode);
            }
        } catch(e) {}
    }
}

function ajaxPopulatePCAAddress(val, postCode, concat) {
    var addressArray=val.split("|", 4);

    obi('form1:txtAddress1').value=ajaxTrim(addressArray[0]);
    obi('form1:txtAddress2').value=ajaxTrim(addressArray[1]);
    obi('form1:txtAddress3').value=ajaxTrim(addressArray[2]);
    obi('form1:txtAddress4').value=ajaxTrim(addressArray[3]);
    obi('form1:lblAddressQ1').innerHTML=ajaxTrim(addressArray[0]);
    obi('form1:lblAddressQ2').innerHTML=ajaxTrim(addressArray[1]);
    obi('form1:lblAddressQ3').innerHTML=ajaxTrim(addressArray[2]);
    obi('form1:lblAddressQ4').innerHTML=ajaxTrim(addressArray[3]);
    obi('form1:txtPostcode').value=ajaxTrim(postCode);

    //obi(oFields.txtPostcode).value=ajaxTrim(postCode);
    //$('#' + oFields.hidConcat).val(trim(concat));
    ajaxShowAnimation(false);

    ajaxFocusNext(document.getElementById('form1:txtAddress4'));
}

function customPostCodeAction(postCode) {
}

function ajaxCheckEnter(e){ 
    var characterCode 
    if(e && e.which){ 
        e = e
        characterCode = e.which 
    } else {
        e = event
        characterCode = e.keyCode 
    }
    if(characterCode == 13){ 
        ajaxPcaFetchBegin();
    }
}

/**
 * Clear out any existing address info
 */
function ajaxClearAddress() {
    document.getElementById(oFields.txtAddress1).value="";
    document.getElementById(oFields.txtAddress2).value="";
    document.getElementById(oFields.txtAddress3).value="";
    document.getElementById(oFields.txtAddress4).value="";
    document.getElementById(oFields.lblAddressQ1).innerHTML="";
    document.getElementById(oFields.lblAddressQ2).innerHTML="";
    document.getElementById(oFields.lblAddressQ3).innerHTML="";
    document.getElementById(oFields.lblAddressQ4).innerHTML="";
}
function clearStandardAddressFields() {
    document.getElementById('form1:txtAddress1').value="";
    document.getElementById('form1:txtAddress2').value="";
    document.getElementById('form1:txtAddress3').value="";
    document.getElementById('form1:txtAddress4').value="";
    document.getElementById('form1:lblAddressQ1').innerHTML="";
    document.getElementById('form1:lblAddressQ2').innerHTML="";
    document.getElementById('form1:lblAddressQ3').innerHTML="";
    document.getElementById('form1:lblAddressQ4').innerHTML="";
}

function ajaxFocusNext(oField){
    var oParent = oField.parentNode;
    if(oParent != null){
        var oSibling = oParent.nextSibling;
        if(oSibling != null){
            var aInputs = oSibling.getElementsByTagName('input');
            if(aInputs.length > 0){
                aInputs[0].focus();
            }else{
                var aSelects = oSibling.getElementsByTagName('select');
                if(aSelects.length > 0){
                    aSelects[0].focus();
                }
            }
        }else{
            oParent = oParent.parentNode;
            if(oParent != null){
                oSibling = oParent.nextSibling;
                if(oSibling != null){
                    var aInputs = oSibling.getElementsByTagName('input');
                    if(aInputs.length > 0){
                        aInputs[0].focus();
                    }else{
                        var aSelects = oSibling.getElementsByTagName('select');
                        if(aSelects.length > 0){
                            aSelects[0].focus();
                        }
                    }
                }
            }
        }
    }
}
