var inMemLat = 0;
var inMemLng = 0;
var inMemTitle = '';
var inMemType = 0;

var inLat = '';
var inLng = '';
var inAddress = '';
var inCity = '';
var inState = '';
var inZip = '';
var inMemberID = '0';
var boolAddToTP = '';

var showDining = false;
var showLodging = false;
var showShopping = false;
var showThings = false;
var showEvents = false;
var showTravelPlanner = false;
var showTravelPlannerIntro = false;

var map; //Map being manipulated
var ZoomLevel;


//Create a generic icon for the map.  This is extended functionality which is not required.
var baseIcon = new GIcon();
baseIcon.shadow = "/applications/igm/images/shadow.png";
baseIcon.iconSize = new GSize(24, 30);
baseIcon.shadowSize = new GSize(46, 31);
baseIcon.iconAnchor = new GPoint(9, 34);
baseIcon.infoWindowAnchor = new GPoint(9, 2);
baseIcon.infoShadowAnchor = new GPoint(18, 25);

// Stop page scrolling if wheel over map
function wheelevent(e) {
    if (!e) e = window.event;
    if (e.preventDefault) e.preventDefault();
    e.returnValue = false;
}

function pushPinGroup(name, image, shadow, extIcon, extIconDepressed, imageWidth, imageHeight, iconAnchorX, iconAnchorY, shadowWidth, shadowHeight, shadowAnchorX, shadowAnchorY) {
    this.reqIS = null;
    this.GroupName = name;
    this.Image = image;
    this.imageWidth = imageWidth;
    this.imageHeight = imageHeight;
    this.iconAnchorX = iconAnchorX;
    this.iconAnchorY = iconAnchorY;
    this.shadowWidth = shadowWidth;
    this.shadowHeight = shadowHeight;
    this.shadowAnchorX  = shadowAnchorX;
    this.shadowAnchorY = shadowAnchorY;
    this.Shadow = shadow;
    this.markers = new Array();    //parallels arrMarkerInfo array
    this.arrMarkerInfo = new Array(); //parallels markers array
    this.displayed = false;
    this.addedToMap = false;
    this.externalIcon = extIcon;
    this.externalIconDepressed = extIconDepressed;
}

function objMarker(title, icon, subType, lat, lng, gPoint, shortInfo, longInfo, url, id, add1, add2, city, state, zip, phone, tollfreephone, evtDate, evtTime) {
    this.id = id;
    this.title = title;
    this.icon = icon;
    this.subType = subType;
    this.point = gPoint;
    this.lat = lat;
    this.lng = lng;
    this.displayed = true; //based on user subType checkbox status checked = displayed
    this.add1 = add1;
    this.add2 = add2;
    this.city = city;
    this.state = state;
    this.zip = zip;
    this.phone = phone;
    this.tollfreephone = tollfreephone;
    this.evtDate = evtDate;
    this.evtTime = evtTime;

    //now obtained dynamically this.shortInfo = shortInfo;
    //now obtained dynamically this.longInfo = longInfo;
    //now obtained dynamically this.url = url;
}

function changeMap(strInput){ //strInput format  "lat,lng,zoom"
    //Change location of map center and zoom level
    var arrOptions=strInput.split(",");
    if(arrOptions.length >= 3){
        map.setCenter(new GLatLng(arrOptions[0],arrOptions[1]), parseInt(arrOptions[2]));
        document.getElementById('MapTitle').innerHTML = arrOptions[3];
    }
}

function toggleIconGroup(pinGroupId){
    //Add pins to map for first use if not currently on map/in marker manager
    if (arrAllPins[pinGroupId].displayed == false)
        toggleIconGroupOn(pinGroupId);
    else //Toggle current pin group
        toggleIconGroupOff(pinGroupId);
}

function toggleIconGroupOn(pinGroupId){
    //if not currently displayed and not added to map
    if (arrAllPins[pinGroupId].displayed == false && arrAllPins[pinGroupId].addedToMap == false){
            //add icons/listings to map
            getListingsUsingXML(arrAllPins[pinGroupId].GroupName, pinGroupId);
            arrAllPins[pinGroupId].addedToMap = true;
            arrAllPins[pinGroupId].displayed = true;
    } else{ //display pin group
        for (var i = 0; i < arrAllPins[pinGroupId].markers.length; i++) {
            var marker = arrAllPins[pinGroupId].markers[i];
            var markerInfo = arrAllPins[pinGroupId].arrMarkerInfo[i];
            if (markerInfo.displayed == true && marker.isHidden() && arrAllPins[pinGroupId].displayed == false) {
                //Show markers on map
                marker.show();
                markerInfo.displayed = true;
            }
        }
    }
    arrAllPins[pinGroupId].displayed = true;
    //reset the icon
    if (document.getElementById("icon_"+pinGroupId)){
        document.getElementById("icon_"+pinGroupId).src = arrAllPins[pinGroupId].externalIconDepressed;
    }
}

function toggleIconGroupOff(pinGroupId){
    for (var i = 0; i < arrAllPins[pinGroupId].markers.length; i++) {
        var marker = arrAllPins[pinGroupId].markers[i];
        if (marker.isHidden() == false){//need to hide if member is being viewed from member page and view TP was clicked && arrAllPins[pinGroupId].displayed == true){
            //Hide markers on map
            marker.hide();
            marker.closeInfoWindow();
            //do not change info status as that only tracks users checkbox request
        }
    }
    arrAllPins[pinGroupId].displayed = false;
    //reset the icon
    document.getElementById("icon_"+pinGroupId).src = arrAllPins[pinGroupId].externalIcon;
}

function toggleIconGroupSubTypes(pinGroupId, subType, boolShow, parentDivID){

    //this Assumes all icons have been added to map
    for (var i = 0; i < arrAllPins[pinGroupId].markers.length; i++) {
            var marker = arrAllPins[pinGroupId].markers[i];
            var markerInfo = arrAllPins[pinGroupId].arrMarkerInfo[i];

            if(markerInfo.subType.indexOf(subType) != -1){
                    if(boolShow){
                            //bkw may need to check if group is displayed before calling marker.show()
                            //need to set displayed to true so marker will be shown.
                            markerInfo.displayed = true;
                            marker.show();
                    } else {
                            //special logic just in case the member is listed in more than one sub type category
                            // Logic checks ids of check boxes which are checked and verify that those ids are contained in the subType which should be a comma separated list of items
                            var boolNotInOtherSubType = true;

                            if (markerInfo.subType.length > subType.length + 2){ //try to limit the amount of checks. marker subtype may have a comma or two

                                    var ckboxes = document.getElementById(parentDivID).getElementsByTagName('input');
                                    for(j=0; j<ckboxes.length && boolNotInOtherSubType == true; j++){

                                            if (ckboxes[j].type=="checkbox" && ckboxes[j].checked == true && markerInfo.subType.toLowerCase().indexOf(ckboxes[j].id.toLowerCase()) != -1){
                                                    boolNotInOtherSubType = false;
                                            }
                                    }
                            }

                            if (boolNotInOtherSubType){
                                    markerInfo.displayed = false;
                                    marker.hide();
                                    marker.closeInfoWindow();
                            }
                    }
            }
    }
}

function selectAllSubTypes(groupID, parentDivID){
        var ckboxes = document.getElementById(parentDivID).getElementsByTagName('input');
        for (var i = 0; i < ckboxes.length; i++){
                //if (doc[i].id.indexOf('subtype_0_'+groupID) == 0){
                        if(ckboxes[i].checked == false){
                                ckboxes[i].checked = true;
                                toggleIconGroupSubTypes(groupID, ckboxes[i].id, true, parentDivID)
                        }
                //}
        }
}

function deselectAllSubTypes(groupID, parentDivID){
        var ckboxes = document.getElementById(parentDivID).getElementsByTagName('input');
        for (var i = 0; i < ckboxes.length; i++){
                //if (doc[i].id.indexOf('subtype_0_'+groupID) == 0){
                        if(ckboxes[i].checked == true){
                                ckboxes[i].checked = false;
                                toggleIconGroupSubTypes(groupID, ckboxes[i].id, false, parentDivID)
                        }
                //}
        }
}

function resetEvents(){
        for (var i = 0; i < arrAllPins[eventsGroupID].markers.length; i++) {
                map.removeOverlay(arrAllPins[eventsGroupID].markers[i]);
        }
        arrAllPins[eventsGroupID].markers.length = 0;

        //var mgrOptions = { borderPadding: 1, maxZoom: 17, trackMarkers: false };
        //mgr = new MarkerManager(map, mgrOptions);
        //There is no way to remove markers using the marker manager. Can I add the events markers in some other way?

        getListingsUsingXML(arrAllPins[eventsGroupID].GroupName, eventsGroupID);
        arrAllPins[eventsGroupID].addedToMap = true;
        arrAllPins[eventsGroupID].displayed = true;
}

