var KEYUP = 38;
var KEYDOWN = 40;
var KEYENTER = 13;
var KEYTAB = 9;

var gCurrentlySelectedLi = -1;
var gXMLHttp;
var gXMLDoc;
var gFacilitiesChkBox = "chkGymFacilities";
var gClassesChkBox = "chkGymClasses";
var gPilates = "13",gSpinning = "80", gYoga = "12";
var gSwimmingPool= "1", gThreadmills="4", gWeights = "2";
var gServerResponseComplete = 4;
var gAdvancedSearch = "advancedSearch";
var gCompleted = "complete";
var gNameId = "gymNameId";
var gSuggestions = "suggestions";
var gNoStyleDisplay = "none";
var gStyleDisplay = "block";
var gAdvancedSearchForm = "advancedSearchForm";
var gEmpty = "";
var gRestOfFacilities = "RestOfFacilities";
var gRestOfClasses = "RestOfClasses";

function deselectLi(list, li)
{
    if(li != -1) {
        list[li].className = "li";
    }
}

function emptySuggestions()
{
    document.getElementById(gSuggestions).innerHTML = gEmpty;
    document.getElementById(gSuggestions).style.display = gNoStyleDisplay;
}

function getList()
{
    return document.getElementById(gSuggestions).getElementsByTagName("li");
}

