/**
 * Affordable housing website events
 */

var ahEvent = (function ()
{
    var pub = {};



    pub.constants =
    {
        layerNone: "none",
        layerPollution: "pollution",
        layerEconomicMobility: "economicMobility"
    };



    function cleanse (value)
    {
        if (value === undefined || value === null)
            value = null;
        else if (typeof value === 'string')
            value = value.trim();

        return value;
    }
    


    function firstInteger (str, delimiter)
    {
        if (str === undefined || str === null || delimiter === undefined || delimiter === null)
            return null;

        var elements = str.split (delimiter);
        var firstElement = elements.length === 0 ? null : elements[0].trim();
        var value = firstElement == null ? null : parseInt (firstElement, 10);
        
        if (isNaN (value))
          value = null;
        
        return value;
    }



    function formatPhone (phone)
    {
        if (phone !== null && phone !== undefined)
        {
            // Remove non-numeric characters from the phone number
            phone = phone.replace (/\D/g, "");
            phone = trimStr (phone, 10);
        }

        return phone;
    }



    function trimStr (str, len)
    {
        if (str !== undefined && str !== null && len !== undefined)
        {
            str = str.substring (0, len);
        }

        return str;
    }



    function postEvent (message)
    {
        $.ajax
        ({
            type: "post",
            async: true,
            url: "/v4/AjaxHandler?message=AddEvent",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: JSON.stringify (message)
        });
    }


    
    pub.landlordMarkedAsFavorite = function (landlordUserId, isFavorite, clickSource)
    {
        if (!landlordUserId)
            return;

        evt =
        {
            landlordUserId: cleanse (landlordUserId),
            isFavorite: cleanse (isFavorite),
            clickSource: cleanse (clickSource),
        };

        var message =
        {
            eventName: "ah.listing.landlordMarkedAsFavorite",
            eventJson: JSON.stringify (evt)
        };
        
        postEvent (message);
    }



    pub.landlordPhoneNumberClicked = function (landlordUserId, phoneNumber, clickSource)
    {
        if (!landlordUserId)
            return;

        evt =
        {
            landlordUserId: cleanse (landlordUserId),
            phoneNumber: formatPhone (cleanse (phoneNumber)),
            clickSource: cleanse (clickSource),
        };

        var message =
        {
            eventName: "ah.listing.landlordPhoneNumberClicked",
            eventJson: JSON.stringify (evt)
        };
        
        postEvent (message);
    }



    pub.listingMarkedAsFavorite = function (communityId, isFavorite, clickSource)
    {
        if (!communityId)
            return;

        evt =
        {
            communityId: cleanse (communityId),
            isFavorite: cleanse (isFavorite),
            clickSource: cleanse (clickSource),
        };

        var message =
        {
            eventName: "ah.listing.listingMarkedAsFavorite",
            eventJson: JSON.stringify (evt)
        };
        
        postEvent (message);
    }



    pub.on_ah_listing_ownerContactedByTenant = function
    (
        communityId,
        email,
        isPremiumOwner,
        listingStatus,
        phone,
        moveInDate,
        quickMatchRegistration,
        tenantFirstName,
        tenantLastName,
        messageBody
    )
    {
        if (!communityId)
            return;

        evt =
        {
            communityId: cleanse (communityId),
            email: trimStr (cleanse (email), 50),
            isPremiumOwner: cleanse (isPremiumOwner),
            listingStatus: cleanse (listingStatus),
            phone: formatPhone (cleanse (phone)),
            moveInDate: cleanse (moveInDate),
            quickMatchRegistration: cleanse (quickMatchRegistration),
            tenantFirstName: trimStr (cleanse (tenantFirstName), 50),
            tenantLastName: trimStr (cleanse (tenantLastName, 50)),
            messageBody: trimStr (cleanse (messageBody), 250),
        };

        var message =
        {
            eventName: "ah.listing.ownerContactedByTenant",
            eventJson: JSON.stringify (evt)
        };
        
        postEvent (message);
    }



    pub.on_ah_listing_trustedOwnerBadgeShownToTenant = function (communityId, landlordUserId, showSource)
    {
        if (!landlordUserId)
            return;

        evt =
        {
            communityId: cleanse (communityId),
            landlordUserId: cleanse (landlordUserId),
            showSource: cleanse (showSource),
        };

        var message =
        {
            eventName: "ah.listing.trustedOwnerBadgeShownToTenant",
            eventJson: JSON.stringify (evt)
        };
        
        postEvent (message);
    }



    pub.on_ah_searchResults_buttonNewMapLayerNotNowClicked = function ()
    {
        evt = {};

        var message =
        {
            eventName: "ah.searchResults.buttonNewMapLayerNotYetClicked",
            eventJson: JSON.stringify (evt)
        };
        
        postEvent (message);
    }
    


    pub.on_ah_searchResults_buttonNewMapLayerTryItClicked = function ()
    {
        evt = {};

        var message =
        {
            eventName: "ah.searchResults.buttonNewMapLayerTryItClicked",
            eventJson: JSON.stringify (evt)
        };
        
        postEvent (message);
    }
    


    pub.on_ah_searchResults_listingMarkerClicked = function (communityIds)
    {
        var communityId = firstInteger (communityIds, ",");

        if (!communityId)
            return;

        evt = {communityId: communityId};

        var message =
        {
            eventName: "ah.searchResults.listingMarkerClicked",
            eventJson: JSON.stringify (evt)
        };
        
        postEvent (message);
    }
    


    pub.on_ah_searchResults_listingMapTileClicked = function (communityId)
    {
        if (!communityId)
            return;

        evt = {communityId: communityId};

        var message =
        {
            eventName: "ah.searchResults.listingMapTileClicked",
            eventJson: JSON.stringify (evt)
        };
        
        postEvent (message);
    }
    


    pub.on_ah_searchResults_listingSummaryTileClicked = function (communityId)
    {
        if (!communityId)
            return;

        evt = {communityId: communityId};

        var message =
        {
            eventName: "ah.searchResults.listingSummaryTileClicked",
            eventJson: JSON.stringify (evt)
        };
        
        postEvent (message);
    }



    pub.on_ah_searchResults_mapLayerBadgeTooltipShownToUser = function (layer, rating)
    {
        evt = {layer: layer, rating: rating};

        var message =
        {
            eventName: "ah.searchResults.mapLayerBadgeTooltipShownToUser",
            eventJson: JSON.stringify (evt)
        };
        
        postEvent (message);
    }



    pub.on_ah_searchResults_mapLayerSelectedByUser = function (layer)
    {
        evt = {layer: layer};

        var message =
        {
            eventName: "ah.searchResults.mapLayerSelectedByUser",
            eventJson: JSON.stringify (evt)
        };
        
        postEvent (message);
    }



    pub.on_ah_searchResults_mapLayerShownToUser = function (layer)
    {
        evt = {layer: layer};

        var message =
        {
            eventName: "ah.searchResults.mapLayerShownToUser",
            eventJson: JSON.stringify (evt)
        };
        
        postEvent (message);
    }



    function getSchoolMarkerFilterSchoolType (schoolType)
    {
        var isSelected = ko.unwrap (tnResultModel.domain.schoolTypes().find (function (item)
        {
            return item.Value() === schoolType && item.Selected();
        })) !== undefined;

        return isSelected === true;
    }

    

    function getSchoolMarkerFilterSchoolGrades (schoolGrade)
    {
        var isSelected = ko.unwrap (tnResultModel.domain.schoolGrades().find (function (item)
        {
            return item.Value() === schoolGrade && item.Selected();
        })) !== undefined;

        return isSelected === true;
    }



    pub.on_ah_searchResults_schoolMarkersSelectedByUser = function (isVisible, filter)
    {
        var schoolRating = parseInt (filter.schoolRating, 10) || 0;

        evt =
        {
            isVisible: isVisible,
            showPrivate: filter.schoolTypes.includes ("Private"),
            showPublic: filter.schoolTypes.includes ("Public"),
            showCharter: filter.schoolTypes.includes ("Charter"),
            showElementary: filter.schoolGrades.includes ("Elementary"),
            showMiddle: filter.schoolGrades.includes ("Middle"),
            showHigh: filter.schoolGrades.includes ("High"),
            greatSchoolRating: schoolRating
        };

        var message =
        {
            eventName: "ah.searchResults.schoolMarkersSelectedByUser",
            eventJson: JSON.stringify (evt)
        };

        postEvent (message);
    }



    pub.on_ah_searchResults_schoolMarkersShownToUser = function (isVisible, filter)
    {
        var schoolRating = parseInt (filter.schoolRating, 10) || 0;

        evt =
        {
            isVisible: isVisible,
            showPrivate: filter.schoolTypes.includes ("Private"),
            showPublic: filter.schoolTypes.includes ("Public"),
            showCharter: filter.schoolTypes.includes ("Charter"),
            showElementary: filter.schoolGrades.includes ("Elementary"),
            showMiddle: filter.schoolGrades.includes ("Middle"),
            showHigh: filter.schoolGrades.includes ("High"),
            greatSchoolRating: schoolRating
        };

        var message =
        {
            eventName: "ah.searchResults.schoolMarkersShownToUser",
            eventJson: JSON.stringify (evt)
        };

        postEvent (message);
    }



    return pub;
}
());