function hideHiddenMarkers(){ //This is not used since marker manager is not currently used
        //This function is called when marger manager fires a changed event from either a mgr refresh or zoom change.
        for (var j = 0; j < arrAllPins.length; j++) {
                if (arrAllPins[j].displayed == false) {
                        for (var i = 0; i < arrAllPins[j].markers.length; i++) {
                                //Remove pins from map
                                arrAllPins[j].markers[i].hide();
                        } //else show action not needed
                }
        }
}

function setInitialMapLocation(zoom){
        ZoomLevel = zoom
        //Check the querystring for default map location and zoom level
        if (inLat.length > 0 || inLng.length > 0){
                //center on input lat lng if it exists
                map.setCenter(new GLatLng(inLat, inLng), inZoom);
        } else if(inZip.length > 0 || (inAddress.length > 0 && inCity.length > 0 && inState.length > 0)){
                //center map on address if it exists call google to geocode
                var inputAddresses = new Array(3);
                inputAddresses[0] = inAddress + "," + inCity + "," + inState + " " + inZip;
                inputAddresses[1] = inAddress + "," + inCity + "," + inState;
                inputAddresses[2] = inZip;

                centerOnAddressPoint(inputAddresses, 0, ZoomLevel);
        } else if (inMemberID > 0 && inMemLat != 0 && inMemLng != 0){
                //center on specified member
                map.setCenter(new GLatLng(inMemLat, inMemLng), inZoom);
        } else {
                //Center map on visitors center
                map.setCenter(new GLatLng(visCenterLat, visCenterLng), ZoomLevel);
        }
}


function addPointToMarkerList(lat, lng, title, arrObjAllMarkers, subType, sectionID, ID, add1, add2, city, state, zip, phone, tollfreephone, evtDate, evtTime){
        var point = new GLatLng(lat, lng);
        var icon = new GIcon(baseIcon);
        icon.image = arrObjAllMarkers[sectionID].Image;
        icon.iconSize = new GSize(arrObjAllMarkers[sectionID].imageWidth, arrObjAllMarkers[sectionID].imageHeight);
        icon.iconAnchor = new GPoint(arrObjAllMarkers[sectionID].iconAnchorX, arrObjAllMarkers[sectionID].iconAnchorY);
        icon.shadow = arrObjAllMarkers[sectionID].Shadow;
        icon.shadowSize = new GSize(arrObjAllMarkers[sectionID].shadowWidth, arrObjAllMarkers[sectionID].shadowHeight);
        icon.infoShadowAnchor = new GPoint(arrObjAllMarkers[sectionID].shadowAnchorX, arrObjAllMarkers[sectionID].shadowAnchorY);

        //Add the marker
        var marker = new GMarker(point, {icon:icon, title:title.replace(/<(br) \/+(>)/g, " ")});
        GEvent.addListener(marker, "click", function() {
                if(sectionID == eventsGroupID) { //events
                        getEventInfoUsingXML(marker,ID);
                } else if(subType == "tp_user") {//travel planner user entry
                        //tp user info and event basic info
                        getTPUserAddressInfoUsingXML(marker,ID);
                } else if(subType == "tp_member") {//travel planner member entry
                        getMemberInfoUsingXML(marker,ID, false);
                } else if(ID > 0) {//members
                        getMemberInfoUsingXML(marker,ID, true);
                }
        });

        //bkw note that this will put two instances of a map request specifying a member id in the array. I may need to make sure member id does not exist in list before pushing


        arrObjAllMarkers[sectionID].markers.push(marker);

        var strMarkerInfo = new objMarker(title, icon, subType, lat, lng, point, "", "", "", ID, add1, add2, city, state, zip, phone, tollfreephone, evtDate, evtTime)
        arrObjAllMarkers[sectionID].arrMarkerInfo.push(strMarkerInfo);

        //alert('point added');
}

function addMarkerGroupToMap(arrObjAllMarkers, sectionID){
        //alert('adding ' + arrObjAllMarkers[sectionID].markers.length + ' markers');
        //mgr.addMarkers(arrObjAllMarkers[sectionID].markers, 5, 17);
        //refresh and display the markers via the manager
        //mgr.refresh();

        for(var i=0;i< arrObjAllMarkers[sectionID].markers.length;i++){
                map.addOverlay(arrObjAllMarkers[sectionID].markers[i])
        }

        //alert('group added');

        //document.getElementById("loadStatus").innerHTML = "Loaded marker group containing " + arrObjAllMarkers[sectionID].markers.length + "  markers"
        //alert( "Loaded marker group containing " + arrObjAllMarkers[sectionID].markers.length + "  markers" );
}





//********************************************
//Geocoder functions
//********************************************
var arrTryAddresses;
var arrGeocoderTryAddresses = new Array(4);
var intGeocoderAddressCnt = 0;
var boolGeocoderRunning = false;
var intGeocoderLat = 0;
var intGeocoderLng = 0;

function centerOnAddressPoint(tryAddresses, index) {
        arrTryAddresses = tryAddresses;
        //Get the lat and long. When done, call back function is called with valid/invalid point
        var geocoder = new GClientGeocoder();
        geocoder.getLatLng(tryAddresses[index], centerOnAddressPointCallBack);
}

function geocodeAddress(add1, add2, city, state, zip) {
        //right now I am not using this set of geocoding functions due to the complications of waiting for google to return the result asyncronously

        arrGeocoderTryAddresses[0] = add1 + "," + add2 + "," + city + "," + state + " " + zip;
        arrGeocoderTryAddresses[1] = add1 + "," + city + "," + state + " " + zip;
        arrGeocoderTryAddresses[2] = add2 + "," + city + "," + state + " " + zip;
        arrGeocoderTryAddresses[3] = city + "," + state + " " + zip;

        intGeocoderLat = 0;
        intGeocoderLng = 0;
        boolGeocoderRunning = true;
        geocoderAddressTry(0); //kick of the geocode
        //need to wait for the geocoder to do its thing
}

function geocoderAddressTry(index) {
        //Get the lat and long. When done, store the lat lng values
        alert("here 1");
        intGeocoderAddressCnt = index;
        var geocoder = new GClientGeocoder();
        geocoder.getLatLng(arrGeocoderTryAddresses[index], geocoderAddressCallBack);
}

function geocoderAddressCallBack(point){
        alert("here 2");
        if (!point) {
                if (intGeocoderAddressCnt == arrGeocoderTryAddresses.length){
                        //alert("Unable to map address.");
                        boolGeocoderRunning = false;
                } else {
                        //Try the next address
                        intGeocoderAddressCnt++;
                        geocoderAddressTry(intGeocoderAddressCnt);
                }
        } else {
                //Point Found
                //update the global vars
                intGeocoderLat = point.lat()
                intGeocoderLng = point.lng();

                boolGeocoderRunning = false;
        }
}

function centerOnAddressPointCallBack(point){
  if (!point) {
        if (intAddressCnt == arrTryAddresses.length){
                //No more addresses to try, use the visitors center
                map.setCenter(new GLatLng(visCenterLat, visCenterLng), ZoomLevel);
        } else {
                //Try the next address
                intAddressFromCnt++;
                centerOnAddressPoint(arrTryAddresses, intAddressCnt);
        }
  } else {
          //Point Found
          map.setCenter(point, ZoomLevel);
  }
}










// General Map Functions Start
function getId(theID){return document.getElementById(theID);}

function toggleMap(){
        if ($("#mapAndControls").css("display") == "block") toggleMapClosed();
        else toggleMapOpen();
}

function toggleMapOpen(){
    $("#mapAndControls").css("display","block");
    $("#mapWelcome").css("display","none");
    $("#arrowMap").attr("src","/applications/igm/images/arrow_f2.gif");
}

function toggleMapClosed(){
    $("#mapAndControls").css("display","none");
    $("#mapWelcome").css("display","block");
    $("#arrowMap").attr("src","/applications/igm/images/arrow.gif");
}

function check4EnterBtn(evt, actn){
    var keyCode = evt.keyCode ? evt.keyCode :
    evt.charCode ? evt.charCode : evt.which;
    if (keyCode == 13)
            actn;
    else
            return true;
}

function noenter(evt){
    var keyCode = evt.keyCode ? evt.keyCode :
    evt.charCode ? evt.charCode : evt.which;
    //prevent enter button from being used
    return (keyCode != 13);
}

function sendInfoWinEmailCheck(strMemberId, strEvtId, emailField){
        if (checkEmail(emailField, "Email")){
                sendMapInfoUsingXML(0, emailField.value, "", "", strMemberId, strEvtId);
                hideEmailInfoWin();
        }
}