function getXmlHttpObject()
{

    var gXMLHttp = null;

    try {
        gXMLHttp = new XMLHttpRequest();
    }
    catch (e) {
        try {
            gXMLHttp = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e) {
            gXMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
    return gXMLHttp;
}


function setXMLDoc()
{
    try{
        gXMLDoc=new ActiveXObject("Microsoft.XMLDOM");
        gXMLDoc.async="false";
        gXMLDoc.loadXML(gXMLHttp.responseText);
    }
    catch(e)
    {
        parser=new DOMParser();
        gXMLDoc=parser.parseFromString(gXMLHttp.responseText,"text/xml");
    }

}

function handleClick(selection)
{
    document.getElementById(gNameId).value = unescape(selection);
    emptySuggestions();
}

function SuggestGymName(e, userInput)
{

    var theEvent = e || window.event;
    var newSelectedLi;

    if (userInput.length == 0) {
        emptySuggestions();
        return;
    }

    if (theEvent.keyCode == KEYUP || theEvent.keyCode == KEYDOWN)
    {

        var list = getList();

        if(theEvent.keyCode == KEYDOWN)
        {
            newSelectedLi = gCurrentlySelectedLi + 1;
        }
        else {
            newSelectedLi = gCurrentlySelectedLi - 1;
        }

        if(newSelectedLi <= 9 && newSelectedLi >= 0)
        {
            selectLi(list, newSelectedLi, true);
            deselectLi(list, gCurrentlySelectedLi);
            setCurrentLi(newSelectedLi);
        }

        return;

    }

    gXMLHttp = getXmlHttpObject();

    if (gXMLHttp == null)
    {
        alert("Your browser does not support this application.  Please update to a newer version.");
        return;
    }

    var url = "PopulateAdvancedSearch?gymName=" + userInput;

    gXMLHttp.onreadystatechange = populateGymNameSuggestions;
    gXMLHttp.open("POST", url, true);
    gXMLHttp.send(null);

}


function newCurrentLi(li)
{
    var list = getList();

    for(var i = 0; i < list.length; i++)
    {
        if(i == li)
        {
            selectLi(list, li, false);
            setCurrentLi(li);
        }
        else {
            deselectLi(list, i);
        }
    }
}

function resetCurrentLi()
{
    gCurrentlySelectedLi = -1;
}

function selectLi(list, li, updateInputText)
{
    list[li].className = "hoverLi";

    if (updateInputText) {
        setInputText(li);
    }
}

function setCurrentLi(li)
{
    gCurrentlySelectedLi = li;
}

function setInputText(li)
{

    var list = getList();

    if(li >= 0) {
        document.getElementById(gNameId).value = list[li].innerHTML.substring(6);
    }
    else {
        document.getElementById(gNameId).value = list[gCurrentlySelectedLi].innerHTML.substring(6);
    }

}

function populateGymNameSuggestions()
{
    var i = 0;

    if (gXMLHttp.readyState == gServerResponseComplete || gXMLHttp.readyState == gCompleted)
    {

        setXMLDoc();

        var GymsElements = gXMLDoc.getElementsByTagName("ie.gymlockr.details.Gym");
        var nrOfGymsElements = GymsElements.length;
        var suggestionList = gEmpty;
        var nameValue =gEmpty;

        if(nrOfGymsElements != 0)
        {
            for(i = 0;i < nrOfGymsElements;i++ )
            {
                nameValue = GymsElements[i].getElementsByTagName("gymName")[0].childNodes[0].nodeValue;
                suggestionList += "<li value='" + i + "' class=\"li\" onmouseover=\"newCurrentLi(this.value);\" onclick=\"handleClick('" + nameValue + "');\">&nbsp;" + nameValue + "</li>";
            }

            if(suggestionList != gEmpty) {
                suggestionList = "<ul class=\"ul\">" + suggestionList;
                suggestionList += "</ul>";
            }

            document.getElementById(gSuggestions).innerHTML = suggestionList;
            document.getElementById(gSuggestions).style.display = gStyleDisplay;

        }
        else {
            document.getElementById(gSuggestions).style.display = gNoStyleDisplay;
        }
    }
}

function PopulateClasses()
{
    gXMLHttp = getXmlHttpObject();

    if (gXMLHttp == null)
    {
        alert("Your browser does not support this application.  Please update to a newer version.");
        return;
    }

    var url = "PopulateAdvancedSearch?getClasses=" + true;

    
    gXMLHttp.open("POST", url, false);
    gXMLHttp.send(null);

    /** Note the gXMLHttp.onreadystatechange property seem to have had problems with firefox
     *  so used the below reccomendations
     * http://www.onejohn.org/wpjohn/2008/05/firefox-bug-with-onreadystatechange **/
    getAllClasses();

  
}

function getAllClasses()
{
    var i = 0;

    if (gXMLHttp.readyState == gServerResponseComplete || gXMLHttp.readyState == gCompleted)
    {

        setXMLDoc();

        var ClassElements = gXMLDoc.getElementsByTagName("ie.gymlockr.details.Class");
        var nrOfClassElements = ClassElements.length;

        var ClassList = gEmpty;
        var nameValue =gEmpty;
        var idValue = gEmpty;

        ClassList =  "<span class=\"chkBoxText\">";
        for(i = 0;i < nrOfClassElements;i++ )
        {
            nameValue = ClassElements[i].getElementsByTagName("className")[0].childNodes[0].nodeValue;
            idValue = ClassElements[i].getElementsByTagName("classID")[0].childNodes[0].nodeValue;
            ClassList += " <input type=\"checkbox\" name="+gClassesChkBox+" id="+gClassesChkBox+idValue+" value="+idValue+">"+nameValue+"<BR/>";
        }

        ClassList += "</span>";
        document.getElementById(gRestOfClasses).innerHTML = ClassList;
        HideDiv( gRestOfClasses);
    }

}


function PopulateFacilities(){
    gXMLHttp = getXmlHttpObject();

    if (gXMLHttp == null)
    {
        alert("Your browser does not support this application.  Please update to a newer version.");
        return;
    }

    var url = "PopulateAdvancedSearch?getFacilities=" + true;


    gXMLHttp.open("POST", url, false);
    gXMLHttp.send(null);

    /** Note the gXMLHttp.onreadystatechange property seem to have had problems with firefox
     *  so used the below reccomendations
     * http://www.onejohn.org/wpjohn/2008/05/firefox-bug-with-onreadystatechange **/
    getAllFacilities();
}

function getAllFacilities() {
    var i = 0;

    if (gXMLHttp.readyState == gServerResponseComplete || gXMLHttp.readyState == gCompleted) {

        setXMLDoc();

        var FaciltiesElements = gXMLDoc.getElementsByTagName("ie.gymlockr.details.Facility");
        var nrOfFaciltiesElements = FaciltiesElements.length;

        var FacilityList = gEmpty;
        var nameValue =gEmpty;
        var idValue = gEmpty;

        FacilityList =  "<span class=\"chkBoxText\">";
        for(i = 0;i < nrOfFaciltiesElements;i++ )
        {
            nameValue = FaciltiesElements[i].getElementsByTagName("Name")[0].childNodes[0].nodeValue;
            idValue = FaciltiesElements[i].getElementsByTagName("Id")[0].childNodes[0].nodeValue;
            FacilityList += " <input type=\"checkbox\" name="+gFacilitiesChkBox+" id="+gFacilitiesChkBox+idValue+" value="+idValue+">"+nameValue+"<BR/>";
        }

        FacilityList += "</span>";
        document.getElementById(gRestOfFacilities).innerHTML = FacilityList;
        HideDiv( gRestOfFacilities);
    }
}

function TurnDivOnOrOff(Id)
{
    div = document.getElementById(Id);
    if(div.style)
    {
        if ( div.style.display == gStyleDisplay )
        {
            HideDiv(Id);
        }else if ( div.style.display == gNoStyleDisplay )
        {
            ShowDiv(Id);
        }
    } else {
        if ( div.display == gStyleDisplay )
        {
            HideDiv(Id);
        }else if ( div.display == gNoStyleDisplay ) {
            ShowDiv(Id);
        }
    }
}

function ShowDiv(Id)
{
    div = document.getElementById(Id);
    if(div.style)
    {
        div.style.display = gStyleDisplay;
    } else {
        div.display = gStyleDisplay;
    }
}

function HideDiv(Id)
{
    div = document.getElementById(Id);
    if(div.style)
    {
        div.style.display = gNoStyleDisplay;
    } else {
        div.display = gNoStyleDisplay;
    }
}

function showAdvancedSearchForDropdown()
{
    popultateFacilititesAndClasses();
    populateAdvanceSearch();
    TurnDivOnOrOff(gAdvancedSearch);
}

function newSearch()
{
    ResetAdvanceSearchForm();
    popultateFacilititesAndClasses();
    ShowDiv(gAdvancedSearch);
}

function showAdvanceSearch()
{
    popultateFacilititesAndClasses();
    if(document.location.href.toString().indexOf("AdvanceSearchServlet", 0) > 0)
    {
        ShowDiv(gAdvancedSearch);
        populateAdvanceSearch();
    } else if(document.location.href.toString().indexOf("advertise.jsp", 0) > 0)
    {
        ShowDiv(gAdvancedSearch);
        populateAdvanceSearch();
    }else if(document.location.href.toString().indexOf("AdvancedSearchResults", 0) > 0)
    {
        ShowDiv(gAdvancedSearch);
        populateAdvanceSearch();
    }
    else if(document.referrer.toString().indexOf("AdvanceSearchServlet", 0) > 0)
    {
        HideDiv(gAdvancedSearch);
        populateAdvanceSearch();
    }
    else{
        HideDiv(gAdvancedSearch);
        populateAdvanceSearch();
    }
}

function populateAdvanceSearch()
{

    gXMLHttp = getXmlHttpObject();

    if (gXMLHttp == null)
    {
        alert("Your browser does not support this application.  Please update to a newer version.");
        return;
    }

    var url = "PopulateAdvancedSearch?getPastSearchCriteria=" + true;

    gXMLHttp.onreadystatechange = displayPastSearch;
    gXMLHttp.open("POST", url, true);
    gXMLHttp.send(null);

}

/* Need to reset the advanced search form and clear down any server side references to past searches */
function ResetAdvanceSearchForm()
{
    document.getElementById(gAdvancedSearchForm).reset();
    clearPastSearch();
}

function ResetAdvanceSearchForm2()
{
    clearPastSearch2();
}

function clearPastSearch()
{
    gXMLHttp = getXmlHttpObject();

    if (gXMLHttp == null) {
        alert("Your browser does not support this application.  Please update to a newer version.");
        return;
    }

    var url = "PopulateAdvancedSearch?clearPastSearch=" + true;

    gXMLHttp.onreadystatechange = removePastSearch;
    gXMLHttp.open("POST", url, true);
    gXMLHttp.send(null);
}

function removePastSearch()
{
    if (gXMLHttp.readyState == gServerResponseComplete || gXMLHttp.readyState == gCompleted)
    {
        HideDiv(gAdvancedSearch);
    }
}



function clearPastSearch2()
{
    gXMLHttp = getXmlHttpObject();

    if (gXMLHttp == null) {
        alert("Your browser does not support this application.  Please update to a newer version.");
        return;
    }

    var url = "PopulateAdvancedSearch?clearPastSearch=" + true;

    gXMLHttp.onreadystatechange = removePastSearch2;
    gXMLHttp.open("POST", url, true);
    gXMLHttp.send(null);
}

function removePastSearch2()
{
    if (gXMLHttp.readyState == gServerResponseComplete || gXMLHttp.readyState == gCompleted)
    {
        ShowDiv(gAdvancedSearch);
    }
}

function displayPastSearch()
{
    document.getElementById(gAdvancedSearchForm).reset();

    if (gXMLHttp.readyState == gServerResponseComplete || gXMLHttp.readyState == gCompleted)
    {
        //Create XML parser and clear form from past search activity
        setXMLDoc();

        var allFacilitiesSearchedFor = gXMLDoc.getElementsByTagName("facilities");
        if((allFacilitiesSearchedFor != null) && (allFacilitiesSearchedFor.length>0))
        {
            /* Need to show past facilties searched for */
            showFaciltiesSearchedFor(allFacilitiesSearchedFor);
        }

        var allClassesSearchedFor = gXMLDoc.getElementsByTagName("classes");
        if((allClassesSearchedFor != null) && (allClassesSearchedFor.length>0))
        {
            /* Need to show past Classes searched for */
            showClassesSearchedFor(allClassesSearchedFor);
        }

        /* Show the extra search options - these include hasWebsite,hasPictures,hasEmail and gym name */
        showExtraSearchOptions();

        var allAreasSearchedFor = gXMLDoc.getElementsByTagName("areas");
        if((allAreasSearchedFor != null) && (allAreasSearchedFor.length>0))
        {
            /* Need to show past Areas searched for */
            showPastAreasSearchedFor(allAreasSearchedFor);
        }
    }
    gXMLDoc = null;
}


function showFaciltiesSearchedFor(allFacilitiesSearchedFor)
{
    var nrOfFaciltiesElements =  allFacilitiesSearchedFor[0].getElementsByTagName("string").length;
    var i;
    var nameValue;

    for(i = 0;i < nrOfFaciltiesElements;i++ )
    {
        nameValue = allFacilitiesSearchedFor[0].getElementsByTagName("string")[i].childNodes[0].nodeValue;

        if(!isExistingFacility(nameValue))ShowDiv(gRestOfFacilities);

        document.getElementById(gFacilitiesChkBox+nameValue).checked =true;
    }

}

function isExistingFacility(nameValue)
{
    var isAHardCodedFacility = true;
    if((nameValue != gSwimmingPool) && (nameValue != gThreadmills) &&(nameValue != gWeights)) isAHardCodedFacility = false;
    return isAHardCodedFacility;
}

function showClassesSearchedFor(allClassesSearchedFor)
{
    var nrOfClassesElements =    allClassesSearchedFor[0].getElementsByTagName("string").length;
    var j;
    var nameValue;

    for(j = 0;j < nrOfClassesElements;j++ )
    {
        nameValue = allClassesSearchedFor[0].getElementsByTagName("string")[j].childNodes[0].nodeValue;

        if(!isExistingClass(nameValue))ShowDiv(gRestOfClasses);

        document.getElementById(gClassesChkBox+nameValue).checked =true;
    }
}

function isExistingClass(nameValue)
{
    var isAHardCodedClass = true;
    if((nameValue != gPilates) && (nameValue != gSpinning) &&(nameValue != gYoga)) isAHardCodedClass = false;
    return isAHardCodedClass;
}

function showExtraSearchOptions()
{

    var hasWebsite = gXMLDoc.getElementsByTagName("hasWebsite");
    if((hasWebsite != null) && (hasWebsite.length>0))
    {
        document.getElementById("hasWebsiteID").checked =true;
    }

    var hasPictures = gXMLDoc.getElementsByTagName("hasPictures");
    if((hasPictures != null) && (hasPictures.length>0))
    {
        document.getElementById("hasPicturesID").checked =true;
    }

    var hasEmail = gXMLDoc.getElementsByTagName("hasEmail");
    if((hasEmail != null) && (hasEmail.length>0))
    {
        document.getElementById("hasEmailID").checked =true;
    }

    var gymname = gXMLDoc.getElementsByTagName("gymname");
    if((gymname != null) && (gymname.length>0))
    {
        document.getElementById(gNameId).value =gymname[0].childNodes[0].nodeValue;
    }
}

function showPastAreasSearchedFor(allAreasSearchedFor)
{
    var nrOfAreaElements =    allAreasSearchedFor[0].getElementsByTagName("string").length;
    var j;
    var nameValue;

    for(j = 0;j < nrOfAreaElements;j++ )
    {
        nameValue = allAreasSearchedFor[0].getElementsByTagName("string")[j].childNodes[0].nodeValue;

        var myselect=document.getElementById("gymAreasSelect")
        var i=0;
        for ( i=0; i<myselect.options.length; i++)
        {
            if (myselect.options[i].value ==nameValue)
            {
                myselect.options[i].selected = true;
                break
            }
        }
    }
}

function popultateFacilititesAndClasses()
{
    PopulateFacilities();
    PopulateClasses();
}