function sendInfoWinPhoneCheck(strMemberId, strEvtId){
        if (getId("fldInfoWinPhoneNum").value.length < 10 || getId("fldInfoWinPhoneNum").value == "##########"){
                alert("Invalid Phone #");
        }else if (getId("fldInfoWinCarrier").selectedIndex == 0){
                alert("You must select a carrier");
        }else{
                sendMapInfoUsingXML(0, "", getId("fldInfoWinPhoneNum").value, getId("fldInfoWinCarrier").value, strMemberId, strEvtId);
                hidePhoneInfoWin();
        }
}

function sendTPEmailWinCheck(){
        if (checkEmail(getId('fldSTEEmail'), "Email")){
                sendMapInfoUsingXML(0, getId('fldSTEEmail').value, '', '', 0, 0);
                tb_remove();
        }
}

function sendTPWinPhoneCheck(){
        if (getId("fldNumber").value.length < 10 || getId("fldNumber").value == "##########"){
                alert("Invalid Phone #");
        }else if (getId("fldCarrier").selectedIndex == 0){
                alert("You must select a carrier");
        }else{
                sendMapInfoUsingXML(0, '', getId('fldNumber').value, getId('fldCarrier').value, 0, 0);
                tb_remove();
        }
}






function showEmailInfoWin(){
        getId('infoWinEmail').style.display="block";
        getId('infoWinInfo').style.display="none";

        //Autopopulate any values stored in cookies.
        checkTPEmailCookie('fldWinEmail');

}

function hideEmailInfoWin(){
        getId('infoWinEmail').style.display="none";
        getId('infoWinInfo').style.display="block";
}

function showPhoneInfoWin(){
        getId('infoWinPhone').style.display="block";
        getId('infoWinInfo').style.display="none";

        //populate field fldInfoWinCarrier with options
        populatePhoneCarriers(getId("fldInfoWinCarrier"));

        //Autopopulate any values stored in cookies.
        checkTPPhoneCookie('fldInfoWinPhoneNum', 'fldInfoWinCarrier')
}

function hidePhoneInfoWin(){
        getId('infoWinPhone').style.display="none";
        getId('infoWinInfo').style.display="block";
}

function showDirectionsInfoWin(){
        getId('infoWinDirections').style.display="block";
        getId('infoWinInfo').style.display="none";

        //Autopopulate any values stored in cookies.
        if (getCookie('tp_dirAdd').length > 0){
                getId('fldUserAddress').value = getCookie('tp_dirAdd');
        }
}

function hideDirectionsInfoWin(){
        getId('infoWinDirections').style.display="none";
        getId('infoWinInfo').style.display="block";
}

function checkTPEmailCookie(theFieldId){
        if (getCookie('tp_em').length > 0){
                getId(theFieldId).value = getCookie('tp_em');
        }
}

function checkTPPhoneCookie(theNumFieldId, theCarFieldId){
        //Autopopulate any values stored in cookies.
        if (getCookie('tp_ph').length > 0){
                getId(theNumFieldId).value = getCookie('tp_ph');
        }
        if (getCookie('tp_car').length > 0){
                var theSelect = getId(theCarFieldId);
                for (i = 0; i < theSelect.length; i++) {
                        if (theSelect.options[i].value == getCookie('tp_car')){
                                theSelect.options[i].selected = true
                        } else {
                                theSelect.options[i].selected = false
                        }
                }
        }
}


// Tab Functions Start
/*
var lastDisplayedMapTab = "mapTabDining"
function selectTab(strTabName, groupID){
        if (lastDisplayedMapTab != "mapTab"+strTabName){
                //change the header image
                $("#mapTabHeader").css("background-image","url(/applications/igm/images/header_" + strTabName + ".gif)");
                //hide the current tab selections and show the clicked one
                $("#" + lastDisplayedMapTab).css("display","none");
                $("#mapTab" + strTabName).css("display","block");

                toggleIconGroupOn(groupID);

                lastDisplayedMapTab = "mapTab" + strTabName;
        }
}
*/

var lastDisplayedMapTab = "mapTab3"
function selectTab(strTabName, groupID) {
    if (lastDisplayedMapTab != "mapTab"+strTabName){
        (function ($) {$("#" + lastDisplayedMapTab).css("display","none");})(jQuery);
        (function ($) {$("#mapTab" + strTabName).css("display","block");})(jQuery);

        lastDisplayedMapTab = "mapTab" + strTabName;
        toggleIconGroupOn(groupID);
    }
}

function checkIconsInTab(groupID, parentDivID){
                toggleIconGroupOn(groupID);
                selectAllSubTypes(groupID, parentDivID);
}

function uncheckIconsInTab(groupID, parentDivID){
                toggleIconGroupOff(groupID);
                deselectAllSubTypes(groupID, parentDivID);
}






function showSaveModal(){
        //getId('modalSave').style.display="block";
        //getId('modalBackground').style.display="block";
}
function hideSaveModal(){
        getId('modalSave').style.display="none";
        getId('modalBackground').style.display="none";
}

var lastMouseX = 0;
var lastMouseY = 0;
var algor;
//Capture mouse movement events
document.onmousemove = getMouseXY;
function getMouseXY(e){
        if (!e) e = window.event; // works on IE, but not NS (we rely on NS passing us the event)

          if (e)
          {
                if (e.pageX || e.pageY)
                { // this doesn't work on IE6!! (works on FF,Moz,Opera7)
                  lastMouseX = e.pageX;
                  lastMouseY = e.pageY;
                  algor = '[e.pageX]';
                  if (e.clientX || e.clientY) algor += ' [e.clientX] '
                }
                else if (e.clientX || e.clientY)
                { // works on IE6,FF,Moz,Opera7
                  // Note: I am adding together both the "body" and "documentElement" scroll positions
                  //       this lets me cover for the quirks that happen based on the "doctype" of the html page.
                  //         (example: IE6 in compatibility mode or strict)
                  //       Based on the different ways that IE,FF,Moz,Opera use these ScrollValues for body and documentElement
                  //       it looks like they will fill EITHER ONE SCROLL VALUE OR THE OTHER, NOT BOTH
                  //         (from info at http://www.quirksmode.org/js/doctypes.html)
                  lastMouseX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
                  lastMouseY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
                  algor = '[e.clientX]';
                  if (e.pageX || e.pageY) algor += ' [e.pageX] '
                }
          }
}

function displayTPAddSequence(destXoffset, destYoffset){
        //alert(lastMouseY + " " + lastMouseX);
        //use jQuery to set css parameters
        $("#TPAddImage").css( {height: "100px",
                width: "100px",
                opacity: 100.0,
                position: "absolute",
                top: eval(lastMouseY-50) + "px",
                left: eval(lastMouseX-50) + "px"}
        );

        //use jQuery to set css parameters
        $("#TPAddImage").animate({
                height: "0px",
                width: "0px",
                opacity: 0.0,
                top: eval(lastMouseY+destYoffset) + "px",
                left: eval(lastMouseX+destXoffset) + "px"},
                500
         );
}

function remove_verify(intID){
        if (confirm("Are you sure you want to remove this address from your Travel Plan?"))
                removeTPMemberUsingXML(intID);
}

function change_map_value(intID){
        var strAction
        var strCheckBox
        strCheckBox = eval("document.frmTPAddress.fldAddToMap_" + intID)
        if (strCheckBox.checked == true)
                strAction = "Add";
        else
                strAction = "Remove";

        window.location = "/maps/scripts/map_check_change.asp?fldItemID=" + intID + "&fldAction=" + strAction
}

function validateAddress(){
        var noErrors = true;
        if (document.getElementById('fldAddAddress1').value.length <= 0) {
                alert("Please enter a street address.")
                document.getElementById('fldAddAddress1').focus
                noErrors = false;
        }
        else if (document.getElementById('fldAddCity').value.length <= 0) {
                alert("Please enter a city.")
                document.getElementById('fldAddCity').focus
                noErrors = false;
        }
        else if (document.getElementById('fldAddState').selectedIndex == 0) {
                alert("Please enter a state.")
                document.getElementById('fldAddState').focus
                noErrors = false;
        }
        else if (document.getElementById('fldAddZip').value.length <= 0) {
                alert("Please enter a zip code.")
                document.getElementById('fldAddZip').focus
                noErrors = false;
        }
        else if (isZIPCode(document.getElementById('fldAddZip').value) == false || document.getElementById('fldAddZip').value.length > 5) {
                alert("This is not a valid zip code. Please use format #####.")
                document.getElementById('fldAddZip').focus
                noErrors = false;
        }

        if (noErrors == true) {
                displayTPAddSequence(0, 200);
                addTPMemberUsingXML(0);

                tb_remove();
                //Clear fields
                document.getElementById('fldAddName').value = "";
                document.getElementById('fldAddAddress1').value = "";
                document.getElementById('fldAddAddress2').value = "";
                document.getElementById('fldAddCity').value = "";
                document.getElementById('fldAddState').selectedIndex = 0;
                document.getElementById('fldAddZip').value = "";

        }
}







function setCookie(c_name,value,expiredays)
{
        var exdate=new Date();
        exdate.setDate(exdate.getDate()+expiredays);
        document.cookie=c_name+ "=" +escape(value)+
        ((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
}

function getCookie(c_name)
{
        if (document.cookie.length>0)
        {
                c_start=document.cookie.indexOf(c_name + "=");
                if (c_start!=-1)
                {
                        c_start=c_start + c_name.length+1;
                        c_end=document.cookie.indexOf(";",c_start);

                        if (c_end==-1) c_end=document.cookie.length;

                        return unescape(document.cookie.substring(c_start,c_end));
                }
        }
        return "";
}











function getListingsUsingXML(section, sectionID) {
        (function ($) {$('#loadStatus').css('display', 'block');})(jQuery);

    var url = '/applications/igm/getListingsAsXML.php?section=' + section;

    var functionToCall;
    if(sectionID == 0) functionToCall = process0;
    if(sectionID == 1) functionToCall = process1;
    if(sectionID == 2) functionToCall = process2;
    if(sectionID == 3) functionToCall = process3;
    if(sectionID == 4) functionToCall = process4;
    if(sectionID == 5) functionToCall = process5;
    if(sectionID == 6) functionToCall = process6;
    if(sectionID == 7) functionToCall = process7;
    if(sectionID == 8) functionToCall = process8;
    if(sectionID == 9) functionToCall = process9;
    if(sectionID == eventsGroupID) {
        url = '/applications/igm/getEventListingsAsXML.php?date=' + document.getElementById("eventDate").value;
        functionToCall = process10;
    }
    arrAllPins[sectionID].reqIS = new Object();
    //loadListingsXMLDoc(url, functionToCall, sectionID);

    //alert('loading: '+section);
    //functionToCall = function() {alert('loaded')};
    jQuery.ajax({type: "POST",url: url,data: "",dataType:"xml",success: functionToCall});

}

function process0(msg){processListingsXMLData(0, msg);}
function process1(msg){processListingsXMLData(1, msg);}
function process2(msg){processListingsXMLData(2, msg);}
function process3(msg){processListingsXMLData(3, msg);}
function process4(msg){processListingsXMLData(4, msg);}
function process5(msg){processListingsXMLData(5, msg);}
function process6(msg){processListingsXMLData(6, msg);}
function process7(msg){processListingsXMLData(7, msg);}
function process8(msg){processListingsXMLData(8, msg);}
function process9(msg){processListingsXMLData(9, msg);}
function process10(msg){processListingsXMLData(eventsGroupID, msg);}
function process11(msg){processListingsXMLData(travePlanGroupID, msg);}

function processListingsXMLData(theSection, msg) {
    var intID;
    var strName;
    var intSelected;
    var strHTML1;
    var strHTML2;

    var objXML;
    var strResults = "";

    objXML = msg.documentElement;
    try {
        var elementsLength = objXML.getElementsByTagName('item').length;
        var add1, add2, city, state, zip, phone, tollfreephone, evtDate, evtTime;
        strResults = "";

        for (var i = 0; i < elementsLength; i++) {
            //alert('setting item params: '+i);

            strId = objXML.getElementsByTagName('id')[i].firstChild.data;
            strLat = objXML.getElementsByTagName('lat')[i].firstChild.data;
            strLng = objXML.getElementsByTagName('lng')[i].firstChild.data;
            strTitle = objXML.getElementsByTagName('title')[i].firstChild.data;
            strSubType = objXML.getElementsByTagName('subType')[i].firstChild.data;

            add1 = getXMLTagData(objXML, 'add1', i);
            add2 = getXMLTagData(objXML, 'add2', i);
            city = getXMLTagData(objXML, 'city', i);
            state = getXMLTagData(objXML, 'state', i);
            zip = getXMLTagData(objXML, 'zip', i);
            phone = getXMLTagData(objXML, 'phone', i);
            tollfreephone = getXMLTagData(objXML, 'tollphone', i);
            //evtDate = getXMLTagData(objXML, 'evtDate', i); //this will probably be empty as events are just stored as regular addresses in TP
            //evtTime = getXMLTagData(objXML, 'evtTime', i); //this will probably be empty as events are just stored as regular addresses in TP

            //alert('adding point to marker list: '+i);
            addPointToMarkerList(strLat, strLng, strTitle, arrAllPins, strSubType, theSection, strId, add1, add2, city, state, zip, phone, tollfreephone, evtDate, evtTime);

            strResults += strTitle + "<br>";
        }

        //alert('adding marker group to map: '+theSection);
        addMarkerGroupToMap(arrAllPins, theSection);

        //document.getElementById("xml_test_out").innerHTML = strResults;

    } catch (e) {
        alert(e);
    }

        (function ($) {$('#loadStatus').css('display', 'none');})(jQuery);
        //alert('finished');
}

function getXMLTagData(objXML, name, arrValue){
    var strData = "";
    if (objXML.getElementsByTagName(name)[arrValue] != undefined && objXML.getElementsByTagName(name)[arrValue].firstChild != null){
        strData = objXML.getElementsByTagName(name)[arrValue].firstChild.data;
    }
    return strData;
}















// VARIABLE DECLARATIONS

var digits = "0123456789";

var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"

var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

var specialchars = "_"

// whitespace characters
var whitespace = " \t\n\r";


// decimal point character differs by language and culture
var decimalPointDelimiter = "."


// non-digit characters which are allowed in phone numbers
var phoneNumberDelimiters = "()- .+";


// characters which are allowed in US phone numbers
var validUSPhoneChars = digits + phoneNumberDelimiters;


// characters which are allowed in international phone numbers
// (a leading + is OK)
var validWorldPhoneChars = digits + phoneNumberDelimiters + "+() .-";


// non-digit characters which are allowed in
// Social Security Numbers
var SSNDelimiters = "- ";



// characters which are allowed in Social Security Numbers
var validSSNChars = digits + SSNDelimiters;



// U.S. Social Security Numbers have 9 digits.
// They are formatted as 123-45-6789.
var digitsInSocialSecurityNumber = 9;



// U.S. phone numbers have 10 digits.
// They are formatted as 123 456 7890 or (123) 456-7890.
var digitsInUSPhoneNumber = 10;



// non-digit characters which are allowed in ZIP Codes
var ZIPCodeDelimiters = lowercaseLetters + uppercaseLetters + " -";



// our preferred delimiter for reformatting ZIP Codes
var ZIPCodeDelimeter = "-"


// characters which are allowed in Social Security Numbers
var validZIPCodeChars = digits + ZIPCodeDelimiters



// U.S. ZIP codes have 5 or 9 digits.
// They are formatted as 12345 or 12345-6789.
var digitsInZIPCode1 = 5
var digitsInZIPCode2 = 9


// non-digit characters which are allowed in credit card numbers
var creditCardDelimiters = " "



// m is an abbreviation for "missing"

var mPrefix = "You did not enter a value into the "
var mSuffix = " field. This is a required field. Please enter it now."

// s is an abbreviation for "string"

var sUSLastName = "Last Name"
var sUSFirstName = "First Name"
var sWorldLastName = "Family Name"
var sWorldFirstName = "Given Name"
var sTitle = "Title"
var sCompanyName = "Company Name"
var sUSAddress = "Street Address"
var sWorldAddress = "Address"
var sCity = "City"
var sStateCode = "State Code"
var sWorldState = "State, Province, or Prefecture"
var sCountry = "Country"
var sZIPCode = "ZIP Code"
var sWorldPostalCode = "Postal Code"
var sPhone = "Phone Number"
var sFax = "Fax Number"
var sDateOfBirth = "Date of Birth"
var sExpirationDate = "Expiration Date"
var sEmail = "Email"
var sSSN = "Social Security Number"
var sCreditCardNumber = "Credit Card Number"
var sOtherInfo = "Other Information"




// i is an abbreviation for "invalid"

var iStateCode = "This field must be a valid two character U.S. state abbreviation (like CA for California). Please re-enter it now."
var iZIPCode = "This field must be a 5 or 9 digit U.S. ZIP Code (like 94043). Please re-enter it now."
var iUSPhone = "This field must be a valid phone number. Please re-enter it now."
var iWorldPhone = "This field must be a valid international phone number. Please re-enter it now."
var iSSN = "This field must be a 9 digit U.S. social security number (like 123 45 6789). Please re-enter it now."
var iEmail = "This field must be a valid email address (like yourname@domain.com). Please re-enter it now."
var iCreditCardPrefix = "This is not a valid "
var iCreditCardSuffix = " credit card number. (Click the link on this form to see a list of sample numbers.) Please re-enter it now."
var iDay = "This field must be a day number between 1 and 31.  Please re-enter it now."
var iMonth = "This field must be a month number between 1 and 12.  Please re-enter it now."
var iYear = "This field must be a 2 or 4 digit year number.  Please re-enter it now."
var iDatePrefix = "The Day, Month, and Year for "
var iDateSuffix = " do not form a valid date.  Please re-enter them now."



// p is an abbreviation for "prompt"

var pEntryPrompt = "Please enter a "
var pStateCode = "2 character code (like CA)."
var pZIPCode = "5 or 9 digit U.S. ZIP Code (like 94043)."
var pUSPhone = "10 digit U.S. phone number (like 415 555 1212)."
var pWorldPhone = "international phone number."
var pSSN = "9 digit U.S. social security number (like 123 45 6789)."
var pEmail = "valid email address (like foo@bar.com)."
var pCreditCard = "valid credit card number."
var pDay = "day number between 1 and 31."
var pMonth = "month number between 1 and 12."
var pYear = "2 or 4 digit year number."



var defaultEmptyOK = false





function makeArray(n) {
//*** BUG: If I put this line in, I get two error messages:
//(1) Window.length can't be set by assignment
//(2) daysInMonth has no property indexed by 4
//If I leave it out, the code works fine.
//   this.length = n;
   for (var i = 1; i <= n; i++) {
      this[i] = 0
   }
   return this
}



var daysInMonth = makeArray(12);
daysInMonth[1] = 31;
daysInMonth[2] = 29;   // must programmatically check this
daysInMonth[3] = 31;
daysInMonth[4] = 30;
daysInMonth[5] = 31;
daysInMonth[6] = 30;
daysInMonth[7] = 31;
daysInMonth[8] = 31;
daysInMonth[9] = 30;
daysInMonth[10] = 31;
daysInMonth[11] = 30;
daysInMonth[12] = 31;





var USStateCodeDelimiter = "|";
var USStateCodes = "AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY|AE|AA|AE|AE|AP"




// Check whether string s is empty.

function isEmpty(s)
{   return ((s == null) || (s.length == 0))
}




function isWhitespace (s)

{   var i;

    // Is s empty?
    if (isEmpty(s)) return true;

    // Search through string's characters one by one
    // until we find a non-whitespace character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {
        // Check that current character isn't whitespace.
        var c = s.charAt(i);

        if (whitespace.indexOf(c) == -1) return false;
    }

    // All characters are whitespace.
    return true;
}



function stripCharsInBag (s, bag)

{   var i;
    var returnString = "";

    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.

    for (i = 0; i < s.length; i++)
    {
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }

    return returnString;
}




function stripCharsNotInBag (s, bag)

{   var i;
    var returnString = "";

    // Search through string's characters one by one.
    // If character is in bag, append to returnString.

    for (i = 0; i < s.length; i++)
    {
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) != -1) returnString += c;
    }

    return returnString;
}




function stripWhitespace (s)

{   return stripCharsInBag (s, whitespace)
}





function charInString (c, s)
{   for (i = 0; i < s.length; i++)
    {   if (s.charAt(i) == c) return true;
    }
    return false
}




function stripInitialWhitespace (s)

{   var i = 0;

    while ((i < s.length) && charInString (s.charAt(i), whitespace))
       i++;

    return s.substring (i, s.length);
}



function isSpecialChar(c)
{
    return ( c == "_" )
}


function isLetter (c)
{   return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) )
}



// Returns true if character c is a digit
// (0 .. 9).

function isDigit (c)
{   return ((c >= "0") && (c <= "9"))
}



// Returns true if character c is a letter or digit.

function isLetterOrDigit (c)
{   return (isLetter(c) || isDigit(c))
}




function isInteger (s)

{   var i;

    if (isEmpty(s))
       if (isInteger.arguments.length == 1) return defaultEmptyOK;
       else return (isInteger.arguments[1] == true);

    // Search through string's characters one by one
    // until we find a non-numeric character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {
        // Check that current character is number.
        var c = s.charAt(i);

        if (!isDigit(c)) return false;
    }

    // All characters are numbers.
    return true;
}








function isSignedInteger (s)

{   if (isEmpty(s))
       if (isSignedInteger.arguments.length == 1) return defaultEmptyOK;
       else return (isSignedInteger.arguments[1] == true);

    else {
        var startPos = 0;
        var secondArg = defaultEmptyOK;

        if (isSignedInteger.arguments.length > 1)
            secondArg = isSignedInteger.arguments[1];

        // skip leading + or -
        if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
           startPos = 1;
        return (isInteger(s.substring(startPos, s.length), secondArg))
    }
}



function isPositiveInteger (s)
{   var secondArg = defaultEmptyOK;

    if (isPositiveInteger.arguments.length > 1)
        secondArg = isPositiveInteger.arguments[1];

    // The next line is a bit byzantine.  What it means is:
    // a) s must be a signed integer, AND
    // b) one of the following must be true:
    //    i)  s is empty and we are supposed to return true for
    //        empty strings
    //    ii) this is a positive, not negative, number

    return (isSignedInteger(s, secondArg)
         && ( (isEmpty(s) && secondArg)  || (parseInt (s) > 0) ) );
}





function isNonnegativeInteger (s)
{   var secondArg = defaultEmptyOK;

    if (isNonnegativeInteger.arguments.length > 1)
        secondArg = isNonnegativeInteger.arguments[1];

    // The next line is a bit byzantine.  What it means is:
    // a) s must be a signed integer, AND
    // b) one of the following must be true:
    //    i)  s is empty and we are supposed to return true for
    //        empty strings
    //    ii) this is a number >= 0

    return (isSignedInteger(s, secondArg)
         && ( (isEmpty(s) && secondArg)  || (parseInt (s) >= 0) ) );
}





function isNegativeInteger (s)
{   var secondArg = defaultEmptyOK;

    if (isNegativeInteger.arguments.length > 1)
        secondArg = isNegativeInteger.arguments[1];

    // The next line is a bit byzantine.  What it means is:
    // a) s must be a signed integer, AND
    // b) one of the following must be true:
    //    i)  s is empty and we are supposed to return true for
    //        empty strings
    //    ii) this is a negative, not positive, number

    return (isSignedInteger(s, secondArg)
         && ( (isEmpty(s) && secondArg)  || (parseInt (s) < 0) ) );
}





function isNonpositiveInteger (s)
{   var secondArg = defaultEmptyOK;

    if (isNonpositiveInteger.arguments.length > 1)
        secondArg = isNonpositiveInteger.arguments[1];

    // The next line is a bit byzantine.  What it means is:
    // a) s must be a signed integer, AND
    // b) one of the following must be true:
    //    i)  s is empty and we are supposed to return true for
    //        empty strings
    //    ii) this is a number <= 0

    return (isSignedInteger(s, secondArg)
         && ( (isEmpty(s) && secondArg)  || (parseInt (s) <= 0) ) );
}






function isFloat (s)

{   var i;
    var seenDecimalPoint = false;

    if (isEmpty(s))
       if (isFloat.arguments.length == 1) return defaultEmptyOK;
       else return (isFloat.arguments[1] == true);

    if (s == decimalPointDelimiter) return false;

    // Search through string's characters one by one
    // until we find a non-numeric character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {
        // Check that current character is number.
        var c = s.charAt(i);

        if ((c == decimalPointDelimiter) && !seenDecimalPoint) seenDecimalPoint = true;
        else if (!isDigit(c)) return false;
    }

    // All characters are numbers.
    return true;
}








function isSignedFloat (s)

{   if (isEmpty(s))
       if (isSignedFloat.arguments.length == 1) return defaultEmptyOK;
       else return (isSignedFloat.arguments[1] == true);

    else {
        var startPos = 0;
        var secondArg = defaultEmptyOK;

        if (isSignedFloat.arguments.length > 1)
            secondArg = isSignedFloat.arguments[1];

        // skip leading + or -
        if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
           startPos = 1;
        return (isFloat(s.substring(startPos, s.length), secondArg))
    }
}




function isAlphabetic (s)

{   var i;

    if (isEmpty(s))
       if (isAlphabetic.arguments.length == 1) return defaultEmptyOK;
       else return (isAlphabetic.arguments[1] == true);

    // Search through string's characters one by one
    // until we find a non-alphabetic character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {
        // Check that current character is letter.
        var c = s.charAt(i);

        if (!isLetter(c))
        return false;
    }

    // All characters are letters.
    return true;
}





function isAlphanumeric (s)

{   var i;

    if (isEmpty(s))
       if (isAlphanumeric.arguments.length == 1) return defaultEmptyOK;
       else return (isAlphanumeric.arguments[1] == true);

    // Search through string's characters one by one
    // until we find a non-alphanumeric character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {
        // Check that current character is number or letter.
        var c = s.charAt(i);

        if ((! (isLetter(c) || isDigit(c) || isSpecialChar(c) ))  )
        return false;
    }

    // All characters are numbers or letters.
    return true;
}





function reformat (s)

{   var arg;
    var sPos = 0;
    var resultString = "";

    for (var i = 1; i < reformat.arguments.length; i++) {
       arg = reformat.arguments[i];
       if (i % 2 == 1) resultString += arg;
       else {
           resultString += s.substring(sPos, sPos + arg);
           sPos += arg;
       }
    }
    return resultString;
}



function isSSN (s)
{   if (isEmpty(s))
       if (isSSN.arguments.length == 1) return defaultEmptyOK;
       else return (isSSN.arguments[1] == true);
    return (isInteger(s) && s.length == digitsInSocialSecurityNumber)
}


function isUSPhoneNumber (s)
{   if (isEmpty(s))
       if (isUSPhoneNumber.arguments.length == 1) return defaultEmptyOK;
       else return (isUSPhoneNumber.arguments[1] == true);
    //return (isInteger(s) && s.length == digitsInUSPhoneNumber)
    return (isInteger(s))
}




function isInternationalPhoneNumber (s)
{   if (isEmpty(s))
       if (isInternationalPhoneNumber.arguments.length == 1) return defaultEmptyOK;
       else return (isInternationalPhoneNumber.arguments[1] == true);
    return (isPositiveInteger(s))
}



function isZIPCode (s)
{  if (isEmpty(s))
       if (isZIPCode.arguments.length == 1) return defaultEmptyOK;
       else return (isZIPCode.arguments[1] == true);
   return (isInteger(s) &&
            ((s.length == digitsInZIPCode1) ||
             (s.length == digitsInZIPCode2)))
}



function isStateCode(s)
{   if (isEmpty(s))
       if (isStateCode.arguments.length == 1) return defaultEmptyOK;
       else return (isStateCode.arguments[1] == true);
    return ( (USStateCodes.indexOf(s) != -1) &&
             (s.indexOf(USStateCodeDelimiter) == -1) )
}




function isEmail (s)
{   if (isEmpty(s))
       if (isEmail.arguments.length == 1) return defaultEmptyOK;
       else return (isEmail.arguments[1] == true);

    // is s whitespace?
    if (isWhitespace(s)) return false;

    // there must be >= 1 character before @, so we
    // start looking at character position 1
    // (i.e. second character)
    var i = 1;
    var sLength = s.length;

    // look for @
    while ((i < sLength) && (s.charAt(i) != "@"))
    { i++
    }

    if ((i >= sLength) || (s.charAt(i) != "@")) return false;
    else i += 2;

    // look for .
    while ((i < sLength) && (s.charAt(i) != "."))
    { i++
    }

    // there must be at least one character after the .
    if ((i >= sLength - 1) || (s.charAt(i) != ".")) return false;
    else return true;
}




function isYear (s)
{   if (isEmpty(s))
       if (isYear.arguments.length == 1) return defaultEmptyOK;
       else return (isYear.arguments[1] == true);
    if (!isNonnegativeInteger(s)) return false;
    return ((s.length == 2) || (s.length == 4));
}




function isIntegerInRange (s, a, b)
{   if (isEmpty(s))
       if (isIntegerInRange.arguments.length == 1) return defaultEmptyOK;
       else return (isIntegerInRange.arguments[1] == true);

    // Catch non-integer strings to avoid creating a NaN below,
    // which isn't available on JavaScript 1.0 for Windows.
    if (!isInteger(s, false)) return false;

    // Now, explicitly change the type to integer via parseInt
    // so that the comparison code below will work both on
    // JavaScript 1.2 (which typechecks in equality comparisons)
    // and JavaScript 1.1 and before (which doesn't).
    var num = parseInt (s);
    return ((num >= a) && (num <= b));
}



function isMonth (s)
{   if (isEmpty(s))
       if (isMonth.arguments.length == 1) return defaultEmptyOK;
       else return (isMonth.arguments[1] == true);
    return isIntegerInRange (s, 1, 12);
}



function isDay (s)
{   if (isEmpty(s))
       if (isDay.arguments.length == 1) return defaultEmptyOK;
       else return (isDay.arguments[1] == true);
    return isIntegerInRange (s, 1, 31);
}



function daysInFebruary (year)
{   // February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );
}




function isDate (year, month, day)
{   // catch invalid years (not 2- or 4-digit) and invalid months and days.

    if (! (isYear(year, false) && isMonth(month, false) && isDay(day, false))) return false;

    // Explicitly change type to integer to make code work in both
    // JavaScript 1.1 and JavaScript 1.2.
    var intYear = parseInt(year);
    var intMonth = parseInt(month);
    var intDay = parseInt(day);

    // catch invalid days, except for February
    if (intDay > daysInMonth[intMonth]) return false;

    if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;

    return true;
}





function prompt (s)
{   window.status = s
}



function promptEntry (s)
{   window.status = pEntryPrompt + s
}





function warnEmpty (theField, s)
{   theField.focus()
    alert(mPrefix + s + mSuffix)
    return false
}



function warnInvalid (theField, s)
{   theField.focus()
    theField.select()
    alert(s)
    return false
}




function checkString (theField, s, emptyOK)
{   // Next line is needed on NN3 to avoid "undefined is not a number" error
    // in equality comparison below.
    if (checkString.arguments.length == 2) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (isWhitespace(theField.value))
       return warnEmpty (theField, s);
    else return true;
}




function checkStateCode (theField, emptyOK)
{   if (checkStateCode.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    {  theField.value = theField.value.toUpperCase();
       if (!isStateCode(theField.value, false))
          return warnInvalid (theField, iStateCode);
       else return true;
    }
}



function reformatZIPCode (ZIPString)
{   if (ZIPString.length == 5) return ZIPString;
    else return (reformat (ZIPString, "", 5, "-", 4));
}





function checkZIPCode (theField, emptyOK)
{   if (checkZIPCode.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    { var normalizedZIP = stripCharsInBag(theField.value, ZIPCodeDelimiters)
      if (!isZIPCode(normalizedZIP, false))
         return warnInvalid (theField, iZIPCode);
      else
      {  // if you don't want to insert a hyphen, comment next line out
         theField.value = reformatZIPCode(normalizedZIP)
         return true;
      }
    }
}




function reformatUSPhone (USPhone)
{   return (reformat (USPhone, "(", 3, ") ", 3, "-", 4))
}




function checkUSPhone (theField, emptyOK)
{   if (checkUSPhone.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    {  var normalizedPhone = stripCharsInBag(theField.value, phoneNumberDelimiters)
       if (!isUSPhoneNumber(normalizedPhone, false))
          return warnInvalid (theField, iUSPhone);
       else
       {  // if you don't want to reformat as (123) 456-789, comment next line out
          //theField.value = reformatUSPhone(normalizedPhone)
          return true;
       }
    }
}



function checkInternationalPhone (theField, emptyOK)
{   if (checkInternationalPhone.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    {  if (!isInternationalPhoneNumber(theField.value, false))
          return warnInvalid (theField, iWorldPhone);
       else return true;
    }
}




function checkEmail (theField, emptyOK)
{   if (checkEmail.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else if (!isEmail(theField.value, false))
       return warnInvalid (theField, iEmail);
    else return true;
}



function reformatSSN (SSN)
{   return (reformat (SSN, "", 3, "-", 2, "-", 4))
}



function checkSSN (theField, emptyOK)
{   if (checkSSN.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    {  var normalizedSSN = stripCharsInBag(theField.value, SSNDelimiters)
       if (!isSSN(normalizedSSN, false))
          return warnInvalid (theField, iSSN);
       else
       {  // if you don't want to reformats as 123-456-7890, comment next line out
          theField.value = reformatSSN(normalizedSSN)
          return true;
       }
    }
}





function checkYear (theField, emptyOK)
{   if (checkYear.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (!isYear(theField.value, false))
       return warnInvalid (theField, iYear);
    else return true;
}



function checkMonth (theField, emptyOK)
{   if (checkMonth.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (!isMonth(theField.value, false))
       return warnInvalid (theField, iMonth);
    else return true;
}



function checkDay (theField, emptyOK)
{   if (checkDay.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (!isDay(theField.value, false))
       return warnInvalid (theField, iDay);
    else return true;
}





function checkDate (yearField, monthField, dayField, labelString, OKtoOmitDay)
{   // Next line is needed on NN3 to avoid "undefined is not a number" error
    // in equality comparison below.
    if (checkDate.arguments.length == 4) OKtoOmitDay = false;
    if (!isYear(yearField.value)) return warnInvalid (yearField, iYear);
    if (!isMonth(monthField.value)) return warnInvalid (monthField, iMonth);
    if ( (OKtoOmitDay == true) && isEmpty(dayField.value) ) return true;
    else if (!isDay(dayField.value))
       return warnInvalid (dayField, iDay);
    if (isDate (yearField.value, monthField.value, dayField.value))
       return true;
    alert (iDatePrefix + labelString + iDateSuffix)
    return false
}



// Get checked value from radio button.

function getRadioButtonValue (radio)
{   for (var i = 0; i < radio.length; i++)
    {   if (radio[i].checked) { break }
    }
    return radio[i].value
}




// Validate credit card info.

function checkCreditCard (radio, theField)
{   var cardType = getRadioButtonValue (radio)
    var normalizedCCN = stripCharsInBag(theField.value, creditCardDelimiters)
    if (!isCardMatch(cardType, normalizedCCN))
       return warnInvalid (theField, iCreditCardPrefix + cardType + iCreditCardSuffix);
    else
    {  theField.value = normalizedCCN
       return true
    }
}





function isCreditCard(st) {
  // Encoding only works on cards with less than 19 digits
  if (st.length > 19)
    return (false);

  sum = 0; mul = 1; l = st.length;
  for (i = 0; i < l; i++) {
    digit = st.substring(l-i-1,l-i);
    tproduct = parseInt(digit ,10)*mul;
    if (tproduct >= 10)
      sum += (tproduct % 10) + 1;
    else
      sum += tproduct;
    if (mul == 1)
      mul++;
    else
      mul--;
  }


  if ((sum % 10) == 0)
    return (true);
  else
    return (false);

} // END FUNCTION isCreditCard()




function isVisa(cc)
{
  if (((cc.length == 16) || (cc.length == 13)) &&
      (cc.substring(0,1) == 4))
    return isCreditCard(cc);
  return false;
}  // END FUNCTION isVisa()






function isMasterCard(cc)
{
  firstdig = cc.substring(0,1);
  seconddig = cc.substring(1,2);
  if ((cc.length == 16) && (firstdig == 5) &&
      ((seconddig >= 1) && (seconddig <= 5)))
    return isCreditCard(cc);
  return false;

} // END FUNCTION isMasterCard()




function isAmericanExpress(cc)
{
  firstdig = cc.substring(0,1);
  seconddig = cc.substring(1,2);
  if ((cc.length == 15) && (firstdig == 3) &&
      ((seconddig == 4) || (seconddig == 7)))
    return isCreditCard(cc);
  return false;

} // END FUNCTION isAmericanExpress()



function isDinersClub(cc)
{
  firstdig = cc.substring(0,1);
  seconddig = cc.substring(1,2);
  if ((cc.length == 14) && (firstdig == 3) &&
      ((seconddig == 0) || (seconddig == 6) || (seconddig == 8)))
    return isCreditCard(cc);
  return false;
}


function isCarteBlanche(cc)
{
  return isDinersClub(cc);
}



function isDiscover(cc)
{
  first4digs = cc.substring(0,4);
  if ((cc.length == 16) && (first4digs == "6011"))
    return isCreditCard(cc);
  return false;

} // END FUNCTION isDiscover()


function isEnRoute(cc)
{
  first4digs = cc.substring(0,4);
  if ((cc.length == 15) &&
      ((first4digs == "2014") ||
       (first4digs == "2149")))
    return isCreditCard(cc);
  return false;
}




function isJCB(cc)
{
  first4digs = cc.substring(0,4);
  if ((cc.length == 16) &&
      ((first4digs == "3088") ||
       (first4digs == "3096") ||
       (first4digs == "3112") ||
       (first4digs == "3158") ||
       (first4digs == "3337") ||
       (first4digs == "3528")))
    return isCreditCard(cc);
  return false;

} // END FUNCTION isJCB()



function isAnyCard(cc)
{
  if (!isCreditCard(cc))
    return false;
  if (!isMasterCard(cc) && !isVisa(cc) && !isAmericanExpress(cc) && !isDinersClub(cc) &&
      !isDiscover(cc) && !isEnRoute(cc) && !isJCB(cc)) {
    return false;
  }
  return true;

} // END FUNCTION isAnyCard()


function isCardMatch (cardType, cardNumber)
{

    cardType = cardType.toUpperCase();
    var doesMatch = true;

    if ((cardType == "VISA") && (!isVisa(cardNumber)))
        doesMatch = false;
    if ((cardType == "MASTERCARD") && (!isMasterCard(cardNumber)))
        doesMatch = false;
    if ( ( (cardType == "AMERICANEXPRESS") || (cardType == "AMEX") )
                && (!isAmericanExpress(cardNumber))) doesMatch = false;
    if ((cardType == "DISCOVER") && (!isDiscover(cardNumber)))
        doesMatch = false;
    if ((cardType == "JCB") && (!isJCB(cardNumber)))
        doesMatch = false;
    if ((cardType == "DINERS") && (!isDinersClub(cardNumber)))
        doesMatch = false;
    if ((cardType == "CARTEBLANCHE") && (!isCarteBlanche(cardNumber)))
        doesMatch = false;
    if ((cardType == "ENROUTE") && (!isEnRoute(cardNumber)))
        doesMatch = false;
    return doesMatch;

}  // END FUNCTION CardMatch()




function IsCC (st) {
    return isCreditCard(st);
}

function IsVisa (cc)  {
  return isVisa(cc);
}

function IsVISA (cc)  {
  return isVisa(cc);
}

function IsMasterCard (cc)  {
  return isMasterCard(cc);
}

function IsMastercard (cc)  {
  return isMasterCard(cc);
}

function IsMC (cc)  {
  return isMasterCard(cc);
}

function IsAmericanExpress (cc)  {
  return isAmericanExpress(cc);
}

function IsAmEx (cc)  {
  return isAmericanExpress(cc);
}

function IsDinersClub (cc)  {
  return isDinersClub(cc);
}

function IsDC (cc)  {
  return isDinersClub(cc);
}

function IsDiners (cc)  {
  return isDinersClub(cc);
}

function IsCarteBlanche (cc)  {
  return isCarteBlanche(cc);
}

function IsCB (cc)  {
  return isCarteBlanche(cc);
}

function IsDiscover (cc)  {
  return isDiscover(cc);
}

function IsEnRoute (cc)  {
  return isEnRoute(cc);
}

function IsenRoute (cc)  {
  return isEnRoute(cc);
}

function IsJCB (cc)  {
  return isJCB(cc);
}

function IsAnyCard(cc)  {
  return isAnyCard(cc);
}

function IsCardMatch (cardType, cardNumber)  {
  return isCardMatch (cardType, cardNumber);
}

function confirmDelete(myForm, myFormField, strMessage) {
    var bResultReturned

    bResultReturned = confirm('LAST WARNING!\n\nClick OK to delete this ' + strMessage + ' entry.\nClick Cancel to return to the admin ' + strMessage + ' page.')
    if (bResultReturned) {
        myFormField.value = "Delete";
        myForm.submit();
    }
}































var theMarker;
var boolGetMemInfoShowTPAdd;

function getMemberInfoUsingXML(marker, memberID, boolShowTPLink) {
    var url = '/applications/igm/getMemberInfoAsXML.php?mem=' + memberID;
    theMarker = marker;
    boolGetMemInfoShowTPAdd = boolShowTPLink;
    (function($) {$.ajax({type: "POST",url: url,data: "",success: processMemberXMLData});})(jQuery);
}

function processMemberXMLData(msg) {
    var intID;
    var strName;
    var intSelected;
    var strHTML1;
    var strHTML2;

    var objXML;


    objXML = msg.documentElement;
    try {
        var elementsLength = objXML.getElementsByTagName('item').length;

        for (var i = 0; i < elementsLength; i++) {
            strURL = objXML.getElementsByTagName('url')[i].firstChild.data;
            strTitle = objXML.getElementsByTagName('title')[i].firstChild.data;
            strCopy = objXML.getElementsByTagName('copy')[i].firstChild.data;
            strImage = objXML.getElementsByTagName('image')[i].firstChild.data;
            strTeaser_copy = objXML.getElementsByTagName('teaser_copy')[i].firstChild.data;
            strTeaser_image = objXML.getElementsByTagName('teaser_image')[i].firstChild.data;
            strId = objXML.getElementsByTagName('id')[i].firstChild.data;
            strLat = objXML.getElementsByTagName('lat')[i].firstChild.data;
            strLng = objXML.getElementsByTagName('lng')[i].firstChild.data;
            strAdd = objXML.getElementsByTagName('add')[i].firstChild.data;
            strAdd2 = objXML.getElementsByTagName('add2')[i].firstChild.data;
            strCity = objXML.getElementsByTagName('city')[i].firstChild.data;
            strState = objXML.getElementsByTagName('state')[i].firstChild.data;
            strZip = objXML.getElementsByTagName('zip')[i].firstChild.data;
            strPhone = objXML.getElementsByTagName('phone')[i].firstChild.data;
            strTollFreePhone = objXML.getElementsByTagName('tollfreephone')[i].firstChild.data;

            strAddressOnly = strAdd;
            if (strAdd2.length > 0){
                strAddressOnly += "<br />" + strAdd2;
            }
            strAddressOnly += "<br />" + strCity + " " + strState + ", " + strZip;
            strAddress = strAddressOnly + "<br />" + strPhone;
            if (strTollFreePhone.length > 0)
                strAddress += "<br />" + strTollFreePhone

            strHTML1 =  "<div class='infoWinTitle'>" + strTitle + "</div>" +
                        "<div id='infoWinInfo'>" +
                            "<div class='infoWin'>" +
                                "<div class='infoWinLeft'>" +
                                    "<div class='infoWinTImg'>" + strTeaser_image + "</div>" +
                                "</div>" +
                                "<div class='infoWinRight'>" +
                                    "<div class='infoWinAddress'>" + strAddress + "</div>" +
                                    "<div class='infoWinTCopy'>" + strTeaser_copy + "</div>" +
                                "</div>" +
                            "</div>" +
                            "<div class='infoWinActions'>" +
                                //"<a onclick='showDirectionsInfoWin();'  class='infoWinLink' style='padding-right:10px;'>Get Directions</a>"
                                                                "<a onclick='showDirectionsInfoWin();'  class='infoWinLink' style='padding-right:190px;'>Get Directions</a>"
            if (boolGetMemInfoShowTPAdd == true){
                //strHTML1 += "<a onClick='displayTPAddSequence(140, 124); addTPMemberUsingXML(" + strId + "); return false;'  class='infoWinLink' style='padding-right:34px;'>Add to Travel Plan</a> "
            } else{
                strHTML1 += "<div style='width:1px; padding-right:100px;  display:inline;'>&nbsp;</div>"
            }
            strHTML1 += " Send to: <a onclick='showEmailInfoWin();' class='infoWinLink' style='padding-left:5px;'><img src='/applications/igm/images/email.gif' border='0' align='absmiddle' style='padding-right:4px;' /></a> <a onclick='showEmailInfoWin();' class='infoWinLink'>Email</a> " +
                                //"&nbsp;&nbsp; <a onclick='showPhoneInfoWin();' class='infoWinLink'><img src='/applications/igm/images/phone.gif' border='0' align='absmiddle' style='padding-right:4px;' /></a> <a onclick='showPhoneInfoWin();' class='infoWinLink'>Phone</a> " +
                            "</div>" +
                        "</div>" +
                        "<div id='infoWinEmail' style='display:none;'>" +
                            "We'll send this information to your email.<br />Just fill out the following field. " +
                            "<form>" +
                            "<div style='padding:10px 0px 20px 0px'>Email: <input type='text' id='fldWinEmail' value='' onkeypress='return noenter(event);'></div> " +
                            "<div style='text-align:center;'><a onClick='sendInfoWinEmailCheck(\"" + strId +"\", 0, getId(\"fldWinEmail\")); ' style='cursor:pointer;'><img src='/applications/igm/images/btn_send.gif' title='Send' border='0' /></a>" +
                            "<a onClick='hideEmailInfoWin();' style='padding-left:30px;cursor:pointer;'><img src='/applications/igm/images/btn_cancel.gif' title='Cancel' border='0' /></a></div>" +
                            "</form>" +
                        "</div>" +
                        "<div id='infoWinPhone' style='display:none;'>" +
                            "We'll send the address and phone number to your cell phone.<br />Just fill out the following fields. " +
                            "<form>" +
                            "<div style='padding:10px 0px 5px 0px'>10 Digit Phone #: <input type='text' id='fldInfoWinPhoneNum' value='##########' onClick='if(this.value==\"##########\"){this.value=\"\";}' size='10' maxlength='10' onkeypress='return noenter(event);'></div> " +
                            "<div style='padding:5px 0px 20px 0px'>Carrier: <select id='fldInfoWinCarrier' onkeypress='return noenter(event);' ></select></div>" +
                            "<div style='text-align:center;'><a onClick='sendInfoWinPhoneCheck(" + strId +", 0);'><img src='/applications/igm/images/btn_send.gif' title='Send' border='0' style='cursor:pointer;' /></a>" +
                            "<a onClick='hidePhoneInfoWin();' style='padding-left:30px;cursor:pointer;'><img src='/applications/igm/images/btn_cancel.gif' title='Cancel' border='0' /></a></div>" +
                            "<div style='font-size:10px; text-align:right;padding-top:30px;color:#aaaaaa;'>Standard messaging fees will apply.</div>" +
                            "</form>" +
                        "</div>" +
                        "<div id='infoWinDirections' style='display:none;'>" +
                            "<form name='frmInfoWinDir' action='/applications/igm/directions.php' type='post'  target='_blank'>" +
                            "<div style='padding:10px 0px 0px 0px'>" + strAddressOnly + "</div> " +
                            "<input type='hidden' name='type' value='user' /> " +
                            "<input type='hidden' name='strTitle' value='" + strTitle + "' /> " +
                            "<input type='hidden' name='strAdd' value='" + strAdd + "' /> " +
                            "<input type='hidden' name='strAdd2' value='" + strAdd2 + "' /> " +
                            "<input type='hidden' name='cityStateZip' value='" + strCity + " " + strState + ", " + strZip + "' /> " +
                            "<input type='hidden' name='strPhone' value='" + strPhone + "' /> " +
                            "<input type='hidden' name='strTollFreePhone' value='" + strTollFreePhone + "' /> " +
                            "<input type='hidden' name='fromLat' value='" + strLat + "' /> " +
                            "<input type='hidden' name='fromLng' value='" + strLng + "' /> " +
                            "<div style='padding:15px 0px 5px 88px'><label><input type='radio' name='radDirection' value='from' checked='checked'> From Address</label>&nbsp;&nbsp;&nbsp;&nbsp;" +
                            "<label><input type='radio' name='radDirection' value='to'> To Address</label></div>" +
                            "<div style='padding:5px 0px 15px 0px'>Start Address: <input type='text' name='fldUserAddress' id='fldUserAddress' value='Street, City, State Zip' onClick='if(this.value==\"Street, City, State Zip\"){this.value=\"\";}' size='40'></div> " +
                            "<div style='text-align:center;'><a onClick='setCookie(\"tp_dirAdd\",getId(\"fldUserAddress\").value, null);document.frmInfoWinDir.submit();' style='cursor:pointer;'><img src='/applications/igm/images/btn_get_directions.gif' title='Get Directions' border='0'  align='middle' /></a>" +
                            "<a onClick='hideDirectionsInfoWin();' style='padding-left:30px; cursor:pointer; text-decoration:underline;'><img src='/applications/igm/images/btn_cancel.gif' border='0' title='Cancel'  align='middle' /></a></div> " +
                            "</form>" +
                        "</div>"



            strHTML2 = "<div class='infoWinTitle'>" + strTitle + "</div><div class='infoWinFullCopy'>" + strCopy + "</div>"
            if (strURL.length > 0)
                strHTML2 += "<div class='infoWinURL'><a href='http://" + strURL.replace('http://', '') + "' target='_blank'>" + strURL.replace('http://', '') + "</a></div>"

            //Create our tabs
            var infoTabs = [
              new GInfoWindowTab("Location", strHTML1),
              new GInfoWindowTab("Details", strHTML2)
            ];

            // Our info window content
            theMarker.openInfoWindowTabsHtml(infoTabs);
        }

    } catch (e) {
        alert(e);
    }
}

















var boolShowedAlert = false; //For some reason alerts were showing more than once

function sendMapInfoUsingXML(intSendDirections, email, phoneNum, carrier, memberID, eventID) {
    boolShowedAlert = false;

    //Set email and phone cookies to autopopulate forms
    if (email.length > 0){
        setCookie('tp_em', email, null);
    }
    if (phoneNum.length > 0){
        setCookie('tp_ph', phoneNum, null);
    }
    if (carrier.length > 0){
        setCookie('tp_car', carrier, null);
    }

    (function($) {$.ajax({
        type: "POST",
        url: '/applications/igm/sendToRecipient.php',
        data: buildParameters(),
        error: function (XMLHttpRequest, textStatus, errorThrown) {
          // typically only one of textStatus or errorThrown
          // will have info
          alert(textStatus + " " + errorThrown);
        },
        success: function(msg){
            objXML = msg.documentElement;
            try {
                strStatus = parseInt(objXML.getElementsByTagName('status')[0].firstChild.data);
                strMessage = objXML.getElementsByTagName('message')[0].firstChild.data;
                if (strStatus != 'error' && boolShowedAlert == false){
                    alert(strMessage);
                    boolShowedAlert = true;
                } else if(boolShowedAlert == false){
                    alert(strMessage);
                    boolShowedAlert = true;
                }
            } catch (e) {
                alert(e);
            }
        }
     });})(jQuery);

    function buildParameters(){
        var parameters = null;
        parameters = 'fldEmail=' + email + '&fldNumber=' + phoneNum + '&fldCarrier=' + carrier + '&fldMemberID=' + memberID + '&fldEventID=' + eventID;
        //alert("sending:" + parameters);
        if (intSendDirections != 0){
            //Add directions as a prameter. Note: directions need to be in a field called fldDirections
            parameters = parameters + "&fldDirections=" + encodeURI(getId("fldDirections").value);
        }
        return(parameters);
    }
}