WME Place Harmonizer

Harmonizes, formats, and locks a selected place

当前为 2017-09-26 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

/* global I18n */
/* global OpenLayers */
/* global $ */
/* global W */
/* global GM_info */
/* global require */
/* global performance */
/* global OL */
/* global _ */
/* global define */
/* global Node */

// ==UserScript==
// @name        WME Place Harmonizer
// @namespace   WazeUSA
// @version     1.3.15
// @description Harmonizes, formats, and locks a selected place
// @author      WMEPH Development Group
// @include     /^https:\/\/(www|beta)\.waze\.com\/(?!user\/)(.{2,6}\/)?editor\/?.*$/
// @require     https://greasyfork.org/scripts/28687-jquery-ui-1-11-4-custom-min-js/code/jquery-ui-1114customminjs.js
// @resource    jqUI_CSS  https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css
// @license     GNU GPL v3
// @grant       GM_addStyle
// @grant       GM_getResourceText
// ==/UserScript==


(function () {
    var jqUI_CssSrc = GM_getResourceText("jqUI_CSS");
    GM_addStyle(jqUI_CssSrc);
    GM_addStyle([
        '.wmeph-btn, .wmephwl-btn {height:18px;}',
        '#WMEPH_banner { font-weight: 600;}',
        '#WMEPH_banner input[type=text], #WMEPH_banner .ui-autocomplete-input { font-size: 13px !important; height:22px !important; font-family: "Open Sans", Alef, helvetica, sans-serif !important; }',
        '#WMEPH_banner div { padding-bottom: 6px !important; }',
        '#WMEPH_banner div:last-child { padding-bottom: 3px !important; }',
        '#WMEPH_tools div { padding-bottom: 2px !important; }',
        '.ui-autocomplete { max-height: 300px;overflow-y: auto;overflow-x: hidden;} '
    ].join('\n'));
    var WMEPHversion = GM_info.script.version.toString(); // pull version from header
    var WMEPHversionMeta = WMEPHversion.match(/(\d+\.\d+)/i)[1];  // get the X.X version
    var majorNewFeature = false;  // set to true to make an alert pop up after script update with new feature
    var scriptName = GM_info.script.name.toString();
    var isDevVersion = (scriptName.match(/Beta/i) !== null);  //  enables dev messages and unique DOM options if the script is called "... Beta"
    var USA_PNH_DATA, USA_PNH_NAMES = [], USA_CH_DATA, USA_STATE_DATA, USA_CH_NAMES = [];  // Storage for PNH and Category data
    var CAN_PNH_DATA, CAN_PNH_NAMES = [];  // var CAN_CH_DATA, CAN_CH_NAMES = [] not used for now
    var CAT_LOOKUP = {};
    var hospitalPartMatch, hospitalFullMatch, animalPartMatch, animalFullMatch, schoolPartMatch, schoolFullMatch;  // vars for cat-name checking
    var WMEPHdevList, WMEPHbetaList;  // Userlists
    var devVersStr='', devVersStrSpace='', devVersStrDash='';  // strings to differentiate DOM elements between regular and beta script
    var devVersStringMaster = "Beta";
    var dataReadyCounter = 0;
    var betaDataDelay = 10;
    if (isDevVersion) {
        devVersStr = devVersStringMaster; devVersStrSpace = " " + devVersStr; devVersStrDash = "-" + devVersStr;
        betaDataDelay = 20;
    }
    var WMEServicesArray = ["VALLET_SERVICE","DRIVETHROUGH","WI_FI","RESTROOMS","CREDIT_CARDS","RESERVATIONS","OUTSIDE_SEATING","AIR_CONDITIONING","PARKING_FOR_CUSTOMERS","DELIVERIES","TAKE_AWAY","WHEELCHAIR_ACCESSIBLE","DISABILITY_PARKING"];
    var collegeAbbreviations = 'USF|USFSP|UF|UCF|UA|UGA|FSU|UM|SCP|FAU|FIU';
    var defaultKBShortcut,shortcutParse, modifKey = 'Alt+';
    var forumMsgInputs;
    var venueWhitelist, venueWhitelistStr, WLSToMerge, wlKeyName, wlButtText = 'WL';  // Whitelisting vars
    var WLlocalStoreName = 'WMEPH-venueWhitelistNew';
    var WLlocalStoreNameCompressed = 'WMEPH-venueWhitelistCompressed';
    var WMEPH_NameLayer, nameLayer, dupeIDList = [], dupeHNRangeList, dupeHNRangeIDList, dupeHNRangeDistList;
    // Web search Window forming:
    var searchResultsWindowSpecs = '"resizable=yes, top='+ Math.round(window.screen.height*0.1) +', left='+ Math.round(window.screen.width*0.3) +', width='+ Math.round(window.screen.width*0.7) +', height='+ Math.round(window.screen.height*0.8) +'"';
    var searchResultsWindowName = '"WMEPH Search Results"';
    var WMEPHmousePosition;
    var cloneMaster = null;
    var bannButt, bannButt2, bannServ, bannDupl, bannButtHL;  // Banner Buttons objects
    var RPPLockString = 'Lock?';
    var panelFields = {};  // the fields for the sidebar

    // Array prototype extensions (for Firefox fix)
    Array.prototype.toSet = function () {
        return this.reduce(function (e, t) {return e[t] = !0, e;}, {});
    };
    Array.prototype.first = function () {
        return this[0];
    };
    Array.prototype.isEmpty = function () {
        return 0 === this.length;
    };

    function callAjax(url, onSuccess) {
        $.ajax({
            type: 'GET',
            url: url,
            jsonp: 'callback', data: { alt: 'json-in-script' }, dataType: 'jsonp',
            success: onSuccess
        });
    }

    /* ****** Pull PNH and Userlist data ****** */
    setTimeout(function() {
        // Pull USA PNH Data
        setTimeout(function() {
            callAjax('https://spreadsheets.google.com/feeds/list/1-f-JTWY5UnBx-rFTa4qhyGMYdHBZWNirUTOgn222zMY/o6q7kx/public/values',function(response) {
                USA_PNH_DATA = [];
                for (var i = 0; i < response.feed.entry.length; i++) USA_PNH_DATA.push(response.feed.entry[i].gsx$pnhdata.$t);
            });
        }, 0);
        // Pull Category Data ( Includes CAN for now )
        setTimeout(function() {
            callAjax('https://spreadsheets.google.com/feeds/list/1-f-JTWY5UnBx-rFTa4qhyGMYdHBZWNirUTOgn222zMY/ov3dubz/public/values',function(response) {
                USA_CH_DATA = [];
                for (var i = 0; i < response.feed.entry.length; i++) USA_CH_DATA.push(response.feed.entry[i].gsx$pcdata.$t);
            });
        }, 20);
        // Pull State-based Data (includes CAN for now)
        setTimeout(function() {
            callAjax('https://spreadsheets.google.com/feeds/list/1-f-JTWY5UnBx-rFTa4qhyGMYdHBZWNirUTOgn222zMY/os2g2ln/public/values',function(response) {
                USA_STATE_DATA = [];
                for (var i = 0; i < response.feed.entry.length; i++) USA_STATE_DATA.push(response.feed.entry[i].gsx$psdata.$t);
            });
        }, 40);
        // Pull CAN PNH Data
        setTimeout(function() {
            callAjax('https://spreadsheets.google.com/feeds/list/1TIxQZVLUbAJ8iH6LPTkJsvqFb_DstrHpKsJbv1W1FZs/o4ghhas/public/values',function(response) {
                CAN_PNH_DATA = [];
                for (var i = 0; i < response.feed.entry.length; i++) CAN_PNH_DATA.push(response.feed.entry[i].gsx$pnhdata.$t);
            });
        }, 60);
        // Pull name-category lists
        setTimeout(function() {
            callAjax('https://spreadsheets.google.com/feeds/list/1pDmenZA-3FOTvhlCq9yz1dnemTmS9l_njZQbu_jLVMI/op17piq/public/values',function(response) {
                hospitalPartMatch = response.feed.entry[0].gsx$hmchp.$t;
                hospitalFullMatch = response.feed.entry[0].gsx$hmchf.$t;
                animalPartMatch = response.feed.entry[0].gsx$hmcap.$t;
                animalFullMatch = response.feed.entry[0].gsx$hmcaf.$t;
                schoolPartMatch = response.feed.entry[0].gsx$schp.$t;
                schoolFullMatch = response.feed.entry[0].gsx$schf.$t;
                hospitalPartMatch = hospitalPartMatch.toLowerCase().replace(/ \|/g,'|').replace(/\| /g,'|').split("|");
                hospitalFullMatch = hospitalFullMatch.toLowerCase().replace(/ \|/g,'|').replace(/\| /g,'|').split("|");
                animalPartMatch = animalPartMatch.toLowerCase().replace(/ \|/g,'|').replace(/\| /g,'|').split("|");
                animalFullMatch = animalFullMatch.toLowerCase().replace(/ \|/g,'|').replace(/\| /g,'|').split("|");
                schoolPartMatch = schoolPartMatch.toLowerCase().replace(/ \|/g,'|').replace(/\| /g,'|').split("|");
                schoolFullMatch = schoolFullMatch.toLowerCase().replace(/ \|/g,'|').replace(/\| /g,'|').split("|");
            });
        }, 80);
        // Pull dev and beta UserList Data
        setTimeout(function() {
            callAjax('https://spreadsheets.google.com/feeds/list/1L82mM8Xg-MvKqK3WOfsMhFEGmVM46lA8BVcx8qwgmA8/ofblgob/public/values',function(response) {
                var WMEPHuserList = response.feed.entry[0].gsx$phuserlist.$t;
                WMEPHuserList = WMEPHuserList.split("|");
                var betaix = WMEPHuserList.indexOf('BETAUSERS');
                WMEPHdevList = [];
                WMEPHbetaList = [];
                for (var ulix=1; ulix<betaix; ulix++) WMEPHdevList.push(WMEPHuserList[ulix].toLowerCase());
                for (ulix=betaix+1; ulix<WMEPHuserList.length; ulix++) WMEPHbetaList.push(WMEPHuserList[ulix].toLowerCase());
            });
        }, 100);
    }, betaDataDelay);

    function placeHarmonizer_bootstrap() {
        if ( W && W.loginManager && W.loginManager.isLoggedIn() && W.map) {
            setTimeout(dataReady,200);  //  Run the code to check for data return from the Sheets
            // Create duplicatePlaceName layer
            var rlayers = W.map.getLayersBy("uniqueName","__DuplicatePlaceNames");
            if(rlayers.length === 0) {
                var lname = "WMEPH Duplicate Names";
                var style = new OpenLayers.Style({ label : "${labelText}", labelOutlineColor: '#333', labelOutlineWidth: 3, labelAlign: '${labelAlign}',
                                                  fontColor: "${fontColor}", fontOpacity: 1.0, fontSize: "20px", labelYOffset: -30, labelXOffset: 0, fontWeight: "bold",
                                                  fill: false, strokeColor: "${strokeColor}", strokeWidth: 10, pointRadius: "${pointRadius}" });
                nameLayer = new OpenLayers.Layer.Vector(lname, { displayInLayerSwitcher: false, uniqueName: "__DuplicatePlaceNames", styleMap: new OpenLayers.StyleMap(style) });
                nameLayer.setVisibility(false);
                W.map.addLayer(nameLayer);
                WMEPH_NameLayer = nameLayer;
            } else {
                WMEPH_NameLayer = rlayers[0];
            }
        } else {
            phlog("Waiting for WME map and login...");
            setTimeout(function () { placeHarmonizer_bootstrap(); }, 50);
        }
    }

    function dataReady() {
        // If the data has returned, then start the script, otherwise wait a bit longer
        if ("undefined" !== typeof CAN_PNH_DATA && "undefined" !== typeof USA_PNH_DATA && "undefined" !== typeof USA_CH_DATA &&
            "undefined" !== typeof WMEPHdevList && "undefined" !== typeof WMEPHbetaList && "undefined" !== typeof hospitalPartMatch ) {
            setTimeout(function(){ // Build the name search lists
                USA_PNH_NAMES = makeNameCheckList(USA_PNH_DATA);
                USA_CH_NAMES = makeCatCheckList(USA_CH_DATA);
                CAN_PNH_NAMES = makeNameCheckList(CAN_PNH_DATA);
                // CAN using USA_CH_NAMES at the moment
            }, 10);
            setTimeout(loginReady, 20);  //  start the main code
        } else {
            if (dataReadyCounter % 20 === 0) {
                var waitMessage = 'Waiting for ';
                if ("undefined" === typeof CAN_PNH_DATA) {
                    waitMessage = waitMessage + "CAN PNH Data; ";
                }
                if ("undefined" === typeof USA_PNH_DATA) {
                    waitMessage = waitMessage + "USA PNH Data; ";
                }
                if ("undefined" === typeof hospitalPartMatch) {
                    waitMessage = waitMessage + "Cat-Name Data; ";
                }
                if ("undefined" === typeof WMEPHdevList) {
                    waitMessage = waitMessage + "User List Data;";
                }
                phlog(waitMessage);
            }
            if (dataReadyCounter<200) {
                dataReadyCounter++;
                setTimeout(function () { dataReady(); }, 100);
            } else {
                phlog("Data load took too long, reload WME...");
            }
        }
    }

    function loginReady() {
        dataReadyCounter = 0;
        if ( W.loginManager.user !== null) {
            setTimeout(runPH, 10);  //  start the main code
        } else {
            if (dataReadyCounter<50) {
                dataReadyCounter++;
                phlog("Waiting for WME login...");
                setTimeout(function () { dataReady(); }, 200);
            } else {
                phlog("Login failed...?  Reload WME.");
            }
        }
    }

    function isAlwaysOpen(venue) {
        var hours = venue.attributes.openingHours;
        return hours.length === 1 && hours[0].days.length === 7 && hours[0].fromHour === '00:00' && hours[0].toHour ==='00:00';
    }

    function isEmergencyRoom(venue) {
        return /(?:emergency\s+(?:room|department|dept))|\b(?:er|ed)\b/i.test(venue.attributes.name);
    }

    function getPvaSeverity(pvaValue, venue) {
        var isER = pvaValue === 'hosp' && isEmergencyRoom(venue);
        return (pvaValue ==='' || pvaValue === '0' || (pvaValue === 'hosp' && !isER)) ? 3 : (pvaValue ==='2') ? 1 : (pvaValue ==='3') ? 2 : 0;
    }

    (function addPURWebSearchButton() {
        var purLayerObserver = new MutationObserver(panelContainerChanged);
        purLayerObserver.observe($('#map #panel-container')[0],{childList: true, subtree: true});

        function panelContainerChanged() {
            if (!$('#WMEPH-HidePURWebSearch' + devVersStr).is(':checked')) {
                var $panelNav = $('.place-update-edit.panel .categories.small');
                if ($('#PHPURWebSearchButton').length === 0 && $panelNav.length > 0) {
                    var $btn = $('<button>', {class:"btn btn-primary", id:"PHPURWebSearchButton"}) //NOTE: Don't use btn-block class. Causes conflict with URO+ "Done" button.
                    .css({width:'100%',display:'block',marginTop:'4px',marginBottom:'4px'})
                    .text("Web Search")
                    .click(function() { openWebSearch(); });
                    $panelNav.after($btn);
                }
            }
        }

        function buildSearchUrl(searchName, address) {
            searchName = searchName
                .replace(/&/g, "%26")
                .replace(/[ \/]/g, "%20")
                .trim();
            address = address
                .replace(/No street, /, "")
                .replace(/No address/, "")
                .replace(/ /g, "%20")
                .replace(/CR-/g, "County%20Rd%20")
                .replace(/SR-/g, "State%20Hwy%20")
                .replace(/US-/g, "US%20Hwy%20")
                .replace(/ CR /g, "%20County%20Rd%20")
                .replace(/ SR /g, "%20State%20Hwy%20")
                .replace(/ US /g, "%20US%20Hwy%20")
                .replace(/$CR /g, "County%20Rd%20")
                .replace(/$SR /g, "State%20Hwy%20")
                .replace(/$US /g, "US%20Hwy%20")
                .trim();

            return "http://www.google.com/search?q=" + searchName + (address.length > 0 ? ",%20" + address: "");
        }

        function openWebSearch() {
            var newName = $('.place-update-edit.panel .name').first().text();
            var addr = $('.place-update-edit.panel .address').first().text();
            if ( $("#WMEPH-WebSearchNewTab" + devVersStr).prop('checked') ) {
                window.open(buildSearchUrl(newName,addr));
            } else {
                window.open(buildSearchUrl(newName,addr), searchResultsWindowName, searchResultsWindowSpecs);
            }
        }
    })();

    function runPH() {
        // Script update info
        var WMEPHWhatsNewList = [  // New in this version
            '1.3.14: FIXED - R2 editors can use Google link options and highlights.',
            '1.3.13: FIXED - Highlights for places a user cannot edit external links',
            '1.3.13: NEW - All hotels will get 24/7 hours, and PNH matches get WiFi service',
            '1.3.12: FIXED - Will not run on URLs without a trailing forward slash.',
            '1.3.10: FIXED - Rest area flag issues.',
            '1.3.8: Bug fix',
            '1.3.7: Adjusted position of PUR Web Search button.',
            '1.3.6: NEW - Added option to hide PUR "Web Search" button.',
            '1.3.6: FIXED - Moved PUR web search button to prevent conflict with URO+',
            '1.3.5: NEW - Added handicapped parking question for PLAs.', 
            '1.3.5: FIXED - PUR web search button should not appear on UR popups.',
            '1.3.4: FIXED - PUR web search should remove No Street and No Address',
            '1.3.3: FIXED - Web Search button doesn\'t always appear on PURs.',
            '1.3.2: NEW - Added Web Search button to PUR popups.',
            '1.3.1: Temporarily removed "Updating Google place link will automatically re-run WMEPH".',
            '1.3.0: Production release.',
            '1.2.48: NEW - Added a flag for missing payment type when PLA cost is not free or unknown',
            '1.2.47: NEW - Added a flag for "Can cars exit parking lot when closed?"',
            '1.2.46: NEW - Added a flag for PLA stop points that have never been moved.',
            '1.2.45: NEW - Added a button to open the Google link search box and pre-fill it with the place name.',
            '1.2.45: NEW - Updating Google place link will automatically re-run WMEPH.',
            '1.2.44: NEW - Added several flags for parking lots.',
            '1.2.43: FIXED - WMEPH should run on places with detail updates, but not new place PURs.'
        ];
        var WMEPHWhatsNewMetaList = [  // New in this major version
            'New flags and helpers for parking lots!',
            'A new button to pre-fill the Google Link search box with the place name.'
        ];
        var newSep = '\n - ', listSep = '<li>';  // joiners for script and html messages
        var WMEPHWhatsNew = WMEPHWhatsNewList.join(newSep);
        var WMEPHWhatsNewMeta = WMEPHWhatsNewMetaList.join(newSep);
        var WMEPHWhatsNewHList = WMEPHWhatsNewList.join(listSep);
        var WMEPHWhatsNewMetaHList = WMEPHWhatsNewMetaList.join(listSep);
        WMEPHWhatsNew = 'WMEPH v. ' + WMEPHversion + '\nUpdates:' + newSep + WMEPHWhatsNew;
        WMEPHWhatsNewMeta = 'WMEPH v. ' + WMEPHversionMeta + '\nMajor features:' + newSep + WMEPHWhatsNewMeta;
        if ( localStorage.getItem('WMEPH-featuresExamined'+devVersStr) === null ) {
            localStorage.setItem('WMEPH-featuresExamined'+devVersStr, '0');  // Storage for whether the User has pressed the button to look at updates
        }
        var thisUser = W.loginManager.user;
        var UpdateObject = require("Waze/Action/UpdateObject");
        var _disableHighlightTest = false;  // Set to true to temporarily disable highlight checks immediately when venues change.

        modifyGoogleLinks();

        // Whitelist initialization
        if ( validateWLS( LZString.decompressFromUTF16(localStorage.getItem(WLlocalStoreNameCompressed)) ) === false ) {  // If no compressed WL string exists
            if ( validateWLS(localStorage.getItem(WLlocalStoreName)) === false ) {  // If no regular WL exists
                venueWhitelist = { '1.1.1': { Placeholder: {  } } }; // Populate with a dummy place
                saveWL_LS(false);
                saveWL_LS(true);
            } else {  // if regular WL string exists, then transfer to compressed version
                localStorage.setItem('WMEPH-OneTimeWLBU', localStorage.getItem(WLlocalStoreName));
                loadWL_LS(false);
                saveWL_LS(true);
                alert('Whitelists are being converted to a compressed format.  If you have trouble with your WL, please submit an error report.');
            }
        } else {
            loadWL_LS(true);
        }

        if (W.loginManager.user.userName === 'ggrane') {
            searchResultsWindowSpecs = '"resizable=yes, top='+ Math.round(window.screen.height*0.1) +', left='+ Math.round(window.screen.width*0.3) +', width='+ Math.round(window.screen.width*0.86) +', height='+ Math.round(window.screen.height*0.8) +'"';
        }

        // Initialize the WL Object
        var currentWL = {};

        // If the editor installs for the 1st time, alert with the new elements
        if ( localStorage.getItem('WMEPHversionMeta'+devVersStr) === null ) {
            alert(WMEPHWhatsNewMeta);
            localStorage.setItem('WMEPHversionMeta'+devVersStr, WMEPHversionMeta);
            localStorage.setItem('WMEPHversion'+devVersStr, WMEPHversion);
            localStorage.setItem(GLinkWarning, '0');  // Reset warnings
            localStorage.setItem(SFURLWarning, '0');
            localStorage.setItem('WMEPH-featuresExamined'+devVersStr, '1');  // disable the button
        } else if (localStorage.getItem('WMEPHversionMeta'+devVersStr) !== WMEPHversionMeta) { // If the editor installs a newer MAJOR version, alert with the new elements
            alert(WMEPHWhatsNewMeta);
            localStorage.setItem('WMEPHversionMeta'+devVersStr, WMEPHversionMeta);
            localStorage.setItem('WMEPHversion'+devVersStr, WMEPHversion);
            localStorage.setItem(GLinkWarning, '0');  // Reset warnings
            localStorage.setItem(SFURLWarning, '0');
            localStorage.setItem('WMEPH-featuresExamined'+devVersStr, '1');  // disable the button
        } else if (localStorage.getItem('WMEPHversion'+devVersStr) !== WMEPHversion) {  // If MINOR version....
            if (majorNewFeature) {  //  with major feature update, then alert
                alert(WMEPHWhatsNew);
                localStorage.setItem('WMEPH-featuresExamined'+devVersStr, '1');  // disable the button
            } else {  //  if not major feature update, then keep the button
                localStorage.setItem('WMEPH-featuresExamined'+devVersStr, '0');
            }
            localStorage.setItem('WMEPHversion'+devVersStr, WMEPHversion);  // store last installed version in localstorage
        }
        if (localStorage.getItem('WMEPH-plaNameWLWarning'+devVersStr) === null) {
            localStorage.setItem('WMEPH-plaNameWLWarning'+devVersStr, '1');
            alert('WME Place Harmonizer\n\nParking Lot Areas (PLA) now have the ability to be Whitelisted if they are unnamed. Please consult the wiki for when it is ok to have a PLA with no name.');
        }
        // Settings setup
        var GLinkWarning = 'GLinkWarning';  // Warning message for first time using Google search to not to use the Google info itself.
        if (!localStorage.getItem(GLinkWarning)) {  // store settings so the warning is only given once
            localStorage.setItem(GLinkWarning, '0');
        }
        var SFURLWarning = 'SFURLWarning';  // Warning message for first time using localized storefinder URL.
        if (!localStorage.getItem(SFURLWarning)) {  // store settings so the warning is only given once
            localStorage.setItem(SFURLWarning, '0');
        }

        setTimeout(add_PlaceHarmonizationSettingsTab, 50);  // initialize the settings tab

        // Event listeners
        W.selectionManager.events.registerPriority("selectionchanged", this, checkSelection);
        W.model.venues.on('objectssynced', destroyDupeLabels);
        W.model.venues.on('objectssynced', syncWL);
        W.model.venues.on('objectschanged', onObjectsChanged);

        function onObjectsChanged(arg) {
            deleteDupeLabel();

            // This is code to handle updating the banner when changes are made external to the script.
            if ($('#WMEPH_banner').length > 0 && W.selectionManager.hasSelectedItems() && W.selectionManager.selectedItems[0].model.type === 'venue') {
                var selItem = W.selectionManager.selectedItems[0].model;
                var actions = W.model.actionManager.actions;
                var lastAction = actions[actions.length - 1];
                if (lastAction && lastAction.object && lastAction.object.type === 'venue' && lastAction.attributes && lastAction.attributes.id === selItem.attributes.id) {
                    if (lastAction.newAttributes && lastAction.newAttributes.entryExitPoints) {
                        harmonizePlaceGo(selItem, 'harmonize');
                    }
                }
            }
        }


        // Remove any temporary ID values (ID < 0) from the WL store at startup.
        var removedWLCount = 0;
        Object.keys(venueWhitelist).forEach(function(venueID) {
            if (venueID < 0) {
                delete venueWhitelist[venueID];
                removedWLCount += 1;
            }
        });
        if (removedWLCount > 0) {
            saveWL_LS(true);
            phlogdev('Removed ' + removedWLCount + ' venues with temporary ID\'s from WL store');
        }

        // This should be called after new venues are saved (using venues'objectssynced' event), so the new IDs can be retrieved and used
        // to replace the temporary IDs in the whitelist.  If WME errors during save, this function may not run.  At that point, the
        // temporary IDs can no longer be traced to the new IDs so the WL for those new venues will be orphaned, and the temporary IDs
        // will be removed from the WL store the next time the script starts.
        function syncWL(newVenues) {
            newVenues.forEach(function(newVenue) {
                var oldID = newVenue._prevID;
                var newID = newVenue.attributes.id;
                if (oldID && newID && venueWhitelist[oldID]) {
                    venueWhitelist[newID] = venueWhitelist[oldID];
                    delete venueWhitelist[oldID];
                }
            });
            saveWL_LS(true);
        }

        var WMEPHurl = 'https://www.waze.com/forum/posting.php?mode=reply&f=819&t=215657';  // WMEPH Forum thread URL
        var USAPNHMasURL = 'https://docs.google.com/spreadsheets/d/1-f-JTWY5UnBx-rFTa4qhyGMYdHBZWNirUTOgn222zMY/edit#gid=0';  // Master USA PNH link
        var placesWikiURL = 'https://wazeopedia.waze.com/wiki/USA/Places';  // WME Places wiki
        var restAreaWikiURL = 'https://wazeopedia.waze.com/wiki/USA/Rest_areas#Adding_a_Place';  // WME Places wiki
        var betaUser, devUser;
        if (WMEPHbetaList.length === 0 || "undefined" === typeof WMEPHbetaList) {
            if (isDevVersion) {
                alert('Beta user list access issue.  Please post in the GHO or PM/DM MapOMatic about this message.  Script should still work.');
            }
            betaUser = false;
            devUser = false;
        } else {
            devUser = (WMEPHdevList.indexOf(thisUser.userName.toLowerCase()) > -1);
            betaUser = (WMEPHbetaList.indexOf(thisUser.userName.toLowerCase()) > -1);
        }
        if (devUser) {
            betaUser = true; // dev users are beta users
        }
        var usrRank = thisUser.normalizedLevel;  // get editor's level (actual level)
        var userLanguage = I18n.locale;

        // lock levels are offset by one
        var lockLevel1 = 0, lockLevel2 = 1, lockLevel3 = 2, lockLevel4 = 3, lockLevel5 = 4;
        var defaultLockLevel = lockLevel2, PNHLockLevel;
        var PMUserList = { // user names and IDs for PM functions
            SER: {approvalActive: true, modID: '17083181', modName: 'itzwolf'},
            WMEPH: {approvalActive: true, modID: '2647925', modName: 'MapOMatic'}
        };
        var severityButt=0;  // error tracking to determine banner color (action buttons)
        var duplicateName = '';
        var catTransWaze2Lang = I18n.translations[userLanguage].venues.categories;  // pulls the category translations
        var item, itemID, newName, optionalAlias, newURL, tempPNHURL = '', newPhone;
        var newAliases = [], newAliasesTemp = [], newCategories = [];
        var numAttempts = 0;

        // Split out state-based data (USA_STATE_DATA)
        var USA_STATE_HEADERS = USA_STATE_DATA[0].split("|");
        var ps_state_ix = USA_STATE_HEADERS.indexOf('ps_state');
        var ps_state2L_ix = USA_STATE_HEADERS.indexOf('ps_state2L');
        var ps_region_ix = USA_STATE_HEADERS.indexOf('ps_region');
        var ps_gFormState_ix = USA_STATE_HEADERS.indexOf('ps_gFormState');
        var ps_defaultLockLevel_ix = USA_STATE_HEADERS.indexOf('ps_defaultLockLevel');
        //var ps_requirePhone_ix = USA_STATE_HEADERS.indexOf('ps_requirePhone');
        //var ps_requireURL_ix = USA_STATE_HEADERS.indexOf('ps_requireURL');
        var ps_areacode_ix = USA_STATE_HEADERS.indexOf('ps_areacode');
        var stateDataTemp, areaCodeList = '800,822,833,844,855,866,877,888';  //  include toll free non-geographic area codes
        var ixBank, ixATM, ixOffices;

        // Set up Run WMEPH button once place is selected
        bootstrapRunButton();

        /**
         * Generates highlighting rules and applies them to the map.
         */
        var layer = W.map.landmarkLayer;
        function initializeHighlights() {
            var ruleGenerator = function(value, symbolizer) {
                return new W.Rule({
                    filter: new OL.Filter.Comparison({
                        type: '==',
                        value: value,
                        evaluate: function(venue) {
                            return venue && venue.model && venue.model.attributes.wmephSeverity === this.value;
                        }
                    }),
                    symbolizer: symbolizer
                });
            };

            var severity0 = ruleGenerator(0, {
                'pointRadius': '5',
                'strokeWidth': '4',
                'strokeColor': '#24ff14'
            });

            var severityLock = ruleGenerator('lock', {
                'pointRadius': '5',
                'strokeColor': '#24ff14',
                'strokeLinecap': '1',
                'strokeDashstyle': '7 2',
                'strokeWidth': '5'
            });

            var severity1 = ruleGenerator(1, {
                'strokeColor': '#0055ff',
                'strokeWidth': '4',
                'pointRadius': '7'
            });

            var severityLock1 = ruleGenerator('lock1', {
                'pointRadius': '5',
                'strokeColor': '#0055ff',
                'strokeLinecap': '1',
                'strokeDashstyle': '7 2',
                'strokeWidth': '5'
            });

            var severity2 = ruleGenerator(2, {
                'strokeColor': '#ff0',
                'strokeWidth': '6',
                'pointRadius': '8'
            });

            var severity3 = ruleGenerator(3, {
                'strokeColor': '#ff0000',
                'strokeWidth': '4',
                'pointRadius': '8'
            });

            var severity4 = ruleGenerator(4, {
                'fillColor': 'black',
                'fillOpacity': '0.35',
                'strokeColor': '#f42',
                'strokeLinecap': '1',
                'strokeWidth': '13',
                'strokeDashstyle': '4 2'
            });

            var severityHigh = ruleGenerator(5, {
                'pointRadius': '12',
                'fillColor': 'black',
                'fillOpacity': '0.4',
                'strokeColor': '#f4a',
                'strokeLinecap': '1',
                'strokeWidth': '10',
                'strokeDashstyle': '4 2'
            });

            var severityAdLock = ruleGenerator('adLock', {
                'pointRadius': '12',
                'fillColor': 'yellow',
                'fillOpacity': '0.4',
                'strokeColor': '#000',
                'strokeLinecap': '1',
                'strokeWidth': '10',
                'strokeDashstyle': '4 2'
            });

            function plaTypeRuleGenerator(value, symbolizer) {
                return new W.Rule({
                    filter: new OL.Filter.Comparison({
                        type: '==',
                        value: value,
                        evaluate: function(venue) {
                            if ($('#WMEPH-PLATypeFill' + devVersStr).is(':checked') && venue && venue.model && venue.model.attributes.categories &&
                                venue.model.attributes.categoryAttributes && venue.model.attributes.categoryAttributes.PARKING_LOT &&
                                venue.model.attributes.categories.indexOf('PARKING_LOT') > -1) {
                                var type = venue.model.attributes.categoryAttributes.PARKING_LOT.parkingType;
                                return (!type && this.value === 'public') || (type && (type.toLowerCase() === this.value));
                            }
                        }
                    }),
                    symbolizer: symbolizer
                });
            }

            var publicPLA = plaTypeRuleGenerator('public', {
                fillColor: '#00FF00',
                fillOpacity: '0.3'
            });
            var restrictedPLA = plaTypeRuleGenerator('restricted', {
                fillColor: '#FFFF00',
                fillOpacity: '0.3'
            });
            var privatePLA = plaTypeRuleGenerator('private', {
                fillColor: '#FF0000',
                fillOpacity: '0.3'
            });

            Array.prototype.push.apply(layer.styleMap.styles['default'].rules, [severity0, severityLock, severity1, severityLock1, severity2, severity3, severity4, severityHigh, severityAdLock,publicPLA, restrictedPLA, privatePLA]);
            // to make Google Script linter happy ^^^ Array.prototype.push.apply(layer.styleMap.styles.default.rules, [severity0, severityLock, severity1, severity2, severity3, severity4, severityHigh]);
            /* Can apply to normal view or selection/highlight views as well.
            _.each(layer.styleMap.styles, function(style) {
                style.rules = style.rules.concat([severity0, severityLock, severity1, severity2, severity3, severity4, severityHigh]);
            });
            */
        }

        /**
         * To highlight a place, set the wmephSeverity attribute to the desired highlight level.
         * @param venues {array of venues, or single venue} Venues to check for highlights.
         */
        function applyHighlightsTest(venues) {
            venues = venues ? _.isArray(venues) ? venues : [venues] : [];
            var storedBannButt = bannButt, storedBannServ = bannServ, storedBannButt2 = bannButt2;
            var t0 = performance.now();  // Speed check start

            _.each(venues, function (venue) {
                if (venue.CLASS_NAME === 'Waze.Feature.Vector.Landmark' &&
                    venue.attributes) {
                    // Highlighting logic would go here
                    // Severity can be: 0, 'lock', 1, 2, 3, 4, or 'high'. Set to
                    // anything else to use default WME style.
                    if ( $("#WMEPH-ColorHighlighting" + devVersStr).prop('checked') && !($("#WMEPH-DisableRankHL" + devVersStr).prop('checked') && venue.attributes.lockRank > (usrRank - 1))) {
                        try {
                            venue.attributes.wmephSeverity = harmonizePlaceGo(venue,'highlight');
                        } catch (err) {
                            phlogdev("highlight error: ",err);
                        }
                    } else {
                        venue.attributes.wmephSeverity = 'default';
                    }

                }
            });
            if (W.selectionManager.selectedItems.length === 1) {
                var venue = W.selectionManager.selectedItems[0].model;
                if (venue.type === "venue") {
                    venue.attributes.wmephSeverity = harmonizePlaceGo(venue,'highlight');
                    bannButt = storedBannButt;
                    bannServ = storedBannServ;
                    bannButt2 = storedBannButt2;
                }
            }
            layer.redraw();
            var t1 = performance.now();  // log search time
            phlogdev("Ran highlighter in " + (t1 - t0) + " milliseconds.");

        }

        // Setup highlight colors
        initializeHighlights();

        // Set up CH loop
        function bootstrapWMEPH_CH() {
            if ( $("#WMEPH-ColorHighlighting" + devVersStr).prop('checked') ) {
                // Turn off place highlighting in WMECH if it's on.
                if ( $("#_cbHighlightPlaces").prop('checked') ) {
                    $("#_cbHighlightPlaces").trigger('click');
                }
                // Add listeners
                W.model.venues.on('objectschanged', function (e) {
                    if (!_disableHighlightTest) {
                        applyHighlightsTest(e);
                    }
                });

                W.model.venues.on('objectsadded', function (e) {
                    applyHighlightsTest(e);
                });

                // Apply the colors
                applyHighlightsTest(W.model.venues.getObjectArray());

                //setTimeout(bootstrapWMEPH_CH,500);  // Refresh the Highlights periodically
            } else {
                // reset the colors to default
                applyHighlightsTest(W.model.venues.getObjectArray());
                //updateWMEPH_CH(false);
            }
        }

        // used for phone reformatting
        if (!String.plFormat) {
            String.plFormat = function(format) {
                var args = Array.prototype.slice.call(arguments, 1);
                return format.replace(/{(\d+)}/g, function(name, number) {
                    return typeof args[number] !== "undefined" ? args[number] : null;
                });
            };
        }

        // Change place.name to title case
        var ignoreWords = "an|and|as|at|by|for|from|hhgregg|in|into|of|on|or|the|to|with".split('|');
        var capWords = "3M|AAA|AMC|AOL|AT&T|ATM|BBC|BLT|BMV|BMW|BP|CBS|CCS|CGI|CISCO|CJ|CNN|CVS|DHL|DKNY|DMV|DSW|EMS|ER|ESPN|FCU|FCUK|FDNY|GNC|H&M|HP|HSBC|IBM|IHOP|IKEA|IRS|JBL|JCPenney|KFC|LLC|MBNA|MCA|MCI|NBC|NYPD|PDQ|PNC|TCBY|TNT|TV|UPS|USA|USPS|VW|XYZ|ZZZ".split('|');
        var specWords = "d'Bronx|iFix".split('|');

        function toTitleCase(str) {
            if (!str) {
                return str;
            }
            str = str.trim();
            var parensParts = str.match(/\(.*?\)/g);
            if (parensParts) {
                for (var i=0; i<parensParts.length; i++) {
                    str = str.replace(parensParts[i], '%' + i + '%');
                }
            }

            var allCaps = (str === str.toUpperCase());
            // Cap first letter of each word
            str = str.replace(/([A-Za-z\u00C0-\u017F][^\s-\/]*) */g, function(txt) {
                return ((txt === txt.toUpperCase()) && !allCaps) ? txt : txt.charAt(0).toUpperCase() + txt.substr(1);
            });
            // Cap O'Reilley's, L'Amour, D'Artagnan as long as 5+ letters
            str = str.replace(/\b[oOlLdD]'[A-Za-z']{3,}/g, function(txt) {
                return ((txt === txt.toUpperCase()) && !allCaps) ? txt : txt.charAt(0).toUpperCase() + txt.charAt(1) + txt.charAt(2).toUpperCase() + txt.substr(3);
            });
            // Cap McFarley's, as long as 5+ letters long
            str = str.replace(/\b[mM][cC][A-Za-z']{3,}/g, function(txt) {
                return ((txt === txt.toUpperCase()) && !allCaps) ? txt : txt.charAt(0).toUpperCase() + txt.charAt(1).toLowerCase() + txt.charAt(2).toUpperCase() + txt.substr(3);
            });
            // anything with an "&" sign, cap the character after &
            str = str.replace(/&.+/g, function(txt) {
                return ((txt === txt.toUpperCase()) && !allCaps) ? txt : txt.charAt(0) + txt.charAt(1).toUpperCase() + txt.substr(2);
            });
            // lowercase any from the ignoreWords list
            str = str.replace(/[^ ]+/g, function(txt) {
                var txtLC = txt.toLowerCase();
                return (ignoreWords.indexOf(txtLC) > -1) ? txtLC : txt;
            });
            // uppercase any from the capWords List
            str = str.replace(/[^ ]+/g, function(txt) {
                var txtUC = txt.toUpperCase();
                return (capWords.indexOf(txtUC) > -1) ? txtUC : txt;
            });
            // preserve any specific words
            str = str.replace(/[^ ]+/g, function(txt) {
                //var txtAC = txt.toUpperCase();
                for (var swix=0; swix<specWords.length; swix++) {
                    if ( txt.toUpperCase() === specWords[swix].toUpperCase() ) {
                        return specWords[swix];
                    }
                }
                return txt;
            });
            // Fix 1st, 2nd, 3rd, 4th, etc. to lowercase
            str = str.replace(/\b(\d*1)st\b/gi, '$1st');
            str = str.replace(/\b(\d*2)nd\b/gi, '$1nd');
            str = str.replace(/\b(\d*3)rd\b/gi, '$1rd');
            str = str.replace(/\b(\d+)th\b/gi, '$1th');
            // Cap first letter of entire name
            str = str.charAt(0).toUpperCase() + str.substr(1);

            if (parensParts) {
                for (var i=0; i<parensParts.length; i++) {
                    str = str.replace('%' + i + '%', parensParts[i]);
                }
            }
            return str;
        }

        // Change place.name to title case
        function toTitleCaseStrong(str) {
            if (!str) {
                return str;
            }
            str = str.trim();
            var parensParts = str.match(/\(.*?\)/g);
            if (parensParts) {
                for (var i=0; i<parensParts.length; i++) {
                    str = str.replace(parensParts[i], '%' + i + '%');
                }
            }

            var allCaps = (str === str.toUpperCase());
            // Cap first letter of each word
            str = str.replace(/([A-Za-z\u00C0-\u017F][^\s-\/]*) */g, function(txt) {
                return ((txt === txt.toUpperCase()) && !allCaps) ? txt : txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
            });
            // Cap O'Reilley's, L'Amour, D'Artagnan as long as 5+ letters
            str = str.replace(/\b[oOlLdD]'[A-Za-z']{3,}/g, function(txt) {
                return ((txt === txt.toUpperCase()) && !allCaps) ? txt : txt.charAt(0).toUpperCase() + txt.charAt(1) + txt.charAt(2).toUpperCase() + txt.substr(3).toLowerCase();
            });
            // Cap McFarley's, as long as 5+ letters long
            str = str.replace(/\b[mM][cC][A-Za-z']{3,}/g, function(txt) {
                return ((txt === txt.toUpperCase()) && !allCaps) ? txt : txt.charAt(0).toUpperCase() + txt.charAt(1).toLowerCase() + txt.charAt(2).toUpperCase() + txt.substr(3).toLowerCase();
            });
            // anything sith an "&" sign, cap the word after &
            str = str.replace(/&\w+/g, function(txt) {
                return ((txt === txt.toUpperCase()) && !allCaps) ? txt : txt.charAt(0) + txt.charAt(1).toUpperCase() + txt.substr(2);
            });
            // lowercase any from the ignoreWords list
            str = str.replace(/[^ ]+/g, function(txt) {
                var txtLC = txt.toLowerCase();
                return (ignoreWords.indexOf(txtLC) > -1) ? txtLC : txt;
            });
            // uppercase any from the capWords List
            str = str.replace(/[^ ]+/g, function(txt) {
                var txtLC = txt.toUpperCase();
                return (capWords.indexOf(txtLC) > -1) ? txtLC : txt;
            });
            // Fix 1st, 2nd, 3rd, 4th, etc.
            str = str.replace(/\b(\d*1)st\b/gi, '$1st');
            str = str.replace(/\b(\d*2)nd\b/gi, '$1nd');
            str = str.replace(/\b(\d*3)rd\b/gi, '$1rd');
            str = str.replace(/\b(\d+)th\b/gi, '$1th');
            // Cap first letter of entire name
            str = str.charAt(0).toUpperCase() + str.substr(1);
            if (parensParts) {
                for (var i=0; i<parensParts.length; i++) {
                    str = str.replace('%' + i + '%', parensParts[i]);
                }
            }
            return str;
        }

        // normalize phone
        function normalizePhone(s, outputFormat, returnType, item) {
            if ( !s && returnType === 'existing' ) {
                if (!item.isParkingLot() || (item.isParkingLot() && item.attributes.brand && W.model.venues.categoryBrands.PARKING_LOT.indexOf(item.attributes.brand) !== -1)) {
                    bannButt.phoneMissing.active = true;
                    if (currentWL.phoneWL) {
                        bannButt.phoneMissing.WLactive = false;
                    }
                }
                return s;
            }
            s = s.replace(/(\d{3}.*)(?:extension|ext|xt|x).*/i, '$1');
            var s1 = s.replace(/\D/g, '');  // remove non-number characters
            var m = s1.match(/^1?([2-9]\d{2})([2-9]\d{2})(\d{4})$/);  // Ignore leading 1, and also don't allow area code or exchange to start with 0 or 1 (***USA/CAN specific)
            if (!m) {  // then try alphanumeric matching
                if (s) { s = s.toUpperCase(); }
                s1 = s.replace(/[^0-9A-Z]/g, '').replace(/^\D*(\d)/,'$1').replace(/^1?([2-9][0-9]{2}[0-9A-Z]{7,10})/g,'$1');
                s1 = replaceLetters(s1);
                m = s1.match(/^([2-9]\d{2})([2-9]\d{2})(\d{4})(?:.{0,3})$/);  // Ignore leading 1, and also don't allow area code or exchange to start with 0 or 1 (***USA/CAN specific)
                if (!m) {
                    if ( returnType === 'inputted' ) {
                        return 'badPhone';
                    } else {
                        bannButt.phoneInvalid.active = true;
                        return s;
                    }
                } else {
                    return String.plFormat(outputFormat, m[1], m[2], m[3]);
                }
            } else {
                return String.plFormat(outputFormat, m[1], m[2], m[3]);
            }
        }

        // Alphanumeric phone conversion
        function replaceLetters(number) {
            var conversionMap = _({
                2: /A|B|C/,
                3: /D|E|F/,
                4: /G|H|I/,
                5: /J|K|L/,
                6: /M|N|O/,
                7: /P|Q|R|S/,
                8: /T|U|V/,
                9: /W|X|Y|Z/
            });
            number = typeof number === 'string' ? number.toUpperCase() : '';
            return number.replace(/[A-Z]/g, function(match, offset, string) {
                return conversionMap.findKey(function(re) {
                    return re.test(match);
                });
            });
        }

        var MultiAction = require("Waze/Action/MultiAction");
        // Add array of actions to a MultiAction to be executed at once (counts as one edit for redo/undo purposes)
        function executeMultiAction(actions) {
            if(actions.length > 0) {
                var m_action = new MultiAction();
                m_action.setModel(W.model);
                actions.forEach(function(action) {
                    m_action.doSubAction(action);
                });
                W.model.actionManager.add(m_action);
            }
        }

        // Normalize url
        function normalizeURL(s, lc, skipBannerActivate, item) {
            if ((!s || s.trim().length === 0) && !skipBannerActivate) {  // Notify that url is missing and provide web search to find website and gather data (provided for all editors)
                if (!item.isParkingLot() || (item.isParkingLot() && item.attributes.brand && W.model.venues.categoryBrands.PARKING_LOT.indexOf(item.attributes.brand) !== -1)) {
                    bannButt.urlMissing.active = true;
                    if (currentWL.urlWL) {
                        bannButt.urlMissing.WLactive = false;
                    }
                }
                bannButt.webSearch.active = true;  // Activate websearch button
                return s;
            }

            s = s.replace(/ \(.*/g, '');  // remove anything with parentheses after it
            s = s.replace(/ /g, '');  // remove any spaces
            var m = s.match(/^http:\/\/(.*)$/i);  // remove http://
            if (m) { s = m[1]; }
            if (lc) {  // lowercase the entire domain
                s = s.replace(/[^\/]+/i, function(txt) { // lowercase the domain
                    return (txt === txt.toLowerCase()) ? txt : txt.toLowerCase();
                });
            } else {  // lowercase only the www and com
                s = s.replace(/www\./i, 'www.');
                s = s.replace(/\.com/i, '.com');
            }
            m = s.match(/^(.*)\/pages\/welcome.aspx$/i);  // remove unneeded terms
            if (m) { s = m[1]; }
            m = s.match(/^(.*)\/pages\/default.aspx$/i);  // remove unneeded terms
            if (m) { s = m[1]; }
            // m = s.match(/^(.*)\/index.html$/i);  // remove unneeded terms
            // if (m) { s = m[1]; }
            // m = s.match(/^(.*)\/index.htm$/i);  // remove unneeded terms
            // if (m) { s = m[1]; }
            // m = s.match(/^(.*)\/index.php$/i);  // remove unneeded terms
            // if (m) { s = m[1]; }
            m = s.match(/^(.*)\/$/i);  // remove final slash
            if (m) { s = m[1]; }

            if (!s || s.trim().length === 0) s = 'badURL';
            return s;
        }  // END normalizeURL function

        // Only run the harmonization if a venue is selected
        function harmonizePlace() {
            // Beta version for approved users only
            if (isDevVersion && !betaUser) {
                alert("Please sign up to beta-test this script version.\nSend a PM or Slack-DM to MapOMatic or Tonestertm, or post in the WMEPH forum thread. Thanks.");
                return;
            }
            // Only run if a single place is selected
            if (W.selectionManager.selectedItems.length === 1) {
                var item = W.selectionManager.selectedItems[0].model;
                if (item.type === "venue") {
                    blurAll();  // focus away from current cursor position
                    _disableHighlightTest = true;
                    harmonizePlaceGo(item,'harmonize');
                    _disableHighlightTest = false;
                    applyHighlightsTest(item);
                } else {  // Remove duplicate labels
                    WMEPH_NameLayer.destroyFeatures();
                }
            } else {  // Remove duplicate labels
                WMEPH_NameLayer.destroyFeatures();
            }
        }

        // Main script
        function harmonizePlaceGo(item, useFlag, actions) {
            actions = actions || []; // Used for collecting all actions to be applied to the model.

            var hpMode = {
                harmFlag: false,
                hlFlag: false,
                scanFlag: false
            };

            if ( useFlag.indexOf('harmonize') > -1 ) {
                hpMode.harmFlag = true;
                phlog('Running script on selected place...');
            }
            if ( useFlag.indexOf('highlight') > -1 ) {
                hpMode.hlFlag = true;
            }
            if ( useFlag.indexOf('scan') > -1 ) {
                hpMode.scanFlag = true;
            }

            // // If it's an unlocked parking lot, return with severity 4.
            // if (hpMode.hlFlag && item.isParkingLot() && item.attributes.lockRank === 0) {
            //     return 4;
            // }

            var placePL = getItemPL();  //  set up external post div and pull place PL
            // https://www.waze.com/editor/?env=usa&lon=-80.60757&lat=28.17850&layers=1957&zoom=4&segments=86124344&update_requestsFilter=false&problemsFilter=false&mapProblemFilter=0&mapUpdateRequestFilter=0&venueFilter=1
            placePL = placePL.replace(/\&layers=[^\&]+(\&?)/g, '$1');  // remove Permalink Layers
            placePL = placePL.replace(/\&update_requestsFilter=[^\&]+(\&?)/g, '$1');  // remove Permalink Layers
            placePL = placePL.replace(/\&problemsFilter=[^\&]+(\&?)/g, '$1');  // remove Permalink Layers
            placePL = placePL.replace(/\&mapProblemFilter=[^\&]+(\&?)/g, '$1');  // remove Permalink Layers
            placePL = placePL.replace(/\&mapUpdateRequestFilter=[^\&]+(\&?)/g, '$1');  // remove Permalink Layers
            placePL = placePL.replace(/\&venueFilter=[^\&]+(\&?)/g, '$1');  // remove Permalink Layers
            var region, state2L, newPlaceURL, approveRegionURL, servID, useState = true;
            var gFormState = "";
            var PNHOrderNum = '', PNHNameTemp = '', PNHNameTempWeb = '';
            severityButt = 0;
            var customStoreFinder = false;  // switch indicating place-specific custom store finder url
            var customStoreFinderLocal = false;  // switch indicating place-specific custom store finder url with localization option (GPS/addr)
            var customStoreFinderURL = "";  // switch indicating place-specific custom store finder url
            var customStoreFinderLocalURL = "";  // switch indicating place-specific custom store finder url with localization option (GPS/addr)
            var fieldUpdateObject = {name: false, aliases: false, categories: false, brand: false, description: false, lockRank: false, address: false, url: false, phone: false, openingHours: false,
                                     services: { VALLET_SERVICE: false, DRIVETHROUGH: false, WI_FI: false, RESTROOMS: false, CREDIT_CARDS: false, RESERVATIONS: false,
                                                OUTSIDE_SEATING: false, AIR_CONDITIONING: false, PARKING_FOR_CUSTOMERS: false, DELIVERIES: false, TAKE_AWAY: false, WHEELCHAIR_ACCESSIBLE: false, DISABILITY_PARKING: false }
                                    };
            // Whitelist: reset flags
            currentWL = {
                dupeWL: [],
                restAreaName: false,
                restAreaSpec: false,
                unmappedRegion: false,
                gasMismatch: false,
                hotelMkPrim: false,
                changeToOffice: false,
                changeToDoctorClinic: false,
                changeHMC2PetVet: false,
                changeSchool2Offices: false,
                pointNotArea: false,
                areaNotPoint: false,
                HNWL: false,
                hnNonStandard: false,
                HNRange: false,
                parentCategory: false,
                suspectDesc: false,
                resiTypeName: false,
                longURL: false,
                gasNoBrand: false,
                subFuel: false,
                hotelLocWL: false,
                localizedName: false,
                urlWL: false,
                phoneWL: false,
                aCodeWL: false,
                noHours: false,
                nameMissing: false,
                plaNameMissing: false,
                extProviderMissing: false
            };

            // **** Set up banner action buttons.  Structure:
            // active: false until activated in the script
            // severity: determines the color of the banners and whether locking occurs
            // message: The text before the button option
            // value: button text
            // title: tooltip text
            // action: The action that happens if the button is pressed
            // WL terms are for whitelisting
            bannButt = {
                hnDashRemoved: {
                    active: false, severity: 0, message: "Dash removed from house number. Verify"
                },

                fullAddressInference: {  // no WL
                    active: false, severity: 3, message: 'Missing address was inferred from nearby segments. Verify the address and run script again.'
                },

                nameMissing: {  // no WL
                    active: false, severity: 3, message: 'Name is missing.'
                },

                plaNameMissing: {
                    active: false, severity: 1, message: 'Name is missing.'
                    // WLactive: false, WLmessage: '', WLtitle: 'Whitelist missing name',
                    // WLaction: function() {
                    //     wlKeyName = 'plaNameMissing';
                    //     whitelistAction(itemID, wlKeyName);
                    //     harmonizePlaceGo(item, 'harmonize');
                    // }
                },

                hoursOverlap: {  // no WL
                    active: false, severity: 3, message: 'Overlapping hours of operation. Place might not save.'
                },

                unmappedRegion: {
                    active: false, severity: 3, message: 'This category is usually not mapped in this region.',
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist unmapped category',
                    WLaction: function() {
                        wlKeyName = 'unmappedRegion';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                restAreaName: {
                    active: false, severity: 3, message: 'Rest area name is out of spec. Use the Rest Area wiki button below to view formats.',
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist rest area name',
                    WLaction: function() {
                        wlKeyName = 'restAreaName';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                restAreaNoTransportation: {
                    active: false, severity: 2, message: 'Rest areas should not use the Transportation category.', value: 'Remove it?',
                    action: function() {
                        var ix = newCategories.indexOf('TRANSPORTATION');
                        if (ix > -1) {
                            newCategories.splice(ix, 1);
                            var actions = [];
                            actions.push(new UpdateObject(item, { categories: newCategories }));
                            executeMultiAction(actions);
                            harmonizePlaceGo(item,'harmonize');
                            //applyHighlightsTest(item);
                        }
                    }
                },
                
                restAreaGas: { // no WL
                    active: false, severity: 3, message: 'Gas stations at Rest Areas should be separate area places.'
                },

                restAreaSpec: {  // if it appears to be a rest area
                    active: false, severity: 3, message: "Is this a rest area?", value: "Yes", title: 'Update with proper categories and services.',
                    action: function() {
                        var actions = [];
                        // update categories according to spec
                        newCategories = insertAtIX(newCategories,"SCENIC_LOOKOUT_VIEWPOINT",1);  // Insert/move SCENIC_LOOKOUT_VIEWPOINT category in the 2nd position

                        actions.push(new UpdateObject(item, { categories: newCategories }));
                        fieldUpdateObject.categories='#dfd';
                        // make it 24/7
                        actions.push(new UpdateObject(item, { openingHours: [{days: [1,2,3,4,5,6,0], fromHour: "00:00", toHour: "00:00"}] }));
                        fieldUpdateObject.openingHours='#dfd';
                        //highlightChangedFields(fieldUpdateObject,hpMode);

                        bannServ.add247.checked = true;
                        bannServ.addParking.actionOn(actions);  // add parking service
                        bannServ.addWheelchair.actionOn(actions);  // add parking service
                        bannButt.restAreaSpec.active = false;  // reset the display flag

                        executeMultiAction(actions);

                        _disableHighlightTest = true;
                        harmonizePlaceGo(item,'harmonize');
                        _disableHighlightTest = false;
                        applyHighlightsTest(item);
                    },
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist place',
                    WLaction: function() {
                        wlKeyName = 'restAreaSpec';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                gasMismatch: {  // if the gas brand and name don't match
                    active: false, severity: 3, message: "Gas name and brand don't match.  Move brand to name?", value: "Yes", title: 'Change the primary name to the brand and make the current name the alt-name.',
                    action: function() {
                        newAliases = insertAtIX(newAliases, newName, 0);
                        for (var naix=0; naix<newAliases.length; naix++) {
                            newAliases[naix] = toTitleCase(newAliases[naix]);
                        }
                        newName = item.attributes.brand;
                        newAliases = removeSFAliases(newName, newAliases);
                        W.model.actionManager.add(new UpdateObject(item, { name: newName, aliases: newAliases }));
                        fieldUpdateObject.name='#dfd';
                        fieldUpdateObject.aliases='#dfd';
                        highlightChangedFields(fieldUpdateObject,hpMode);
                        bannButt.gasMismatch.active = false;  // reset the display flag
                    },
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist gas brand mismatch',
                    WLaction: function() {
                        wlKeyName = 'gasMismatch';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                gasUnbranded: {  // no WL
                    active: false, severity: 3, message: '"Unbranded" should not be used for the station brand. Change to correct brand or use the blank entry at the top of the brand list.'
                },

                gasMkPrim: {  // no WL
                    active: false, severity: 3,  message: "Gas Station is not the primary category", value: "Fix", title: 'Make the Gas Station category the primary category.',
                    action: function() {
                        newCategories = insertAtIX(newCategories,"GAS_STATION",0);  // Insert/move Gas category in the first position
                        var actions = [];
                        actions.push(new UpdateObject(item, { categories: newCategories }));
                        fieldUpdateObject.categories='#dfd';
                        bannButt.gasMkPrim.active = false;  // reset the display flag
                        executeMultiAction(actions);
                        harmonizePlaceGo(item,'harmonize');
                    }
                },

                hotelMkPrim: {
                    active: false, severity: 3, message: "Hotel category is not first", value: "Fix", title: 'Make the Hotel category the primary category.',
                    action: function() {
                        newCategories = insertAtIX(newCategories,"HOTEL",0);  // Insert/move Hotel category in the first position
                        var actions = [];
                        actions.push(new UpdateObject(item, { categories: newCategories }));
                        fieldUpdateObject.categories='#dfd';
                        bannButt.hotelMkPrim.active = false;  // reset the display flag
                        executeMultiAction(actions);
                        harmonizePlaceGo(item,'harmonize');
                    },
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist hotel as secondary category',
                    WLaction: function() {
                        wlKeyName = 'hotelMkPrim';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                changeToPetVet: {
                    active: false, severity: 3, message: "This looks like it should be a Pet/Veterinarian category. Change?", value: "Yes", title: 'Change to Pet/Veterinarian Category',
                    action: function() {
                        var idx = newCategories[newCategories.indexOf('HOSPITAL_MEDICAL_CARE')];
                        if (idx === -1) idx = newCategories[newCategories.indexOf('HOSPITAL_URGENT_CARE')];
                        if (idx > -1) {
                            newCategories[idx] = "PET_STORE_VETERINARIAN_SERVICES";
                            var actions = [];
                            actions.push(new UpdateObject(item, { categories: newCategories }));
                            fieldUpdateObject.categories='#dfd';
                            bannButt.changeToPetVet.active = false;  // reset the display flag
                            executeMultiAction(actions);
                        }
                        harmonizePlaceGo(item,'harmonize');  // Rerun the script to update fields and lock
                    },
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist PetVet category',
                    WLaction: function() {
                        wlKeyName = 'changeHMC2PetVet';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                changeSchool2Offices: {
                    active: false, severity: 3, message: "This doesn't look like it should be School category.", value: "Change to Office", title: 'Change to Offices Category',
                    action: function() {
                        newCategories[newCategories.indexOf('SCHOOL')] = "OFFICES";
                        var actions = [];
                        actions.push(new UpdateObject(item, { categories: newCategories }));
                        fieldUpdateObject.categories='#dfd';
                        bannButt.changeSchool2Offices.active = false;  // reset the display flag
                        executeMultiAction(actions);
                        harmonizePlaceGo(item,'harmonize');  // Rerun the script to update fields and lock
                    },
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist School category',
                    WLaction: function() {
                        wlKeyName = 'changeSchool2Offices';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                pointNotArea: {  // Area 2 Point button
                    active: false, severity: 3, message: "This category should be a point place.", value: "Change to point", title: 'Change to point place',
                    action: function() {
                        // If a stop point is set, use it for the point, else use Centroid
                        var newGeometry;
                        if (item.attributes.entryExitPoints.length > 0) {
                            newGeometry = item.attributes.entryExitPoints[0].point;
                        } else {
                            newGeometry = item.geometry.getCentroid();
                        }
                        updateFeatureGeometry (item, newGeometry);
                        bannButt.pointNotArea.active = false;
                    },
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist point (not area)',
                    WLaction: function() {
                        wlKeyName = 'pointNotArea';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                areaNotPoint: {  // Point 2 Area button
                    active: false, severity: 3, message: "This category should be an area place.", value: "Change to area", title: 'Change to Area',
                    action: function() {
                        // If a stop point is set, use it for the point, else use Centroid
                        updateFeatureGeometry (item, item.getPolygonGeometry());
                        bannButt.areaNotPoint.active = false;
                    },
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist area (not point)',
                    WLaction: function() {
                        wlKeyName = 'areaNotPoint';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                hnMissing: {
                    active: false, severity: 3, message: 'No HN: <input type="text" id="WMEPH-HNAdd'+devVersStr+'" autocomplete="off" style="font-size:0.85em;width:100px;padding-left:3px;color:#000;background-color:#FDD">',
                    value: "Add", title: 'Add HN to place',
                    badInput: false,
                    action: function() {
                        var newHN = $('#WMEPH-HNAdd'+devVersStr).val();
                        newHN = newHN.replace(/ +/g, '');
                        phlogdev(newHN);
                        var hnTemp = newHN.replace(/[^\d]/g, '');
                        var hnTempDash = newHN.replace(/[^\d-]/g, '');
                        if (hnTemp > 0 && hnTemp < 1000000) {
                            harmonizePlaceGo(item,'harmonize', [new UpdateObject(item, { houseNumber: hnTempDash })]);  // Rerun the script to update fields and lock
                            fieldUpdateObject.address='#dfd';
                            bannButt.hnMissing.active = false;
                            badInput = false;
                        } else {
                            badInput = true;
                        }

                    },
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist empty HN',
                    WLaction: function() {
                        wlKeyName = 'HNWL';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                hnNonStandard: {
                    active: false, severity: 3, message: 'House number is non-standard.',
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist non-standard HN',
                    WLaction: function() {
                        wlKeyName = 'hnNonStandard';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                HNRange: {
                    active: false, severity: 2, message: 'House number seems out of range for the street name. Verify.', value: '',
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist HN range',
                    WLaction: function() {
                        wlKeyName = 'HNRange';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                // streetMissing: {  // no WL
                //     active: false, severity: 3, message: 'No street: <div class="ui-widget" style="display:inline;"><input id="WMEPH_missingStreet" style="color:#000;background-color:#FDD;width:140px;margin-right:3px;"></div><input class="btn btn-default btn-xs wmeph-btn disabled" id="WMEPH_addStreetBtn" title="Add street to place" type="button" value="Add" disabled>'
                // },

                streetMissing: {  // no WL
                    active: false, severity: 3, message: 'No street:', value: 'Edit address', title: "Edit address to add street.",
                    action: function() {
                        $('.nav-tabs a[href="#landmark-edit-general"]').trigger('click');
                        $('.waze-icon-edit').trigger('click');
                        if ($('.empty-street').prop('checked')) {
                            $('.empty-street').trigger('click');
                        }
                        $('.street-name').focus();
                    }
                },

                cityMissing: {  // no WL
                    active: false, severity: 3, message: 'No city:', value: 'Edit address', title: "Edit address to add city.",
                    action: function() {
                        $('.nav-tabs a[href="#landmark-edit-general"]').trigger('click');
                        $('.waze-icon-edit').trigger('click');
                        if ($('.empty-city').prop('checked')) {
                            $('.empty-city').trigger('click');
                        }
                        $('.city-name').focus();
                    }
                },

                bankType1: {   // no WL
                    active: false, severity: 3, message: 'Clarify the type of bank: the name has ATM but the primary category is Offices'
                },

                bankBranch: {  // no WL
                    active: false, severity: 1, message: "Is this a bank branch office? ", value: "Yes", title: "Is this a bank branch?",
                    action: function() {
                        newCategories = ["BANK_FINANCIAL","ATM"];  // Change to bank and atm cats
                        newName = newName.replace(/[\- (]*ATM[\- )]*/g, ' ').replace(/^ /g,'').replace(/ $/g,'');     // strip ATM from name if present
                        W.model.actionManager.add(new UpdateObject(item, { name: newName, categories: newCategories }));
                        fieldUpdateObject.name='#dfd';
                        fieldUpdateObject.categories='#dfd';
                        highlightChangedFields(fieldUpdateObject,hpMode);
                        bannButt.bankCorporate.active = false;   // reset the bank Branch display flag
                        bannButt.bankBranch.active = false;   // reset the bank Branch display flag
                        bannButt.standaloneATM.active = false;   // reset the standalone ATM display flag
                        bannButt.bankType1.active = false;  // remove bank type warning
                    }
                },

                standaloneATM: { // no WL
                    active: false, severity: 2, message: "Or is this a standalone ATM? ", value: "Yes", title: "Is this a standalone ATM with no bank branch?",
                    action: function() {
                        if (newName.indexOf("ATM") === -1) {
                            newName = newName + ' ATM';
                        }
                        newCategories = ["ATM"];  // Change to ATM only
                        W.model.actionManager.add(new UpdateObject(item, { name: newName, categories: newCategories }));
                        fieldUpdateObject.name='#dfd';
                        fieldUpdateObject.categories='#dfd';
                        highlightChangedFields(fieldUpdateObject,hpMode);
                        bannButt.bankCorporate.active = false;   // reset the bank Branch display flag
                        bannButt.bankBranch.active = false;   // reset the bank Branch display flag
                        bannButt.standaloneATM.active = false;   // reset the standalone ATM display flag
                        bannButt.bankType1.active = false;  // remove bank type warning
                    }
                },

                bankCorporate: {  // no WL
                    active: false, severity: 1, message: "Or is this the bank's corporate offices?", value: "Yes", title: "Is this the bank's corporate offices?",
                    action: function() {
                        newCategories = ["OFFICES"];  // Change to offices category
                        newName = newName.replace(/[\- (]*atm[\- )]*/ig, ' ').replace(/^ /g,'').replace(/ $/g,'').replace(/ {2,}/g,' ');     // strip ATM from name if present
                        W.model.actionManager.add(new UpdateObject(item, { name: newName + ' - Corporate Offices', categories: newCategories }));
                        fieldUpdateObject.name='#dfd';
                        fieldUpdateObject.categories='#dfd';
                        highlightChangedFields(fieldUpdateObject,hpMode);
                        bannButt.bankCorporate.active = false;   // reset the bank Branch display flag
                        bannButt.bankBranch.active = false;   // reset the bank Branch display flag
                        bannButt.standaloneATM.active = false;   // reset the standalone ATM display flag
                        bannButt.bankType1.active = false;  // remove bank type warning
                    }
                },

                catPostOffice: {  // no WL
                    active: false, severity: 2, message: 'If this is not a USPS post office, change the category, as "Post Office" is only used for USPS locations.'
                },

                ignEdited: {  // no WL
                    active: false, severity: 2, message: 'Last edited by an IGN editor'
                },

                wazeBot: {  // no WL
                    active: false, severity: 2, message: 'Edited last by an automated process. Please verify information is correct.'
                },

                parentCategory: {
                    active: false, severity: 2, message: 'This parent category is usually not mapped in this region.',
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist parent Category',
                    WLaction: function() {
                        wlKeyName = 'parentCategory';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                checkDescription: {  // no WL
                    active: false, severity: 2, message: 'Description field already contained info; PNH description was added in front of existing. Check for inconsistency or duplicate info.'
                },

                overlapping: {  // no WL
                    active: false, severity: 2, message: 'Place points are stacked up.'
                },

                suspectDesc: {  // no WL
                    active: false, severity: 2, message: 'Description field might contain copyrighted info.',
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist description',
                    WLaction: function() {
                        wlKeyName = 'suspectDesc';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                resiTypeName: {
                    active: false, severity: 2, message: 'The place name suggests a residential place or personalized place of work.  Please verify.',
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist Residential-type name',
                    WLaction: function() {
                        wlKeyName = 'resiTypeName';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                mismatch247: {  // no WL
                    active: false, severity: 2, message: 'Hours of operation listed as open 24hrs but not for all 7 days.'
                },

                phoneInvalid: {  // no WL
                    active: false, severity: 2, message: 'Phone invalid.'
                },

                areaNotPointMid: {
                    active: false, severity: 2, message: 'This category is usually an area place, but can be a point in some cases. Verify if point is appropriate.',
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist area (not point)',
                    WLaction: function() {
                        wlKeyName = 'areaNotPoint';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                pointNotAreaMid: {
                    active: false, severity: 2, message: 'This category is usually a point place, but can be an area in some cases. Verify if area is appropriate.',
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist point (not area)',
                    WLaction: function() {
                        wlKeyName = 'pointNotArea';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                longURL: {
                    active: false, severity: 1, message: 'Existing URL doesn\'t match the suggested PNH URL. Use the Place Website button below to verify. If existing URL is invalid:', value: "Use PNH URL", title: "Change URL to the PNH standard",
                    action: function() {
                        if (tempPNHURL !== '') {
                            W.model.actionManager.add(new UpdateObject(item, { url: tempPNHURL }));
                            fieldUpdateObject.url='#dfd';
                            highlightChangedFields(fieldUpdateObject,hpMode);
                            bannButt.longURL.active = false;
                            updateURL = true;
                        } else {
                            if (confirm('WMEPH: URL Matching Error!\nClick OK to report this error') ) {  // if the category doesn't translate, then pop an alert that will make a forum post to the thread
                                forumMsgInputs = {
                                    subject: 'WMEPH URL comparison Error report',
                                    message: 'Error report: URL comparison failed for "' + item.attributes.name + '"\nPermalink: ' + placePL
                                };
                                WMEPH_errorReport(forumMsgInputs);
                            }
                        }
                    },
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist existing URL',
                    WLaction: function() {
                        wlKeyName = 'longURL';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                gasNoBrand: {
                    active: false, severity: 1, message: 'Verify that gas station has no brand.',
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist no gas brand',
                    WLaction: function() {
                        wlKeyName = 'gasNoBrand';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                subFuel: {
                    active: false, severity: 1, message: 'Make sure this place is for the gas station itself and not the main store building.  Otherwise undo and check the categories.',
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist no gas brand',
                    WLaction: function() {
                        wlKeyName = 'subFuel';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                areaNotPointLow: {
                    active: false, severity: 1, message: 'This category is usually an area place, but can be a point in some cases. Verify if point is appropriate.',
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist area (not point)',
                    WLaction: function() {
                        wlKeyName = 'areaNotPoint';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                pointNotAreaLow: {
                    active: false, severity: 1, message: 'This category is usually a point place, but can be an area in some cases. Verify if area is appropriate.',
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist point (not area)',
                    WLaction: function() {
                        wlKeyName = 'pointNotArea';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                formatUSPS: {  // ### needs WL or not?
                    active: false, severity: 1, message: 'Localize the post office according to this region\'s standards for USPS locations (e.g., "US Post Office - Tampa")'
                },

                catHotel: {
                    active: false, severity: 0, message: 'Check hotel website for any name localization (e.g. Hilton - Tampa Airport)',
                    //WLactive: true, WLmessage: '', WLtitle: 'Whitelist hotel localization',
                    //WLaction: function() {
                    //    wlKeyName = 'hotelLocWL';
                    //    whitelistAction(itemID, wlKeyName);
                    //    harmonizePlaceGo(item, 'harmonize');
                    //}
                },

                localizedName: {
                    active: false, severity: 1, message: 'Place needs localization information',
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist localization',
                    WLaction: function() {
                        wlKeyName = 'localizedName';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                specCaseMessage: {  // no WL
                    active: false, severity: 1, message: 'WMEPH: placeholder (please report this error if you see this message)'
                },

                pnhCatMess: {  // no WL
                    active: false, severity: 0, message: 'WMEPH: placeholder (please report this error if you see this message)'
                },

                changeToHospitalUrgentCare: {
                    active: false, severity: 0, message: "", value: "Change to Hospital / Urgent Care", title: 'Change category to Hospital / Urgent Care',
                    action: function() {
                        var idx = newCategories.indexOf('HOSPITAL_MEDICAL_CARE');
                        if (idx === -1) idx = newCategories.indexOf('DOCTOR_CLINIC');
                        if (idx > -1) {
                            newCategories[idx] = "HOSPITAL_URGENT_CARE";
                            var actions = [];
                            actions.push(new UpdateObject(item, { categories: newCategories }));
                            fieldUpdateObject.categories='#dfd';
                            bannButt.changeToHospitalUrgentCare.active = false;  // reset the display flag
                            executeMultiAction(actions);
                        }
                        harmonizePlaceGo(item,'harmonize');  // Rerun the script to update fields and lock
                    },
                    WLactive: false, WLmessage: '', WLtitle: 'Whitelist category',
                    WLaction: function() {
                        wlKeyName = 'changetoHospitalUrgentCare';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                changeToDoctorClinic: {
                    active: false, severity: 0, message: "", value: "Change to Doctor / Clinic", title: 'Change category to Doctor / Clinic',
                    action: function() {
                        var actions = [];
                        ['HOSPITAL_MEDICAL_CARE', 'HOSPITAL_URGENT_CARE', 'OFFICES', 'PERSONAL_CARE'].forEach(function(cat) {
                            var idx = newCategories.indexOf(cat);
                            if (idx > -1) {
                                newCategories[idx] = "DOCTOR_CLINIC";
                                actions.push(new UpdateObject(item, { categories: newCategories }));
                            }
                        });
                        if (actions.length > 0) {
                            bannButt.changeToDoctorClinic.active = false;  // reset the display flag
                            fieldUpdateObject.categories='#dfd';
                            executeMultiAction(actions);
                        }
                        harmonizePlaceGo(item,'harmonize');  // Rerun the script to update fields and lock
                    },
                    WLactive: false, WLmessage: '', WLtitle: 'Whitelist category',
                    WLaction: function() {
                        wlKeyName = 'changeToDoctorClinic';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },
                specCaseMessageLow: {  // no WL
                    active: false, severity: 0, message: 'WMEPH: placeholder (please report this error if you see this message)'
                },

                extProviderMissing: {
                    active:false, severity:3, message:'No Google place link', value:'Nudge', title:'If no other properties need to be updated, click to nudge the place (force an edit).',
                    action: function() {
                        var UpdateFeatureGeometry = require('Waze/Action/UpdateFeatureGeometry');
                        var place = W.selectionManager.selectedItems[0];
                        // Use an exact clone of the original geometry to force an edit without actually changing anything.
                        var newGeom = place.geometry.clone();
                        var action = new UpdateFeatureGeometry(place.model, W.model.venues, place.geometry, newGeom);
                        W.model.actionManager.add(action);
                        harmonizePlaceGo(item,'harmonize');  // Rerun the script to update fields and lock
                    },
                    value2: 'Add', title2:'Add a link to a Google place', action2: function() {
                        $('div.external-providers-view a').focus().click();
                        setTimeout(function() {
                            $('div.external-providers-view > div > ul > div > li > div > a').last().mousedown();
                            $('.select2-input').last().focus().val(item.attributes.name).trigger('input');
                        }, 100);
                    }
                    // WLactive:true, WLmessage:'', //WLtitle:'Whitelist missing Google place link',
                    // WLaction: function() {
                    //     wlKeyName = 'extProviderMissing';
                    //     whitelistAction(itemID, wlKeyName);
                    // }
                },

                urlMissing: {
                    active: false, severity: 1, message: 'No URL: <input type="text" id="WMEPH-UrlAdd'+devVersStr+'" autocomplete="off" style="font-size:0.85em;width:100px;padding-left:3px;color:#000;background-color:#DDF">',
                    value: "Add", title: 'Add URL to place',
                    badInput: false,
                    action: function() {
                        var newUrlValue = $('#WMEPH-UrlAdd'+devVersStr).val();
                        var newUrl = normalizeURL(newUrlValue, true, false, item);
                        if ((!newUrl || newUrl.trim().length === 0) || newUrl === 'badURL') {
                            this.badInput = true;
                        } else {
                            phlogdev(newUrl);
                            W.model.actionManager.add(new UpdateObject(item, { url: newUrl }));
                            fieldUpdateObject.url='#dfd';
                            bannButt.urlMissing.active = false;
                            showOpenPlaceWebsiteButton();
                            this.badInput = false;
                        }
                    },
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist empty URL',
                    WLaction: function() {
                        wlKeyName = 'urlWL';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                phoneMissing: {
                    active: false, severity: 1, message: 'No ph#: <input type="text" id="WMEPH-PhoneAdd'+devVersStr+'" autocomplete="off" style="font-size:0.85em;width:100px;padding-left:3px;color:#000;background-color:#DDF">',
                    value: "Add", title: 'Add phone to place',
                    badInput: false,
                    action: function() {
                        var newPhoneVal = $('#WMEPH-PhoneAdd'+devVersStr).val();
                        var newPhone = normalizePhone(newPhoneVal, outputFormat, 'inputted', item);
                        if (newPhone === 'badPhone') {
                            this.badInput = true;
                        } else {
                            this.badInput = false;
                            phlogdev(newPhone);
                            if (countryCode === "USA" || countryCode === "CAN") {
                                if (newPhone !== null && newPhone.match(/[2-9]\d{2}/) !== null) {
                                    var areaCode = newPhone.match(/[2-9]\d{2}/)[0];
                                    if ( areaCodeList.indexOf(areaCode) === -1 ) {
                                        bannButt.badAreaCode.active = true;
                                        if (currentWL.aCodeWL) {
                                            bannButt.badAreaCode.WLactive = false;
                                        }
                                    }
                                }
                            }
                            W.model.actionManager.add(new UpdateObject(item, { phone: newPhone }));
                            fieldUpdateObject.phone='#dfd';
                            bannButt.phoneMissing.active = false;
                        }

                    },
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist empty phone',
                    WLaction: function() {
                        wlKeyName = 'phoneWL';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                badAreaCode: {
                    active: false, severity: 1, message: "Area Code mismatch ",
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist the area code',
                    WLaction: function() {
                        wlKeyName = 'aCodeWL';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                plaLotTypeMissing: {
                    active: false, severity: 3, message: 'Lot type: '
                },

                plaCostTypeMissing: {
                    active: false, severity: 1, message: 'Parking cost: '
                },

                plaPaymentTypeMissing: {
                    active: false, severity: 1, message: 'Select allowed payment type(s):<br>', value: 'Apply',
                    action: function() {
                        var cash = $('#wmeph-payment-cash').prop('checked');
                        var check = $('#wmeph-payment-check').prop('checked');
                        var credit = $('#wmeph-payment-credit').prop('checked');
                        if (cash || check || credit) {
                            var existingAttr = item.attributes.categoryAttributes.PARKING_LOT;
                            var newAttr = {};
                            if (existingAttr) {
                                for (var prop in existingAttr) {
                                    var value = existingAttr[prop];
                                    if (Array.isArray(value)) value = value.clone();
                                    newAttr[prop] = value;
                                };
                            }
                            newAttr.paymentType = [];
                            if (cash) newAttr.paymentType.push('CASH');
                            if (check) newAttr.paymentType.push('CHECKS');
                            if (credit) newAttr.paymentType.push('CREDIT');
                            W.model.actionManager.add(new UpdateObject(item, {'categoryAttributes': {PARKING_LOT: newAttr}}));
                            harmonizePlaceGo(item, 'harmonize');
                        }
                    }
                },

                plaLotElevationMissing: {
                    active: false, severity: 1, message: 'No lot elevation. Is it street level?', value: 'Yes', title: 'Click if street level parking only, or select other option(s) in the More Info tab.',
                    action: function() {
                        var existingAttr = item.attributes.categoryAttributes.PARKING_LOT;
                        var newAttr = {};
                        if (existingAttr) {
                            for (var prop in existingAttr) {
                                var value = existingAttr[prop];
                                if (Array.isArray(value)) value = value.clone();
                                newAttr[prop] = value;
                            };
                        }
                        newAttr.lotType = ['STREET_LEVEL'];
                        W.model.actionManager.add(new UpdateObject(item, {'categoryAttributes': {PARKING_LOT: newAttr}}));
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                plaSpaces: {
                    active: false, severity: 0, message: '# of Parking Spaces is set to 1-10.<br><b>If appropriate</b>, select another option:'
                },

                plaStopPointUnmoved: {
                    active: false, severity: 1, message: 'Stop point has not been moved.'
                },

                plaCanExitWhileClosed: {
                    active: false, severity: 0, message: 'Can cars exit when lot is closed? ', value: 'Yes', title: '',
                    action: function() {
                        var existingAttr = item.attributes.categoryAttributes.PARKING_LOT;
                        var newAttr = {};
                        if (existingAttr) {
                            for (var prop in existingAttr) {
                                var value = existingAttr[prop];
                                if (Array.isArray(value)) value = value.clone();
                                newAttr[prop] = value;
                            };
                        }
                        newAttr.canExitWhileClosed = true;
                        W.model.actionManager.add(new UpdateObject(item, {'categoryAttributes': {PARKING_LOT: newAttr}}));
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                plaHasAccessibleParking: {
                    active: false, severity: 0, message: 'Does this lot have handicapped parking? ', title: '', value: 'Yes',
                    action: function() {
                        var services = item.attributes.services;
                        if (services) {
                            services = services.clone();
                        } else {
                            services = [];
                        }
                        services.push('DISABILITY_PARKING');
                        //bannServ.addDisabilityParking.on();
                        W.model.actionManager.add(new UpdateObject(item, {'services': services}));
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                noHours: {
                    active: false, severity: 1, message: 'No hours: <input type="text" value="Paste Hours Here" id="WMEPH-HoursPaste'+devVersStr+'" autocomplete="off" style="font-size:0.85em;width:170px;padding-left:3px;color:#AAA">',
                    value: "Add hours", title: 'Add pasted hours to existing',
                    action: function() {
                        var pasteHours = $('#WMEPH-HoursPaste'+devVersStr).val();
                        phlogdev(pasteHours);
                        $('.nav-tabs a[href="#landmark-edit-more-info"]').tab('show');
                        pasteHours = pasteHours + ',' + getOpeningHours(item).join(',');
                        var hoursObjectArray = parseHours(pasteHours);
                        if (hoursObjectArray !== false) {
                            phlogdev(hoursObjectArray);
                            W.model.actionManager.add(new UpdateObject(item, { openingHours: hoursObjectArray }));
                            fieldUpdateObject.openingHours='#dfd';
                            highlightChangedFields(fieldUpdateObject,hpMode);
                            harmonizePlaceGo(item, 'harmonize');
                        } else {
                            phlog('Can\'t parse those hours');
                            bannButt.noHours.severity = 1;
                            bannButt.noHours.WLactive = true;
                            bannButt.noHours.message = 'Hours: <input type="text" value="Can\'t parse, try again" id="WMEPH-HoursPaste'+devVersStr+'" style="width:170px;padding-left:3px;color:#AAA">';
                        }
                    },
                    value2: "Replace all hours", title2: 'Replace existing hours with pasted hours',
                    action2: function() {
                        var pasteHours = $('#WMEPH-HoursPaste'+devVersStr).val();
                        phlogdev(pasteHours);
                        $('.nav-tabs a[href="#landmark-edit-more-info"]').tab('show');
                        var hoursObjectArray = parseHours(pasteHours);
                        if (hoursObjectArray !== false) {
                            phlogdev(hoursObjectArray);
                            item.attributes.openingHours.push.apply(item.attributes.openingHours, hoursObjectArray);
                            W.model.actionManager.add(new UpdateObject(item, { openingHours: hoursObjectArray }));
                            fieldUpdateObject.openingHours='#dfd';
                            highlightChangedFields(fieldUpdateObject,hpMode);
                            harmonizePlaceGo(item, 'harmonize');
                        } else {
                            phlog('Can\'t parse those hours');
                            bannButt.noHours.severity = 1;
                            bannButt.noHours.WLactive = true;
                            bannButt.noHours.message = 'Hours: <input type="text" value="Can\'t parse, try again" id="WMEPH-HoursPaste'+devVersStr+'" style="width:170px;padding-left:3px;color:#AAA">';
                        }

                    },
                    WLactive: true, WLmessage: '', WLtitle: 'Whitelist no Hours',
                    WLaction: function() {
                        wlKeyName = 'noHours';
                        whitelistAction(itemID, wlKeyName);
                        harmonizePlaceGo(item, 'harmonize');
                    }
                },

                resiTypeNameSoft: {  // no WL
                    active: false, severity: 0, message: 'The place name suggests a residential place or personalized place of work.  Please verify.'
                },

                localURL: {  // no WL
                    active: false, severity: 0, message: 'Some locations for this business have localized URLs, while others use the primary corporate site. Check if a local URL applies to this location.'
                },

                babiesRUs: {  // no WL
                    active: false, severity: 0, message: 'If there is a Toys R Us at this location, make it the primary name and Babies R Us the alt name and rerun the script.'
                },

                lockRPP: {    // no WL
                    active: false, severity: 0, message: 'Lock this residential point?', value: "Lock", title: 'Lock the residential point',
                    action: function() {
                        var RPPlevelToLock = $("#RPPLockLevel :selected").val() || defaultLockLevel + 1;
                        phlogdev('RPPlevelToLock: '+ RPPlevelToLock);

                        RPPlevelToLock = RPPlevelToLock -1 ;
                        W.model.actionManager.add(new UpdateObject(item, { lockRank: RPPlevelToLock }));
                        // no field highlight here
                        bannButt.lockRPP.message = 'Current lock: '+ (parseInt(item.attributes.lockRank)+1) +'. '+RPPLockString+' ?';
                    }
                },

                addAlias: {    // no WL
                    active: false, severity: 0, message: "Is " + optionalAlias + " at this location?", value: "Yes", title: 'Add ' + optionalAlias,
                    action: function() {
                        newAliases = insertAtIX(newAliases,optionalAlias,0);
                        if (specCases.indexOf('altName2Desc') > -1 &&  item.attributes.description.toUpperCase().indexOf(optionalAlias.toUpperCase()) === -1 ) {
                            newDescripion = optionalAlias + '\n' + newDescripion;
                            W.model.actionManager.add(new UpdateObject(item, { description: newDescripion }));
                            fieldUpdateObject.description='#dfd';
                            highlightChangedFields(fieldUpdateObject,hpMode);
                        }
                        newAliases = removeSFAliases(newName, newAliases);
                        W.model.actionManager.add(new UpdateObject(item, { aliases: newAliases }));
                        fieldUpdateObject.aliases='#dfd';
                        highlightChangedFields(fieldUpdateObject,hpMode);
                        bannButt.addAlias.active = false;  // reset the display flag
                    }
                },

                addCat2: {   // no WL
                    active: false, severity: 0, message: "Is there a " + newCategories[0] + " at this location?", value: "Yes", title: 'Add ' + newCategories[0],
                    action: function() {
                        newCategories.push.apply(newCategories,altCategories);
                        W.model.actionManager.add(new UpdateObject(item, { categories: newCategories }));
                        fieldUpdateObject.categories='#dfd';
                        highlightChangedFields(fieldUpdateObject,hpMode);
                        bannButt.addCat2.active = false;  // reset the display flag
                    }
                },

                addPharm: {   // no WL
                    active: false, severity: 0, message: "Is there a Pharmacy at this location?", value: "Yes", title: 'Add Pharmacy category',
                    action: function() {
                        newCategories = insertAtIX(newCategories, 'PHARMACY', 1);
                        W.model.actionManager.add(new UpdateObject(item, { categories: newCategories }));
                        fieldUpdateObject.categories='#dfd';
                        highlightChangedFields(fieldUpdateObject,hpMode);
                        bannButt.addPharm.active = false;  // reset the display flag
                    }
                },

                addSuper: {   // no WL
                    active: false, severity: 0, message: "Does this location have a supermarket?", value: "Yes", title: 'Add Supermarket category',
                    action: function() {
                        newCategories = insertAtIX(newCategories, 'SUPERMARKET_GROCERY', 1);
                        W.model.actionManager.add(new UpdateObject(item, { categories: newCategories }));
                        fieldUpdateObject.categories='#dfd';
                        highlightChangedFields(fieldUpdateObject,hpMode);
                        bannButt.addSuper.active = false;  // reset the display flag
                    }
                },

                appendAMPM: {   // no WL
                    active: false, severity: 0, message: "Is there an ampm at this location?", id: "appendAMPM", value: "Yes", title: 'Add ampm to the place',
                    action: function() {
                        newCategories = insertAtIX(newCategories, 'CONVENIENCE_STORE', 1);
                        newName = 'ARCO ampm';
                        newURL = 'ampm.com';
                        W.model.actionManager.add(new UpdateObject(item, { name: newName, url: newURL, categories: newCategories }));
                        fieldUpdateObject.name='#dfd';
                        fieldUpdateObject.url='#dfd';
                        fieldUpdateObject.categories='#dfd';
                        highlightChangedFields(fieldUpdateObject,hpMode);
                        bannButt.appendAMPM.active = false;  // reset the display flag
                        bannButt.addConvStore.active = false;  // also reset the addConvStore display flag
                    }
                },

                addATM: {    // no WL
                    active: false, severity: 0, message: "ATM at location? ", value: "Yes", title: "Add the ATM category to this place",
                    action: function() {
                        newCategories = insertAtIX(newCategories,"ATM",1);  // Insert ATM category in the second position
                        W.model.actionManager.add(new UpdateObject(item, { categories: newCategories }));
                        fieldUpdateObject.categories='#dfd';
                        highlightChangedFields(fieldUpdateObject,hpMode);
                        bannButt.addATM.active = false;   // reset the display flag
                    }
                },

                addConvStore: {  // no WL
                    active: false, severity: 0, message: "Add convenience store category? ", value: "Yes", title: "Add the Convenience Store category to this place",
                    action: function() {
                        newCategories = insertAtIX(newCategories,"CONVENIENCE_STORE",1);  // Insert C.S. category in the second position
                        W.model.actionManager.add(new UpdateObject(item, { categories: newCategories }));
                        fieldUpdateObject.categories='#dfd';
                        highlightChangedFields(fieldUpdateObject,hpMode);
                        bannButt.addConvStore.active = false;   // reset the display flag
                    }
                },

                isitUSPS: {  // no WL
                    active: false, severity: 0, message: "Is this a USPS location? ", value: "Yes", title: "Is this a USPS location?",
                    action: function() {
                        bannServ.addAC.actionOn();
                        bannServ.addCreditCards.actionOn();
                        bannServ.addParking.actionOn();
                        bannServ.addDeliveries.actionOn();
                        bannServ.addWheelchair.actionOn();
                        W.model.actionManager.add(new UpdateObject(item, { url: "usps.com" }));
                        fieldUpdateObject.url='#dfd';
                        highlightChangedFields(fieldUpdateObject,hpMode);
                        bannButt.isitUSPS.active = false;
                    }
                },

                STC: {    // no WL
                    active: false, severity: 0, message: "Force Title Case: ", value: "Yes", title: "Force Title Case to InterNal CaPs",
                    action: function() {
                        newName = toTitleCaseStrong(item.attributes.name);  // Get the Strong Title Case name
                        if (newName !== item.attributes.name) {  // if they are not equal
                            W.model.actionManager.add(new UpdateObject(item, { name: newName }));
                            fieldUpdateObject.name='#dfd';
                            highlightChangedFields(fieldUpdateObject,hpMode);
                        }
                        bannButt.STC.active = false;  // reset the display flag
                    }
                },

                sfAliases: {    // no WL
                    active: false, severity: 0, message: 'Unnecessary aliases were removed.'
                },

                placeMatched: {    // no WL
                    active: false, severity: 0, message: 'Place matched from PNH data.'
                },

                placeLocked: {    // no WL
                    active: false, severity: 0, message: 'Place locked.'
                },

                webSearch: {  // no WL
                    active: false, severity: 0, message: "", value: "Web Search", title: "Search the web for this place.  Do not copy info from 3rd party sources!",
                    action: function() {
                        if (localStorage.getItem(GLinkWarning) !== '1') {
                            if (confirm('***Please DO NOT copy info from Google or third party sources.*** This link is to help you find the business webpage.\nClick OK to agree and continue.') ) {  // if the category doesn't translate, then pop an alert that will make a forum post to the thread
                                localStorage.setItem(GLinkWarning, '1');
                            }
                        }
                        if (localStorage.getItem(GLinkWarning) === '1') {
                            if ( $("#WMEPH-WebSearchNewTab" + devVersStr).prop('checked') ) {
                                window.open(buildGLink(newName,addr,item.attributes.houseNumber));
                            } else {
                                window.open(buildGLink(newName,addr,item.attributes.houseNumber), searchResultsWindowName, searchResultsWindowSpecs);
                            }
                        }
                    }
                },

                // NOTE: This is now only used to display the store locator button.  It can be updated to remove/change anything that doesn't serve that purpose.
                PlaceWebsite: {    // no WL
                    active: false, severity: 0, message: "", value: "Place Website", title: "Direct link to place website",
                    action: function() {
                        var openPlaceWebsiteURL, linkProceed = true;
                        if (updateURL) {
                            // replace WME url with storefinder URLs if they are in the PNH data
                            if (customStoreFinder) {
                                openPlaceWebsiteURL = customStoreFinderURL;
                            } else if (customStoreFinderLocal) {
                                openPlaceWebsiteURL = customStoreFinderLocalURL;
                            }
                            // If the user has 'never' opened a localized store finder URL, then warn them (just once)
                            if (localStorage.getItem(SFURLWarning) === '0' && customStoreFinderLocal) {
                                linkProceed = false;
                                if (confirm('***Localized store finder sites often show multiple nearby results. Please make sure you pick the right location.\nClick OK to agree and continue.') ) {  // if the category doesn't translate, then pop an alert that will make a forum post to the thread
                                    localStorage.setItem(SFURLWarning, '1');  // prevent future warnings
                                    linkProceed = true;
                                }
                            }
                        } else {
                            if (/^https?:\/\//.test(item.attributes.url)) {
                                openPlaceWebsiteURL = item.attributes.url;
                            } else {
                                openPlaceWebsiteURL = 'http://' + item.attributes.url;
                            }
                        }
                        // open the link depending on new window setting
                        if (linkProceed) {
                            if ( $("#WMEPH-WebSearchNewTab" + devVersStr).prop('checked') ) {
                                window.open(openPlaceWebsiteURL);
                            } else {
                                window.open(openPlaceWebsiteURL, searchResultsWindowName, searchResultsWindowSpecs);
                            }
                        }
                    }
                },

                NewPlaceSubmit: {    // no WL
                    active: false, severity: 0, message: "No PNH match. If it's a chain: ", value: "Submit new chain data", title: "Submit info for a new chain through the linked form",
                    action: function() {
                        window.open(newPlaceURL);
                    }
                },

                ApprovalSubmit: {  // no WL
                    active: false, severity: 0, message: "PNH data exists but is not approved for this region: ", value: "Request approval", title: "Request region/country approval of this place",
                    action: function() {
                        if ( PMUserList.hasOwnProperty(region) && PMUserList[region].approvalActive ) {
                            var forumPMInputs = {
                                subject: '' + PNHOrderNum + ' PNH approval for "' + PNHNameTemp + '"',
                                message: 'Please approve "' + PNHNameTemp + '" for the ' + region + ' region.  Thanks\n \nPNH order number: ' + PNHOrderNum + '\n \nPermalink: ' + placePL + '\n \nPNH Link: ' + USAPNHMasURL,
                                preview: 'Preview', attach_sig: 'on'
                            };
                            forumPMInputs['address_list[u]['+PMUserList[region].modID+']'] = 'to';  // Sends a PM to the regional mod instead of the submission form
                            WMEPH_newForumPost('https://www.waze.com/forum/ucp.php?i=pm&mode=compose', forumPMInputs);
                        } else {
                            window.open(approveRegionURL);
                        }
                    }
                }
            };  // END bannButt definitions

            bannButtHL = bannButt;

            bannButt2 = {
                placesWiki: {
                    active: true, severity: 0, message: "", value: "Places wiki", title: "Open the places wiki page",
                    action: function() {
                        window.open(placesWikiURL);
                    }
                },
                restAreaWiki: {
                    active: false, severity: 0, message: "", value: "Rest Area wiki", title: "Open the Rest Area wiki page",
                    action: function() {
                        window.open(restAreaWikiURL);
                    }
                },
                clearWL: {
                    active: false, severity: 0, message: "", value: "Clear Place whitelist", title: "Clear all Whitelisted fields for this place",
                    action: function() {
                        if (confirm('Are you sure you want to clear all whitelisted fields for this place?') ) {  // misclick check
                            delete venueWhitelist[itemID];
                            saveWL_LS(true);
                            harmonizePlaceGo(item,'harmonize');  // rerun the script to check all flags again
                        }
                    }
                },  // END placesWiki definition
                PlaceErrorForumPost: {
                    active: true, severity: 0, message: "", value: "Report script error", title: "Report a script error",
                    action: function() {
                        var forumMsgInputs = {
                            subject: 'WMEPH Bug report: Scrpt Error',
                            message: 'Script version: ' + WMEPHversion + devVersStr + '\nPermalink: ' + placePL + '\nPlace name: ' + item.attributes.name + '\nCountry: ' + addr.country.name + '\n--------\nDescribe the error:  \n '
                        };
                        WMEPH_errorReport(forumMsgInputs);
                    }
                },
                reportBetaIssue: {
                    active: isDevVersion, severity: 0, message: "", value: "Report beta issue", title: "Report beta issue in GitHub",
                    action: function() {
                        window.open('https://github.com/WazeUSA/WME-Place-Harmonizer/issues');
                    }
                },
                whatsNew: {
                    active: false, severity: 0, message: "", value: "*Recent script updates*", title: "Open a list of recent script updates",
                    action: function() {
                        alert(WMEPHWhatsNew);
                        localStorage.setItem('WMEPH-featuresExamined'+devVersStr, '1');
                        bannButt2.whatsNew.active = false;
                    }
                }
            };  // END bannButt2 definitions

            function addUpdateAction(updateObj, actions) {
                var action = new UpdateObject(item, updateObj);
                if (actions) {
                    actions.push(action);
                } else {
                    W.model.actionManager.add(action);
                }
            }

            function setServiceChecked(servBtn, checked, actions) {
                var servID = WMEServicesArray[servBtn.servIDIndex];
                var checkboxChecked = $("#service-checkbox-"+servID).prop('checked');
                var toggle = typeof checked === 'undefined';
                var noAdd = false;
                checked = (toggle) ? !servBtn.checked : checked;
                if (checkboxChecked === servBtn.checked && checkboxChecked !== checked) {
                    servBtn.checked = checked;
                    var services;
                    if (actions) {
                        for (var i=0; i<actions.length; i++ ) {
                            var existingAction = actions[i];
                            if (existingAction.newAttributes && existingAction.newAttributes.services) {
                                services = existingAction.newAttributes.services;
                            }
                        }
                    }
                    if (!services) {
                        services = item.attributes.services.slice(0);
                    } else {
                        noAdd = services.indexOf(servID) > -1;
                    }
                    if (checked) {
                        services.push(servID);
                    } else {
                        var index = services.indexOf(servID);
                        if (index > -1) {
                            services.splice(index, 1);
                        }
                    }
                    if (!noAdd) {
                        addUpdateAction({services:services}, actions);
                        fieldUpdateObject.services[servID] = '#dfd';
                    }
                }
                updateServicesChecks(bannServ);
                if (!toggle) servBtn.active = checked;
            }

            // set up banner action buttons.  Structure:
            // active: false until activated in the script
            // checked: whether the service is already set on the place. Determines grey vs white icon color
            // icon: button icon name
            // value: button text  (Not used for Icons, keep as backup
            // title: tooltip text
            // action: The action that happens if the button is pressed
            bannServ = {
                addValet: {  // append optional Alias to the name
                    active: false, checked: false, icon: "serv-valet", w2hratio: 50/50, value: "Valet", title: 'Valet', servIDIndex: 0,
                    action: function(actions, checked) {
                        setServiceChecked(this, checked, actions);
                    },
                    pnhOverride: false,
                    actionOn: function(actions) {
                        this.action(actions, true);
                    },
                    actionOff: function(actions) {
                        this.action(actions, false);
                    }
                },
                addDriveThru: {  // append optional Alias to the name
                    active: false, checked: false, icon: "serv-drivethru", w2hratio: 78/50, value: "DriveThru", title: 'Drive-Thru', servIDIndex: 1,
                    action: function(actions, checked) {
                        setServiceChecked(this, checked, actions);
                    },
                    pnhOverride: false,
                    actionOn: function(actions) {
                        this.action(actions, true);
                    },
                    actionOff: function(actions) {
                        this.action(actions, false);
                    }
                },
                addWiFi: {  // append optional Alias to the name
                    active: false, checked: false, icon: "serv-wifi", w2hratio: 67/50, value: "WiFi", title: 'WiFi', servIDIndex: 2,
                    action: function(actions, checked) {
                        setServiceChecked(this, checked, actions);
                    },
                    pnhOverride: false,
                    actionOn: function(actions) {
                        this.action(actions, true);
                    },
                    actionOff: function(actions) {
                        this.action(actions, false);
                    }
                },
                addRestrooms: {  // append optional Alias to the name
                    active: false, checked: false, icon: "serv-restrooms", w2hratio: 49/50, value: "Restroom", title: 'Restrooms', servIDIndex: 3,
                    action: function(actions, checked) {
                        setServiceChecked(this, checked, actions);
                    },
                    pnhOverride: false,
                    actionOn: function(actions) {
                        this.action(actions, true);
                    },
                    actionOff: function(actions) {
                        this.action(actions, false);
                    }
                },
                addCreditCards: {  // append optional Alias to the name
                    active: false, checked: false, icon: "serv-credit", w2hratio: 73/50, value: "CC", title: 'Credit Cards', servIDIndex: 4,
                    action: function(actions, checked) {
                        setServiceChecked(this, checked, actions);
                    },
                    pnhOverride: false,
                    actionOn: function(actions) {
                        this.action(actions, true);
                    },
                    actionOff: function(actions) {
                        this.action(actions, false);
                    }
                },
                addReservations: {  // append optional Alias to the name
                    active: false, checked: false, icon: "serv-reservations", w2hratio: 55/50, value: "Reserve", title: 'Reservations', servIDIndex: 5,
                    action: function(actions, checked) {
                        setServiceChecked(this, checked, actions);
                    },
                    pnhOverride: false,
                    actionOn: function(actions) {
                        this.action(actions, true);
                    },
                    actionOff: function(actions) {
                        this.action(actions, false);
                    }
                },
                addOutside: {  // append optional Alias to the name
                    active: false, checked: false, icon: "serv-outdoor", w2hratio: 73/50, value: "OusideSeat", title: 'Outside Seating', servIDIndex: 6,
                    action: function(actions, checked) {
                        setServiceChecked(this, checked, actions);
                    },
                    pnhOverride: false,
                    actionOn: function(actions) {
                        this.action(actions, true);
                    },
                    actionOff: function(actions) {
                        this.action(actions, false);
                    }
                },
                addAC: {  // append optional Alias to the name
                    active: false, checked: false, icon: "serv-ac", w2hratio: 50/50, value: "AC", title: 'AC', servIDIndex: 7,
                    action: function(actions, checked) {
                        setServiceChecked(this, checked, actions);
                    },
                    pnhOverride: false,
                    actionOn: function(actions) {
                        this.action(actions, true);
                    },
                    actionOff: function(actions) {
                        this.action(actions, false);
                    }
                },
                addParking: {  // append optional Alias to the name
                    active: false, checked: false, icon: "serv-parking", w2hratio: 46/50, value: "Parking", title: 'Parking', servIDIndex: 8,
                    action: function(actions, checked) {
                        setServiceChecked(this, checked, actions);
                    },
                    pnhOverride: false,
                    actionOn: function(actions) {
                        this.action(actions, true);
                    },
                    actionOff: function(actions) {
                        this.action(actions, false);
                    }
                },
                addDeliveries: {  // append optional Alias to the name
                    active: false, checked: false, icon: "serv-deliveries", w2hratio: 86/50, value: "Delivery", title: 'Deliveries', servIDIndex: 9,
                    action: function(actions, checked) {
                        setServiceChecked(this, checked, actions);
                    },
                    pnhOverride: false,
                    actionOn: function(actions) {
                        this.action(actions, true);
                    },
                    actionOff: function(actions) {
                        this.action(actions, false);
                    }
                },
                addTakeAway: {  // append optional Alias to the name
                    active: false, checked: false, icon: "serv-takeaway", w2hratio: 34/50, value: "TakeOut", title: 'Take Out', servIDIndex: 10,
                    action: function(actions, checked) {
                        setServiceChecked(this, checked, actions);
                    },
                    pnhOverride: false,
                    actionOn: function(actions) {
                        this.action(actions, true);
                    },
                    actionOff: function(actions) {
                        this.action(actions, false);
                    }
                },
                addWheelchair: {  // add service
                    active: false, checked: false, icon: "serv-wheelchair", w2hratio: 50/50, value: "WhCh", title: 'Wheelchair Accessible', servIDIndex: 11,
                    action: function(actions, checked) {
                        setServiceChecked(this, checked, actions);
                    },
                    pnhOverride: false,
                    actionOn: function(actions) {
                        this.action(actions, true);
                    },
                    actionOff: function(actions) {
                        this.action(actions, false);
                    }
                },
                addDisabilityParking: {
                    active: false, checked: false, icon: "serv-wheelchair", w2hratio: 50/50, value: "DisabilityParking", title: 'Disability Parking', servIDIndex: 12,
                    action: function(actions, checked) {
                        setServiceChecked(this, checked, actions);
                    },
                    pnhOverride: false,
                    actionOn: function(actions) {
                        this.action(actions, true);
                    },
                    actionOff: function(actions) {
                        this.action(actions, false);
                    }
                },
                add247: {  // add 24/7 hours
                    active: false, checked: false, icon: "serv-247", w2hratio: 73/50, value: "247", title: 'Hours: Open 24\/7',
                    action: function(actions) {
                        if (!bannServ.add247.checked) {
                            addUpdateAction({ openingHours: [{days: [1,2,3,4,5,6,0], fromHour: "00:00", toHour: "00:00"}] }, actions);
                            fieldUpdateObject.openingHours='#dfd';
                            highlightChangedFields(fieldUpdateObject,hpMode);
                            bannServ.add247.checked = true;
                            bannButt.noHours.active = false;
                        }
                    },
                    actionOn: function(actions) {
                        this.action(actions);
                    }
                }
            };  // END bannServ definitions

            if (hpMode.harmFlag) {
                // Update icons to reflect current WME place services
                updateServicesChecks(bannServ);

                // Turn on New Features Button if not looked at yet
                if (localStorage.getItem('WMEPH-featuresExamined'+devVersStr) === '0') {
                    bannButt2.whatsNew.active = true;
                }
                //Setting switch for the Places Wiki button
                if ( $("#WMEPH-HidePlacesWiki" + devVersStr).prop('checked') ) {
                    bannButt2.placesWiki.active = false;
                }
                // provide Google search link to places
                if (devUser || betaUser || usrRank > 1) {  // enable the link for all places, for R2+ and betas
                    bannButt.webSearch.active = true;
                }
                // reset PNH lock level
                PNHLockLevel = -1;
            }


            // get GPS lat/long coords from place, call as itemGPS.lat, itemGPS.lon
            var itemGPS = OpenLayers.Layer.SphericalMercator.inverseMercator(item.attributes.geometry.getCentroid().x,item.attributes.geometry.getCentroid().y);
            var lockOK = true;  // if nothing goes wrong, then place will be locked
            var categories = item.attributes.categories;
            newCategories = categories.slice(0);
            newName = item.attributes.name;
            newName = toTitleCase(newName);
            // var nameShort = newName.replace(/[^A-Za-z]/g, '');  // strip non-letters for PNH name searching
            // var nameNumShort = newName.replace(/[^A-Za-z0-9]/g, ''); // strip non-letters/non-numbers for PNH name searching
            newAliases = item.attributes.aliases.slice(0);
            for (var naix=0; naix<newAliases.length; naix++) {
                newAliases[naix] = toTitleCase(newAliases[naix]);
            }
            var brand = item.attributes.brand;
            var newDescripion = item.attributes.description;
            newURL = item.attributes.url;
            var newURLSubmit = "";
            if (newURL !== null && newURL !== '') {
                newURLSubmit = newURL;
            }
            newPhone = item.attributes.phone;
            var addr = item.getAddress();
            if ( addr.hasOwnProperty('attributes') ) {
                addr = addr.attributes;
            }
            var PNHNameRegMatch;

            // Some user submitted places have no data in the country, state and address fields.
            if (!addr.state || !addr.country) {
                if (hpMode.harmFlag) {
                    if (W.map.getZoom() < 4 ) {
                        if ( $("#WMEPH-EnableIAZoom" + devVersStr).prop('checked') ) {
                            W.map.moveTo(W.selectionManager.selectedItems[0].model.geometry.getCentroid().toLonLat(), 5);
                            return;
                        } else {
                            alert("No address and the state cannot be determined. Please zoom in and rerun the script. You can enable autozoom for this type of case in the options.");
                            return;  //  don't run the rest of the script
                        }
                    } else {
                        var inferredAddress = WMEPH_inferAddress(7);  // Pull address info from nearby segments

                        if (inferredAddress && inferredAddress.state && inferredAddress.country ) {
                            addr = inferredAddress;
                            if ( $("#WMEPH-AddAddresses" + devVersStr).prop('checked') ) {  // update the item's address if option is enabled
                                updateAddress(item, addr, actions);
                                fieldUpdateObject.address='#dfd';
                                if (item.attributes.houseNumber && item.attributes.houseNumber.replace(/[^0-9A-Za-z]/g,'').length > 0 ) {
                                    bannButt.fullAddressInference.active = true;
                                    lockOK = false;
                                }
                            } else {
                                bannButt.cityMissing.active = true;
                                lockOK = false;
                            }
                        } else {  //  if the inference doesn't work...
                            alert("Place has no address data. Please set the address and rerun the script.");
                            return;  //  don't run the rest of the script
                        }
                    }
                } else if (hpMode.hlFlag) {
                    if ( item.attributes.adLocked ) {
                        return 'adLock';
                    } else if ( item.attributes.categories.indexOf("HOSPITAL_MEDICAL_CARE") > -1 || item.attributes.categories.indexOf("HOSPITAL_URGENT_CARE") > -1 || item.isGasStation() ) {
                        phlogdev('Unaddressed HMC/GS');
                        return 5;
                    } else {
                        return 3;
                    }
                }
            } else if (hpMode.harmFlag && $('.editing').length === 1 ) {
                $('.save-button').click();  // apply any address changes
            }

            // Check parking lot attributes.
            if (item.isParkingLot()) {
                bannServ.addDisabilityParking.active = true;
                var catAttr = item.attributes.categoryAttributes;
                var parkAttr = catAttr ? catAttr.PARKING_LOT : undefined;
                if (!parkAttr || !parkAttr.costType || parkAttr.costType === 'UNKNOWN') {
                    bannButt.plaCostTypeMissing.active = true;
                    [
                        ['FREE','Free','Free'],
                        ['LOW','$','Low'],
                        ['MODERATE','$$','Moderate'],
                        ['EXPENSIVE','$$$','Expensive']
                    ].forEach(function(btnInfo) {
                        if (btnIdx === 3) $btnDiv.append('<br>');
                        bannButt.plaCostTypeMissing.message +=
                            $('<button>', {id: 'wmeph_' + btnInfo[0], class: 'wmeph-pla-cost-type-btn', title: btnInfo[2]})
                            .text(btnInfo[1])
                            .css({padding:'3px', height:'20px', lineHeight:'0px', marginRight:'2px',
                                  marginBottom:'1px', marginTop:'2px', fontWeight:'900', fontSize:'.96em'})
                            .prop('outerHTML');
                    });
                    lockOK = false;
                }
                if (!parkAttr || !parkAttr.lotType || parkAttr.lotType.length === 0) {
                    bannButt.plaLotElevationMissing.active = true;
                    lockOK = false;
                }
                if (!parkAttr || !parkAttr.estimatedNumberOfSpots || parkAttr.estimatedNumberOfSpots === 'R_1_TO_10') {
                    bannButt.plaSpaces.active = true;
                    var $btnDiv = $('<div>');
                    var btnIdx = 0;
                    [
                        ['R_11_TO_30','11-30'],
                        ['R_31_TO_60','31-60'],
                        ['R_61_TO_100','61-100'],
                        ['R_101_TO_300','101-300'],
                        ['R_301_TO_600','301-600'],
                        ['R_600_PLUS','601+']
                    ].forEach(function(btnInfo) {
                        if (btnIdx === 3) $btnDiv.append('<br>');
                        $btnDiv.append(
                            $('<button>', {id: 'wmeph_' + btnInfo[0], class: 'wmeph-pla-spaces-btn'})
                            .text(btnInfo[1])
                            .css({padding:'3px', height:'20px', lineHeight:'0px', marginRight:'2px',
                                  marginBottom:'1px', marginTop:'2px', fontWeight:'900', fontSize:'.96em', width:'64px'})
                        );
                        btnIdx++;
                    });
                    bannButt.plaSpaces.message += $btnDiv.prop('outerHTML');
                }
                if (!parkAttr || !parkAttr.parkingType) {
                    bannButt.plaLotTypeMissing.active = true;
                    [
                        ['PUBLIC','Public'],
                        ['RESTRICTED','Restricted'],
                        ['PRIVATE','Private']
                    ].forEach(function(btnInfo) {
                        if (btnIdx === 3) $btnDiv.append('<br>');
                        bannButt.plaLotTypeMissing.message +=
                            $('<button>', {id: 'wmeph_' + btnInfo[0], class: 'wmeph-pla-lot-type-btn'})
                            .text(btnInfo[1])
                            .css({padding:'3px', height:'20px', lineHeight:'0px', marginRight:'2px',
                                  marginBottom:'1px', marginTop:'2px', fontWeight:'900', fontSize:'.96em'})
                            .prop('outerHTML');
                    });
                }
                if (!item.attributes.entryExitPoints || item.attributes.entryExitPoints.length === 0) {
                    bannButt.plaStopPointUnmoved.active = true;
                }
                if (parkAttr && !parkAttr.canExitWhileClosed && ($('#WMEPH-ShowPLAExitWhileClosed' + devVersStr).prop('checked') || !(isAlwaysOpen(item) || item.attributes.openingHours.length === 0))) {
                    bannButt.plaCanExitWhileClosed.active = true;
                }
                if (parkAttr && parkAttr.costType && parkAttr.costType !== 'FREE' && parkAttr.costType !== 'UNKNOWN' && (!parkAttr.paymentType || parkAttr.paymentType.length === 0)) {
                    bannButt.plaPaymentTypeMissing.active = true;
                    var $pmtDiv = $('<div>').css({display:'inline'});
                    ['Cash', 'Check', 'Credit'].forEach(function(text) {
                        var id = 'wmeph-payment-' + text.toLowerCase();
                        $pmtDiv.append(
                            $('<div>', {class: 'form-control'}).css({padding: '0px', backgroundColor: 'inherit', color: 'white', display: 'inline', border: 'none', marginRight: '5px'}).append(
                                $('<input>', {id: id, type: 'checkbox'}).css({marginRight: '0px'}),
                                $('<label>', {for: id}).text(text)
                            )
                        );
                    });
                    bannButt.plaPaymentTypeMissing.message += $pmtDiv.prop('outerHTML');
                }
                var services = item.attributes.services;
                if (!(services && services.indexOf("DISABILITY_PARKING") > -1)) {
                    bannButt.plaHasAccessibleParking.active = true;
                }
            }

            if (item.attributes.categories.indexOf("HOSPITAL_MEDICAL_CARE") > -1) {
                if (hpMode.hlFlag) {
                    return 4;
                } else {
                    bannButt.changeToHospitalUrgentCare.message = 'There are more precise categories available for this place type.  Please update the category:';
                    bannButt.changeToHospitalUrgentCare.active = true;
                    bannButt.changeToHospitalUrgentCare.severity = 3;
                    delete bannButt.changeToHospitalUrgentCare.WLactive;
                    bannButt.changeToDoctorClinic.active = true;
                    bannButt.changeToDoctorClinic.severity = 3;
                    delete bannButt.changeToDoctorClinic.WLactive;
                    lockOK = false;
                }
            } else if (hpMode.harmFlag && item.attributes.categories.indexOf("DOCTOR_CLINIC") > -1) {
                bannButt.changeToHospitalUrgentCare.message = "If this place provides emergency medical care:";
                bannButt.changeToHospitalUrgentCare.active = true;
                bannButt.changeToHospitalUrgentCare.severity = 0;
            } else if (hpMode.harmFlag && item.attributes.categories.indexOf("HOSPITAL_URGENT_CARE") > -1) {
                //bannButt.changeToDoctorClinic.active = true;
                //bannButt.changeToDoctorClinic.severity = 0;
            }


            // Whitelist breakout if place exists on the Whitelist and the option is enabled
            itemID = item.attributes.id;
            var WLMatch = false;
            if ( venueWhitelist.hasOwnProperty(itemID) ) {
                if ( hpMode.harmFlag || ( hpMode.hlFlag && !$("#WMEPH-DisableWLHL" + devVersStr).prop('checked')  ) ) {
                    WLMatch = true;
                    // Enable the clear WL button if any property is true
                    for (var WLKey in venueWhitelist[itemID]) {  // loop thru the venue WL keys
                        if ( venueWhitelist[itemID].hasOwnProperty(WLKey) && (venueWhitelist[itemID][WLKey].active || false) ) {
                            bannButt2.clearWL.active = true;
                            currentWL[WLKey] = venueWhitelist[itemID][WLKey];  // update the currentWL settings
                        }
                    }
                    if (venueWhitelist[itemID].hasOwnProperty('dupeWL') && venueWhitelist[itemID].dupeWL.length > 0) {
                        bannButt2.clearWL.active = true;
                        currentWL.dupeWL = venueWhitelist[itemID].dupeWL;
                    }
                    // Update address and GPS info for the place
                    venueWhitelist[itemID].city = addr.city.attributes.name;  // Store city for the venue
                    venueWhitelist[itemID].state = addr.state.name;  // Store state for the venue
                    venueWhitelist[itemID].country = addr.country.name;  // Store country for the venue
                    venueWhitelist[itemID].gps = itemGPS;  // Store GPS coords for the venue
                }
            }

            // Country restrictions
            var countryCode;
            if (addr.country.name === "United States") {
                countryCode = "USA";
            } else if (addr.country.name === "Canada") {
                countryCode = "CAN";
            } else if (addr.country.name === "American Samoa") {
                countryCode = "USA";
                useState = false;
            } else if (addr.country.name === "Guam") {
                countryCode = "USA";
                useState = false;
            } else if (addr.country.name === "Northern Mariana Islands") {
                countryCode = "USA";
                useState = false;
            } else if (addr.country.name === "Puerto Rico") {
                countryCode = "USA";
                useState = false;
            } else if (addr.country.name === "Virgin Islands (U.S.)") {
                countryCode = "USA";
                useState = false;
            } else {
                if (hpMode.harmFlag) {
                    alert("At present this script is not supported in this country.");
                }
                return 3;
            }

            // Parse state-based data
            state2L = "Unknown"; region = "Unknown";
            for (var usdix=1; usdix<USA_STATE_DATA.length; usdix++) {
                stateDataTemp = USA_STATE_DATA[usdix].split("|");
                if (addr.state.name === stateDataTemp[ps_state_ix]) {
                    state2L = stateDataTemp[ps_state2L_ix];
                    region = stateDataTemp[ps_region_ix];
                    gFormState = stateDataTemp[ps_gFormState_ix];
                    if (stateDataTemp[ps_defaultLockLevel_ix].match(/[1-5]{1}/) !== null) {
                        defaultLockLevel = stateDataTemp[ps_defaultLockLevel_ix] - 1;  // normalize by -1
                    } else {
                        if (hpMode.harmFlag) {
                            alert('Lock level sheet data is not correct');
                        } else if (hpMode.hlFlag) {
                            return '3';
                        }
                    }
                    areaCodeList = areaCodeList+','+stateDataTemp[ps_areacode_ix];
                    break;
                }
                // If State is not found, then use the country
                if (addr.country.name === stateDataTemp[ps_state_ix]) {
                    state2L = stateDataTemp[ps_state2L_ix];
                    region = stateDataTemp[ps_region_ix];
                    gFormState = stateDataTemp[ps_gFormState_ix];
                    if (stateDataTemp[ps_defaultLockLevel_ix].match(/[1-5]{1}/) !== null) {
                        defaultLockLevel = stateDataTemp[ps_defaultLockLevel_ix] - 1;  // normalize by -1
                    } else {
                        if (hpMode.harmFlag) {
                            alert('Lock level sheet data is not correct');
                        } else if (hpMode.hlFlag) {
                            return '3';
                        }
                    }
                    areaCodeList = areaCodeList+','+stateDataTemp[ps_areacode_ix];
                    break;
                }

            }
            if (state2L === "Unknown" || region === "Unknown") {    // if nothing found:
                if (hpMode.harmFlag) {
                    if (confirm('WMEPH: Localization Error!\nClick OK to report this error') ) {  // if the category doesn't translate, then pop an alert that will make a forum post to the thread
                        forumMsgInputs = {
                            subject: 'WMEPH Localization Error report',
                            message: 'Error report: Localization match failed for "' + addr.state.name + '".'
                        };
                        WMEPH_errorReport(forumMsgInputs);
                    }
                }
                return 3;
            }

            // If no gas station name, replace with brand name
            if (hpMode.harmFlag && item.isGasStation() && (!newName || newName.trim().length === 0) && item.attributes.brand) {
                newName = item.attributes.brand;
                actions.push(new UpdateObject(item, {name: newName }));
                fieldUpdateObject.name = '#dfd';
            }

            var isLocked = item.attributes.lockRank >= (PNHLockLevel > -1 ? PNHLockLevel : defaultLockLevel);

            // Clear attributes from residential places
            if (item.attributes.residential) {
                if (hpMode.harmFlag) {
                    if ( !$("#WMEPH-AutoLockRPPs" + devVersStr).prop('checked') ) {
                        lockOK = false;
                    }
                    if (item.attributes.name !== '') {  // Set the residential place name to the address (to clear any personal info)
                        phlogdev("Residential Name reset");
                        actions.push(new UpdateObject(item, {name: ''}));
                        // no field HL
                    }
                    newCategories = ["RESIDENCE_HOME"];
                    // newDescripion = null;
                    if (item.attributes.description !== null && item.attributes.description !== "") {  // remove any description
                        phlogdev("Residential description cleared");
                        actions.push(new UpdateObject(item, {description: null}));
                        // no field HL
                    }
                    // newPhone = null;
                    if (item.attributes.phone !== null && item.attributes.phone !== "") {  // remove any phone info
                        phlogdev("Residential Phone cleared");
                        actions.push(new UpdateObject(item, {phone: null}));
                        // no field HL
                    }
                    // newURL = null;
                    if (item.attributes.url !== null && item.attributes.url !== "") {  // remove any url
                        phlogdev("Residential URL cleared");
                        actions.push(new UpdateObject(item, {url: null}));
                        // no field HL
                    }
                    if (item.attributes.services.length > 0) {
                        phlogdev("Residential services cleared");
                        actions.push(new UpdateObject(item, {services: [] }));
                        // no field HL
                    }
                }
                if (item.is2D()) {
                    bannButt.pointNotArea.active = true;
                }
            } else if (item.isParkingLot() || (newName && newName.trim().length > 0)) {  // for non-residential places
                if (usrRank >= 2 && item.areExternalProvidersEditable() && !(item.isParkingLot() && $('#WMEPH-DisablePLAExtProviderCheck' + devVersStr).prop('checked'))) {
                    var provIDs = item.attributes.externalProviderIDs;
                    if (!provIDs || provIDs.length === 0) {
                        var lastUpdated = item.isNew() ? Date.now() : item.attributes.updatedOn ? item.attributes.updatedOn : item.attributes.createdOn;
                        var weeksSinceLastUpdate = (Date.now() - lastUpdated) / 604800000;
                        if (isLocked && weeksSinceLastUpdate >= 26 && !item.isUpdated() && (!actions || actions.length === 0)) {
                            bannButt.extProviderMissing.severity = 3;
                            bannButt.extProviderMissing.message += ' and place has not been edited for over 6 months. Edit a property (or nudge) and save to reset the 6 month timer: ';
                        } else if (!isLocked) {
                            bannButt.extProviderMissing.severity = 1;  // This will be changed to 3 later if the user does not choose to lock the place.
                            bannButt.extProviderMissing.message += '.';
                            delete bannButt.extProviderMissing.value;
                            delete bannButt.extProviderMissing.action;
                        } else {
                            bannButt.extProviderMissing.severity = 1;
                            bannButt.extProviderMissing.message += '.';
                            delete bannButt.extProviderMissing.value;
                            delete bannButt.extProviderMissing.action;
                        }
                        // bannButt.extProviderMissing.WLactive = null;  // 4-29-2017 (mapomatic) Decided to remove WL on this, but leaving it in the bannButt code in case it needs to be resurrected.
                        bannButt.extProviderMissing.active = true;
                    }
                }

                // Place Harmonization
                var PNHMatchData;
                if (hpMode.harmFlag) {
                    if (item.isParkingLot()) {
                        PNHMatchData = ['NoMatch'];
                    } else {
                        PNHMatchData = harmoList(newName,state2L,region,countryCode,newCategories,item);  // check against the PNH list
                    }
                } else if (hpMode.hlFlag) {
                    PNHMatchData = ['Highlight'];
                }
                PNHNameRegMatch = false;
                if (PNHMatchData[0] !== "NoMatch" && PNHMatchData[0] !== "ApprovalNeeded" && PNHMatchData[0] !== "Highlight" ) { // *** Replace place data with PNH data
                    PNHNameRegMatch = true;
                    var showDispNote = true;
                    var updatePNHName = true;
                    // Break out the data headers
                    var PNH_DATA_headers;
                    if (countryCode === "USA") {
                        PNH_DATA_headers = USA_PNH_DATA[0].split("|");
                    } else if (countryCode === "CAN") {
                        PNH_DATA_headers = CAN_PNH_DATA[0].split("|");
                    }
                    var ph_name_ix = PNH_DATA_headers.indexOf("ph_name");
                    var ph_aliases_ix = PNH_DATA_headers.indexOf("ph_aliases");
                    var ph_category1_ix = PNH_DATA_headers.indexOf("ph_category1");
                    var ph_category2_ix = PNH_DATA_headers.indexOf("ph_category2");
                    var ph_description_ix = PNH_DATA_headers.indexOf("ph_description");
                    var ph_url_ix = PNH_DATA_headers.indexOf("ph_url");
                    var ph_order_ix = PNH_DATA_headers.indexOf("ph_order");
                    // var ph_notes_ix = PNH_DATA_headers.indexOf("ph_notes");
                    var ph_speccase_ix = PNH_DATA_headers.indexOf("ph_speccase");
                    var ph_sfurl_ix = PNH_DATA_headers.indexOf("ph_sfurl");
                    var ph_sfurllocal_ix = PNH_DATA_headers.indexOf("ph_sfurllocal");
                    // var ph_forcecat_ix = PNH_DATA_headers.indexOf("ph_forcecat");
                    var ph_displaynote_ix = PNH_DATA_headers.indexOf("ph_displaynote");

                    // Retrieve the data from the PNH line(s)
                    var nsMultiMatch = false, orderList = [];
                    //phlogdev('Number of PNH matches: ' + PNHMatchData.length);
                    if (PNHMatchData.length > 1) { // If multiple matches, then
                        var brandParent = -1, pmdTemp, pmdSpecCases, PNHMatchDataHold = PNHMatchData[0].split('|');
                        for (var pmdix=0; pmdix<PNHMatchData.length; pmdix++) {  // For each of the matches,
                            pmdTemp = PNHMatchData[pmdix].split('|');  // Split the PNH data line
                            orderList.push(pmdTemp[ph_order_ix]);  // Add Order number to a list
                            if (pmdTemp[ph_speccase_ix].match(/brandParent(\d{1})/) !== null) {  // If there is a brandParent flag, prioritize by highest match
                                pmdSpecCases = pmdTemp[ph_speccase_ix].match(/brandParent(\d{1})/)[1];
                                if (pmdSpecCases > brandParent) {  // if the match is more specific than the previous ones:
                                    brandParent = pmdSpecCases;  // Update the brandParent level
                                    PNHMatchDataHold = pmdTemp;  // Update the PNH data line
                                    //phlogdev('pmdSpecCases: ' + pmdSpecCases);
                                }
                            } else {  // if any item has no brandParent structure, use highest brandParent match but post an error
                                nsMultiMatch = true;
                            }
                        }
                        PNHMatchData = PNHMatchDataHold;
                    } else {
                        PNHMatchData = PNHMatchData[0].split('|');  // Single match just gets direct split
                    }



                    var priPNHPlaceCat = catTranslate(PNHMatchData[ph_category1_ix]);  // translate primary category to WME code

                    // if the location has multiple matches, then pop an alert that will make a forum post to the thread
                    if (nsMultiMatch) {
                        if (confirm('WMEPH: Multiple matches found!\nDouble check the script changes.\nClick OK to report this situation.') ) {
                            forumMsgInputs = {
                                subject: 'Order Nos. "' + orderList.join(', ') + '" WMEPH Multiple match report',
                                message: 'Error report: PNH Order Nos. "' + orderList.join(', ') + '" are ambiguous multiple matches.\n \nExample Permalink: ' + placePL + ''
                            };
                            WMEPH_errorReport(forumMsgInputs);
                        }
                    }

                    // Check special cases
                    var specCases, scFlag, localURLcheck = '';
                    if (ph_speccase_ix > -1) {  // If the special cases column exists
                        specCases = PNHMatchData[ph_speccase_ix];  // pulls the speccases field from the PNH line
                        if (specCases !== "0" && specCases !== "") {
                            specCases = specCases.replace(/, /g, ",").split(",");  // remove spaces after commas and split by comma
                        }
                        for (var scix = 0; scix < specCases.length; scix++) {
                            // find any button/message flags in the special case (format: buttOn_xyzXyz, etc.)
                            if ( specCases[scix].match(/^buttOn_/g) !== null ) {
                                scFlag = specCases[scix].match(/^buttOn_(.+)/i)[1];
                                bannButt[scFlag].active = true;
                            } else if ( specCases[scix].match(/^buttOff_/g) !== null ) {
                                scFlag = specCases[scix].match(/^buttOff_(.+)/i)[1];
                                bannButt[scFlag].active = false;
                            } else if ( specCases[scix].match(/^messOn_/g) !== null ) {
                                scFlag = specCases[scix].match(/^messOn_(.+)/i)[1];
                                bannButt[scFlag].active = true;
                            } else if ( specCases[scix].match(/^messOff_/g) !== null ) {
                                scFlag = specCases[scix].match(/^messOff_(.+)/i)[1];
                                bannButt[scFlag].active = false;
                            } else if ( specCases[scix].match(/^psOn_/g) !== null ) {
                                scFlag = specCases[scix].match(/^psOn_(.+)/i)[1];
                                bannServ[scFlag].actionOn(actions);
                                bannServ[scFlag].pnhOverride = true;
                            } else if ( specCases[scix].match(/^psOff_/g) !== null ) {
                                scFlag = specCases[scix].match(/^psOff_(.+)/i)[1];
                                bannServ[scFlag].actionOff(actions);
                                bannServ[scFlag].pnhOverride = true;
                            }
                            // parseout localURL data if exists (meaning place can have a URL distinct from the chain URL
                            if ( specCases[scix].match(/^localURL_/g) !== null ) {
                                localURLcheck = specCases[scix].match(/^localURL_(.+)/i)[1];
                            }
                            // parse out optional alt-name
                            if ( specCases[scix].match(/^optionAltName<>(.+)/g) !== null ) {
                                optionalAlias = specCases[scix].match(/^optionAltName<>(.+)/i)[1];
                                if (newAliases.indexOf(optionalAlias) === -1) {
                                    bannButt.addAlias.active = true;
                                }
                            }
                            // Gas Station forceBranding
                            if ( ["GAS_STATION"].indexOf(priPNHPlaceCat) > -1 && specCases[scix].match(/^forceBrand<>(.+)/i) !== null ) {
                                var forceBrand = specCases[scix].match(/^forceBrand<>(.+)/i)[1];
                                if (item.attributes.brand !== forceBrand) {
                                    actions.push(new UpdateObject(item, { brand: forceBrand }));
                                    fieldUpdateObject.brand='#dfd';
                                    phlogdev('Gas brand updated from PNH');
                                }
                            }
                            // Check Localization
                            if ( specCases[scix].match(/^checkLocalization<>(.+)/i) !== null ) {
                                updatePNHName = false;
                                var baseName = specCases[scix].match(/^checkLocalization<>(.+)/i)[1];
                                var baseNameRE = new RegExp(baseName, 'g');
                                if ( newName.match(baseNameRE) === null ) {
                                    bannButt.localizedName.active = true;
                                    if (currentWL.localizedName) {
                                        bannButt.localizedName.WLactive = false;
                                    }
                                    //bannButt.PlaceWebsite.value = 'Place Website';
                                    if (ph_displaynote_ix > -1 && PNHMatchData[ph_displaynote_ix] !== '0' && PNHMatchData[ph_displaynote_ix] !== '') {
                                        bannButt.localizedName.message = PNHMatchData[ph_displaynote_ix];
                                    }
                                }
                                showDispNote = false;
                            }

                            // Prevent name change
                            if ( specCases[scix].match(/keepName/g) !== null ) {
                                updatePNHName = false;
                            }
                        }
                    }

                    // If it's a place that also sells fuel, enable the button
                    if ( PNHMatchData[ph_speccase_ix] === 'subFuel' && newName.toUpperCase().indexOf('GAS') === -1 && newName.toUpperCase().indexOf('FUEL') === -1 ) {
                        bannButt.subFuel.active = true;
                        if (currentWL.subFuel) {
                            bannButt.subFuel.WLactive = false;
                        }
                    }

                    // Display any notes for the specific place
                    if (showDispNote && ph_displaynote_ix > -1 && PNHMatchData[ph_displaynote_ix] !== '0' && PNHMatchData[ph_displaynote_ix] !== '' ) {
                        if ( containsAny(specCases,['pharmhours']) ) {
                            if ( item.attributes.description.toUpperCase().indexOf('PHARMACY') === -1 || ( item.attributes.description.toUpperCase().indexOf('HOURS') === -1 && item.attributes.description.toUpperCase().indexOf('HRS') === -1 ) ) {
                                bannButt.specCaseMessage.active = true;
                                bannButt.specCaseMessage.message = PNHMatchData[ph_displaynote_ix];
                            }
                        } else if ( containsAny(specCases,['drivethruhours']) ) {
                            if ( item.attributes.description.toUpperCase().indexOf('DRIVE') === -1 || ( item.attributes.description.toUpperCase().indexOf('HOURS') === -1 && item.attributes.description.toUpperCase().indexOf('HRS') === -1 ) ) {
                                if ( $("#service-checkbox-"+'DRIVETHROUGH').prop('checked') ) {
                                    bannButt.specCaseMessage.active = true;
                                    bannButt.specCaseMessage.message = PNHMatchData[ph_displaynote_ix];
                                } else {
                                    bannButt.specCaseMessageLow.active = true;
                                    bannButt.specCaseMessageLow.message = PNHMatchData[ph_displaynote_ix];
                                }
                            }
                        } else {
                            bannButt.specCaseMessageLow.active = true;
                            bannButt.specCaseMessageLow.message = PNHMatchData[ph_displaynote_ix];
                        }
                    }

                    // Localized Storefinder code:
                    if (ph_sfurl_ix > -1) {  // if the sfurl column exists...
                        if ( ph_sfurllocal_ix > -1 && PNHMatchData[ph_sfurllocal_ix] !== "" && PNHMatchData[ph_sfurllocal_ix] !== "0" ) {
                            if ( !bannButt.localizedName.active ) {
                                bannButt.PlaceWebsite.value = "Store Locator (L)";
                                bannButt.PlaceWebsite.active = true;
                            }
                            var tempLocalURL = PNHMatchData[ph_sfurllocal_ix].replace(/ /g,'').split("<>");
                            var searchStreet = "", searchCity = "", searchState = "";
                            if ("string" === typeof addr.street.name) {
                                searchStreet = addr.street.name;
                            }
                            var searchStreetPlus = searchStreet.replace(/ /g, "+");
                            searchStreet = searchStreet.replace(/ /g, "%20");
                            if ("string" === typeof addr.city.attributes.name) {
                                searchCity = addr.city.attributes.name;
                            }
                            var searchCityPlus = searchCity.replace(/ /g, "+");
                            searchCity = searchCity.replace(/ /g, "%20");
                            if ("string" === typeof addr.state.name) {
                                searchState = addr.state.name;
                            }
                            var searchStatePlus = searchState.replace(/ /g, "+");
                            searchState = searchState.replace(/ /g, "%20");

                            for (var tlix = 1; tlix<tempLocalURL.length; tlix++) {
                                if (tempLocalURL[tlix] === 'ph_streetName') {
                                    customStoreFinderLocalURL = customStoreFinderLocalURL + searchStreet;
                                } else if (tempLocalURL[tlix] === 'ph_streetNamePlus') {
                                    customStoreFinderLocalURL = customStoreFinderLocalURL + searchStreetPlus;
                                } else if (tempLocalURL[tlix] === 'ph_cityName') {
                                    customStoreFinderLocalURL = customStoreFinderLocalURL + searchCity;
                                } else if (tempLocalURL[tlix] === 'ph_cityNamePlus') {
                                    customStoreFinderLocalURL = customStoreFinderLocalURL + searchCityPlus;
                                } else if (tempLocalURL[tlix] === 'ph_stateName') {
                                    customStoreFinderLocalURL = customStoreFinderLocalURL + searchState;
                                } else if (tempLocalURL[tlix] === 'ph_stateNamePlus') {
                                    customStoreFinderLocalURL = customStoreFinderLocalURL + searchStatePlus;
                                } else if (tempLocalURL[tlix] === 'ph_state2L') {
                                    customStoreFinderLocalURL = customStoreFinderLocalURL + state2L;
                                } else if (tempLocalURL[tlix] === 'ph_latitudeEW') {
                                    //customStoreFinderLocalURL = customStoreFinderLocalURL + itemGPS[0];
                                } else if (tempLocalURL[tlix] === 'ph_longitudeNS') {
                                    //customStoreFinderLocalURL = customStoreFinderLocalURL + itemGPS[1];
                                } else if (tempLocalURL[tlix] === 'ph_latitudePM') {
                                    customStoreFinderLocalURL = customStoreFinderLocalURL + itemGPS.lat;
                                } else if (tempLocalURL[tlix] === 'ph_longitudePM') {
                                    customStoreFinderLocalURL = customStoreFinderLocalURL + itemGPS.lon;
                                } else if (tempLocalURL[tlix] === 'ph_latitudePMBuffMin') {
                                    customStoreFinderLocalURL = customStoreFinderLocalURL + (itemGPS.lat-0.15).toString();
                                } else if (tempLocalURL[tlix] === 'ph_longitudePMBuffMin') {
                                    customStoreFinderLocalURL = customStoreFinderLocalURL + (itemGPS.lon-0.15).toString();
                                } else if (tempLocalURL[tlix] === 'ph_latitudePMBuffMax') {
                                    customStoreFinderLocalURL = customStoreFinderLocalURL + (itemGPS.lat+0.15).toString();
                                } else if (tempLocalURL[tlix] === 'ph_longitudePMBuffMax') {
                                    customStoreFinderLocalURL = customStoreFinderLocalURL + (itemGPS.lon+0.15).toString();
                                } else if (tempLocalURL[tlix] === 'ph_houseNumber') {
                                    customStoreFinderLocalURL = customStoreFinderLocalURL + item.attributes.houseNumber;
                                } else {
                                    customStoreFinderLocalURL = customStoreFinderLocalURL + tempLocalURL[tlix];
                                }
                            }
                            if ( customStoreFinderLocalURL.indexOf('http') !== 0 ) {
                                customStoreFinderLocalURL = 'http:\/\/' + customStoreFinderLocalURL;
                            }
                            customStoreFinderLocal = true;
                        } else if (PNHMatchData[ph_sfurl_ix] !== "" && PNHMatchData[ph_sfurl_ix] !== "0") {
                            if ( !bannButt.localizedName.active ) {
                                bannButt.PlaceWebsite.value = "Store Locator";
                                bannButt.PlaceWebsite.active = true;
                            }
                            customStoreFinderURL = PNHMatchData[ph_sfurl_ix];
                            if ( customStoreFinderURL.indexOf('http') !== 0 ) {
                                customStoreFinderURL = 'http:\/\/' + customStoreFinderURL;
                            }
                            customStoreFinder = true;
                        }
                    }

                    // Category translations
                    var altCategories = PNHMatchData[ph_category2_ix];
                    if (altCategories !== "0" && altCategories !== "") {  //  translate alt-cats to WME code
                        altCategories = altCategories.replace(/,[^A-Za-z0-9]*/g, ",").split(",");  // tighten and split by comma
                        for (var catix = 0; catix<altCategories.length; catix++) {
                            var newAltTemp = catTranslate(altCategories[catix]);  // translate altCats into WME cat codes
                            if (newAltTemp === "ERROR") {  // if no translation, quit the loop
                                phlog('Category ' + altCategories[catix] + 'cannot be translated.');
                                return;
                            } else {
                                altCategories[catix] = newAltTemp;  // replace with translated element
                            }
                        }
                    }

                    // name parsing with category exceptions
                    if (["HOTEL"].indexOf(priPNHPlaceCat) > -1) {
                        if (newName.toUpperCase() === PNHMatchData[ph_name_ix].toUpperCase()) {  // If no localization
                            bannButt.catHotel.message = 'Check hotel website for any name localization (e.g. '+ PNHMatchData[ph_name_ix] +' - Tampa Airport).';
                            bannButt.catHotel.active = true;
                            newName = PNHMatchData[ph_name_ix];
                        } else {
                            // Replace PNH part of name with PNH name
                            var splix = newName.toUpperCase().replace(/[-\/]/g,' ').indexOf(PNHMatchData[ph_name_ix].toUpperCase().replace(/[-\/]/g,' ') );
                            if (splix>-1) {
                                var frontText = newName.slice(0,splix);
                                var backText = newName.slice(splix+PNHMatchData[ph_name_ix].length);
                                newName = PNHMatchData[ph_name_ix];
                                if (frontText.length > 0) { newName = frontText + ' ' + newName; }
                                if (backText.length > 0) { newName = newName + ' ' + backText; }
                                newName = newName.replace(/ {2,}/g,' ');
                            } else {
                                newName = PNHMatchData[ph_name_ix];
                            }
                        }
                        if ( altCategories !== "0" && altCategories !== "" ) {  // if PNH alts exist
                            insertAtIX(newCategories, altCategories, 1);  //  then insert the alts into the existing category array after the GS category
                        }
                        if ( newCategories.indexOf('HOTEL') !== 0 ) {  // If no GS category in the primary, flag it
                            bannButt.hotelMkPrim.active = true;
                            if (currentWL.hotelMkPrim) {
                                bannButt.hotelMkPrim.WLactive = false;
                            } else {
                                lockOK = false;
                            }
                        }
                        // If PNH match, set wifi service.
                        if (PNHMatchData && !bannServ.addWiFi.checked) {
                            bannServ.addWiFi.action();
                        }
                        // Set hotel hours to 24/7 for all hotels.
                        if (!bannServ.add247.checked) {
                            bannServ.add247.action();
                        }
                    } else if ( ["BANK_FINANCIAL"].indexOf(priPNHPlaceCat) > -1 && PNHMatchData[ph_speccase_ix].indexOf('notABank') === -1 ) {
                        // PNH Bank treatment
                        ixBank = item.attributes.categories.indexOf("BANK_FINANCIAL");
                        ixATM = item.attributes.categories.indexOf("ATM");
                        ixOffices = item.attributes.categories.indexOf("OFFICES");
                        // if the name contains ATM in it
                        if ( newName.match(/\batm\b/ig) !== null ) {
                            if ( ixOffices === 0 ) {
                                bannButt.bankType1.active = true;
                                bannButt.bankBranch.active = true;
                                bannButt.standaloneATM.active = true;
                                bannButt.bankCorporate.active = true;
                            } else if ( ixBank === -1 && ixATM === -1 ) {
                                bannButt.bankBranch.active = true;
                                bannButt.standaloneATM.active = true;
                            } else if ( ixATM === 0 && ixBank > 0 ) {
                                bannButt.bankBranch.active = true;
                            } else if ( ixBank > -1 ) {
                                bannButt.bankBranch.active = true;
                                bannButt.standaloneATM.active = true;
                            }
                            newName = PNHMatchData[ph_name_ix] + ' ATM';
                            newCategories = insertAtIX(newCategories, 'ATM', 0);
                            // Net result: If the place has ATM cat only and ATM in the name, then it will be green and renamed Bank Name ATM
                        } else if (ixBank > -1  || ixATM > -1) {  // if no ATM in name but with a banking category:
                            if ( ixOffices === 0 ) {
                                bannButt.bankBranch.active = true;
                            } else if ( ixBank > -1  && ixATM === -1 ) {
                                bannButt.addATM.active = true;
                            } else if ( ixATM === 0 && ixBank === -1 ) {
                                bannButt.bankBranch.active = true;
                                bannButt.standaloneATM.active = true;
                            } else if ( ixBank > 0 && ixATM > 0 ) {
                                bannButt.bankBranch.active = true;
                                bannButt.standaloneATM.active = true;
                            }
                            newName = PNHMatchData[ph_name_ix];
                            // Net result: If the place has Bank category first, then it will be green with PNH name replaced
                        } else {  // for PNH match with neither bank type category, make it a bank
                            newCategories = insertAtIX(newCategories, 'BANK_FINANCIAL', 1);
                            bannButt.standaloneATM.active = true;
                            bannButt.bankCorporate.active = true;
                        }// END PNH bank treatment
                    } else if ( ["GAS_STATION"].indexOf(priPNHPlaceCat) > -1 ) {  // for PNH gas stations, don't replace existing sub-categories
                        if ( altCategories !== "0" && altCategories !== "" ) {  // if PNH alts exist
                            insertAtIX(newCategories, altCategories, 1);  //  then insert the alts into the existing category array after the GS category
                        }
                        if ( newCategories.indexOf('GAS_STATION') !== 0 ) {  // If no GS category in the primary, flag it
                            bannButt.gasMkPrim.active = true;
                            lockOK = false;
                        } else {
                            newName = PNHMatchData[ph_name_ix];
                        }
                    } else if (updatePNHName) {  // if not a special category then update the name
                        newName = PNHMatchData[ph_name_ix];
                        newCategories = insertAtIX(newCategories, priPNHPlaceCat,0);
                        if (altCategories !== "0" && altCategories !== "") {
                            newCategories = insertAtIX(newCategories,altCategories,1);
                        }
                    }

                    // *** need to add a section above to allow other permissible categories to remain? (optional)

                    // Parse URL data
                    var localURLcheckRE;
                    if ( localURLcheck !== '') {
                        if (newURL !== null || newURL !== '') {
                            localURLcheckRE = new RegExp(localURLcheck, "i");
                            if ( newURL.match(localURLcheckRE) !== null ) {
                                newURL = normalizeURL(newURL,false, false, item);
                            } else {
                                newURL = normalizeURL(PNHMatchData[ph_url_ix],false, false, item);
                                bannButt.localURL.active = true;
                            }
                        } else {
                            newURL = normalizeURL(PNHMatchData[ph_url_ix],false, false, item);
                            bannButt.localURL.active = true;
                        }
                    } else {
                        newURL = normalizeURL(PNHMatchData[ph_url_ix],false, false, item);
                    }
                    // Parse PNH Aliases
                    newAliasesTemp = PNHMatchData[ph_aliases_ix].match(/([^\(]*)/i)[0];
                    if (newAliasesTemp !== "0" && newAliasesTemp !== "") {  // make aliases array
                        newAliasesTemp = newAliasesTemp.replace(/,[^A-za-z0-9]*/g, ",");  // tighten up commas if more than one alias.
                        newAliasesTemp = newAliasesTemp.split(",");  // split by comma
                    }
                    if ( specCases.indexOf('noUpdateAlias') === -1 && (!containsAll(newAliases,newAliasesTemp) && newAliasesTemp !== "0" && newAliasesTemp !== "" && specCases.indexOf('optionName2') === -1 ))  {
                        newAliases = insertAtIX(newAliases,newAliasesTemp,0);
                    }
                    // Enable optional alt-name button
                    if (bannButt.addAlias.active) {
                        bannButt.addAlias.message = "Is there a " + optionalAlias + " at this location?";
                        bannButt.addAlias.title = 'Add ' + optionalAlias;
                    }
                    // update categories if different and no Cat2 option
                    if ( !matchSets( uniq(item.attributes.categories),uniq(newCategories) ) ) {
                        if ( specCases.indexOf('optionCat2') === -1 && specCases.indexOf('buttOn_addCat2') === -1 ) {
                            phlogdev("Categories updated" + " with " + newCategories);
                            actions.push(new UpdateObject(item, { categories: newCategories }));
                            //W.model.actionManager.add(new UpdateObject(item, { categories: newCategories }));
                            fieldUpdateObject.categories='#dfd';
                        } else {  // if second cat is optional
                            phlogdev("Primary category updated with " + priPNHPlaceCat);
                            newCategories = insertAtIX(newCategories, priPNHPlaceCat, 0);
                            actions.push(new UpdateObject(item, { categories: newCategories }));
                            fieldUpdateObject.categories='#dfd';
                        }
                        // Enable optional 2nd category button
                        if (specCases.indexOf('buttOn_addCat2') > -1 && newCategories.indexOf(catTransWaze2Lang[altCategories[0]]) === -1 ) {
                            bannButt.addCat2.message = "Is there a " + catTransWaze2Lang[altCategories[0]] + " at this location?";
                            bannButt.addCat2.title = 'Add ' + catTransWaze2Lang[altCategories[0]];
                        }
                    }

                    // Description update
                    newDescripion = PNHMatchData[ph_description_ix];
                    if (newDescripion !== null && newDescripion !== "0" && item.attributes.description.toUpperCase().indexOf(newDescripion.toUpperCase()) === -1 ) {
                        if ( item.attributes.description !== "" && item.attributes.description !== null && item.attributes.description !== ' ' ) {
                            bannButt.checkDescription.active = true;
                        }
                        phlogdev("Description updated");
                        newDescripion = newDescripion + '\n' + item.attributes.description;
                        actions.push(new UpdateObject(item, { description: newDescripion }));
                        fieldUpdateObject.description='#dfd';
                    }

                    // Special Lock by PNH
                    if (specCases.indexOf('lockAt5') > -1 ) {
                        PNHLockLevel = 4;
                    }

                } else {  // if no PNH match found
                    if (PNHMatchData[0] === "ApprovalNeeded") {
                        //PNHNameTemp = PNHMatchData[1].join(', ');
                        PNHNameTemp = PNHMatchData[1][0];  // Just do the first match
                        PNHNameTempWeb = PNHNameTemp.replace(/\&/g, "%26");
                        PNHNameTempWeb = PNHNameTemp.replace(/\#/g, "%23");
                        PNHNameTempWeb = PNHNameTempWeb.replace(/\//g, "%2F");
                        PNHOrderNum = PNHMatchData[2].join(',');
                    }

                    // Strong title case option for non-PNH places
                    if (newName !== toTitleCaseStrong(newName)) {
                        bannButt.STC.active = true;
                    }

                    newURL = normalizeURL(newURL,true,false, item);  // Normalize url

                    // // Generic Hotel Treatment
                    // if ( newCategories.indexOf("HOTEL") > -1  && newName.indexOf(' - ') === -1 && newName.indexOf(': ') === -1) {
                    //     bannButt.catHotel.active = true;
                    //     if (currentWL.hotelLocWL) {
                    //         bannButt.catHotel.WLactive = false;
                    //     }
                    // }

                    // Generic Bank treatment
                    ixBank = item.attributes.categories.indexOf("BANK_FINANCIAL");
                    ixATM = item.attributes.categories.indexOf("ATM");
                    ixOffices = item.attributes.categories.indexOf("OFFICES");
                    // if the name contains ATM in it
                    if ( newName.match(/\batm\b/ig) !== null ) {
                        if ( ixOffices === 0 ) {
                            bannButt.bankType1.active = true;
                            bannButt.bankBranch.active = true;
                            bannButt.standaloneATM.active = true;
                            bannButt.bankCorporate.active = true;
                        } else if ( ixBank === -1 && ixATM === -1 ) {
                            bannButt.bankBranch.active = true;
                            bannButt.standaloneATM.active = true;
                        } else if ( ixATM === 0 && ixBank > 0 ) {
                            bannButt.bankBranch.active = true;
                        } else if ( ixBank > -1 ) {
                            bannButt.bankBranch.active = true;
                            bannButt.standaloneATM.active = true;
                        }
                        // Net result: If the place has ATM cat only and ATM in the name, then it will be green
                    } else if (ixBank > -1  || ixATM > -1) {  // if no ATM in name:
                        if ( ixOffices === 0 ) {
                            bannButt.bankBranch.active = true;
                        } else if ( ixBank > -1  && ixATM === -1 ) {
                            bannButt.addATM.active = true;
                        } else if ( ixATM === 0 && ixBank === -1 ) {
                            bannButt.bankBranch.active = true;
                            bannButt.standaloneATM.active = true;
                        } else if ( ixBank > 0 && ixATM > 0 ) {
                            bannButt.bankBranch.active = true;
                            bannButt.standaloneATM.active = true;
                        }
                        // Net result: If the place has Bank category first, then it will be green
                    } // END generic bank treatment

                }  // END PNH match/no-match updates

                // Strip/add suffixes
                if ( hpMode.harmFlag && thisUser.userName === 'bmtg' )  {
                    var suffixStr = ' - ZQXWCEVRBT';
                    var suffixStrRE = new RegExp(suffixStr, 'i');
                    if ( newName.indexOf(suffixStr) > -1 ) {
                        //newName = newName.replace(suffixStrRE, '');
                    }
                    if ( newName.indexOf(suffixStr) === -1 ) {
                        //newName = newName + suffixStr;
                    }
                }

                // Update name:
                if (hpMode.harmFlag && newName !== item.attributes.name) {
                    phlogdev("Name updated");
                    actions.push(new UpdateObject(item, { name: newName }));
                    //actions.push(new UpdateObject(item, { name: newName }));
                    fieldUpdateObject.name='#dfd';
                }

                // Update aliases
                newAliases = removeSFAliases(newName, newAliases);
                for (naix=0; naix<newAliases.length; naix++) {
                    newAliases[naix] = toTitleCase(newAliases[naix]);
                }
                if (hpMode.harmFlag && newAliases !== item.attributes.aliases && newAliases.length !== item.attributes.aliases.length) {
                    phlogdev("Alt Names updated");
                    actions.push(new UpdateObject(item, { aliases: newAliases }));
                    fieldUpdateObject.aliases='#dfd';
                }

                // Gas station treatment (applies to all including PNH)
                if (newCategories[0] === 'GAS_STATION') {
                    // Brand checking
                    if ( !item.attributes.brand || item.attributes.brand === null || item.attributes.brand === "" ) {
                        bannButt.gasNoBrand.active = true;
                        if (currentWL.gasNoBrand) {
                            bannButt.gasNoBrand.WLactive = false;
                        }
                    } else if (item.attributes.brand === 'Unbranded' ) {  //  Unbranded is not used per wiki
                        bannButt.gasUnbranded.active = true;
                        lockOK = false;
                    } else {
                        var brandNameRegEx = new RegExp('\\b'+item.attributes.brand.toUpperCase().replace(/[ '-]/g,''), "i");
                        if ( newName.toUpperCase().replace(/[ '-]/g,'').match(brandNameRegEx) === null ) {
                            bannButt.gasMismatch.active = true;
                            if (currentWL.gasMismatch) {
                                bannButt.gasMismatch.WLactive = false;
                            } else {
                                lockOK = false;
                            }
                        }
                    }
                    // Add convenience store category to station
                    if (newCategories.indexOf("CONVENIENCE_STORE") === -1 && !bannButt.subFuel.active) {
                        if ( hpMode.harmFlag && $("#WMEPH-ConvenienceStoreToGasStations" + devVersStr).prop('checked') ) {  // Automatic if user has the setting checked
                            newCategories = insertAtIX(newCategories, "CONVENIENCE_STORE", 1);  // insert the C.S. category
                            actions.push(new UpdateObject(item, { categories: newCategories }));
                            fieldUpdateObject.categories='#dfd';
                            phlogdev('Conv. store category added');
                        } else {  // If not checked, then it will be a banner button
                            bannButt.addConvStore.active = true;
                        }
                    }
                }  // END Gas Station Checks

                
                // TODO - FIX APPROVAL SUBMISSION STUFF
                // Make PNH submission links
                var regionFormURL = '';
                var newPlaceAddon = '';
                var approvalAddon = '';
                var approvalMessage = 'Submitted via WMEPH. PNH order number ' + PNHOrderNum;
                var tempSubmitName = newName.replace(/\&/g,'%26').replace(/\//g, "%2F").replace(/\#/g, "%23");
                if (hpMode.harmFlag) {
                    switch (region) {
                        case "NWR": regionFormURL = 'https://docs.google.com/forms/d/1hv5hXBlGr1pTMmo4n3frUx1DovUODbZodfDBwwTc7HE/viewform';
                            newPlaceAddon = '?entry.925969794='+tempSubmitName+'&entry.1970139752='+newURLSubmit+'&entry.1749047694='+thisUser.userName+gFormState;
                            approvalAddon = '?entry.925969794='+PNHNameTempWeb+'&entry.50214576='+approvalMessage+'&entry.1749047694='+thisUser.userName+gFormState;
                            break;
                        case "SWR": regionFormURL = 'https://docs.google.com/forms/d/1Qf2N4fSkNzhVuXJwPBJMQBmW0suNuy8W9itCo1qgJL4/viewform';
                            newPlaceAddon = '?entry.1497446659='+tempSubmitName+'&entry.1970139752='+newURLSubmit+'&entry.1749047694='+thisUser.userName+gFormState;
                            approvalAddon = '?entry.1497446659='+PNHNameTempWeb+'&entry.50214576='+approvalMessage+'&entry.1749047694='+thisUser.userName+gFormState;
                            break;
                        case "HI": regionFormURL = 'https://docs.google.com/forms/d/1K7Dohm8eamIKry3KwMTVnpMdJLaMIyDGMt7Bw6iqH_A/viewform';
                            newPlaceAddon = '?entry.1497446659='+tempSubmitName+'&entry.1970139752='+newURLSubmit+'&entry.1749047694='+thisUser.userName+gFormState;
                            approvalAddon = '?entry.1497446659='+PNHNameTempWeb+'&entry.50214576='+approvalMessage+'&entry.1749047694='+thisUser.userName+gFormState;
                            break;
                        case "PLN": regionFormURL = 'https://docs.google.com/forms/d/1ycXtAppoR5eEydFBwnghhu1hkHq26uabjUu8yAlIQuI/viewform';
                            newPlaceAddon = '?entry.925969794='+tempSubmitName+'&entry.1970139752='+newURLSubmit+'&entry.1749047694='+thisUser.userName+gFormState;
                            approvalAddon = '?entry.925969794='+PNHNameTempWeb+'&entry.50214576='+approvalMessage+'&entry.1749047694='+thisUser.userName+gFormState;
                            break;
                        case "SCR": regionFormURL = 'https://docs.google.com/forms/d/1KZzLdlX0HLxED5Bv0wFB-rWccxUp2Mclih5QJIQFKSQ/viewform';
                            newPlaceAddon = '?entry.925969794='+tempSubmitName+'&entry.1970139752='+newURLSubmit+'&entry.1749047694='+thisUser.userName+gFormState;
                            approvalAddon = '?entry.925969794='+PNHNameTempWeb+'&entry.50214576='+approvalMessage+'&entry.1749047694='+thisUser.userName+gFormState;
                            break;
                        case "TX": regionFormURL = 'https://docs.google.com/forms/d/1x7VM7ofPOKVnWOaX7d70OWXpnVKf6Mkadn4dgYxx4ic/viewform';
                            newPlaceAddon = '?entry.925969794='+tempSubmitName+'&entry.1970139752='+newURLSubmit+'&entry.1749047694='+thisUser.userName+gFormState;
                            approvalAddon = '?entry.925969794='+PNHNameTempWeb+'&entry.50214576='+approvalMessage+'&entry.1749047694='+thisUser.userName+gFormState;
                            break;
                        case "GLR": regionFormURL = 'https://docs.google.com/forms/d/19btj-Qt2-_TCRlcS49fl6AeUT95Wnmu7Um53qzjj9BA/viewform';
                            newPlaceAddon = '?entry.925969794='+tempSubmitName+'&entry.1970139752='+newURLSubmit+'&entry.1749047694='+thisUser.userName+gFormState;
                            approvalAddon = '?entry.925969794='+PNHNameTempWeb+'&entry.50214576='+approvalMessage+'&entry.1749047694='+thisUser.userName+gFormState;
                            break;
                        case "SAT": regionFormURL = 'https://docs.google.com/forms/d/1bxgK_20Jix2ahbmUvY1qcY0-RmzUBT6KbE5kjDEObF8/viewform';
                            newPlaceAddon = '?entry.2063110249='+tempSubmitName+'&entry.2018912633='+newURLSubmit+'&entry.1924826395='+thisUser.userName+gFormState;
                            approvalAddon = '?entry.2063110249='+PNHNameTempWeb+'&entry.123778794='+approvalMessage+'&entry.1924826395='+thisUser.userName+gFormState;
                            break;
                        case "SER": regionFormURL = 'https://docs.google.com/forms/d/1jYBcxT3jycrkttK5BxhvPXR240KUHnoFMtkZAXzPg34/viewform';
                            newPlaceAddon = '?entry.822075961='+tempSubmitName+'&entry.1422079728='+newURLSubmit+'&entry.1891389966='+thisUser.userName+gFormState;
                            approvalAddon = '?entry.822075961='+PNHNameTempWeb+'&entry.607048307='+approvalMessage+'&entry.1891389966='+thisUser.userName+gFormState;
                            break;
                        case "ATR": regionFormURL = 'https://docs.google.com/forms/d/1v7JhffTfr62aPSOp8qZHA_5ARkBPldWWJwDeDzEioR0/viewform';
                            newPlaceAddon = '?entry.925969794='+tempSubmitName+'&entry.1970139752='+newURLSubmit+'&entry.1749047694='+thisUser.userName+gFormState;
                            approvalAddon = '?entry.925969794='+PNHNameTempWeb+'&entry.50214576='+approvalMessage+'&entry.1749047694='+thisUser.userName+gFormState;
                            break;
                        case "NER": regionFormURL = 'https://docs.google.com/forms/d/1UgFAMdSQuJAySHR0D86frvphp81l7qhEdJXZpyBZU6c/viewform';
                            newPlaceAddon = '?entry.925969794='+tempSubmitName+'&entry.1970139752='+newURLSubmit+'&entry.1749047694='+thisUser.userName+gFormState;
                            approvalAddon = '?entry.925969794='+PNHNameTempWeb+'&entry.50214576='+approvalMessage+'&entry.1749047694='+thisUser.userName+gFormState;
                            break;
                        case "NOR": regionFormURL = 'https://docs.google.com/forms/d/1iYq2rd9HRd-RBsKqmbHDIEBGuyWBSyrIHC6QLESfm4c/viewform';
                            newPlaceAddon = '?entry.925969794='+tempSubmitName+'&entry.1970139752='+newURLSubmit+'&entry.1749047694='+thisUser.userName+gFormState;
                            approvalAddon = '?entry.925969794='+PNHNameTempWeb+'&entry.50214576='+approvalMessage+'&entry.1749047694='+thisUser.userName+gFormState;
                            break;
                        case "MAR": regionFormURL = 'https://docs.google.com/forms/d/1PhL1iaugbRMc3W-yGdqESoooeOz-TJIbjdLBRScJYOk/viewform';
                            newPlaceAddon = '?entry.925969794='+tempSubmitName+'&entry.1970139752='+newURLSubmit+'&entry.1749047694='+thisUser.userName+gFormState;
                            approvalAddon = '?entry.925969794='+PNHNameTempWeb+'&entry.50214576='+approvalMessage+'&entry.1749047694='+thisUser.userName+gFormState;
                            break;
                        case "CA_EN": regionFormURL = 'https://docs.google.com/forms/d/13JwXsrWPNmCdfGR5OVr5jnGZw-uNGohwgjim-JYbSws/viewform';
                            newPlaceAddon = '?entry_839085807='+tempSubmitName+'&entry_1067461077='+newURLSubmit;
                            approvalAddon = '?entry_839085807='+PNHNameTempWeb+'&entry_1125435193='+approvalMessage;
                            break;
                        case "QC": regionFormURL = 'https://docs.google.com/forms/d/13JwXsrWPNmCdfGR5OVr5jnGZw-uNGohwgjim-JYbSws/viewform';
                            newPlaceAddon = '?entry_839085807='+tempSubmitName+'&entry_1067461077='+newURLSubmit;
                            approvalAddon = '?entry_839085807='+PNHNameTempWeb+'&entry_1125435193='+approvalMessage;
                            break;
                        default: regionFormURL = "";
                    }
                    newPlaceURL = regionFormURL + newPlaceAddon;
                    approveRegionURL = regionFormURL + approvalAddon;
                }

                // Category/Name-based Services, added to any existing services:
                var CH_DATA, CH_NAMES;
                if (countryCode === "USA") {
                    CH_DATA = USA_CH_DATA;
                    CH_NAMES = USA_CH_NAMES;
                } else if (countryCode === "CAN") {
                    CH_DATA = USA_CH_DATA;   // #### CAN shares the USA sheet, can eventually can be split to new sheet if needed
                    CH_NAMES = USA_CH_NAMES;
                }
                var CH_DATA_headers = CH_DATA[0].split("|");
                var CH_DATA_keys = CH_DATA[1].split("|");
                var CH_DATA_list = CH_DATA[2].split("|");

                var servHeaders = [], servKeys = [], servList = [], servHeaderCheck;
                for (var jjj=0; jjj<CH_DATA_headers.length; jjj++) {
                    servHeaderCheck = CH_DATA_headers[jjj].match(/^ps_/i);  // if it's a service header
                    if (servHeaderCheck) {
                        servHeaders.push(jjj);
                        servKeys.push(CH_DATA_keys[jjj]);
                        servList.push(CH_DATA_list[jjj]);
                    }
                }

                var CH_DATA_Temp;
                if (newCategories.length > 0) {
                    for (var iii=0; iii<CH_NAMES.length; iii++) {
                        if (newCategories.indexOf(CH_NAMES[iii]) > -1 ) {
                            CH_DATA_Temp = CH_DATA[iii].split("|");
                            for (var psix=0; psix<servHeaders.length; psix++) {
                                if ( !bannServ[servKeys[psix]].pnhOverride ) {
                                    if (CH_DATA_Temp[servHeaders[psix]] === '1') {  // These are automatically added to all countries/regions (if auto setting is on)
                                        bannServ[servKeys[psix]].active = true;
                                        if ( hpMode.harmFlag && $("#WMEPH-EnableServices" + devVersStr).prop('checked')  ) {
                                            // Automatically enable new services
                                            bannServ[servKeys[psix]].actionOn(actions);
                                        }
                                    } else if (CH_DATA_Temp[servHeaders[psix]] === '2') {  // these are never automatically added but shown
                                        bannServ[servKeys[psix]].active = true;
                                    } else if (CH_DATA_Temp[servHeaders[psix]] !== '') {  // check for state/region auto add
                                        bannServ[servKeys[psix]].active = true;
                                        if ( hpMode.harmFlag && $("#WMEPH-EnableServices" + devVersStr).prop('checked')) {
                                            var servAutoRegion = CH_DATA_Temp[servHeaders[psix]].replace(/,[^A-za-z0-9]*/g, ",").split(",");
                                            // if the sheet data matches the state, region, or username then auto add
                                            if ( servAutoRegion.indexOf(state2L) > -1 || servAutoRegion.indexOf(region) > -1 || servAutoRegion.indexOf(thisUser.userName) > -1 ) {
                                                bannServ[servKeys[psix]].actionOn(actions);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                // PNH specific Services:


                // ### remove unnecessary parent categories (Restaurant doesn't need food and drink)
                if ( hpMode.harmFlag && newCategories.indexOf('FOOD_AND_DRINK') > -1 ) {
                    if (newCategories.indexOf('RESTAURANT') > -1 || newCategories.indexOf('FAST_FOOD') > -1 ) {
                        newCategories.splice(newCategories.indexOf('FOOD_AND_DRINK'),1);  // remove Food/Drink Cat
                        actions.push(new UpdateObject(item, { categories: newCategories }));
                        fieldUpdateObject.categories='#dfd';
                    }
                }

                var isPoint = item.isPoint();
                var isArea = item.is2D();
                var maxPointSeverity = 0;
                var maxAreaSeverity = 3;
                var highestCategoryLock = -1;

                for(var ixPlaceCat=0; ixPlaceCat<newCategories.length; ixPlaceCat++) {
                    var category = newCategories[ixPlaceCat];
                    var ixPNHCat = CH_NAMES.indexOf(category);
                    if (ixPNHCat>-1) {
                        CH_DATA_Temp = CH_DATA[ixPNHCat].split("|");
                        // CH_DATA_headers
                        //pc_point    pc_area    pc_regpoint    pc_regarea    pc_lock1    pc_lock2    pc_lock3    pc_lock4    pc_lock5    pc_rare    pc_parent    pc_message
                        var pvaPoint = CH_DATA_Temp[CH_DATA_headers.indexOf('pc_point')];
                        var pvaArea = CH_DATA_Temp[CH_DATA_headers.indexOf('pc_area')];
                        var regPoint = CH_DATA_Temp[CH_DATA_headers.indexOf('pc_regpoint')].replace(/,[^A-za-z0-9]*/g, ",").split(",");
                        var regArea = CH_DATA_Temp[CH_DATA_headers.indexOf('pc_regarea')].replace(/,[^A-za-z0-9]*/g, ",").split(",");
                        if (regPoint.indexOf(state2L) > -1 || regPoint.indexOf(region) > -1 || regPoint.indexOf(countryCode) > -1) {
                            pvaPoint = '1';
                            pvaArea = '';
                        } else if (regArea.indexOf(state2L) > -1 || regArea.indexOf(region) > -1 || regArea.indexOf(countryCode) > -1) {
                            pvaPoint = '';
                            pvaArea = '1';
                        }
                        var pointSeverity = getPvaSeverity(pvaPoint, item);
                        var areaSeverity = getPvaSeverity(pvaArea, item);

                        if (isPoint && pointSeverity > 0) {
                            maxPointSeverity = Math.max(pointSeverity, maxPointSeverity);
                        } else if (isArea) {
                            maxAreaSeverity = Math.min(areaSeverity, maxAreaSeverity);
                        }

                        // display any messaged regarding the category
                        if (newCategories.indexOf('HOSPITAL_MEDICAL_CARE') > -1) {
                            pc_message = '';
                        } else {
                            pc_message = CH_DATA_Temp[CH_DATA_headers.indexOf('pc_message')];
                        }
                        if (pc_message && pc_message !== '0' && pc_message !== '') {
                            bannButt.pnhCatMess.active = true;
                            bannButt.pnhCatMess.message = pc_message;
                        }
                        // Unmapped categories
                        pc_rare = CH_DATA_Temp[CH_DATA_headers.indexOf('pc_rare')].replace(/,[^A-Za-z0-9}]+/g, ",").split(',');
                        if (pc_rare.indexOf(state2L) > -1 || pc_rare.indexOf(region) > -1 || pc_rare.indexOf(countryCode) > -1) {
                            bannButt.unmappedRegion.active = true;
                            if (currentWL.unmappedRegion) {
                                bannButt.unmappedRegion.WLactive = false;
                                bannButt.unmappedRegion.severity = 0;
                            } else {
                                lockOK = false;
                            }
                        }
                        // Parent Category
                        pc_parent = CH_DATA_Temp[CH_DATA_headers.indexOf('pc_parent')].replace(/,[^A-Za-z0-9}]+/g, ",").split(',');
                        if (pc_parent.indexOf(state2L) > -1 || pc_parent.indexOf(region) > -1 || pc_parent.indexOf(countryCode) > -1) {
                            bannButt.parentCategory.active = true;
                            if (currentWL.parentCategory) {
                                bannButt.parentCategory.WLactive = false;
                            }
                        }
                        // Set lock level
                        for (var lockix=1; lockix<6; lockix++) {
                            pc_lockTemp = CH_DATA_Temp[CH_DATA_headers.indexOf('pc_lock'+lockix)].replace(/,[^A-Za-z0-9}]+/g, ",").split(',');
                            if (lockix - 1 > highestCategoryLock && (pc_lockTemp.indexOf(state2L) > -1 || pc_lockTemp.indexOf(region) > -1 || pc_lockTemp.indexOf(countryCode) > -1)) {
                                highestCategoryLock = lockix - 1;  // Offset by 1 since lock ranks start at 0
                            }
                        }
                    }
                }

                if (highestCategoryLock > -1) {
                    defaultLockLevel = highestCategoryLock;
                }

                if (isPoint) {
                    if (maxPointSeverity === 3) {
                        bannButt.areaNotPoint.active = true;
                        if (currentWL.areaNotPoint || item.attributes.lockRank >= defaultLockLevel) {
                            bannButt.areaNotPoint.WLactive = false;
                            bannButt.areaNotPoint.severity = 0;
                        } else {
                            lockOK = false;
                        }
                    } else if (maxPointSeverity === 2) {
                        bannButt.areaNotPointMid.active = true;
                        if (currentWL.areaNotPoint || item.attributes.lockRank >= defaultLockLevel) {
                            bannButt.areaNotPointMid.WLactive = false;
                            bannButt.areaNotPointMid.severity = 0;
                        } else {
                            lockOK = false;
                        }
                    } else if (maxPointSeverity === 1) {
                        bannButt.areaNotPointLow.active = true;
                        if (currentWL.areaNotPoint || item.attributes.lockRank >= defaultLockLevel) {
                            bannButt.areaNotPointLow.WLactive = false;
                            bannButt.areaNotPointLow.severity = 0;
                        }
                    }
                } else {
                    if (maxAreaSeverity === 3) {
                        bannButt.pointNotArea.active = true;
                        if (currentWL.pointNotArea || item.attributes.lockRank >= defaultLockLevel) {
                            bannButt.pointNotArea.WLactive = false;
                            bannButt.pointNotArea.severity = 0;
                        } else {
                            lockOK = false;
                        }
                    } else if (maxAreaSeverity === 2) {
                        bannButt.pointNotAreaMid.active = true;
                        if (currentWL.pointNotArea || item.attributes.lockRank >= defaultLockLevel) {
                            bannButt.pointNotAreaMid.WLactive = false;
                            bannButt.pointNotAreaMid.severity = 0;
                        } else {
                            lockOK = false;
                        }
                    } else if (maxAreaSeverity === 1) {
                        bannButt.pointNotAreaLow.active = true;
                        if (currentWL.pointNotArea || item.attributes.lockRank >= defaultLockLevel) {
                            bannButt.pointNotAreaLow.WLactive = false;
                            bannButt.pointNotAreaLow.severity = 0;
                        }
                    }
                }

                var anpNone = collegeAbbreviations.split('|'), anpNoneRE;
                for (var cii=0; cii<anpNone.length; cii++) {
                    anpNoneRE = new RegExp('\\b'+anpNone[cii]+'\\b', 'g');
                    if ( newName.match( anpNoneRE) !== null ) {
                        bannButt.areaNotPointLow.severity = 0;
                        bannButt.areaNotPointLow.WLactive = false;
                    }
                }

                // Check for missing hours field
                if (item.attributes.openingHours.length === 0) {  // if no hours...
                    if (!containsAny(newCategories,["STADIUM_ARENA","CEMETERY","MILITARY","TRANSPORTATION","FERRY_PIER","SUBWAY_STATION",
                                                    "BRIDGE","TUNNEL","JUNCTION_INTERCHANGE","ISLAND","SEA_LAKE_POOL","RIVER_STREAM","FOREST_GROVE","CANAL","SWAMP_MARSH","DAM"]) ) {
                        bannButt.noHours.active = true;
                        if (currentWL.noHours) {
                            bannButt.noHours.WLactive = false;
                        }
                        if ( containsAny(newCategories,["SCHOOL","CONVENTIONS_EVENT_CENTER","CAMPING_TRAILER_PARK","COTTAGE_CABIN","COLLEGE_UNIVERSITY","GOLF_COURSE","SPORTS_COURT","MOVIE_THEATER","SHOPPING_CENTER","RELIGIOUS_CENTER","PARKING_LOT","PARK","PLAYGROUND","AIRPORT","FIRE_DEPARTMENT","POLICE_STATION","SEAPORT_MARINA_HARBOR","FARM"]) ) {
                            bannButt.noHours.severity = 0;
                            bannButt.noHours.WLactive = false;
                        }
                    }
                    if (hpMode.hlFlag && $("#WMEPH-DisableHoursHL" + devVersStr).prop('checked')) {
                        bannButt.noHours.severity = 0;
                    }
                } else {
                    if (item.attributes.openingHours.length === 1) {  // if one set of hours exist, check for partial 24hrs setting
                        if (item.attributes.openingHours[0].days.length < 7 && item.attributes.openingHours[0].fromHour==='00:00' &&
                            (item.attributes.openingHours[0].toHour==='00:00' || item.attributes.openingHours[0].toHour==='23:59' ) ) {
                            bannButt.mismatch247.active = true;
                        }
                    }
                    bannButt.noHours.active = true;
                    bannButt.noHours.value = 'Add hours';
                    bannButt.noHours.severity = 0;
                    bannButt.noHours.WLactive = false;
                    bannButt.noHours.message = 'Hours: <input type="text" value="Paste Hours Here" id="WMEPH-HoursPaste'+devVersStr+'" style="width:170px;padding-left:3px;color:#AAA">';
                }
                if ( !checkHours(item.attributes.openingHours) ) {
                    //phlogdev('Overlapping hours');
                    bannButt.hoursOverlap.active = true;
                    bannButt.noHours.active = true;
                } else {
                    var tempHours = item.attributes.openingHours.slice(0);
                    for ( var ohix=0; ohix<item.attributes.openingHours.length; ohix++ ) {
                        if ( tempHours[ohix].days.length === 2 && tempHours[ohix].days[0] === 1 && tempHours[ohix].days[1] === 0) {
                            // separate hours
                            phlogdev('Correcting M-S entry...');
                            tempHours.push({days: [0], fromHour: tempHours[ohix].fromHour, toHour: tempHours[ohix].toHour});
                            tempHours[ohix].days = [1];
                            actions.push(new UpdateObject(item, { openingHours: tempHours }));
                        }
                    }
                }

                // Highlight 24/7 button if hours are set that way, and add button for all places
                if ( item.attributes.openingHours.length === 1 && item.attributes.openingHours[0].days.length === 7 && item.attributes.openingHours[0].fromHour === '00:00' && item.attributes.openingHours[0].toHour ==='00:00' ) {
                    bannServ.add247.checked = true;
                }
                bannServ.add247.active = true;

                // URL updating
                var updateURL = true;
                if (newURL !== item.attributes.url && newURL !== "" && newURL !== "0") {
                    if ( PNHNameRegMatch && item.attributes.url !== null && item.attributes.url !== '' ) {  // for cases where there is an existing URL in the WME place, and there is a PNH url on queue:
                        var newURLTemp = normalizeURL(newURL,true,false, item);  // normalize
                        var itemURL = normalizeURL(item.attributes.url,true,false, item);
                        newURLTemp = newURLTemp.replace(/^www\.(.*)$/i,'$1');  // strip www
                        var itemURLTemp = itemURL.replace(/^www\.(.*)$/i,'$1');  // strip www
                        if ( newURLTemp !== itemURLTemp ) { // if formatted URLs don't match, then alert the editor to check the existing URL
                            bannButt.longURL.active = true;
                            if (currentWL.longURL) {
                                bannButt.longURL.WLactive = false;
                            }
                            //bannButt.PlaceWebsite.value = "Place Website";
                            if (hpMode.harmFlag && updateURL && itemURL !== item.attributes.url) {  // Update the URL
                                phlogdev("URL formatted");
                                actions.push(new UpdateObject(item, { url: itemURL }));
                                fieldUpdateObject.url='#dfd';
                            }
                            updateURL = false;
                            tempPNHURL = newURL;
                        }
                    }
                    if (hpMode.harmFlag && updateURL && newURL !== item.attributes.url) {  // Update the URL
                        phlogdev("URL updated");
                        actions.push(new UpdateObject(item, { url: newURL }));
                        fieldUpdateObject.url='#dfd';
                    }
                }

                // Phone formatting
                var outputFormat = "({0}) {1}-{2}";
                if ( containsAny(["CA","CO"],[region,state2L]) && (/^\d{3}-\d{3}-\d{4}$/.test(item.attributes.phone))) {
                    outputFormat = "{0}-{1}-{2}";
                } else if (region === "SER" && !(/^\(\d{3}\) \d{3}-\d{4}$/.test(item.attributes.phone))) {
                    outputFormat = "{0}-{1}-{2}";
                } else if (region === "GLR") {
                    outputFormat = "{0}-{1}-{2}";
                } else if (state2L === "NV") {
                    outputFormat = "{0}-{1}-{2}";
                } else if (countryCode === "CAN") {
                    outputFormat = "+1-{0}-{1}-{2}";
                }
                newPhone = normalizePhone(item.attributes.phone, outputFormat, 'existing', item);

                // Check if valid area code  #LOC# USA and CAN only
                if (countryCode === "USA" || countryCode === "CAN") {
                    if (newPhone !== null && newPhone.match(/[2-9]\d{2}/) !== null) {
                        var areaCode = newPhone.match(/[2-9]\d{2}/)[0];
                        if ( areaCodeList.indexOf(areaCode) === -1 ) {
                            bannButt.badAreaCode.active = true;
                            if (currentWL.aCodeWL) {
                                bannButt.badAreaCode.WLactive = false;
                            }
                        }
                    }
                }
                if (hpMode.harmFlag && newPhone !== item.attributes.phone) {
                    phlogdev("Phone updated");
                    actions.push(new UpdateObject(item, {phone: newPhone}));
                    fieldUpdateObject.phone='#dfd';
                }

                // Post Office cat check
                if (newCategories.indexOf("POST_OFFICE") > -1 && countryCode === "USA" ) {
                    var USPSStrings = ['USPS','POSTOFFICE','USPOSTALSERVICE','UNITEDSTATESPOSTALSERVICE','USPO','USPOSTOFFICE','UNITEDSTATESPOSTOFFICE','UNITEDSTATESPOSTALOFFICE'];
                    var USPSMatch = false;
                    for (var uspix=0; uspix<USPSStrings.length; uspix++) {
                        if ( newName.toUpperCase().replace(/[ \/\-\.]/g,'').indexOf(USPSStrings[uspix]) > -1 ) {  // If it already has a USPS type term in the name, don't add the option
                            USPSMatch = true;
                            customStoreFinderURL = "https://tools.usps.com/go/POLocatorAction.action";
                            customStoreFinder = true;
                            if ( newName.indexOf(' - ') === -1 && newName.indexOf(': ') === -1 ) {
                                bannButt.formatUSPS.active = true;
                            }
                            break;
                        }
                    }
                    if (!USPSMatch) {
                        lockOK = false;
                        bannButt.isitUSPS.active = true;
                        bannButt.catPostOffice.active = true;
                    }
                }  // END Post Office category check

            }  // END if (!residential && has name)

            // Name check
            if ( !item.attributes.residential && ( !newName || newName.replace(/[^A-Za-z0-9]/g,'').length === 0 )) {
                if (item.isParkingLot()) {
                    // If it's a parking lot and not locked to R3...
                    if (item.attributes.lockRank < 2) {
                        lockOK = false;
                        bannButt.plaNameMissing.active = true;
                        var msgAdd;
                        if (usrRank < 3) {
                            msgAdd = ' Request an R3+ lock to confirm unnamed parking lot.';
                        } else {
                            msgAdd = ' Lock to R3+ to confirm unnamed parking lot.';
                            // bannButt.plaNameMissing.value = 'Lock';
                            // bannButt.plaNameMissing.action = function() {
                            //     W.model.actionManager.add(new UpdateObject(item, {'lockRank': 2}));
                            //     harmonizePlaceGo(item, 'harmonize');
                            // };
                            // bannButt.plaNameMissing.title = 'DO NOT LOCK if you are not completing this place!';
                        }
                        bannButt.plaNameMissing.message += msgAdd;
                    }
                }else if ( 'ISLAND|FOREST_GROVE|SEA_LAKE_POOL|RIVER_STREAM|CANAL'.split('|').indexOf(item.attributes.categories[0]) === -1 ) {
                    bannButt.nameMissing.active = true;
                    lockOK = false;
                }
            }

            // House number / HN check
            var currentHN = item.attributes.houseNumber;
            // Check to see if there's an action that is currently updating the house number.
            var updateHnAction = actions && actions.find(function(action) { return action.newAttributes && action.newAttributes.houseNumber; });
            if (updateHnAction) currentHN = updateHnAction.newAttributes.houseNumber;
            // Use the inferred address street if currently no street.
            var hasStreet = item.attributes.streetID || (inferredAddress && inferredAddress.street);

            if (hasStreet && (!currentHN || currentHN.replace(/\D/g,'').length === 0)) {
                if ( 'BRIDGE|ISLAND|FOREST_GROVE|SEA_LAKE_POOL|RIVER_STREAM|CANAL|DAM|TUNNEL'.split('|').indexOf(item.attributes.categories[0]) === -1 ) {
                    if (state2L === 'PR') {
                        bannButt.hnMissing.active = true;
                        bannButt.hnMissing.severity = 0;
                    } else {
                        bannButt.hnMissing.active = true;
                        if (currentWL.HNWL) {
                            bannButt.hnMissing.severity = 0;
                            bannButt.hnMissing.WLactive = false;
                        } else {
                            lockOK = false;
                        }
                    }
                }
            } else if (currentHN) {
                var hnOK = false, updateHNflag = false;
                var hnTemp = currentHN.replace(/[^\d]/g, '');  // Digits only
                var hnTempDash = currentHN.replace(/[^\d-]/g, '');  // Digits and dashes only
                if ( hnTemp < 1000000 && state2L === "NY" && addr.city.attributes.name === 'Queens' && hnTempDash.match(/^\d{1,4}-\d{1,4}$/g) !== null ) {
                    updateHNflag = true;
                    hnOK = true;
                }
                if (hnTemp === currentHN && hnTemp < 1000000) {  //  general check that HN is 6 digits or less, & that it is only [0-9]
                    hnOK = true;
                }
                if (state2L === "HI" && hnTempDash.match(/^\d{1,2}-\d{1,4}$/g) !== null) {
                    if (hnTempDash === hnTempDash.match(/^\d{1,2}-\d{1,4}$/g)[0]) {
                        hnOK = true;
                    }
                }

                if (!hnOK) {
                    bannButt.hnNonStandard.active = true;
                    if (currentWL.hnNonStandard) {
                        bannButt.hnNonStandard.WLactive = false;
                        bannButt.hnNonStandard.severity = 0;
                    } else {
                        lockOK = false;
                    }
                }
                if ( updateHNflag ) {
                    bannButt.hnDashRemoved.active = true;
                    if (hpMode.harmFlag) {
                        actions.push(new UpdateObject(item, { houseNumber: hnTemp }));
                        fieldUpdateObject.address='#dfd';
                    } else if (hpMode.hlFlag) {
                        if (item.attributes.residential) {
                            bannButt.hnDashRemoved.severity = 3;
                        } else {
                            bannButt.hnDashRemoved.severity = 1;
                        }
                    }
                }
            }

            if ((!addr.city || addr.city.attributes.isEmpty) && 'BRIDGE|ISLAND|FOREST_GROVE|SEA_LAKE_POOL|RIVER_STREAM|CANAL|DAM|TUNNEL'.split('|').indexOf(item.attributes.categories[0]) === -1 ) {
                bannButt.cityMissing.active = true;
                if (item.attributes.residential && hpMode.hlFlag) {
                    bannButt.cityMissing.severity = 1;
                }
                lockOK = false;
            }
            if (addr.city && (!addr.street || addr.street.isEmpty) && 'BRIDGE|ISLAND|FOREST_GROVE|SEA_LAKE_POOL|RIVER_STREAM|CANAL|DAM|TUNNEL'.split('|').indexOf(item.attributes.categories[0]) === -1 ) {
                bannButt.streetMissing.active = true;
                lockOK = false;
            }

            // CATEGORY vs. NAME checks
            var testName = newName.toLowerCase().replace(/[^a-z]/g,' ');
            var testNameWords = testName.split(' ');
            // Hopsital vs. Name filter
            if ((newCategories.indexOf('HOSPITAL_URGENT_CARE') > -1 || newCategories.indexOf("HOSPITAL_MEDICAL_CARE") > -1) && hospitalPartMatch.length > 0) {
                var hpmMatch = false;
                if (containsAny(testNameWords,animalFullMatch)) {
                    bannButt.changeToPetVet.active = true;
                    if (currentWL.changeToPetVet) {
                        bannButt.changeToPetVet.WLactive = false;
                    } else {
                        lockOK = false;
                    }
                    bannButt.pnhCatMess.active = false;
                } else if (containsAny(testNameWords,hospitalFullMatch)) {
                    bannButt.changeToDoctorClinic.active = true;
                    bannButt.changeToDoctorClinic.message = "Keywords suggest this location may not be a hospital or urgent care location.";
                    if (currentWL.changeToDoctorClinic) {
                        bannButt.changeToDoctorClinic.WLactive = false;
                        bannButt.changeToDoctorClinic.severity = 0;
                    } else {
                        bannButt.changeToDoctorClinic.WLactive = true;
                        lockOK = false;
                        bannButt.changeToDoctorClinic.severity = 3;
                    }
                    bannButt.pnhCatMess.active = false;
                } else {
                    for (var apmix=0; apmix<animalPartMatch.length; apmix++) {
                        if (testName.indexOf(animalPartMatch[apmix]) > -1) {
                            bannButt.changeToPetVet.active = true;
                            if (currentWL.changeToPetVet) {
                                bannButt.changeToPetVet.WLactive = false;
                            } else {
                                lockOK = false;
                            }
                            hpmMatch = true;  // don't run the human check if animal is found.
                            bannButt.pnhCatMess.active = false;
                            break;
                        }
                    }
                    if (!hpmMatch) {  // don't run the human check if animal is found.
                        for (var hpmix=0; hpmix<hospitalPartMatch.length; hpmix++) {
                            if (testName.indexOf(hospitalPartMatch[hpmix]) > -1) {
                                if (currentWL.changeToDoctorClinic) {
                                    bannButt.changeToDoctorClinic.WLactive = false;
                                } else {
                                    lockOK = false;
                                }
                                hpmMatch = true;
                                bannButt.pnhCatMess.active = false;
                                break;
                            }
                        }
                    }
                    if (!hpmMatch) {
                        bannButt.changeToDoctorClinic.active = true;
                    }
                }
            }  // END HOSPITAL/Name check

            // School vs. Name filter
            if (newCategories.indexOf("SCHOOL") > -1 && schoolPartMatch.length>0) {
                if (containsAny(testNameWords,schoolFullMatch)) {
                    bannButt.changeSchool2Offices.active = true;
                    if (currentWL.changeSchool2Offices) {
                        bannButt.changeSchool2Offices.WLactive = false;
                    } else {
                        lockOK = false;
                    }
                    bannButt.pnhCatMess.active = false;
                } else {
                    for (var schix=0; schix<schoolPartMatch.length; schix++) {
                        if (testName.indexOf(schoolPartMatch[schix]) > -1) {
                            bannButt.changeSchool2Offices.active = true;
                            if (currentWL.changeSchool2Offices) {
                                bannButt.changeSchool2Offices.WLactive = false;
                            } else {
                                lockOK = false;
                            }
                            bannButt.pnhCatMess.active = false;
                            break;
                        }
                    }
                }
            }  // END SCHOOL/Name check

            // Some cats don't need PNH messages and url/phone severities
            if ( 'BRIDGE|FOREST_GROVE|DAM|TUNNEL|CEMETERY'.split('|').indexOf(item.attributes.categories[0]) > -1 ) {
                bannButt.NewPlaceSubmit.active = false;
                bannButt.phoneMissing.severity = 0;
                bannButt.phoneMissing.WLactive = false;
                bannButt.urlMissing.severity = 0;
                bannButt.urlMissing.WLactive = false;
            }
            // Some cats don't need PNH messages and url/phone messages
            if ( 'ISLAND|SEA_LAKE_POOL|RIVER_STREAM|CANAL'.split('|').indexOf(item.attributes.categories[0]) > -1 ) {
                bannButt.NewPlaceSubmit.active = false;
                bannButt.phoneMissing.active = false;
                bannButt.urlMissing.active = false;
            }


            // Show the Change To Doctor / Clinic button for places with PERSONAL_CARE or OFFICES category
            if (hpMode.harmFlag && ((newCategories.indexOf('PERSONAL_CARE') > -1 && !PNHNameRegMatch) || newCategories.indexOf('OFFICES') > -1)) {
                bannButt.changeToDoctorClinic.message = 'If this place provides non-emergency medical care: ';
                bannButt.changeToDoctorClinic.active = true;
                bannButt.changeToDoctorClinic.severity = 0;
                bannButt.changeToDoctorClinic.WLactive = null;
            }

            // *** Rest Area parsing
            // check rest area name against standard formats or if has the right categories

            // ****************************************************************************************************
            // 1/2/2017 (mapomatic) Technically, TRANSPORTATION should be the 1st category according to the wiki,
            // but due to a bug in WME, we can't force that.  I've temporarily changed the check for TRANSPORTATION
            // and SCENIC_LOOKOUT_VIEWPOINT to be < 2 instead of === 0 and === 1, respectively.
            // ****************************************************************************************************
            var lookoutCatIndex = categories.indexOf('SCENIC_LOOKOUT_VIEWPOINT');
            if ( /rest area/i.test(newName) || /rest stop/i.test(newName) || /service plaza/i.test(newName) ||
                ( lookoutCatIndex > -1 ) ) {
                if ( lookoutCatIndex > -1 ) {

                    if (categories.indexOf('TRANSPORTATION') > -1) {
                        bannButt.restAreaNoTransportation.active = true;
                    }
                    if ( item.isPoint() ) {  // needs to be area
                        bannButt.areaNotPoint.active = true;
                    }
                    bannButt.pointNotArea.active = false;
                    bannButt.unmappedRegion.active = false;

                    if ( categories.indexOf('GAS_STATION') > -1 ) {
                        bannButt.restAreaGas.active = true;
                    }

                    if ( newName.match(/^Rest Area.* \- /) === null ) {
                        bannButt.restAreaName.active = true;
                        if (currentWL.restAreaName) {
                            bannButt.restAreaName.WLactive = false;
                        }
                    } else {
                        newName = newName.replace(/Mile/i, 'mile');
                        if (hpMode.harmFlag) {
                            if (newName !== item.attributes.name) {
                                actions.push(new UpdateObject(item, { name: newName }));
                                fieldUpdateObject.name='#dfd';
                                phlogdev('Lower case "mile"');
                            } else {
                                // The new name matches the original name, so the only change would have been to capitalize "Mile", which
                                // we don't want. So remove any previous name-change action.  Note: this feels like a hack and is probably
                                // a fragile workaround.  The name shouldn't be capitalized in the first place, unless necessary.
                                for (var i=0; i<actions.length; i++) {
                                    var action = actions[i];
                                    if (action.newAttributes.name) {
                                        actions.splice(i,1);
                                        fieldUpdateObject.name='';
                                        break;
                                    }
                                }
                            }
                        }
                    }

                    // switch to rest area wiki button
                    bannButt2.restAreaWiki.active = true;
                    bannButt2.placesWiki.active = false;

                    // missing address ok
                    bannButt.streetMissing.active = false;
                    bannButt.cityMissing.active = false;
                    bannButt.hnMissing.active = false;
                    bannButt.urlMissing.severity = 0;
                    bannButt.phoneMissing.severity = 0;
                    //assembleBanner();
                } else {
                    bannButt.restAreaSpec.active = true;
                    if (currentWL.restAreaSpec) {
                        bannButt.restAreaSpec.WLactive = false;
                    } else {
                        bannButt.restAreaSpec.active = false;
                    }
                }
            }

            // update Severity for banner messages
            for (var bannKey in bannButt) {
                if (bannButt.hasOwnProperty(bannKey) && bannButt[bannKey].active) {
                    severityButt = Math.max(bannButt[bannKey].severity, severityButt);
                }
            }

            if (hpMode.harmFlag) {
                phlogdev('Severity: '+severityButt+'; lockOK: '+lockOK);
            }
            // Place locking
            // final formatting of desired lock levels
            var hlLockFlag = false, levelToLock;
            if (PNHLockLevel !== -1 && hpMode.harmFlag) {
                phlogdev('PNHLockLevel: '+PNHLockLevel);
                levelToLock = PNHLockLevel;
            } else {
                levelToLock = defaultLockLevel;
            }
            if (region === "SER") {
                if (newCategories.indexOf("COLLEGE_UNIVERSITY") > -1 && newCategories.indexOf("PARKING_LOT") > -1) {
                    levelToLock = lockLevel4;
                } else if ( item.isPoint() && newCategories.indexOf("COLLEGE_UNIVERSITY") > -1 && (newCategories.indexOf("HOSPITAL_MEDICAL_CARE") === -1 || newCategories.indexOf("HOSPITAL_URGENT_CARE") === -1) ) {
                    levelToLock = lockLevel4;
                }
            }

            if (levelToLock > (usrRank - 1)) {levelToLock = (usrRank - 1);}  // Only lock up to the user's level

            // If no Google link and severity would otherwise allow locking, ask if user wants to lock anyway.
            if (!isLocked && lockOK && bannButt.extProviderMissing.active && severityButt <= 2) {
                bannButt.extProviderMissing.severity = 3;
                severityButt = 3;
                bannButt.extProviderMissing.value = 'Lock anyway? (' + (levelToLock + 1) + ')';
                bannButt.extProviderMissing.title = 'If no Google link exists, lock this place.\nIf there is still no Google link after 6 months from the last update date, it will turn red as a reminder to search again.';
                bannButt.extProviderMissing.action = function() {
                    var action = new UpdateObject(item, {'lockRank': levelToLock});
                    W.model.actionManager.add(action);
                    harmonizePlaceGo(item, 'harmonize');
                };
            }

            if ( lockOK && severityButt < 2) {
                // Campus project exceptions
                if ( item.attributes.lockRank < levelToLock) {
                    if (hpMode.harmFlag) {
                        phlogdev("Venue locked!");
                        actions.push(new UpdateObject(item, { lockRank: levelToLock }));
                        fieldUpdateObject.lockRank='#dfd';
                    } else if (hpMode.hlFlag) {
                        hlLockFlag = true;
                    }
                }
                bannButt.placeLocked.active = true;
            }

            //IGN check
            if (!item.attributes.residential && item.attributes.updatedBy && W.model.users.get(item.attributes.updatedBy) &&
                W.model.users.get(item.attributes.updatedBy).userName && W.model.users.get(item.attributes.updatedBy).userName.match(/^ign_/i) !== null) {
                bannButt.ignEdited.active = true;
            }

            //waze_maint_bot check
            var updatedById = item.attributes.updatedBy ? item.attributes.updatedBy : item.attributes.createdBy;
            var updatedBy = W.model.users.get(updatedById);
            var updatedByName = updatedBy ? updatedBy.userName : null;
            var botNamesAndIDs = [
                '^waze-maint', '^105774162$',
                '^waze3rdparty$', '^361008095$',
                '^WazeParking1$', '^338475699$',
                '^admin$', '^-1$',
                '^avsus$', '^107668852$'
            ];
            var re = new RegExp(botNamesAndIDs.join('|'),'i');

            if (!item.attributes.residential && updatedById && (re.test(updatedById.toString()) || (updatedByName && re.test(updatedByName))))  {
                bannButt.wazeBot.active = true;
            }

            // RPP Locking option for R3+
            if (item.attributes.residential) {
                if (devUser || betaUser || usrRank >= 3) {  // Allow residential point locking by R3+
                    RPPLockString = 'Lock at <select id="RPPLockLevel">';
                    var ddlSelected = false;
                    for (var llix=1; llix<6; llix++) {
                        if (llix < usrRank+1) {
                            if ( !ddlSelected && (defaultLockLevel === llix - 1 || llix === usrRank) ) {
                                RPPLockString += '<option value="'+llix+'" selected="selected">'+llix+'</option>';
                                ddlSelected = true;
                            } else {
                                RPPLockString += '<option value="'+llix+'">'+llix+'</option>';
                            }
                        }
                    }
                    RPPLockString += '</select>';
                    bannButt.lockRPP.message = 'Current lock: '+ (parseInt(item.attributes.lockRank)+1) +'. '+RPPLockString+' ?';
                    bannButt.lockRPP.active = true;
                }
            }

            // Turn off unnecessary buttons
            if (item.attributes.categories.indexOf('PHARMACY') > -1) {
                bannButt.addPharm.active = false;
            }
            if (item.attributes.categories.indexOf('SUPERMARKET_GROCERY') > -1) {
                bannButt.addSuper.active = false;
            }

            // Final alerts for non-severe locations
            if ( !item.attributes.residential && severityButt < 3) {
                var nameShortSpace = newName.toUpperCase().replace(/[^A-Z \']/g, '');
                if ( nameShortSpace.indexOf("'S HOUSE") > -1 || nameShortSpace.indexOf("'S HOME") > -1 || nameShortSpace.indexOf("'S WORK") > -1) {
                    if ( !containsAny(newCategories,['RESTAURANT','DESSERT','BAR']) && !PNHNameRegMatch ) {
                        bannButt.resiTypeNameSoft.active = true;
                    }
                }
                if ( ["HOME","MY HOME","HOUSE","MY HOUSE","PARENTS HOUSE","CASA","MI CASA","WORK","MY WORK","MY OFFICE","MOMS HOUSE","DADS HOUSE","MOM","DAD"].indexOf( nameShortSpace ) > -1 ) {
                    bannButt.resiTypeName.active = true;
                    if (currentWL.resiTypeName) {
                        bannButt.resiTypeName.WLactive = false;
                    }
                    bannButt.resiTypeNameSoft.active = false;
                }
                if ( item.attributes.description.toLowerCase().indexOf('google') > -1 || item.attributes.description.toLowerCase().indexOf('yelp') > -1 ) {
                    bannButt.suspectDesc.active = true;
                    if (currentWL.suspectDesc) {
                        bannButt.suspectDesc.WLactive = false;
                    }
                }

                // ### Review the ones below here
                /*
                if (newName === "UPS") {
                    sidebarMessageOld.push("If this is a 'UPS Store' location, please change the name to The UPS Store and run the script again.");
                    severity = Math.max(1, severity);
                }
                if (newName === "FedEx") {
                    sidebarMessageOld.push("If this is a FedEx Office location, please change the name to FedEx Office and run the script again.");
                    severity = Math.max(1, severity);
                }
                */

            }

            // Return severity for highlighter (no dupe run))
            if (hpMode.hlFlag) {
                // get severities from the banners
                severityButt = 0;
                for ( var tempKey in bannButt ) {
                    if ( bannButt.hasOwnProperty(tempKey) && bannButt[tempKey].hasOwnProperty('active') && bannButt[tempKey].active ) {  //  If the particular message is active
                        if ( bannButt[tempKey].hasOwnProperty('WLactive') ) {
                            if ( bannButt[tempKey].WLactive ) {  // If there's a WL option, enable it
                                severityButt = Math.max(bannButt[tempKey].severity, severityButt);
                                //                                if ( bannButt[tempKey].severity > 0) {
                                //                                    phlogdev('Issue with '+item.attributes.name+': '+tempKey);
                                //                                    phlogdev('Severity: '+bannButt[tempKey].severity);
                                //                                }
                            }
                        } else {
                            severityButt = Math.max(bannButt[tempKey].severity, severityButt);
                            //                            if ( bannButt[tempKey].severity > 0) {
                            //                                phlogdev('Issue with '+item.attributes.name+': '+tempKey);
                            //                                phlogdev('Severity: '+bannButt[tempKey].severity);
                            //                            }
                        }
                    }

                }
                //phlogdev('calculated in harmGo: ' +severityButt + '; ' + item.attributes.name);

                // Special case flags
                if (  item.attributes.lockRank === 0 && (item.attributes.categories.indexOf("HOSPITAL_MEDICAL_CARE") > -1 || item.attributes.categories.indexOf("HOSPITAL_URGENT_CARE") > -1 || item.isGasStation()) ) {
                    severityButt = 5;
                }

                if ( severityButt === 0 && hlLockFlag ) {
                    severityButt = 'lock';
                }
                if ( severityButt === 1 && hlLockFlag ) {
                    severityButt = 'lock1';
                }
                if ( item.attributes.adLocked ) {
                    severityButt = 'adLock';
                }

                return severityButt;
            }

            // *** Below here is for harmonization only.  HL ends in previous step.

            // Run nearby duplicate place finder function

            var dupeBannMess = '', dupesFound = false;
            dupeHNRangeList = [];
            bannDupl = {};
            if (newName.replace(/[^A-Za-z0-9]/g,'').length > 0 && !item.attributes.residential && !isEmergencyRoom(item)) {
                if ( $("#WMEPH-DisableDFZoom" + devVersStr).prop('checked') ) {  // don't zoom and pan for results outside of FOV
                    duplicateName = findNearbyDuplicate(newName, newAliases, item, false);
                } else {
                    duplicateName = findNearbyDuplicate(newName, newAliases, item, true);
                }
                if (duplicateName[1]) {
                    bannButt.overlapping.active = true;
                }
                duplicateName = duplicateName[0];
                if (duplicateName.length > 0) {
                    if (duplicateName.length+1 !== dupeIDList.length && devUser) {  // If there's an issue with the data return, allow an error report
                        if (confirm('WMEPH: Dupefinder Error!\nClick OK to report this') ) {  // if the category doesn't translate, then pop an alert that will make a forum post to the thread
                            forumMsgInputs = {
                                subject: 'WMEPH Bug report DupeID',
                                message: 'Script version: ' + WMEPHversion + devVersStr + '\nPermalink: ' + placePL + '\nPlace name: ' + item.attributes.name + '\nCountry: ' + addr.country.name + '\n--------\nDescribe the error:\nDupeID mismatch with dupeName list'
                            };
                            WMEPH_errorReport(forumMsgInputs);
                        }
                    } else {
                        dupesFound = true;
                        dupeBannMess = 'Possible duplicate: ';
                        if (duplicateName.length > 1) {
                            dupeBannMess = 'Possible duplicates: ';
                        }
                        for (var ijx=1; ijx<duplicateName.length+1; ijx++) {
                            bannDupl[dupeIDList[ijx]] = {
                                active: true, severity: 2, message: "&nbsp-- " + duplicateName[ijx-1],
                                WLactive: false, WLvalue: wlButtText, WLtitle: 'Whitelist Duplicate',
                                WLaction: function(dID) {
                                    wlKeyName = 'dupeWL';
                                    if (!venueWhitelist.hasOwnProperty(itemID)) {  // If venue is NOT on WL, then add it.
                                        venueWhitelist[itemID] = { dupeWL: [] };
                                    }
                                    if (!venueWhitelist[itemID].hasOwnProperty(wlKeyName)) {  // If dupeWL key is not in venue WL, then initialize it.
                                        venueWhitelist[itemID][wlKeyName] = [];
                                    }
                                    venueWhitelist[itemID].dupeWL.push(dID);  // WL the id for the duplicate venue
                                    venueWhitelist[itemID].dupeWL = uniq(venueWhitelist[itemID].dupeWL);
                                    // Make an entry for the opposite item
                                    if (!venueWhitelist.hasOwnProperty(dID)) {  // If venue is NOT on WL, then add it.
                                        venueWhitelist[dID] = { dupeWL: [] };
                                    }
                                    if (!venueWhitelist[dID].hasOwnProperty(wlKeyName)) {  // If dupeWL key is not in venue WL, then initialize it.
                                        venueWhitelist[dID][wlKeyName] = [];
                                    }
                                    venueWhitelist[dID].dupeWL.push(itemID);  // WL the id for the duplicate venue
                                    venueWhitelist[dID].dupeWL = uniq(venueWhitelist[dID].dupeWL);
                                    saveWL_LS(true);  // Save the WL to local storage
                                    WMEPH_WLCounter();
                                    bannButt2.clearWL.active = true;
                                    bannDupl[dID].active = false;
                                    harmonizePlaceGo(item,'harmonize');
                                }
                            };
                            if ( venueWhitelist.hasOwnProperty(itemID) && venueWhitelist[itemID].hasOwnProperty('dupeWL') && venueWhitelist[itemID].dupeWL.indexOf(dupeIDList[ijx]) > -1 ) {  // if the dupe is on the whitelist then remove it from the banner
                                bannDupl[dupeIDList[ijx]].active = false;
                            } else {  // Otherwise, activate the WL button
                                bannDupl[dupeIDList[ijx]].WLactive = true;
                            }
                        }  // END loop for duplicate venues
                    }
                }
            }

            // Check HN range (this depends on the returned dupefinder data, so has to run after it)
            if (dupeHNRangeList.length > 3) {
                var dhnix, dupeHNRangeListSorted = [];
                sortWithIndex(dupeHNRangeDistList);
                for (dhnix = 0; dhnix < dupeHNRangeList.length; dhnix++) {
                    dupeHNRangeListSorted.push(dupeHNRangeList[ dupeHNRangeDistList.sortIndices[dhnix] ]);
                }
                // Calculate HN/distance ratio with other venues
                // var sumHNRatio = 0;
                var arrayHNRatio = [];
                for (dhnix = 0; dhnix < dupeHNRangeListSorted.length; dhnix++) {
                    arrayHNRatio.push(Math.abs( (parseInt(item.attributes.houseNumber) - dupeHNRangeListSorted[dhnix]) / dupeHNRangeDistList[dhnix] ));
                }
                sortWithIndex(arrayHNRatio);
                // Examine either the median or the 8th index if length is >16
                var arrayHNRatioCheckIX = Math.min(Math.round(arrayHNRatio.length/2), 8);
                if (arrayHNRatio[arrayHNRatioCheckIX] > 1.4) {
                    bannButt.HNRange.active = true;
                    if (currentWL.HNRange) {
                        bannButt.HNRange.WLactive = false;
                    }
                    if (arrayHNRatio[arrayHNRatioCheckIX] > 5) {
                        bannButt.HNRange.severity = 3;
                    }
                    // show stats if HN out of range
                    phlogdev('HNs: ' + dupeHNRangeListSorted);
                    phlogdev('Distances: ' + dupeHNRangeDistList);
                    phlogdev('arrayHNRatio: ' + arrayHNRatio);
                    phlogdev('HN Ratio Score: ' + arrayHNRatio[Math.round(arrayHNRatio.length/2)]);
                }
            }

            executeMultiAction(actions);

            if (hpMode.harmFlag) {
                // Update icons to reflect current WME place services
                updateServicesChecks(bannServ);
            }

            // Turn on website linking button if there is a url
            //if (newURL !== null && newURL !== "") {
            //bannButt.PlaceWebsite.active = true;
            //}

            // Highlight the changes made
            highlightChangedFields(fieldUpdateObject,hpMode);

            // Assemble the banners
            assembleBanner();  // Make Messaging banners

            showOpenPlaceWebsiteButton();
        }  // END harmonizePlaceGo function

        // **** vvv Function definitions vvv ****

        // highlight changed fields
        function highlightChangedFields(fieldUpdateObject,hpMode) {

            if (hpMode.harmFlag) {
                //var panelFields = {};
                getPanelFields();
                var tab1HL = false;
                var tab2HL = false;
                //phlogdev(fieldUpdateObject);
                if (fieldUpdateObject.name) {
                    $('.form-control')[panelFields.name].style="background-color:"+fieldUpdateObject.name;
                    tab1HL = true;
                }
                if (fieldUpdateObject.aliases) {
                    var field = $('.alias-name')[0];
                    if (field) field.style="background-color:"+fieldUpdateObject.aliases;
                    tab1HL = true;
                }
                if (fieldUpdateObject.categories) {
                    $('.select2-choices')[0].style="background-color:"+fieldUpdateObject.categories;
                    tab1HL = true;
                }
                if (fieldUpdateObject.brand) {
                    $('.form-control')[panelFields.brand].style="background-color:"+fieldUpdateObject.brand;
                    tab1HL = true;
                }
                if (fieldUpdateObject.description) {
                    $('.form-control')[panelFields.description].style="background-color:"+fieldUpdateObject.description;
                    tab1HL = true;
                }
                if (fieldUpdateObject.lockRank) {
                    $('.form-control')[panelFields.lockRank].style="background-color:"+fieldUpdateObject.lockRank;
                    tab1HL = true;
                }
                if (fieldUpdateObject.address) {
                    $('.address-edit')[0].style='background-color:'+fieldUpdateObject.address;
                    tab1HL = true;
                }

                if (fieldUpdateObject.url) {
                    $('.form-control')[panelFields.url].style="background-color:"+fieldUpdateObject.url;
                    tab2HL = true;
                }
                if (fieldUpdateObject.phone) {
                    $('.form-control')[panelFields.phone].style="background-color:"+fieldUpdateObject.phone;
                    tab2HL = true;
                }
                if (fieldUpdateObject.openingHours) {
                    $('.opening-hours')[0].style="background-color:#dfd";
                    tab2HL = true;
                }
                if (fieldUpdateObject.services.VALLET_SERVICE) {
                    $('.service-checkbox')[0].style="background-color:#dfd";
                    tab2HL = true;
                }
                if (fieldUpdateObject.services.DRIVETHROUGH) {
                    $('.service-checkbox')[1].style="background-color:#dfd";
                    tab2HL = true;
                }
                if (fieldUpdateObject.services.WI_FI) {
                    $('.service-checkbox')[2].style="background-color:#dfd";
                    tab2HL = true;
                }
                if (fieldUpdateObject.services.RESTROOMS) {
                    $('.service-checkbox')[3].style="background-color:#dfd";
                    tab2HL = true;
                }
                if (fieldUpdateObject.services.CREDIT_CARDS) {
                    $('.service-checkbox')[4].style="background-color:#dfd";
                    tab2HL = true;
                }
                if (fieldUpdateObject.services.RESERVATIONS) {
                    $('.service-checkbox')[5].style="background-color:#dfd";
                    tab2HL = true;
                }
                if (fieldUpdateObject.services.OUTSIDE_SEATING) {
                    $('.service-checkbox')[6].style="background-color:#dfd";
                    tab2HL = true;
                }
                if (fieldUpdateObject.services.AIR_CONDITIONING) {
                    $('.service-checkbox')[7].style="background-color:#dfd";
                    tab2HL = true;
                }
                if (fieldUpdateObject.services.PARKING_FOR_CUSTOMERS) {
                    $('.service-checkbox')[8].style="background-color:#dfd";
                    tab2HL = true;
                }
                if (fieldUpdateObject.services.DELIVERIES) {
                    $('.service-checkbox')[9].style="background-color:#dfd";
                    tab2HL = true;
                }
                if (fieldUpdateObject.services.TAKE_AWAY) {
                    $('.service-checkbox')[10].style="background-color:#dfd";
                    tab2HL = true;
                }
                if (fieldUpdateObject.services.WHEELCHAIR_ACCESSIBLE) {
                    $('.service-checkbox')[11].style="background-color:#dfd";
                    tab2HL = true;
                }

                var placeNavTabs = $('.nav');
                for (pfix=0; pfix<placeNavTabs.length; pfix++) {
                    pfa = placeNavTabs[pfix].innerHTML;
                    if (pfa.indexOf('landmark-edit') > -1) {
                        panelFieldsList = placeNavTabs[pfix].children;
                        panelFields.navTabsIX = pfix;
                        break;
                    }
                }
                for (pfix=0; pfix<panelFieldsList.length; pfix++) {
                    pfa = panelFieldsList[pfix].innerHTML;
                    if (pfa.indexOf('landmark-edit-general') > -1) {
                        panelFields.navTabGeneral = pfix;
                    }
                    if (pfa.indexOf('landmark-edit-more') > -1) {
                        panelFields.navTabMore = pfix;
                    }
                }

                if (tab1HL) {
                    $('.nav')[panelFields.navTabsIX].children[panelFields.navTabGeneral].children[0].style='background-color:#dfd';
                }
                if (tab2HL) {
                    $('.nav')[panelFields.navTabsIX].children[panelFields.navTabMore].children[0].style='background-color:#dfd';
                }
            }
        }


        // Set up banner messages
        function assembleBanner() {
            phlogdev('Building banners');
            // push together messages from active banner messages
            var sidebarMessage = [], sidebarTools = [];  // Initialize message array
            var tempKey, strButt1, dupesFound = false;
            severityButt = 0;

            // Setup duplicates banners
            strButt1 = 'Possible duplicates: ';
            for ( tempKey in bannDupl ) {
                if (bannDupl.hasOwnProperty(tempKey) && bannDupl[tempKey].hasOwnProperty('active') && bannDupl[tempKey].active) {
                    dupesFound = true;
                    strButt1 += '<br>' + bannDupl[tempKey].message;
                    if (bannDupl[tempKey].hasOwnProperty('action')) {
                        // Nothing happening here yet.
                    }
                    if (bannDupl[tempKey].hasOwnProperty('WLactive') && bannDupl[tempKey].WLactive && bannDupl[tempKey].hasOwnProperty('WLaction') ) {  // If there's a WL option, enable it
                        severityButt = Math.max(bannDupl[tempKey].severity, severityButt);
                        strButt1 += ' <input class="btn btn-success btn-xs wmephwl-btn" id="WMEPH_WL' + tempKey + '" title="' + bannDupl[tempKey].WLtitle + '" type="button" value="' + bannDupl[tempKey].WLvalue + '">';
                    }
                }
            }
            if (dupesFound) {  // if at least 1 dupe
                sidebarMessage.push(strButt1);
            }

            // Build banners above the Services
            var $webDiv;
            for ( tempKey in bannButt ) {
                if ( bannButt.hasOwnProperty(tempKey) && bannButt[tempKey].hasOwnProperty('active') && bannButt[tempKey].active ) {  //  If the particular message is active
                    strButt1 = bannButt[tempKey].message;
                    if (bannButt[tempKey].badInput) {
                        strButt1 = strButt1.replace(/#DDF/i,'pink');
                    }
                    if (bannButt[tempKey].hasOwnProperty('action')) {
                        strButt1 += ' <input class="btn btn-default btn-xs wmeph-btn" id="WMEPH_' + tempKey + '" title="' + bannButt[tempKey].title + '" type="button" value="' + bannButt[tempKey].value + '"></input>';
                    }
                    if (bannButt[tempKey].hasOwnProperty('action2')) {
                        strButt1 += ' <input class="btn btn-default btn-xs wmeph-btn" id="WMEPH_' + tempKey + '_2" title="' + bannButt[tempKey].title2 + '" type="button" value="' + bannButt[tempKey].value2 + '"></input>';
                    }
                    if ( bannButt[tempKey].hasOwnProperty('WLactive') ) {
                        if ( bannButt[tempKey].WLactive && bannButt[tempKey].hasOwnProperty('WLaction') ) {  // If there's a WL option, enable it
                            severityButt = Math.max(bannButt[tempKey].severity, severityButt);
                            strButt1 += bannButt[tempKey].WLmessage + ' <input class="btn btn-success btn-xs wmephwl-btn" id="WMEPH_WL' + tempKey + '" title="' + bannButt[tempKey].WLtitle + '" type="button" value="WL">';
                            //strButt1 += bannButt[tempKey].WLmessage + ' <input class="fa fa-check-square" id="WMEPH_WL' + tempKey + '" title="' + bannButt[tempKey].WLtitle + '" type="button" style="color:green;" >';
                            //strButt1 += bannButt[tempKey].WLmessage + ' <button class="btn btn-default btn-xs wmephwl-btn" id="WMEPH_WL' + tempKey + '" title="' + bannButt[tempKey].WLtitle + '" type="button" ><i class="fa fa-check-square" style="color:green;></i></button>';
                        }
                    } else {
                        severityButt = Math.max(bannButt[tempKey].severity, severityButt);
                    }
                    if (tempKey.toUpperCase() === 'PLACEWEBSITE' || tempKey.toUpperCase() === 'WEBSEARCH') {
                        if (!$webDiv) {
                            $webDiv = $('<div>').attr({id:'wmeph-web-buttons'});
                        }
                        $webDiv.append(strButt1);
                    } else {
                        sidebarMessage.push(strButt1);
                    }
                }
            }

            if ($webDiv) {
                sidebarMessage.push($webDiv[0].outerHTML);
            }
            if ( $("#WMEPH-ColorHighlighting" + devVersStr).prop('checked') ) {
                item = W.selectionManager.selectedItems[0].model;
                item.attributes.wmephSeverity = severityButt;
            }

            // setup Add Service Buttons for suggested services
            var sidebarServButts = '', servButtHeight = '27', greyOption;
            for ( tempKey in bannServ ) {
                if ( bannServ.hasOwnProperty(tempKey) && bannServ[tempKey].hasOwnProperty('active') && bannServ[tempKey].active ) {  //  If the particular service is active
                    if ( bannServ[tempKey].checked ) {
                        greyOption = '';
                    } else {
                        greyOption = '-webkit-filter: opacity(.25);filter: opacity(.25);';
                        //greyOption = '-webkit-filter: brightness(3); filter: brightness(3);';
                    }
                    //strButt1 = '&nbsp<input class="servButton" id="WMEPH_' + tempKey + '" title="' + bannServ[tempKey].title + '" type="image" style="height:' + servButtHeight +
                    //    'px;background:none;border-color: none;border-style: none;" src="https://openmerchantaccount.com/img2/' + bannServ[tempKey].icon + greyOption + '.png">';
                    strButt1 = '&nbsp<input class="'+bannServ[tempKey].icon+'" id="WMEPH_' + tempKey + '" type="button" title="' + bannServ[tempKey].title +
                        '" style="border:0;background-size: contain; height:' + servButtHeight + 'px;width: '+Math.ceil(servButtHeight*bannServ[tempKey].w2hratio).toString()+'px;'+greyOption+'">';
                    sidebarServButts += strButt1;
                }
            }
            if (sidebarServButts.length>0) {
                sidebarTools.push('Add services:<br>' + sidebarServButts);
            }

            //  Build general banners (below the Services)
            for ( tempKey in bannButt2 ) {
                if ( bannButt2.hasOwnProperty(tempKey) && bannButt2[tempKey].hasOwnProperty('active') && bannButt2[tempKey].active ) {  //  If the particular message is active
                    strButt1 = bannButt2[tempKey].message;
                    if (bannButt2[tempKey].hasOwnProperty('action')) {
                        strButt1 += ' <input class="btn btn-info btn-xs wmeph-btn" id="WMEPH_' + tempKey + '" title="' + bannButt2[tempKey].title + '" style="" type="button" value="' + bannButt2[tempKey].value + '">';
                    }
                    sidebarTools.push(strButt1);
                    severityButt = Math.max(bannButt2[tempKey].severity, severityButt);
                }
            }

            // Add banner indicating that it's the beta version
            // if (isDevVersion) {
            //     sidebarTools.push('WMEPH Beta');
            // }

            // Post the banners to the sidebar
            displayTools( sidebarTools.join("</div><div>") );
            displayBanners(sidebarMessage.join("</div><div>"), severityButt );

            // Set up Duplicate onclicks
            if ( dupesFound ) {
                setupButtons(bannDupl);
            }
            // Setup bannButt onclicks
            setupButtons(bannButt);
            // Setup bannServ onclicks
            setupButtons(bannServ);
            // Setup bannButt2 onclicks
            setupButtons(bannButt2);

            // if (bannButt.noHours.active) {
            //     var button = document.getElementById('WMEPH_noHoursA2');
            //     button.onclick = function() {
            //         bannButt.noHours.action2();
            //         assembleBanner();
            //     };
            // }

            // Add click handlers for parking lot helper buttons.
            $('.wmeph-pla-spaces-btn').click(function() {
                var selectedValue = $(this).attr('id').replace('wmeph_','');
                var existingAttr = item.attributes.categoryAttributes.PARKING_LOT;
                var newAttr = {};
                if (existingAttr) {
                    for (var prop in existingAttr) {
                        var value = existingAttr[prop];
                        if (Array.isArray(value)) value = value.clone();
                        newAttr[prop] = value;
                    };
                }
                newAttr.estimatedNumberOfSpots = selectedValue;
                W.model.actionManager.add(new UpdateObject(item, {'categoryAttributes': {PARKING_LOT: newAttr}}));
                harmonizePlaceGo(item, 'harmonize');
            });
            $('.wmeph-pla-lot-type-btn').click(function() {
                var selectedValue = $(this).attr('id').replace('wmeph_','');
                var existingAttr = item.attributes.categoryAttributes.PARKING_LOT;
                var newAttr = {};
                if (existingAttr) {
                    for (var prop in existingAttr) {
                        var value = existingAttr[prop];
                        if (Array.isArray(value)) value = value.clone();
                        newAttr[prop] = value;
                    };
                }
                newAttr.parkingType = selectedValue;
                W.model.actionManager.add(new UpdateObject(item, {'categoryAttributes': {PARKING_LOT: newAttr}}));
                harmonizePlaceGo(item, 'harmonize');
            });

            $('.wmeph-pla-cost-type-btn').click(function() {
                var selectedValue = $(this).attr('id').replace('wmeph_','');
                var existingAttr = item.attributes.categoryAttributes.PARKING_LOT;
                var newAttr = {};
                if (existingAttr) {
                    for (var prop in existingAttr) {
                        var value = existingAttr[prop];
                        if (Array.isArray(value)) value = value.clone();
                        newAttr[prop] = value;
                    };
                }
                newAttr.costType = selectedValue;
                W.model.actionManager.add(new UpdateObject(item, {'categoryAttributes': {PARKING_LOT: newAttr}}));
                harmonizePlaceGo(item, 'harmonize');
            });
            // // Street entry textbox stuff
            // var streetNames = [];
            // var streetNamesCap = [];
            // W.model.streets.getObjectArray().forEach(function(st) {
            //     if (!st.isEmpty) {
            //         streetNames.push(st.name);
            //         streetNamesCap.push(st.name.toUpperCase());
            //     }
            // });
            // streetNames.sort();
            // streetNamesCap.sort();
            // $('#WMEPH_missingStreet').autocomplete({
            //     source: streetNames,
            //     change: onStreetChanged,
            //     select: onStreetSelected,
            //     response: function(e, ui) {
            //         var maxListLength = 10;
            //         if(ui.content.length > maxListLength) {
            //             ui.content.splice(maxListLength, ui.content.length - maxListLength);
            //         }
            //     }
            // });
            // function onStreetSelected(e, ui) {
            //     if (ui.item) {
            //         checkStreet(ui.item.value);
            //     }
            // }
            // function onStreetChanged(e, ui) {
            //     checkStreet(null);
            // }
            // $('#WMEPH_addStreetBtn').on('click', addStreetToVenue);
            // function addStreetToVenue() {
            //     var stName = $('#WMEPH_missingStreet').val();
            //     var street = W.model.streets.getByAttributes({name:stName})[0];
            //     var addr = item.getAddress().attributes;
            //     var newAddr = {
            //         country: addr.country,
            //         state: addr.state,
            //         city: addr.city,
            //         street: street
            //     };
            //     updateAddress(item, newAddr);
            //     bannButt.streetMissing.active = false;
            //     assembleBanner();
            // }
            // function checkStreet(name) {
            //     name = (name || $("#WMEPH_missingStreet").val()).toUpperCase();
            //     var ix = streetNamesCap.indexOf(name);
            //     var enable = false;
            //     if (ix > -1) {
            //         color = 'lightgreen';
            //         $("#WMEPH_missingStreet").val(streetNames[ix]);
            //         enable = true;
            //         $('#WMEPH_addStreetBtn').prop("disabled", false).removeClass('disabled');
            //     } else {
            //         $('#WMEPH_addStreetBtn').prop('disabled', true).addClass('disabled');
            //     }
            //     return enable;
            // }
            // // If pressing enter in the street entry box, add the street
            // $("#WMEPH_missingStreet").keyup(function(event){
            //     if( event.keyCode === 13 && $('#WMEPH_missingStreet').val() !== '' ){
            //         if(checkStreet(null)) {
            //             addStreetToVenue();
            //         }
            //     }
            // });

            // If pressing enter in the HN entry box, add the HN
            $("#WMEPH-HNAdd"+devVersStr).keyup(function(event){
                if( event.keyCode === 13 && $('#WMEPH-HNAdd'+devVersStr).val() !== '' ){
                    $("#WMEPH_hnMissing").click();
                }
            });

            // If pressing enter in the phone entry box, add the phone
            $("#WMEPH-PhoneAdd"+devVersStr).keyup(function(event){
                if( event.keyCode === 13 && $('#WMEPH-PhoneAdd'+devVersStr).val() !== '' ){
                    $("#WMEPH_phoneMissing").click();
                }
            });

            // If pressing enter in the URL entry box, add the URL
            $("#WMEPH-UrlAdd"+devVersStr).keyup(function(event){
                if( event.keyCode === 13 && $('#WMEPH-UrlAdd'+devVersStr).val() !== '' ){
                    $("#WMEPH_urlMissing").click();
                }
            });

            // If pressing enter in the hours entry box, parse the entry
            $("#WMEPH-HoursPaste"+devVersStr).keyup(function(event){
                if( event.keyCode === 13 && $('#WMEPH-HoursPaste'+devVersStr).val() !== '' ){
                    $("#WMEPH_noHours").click();
                }
            });
            $("#WMEPH-HoursPaste"+devVersStr).click(function(){
                if (this.value === 'Paste Hours Here' || this.value === 'Can\'t parse, try again') {
                    this.value = '';
                }
                this.style.color = 'black';
            }).blur(function(){
                if ( this.value === '') {
                    this.value = 'Paste Hours Here';
                    this.style.color = '#999';
                }
            });
        }  // END assemble Banner function

        // Button onclick event handler
        function setupButtons(b) {
            for ( var tempKey in b ) {  // Loop through the banner possibilities
                if ( b.hasOwnProperty(tempKey) && b[tempKey].active ) {  //  If the particular message is active
                    if (b[tempKey].hasOwnProperty('action')) {  // If there is an action, set onclick
                        buttonAction(b, tempKey);
                    }
                    if (b[tempKey].hasOwnProperty('action2')) {  // If there is an action2, set onclick
                        buttonAction2(b, tempKey);
                    }
                    // If there's a WL option, set up onclick
                    if ( b[tempKey].hasOwnProperty('WLactive') && b[tempKey].WLactive && b[tempKey].hasOwnProperty('WLaction') ) {
                        buttonWhitelist(b, tempKey);
                    }
                }
            }
        }  // END setupButtons function

        function buttonAction(b,bKey) {
            var button = document.getElementById('WMEPH_'+bKey);
            button.onclick = function() {
                b[bKey].action();
                assembleBanner();
            };
            return button;
        }
        function buttonAction2(b,bKey) {
            var button = document.getElementById('WMEPH_'+bKey+'_2');
            button.onclick = function() {
                b[bKey].action2();
                assembleBanner();
            };
            return button;
        }
        function buttonWhitelist(b,bKey) {
            var button = document.getElementById('WMEPH_WL'+bKey);
            button.onclick = function() {
                if ( bKey.match(/^\d{5,}/) !== null ) {
                    b[bKey].WLaction(bKey);
                } else {
                    b[bKey].WLaction();
                }
                b[bKey].WLactive = false;
                b[bKey].severity = 0;
                assembleBanner();
            };
            return button;
        }


        // Setup div for banner messages and color
        function displayBanners(sbm,sev) {
            if ($('#WMEPH_banner').length === 0 ) {
                $('<div id="WMEPH_banner">').css({"width": "100%", "background-color": "#fff", "color": "white", "font-size": "14px", "padding": "3px", "margin-left": "auto", "margin-right": "auto"}).prependTo(".contents");
            } else {
                $('#WMEPH_banner').empty();
            }
            var bgColor;
            switch (sev) {
                case 1:
                    bgColor = "rgb(50, 50, 230)";  // blue
                    break;
                case 2:
                    bgColor = "rgb(217, 173, 42)";  // yellow
                    break;
                case 3:
                    bgColor = "rgb(211, 48, 48)";  // red
                    break;
                default:
                    bgColor = "rgb(36, 172, 36)";  // green
            }
            $('#WMEPH_banner').css({"background-color": bgColor});
            sbm = '<div>' + sbm + '</div>';
            $("#WMEPH_banner").append(sbm);
            $('#select2-drop').css({display:'none'});
        }  // END displayBanners funtion

        // Setup div for banner messages and color
        function displayTools(sbm) {
            if ($('#WMEPH_tools').length === 0 ) {
                $('<div id="WMEPH_tools">').css({"width": "100%", "background-color": "#eee", "color": "black", "font-size": "15px", "font-weight": "bold", "padding": "3px", "margin-left": "auto", "margin-right": "auto"}).prependTo(".contents");
            } else {
                $('#WMEPH_tools').empty();
            }
            sbm = '<div><span style="position:relative;">' + sbm+ '</span></div>';
            $("#WMEPH_tools").append(sbm);
            $('#select2-drop').css({display:'none'});
        }  // END displayBanners funtion

        // CSS setups
        var cssCode = [
            ".btn.wmeph-btn {padding: 0px 3px}",
            ".btn.wmephwl-btn {padding: 0px 1px}"
        ];
        for (var cssix=0; cssix<cssCode.length; cssix++) {
            insertCss(cssCode[cssix]);
        }

        // Display run button on place sidebar
        function displayRunButton() {
            var betaDelay = 100;
            setTimeout(function() {
                if ($('#WMEPH_runButton').length === 0 ) {
                    $('<div id="WMEPH_runButton">').css({"padding-bottom": "6px", "padding-top": "3px", "width": "290", "background-color": "#FFF", "color": "black", "font-size": "15px", "font-weight": "bold", "margin-left": "auto", "margin-right": "auto"}).prependTo(".contents");
                }
                if ($('#runWMEPH'+devVersStr).length === 0 ) {
                    var strButt1 = '<input class="btn btn-primary" id="runWMEPH'+devVersStr+'" title="Run WMEPH'+devVersStrSpace+' on Place" type="button" value="Run WMEPH'+devVersStrSpace+'">';
                    $("#WMEPH_runButton").append(strButt1);
                }
                var btn = document.getElementById("runWMEPH"+devVersStr);
                if (btn !== null) {
                    btn.onclick = function() {
                        harmonizePlace();
                    };
                } else {
                    setTimeout(bootstrapRunButton,100);
                }
                if ( W.selectionManager.selectedItems.length === 1 ) {
                    item = W.selectionManager.selectedItems[0].model;
                    if ( item.attributes.categories.length === 1 && item.attributes.categories[0] === 'SHOPPING_AND_SERVICES' ) {
                        $('.suggested-categories').remove();
                    }
                }
                showOpenPlaceWebsiteButton();
            }, betaDelay);
        }  // END displayRunButton funtion

        // Displays the Open Place Website button.
        function showOpenPlaceWebsiteButton() {
            if (item) {
                var openPlaceWebsiteURL = item.attributes.url;
                if (openPlaceWebsiteURL && openPlaceWebsiteURL.replace(/[^A-Za-z0-9]/g,'').length > 2) {
                    if ($('#WMEPHurl').length === 0  ) {
                        strButt1 = '<input class="btn btn-success btn-xs" id="WMEPHurl" title="Open place URL" type="button" value="Open Website" style="margin-left:3px;">';
                        $("#runWMEPH" + devVersStr).after(strButt1);
                        btn = document.getElementById("WMEPHurl");
                        if (btn !== null) {
                            btn.onclick = function() {
                                var item = W.selectionManager.selectedItems[0];
                                if (item && item.model && item.model.attributes) {
                                    openPlaceWebsiteURL = item.model.attributes.url;
                                    if (openPlaceWebsiteURL.match(/^http/i) === null) {
                                        openPlaceWebsiteURL = 'http:\/\/'+openPlaceWebsiteURL;
                                    }
                                    if ( $("#WMEPH-WebSearchNewTab" + devVersStr).prop('checked') ) {
                                        window.open(openPlaceWebsiteURL);
                                    } else {
                                        window.open(openPlaceWebsiteURL, searchResultsWindowName, searchResultsWindowSpecs);
                                    }
                                }
                            };
                        } else {
                            setTimeout(bootstrapRunButton,100);
                        }
                    }
                } else {
                    if ($('#WMEPHurl').length > 0  ) {
                        $('#WMEPHurl').remove();
                    }
                }
            }
        }

        // WMEPH Clone Tool
        function displayCloneButton() {
            var betaDelay = 80;
            if (isDevVersion) { betaDelay = 300; }
            setTimeout(function() {
                if ($('#WMEPH_runButton').length === 0 ) {
                    $('<div id="WMEPH_runButton">').css({"padding-bottom": "6px", "padding-top": "3px", "width": "290", "background-color": "#FFF", "color": "black", "font-size": "15px", "font-weight": "bold", "margin-left": "auto;", "margin-right": "auto"}).prependTo(".contents");
                }
                var strButt1, btn;
                item = W.selectionManager.selectedItems[0].model;
                if (item) {
                    showOpenPlaceWebsiteButton();
                    if ($('#clonePlace').length === 0 ) {
                        strButt1 = '<div style="margin-bottom: 3px;"></div><input class="btn btn-warning btn-xs wmeph-btn" id="clonePlace" title="Copy place info" type="button" value="Copy">'+
                            ' <input class="btn btn-warning btn-xs wmeph-btn" id="pasteClone" title="Apply the Place info. (Ctrl-Alt-O)" type="button" value="Paste (for checked boxes):"><br>';
                        $("#WMEPH_runButton").append(strButt1);
                        createCloneCheckbox('WMEPH_runButton', 'WMEPH_CPhn', 'HN');
                        createCloneCheckbox('WMEPH_runButton', 'WMEPH_CPstr', 'Str');
                        createCloneCheckbox('WMEPH_runButton', 'WMEPH_CPcity', 'City');
                        createCloneCheckbox('WMEPH_runButton', 'WMEPH_CPurl', 'URL');
                        createCloneCheckbox('WMEPH_runButton', 'WMEPH_CPph', 'Ph');
                        $("#WMEPH_runButton").append('<br>');
                        createCloneCheckbox('WMEPH_runButton', 'WMEPH_CPdesc', 'Desc');
                        createCloneCheckbox('WMEPH_runButton', 'WMEPH_CPserv', 'Serv');
                        createCloneCheckbox('WMEPH_runButton', 'WMEPH_CPhrs', 'Hrs');
                        strButt1 = '<input class="btn btn-info btn-xs wmeph-btn" id="checkAllClone" title="Check all" type="button" value="All">'+
                            ' <input class="btn btn-info btn-xs wmeph-btn" id="checkAddrClone" title="Check Address" type="button" value="Addr">'+
                            ' <input class="btn btn-info btn-xs wmeph-btn" id="checkNoneClone" title="Check none" type="button" value="None"><br>';
                        $("#WMEPH_runButton").append(strButt1);
                    }
                    btn = document.getElementById("clonePlace");
                    if (btn !== null) {
                        btn.onclick = function() {
                            item = W.selectionManager.selectedItems[0].model;
                            cloneMaster = {};
                            cloneMaster.addr = item.getAddress();
                            if ( cloneMaster.addr.hasOwnProperty('attributes') ) {
                                cloneMaster.addr = cloneMaster.addr.attributes;
                            }
                            cloneMaster.houseNumber = item.attributes.houseNumber;
                            cloneMaster.url = item.attributes.url;
                            cloneMaster.phone = item.attributes.phone;
                            cloneMaster.description = item.attributes.description;
                            cloneMaster.services = item.attributes.services;
                            cloneMaster.openingHours = item.attributes.openingHours;
                            phlogdev('Place Cloned');
                        };
                    } else {
                        setTimeout(bootstrapRunButton,100);
                        return;
                    }
                    btn = document.getElementById("pasteClone");
                    if (btn !== null) {
                        btn.onclick = function() {
                            clonePlace();
                        };
                    } else {
                        setTimeout(bootstrapRunButton,100);
                    }
                    btn = document.getElementById("checkAllClone");
                    if (btn !== null) {
                        btn.onclick = function() {
                            if ( !$("#WMEPH_CPhn").prop('checked') ) { $("#WMEPH_CPhn").trigger('click'); }
                            if ( !$("#WMEPH_CPstr").prop('checked') ) { $("#WMEPH_CPstr").trigger('click'); }
                            if ( !$("#WMEPH_CPcity").prop('checked') ) { $("#WMEPH_CPcity").trigger('click'); }
                            if ( !$("#WMEPH_CPurl").prop('checked') ) { $("#WMEPH_CPurl").trigger('click'); }
                            if ( !$("#WMEPH_CPph").prop('checked') ) { $("#WMEPH_CPph").trigger('click'); }
                            if ( !$("#WMEPH_CPserv").prop('checked') ) { $("#WMEPH_CPserv").trigger('click'); }
                            if ( !$("#WMEPH_CPdesc").prop('checked') ) { $("#WMEPH_CPdesc").trigger('click'); }
                            if ( !$("#WMEPH_CPhrs").prop('checked') ) { $("#WMEPH_CPhrs").trigger('click'); }
                        };
                    } else {
                        setTimeout(bootstrapRunButton,100);
                    }
                    btn = document.getElementById("checkAddrClone");
                    if (btn !== null) {
                        btn.onclick = function() {
                            if ( !$("#WMEPH_CPhn").prop('checked') ) { $("#WMEPH_CPhn").trigger('click'); }
                            if ( !$("#WMEPH_CPstr").prop('checked') ) { $("#WMEPH_CPstr").trigger('click'); }
                            if ( !$("#WMEPH_CPcity").prop('checked') ) { $("#WMEPH_CPcity").trigger('click'); }
                            if ( $("#WMEPH_CPurl").prop('checked') ) { $("#WMEPH_CPurl").trigger('click'); }
                            if ( $("#WMEPH_CPph").prop('checked') ) { $("#WMEPH_CPph").trigger('click'); }
                            if ( $("#WMEPH_CPserv").prop('checked') ) { $("#WMEPH_CPserv").trigger('click'); }
                            if ( $("#WMEPH_CPdesc").prop('checked') ) { $("#WMEPH_CPdesc").trigger('click'); }
                            if ( $("#WMEPH_CPhrs").prop('checked') ) { $("#WMEPH_CPhrs").trigger('click'); }
                        };
                    } else {
                        setTimeout(bootstrapRunButton,100);
                    }
                    btn = document.getElementById("checkNoneClone");
                    if (btn !== null) {
                        btn.onclick = function() {
                            if ( $("#WMEPH_CPhn").prop('checked') ) { $("#WMEPH_CPhn").trigger('click'); }
                            if ( $("#WMEPH_CPstr").prop('checked') ) { $("#WMEPH_CPstr").trigger('click'); }
                            if ( $("#WMEPH_CPcity").prop('checked') ) { $("#WMEPH_CPcity").trigger('click'); }
                            if ( $("#WMEPH_CPurl").prop('checked') ) { $("#WMEPH_CPurl").trigger('click'); }
                            if ( $("#WMEPH_CPph").prop('checked') ) { $("#WMEPH_CPph").trigger('click'); }
                            if ( $("#WMEPH_CPserv").prop('checked') ) { $("#WMEPH_CPserv").trigger('click'); }
                            if ( $("#WMEPH_CPdesc").prop('checked') ) { $("#WMEPH_CPdesc").trigger('click'); }
                            if ( $("#WMEPH_CPhrs").prop('checked') ) { $("#WMEPH_CPhrs").trigger('click'); }
                        };
                    } else {
                        setTimeout(bootstrapRunButton,100);
                    }
                }
            }, betaDelay);
        }  // END displayCloneButton funtion



        // Catch PLs and reloads that have a place selected already and limit attempts to about 10 seconds
        function bootstrapRunButton() {
            if (numAttempts < 10) {
                numAttempts++;
                if (W.selectionManager.selectedItems.length === 1) {
                    var item = W.selectionManager.selectedItems[0].model;
                    if ((item.type === "venue") && item.isApproved()) {
                        displayRunButton();
                        showOpenPlaceWebsiteButton();
                        getPanelFields();
                        if (localStorage.getItem("WMEPH-EnableCloneMode" + devVersStr) === '1') {
                            displayCloneButton();
                        }
                    }
                } else {
                    setTimeout(bootstrapRunButton,1000);
                }
            }
        }

        // Find field divs
        function getPanelFields() {
            var panelFieldsList = $('.form-control'), pfa;
            for (var pfix=0; pfix<panelFieldsList.length; pfix++) {
                pfa = panelFieldsList[pfix].name;
                if (pfa === 'name') {
                    panelFields.name = pfix;
                }
                if (pfa === 'lockRank') {
                    panelFields.lockRank = pfix;
                }
                if (pfa === 'description') {
                    panelFields.description = pfix;
                }
                if (pfa === 'url') {
                    panelFields.url = pfix;
                }
                if (pfa === 'phone') {
                    panelFields.phone = pfix;
                }
                if (pfa === 'brand') {
                    panelFields.brand = pfix;
                }
            }
            var placeNavTabs = $('.nav');
            for (pfix=0; pfix<placeNavTabs.length; pfix++) {
                pfa = placeNavTabs[pfix].innerHTML;
                if (pfa.indexOf('landmark-edit') > -1) {
                    panelFieldsList = placeNavTabs[pfix].children;
                    panelFields.navTabsIX = pfix;
                    break;
                }
            }
            for (pfix=0; pfix<panelFieldsList.length; pfix++) {
                pfa = panelFieldsList[pfix].innerHTML;
                if (pfa.indexOf('landmark-edit-general') > -1) {
                    panelFields.navTabGeneral = pfix;
                }
                if (pfa.indexOf('landmark-edit-more') > -1) {
                    panelFields.navTabMore = pfix;
                }
            }


        }

        // Catch PLs and reloads that have a place selected already and limit attempts to about 10 seconds
        numAttempts = 0;
        function bootstrapInferAddress() {
            if (numAttempts < 20) {
                numAttempts++;
                var inferredAddress = WMEPH_inferAddress(7);
                if (!inferredAddress) {
                    setTimeout(bootstrapInferAddress,500);
                } else {
                    return inferredAddress;
                }
            }
        }

        // Function to clone info from a place
        function clonePlace() {
            phlog('Cloning info...');
            var UpdateObject = require("Waze/Action/UpdateObject");
            if (cloneMaster !== null && cloneMaster.hasOwnProperty('url')) {
                item = W.selectionManager.selectedItems[0].model;
                var cloneItems = {};
                var updateItem = false;
                if ( $("#WMEPH_CPhn").prop('checked') ) {
                    cloneItems.houseNumber = cloneMaster.houseNumber;
                    updateItem = true;
                }
                if ( $("#WMEPH_CPurl").prop('checked') ) {
                    cloneItems.url = cloneMaster.url;
                    updateItem = true;
                }
                if ( $("#WMEPH_CPph").prop('checked') ) {
                    cloneItems.phone = cloneMaster.phone;
                    updateItem = true;
                }
                if ( $("#WMEPH_CPdesc").prop('checked') ) {
                    cloneItems.description = cloneMaster.description;
                    updateItem = true;
                }
                if ( $("#WMEPH_CPserv").prop('checked') ) {
                    cloneItems.services = cloneMaster.services;
                    updateItem = true;
                }
                if ( $("#WMEPH_CPhrs").prop('checked') ) {
                    cloneItems.openingHours = cloneMaster.openingHours;
                    updateItem = true;
                }
                if (updateItem) {
                    W.model.actionManager.add(new UpdateObject(item, cloneItems) );
                    phlogdev('Item details cloned');
                }

                var copyStreet = $("#WMEPH_CPstr").prop('checked');
                var copyCity = $("#WMEPH_CPcity").prop('checked');

                if (copyStreet || copyCity) {
                    var originalAddress = item.getAddress();
                    var itemRepl = {
                        street: copyStreet ? cloneMaster.addr.street : originalAddress.attributes.street,
                        city: copyCity ? cloneMaster.addr.city : originalAddress.attributes.city,
                        state: copyCity ? cloneMaster.addr.state : originalAddress.attributes.state,
                        country: copyCity ? cloneMaster.addr.country : originalAddress.attributes.country
                    };
                    updateAddress(item, itemRepl);
                    phlogdev('Item address cloned');
                }
            } else {
                phlog('Please copy a place');
            }
        }

        // Formats "hour object" into a string.
        function formatOpeningHour(hourEntry) {
            var dayNames = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
            var hours = hourEntry.attributes.fromHour + '-' + hourEntry.attributes.toHour;
            return hourEntry.attributes.days.map(function(day) {
                return dayNames[day] + ' ' + hours;
            }).join(', ');
        }
        // Pull natural text from opening hours
        function getOpeningHours(venue) {
            return venue && venue.getOpeningHours && venue.getOpeningHours().map(formatOpeningHour);
        }
        // Parse hours paste for hours object array
        function parseHours(inputHours) {
            var daysOfTheWeek = {
                SS: ['saturdays', 'saturday', 'satur', 'sat', 'sa'],
                UU: ['sundays', 'sunday', 'sun', 'su'],
                MM: ['mondays', 'monday', 'mondy', 'mon', 'mo'],
                TT: ['tuesdays', 'tuesday', 'tues', 'tue', 'tu'],
                WW: ['wednesdays', 'wednesday', 'weds', 'wed', 'we'],
                RR: ['thursdays', 'thursday', 'thurs', 'thur', 'thu', 'th'],
                FF: ['fridays', 'friday', 'fri', 'fr']
            };
            var monthsOfTheYear = {
                JAN: ['january', 'jan'],
                FEB: ['february', 'febr', 'feb'],
                MAR: ['march', 'mar'],
                APR: ['april', 'apr'],
                MAY: ['may', 'may'],
                JUN: ['june', 'jun'],
                JUL: ['july', 'jul'],
                AUG: ['august', 'aug'],
                SEP: ['september', 'sept', 'sep'],
                OCT: ['october', 'oct'],
                NOV: ['november', 'nov'],
                DEC: ['december', 'dec']
            };
            var dayCodeVec = ['MM','TT','WW','RR','FF','SS','UU','MM','TT','WW','RR','FF','SS','UU','MM','TT','WW','RR','FF'];
            var tfHourTemp, tfDaysTemp, newDayCodeVec = [];
            var tempRegex, twix, tsix;
            var inputHoursParse = inputHours.toLowerCase();
            inputHoursParse = inputHoursParse.replace(/paste hours here/i, "");  // make sure something is pasted
            phlogdev(inputHoursParse);
            inputHoursParse = inputHoursParse.replace(/can\'t parse\, try again/i, "");  // make sure something is pasted
            if (inputHoursParse === '' || inputHoursParse === ',') {
                phlogdev('No hours');
                return false;
            }
            inputHoursParse = inputHoursParse.replace(/\u2013|\u2014/g, "-");  // long dash replacing
            inputHoursParse = inputHoursParse.replace(/[^a-z0-9\:\-\. ~]/g, ' ');  // replace unnecessary characters with spaces
            inputHoursParse = inputHoursParse.replace(/\:{2,}/g, ':');  // remove extra colons
            inputHoursParse = inputHoursParse.replace(/closed/g, '99:99-99:99').replace(/not open/g, '99:99-99:99');  // parse 'closed'
            inputHoursParse = inputHoursParse.replace(/by appointment only/g, '99:99-99:99').replace(/by appointment/g, '99:99-99:99');  // parse 'appointment only'
            inputHoursParse = inputHoursParse.replace(/weekdays/g, 'mon-fri').replace(/weekends/g, 'sat-sun');  // convert weekdays and weekends to days
            inputHoursParse = inputHoursParse.replace(/12:00 noon/g, "12:00").replace(/12:00 midnight/g, "00:00");  // replace 'noon', 'midnight'
            inputHoursParse = inputHoursParse.replace(/12 noon/g, "12:00").replace(/12 midnight/g, "00:00");  // replace 'noon', 'midnight'
            inputHoursParse = inputHoursParse.replace(/noon/g, "12:00").replace(/midnight/g, "00:00");  // replace 'noon', 'midnight'
            inputHoursParse = inputHoursParse.replace(/every day/g, "mon-sun");  // replace 'seven days a week'
            inputHoursParse = inputHoursParse.replace(/seven days a week/g, "mon-sun");  // replace 'seven days a week'
            inputHoursParse = inputHoursParse.replace(/7 days a week/g, "mon-sun");  // replace 'seven days a week'
            inputHoursParse = inputHoursParse.replace(/daily/g, "mon-sun");  // replace 'open daily'
            inputHoursParse = inputHoursParse.replace(/open 24 ?ho?u?rs?/g, "00:00-00:00");  // replace 'open 24 hour or similar'
            inputHoursParse = inputHoursParse.replace(/open twenty\-? ?four ho?u?rs?/g, "00:00-00:00");  // replace 'open 24 hour or similar'
            inputHoursParse = inputHoursParse.replace(/24 ?ho?u?rs?/g, "00:00-00:00");  // replace 'open 24 hour or similar'
            inputHoursParse = inputHoursParse.replace(/twenty\-? ?four ho?u?rs?/g, "00:00-00:00");  // replace 'open 24 hour or similar'
            inputHoursParse = inputHoursParse.replace(/(\D:)([^ ])/g, "$1 $2");  // space after colons after words
            // replace thru type words with dashes
            var thruWords = 'through|thru|to|until|till|til|-|~'.split("|");
            for (twix=0; twix<thruWords.length; twix++) {
                tempRegex = new RegExp(thruWords[twix], "g");
                inputHoursParse = inputHoursParse.replace(tempRegex,'-');
            }
            inputHoursParse = inputHoursParse.replace(/\-{2,}/g, "-");  // replace any duplicate dashes
            phlogdev('Initial parse: ' + inputHoursParse);

            // kill extra words
            var killWords = 'paste|here|business|operation|times|time|walk-ins|walk ins|welcome|dinner|lunch|brunch|breakfast|regular|weekday|weekend|opening|open|now|from|hours|hour|our|are|EST|and|&'.split("|");
            for (twix=0; twix<killWords.length; twix++) {
                tempRegex = new RegExp('\\b'+killWords[twix]+'\\b', "g");
                inputHoursParse = inputHoursParse.replace(tempRegex,'');
            }
            phlogdev('After kill terms: ' + inputHoursParse);

            // replace day terms with double caps
            for (var dayKey in daysOfTheWeek) {
                if (daysOfTheWeek.hasOwnProperty(dayKey)) {
                    var tempDayList = daysOfTheWeek[dayKey];
                    for (var tdix=0; tdix<tempDayList.length; tdix++) {
                        tempRegex = new RegExp(tempDayList[tdix]+'(?!a-z)', "g");
                        inputHoursParse = inputHoursParse.replace(tempRegex,dayKey);
                    }
                }
            }
            phlogdev('Replace day terms: ' + inputHoursParse);

            // Replace dates
            for (var monthKey in monthsOfTheYear) {
                if (monthsOfTheYear.hasOwnProperty(monthKey)) {
                    var tempMonthList = monthsOfTheYear[monthKey];
                    for (var tmix=0; tmix<tempMonthList.length; tmix++) {
                        tempRegex = new RegExp(tempMonthList[tmix]+'\\.? ?\\d{1,2}\\,? ?201\\d{1}', "g");
                        inputHoursParse = inputHoursParse.replace(tempRegex,' ');
                        tempRegex = new RegExp(tempMonthList[tmix]+'\\.? ?\\d{1,2}', "g");
                        inputHoursParse = inputHoursParse.replace(tempRegex,' ');
                    }
                }
            }
            phlogdev('Replace month terms: ' + inputHoursParse);

            // replace any periods between hours with colons
            inputHoursParse = inputHoursParse.replace(/(\d{1,2})\.(\d{2})/g, '$1:$2');
            // remove remaining periods
            inputHoursParse = inputHoursParse.replace(/\./g, '');
            // remove any non-hour colons between letters and numbers and on string ends
            inputHoursParse = inputHoursParse.replace(/(\D+)\:(\D+)/g, '$1 $2').replace(/^ *\:/g, ' ').replace(/\: *$/g, ' ');
            // replace am/pm with AA/PP
            inputHoursParse = inputHoursParse.replace(/ *pm/g,'PP').replace(/ *am/g,'AA');
            inputHoursParse = inputHoursParse.replace(/ *p\.m\./g,'PP').replace(/ *a\.m\./g,'AA');
            inputHoursParse = inputHoursParse.replace(/ *p\.m/g,'PP').replace(/ *a\.m/g,'AA');
            inputHoursParse = inputHoursParse.replace(/ *p/g,'PP').replace(/ *a/g,'AA');
            // tighten up dashes
            inputHoursParse = inputHoursParse.replace(/\- {1,}/g,'-').replace(/ {1,}\-/g,'-');
            inputHoursParse = inputHoursParse.replace(/^(00:00-00:00)$/g,'MM-UU$1');
            phlogdev('AMPM parse: ' + inputHoursParse);

            //  Change all MTWRFSU to doubles, if any other letters return false
            if (inputHoursParse.match(/[bcdeghijklnoqvxyz]/g) !== null) {
                phlogdev('Extra words in the string');
                return false;
            } else {
                inputHoursParse = inputHoursParse.replace(/m/g,'MM').replace(/t/g,'TT').replace(/w/g,'WW').replace(/r/g,'RR');
                inputHoursParse = inputHoursParse.replace(/f/g,'FF').replace(/s/g,'SS').replace(/u/g,'UU');
            }
            phlogdev('MM/TT format: ' + inputHoursParse);

            // tighten up spaces
            inputHoursParse = inputHoursParse.replace(/ {2,}/g,' ');
            inputHoursParse = inputHoursParse.replace(/ {1,}AA/g,'AA');
            inputHoursParse = inputHoursParse.replace(/ {1,}PP/g,'PP');
            // Expand hours into XX:XX format
            for (var asdf=0; asdf<5; asdf++) {  // repeat a few times to catch any skipped regex matches
                inputHoursParse = inputHoursParse.replace(/([^0-9\:])(\d{1})([^0-9\:])/g, '$10$2:00$3');
                inputHoursParse = inputHoursParse.replace(/^(\d{1})([^0-9\:])/g, '0$1:00$2');
                inputHoursParse = inputHoursParse.replace(/([^0-9\:])(\d{1})$/g, '$10$2:00');

                inputHoursParse = inputHoursParse.replace(/([^0-9\:])(\d{2})([^0-9\:])/g, '$1$2:00$3');
                inputHoursParse = inputHoursParse.replace(/^(\d{2})([^0-9\:])/g, '$1:00$2');
                inputHoursParse = inputHoursParse.replace(/([^0-9\:])(\d{2})$/g, '$1$2:00');

                inputHoursParse = inputHoursParse.replace(/(\D)(\d{1})(\d{2}\D)/g, '$10$2:$3');
                inputHoursParse = inputHoursParse.replace(/^(\d{1})(\d{2}\D)/g, '0$1:$2');
                inputHoursParse = inputHoursParse.replace(/(\D)(\d{1})(\d{2})$/g, '$10$2:$3');

                inputHoursParse = inputHoursParse.replace(/(\D\d{2})(\d{2}\D)/g, '$1:$2');
                inputHoursParse = inputHoursParse.replace(/^(\d{2})(\d{2}\D)/g, '$1:$2');
                inputHoursParse = inputHoursParse.replace(/(\D\d{2})(\d{2})$/g, '$1:$2');

                inputHoursParse = inputHoursParse.replace(/(\D)(\d{1}\:)/g, '$10$2');
                inputHoursParse = inputHoursParse.replace(/^(\d{1}\:)/g, '0$1');
            }

            // replace 12AM range with 00
            inputHoursParse = inputHoursParse.replace( /12(\:\d{2}AA)/g, '00$1');
            // Change PM hours to 24hr time
            while (inputHoursParse.match(/\d{2}\:\d{2}PP/) !== null) {
                tfHourTemp = inputHoursParse.match(/(\d{2})\:\d{2}PP/)[1];
                tfHourTemp = parseInt(tfHourTemp) % 12 + 12;
                inputHoursParse = inputHoursParse.replace(/\d{2}(\:\d{2})PP/,tfHourTemp.toString()+'$1');
            }
            // kill the AA
            inputHoursParse = inputHoursParse.replace( /AA/g, '');
            phlogdev('XX:XX format: ' + inputHoursParse);

            // Side check for tabular input
            var inputHoursParseTab = inputHoursParse.replace( /[^A-Z0-9\:-]/g, ' ').replace( / {2,}/g, ' ');
            inputHoursParseTab = inputHoursParseTab.replace( /^ +/g, '').replace( / {1,}$/g, '');
            if (inputHoursParseTab.match(/[A-Z]{2}\:?\-? [A-Z]{2}\:?\-? [A-Z]{2}\:?\-? [A-Z]{2}\:?\-? [A-Z]{2}\:?\-?/g) !== null) {
                inputHoursParseTab = inputHoursParseTab.split(' ');
                var reorderThree = [0,7,14,1,8,15,2,9,16,3,10,17,4,11,18,5,12,19,6,13,20];
                var reorderTwo = [0,7,1,8,2,9,3,10,4,11,5,12,6,13];
                var inputHoursParseReorder = [], reix;
                if (inputHoursParseTab.length === 21) {
                    for (reix=0; reix<21; reix++) {
                        inputHoursParseReorder.push(inputHoursParseTab[reorderThree[reix]]);
                    }
                } else if (inputHoursParseTab.length === 18) {
                    for (reix=0; reix<18; reix++) {
                        inputHoursParseReorder.push(inputHoursParseTab[reorderThree[reix]]);
                    }
                } else if (inputHoursParseTab.length === 15) {
                    for (reix=0; reix<15; reix++) {
                        inputHoursParseReorder.push(inputHoursParseTab[reorderThree[reix]]);
                    }
                } else if (inputHoursParseTab.length === 14) {
                    for (reix=0; reix<14; reix++) {
                        inputHoursParseReorder.push(inputHoursParseTab[reorderTwo[reix]]);
                    }
                } else if (inputHoursParseTab.length === 12) {
                    for (reix=0; reix<12; reix++) {
                        inputHoursParseReorder.push(inputHoursParseTab[reorderTwo[reix]]);
                    }
                } else if (inputHoursParseTab.length === 10) {
                    for (reix=0; reix<10; reix++) {
                        inputHoursParseReorder.push(inputHoursParseTab[reorderTwo[reix]]);
                    }
                }
                //phlogdev('inputHoursParseTab: ' + inputHoursParseTab);
                phlogdev('inputHoursParseReorder: ' + inputHoursParseReorder);
                if (inputHoursParseReorder.length > 9) {
                    inputHoursParseReorder = inputHoursParseReorder.join(' ');
                    inputHoursParseReorder = inputHoursParseReorder.replace(/(\:\d{2}) (\d{2}\:)/g, '$1-$2');
                    inputHoursParse = inputHoursParseReorder;
                }

            }


            // remove colons after Days field
            inputHoursParse = inputHoursParse.replace(/(\D+)\:/g, '$1 ');

            // Find any double sets
            inputHoursParse = inputHoursParse.replace(/([A-Z \-]{2,}) *(\d{2}\:\d{2} *\-{1} *\d{2}\:\d{2}) *(\d{2}\:\d{2} *\-{1} *\d{2}\:\d{2})/g, '$1$2$1$3');
            inputHoursParse = inputHoursParse.replace(/(\d{2}\:\d{2}) *(\d{2}\:\d{2})/g, '$1-$2');
            phlogdev('Add dash: ' + inputHoursParse);

            // remove all spaces
            inputHoursParse = inputHoursParse.replace( / */g, '');

            // Remove any dashes acting as Day separators for 3+ days ("M-W-F")
            inputHoursParse = inputHoursParse.replace( /([A-Z]{2})-([A-Z]{2})-([A-Z]{2})-([A-Z]{2})-([A-Z]{2})-([A-Z]{2})-([A-Z]{2})/g, '$1$2$3$4$5$6$7');
            inputHoursParse = inputHoursParse.replace( /([A-Z]{2})-([A-Z]{2})-([A-Z]{2})-([A-Z]{2})-([A-Z]{2})-([A-Z]{2})/g, '$1$2$3$4$5$6');
            inputHoursParse = inputHoursParse.replace( /([A-Z]{2})-([A-Z]{2})-([A-Z]{2})-([A-Z]{2})-([A-Z]{2})/g, '$1$2$3$4$5');
            inputHoursParse = inputHoursParse.replace( /([A-Z]{2})-([A-Z]{2})-([A-Z]{2})-([A-Z]{2})/g, '$1$2$3$4');
            inputHoursParse = inputHoursParse.replace( /([A-Z]{2})-([A-Z]{2})-([A-Z]{2})/g, '$1$2$3');

            // parse any 'through' type terms on the day ranges (MM-RR --> MMTTWWRR)
            while (inputHoursParse.match(/[A-Z]{2}\-[A-Z]{2}/) !== null) {
                tfDaysTemp = inputHoursParse.match(/([A-Z]{2})\-([A-Z]{2})/);
                var startDayIX = dayCodeVec.indexOf(tfDaysTemp[1]);
                newDayCodeVec = [tfDaysTemp[1]];
                for (var dcvix=startDayIX+1; dcvix<startDayIX+7; dcvix++) {
                    newDayCodeVec.push(dayCodeVec[dcvix]);
                    if (tfDaysTemp[2] === dayCodeVec[dcvix]) {
                        break;
                    }
                }
                newDayCodeVec = newDayCodeVec.join('');
                inputHoursParse = inputHoursParse.replace(/[A-Z]{2}\-[A-Z]{2}/,newDayCodeVec);
            }

            // split the string between numerical and letter characters
            inputHoursParse = inputHoursParse.replace(/([A-Z])\-?\:?([0-9])/g,'$1|$2');
            inputHoursParse = inputHoursParse.replace(/([0-9])\-?\:?([A-Z])/g,'$1|$2');
            inputHoursParse = inputHoursParse.replace(/(\d{2}\:\d{2})\:00/g,'$1');  // remove seconds
            inputHoursParse = inputHoursParse.split("|");
            phlogdev('Split: ' + inputHoursParse);

            var daysVec = [], hoursVec = [];
            for (tsix=0; tsix<inputHoursParse.length; tsix++) {
                if (inputHoursParse[tsix][0].match(/[A-Z]/) !== null) {
                    daysVec.push(inputHoursParse[tsix]);
                } else if (inputHoursParse[tsix][0].match(/[0-9]/) !== null) {
                    hoursVec.push(inputHoursParse[tsix]);
                } else {
                    phlogdev('Filtering error');
                    return false;
                }
            }

            // check that the dayArray and hourArray lengths correspond
            if ( daysVec.length !== hoursVec.length ) {
                phlogdev('Hour and Day arrays are not matched');
                return false;
            }

            // Combine days with the same hours in the same vector
            var newDaysVec = [], newHoursVec = [], hrsIX;
            for (tsix=0; tsix<daysVec.length; tsix++) {
                if (hoursVec[tsix] !== '99:99-99:99') {  // Don't add the closed days
                    hrsIX = newHoursVec.indexOf(hoursVec[tsix]);
                    if (hrsIX > -1) {
                        newDaysVec[hrsIX] = newDaysVec[hrsIX] + daysVec[tsix];
                    } else {
                        newDaysVec.push(daysVec[tsix]);
                        newHoursVec.push(hoursVec[tsix]);
                    }
                }
            }

            var hoursObjectArray = [], hoursObjectArrayMinDay = [], hoursObjectArraySorted = [], hoursObjectAdd, daysObjArray, toFromSplit;
            for (tsix=0; tsix<newDaysVec.length; tsix++) {
                hoursObjectAdd = {};
                daysObjArray = [];
                toFromSplit = newHoursVec[tsix].match(/(\d{2}\:\d{2})\-(\d{2}\:\d{2})/);
                if (toFromSplit === null) {
                    phlogdev('Hours in wrong format');
                    return false;
                } else {  // Check for hours outside of 0-23 and 0-59
                    var hourCheck = toFromSplit[1].match(/(\d{2})\:/)[1];
                    if (hourCheck>23 || hourCheck < 0) {
                        phlogdev('Not a valid time');
                        return false;
                    }
                    hourCheck = toFromSplit[2].match(/(\d{2})\:/)[1];
                    if (hourCheck>23 || hourCheck < 0) {
                        phlogdev('Not a valid time');
                        return false;
                    }
                    hourCheck = toFromSplit[1].match(/\:(\d{2})/)[1];
                    if (hourCheck>59 || hourCheck < 0) {
                        phlogdev('Not a valid time');
                        return false;
                    }
                    hourCheck = toFromSplit[2].match(/\:(\d{2})/)[1];
                    if (hourCheck>59 || hourCheck < 0) {
                        phlogdev('Not a valid time');
                        return false;
                    }
                }
                // Make the days object
                if ( newDaysVec[tsix].indexOf('MM') > -1 ) {
                    daysObjArray.push(1);
                }
                if ( newDaysVec[tsix].indexOf('TT') > -1 ) {
                    daysObjArray.push(2);
                }
                if ( newDaysVec[tsix].indexOf('WW') > -1 ) {
                    daysObjArray.push(3);
                }
                if ( newDaysVec[tsix].indexOf('RR') > -1 ) {
                    daysObjArray.push(4);
                }
                if ( newDaysVec[tsix].indexOf('FF') > -1 ) {
                    daysObjArray.push(5);
                }
                if ( newDaysVec[tsix].indexOf('SS') > -1 ) {
                    daysObjArray.push(6);
                }
                if ( newDaysVec[tsix].indexOf('UU') > -1 ) {
                    daysObjArray.push(0);
                }
                // build the hours object
                hoursObjectAdd.fromHour = toFromSplit[1];
                hoursObjectAdd.toHour = toFromSplit[2];
                hoursObjectAdd.days = daysObjArray.sort();
                hoursObjectArray.push(hoursObjectAdd);
                // track the order
                if (hoursObjectAdd.days.length > 1 && hoursObjectAdd.days[0] === 0) {
                    hoursObjectArrayMinDay.push( hoursObjectAdd.days[1] * 100 + parseInt(toFromSplit[1][0])*10 + parseInt(toFromSplit[1][1]) );
                } else {
                    hoursObjectArrayMinDay.push( (((hoursObjectAdd.days[0]+6)%7)+1) * 100 + parseInt(toFromSplit[1][0])*10 + parseInt(toFromSplit[1][1]) );
                }
            }
            sortWithIndex(hoursObjectArrayMinDay);
            for (var hoaix=0; hoaix < hoursObjectArrayMinDay.length; hoaix++) {
                hoursObjectArraySorted.push(hoursObjectArray[hoursObjectArrayMinDay.sortIndices[hoaix]]);
            }
            if ( !checkHours(hoursObjectArraySorted) ) {
                phlogdev('Overlapping hours');
                return false;
            } else {
                for ( var ohix=0; ohix<hoursObjectArraySorted.length; ohix++ ) {
                    phlogdev(hoursObjectArraySorted[ohix]);
                    if ( hoursObjectArraySorted[ohix].days.length === 2 && hoursObjectArraySorted[ohix].days[0] === 0 && hoursObjectArraySorted[ohix].days[1] === 1) {
                        // separate hours
                        phlogdev('Splitting M-S entry...');
                        hoursObjectArraySorted.push({days: [0], fromHour: hoursObjectArraySorted[ohix].fromHour, toHour: hoursObjectArraySorted[ohix].toHour});
                        hoursObjectArraySorted[ohix].days = [1];
                    }
                }
            }
            return hoursObjectArraySorted;
        }

        // function to check overlapping hours
        function checkHours(hoursObj) {
            if (hoursObj.length === 1) {
                return true;
            }
            var daysObj, fromHourTemp, toHourTemp;
            for (var day2Ch=0; day2Ch<7; day2Ch++) {  // Go thru each day of the week
                daysObj = [];
                for ( var hourSet = 0; hourSet < hoursObj.length; hourSet++ ) {  // For each set of hours
                    if (hoursObj[hourSet].days.indexOf(day2Ch) > -1) {  // pull out hours that are for the current day, add 2400 if it goes past midnight, and store
                        fromHourTemp = hoursObj[hourSet].fromHour.replace(/\:/g,'');
                        toHourTemp = hoursObj[hourSet].toHour.replace(/\:/g,'');
                        if (toHourTemp < fromHourTemp) {
                            toHourTemp = parseInt(toHourTemp) + 2400;
                        }
                        daysObj.push([fromHourTemp, toHourTemp]);
                    }
                }
                if (daysObj.length > 1) {  // If there's multiple hours for the day, check them for overlap
                    for ( var hourSetCheck2 = 1; hourSetCheck2 < daysObj.length; hourSetCheck2++ ) {
                        for ( var hourSetCheck1 = 0; hourSetCheck1 < hourSetCheck2; hourSetCheck1++ ) {
                            if ( daysObj[hourSetCheck2][0] > daysObj[hourSetCheck1][0] && daysObj[hourSetCheck2][0] < daysObj[hourSetCheck1][1] ) {
                                return false;
                            }
                            if ( daysObj[hourSetCheck2][1] > daysObj[hourSetCheck1][0] && daysObj[hourSetCheck2][1] < daysObj[hourSetCheck1][1] ) {
                                return false;
                            }
                        }
                    }
                }
            }
            return true;
        }

        // Duplicate place finder  ###bmtg
        function findNearbyDuplicate(itemName, itemAliases, item, recenterOption) {
            dupeIDList = [item.attributes.id];
            dupeHNRangeList = [];
            dupeHNRangeIDList = [];
            dupeHNRangeDistList = [];
            var venueList = W.model.venues.objects, currNameList = [], testNameList = [], testVenueAtt, testName, testNameNoNum, itemNameRF, aliasNameRF, aliasNameNoNum;
            var t0, t1, wlDupeMatch = false, wlDupeList = [], nameMatch = false, altNameMatch = -1, aliix, cnlix, tnlix, randInt = 100;
            var outOfExtent = false, mapExtent = W.map.getExtent(), padFrac = 0.15;  // how much to pad the zoomed window
            // Initialize the cooridnate extents for duplicates
            var minLon = item.geometry.getCentroid().x, minLat = item.geometry.getCentroid().y;
            var maxLon = minLon, maxLat = minLat;
            // genericterms to skip if it's all that remains after stripping numbers
            var noNumSkip = 'BANK|ATM|HOTEL|MOTEL|STORE|MARKET|SUPERMARKET|GYM|GAS|GASOLINE|GASSTATION|CAFE|OFFICE|OFFICES|CARRENTAL|RENTALCAR|RENTAL|SALON|BAR|BUILDING|LOT';
            noNumSkip = noNumSkip + '|'+ collegeAbbreviations;
            noNumSkip = noNumSkip.split('|');
            // Make the padded extent
            mapExtent.left = mapExtent.left + padFrac * (mapExtent.right-mapExtent.left);
            mapExtent.right = mapExtent.right - padFrac * (mapExtent.right-mapExtent.left);
            mapExtent.bottom = mapExtent.bottom + padFrac * (mapExtent.top-mapExtent.bottom);
            mapExtent.top = mapExtent.top - padFrac * (mapExtent.top-mapExtent.bottom);

            var allowedTwoLetters = ['BP','DQ','BK','BW','LQ','QT','DB','PO'];

            var labelFeatures = [], dupeNames = [], labelText, labelTextReformat, pt, textFeature, labelColorIX = 0;
            var labelColorList = ['#3F3'];
            // Name formatting for the WME place name
            itemNameRF = itemName.toUpperCase().replace(/ AND /g, '').replace(/^THE /g, '').replace(/[^A-Z0-9]/g, '');  // Format name
            if ( itemNameRF.length>2 || allowedTwoLetters.indexOf(itemNameRF) > -1 ) {
                currNameList.push(itemNameRF);
            } else {
                currNameList.push('PRIMNAMETOOSHORT_PJZWX');
            }
            var itemNameNoNum = itemNameRF.replace(/[^A-Z]/g, '');  // Clear non-letter characters for alternate match ( HOLLYIVYPUB23 --> HOLLYIVYPUB )
            if ( ((itemNameNoNum.length>2 && noNumSkip.indexOf(itemNameNoNum) === -1) || allowedTwoLetters.indexOf(itemNameNoNum) > -1) && item.attributes.categories.indexOf('PARKING_LOT') === -1 ) {  //  only add de-numbered name if anything remains
                currNameList.push(itemNameNoNum);
            }
            if (itemAliases.length > 0) {
                for (aliix=0; aliix<itemAliases.length; aliix++) {
                    aliasNameRF = itemAliases[aliix].toUpperCase().replace(/ AND /g, '').replace(/^THE /g, '').replace(/[^A-Z0-9]/g, '');  // Format name
                    if ( (aliasNameRF.length>2 && noNumSkip.indexOf(aliasNameRF) === -1) || allowedTwoLetters.indexOf(aliasNameRF) > -1 ) {  //  only add de-numbered name if anything remains
                        currNameList.push(aliasNameRF);
                    }
                    aliasNameNoNum = aliasNameRF.replace(/[^A-Z]/g, '');  // Clear non-letter characters for alternate match ( HOLLYIVYPUB23 --> HOLLYIVYPUB )
                    if ( ((aliasNameNoNum.length>2 && noNumSkip.indexOf(aliasNameNoNum) === -1) || allowedTwoLetters.indexOf(aliasNameNoNum) > -1) && item.attributes.categories.indexOf('PARKING_LOT') === -1 ) {  //  only add de-numbered name if anything remains
                        currNameList.push(aliasNameNoNum);
                    }
                }
            }
            currNameList = uniq(currNameList);  //  remove duplicates

            // Remove any previous search labels and move the layer above the places layer
            WMEPH_NameLayer.destroyFeatures();
            var vecLyrPlaces = W.map.getLayersBy("uniqueName","landmarks")[0];
            WMEPH_NameLayer.setZIndex(parseInt(vecLyrPlaces.getZIndex())+3);  // Move layer to just on top of Places layer

            if ( venueWhitelist.hasOwnProperty(item.attributes.id) ) {
                if ( venueWhitelist[item.attributes.id].hasOwnProperty('dupeWL') ) {
                    wlDupeList = venueWhitelist[item.attributes.id].dupeWL;
                }
            }

            if (devUser) {
                t0 = performance.now();  // Speed check start
            }
            var numVenues = 0, overlappingFlag = false;
            var addrItem = item.getAddress(), itemCompAddr = false;
            if ( addrItem.hasOwnProperty('attributes') ) {
                addrItem = addrItem.attributes;
            }
            if (addrItem.street !== null && addrItem.street.name !== null && item.attributes.houseNumber && item.attributes.houseNumber.match(/\d/g) !== null) {
                itemCompAddr = true;
            }

            for (var venix in venueList) {  // for each place on the map:
                if (venueList.hasOwnProperty(venix)) {  // hOP filter
                    numVenues++;
                    nameMatch = false;
                    altNameMatch = -1;
                    testVenueAtt = venueList[venix].attributes;
                    var excludePLADupes = $('#WMEPH-ExcludePLADupes' + devVersStr).prop('checked');
                    if ((!excludePLADupes || (excludePLADupes && !(item.isParkingLot() || venueList[venix].isParkingLot()))) && !isEmergencyRoom(venueList[venix])) {

                        var pt2ptDistance =  item.geometry.getCentroid().distanceTo(venueList[venix].geometry.getCentroid());
                        if ( item.isPoint() && venueList[venix].isPoint() && pt2ptDistance < 2 && item.attributes.id !== testVenueAtt.id ) {
                            overlappingFlag = true;
                        }
                        wlDupeMatch = false;
                        if (wlDupeList.length>0 && wlDupeList.indexOf(testVenueAtt.id) > -1) {
                            wlDupeMatch = true;
                        }

                        // get HNs for places on same street
                        var addrDupe = venueList[venix].getAddress();
                        if ( addrDupe.hasOwnProperty('attributes') ) {
                            addrDupe = addrDupe.attributes;
                        }
                        if (itemCompAddr && addrDupe.street !== null && addrDupe.street.name !== null && testVenueAtt.houseNumber && testVenueAtt.houseNumber !== '' &&
                            venix !== item.attributes.id && addrItem.street.name === addrDupe.street.name && testVenueAtt.houseNumber < 1000000) {
                            dupeHNRangeList.push(parseInt(testVenueAtt.houseNumber));
                            dupeHNRangeIDList.push(testVenueAtt.id);
                            dupeHNRangeDistList.push(pt2ptDistance);
                        }


                        // Check for duplicates
                        if ( !wlDupeMatch && dupeIDList.length<6 && pt2ptDistance < 800 && !testVenueAtt.residential && venix !== item.attributes.id && 'string' === typeof testVenueAtt.id && testVenueAtt.name !== null && testVenueAtt.name.length>1 ) {  // don't do res, the point itself, new points or no name
                            // If item has a complete address and test venue does, and they are different, then no dupe
                            var suppressMatch = false;
                            if ( itemCompAddr && addrDupe.street !== null && addrDupe.street.name !== null && testVenueAtt.houseNumber && testVenueAtt.houseNumber.match(/\d/g) !== null ) {
                                if ( item.attributes.lockRank > 0 && testVenueAtt.lockRank > 0 ) {
                                    if ( item.attributes.houseNumber !== testVenueAtt.houseNumber || addrItem.street.name !== addrDupe.street.name ) {
                                        suppressMatch = true;
                                    }
                                } else {
                                    if ( item.attributes.houseNumber !== testVenueAtt.houseNumber && addrItem.street.name !== addrDupe.street.name ) {
                                        suppressMatch = true;
                                    }
                                }
                            }


                            if ( !suppressMatch ) {
                                //Reformat the testPlace name
                                testName = testVenueAtt.name.toUpperCase().replace(/ AND /g, '').replace(/^THE /g, '').replace(/[^A-Z0-9]/g, '');  // Format test name
                                if (  (testName.length>2 && noNumSkip.indexOf(testName) === -1) || allowedTwoLetters.indexOf(testName) > -1  ) {
                                    testNameList = [testName];
                                } else {
                                    testNameList = ['TESTNAMETOOSHORTQZJXS'+randInt];
                                    randInt++;
                                }

                                testNameNoNum = testName.replace(/[^A-Z]/g, '');  // Clear non-letter characters for alternate match
                                if ( ((testNameNoNum.length>2 && noNumSkip.indexOf(testNameNoNum) === -1) || allowedTwoLetters.indexOf(testNameNoNum) > -1) && testVenueAtt.categories.indexOf('PARKING_LOT') === -1 ) {  //  only add de-numbered name if at least 2 chars remain
                                    testNameList.push(testNameNoNum);
                                }
                                // primary name matching loop

                                for (tnlix=0; tnlix < testNameList.length; tnlix++) {
                                    for (cnlix=0; cnlix < currNameList.length; cnlix++) {
                                        if ( (testNameList[tnlix].indexOf(currNameList[cnlix]) > -1 || currNameList[cnlix].indexOf(testNameList[tnlix]) > -1) ) {
                                            nameMatch = true;
                                            break;
                                        }
                                    }
                                    if (nameMatch) {break;}  // break if a match found
                                }
                                if (!nameMatch && testVenueAtt.aliases.length > 0) {
                                    for (aliix=0; aliix<testVenueAtt.aliases.length; aliix++) {
                                        aliasNameRF = testVenueAtt.aliases[aliix].toUpperCase().replace(/ AND /g, '').replace(/^THE /g, '').replace(/[^A-Z0-9]/g, '');  // Format name
                                        if ( (aliasNameRF.length>2 && noNumSkip.indexOf(aliasNameRF) === -1) || allowedTwoLetters.indexOf(aliasNameRF) > -1  ) {
                                            testNameList = [aliasNameRF];
                                        } else {
                                            testNameList = ['ALIASNAMETOOSHORTQOFUH'+randInt];
                                            randInt++;
                                        }
                                        aliasNameNoNum = aliasNameRF.replace(/[^A-Z]/g, '');  // Clear non-letter characters for alternate match ( HOLLYIVYPUB23 --> HOLLYIVYPUB )
                                        if (((aliasNameNoNum.length>2 && noNumSkip.indexOf(aliasNameNoNum) === -1) || allowedTwoLetters.indexOf(aliasNameNoNum) > -1) && testVenueAtt.categories.indexOf('PARKING_LOT') === -1) {  //  only add de-numbered name if at least 2 characters remain
                                            testNameList.push(aliasNameNoNum);
                                        } else {
                                            testNameList.push('111231643239'+randInt);  //  just to keep track of the alias in question, always add something.
                                            randInt++;
                                        }
                                    }
                                    for (tnlix=0; tnlix < testNameList.length; tnlix++) {
                                        for (cnlix=0; cnlix < currNameList.length; cnlix++) {
                                            if ( (testNameList[tnlix].indexOf(currNameList[cnlix]) > -1 || currNameList[cnlix].indexOf(testNameList[tnlix]) > -1) ) {
                                                // get index of that match (half of the array index with floor)
                                                altNameMatch = Math.floor(tnlix/2);
                                                break;
                                            }
                                        }
                                        if (altNameMatch > -1) {break;}  // break from the rest of the alts if a match found
                                    }
                                }
                                // If a match was found:
                                if ( nameMatch || altNameMatch > -1 ) {
                                    dupeIDList.push(testVenueAtt.id);  // Add the item to the list of matches
                                    WMEPH_NameLayer.setVisibility(true);  // If anything found, make visible the dupe layer
                                    if (nameMatch) {
                                        labelText = testVenueAtt.name;  // Pull duplicate name
                                    } else {
                                        labelText = testVenueAtt.aliases[altNameMatch] + ' (Alt)';  // Pull duplicate alt name
                                    }
                                    phlogdev('Possible duplicate found. WME place: ' + itemName + ' / Nearby place: ' + labelText);

                                    // Reformat the name into multiple lines based on length
                                    var startIX=0, endIX=0, labelTextBuild = [], maxLettersPerLine = Math.round(2*Math.sqrt(labelText.replace(/ /g,'').length/2));
                                    maxLettersPerLine = Math.max(maxLettersPerLine,4);
                                    while (endIX !== -1) {
                                        endIX = labelText.indexOf(' ', endIX+1);
                                        if (endIX - startIX > maxLettersPerLine) {
                                            labelTextBuild.push( labelText.substr(startIX,endIX-startIX) );
                                            startIX = endIX+1;
                                        }
                                    }
                                    labelTextBuild.push( labelText.substr(startIX) );  // Add last line
                                    labelTextReformat = labelTextBuild.join('\n');
                                    // Add photo icons
                                    if (testVenueAtt.images.length > 0 ) {
                                        labelTextReformat = labelTextReformat + ' ';
                                        for (var phix=0; phix<testVenueAtt.images.length; phix++) {
                                            if (phix===3) {
                                                labelTextReformat = labelTextReformat + '+';
                                                break;
                                            }
                                            //labelTextReformat = labelTextReformat + '\u25A3';  // add photo icons
                                            labelTextReformat = labelTextReformat + '\u25A3';  // add photo icons
                                        }
                                    }

                                    pt = venueList[venix].geometry.getCentroid();
                                    if ( !mapExtent.containsLonLat(pt.toLonLat()) ) {
                                        outOfExtent = true;
                                    }
                                    minLat = Math.min(minLat, pt.y); minLon = Math.min(minLon, pt.x);
                                    maxLat = Math.max(maxLat, pt.y); maxLon = Math.max(maxLon, pt.x);

                                    textFeature = new OpenLayers.Feature.Vector( pt, {labelText: labelTextReformat, fontColor: '#fff',
                                                                                      strokeColor: labelColorList[labelColorIX%labelColorList.length], labelAlign: 'cm', pointRadius: 25 , dupeID: testVenueAtt.id } );
                                    labelFeatures.push(textFeature);
                                    //WMEPH_NameLayer.addFeatures(labelFeatures);
                                    dupeNames.push(labelText);
                                }
                                labelColorIX++;
                            }
                        }
                    }
                }
            }
            // Add a marker for the working place point if any dupes were found
            //phlogdev('dupeIDList: ' + dupeIDList);
            if (dupeIDList.length>1) {
                pt = item.geometry.getCentroid();
                if ( !mapExtent.containsLonLat(pt.toLonLat()) ) {
                    outOfExtent = true;
                }
                minLat = Math.min(minLat, pt.y); minLon = Math.min(minLon, pt.x);
                maxLat = Math.max(maxLat, pt.y); maxLon = Math.max(maxLon, pt.x);
                // Add photo icons
                var currentLabel = 'Current';
                if (item.attributes.images.length > 0 ) {
                    for (var ciix=0; ciix<item.attributes.images.length; ciix++) {
                        currentLabel = currentLabel + ' ';
                        if (ciix===3) {
                            currentLabel = currentLabel + '+';
                            break;
                        }
                        currentLabel = currentLabel + '\u25A3';  // add photo icons
                    }
                }
                textFeature = new OpenLayers.Feature.Vector( pt, {labelText: currentLabel, fontColor: '#fff', strokeColor: '#fff', labelAlign: 'cm', pointRadius: 25 , dupeID: item.attributes.id} );
                labelFeatures.push(textFeature);
                WMEPH_NameLayer.addFeatures(labelFeatures);
            }
            if (devUser) {
                t1 = performance.now();  // log search time
                //phlogdev("Ran dupe search on " + numVenues + " nearby venues in " + (t1 - t0) + " milliseconds.");
            }
            if (recenterOption && dupeNames.length>0 && outOfExtent) {  // then rebuild the extent to include the duplicate
                var padMult = 1.0;
                mapExtent.left = minLon - (padFrac*padMult) * (maxLon-minLon);
                mapExtent.right = maxLon + (padFrac*padMult) * (maxLon-minLon);
                mapExtent.bottom = minLat - (padFrac*padMult) * (maxLat-minLat);
                mapExtent.top = maxLat + (padFrac*padMult) * (maxLat-minLat);
                W.map.zoomToExtent(mapExtent);
            }
            return [dupeNames, overlappingFlag];
        }  // END Dupefinder function

        // On selection of new item:
        function checkSelection() {
            if (W.selectionManager.selectedItems.length > 0) {
                var newItem = W.selectionManager.selectedItems[0].model;
                if ((newItem.type === "venue") && newItem.isApproved()) {
                    displayRunButton();
                    getPanelFields();
                    if ( $("#WMEPH-EnableCloneMode" + devVersStr).prop('checked') ) {
                        displayCloneButton();
                    }
                    if ((localStorage.getItem("WMEPH-AutoRunOnSelect" + devVersStr) === '1') && newItem.arePropertiesEditable()) {
                        setTimeout(harmonizePlace,200);
                    }
                    for (var dvtix=0; dvtix<dupeIDList.length; dvtix++) {
                        if (newItem.attributes.id === dupeIDList[dvtix]) {  // If the user selects a place in the dupe list, don't clear the labels yet
                            return;
                        }
                    }
                }
                // If the selection is anything else, clear the labels
                WMEPH_NameLayer.destroyFeatures();
                WMEPH_NameLayer.setVisibility(false);
            }
        }  // END checkSelection function

        // Functions to infer address from nearby segments
        function WMEPH_inferAddress(MAX_RECURSION_DEPTH) {
            'use strict';
            var distanceToSegment,
                foundAddresses = [],
                i,
                // Ignore pedestrian boardwalk, stairways, runways, and railroads
                IGNORE_ROAD_TYPES = [10, 16, 18, 19],
                inferredAddress = {
                    country: null,
                    city: null,
                    state: null,
                    street: null
                },
                //MAX_RECURSION_DEPTH = 8,
                n,
                orderedSegments = [],
                segments = W.model.segments.getObjectArray(),
                selectedItem,
                stopPoint,
                wmeSelectedItems = W.selectionManager.selectedItems;

            var findClosestNode = function () {
                var closestSegment = orderedSegments[0].segment,
                    distanceA,
                    distanceB,
                    nodeA = W.model.nodes.get(closestSegment.attributes.fromNodeID),
                    nodeB = W.model.nodes.get(closestSegment.attributes.toNodeID);
                if (nodeA && nodeB) {
                    var pt = stopPoint.point ? stopPoint.point : stopPoint;
                    distanceA = pt.distanceTo(nodeA.attributes.geometry);
                    distanceB = pt.distanceTo(nodeB.attributes.geometry);
                    return distanceA < distanceB ?
                        nodeA.attributes.id : nodeB.attributes.id;
                }
            };

            var findConnections = function (startingNodeID, recursionDepth) {
                var connectedSegments,
                    k,
                    newNode;

                // Limit search depth to avoid problems.
                if (recursionDepth > MAX_RECURSION_DEPTH) {
                    //console.debug('Max recursion depth reached');
                    return;
                }

                // Populate variable with segments connected to starting node.
                connectedSegments = _.where(orderedSegments, {
                    fromNodeID: startingNodeID
                });
                connectedSegments = connectedSegments.concat(_.where(orderedSegments, {
                    toNodeID: startingNodeID
                }));

                //console.debug('Looking for connections at node ' + startingNodeID);

                // Check connected segments for address info.
                for (k in connectedSegments) {
                    if (connectedSegments.hasOwnProperty(k)) {
                        if (hasStreetName(connectedSegments[k].segment)) {
                            // Address found, push to array.
                            /*
                            console.debug('Address found on connnected segment ' +
                            connectedSegments[k].segment.attributes.id +
                            '. Recursion depth: ' + recursionDepth);
                            */
                            foundAddresses.push({
                                depth: recursionDepth,
                                distance: connectedSegments[k].distance,
                                segment: connectedSegments[k].segment
                            });
                            break;
                        } else {
                            // If not found, call function again starting from the other node on this segment.
                            //console.debug('Address not found on connected segment ' + connectedSegments[k].segment.attributes.id);
                            newNode = connectedSegments[k].segment.attributes.fromNodeID === startingNodeID ?
                                connectedSegments[k].segment.attributes.toNodeID :
                            connectedSegments[k].segment.attributes.fromNodeID;
                            findConnections(newNode, recursionDepth + 1);
                        }
                    }
                }
            };

            var getFCRank = function (FC) {
                var typeToFCRank = {
                    3: 0, // freeway
                    6: 1, // major
                    7: 2, // minor
                    2: 3, // primary
                    1: 4, // street
                    20: 5, // PLR
                    8: 6 // dirt
                };
                if (FC && !isNaN(FC)) {
                    return typeToFCRank[FC] || 100;
                }
            };

            var hasStreetName = function (segment) {
                return segment && segment.type === 'segment' && segment.getAddressDetails().streetName !== 'No street';
            };

            // phlogdev("No address data, gathering ", 2);

            // Make sure a place is selected and segments are loaded.
            if (wmeSelectedItems.length > 0 && segments.length > 0 &&
                wmeSelectedItems[0].model.type === 'venue') {
                selectedItem = W.selectionManager.selectedItems[0];
            } else {
                return;
            }

            if (selectedItem.model.isPoint()) {
                stopPoint = selectedItem.geometry;
            } else {
                var entryExitPoints = selectedItem.model.attributes.entryExitPoints;
                if (entryExitPoints.length > 0) {
                    stopPoint = entryExitPoints[0];
                } else {
                    stopPoint = selectedItem.geometry.getCentroid();
                }
            }

            // Go through segment array and calculate distances to segments.
            for (i = 0, n = segments.length; i < n; i++) {
                // Make sure the segment is not an ignored roadType.
                if (IGNORE_ROAD_TYPES.indexOf(segments[i].attributes.roadType) === -1) {
                    distanceToSegment = (stopPoint.point ? stopPoint.point : stopPoint).distanceTo(segments[i].geometry);
                    // Add segment object and its distanceTo to an array.
                    orderedSegments.push({
                        distance: distanceToSegment,
                        fromNodeID: segments[i].attributes.fromNodeID,
                        segment: segments[i],
                        toNodeID: segments[i].attributes.toNodeID
                    });
                }
            }

            // Sort the array with segments and distance.
            orderedSegments = _.sortBy(orderedSegments, 'distance');

            // Check closest segment for address first.
            if (hasStreetName(orderedSegments[0].segment)) {
                inferredAddress = orderedSegments[0].segment.getAddress();
            } else {
                // If address not found on closest segment, try to find address through branching method.
                findConnections(findClosestNode(), 1);
                if (foundAddresses.length > 0) {
                    // If more than one address found at same recursion depth, look at FC of segments.
                    if (foundAddresses.length > 1) {
                        _.each(foundAddresses, function (element) {
                            element.fcRank = getFCRank(
                                element.segment.attributes.roadType);
                        });
                        foundAddresses = _.sortBy(foundAddresses, 'fcRank');
                        foundAddresses = _.filter(foundAddresses, {
                            fcRank: foundAddresses[0].fcRank
                        });
                    }

                    // If multiple segments with same FC, Use address from segment with address that is closest by connectivity.
                    if (foundAddresses.length > 1) {
                        foundAddresses = _.sortBy(foundAddresses, 'depth');
                        foundAddresses = _.filter(foundAddresses, {
                            depth: foundAddresses[0].depth
                        });
                    }

                    // If more than one of the closest segments by connectivity has the same FC, look for
                    // closest segment geometrically.
                    if (foundAddresses.length > 1) {
                        foundAddresses = _.sortBy(foundAddresses, 'distance');
                    }
                    console.debug(foundAddresses[0].streetName, foundAddresses[0].depth);
                    inferredAddress = foundAddresses[0].segment.getAddress();
                } else {
                    // Default to closest if branching method fails.
                    // Go through sorted segment array until a country, state, and city have been found.
                    inferredAddress = _.find(orderedSegments, function (element) {
                        return hasStreetName(element.segment);
                    }).segment.getAddress() || inferredAddress;
                }
            }
            return inferredAddress;
        }  // END inferAddress function

        /**
         * Updates the address for a place.
         * @param feature {WME Venue Object} The place to update.
         * @param address {Object} An object containing the country, state, city, and street
         * @param actions {Array of actions} Optional. If performing multiple actions at once.
         * objects.
         */
        function updateAddress(feature, address, actions) {
            'use strict';
            var newAttributes,
                UpdateFeatureAddress = require('Waze/Action/UpdateFeatureAddress');
            feature = feature || item;
            if (feature && address) {
                newAttributes = {
                    countryID: address.country.id,
                    stateID: address.state.id,
                    cityName: address.city.attributes.name,
                    emptyCity: address.city.attributes.name ? null : true,
                    streetName: address.street.name,
                    emptyStreet: address.street.name ? null : true
                };
                var action = new UpdateFeatureAddress(feature, newAttributes);
                if(actions) {
                    actions.push(action);
                } else {
                    W.model.actionManager.add(action);
                }
                phlogdev('Address inferred and updated');
            }
        } // END updateAddress function

        // Build a Google search url based on place name and address
        function buildGLink(searchName,addr,HN) {
            var searchHN = "", searchStreet = "", searchCity = "";
            searchName = searchName.replace(/&/g, "%26");
            searchName = searchName.replace(/[ \/]/g, "%20");
            if ("string" === typeof addr.street.name && addr.street.name !== null && addr.street.name !== '') {
                searchStreet = addr.street.name + ",%20";
            }
            searchStreet = searchStreet.replace(/ /g, "%20");
            searchStreet = searchStreet.replace(/CR-/g, "County%20Rd%20");
            searchStreet = searchStreet.replace(/SR-/g, "State%20Hwy%20");
            searchStreet = searchStreet.replace(/US-/g, "US%20Hwy%20");
            searchStreet = searchStreet.replace(/ CR /g, "%20County%20Rd%20");
            searchStreet = searchStreet.replace(/ SR /g, "%20State%20Hwy%20");
            searchStreet = searchStreet.replace(/ US /g, "%20US%20Hwy%20");
            searchStreet = searchStreet.replace(/$CR /g, "County%20Rd%20");
            searchStreet = searchStreet.replace(/$SR /g, "State%20Hwy%20");
            searchStreet = searchStreet.replace(/$US /g, "US%20Hwy%20");
            if ("string" === typeof HN && searchStreet !== "") {
                searchHN = HN + "%20";
            }
            if ("string" === typeof addr.city.attributes.name && addr.city.attributes.name !== '') {
                searchCity = addr.city.attributes.name + ",%20";
            }
            searchCity = searchCity.replace(/ /g, "%20");

            return "http://www.google.com/search?q=" + searchName + ",%20" + searchHN + searchStreet + searchCity + addr.state.name;
        } // END buildGLink function

        // WME Category translation from Natural language to object language  (Bank / Financial --> BANK_FINANCIAL)
        function catTranslate(natCategories) {
            var catNameUpper = natCategories.trim().toUpperCase();
            if (CAT_LOOKUP.hasOwnProperty(catNameUpper)) {
                return CAT_LOOKUP[catNameUpper];
            }

            // var natCategoriesRepl = natCategories.toUpperCase().replace(/ AND /g, "").replace(/[^A-Z]/g, "");
            // if (natCategoriesRepl.indexOf('PETSTORE') > -1) {
            //     return "PET_STORE_VETERINARIAN_SERVICES";
            // }
            // for(var keyCat in catTransWaze2Lang){
            //     var compare = catTransWaze2Lang[keyCat].toUpperCase().replace(/ AND /g, "").replace(/[^A-Z]/g, "");
            //     if (compare === 'OFFICESINCLNONEMERGENCYMEDICAL') compare = 'OFFICES';
            //     if ( natCategoriesRepl ===  compare) {
            //         return keyCat;
            //     }
            // }

            // if the category doesn't translate, then pop an alert that will make a forum post to the thread
            // Generally this means the category used in the PNH sheet is not close enough to the natural language categories used inside the WME translations
            if (confirm('WMEPH: Category Error!\nClick OK to report this error') ) {
                forumMsgInputs = {
                    subject: 'WMEPH Bug report: no tns',
                    message: 'Error report: Category "' + natCategories + '" was not found in the PNH categories sheet.'
                };
                WMEPH_errorReport(forumMsgInputs);
            }
            return "ERROR";
        }  // END catTranslate function

        // compares two arrays to see if equal, regardless of order
        function matchSets(array1, array2) {
            if (array1.length !== array2.length) {return false;}  // compare lengths
            for (var i = 0; i < array1.length; i++) {
                if (array2.indexOf(array1[i]) === -1) {
                    return false;
                }
            }
            return true;
        }

        // function that checks if all elements of target are in array:source
        function containsAll(source,target) {
            if (typeof(target) === "string") { target = [target]; }  // if a single string, convert to an array
            for (var ixx = 0; ixx < target.length; ixx++) {
                if ( source.indexOf(target[ixx]) === -1 ) {
                    return false;
                }
            }
            return true;
        }

        // function that checks if any element of target are in source
        function containsAny(source,target) {
            if (typeof(source) === "string") { source = [source]; }  // if a single string, convert to an array
            if (typeof(target) === "string") { target = [target]; }  // if a single string, convert to an array
            var result = source.filter(function(tt){ return target.indexOf(tt) > -1; });
            return (result.length > 0);
        }

        // Function that inserts a string or a string array into another string array at index ix and removes any duplicates
        function insertAtIX(array1, array2, ix) {  // array1 is original string, array2 is the inserted string, at index ix
            var arrayNew = array1.slice(0);  // slice the input array so it doesn't change
            if (typeof(array2) === "string") { array2 = [array2]; }  // if a single string, convert to an array
            if (typeof(array2) === "object") {  // only apply to inserted arrays
                var arrayTemp = arrayNew.splice(ix);  // split and hold the first part
                arrayNew.push.apply(arrayNew, array2);  // add the insert
                arrayNew.push.apply(arrayNew, arrayTemp);  // add the tail end of original
            }
            return uniq(arrayNew);  // remove any duplicates (so the function can be used to move the position of a string)
        }

        // Function to remove unnecessary aliases
        function removeSFAliases(nName, nAliases) {
            var newAliasesUpdate = [];
            nName = nName.toUpperCase().replace(/'/g,'').replace(/-/g,' ').replace(/\/ /g,' ').replace(/ \//g,' ').replace(/ {2,}/g,' ');
            for (var naix=0; naix<nAliases.length; naix++) {
                if ( !nName.startsWith( nAliases[naix].toUpperCase().replace(/'/g,'').replace(/-/g,' ').replace(/\/ /g,' ').replace(/ \//g,' ').replace(/ {2,}/g,' ') ) ) {
                    newAliasesUpdate.push(nAliases[naix]);
                } else {
                    //phlogdev('Unnecessary alias removed: ' + nAliases[naix]);
                    bannButt.sfAliases.active = true;
                }
            }
            return newAliasesUpdate;
        }

        // settings tab
        function add_PlaceHarmonizationSettingsTab() {
            //Create Settings Tab
            var phTabHtml = '<li><a href="#sidepanel-ph' + devVersStr + '" data-toggle="tab" id="PlaceHarmonization' + devVersStr + '">WMEPH' + devVersStrSpace + '</a></li>';
            $("#user-tabs ul.nav-tabs:first").append(phTabHtml);

            //Create Settings Tab Content
            var phContentHtml = '<div class="tab-pane" id="sidepanel-ph' + devVersStr + '"><div id="PlaceHarmonizer' + devVersStr + '">WMEPH' +
                devVersStrSpace + ' v. ' + WMEPHversion + '</div></div>';
            $("#user-info div.tab-content:first").append(phContentHtml);

            var c = '<div id="wmephtab" class="active" style="padding-top: 5px;">' +
                '<ul class="nav nav-tabs"><li class="active"><a data-toggle="tab" href="#sidepanel-harmonizer' + devVersStr + '">Harmonize</a></li>' +
                '<li><a data-toggle="tab" href="#sidepanel-highlighter' + devVersStr + '">HL \/ Scan</a></li>' +
                '<li><a data-toggle="tab" href="#sidepanel-wltools' + devVersStr + '">WL Tools</a></li></ul>' +
                '<div class="tab-content"><div class="tab-pane active" id="sidepanel-harmonizer' + devVersStr + '"></div>' +
                '<div class="tab-pane" id="sidepanel-highlighter' + devVersStr + '"></div>' +
                '<div class="tab-pane" id="sidepanel-wltools' + devVersStr + '"></div></div></div>';

            //add the sub tabs to the scripts main tab
            $("#sidepanel-ph"+devVersStr).append(c);

            // Enable certain settings by default if not set by the user:
            if (localStorage.getItem('WMEPH-ColorHighlighting'+devVersStr) === null) {
                localStorage.setItem('WMEPH-ColorHighlighting'+devVersStr, '1');
            }

            //Create Settings Checkboxes and Load Data
            //example condition:  if ( $("#WMEPH-DisableDFZoom" + devVersStr).prop('checked') ) { }
            createSettingsCheckbox("sidepanel-harmonizer" + devVersStr, "WMEPH-WebSearchNewTab" + devVersStr,"Open URL & Search Results in new tab instead of new window");
            createSettingsCheckbox("sidepanel-harmonizer" + devVersStr, "WMEPH-DisableDFZoom" + devVersStr,"Disable zoom & center for duplicates");
            createSettingsCheckbox("sidepanel-harmonizer" + devVersStr, "WMEPH-EnableIAZoom" + devVersStr,"Enable zoom & center for places with no address");
            createSettingsCheckbox("sidepanel-harmonizer" + devVersStr, "WMEPH-HidePlacesWiki" + devVersStr,"Hide 'Places Wiki' button in results banner");
            createSettingsCheckbox("sidepanel-harmonizer" + devVersStr, "WMEPH-HidePURWebSearch" + devVersStr,"Hide 'Web Search' button on PUR popups");
            createSettingsCheckbox("sidepanel-harmonizer" + devVersStr, "WMEPH-ExcludePLADupes" + devVersStr,"Exclude parking lots when searching for duplicate places.");
            createSettingsCheckbox("sidepanel-harmonizer" + devVersStr, "WMEPH-ShowPLAExitWhileClosed" + devVersStr,"Always ask if cars can exit parking lots.");
            if (devUser || betaUser || usrRank >= 2) {
                createSettingsCheckbox("sidepanel-harmonizer" + devVersStr, "WMEPH-DisablePLAExtProviderCheck" + devVersStr,'Disable check for "Google place link" on Parking Lot Areas');
                //createSettingsCheckbox("sidepanel-harmonizer" + devVersStr, "WMEPH-ExtProviderSeverity" + devVersStr,'Treat "No Google place link" as non-critical (blue)');
                createSettingsCheckbox("sidepanel-harmonizer" + devVersStr, "WMEPH-EnableServices" + devVersStr,"Enable automatic addition of common services");
                createSettingsCheckbox("sidepanel-harmonizer" + devVersStr, "WMEPH-ConvenienceStoreToGasStations" + devVersStr,'Automatically add "Convenience Store" category to gas stations');
                createSettingsCheckbox("sidepanel-harmonizer" + devVersStr, "WMEPH-AddAddresses" + devVersStr,"Add detected address fields to places with no address");
                createSettingsCheckbox("sidepanel-harmonizer" + devVersStr, "WMEPH-EnableCloneMode" + devVersStr,"Enable place cloning tools");
                createSettingsCheckbox("sidepanel-harmonizer" + devVersStr, "WMEPH-AutoLockRPPs" + devVersStr,"Lock residential place points to region default");
                createSettingsCheckbox("sidepanel-harmonizer" + devVersStr, "WMEPH-AutoRunOnSelect" + devVersStr,'Automatically run the script when selecting a place');
            }

            // ["#WMEPH-ExtProviderSeverity" + devVersStr, "#WMEPH-DisablePLAExtProviderCheck" + devVersStr].map(function(id) {
            //     $(id).on('click', function() {
            //         // Force highlight refresh on all venues.
            //         applyHighlightsTest(W.model.venues.getObjectArray());
            //     });
            // });

            // Turn this setting on one time.
            var runOnceDefaultIgnorePlaGoogleLinkChecks = localStorage.getItem('WMEPH-runOnce-defaultToOff-plaGoogleLinkChecks' + devVersStr);
            if (!runOnceDefaultIgnorePlaGoogleLinkChecks) {
                var $chk = $('#WMEPH-DisablePLAExtProviderCheck' + devVersStr);
                if (!$chk.is(':checked')) { $chk.trigger('click'); }
            }
            localStorage.setItem('WMEPH-runOnce-defaultToOff-plaGoogleLinkChecks' + devVersStr, true);

            // Highlighter settings
            var phDevContentHtml = '<p>Highlighter Settings:</p>';
            $("#sidepanel-highlighter" + devVersStr).append(phDevContentHtml);
            createSettingsCheckbox("sidepanel-highlighter" + devVersStr, "WMEPH-ColorHighlighting" + devVersStr,"Enable color highlighting of map to indicate places needing work");
            createSettingsCheckbox("sidepanel-highlighter" + devVersStr, "WMEPH-DisableHoursHL" + devVersStr,"Disable highlighting for missing hours");
            createSettingsCheckbox("sidepanel-highlighter" + devVersStr, "WMEPH-DisableRankHL" + devVersStr,"Disable highlighting for places locked above your rank");
            createSettingsCheckbox("sidepanel-highlighter" + devVersStr, "WMEPH-DisableWLHL" + devVersStr,"Disable Whitelist highlighting (shows all missing info regardless of WL)");
            createSettingsCheckbox("sidepanel-highlighter" + devVersStr, "WMEPH-PLATypeFill" + devVersStr,"Fill parking lots based on type (public=green, restricted=yellow, private=red)");
            if (devUser || betaUser || usrRank >= 3) {
                //createSettingsCheckbox("sidepanel-highlighter" + devVersStr, "WMEPH-UnlockedRPPs" + devVersStr,"Highlight unlocked residential place points");
            }
            var phHRContentHtml = '<hr align="center" width="90%">';
            $("#sidepanel-highlighter" + devVersStr).append(phHRContentHtml);
            phHRContentHtml = '<p>Scanner Settings (coming soon)</p>';
            $("#sidepanel-highlighter" + devVersStr).append(phHRContentHtml);

            // Scanner settings
            //createSettingsCheckbox("sidepanel-highlighter" + devVersStr, "WMEPH-PlaceScanner" + devVersStr,"Placeholder, under development!");

            // Whitelist settings

            phHRContentHtml = '<hr align="center" width="90%">';
            $("#sidepanel-harmonizer" + devVersStr).append(phHRContentHtml);

            // User pref for KB Shortcut:
            // Set defaults
            if (isDevVersion) {
                defaultKBShortcut = 'S';
            } else {
                defaultKBShortcut = 'A';
            }
            // Set local storage to default if none
            if (localStorage.getItem('WMEPH-KeyboardShortcut'+devVersStr) === null) {
                localStorage.setItem('WMEPH-KeyboardShortcut'+devVersStr, defaultKBShortcut);
            }

            // Add Letter input box
            var phKBContentHtml = $('<div id="PlaceHarmonizerKB' + devVersStr +
                                    '"><div id="PlaceHarmonizerKBWarn' + devVersStr + '"></div>Shortcut Letter (a-Z): <input type="text" maxlength="1" id="WMEPH-KeyboardShortcut'+devVersStr+
                                    '" style="width: 30px;padding-left:8px"><div id="PlaceHarmonizerKBCurrent' + devVersStr + '"></div></div>');
            $("#sidepanel-harmonizer" + devVersStr).append(phKBContentHtml);
            createSettingsCheckbox("PlaceHarmonizerKB" + devVersStr, "WMEPH-KBSModifierKey" + devVersStr, "Use Ctrl instead of Alt"); // Add Alt-->Ctrl checkbox
            if ( localStorage.getItem('WMEPH-KBSModifierKey'+devVersStr) === '1' ) {  // Change modifier key code if checked
                modifKey = 'Ctrl+';
            }
            $('#WMEPH-KeyboardShortcut'+devVersStr).val(localStorage.getItem('WMEPH-KeyboardShortcut'+devVersStr));  // Load letter key value from local storage
            if ($('#WMEPH-KeyboardShortcut'+devVersStr).val().match(/^[a-z]{1}$/i) === null) {
                $('#WMEPH-KeyboardShortcut'+devVersStr).val(defaultKBShortcut);
                $(localStorage.setItem('WMEPH-KeyboardShortcut'+devVersStr, $('#WMEPH-KeyboardShortcut'+devVersStr).val()));
            }
            shortcutParse = parseKBSShift($('#WMEPH-KeyboardShortcut'+devVersStr).val());
            // Check for KBS conflict on Beta script load
            if (isDevVersion) {
                if (checkWMEPH_KBSconflict(shortcutParse)) {
                    alert('You have the same shortcut for the Beta version and the Production version of the script. The Beta version is disabled until you change the Beta shortcut');
                } else {
                    shortcut.add(modifKey + shortcutParse, function() { harmonizePlace(); });
                    phKBContentHtml = $('<span style="font-weight:bold">Current shortcut: '+modifKey+shortcutParse+'</span>');
                    $("#PlaceHarmonizerKBCurrent" + devVersStr).append(phKBContentHtml);
                }
            } else {  // Prod version always loads
                shortcut.add(modifKey + shortcutParse, function() { harmonizePlace(); });
                phKBContentHtml = $('<span style="font-weight:bold">Current shortcut: '+modifKey+shortcutParse+'</span>');
                $("#PlaceHarmonizerKBCurrent" + devVersStr).append(phKBContentHtml);
            }

            // Modifier on-click changes
            var modifKeyNew;
            $("#WMEPH-KBSModifierKey" + devVersStr).click(function() {
                $("#PlaceHarmonizerKBWarn" + devVersStr).empty();  // remove any warning
                if ($("#WMEPH-KBSModifierKey" + devVersStr).prop('checked')) {
                    modifKeyNew = 'Ctrl+';
                } else {
                    modifKeyNew = 'Alt+';
                }
                shortcutParse = parseKBSShift($('#WMEPH-KeyboardShortcut'+devVersStr).val());

                if (checkWMEPH_KBSconflict(shortcutParse)) {
                    $("#WMEPH-KBSModifierKey" + devVersStr).trigger('click');
                    phKBContentHtml = '<p style="color:red">Shortcut conflict with other WMEPH version<p>';
                    $("#PlaceHarmonizerKBWarn" + devVersStr).append(phKBContentHtml);
                } else {
                    shortcut.remove(modifKey + shortcutParse);
                    modifKey = modifKeyNew;
                    shortcut.add(modifKey + shortcutParse, function() { harmonizePlace(); });
                }

                $("#PlaceHarmonizerKBCurrent" + devVersStr).empty();
                phKBContentHtml = $('<span style="font-weight:bold">Current shortcut: '+modifKey+shortcutParse+'</span>');
                $("#PlaceHarmonizerKBCurrent" + devVersStr).append(phKBContentHtml);
            });

            // Upon change of the KB letter:
            var shortcutParseNew;
            $("#WMEPH-KeyboardShortcut"+devVersStr).change(function() {
                if ($('#WMEPH-KeyboardShortcut'+devVersStr).val().match(/^[a-z]{1}$/i) !== null) {  // If a single letter...
                    $("#PlaceHarmonizerKBWarn" + devVersStr).empty();  // remove old warning
                    // remove previous
                    shortcutParse = parseKBSShift(localStorage.getItem('WMEPH-KeyboardShortcut'+devVersStr));
                    shortcutParseNew = parseKBSShift($('#WMEPH-KeyboardShortcut'+devVersStr).val());

                    if (checkWMEPH_KBSconflict(shortcutParseNew)) {
                        $('#WMEPH-KeyboardShortcut'+devVersStr).val(localStorage.getItem('WMEPH-KeyboardShortcut'+devVersStr));
                        //$("#PlaceHarmonizerKBWarn" + devVersStr).empty();
                        phKBContentHtml = '<p style="color:red">Shortcut conflict with other WMEPH version<p>';
                        $("#PlaceHarmonizerKBWarn" + devVersStr).append(phKBContentHtml);
                    } else {
                        shortcut.remove(modifKey + shortcutParse);
                        shortcutParse = shortcutParseNew;
                        shortcut.add(modifKey + shortcutParse, function() { harmonizePlace(); });
                        $(localStorage.setItem('WMEPH-KeyboardShortcut'+devVersStr, $('#WMEPH-KeyboardShortcut'+devVersStr).val()) );
                    }
                    $("#PlaceHarmonizerKBCurrent" + devVersStr).empty();
                    phKBContentHtml = $('<span style="font-weight:bold">Current shortcut: '+modifKey+shortcutParse+'</span>');
                    $("#PlaceHarmonizerKBCurrent" + devVersStr).append(phKBContentHtml);
                } else {  // if not a letter then reset and flag
                    $('#WMEPH-KeyboardShortcut'+devVersStr).val(localStorage.getItem('WMEPH-KeyboardShortcut'+devVersStr));
                    $("#PlaceHarmonizerKBWarn" + devVersStr).empty();
                    phKBContentHtml = '<p style="color:red">Only letters are allowed<p>';
                    $("#PlaceHarmonizerKBWarn" + devVersStr).append(phKBContentHtml);
                }
            });


            if (devUser) {  // Override script regionality (devs only)
                phDevContentHtml = '<hr align="center" width="90%"><p>Dev Only Settings:</p>';
                $("#sidepanel-harmonizer" + devVersStr).append(phDevContentHtml);
                createSettingsCheckbox("sidepanel-harmonizer" + devVersStr, "WMEPH-RegionOverride" + devVersStr,"Disable Region Specificity");

            }

            // *** Whitelisting section
            if (localStorage.getItem('WMEPH_WLAddCount') === null) {
                localStorage.setItem('WMEPH_WLAddCount', 2);  // Counter to remind of WL backups
            }
            var phWLContentHtml = $('<div id="PlaceHarmonizerWLTools' + devVersStr + '">Whitelist string: <input onClick="this.select();" type="text" id="WMEPH-WLInput'+devVersStr+
                                    '" style="width: 200px;padding-left:1px"><br>'+
                                    '<input class="btn btn-success btn-xs" id="WMEPH-WLMerge'+ devVersStr +'" title="Merge the string into your existing Whitelist" type="button" value="Merge">'+
                                    '<br><input class="btn btn-success btn-xs" id="WMEPH-WLPull'+ devVersStr +'" title="Pull your existing Whitelist for backup or sharing" type="button" value="Pull">'+
                                    '<br><input class="btn btn-success btn-xs" id="WMEPH-WLShare'+ devVersStr +'" title="Share your Whitelist to a public Google sheet" type="button" value="Share your WL">'+
                                    '<br><input class="btn btn-info btn-xs" id="WMEPH-WLStats'+ devVersStr +'" title="Display WL stats" type="button" value="Stats">'+
                                    '<br><input class="btn btn-danger btn-xs" id="WMEPH-WLStateFilter'+ devVersStr +'" title="Remove all WL items for a state" type="button" value="Remove data for 1 State">'+
                                    '</div><div id="PlaceHarmonizerWLToolsMsg' + devVersStr + '"></div>');
            $("#sidepanel-wltools" + devVersStr).append(phWLContentHtml);

            $("#WMEPH-WLMerge" + devVersStr).click(function() {
                $("#PlaceHarmonizerWLToolsMsg" + devVersStr).empty();
                if ($('#WMEPH-WLInput'+devVersStr).val() === 'resetWhitelist') {
                    if (confirm('***Do you want to reset all Whitelist data?\nClick OK to erase.') ) {  // if the category doesn't translate, then pop an alert that will make a forum post to the thread
                        venueWhitelist = { '1.1.1': { Placeholder: {  } } }; // Populate with a dummy place
                        saveWL_LS(true);
                    }
                } else {  // try to merge uncompressed WL data
                    WLSToMerge = validateWLS($('#WMEPH-WLInput'+devVersStr).val());
                    if (WLSToMerge) {
                        phlog('Whitelists merged!');
                        venueWhitelist = mergeWL(venueWhitelist,WLSToMerge);
                        saveWL_LS(true);
                        phWLContentHtml = '<p style="color:green">Whitelist data merged<p>';
                        $("#PlaceHarmonizerWLToolsMsg" + devVersStr).append(phWLContentHtml);
                        $('#WMEPH-WLInputBeta').val('');
                    } else {  // try compressed WL
                        WLSToMerge = validateWLS( LZString.decompressFromUTF16($('#WMEPH-WLInput'+devVersStr).val()) );
                        if (WLSToMerge) {
                            phlog('Whitelists merged!');
                            venueWhitelist = mergeWL(venueWhitelist,WLSToMerge);
                            saveWL_LS(true);
                            phWLContentHtml = '<p style="color:green">Whitelist data merged<p>';
                            $("#PlaceHarmonizerWLToolsMsg" + devVersStr).append(phWLContentHtml);
                            $('#WMEPH-WLInputBeta').val('');
                        } else {
                            phWLContentHtml = '<p style="color:red">Invalid Whitelist data<p>';
                            $("#PlaceHarmonizerWLToolsMsg" + devVersStr).append(phWLContentHtml);
                        }
                    }
                }
            });

            // Pull the data to the text field
            $("#WMEPH-WLPull" + devVersStr).click(function() {
                $("#PlaceHarmonizerWLToolsMsg" + devVersStr).empty();
                $('#WMEPH-WLInput'+devVersStr).val( LZString.decompressFromUTF16(localStorage.getItem(WLlocalStoreNameCompressed)) );
                phWLContentHtml = '<p style="color:green">To backup the data, copy & paste the text in the box to a safe location.<p>';
                $("#PlaceHarmonizerWLToolsMsg" + devVersStr).append(phWLContentHtml);
                localStorage.setItem('WMEPH_WLAddCount', 1);
            });

            // WL Stats
            $("#WMEPH-WLStats" + devVersStr).click(function() {
                $("#PlaceHarmonizerWLToolsMsg" + devVersStr).empty();
                $('#WMEPH-WLInputBeta').val('');
                var currWLData;
                currWLData = JSON.parse( LZString.decompressFromUTF16( localStorage.getItem(WLlocalStoreNameCompressed) ) );
                var countryWL = {};
                var stateWL = {};
                var itemCount = 0;
                for (var venueKey in currWLData) {
                    if (currWLData.hasOwnProperty(venueKey)) {
                        if (venueKey !== '1.1.1') {  // Don't count the place holder
                            itemCount++;
                            if ( currWLData[venueKey].hasOwnProperty('country') ) {
                                if ( countryWL.hasOwnProperty(currWLData[venueKey].country) ) {
                                    countryWL[currWLData[venueKey].country]++;
                                } else {
                                    countryWL[currWLData[venueKey].country] = 1;
                                }
                            } else {
                                if ( countryWL.hasOwnProperty('None') ) {
                                    countryWL.None++;
                                } else {
                                    countryWL.None = 1;
                                }
                            }
                            if ( currWLData[venueKey].hasOwnProperty('state') ) {
                                if ( stateWL.hasOwnProperty(currWLData[venueKey].state) ) {
                                    stateWL[currWLData[venueKey].state]++;
                                } else {
                                    stateWL[currWLData[venueKey].state] = 1;
                                }
                            } else {
                                if ( stateWL.hasOwnProperty('None') ) {
                                    stateWL.None++;
                                } else {
                                    stateWL.None = 1;
                                }
                            }
                        }
                    }
                }

                var countryString = '';
                for (var countryKey in countryWL) {
                    countryString = countryString + '<br>' + countryKey + ': ' + countryWL[countryKey];
                }
                var stateString = '';
                for (var stateKey in stateWL) {
                    stateString = stateString + '<br>' + stateKey + ': ' + stateWL[stateKey];
                }

                phWLContentHtml = '<p style="color:black">Number of WL places: '+ itemCount +'</p><p>States:'+ stateString +'</p><p>Countries:'+ countryString + '<p>';
                $("#PlaceHarmonizerWLToolsMsg" + devVersStr).append(phWLContentHtml);
                //localStorage.setItem('WMEPH_WLAddCount', 1);
            });

            // WL State Filter
            $("#WMEPH-WLStateFilter" + devVersStr).click(function() {
                $("#PlaceHarmonizerWLToolsMsg" + devVersStr).empty();
                stateToRemove = $('#WMEPH-WLInput'+devVersStr).val();
                if ( stateToRemove.length < 2 ) {
                    phWLContentHtml = '<p style="color:red">Invalid state<p>';
                    $("#PlaceHarmonizerWLToolsMsg" + devVersStr).append(phWLContentHtml);
                } else {
                    var currWLData, venueToRemove = [];
                    currWLData = JSON.parse( LZString.decompressFromUTF16( localStorage.getItem(WLlocalStoreNameCompressed) ) );

                    //var WLSize = _.size(currWLData);

                    for (var venueKey in currWLData) {
                        if (currWLData.hasOwnProperty(venueKey)) {
                            if (venueKey !== '1.1.1') {  // Don't examine the place holder
                                if ( currWLData[venueKey].hasOwnProperty('state') ) {
                                    if ( currWLData[venueKey].state === stateToRemove ) {
                                        venueToRemove.push(venueKey);
                                    }
                                }
                            }
                        }
                    }
                    //phlogdev(venueToRemove.length);
                    if (venueToRemove.length > 0) {
                        if (localStorage.WMEPH_WLAddCount === '1') {
                            if (confirm('Are you sure you want to clear all whitelist data for '+stateToRemove+'? This CANNOT be undone. Press OK to delete, cancel to preserve the data.') ) {  // misclick check
                                backupWL_LS(true);
                                for (var ixwl=0; ixwl<venueToRemove.length; ixwl++) {
                                    delete venueWhitelist[venueToRemove[ixwl]];
                                    //phlogdev(venueWhitelist[venueToRemove[ixwl]]);
                                }
                                saveWL_LS(true);
                                phWLContentHtml = '<p style="color:green">'+venueToRemove.length+' items removed from WL<p>';
                                $("#PlaceHarmonizerWLToolsMsg" + devVersStr).append(phWLContentHtml);
                                $('#WMEPH-WLInputBeta').val('');
                            } else {
                                phWLContentHtml = '<p style="color:blue">No changes made<p>';
                                $("#PlaceHarmonizerWLToolsMsg" + devVersStr).append(phWLContentHtml);
                            }
                        } else {
                            phWLContentHtml = '<p style="color:red">Please backup your WL using the Pull button before removing state data<p>';
                            $("#PlaceHarmonizerWLToolsMsg" + devVersStr).append(phWLContentHtml);
                            //phlogdev('Please backup your WL using the Pull button before removing state data');
                        }
                    } else {
                        phWLContentHtml = '<p style="color:red">No data for that state. Use the state name exactly as listed in the Stats<p>';
                        $("#PlaceHarmonizerWLToolsMsg" + devVersStr).append(phWLContentHtml);
                        //phlogdev('No data for that state. Use the state name exactly as listed in the Stats');
                    }
                }
            });

            // Share the data to a Google Form post
            $("#WMEPH-WLShare" + devVersStr).click(function() {
                var submitWLURL = 'https://docs.google.com/forms/d/1k_5RyOq81Fv4IRHzltC34kW3IUbXnQqDVMogwJKFNbE/viewform?entry.1173700072='+thisUser.userName;
                window.open(submitWLURL);
            });

            var feedbackString = 'Submit script feedback & suggestions';
            var placesWikiStr = 'Open the WME Places Wiki page';
            var phContentHtml2 = '<hr align="center" width="95%"><p><a href="' +
                placesWikiURL + '" target="_blank" title="'+placesWikiStr+'">'+placesWikiStr+'</a><p><a href="' +
                WMEPHurl + '" target="_blank" title="'+feedbackString+'">'+feedbackString+'</a></p><hr align="center" width="95%">Major features for v. ' +
                WMEPHversionMeta+':<ul><li>'+WMEPHWhatsNewMetaHList+'</ul>Recent updates:<ul><li>'+WMEPHWhatsNewHList+'</ul>';
            $("#sidepanel-harmonizer" + devVersStr).append(phContentHtml2);

            W.map.events.register("mousemove", W.map, function (e) {
                WMEPHmousePosition = W.map.getLonLatFromPixel( W.map.events.getMousePosition(e) );
            });

            // Add zoom shortcut
            shortcut.add("Control+Alt+Z", function() {
                zoomPlace();
            });

            // Color highlighting
            $("#WMEPH-ColorHighlighting" + devVersStr).click( function() {
                bootstrapWMEPH_CH();
            });
            $("#WMEPH-DisableHoursHL" + devVersStr).click( function() {
                bootstrapWMEPH_CH();
            });
            $("#WMEPH-DisableRankHL" + devVersStr).click( function() {
                bootstrapWMEPH_CH();
            });
            $("#WMEPH-DisableWLHL" + devVersStr).click( function() {
                bootstrapWMEPH_CH();
            });
            $("#WMEPH-PLATypeFill" + devVersStr).click( function() {
                applyHighlightsTest(W.model.venues.getObjectArray());
            });
            if ( $("#WMEPH-ColorHighlighting" + devVersStr).prop('checked') ) {
                phlog('Starting Highlighter');
                bootstrapWMEPH_CH();
            }


            // Add Color Highlighting shortcut
            shortcut.add("Control+Alt+h", function() {
                $("#WMEPH-ColorHighlighting" + devVersStr).trigger('click');
            });

            // Add Autorun shortcut
            if (thisUser.userName === 'bmtg') {
                shortcut.add("Control+Alt+u", function() {
                    $("#WMEPH-AutoRunOnSelect" + devVersStr).trigger('click');
                });
            }

            // $("#user-info div.tab-content:first").append(phContentHtml2);
            phlog('Ready...!');
        } // END Settings Tab

        // This routine will create a checkbox in the #PlaceHarmonizer tab and will load the setting
        //        settingID:  The #id of the checkbox being created.
        //  textDescription:  The description of the checkbox that will be use
        function createSettingsCheckbox(divID, settingID, textDescription) {
            //Create settings checkbox and append HTML to settings tab
            var phTempHTML = '<input type="checkbox" id="' + settingID + '">'+ textDescription +'</input><br>';
            $("#" + divID).append(phTempHTML);
            //Associate click event of new checkbox to call saveSettingToLocalStorage with proper ID
            $("#" + settingID).click(function() {saveSettingToLocalStorage(settingID);});
            //Load Setting for Local Storage, if it doesn't exist set it to NOT checked.
            //If previously set to 1, then trigger "click" event.
            if (!localStorage.getItem(settingID))
            {
                //phlogdev(settingID + ' not found.');
            } else if (localStorage.getItem(settingID) === "1") {
                $("#" + settingID).trigger('click');
            }
        }

        function createCloneCheckbox(divID, settingID, textDescription) {
            //Create settings checkbox and append HTML to settings tab
            var phTempHTML = '<input type="checkbox" id="' + settingID + '">'+ textDescription +'</input>&nbsp&nbsp';
            $("#" + divID).append(phTempHTML);
            //Associate click event of new checkbox to call saveSettingToLocalStorage with proper ID
            $("#" + settingID).click(function() {saveSettingToLocalStorage(settingID);});
            //Load Setting for Local Storage, if it doesn't exist set it to NOT checked.
            //If previously set to 1, then trigger "click" event.
            if (!localStorage.getItem(settingID))
            {
                //phlogdev(settingID + ' not found.');
            } else if (localStorage.getItem(settingID) === "1") {
                $("#" + settingID).trigger('click');
            }
        }

        //Function to add Shift+ to upper case KBS
        function parseKBSShift(kbs) {
            if (kbs.match(/^[A-Z]{1}$/g) !== null) { // If upper case, then add a Shift+
                kbs = 'Shift+' + kbs;
            }
            return kbs;
        }

        // Function to check shortcut conflict
        function checkWMEPH_KBSconflict(KBS) {
            var LSString = '';
            if (!isDevVersion) {
                LSString = devVersStringMaster;
            }
            if ( localStorage.getItem('WMEPH-KeyboardShortcut'+LSString) === null || localStorage.getItem('WMEPH-KBSModifierKey'+LSString) === null ) {
                return false;
            } else if ( parseKBSShift(localStorage.getItem('WMEPH-KeyboardShortcut'+LSString)) === KBS && localStorage.getItem('WMEPH-KBSModifierKey'+devVersStringMaster) === localStorage.getItem('WMEPH-KBSModifierKey') ) {
                return true;
            } else {
                return false;
            }
        }

        // Save settings prefs
        function saveSettingToLocalStorage(settingID) {
            if ($("#" + settingID).prop('checked')) {
                localStorage.setItem(settingID, '1');
            } else {
                localStorage.setItem(settingID, '0');
            }
        }

        // This function validates that the inputted text is a JSON
        function validateWLS(jsonString) {
            "use strict";
            try {
                var objTry = JSON.parse(jsonString);
                if (objTry && typeof objTry === "object" && objTry !== null) {
                    return objTry;
                }
            }
            catch (e) { }
            return false;
        }

        // This function merges and updates venues from object vWL_2 into vWL_1
        function mergeWL(vWL_1,vWL_2) {
            "use strict";
            var venueKey, WLKey, vWL_1_Venue, vWL_2_Venue;
            for (venueKey in vWL_2) {
                if (vWL_2.hasOwnProperty(venueKey)) {  // basic filter
                    if (vWL_1.hasOwnProperty(venueKey)) {  // if the vWL_2 venue is in vWL_1, then update any keys
                        vWL_1_Venue = vWL_1[venueKey];
                        vWL_2_Venue = vWL_2[venueKey];
                        for (WLKey in vWL_2_Venue) {  // loop thru the venue WL keys
                            if (vWL_2_Venue.hasOwnProperty(WLKey) && vWL_2_Venue[WLKey].active) {  // Only update if the vWL_2 key is active
                                if ( vWL_1_Venue.hasOwnProperty(WLKey) && vWL_1_Venue[WLKey].active ) {  // if the key is in the vWL_1 venue and it is active, then push any array data onto the key
                                    if (vWL_1_Venue[WLKey].hasOwnProperty('WLKeyArray')) {
                                        vWL_1[venueKey][WLKey].WLKeyArray = insertAtIX(vWL_1[venueKey][WLKey].WLKeyArray,vWL_2[venueKey][WLKey].WLKeyArray,100);
                                    }
                                } else {  // if the key isn't in the vWL_1 venue, or if it's inactive, then copy the vWL_2 key across
                                    vWL_1[venueKey][WLKey] = vWL_2[venueKey][WLKey];
                                }
                            }
                        } // END subLoop for venue keys
                    } else {  // if the venue doesn't exist in vWL_1, then add it
                        vWL_1[venueKey] = vWL_2[venueKey];
                    }
                }
            }
            return vWL_1;
        }

        // Get services checkbox status
        function getServicesChecks() {
            var servArrayCheck = [];
            for (var wsix=0; wsix<WMEServicesArray.length; wsix++) {
                if ($("#service-checkbox-" + WMEServicesArray[wsix]).prop('checked')) {
                    servArrayCheck[wsix] = true;
                } else {
                    servArrayCheck[wsix] = false;
                }
            }
            return servArrayCheck;
        }

        function updateServicesChecks(bannServ) {
            var servArrayCheck = getServicesChecks(), wsix=0;
            for (var keys in bannServ) {
                if (bannServ.hasOwnProperty(keys)) {
                    bannServ[keys].checked = servArrayCheck[wsix];  // reset all icons to match any checked changes
                    bannServ[keys].active = bannServ[keys].active || servArrayCheck[wsix];  // display any manually checked non-active icons
                    wsix++;
                }
            }
            // Highlight 24/7 button if hours are set that way, and add button for all places
            if ( item.attributes.openingHours.length === 1 && item.attributes.openingHours[0].days.length === 7 && item.attributes.openingHours[0].fromHour === '00:00' && item.attributes.openingHours[0].toHour ==='00:00' ) {
                bannServ.add247.checked = true;
            }
            bannServ.add247.active = true;
        }

        // Focus away from the current cursor focus, to set text box changes
        function blurAll() {
            var tmp = document.createElement("input");
            document.body.appendChild(tmp);
            tmp.focus();
            document.body.removeChild(tmp);
        }

        // Pulls the item PL
        function getItemPL() {
            // Append a form div if it doesn't exist yet:
            if ( $('#WMEPH_formDiv').length ===0 ) {
                var tempDiv = document.createElement('div');
                tempDiv.id = 'WMEPH_formDiv';
                tempDiv.style.display = 'inline';
                $(".WazeControlPermalink").append(tempDiv);
            }
            // Return the current PL
            if ($(".WazeControlPermalink").length === 0) {
                phlog("Waiting for PL div");
                setTimeout(getItemPL, 500);
                return;
            }
            if ( $(".WazeControlPermalink").children(".icon-link").length > 0 ) {
                return $(".WazeControlPermalink").children(".icon-link")[0].href;
            } else if ( $(".WazeControlPermalink").children(".fa-link").length > 0 ) {
                return $(".WazeControlPermalink").children(".fa-link")[0].href;
            }
            return  '';
        }

        // Sets up error reporting
        function WMEPH_errorReport(data) {
            data.preview = 'Preview';
            data.attach_sig = 'on';
            if (PMUserList.hasOwnProperty('WMEPH') && PMUserList.WMEPH.approvalActive) {
                data['address_list[u]['+PMUserList.WMEPH.modID+']'] = 'to';
                WMEPH_newForumPost('https://www.waze.com/forum/ucp.php?i=pm&mode=compose', data);
            } else {
                data.addbbcode20 = 'to';
                data.notify = 'on';
                WMEPH_newForumPost(WMEPHurl + '#preview', data);
            }
        }  // END WMEPH_errorReport function

        // Make a populated post on a forum thread
        function WMEPH_newForumPost(url, data) {
            var form = document.createElement('form');
            form.target = '_blank';
            form.action = url;
            form.method = 'post';
            form.style.display = 'none';
            for (var k in data) {
                if (data.hasOwnProperty(k)) {
                    var input;
                    if (k === 'message') {
                        input = document.createElement('textarea');
                    } else if (k === 'username') {
                        input = document.createElement('username_list');
                    } else {
                        input = document.createElement('input');
                    }
                    input.name = k;
                    input.value = data[k];
                    input.type = 'hidden';
                    form.appendChild(input);
                }
            }
            document.getElementById('WMEPH_formDiv').appendChild(form);
            form.submit();
            document.getElementById('WMEPH_formDiv').removeChild(form);
            return true;
        }  // END WMEPH_newForumPost function

        /**
         * Updates the geometry of a place.
         * @param place {Waze venue object} The place to update.
         * @param newGeometry {OL.Geometry} The new geometry for the place.
         */
        function updateFeatureGeometry(place, newGeometry) {
            var oldGeometry,
                model = W.model.venues,
                wmeUpdateFeatureGeometry = require('Waze/Action/UpdateFeatureGeometry');
            if (place && place.CLASS_NAME === 'Waze.Feature.Vector.Landmark' &&
                newGeometry && (newGeometry instanceof OL.Geometry.Point ||
                                newGeometry instanceof OL.Geometry.Polygon)) {
                oldGeometry = place.attributes.geometry;
                W.model.actionManager.add(
                    new wmeUpdateFeatureGeometry(place, model, oldGeometry, newGeometry));
            }
        }

        // Function that checks current place against the Harmonization Data.  Returns place data or "NoMatch"
        function harmoList(itemName,state2L,region3L,country,itemCats,item) {
            var PNH_DATA_headers;
            var ixendPNH_NAMES;
            if (country === 'USA') {
                PNH_DATA_headers = USA_PNH_DATA[0].split("|");  // pull the data header names
                ixendPNH_NAMES = USA_PNH_NAMES.length;
            } else if (country === 'CAN') {
                PNH_DATA_headers = CAN_PNH_DATA[0].split("|");  // pull the data header names
                ixendPNH_NAMES = CAN_PNH_NAMES.length;
            } else {
                alert("No PNH data exists for this country.");
                return ["NoMatch"];
            }
            var ph_name_ix = PNH_DATA_headers.indexOf("ph_name");
            var ph_category1_ix = PNH_DATA_headers.indexOf("ph_category1");
            var ph_forcecat_ix = PNH_DATA_headers.indexOf("ph_forcecat");  // Force the category match
            var ph_region_ix = PNH_DATA_headers.indexOf("ph_region");  // Find the index for regions
            var ph_order_ix = PNH_DATA_headers.indexOf("ph_order");
            var ph_speccase_ix = PNH_DATA_headers.indexOf("ph_speccase");
            var ph_searchnameword_ix = PNH_DATA_headers.indexOf("ph_searchnameword");
            var nameComps;  // filled with search names to compare against place name
            var PNHPriCat;  // Primary category of PNH data
            var PNHForceCat;  // Primary category of PNH data
            var approvedRegions;  // filled with the regions that are approved for the place, when match is found
            var matchPNHData = [];  // array of matched data
            var matchPNHRegionData = [];  // array of matched data with regional approval
            var currMatchData, PNHMatchData, specCases, nmix, allowMultiMatch = false;
            var currMatchNum = 0;  // index for multiple matches, currently returns on first match
            var PNHOrderNum = [];
            var PNHNameTemp = [];
            var PNHNameMatch = false;  // tracks match status
            var PNHStringMatch = false;  // compares name string match
            var PNHMatchProceed;  // tracks match status
            itemName = itemName.toUpperCase();  // UpperCase the current place name (The Holly And Ivy Pub #23 --> THE HOLLY AND IVY PUB #23 )
            itemName = itemName.replace(/ AND /g, ' ');  // Clear the word " AND " from the name (THE HOLLY AND IVY PUB #23 --> THE HOLLY IVY PUB #23 )
            itemName = itemName.replace(/^THE /g, '');  // Clear the word "THE " from the start of the name ( THE HOLLYIVY PUB #23 -- > HOLLY IVY PUB #23 )
            var itemNameSpace = itemName.replace(/[^A-Z0-9 ]/g, ' ');  // Clear all non-letter and non-number characters except spaces ( HOLLYIVY PUB #23 -- > HOLLY IVY PUB  23 )
            itemNameSpace = ' '+itemNameSpace.replace(/ {2,}/g, ' ')+' ';  // Make double spaces into singles ( HOLLY IVY PUB  23 -- > HOLLY IVY PUB 23 )
            itemName = itemName.replace(/[^A-Z0-9]/g, '');  // Clear all non-letter and non-number characters ( HOLLYIVY PUB #23 -- > HOLLYIVYPUB23 )
            var itemNameNoNum = itemName.replace(/[^A-Z]/g, '');  // Clear non-letter characters for alternate match ( HOLLYIVYPUB23 --> HOLLYIVYPUB )

            // Search performance stats
            var t0; var t1;
            if (devUser) {
                t0 = performance.now();  // Speed check start
            }

            // for each place on the PNH list (skipping headers at index 0)
            // phlogdev(ixendPNH_NAMES);
            for (var phnum=1; phnum<ixendPNH_NAMES; phnum++) {
                PNHMatchProceed = false;
                PNHStringMatch = false;
                if (country === 'USA') {
                    nameComps = USA_PNH_NAMES[phnum].split("|");  // splits all possible search names for the current PNH entry
                    PNHMatchData = USA_PNH_DATA[phnum];
                } else if (country === 'CAN') {
                    nameComps = CAN_PNH_NAMES[phnum].split("|");  // splits all possible search names for the current PNH entry
                    PNHMatchData = CAN_PNH_DATA[phnum];
                }
                currMatchData = PNHMatchData.split("|");  // Split the PNH place data into string array

                // Name Matching
                specCases = currMatchData[ph_speccase_ix];
                if (specCases.indexOf('regexNameMatch') > -1) {
                    // Check for regex name matching instead of "standard" name matching.
                    var match = specCases.match(/regexNameMatch<>(.+?)<>/i);
                    if (match !== null) {
                        var re = new RegExp(match[1].replace(/\\/,'\\'),'i');
                        PNHStringMatch = re.test(item.attributes.name);
                    }
                } else if (specCases.indexOf('strMatchAny') > -1 || currMatchData[ph_category1_ix] === 'Hotel') {  // Match any part of WME name with either the PNH name or any spaced names
                    allowMultiMatch = true;
                    var spaceMatchList = [];
                    spaceMatchList.push( currMatchData[ph_name_ix].toUpperCase().replace(/ AND /g, ' ').replace(/^THE /g, '').replace(/[^A-Z0-9 ]/g, ' ').replace(/ {2,}/g, ' ') );
                    if (currMatchData[ph_searchnameword_ix] !== '') {
                        spaceMatchList.push.apply( spaceMatchList,currMatchData[ph_searchnameword_ix].toUpperCase().replace(/, /g,',').split(',') );
                    }
                    for (nmix=0; nmix<spaceMatchList.length; nmix++) {
                        if ( itemNameSpace.includes(' '+spaceMatchList[nmix]+' ') ) {
                            PNHStringMatch = true;
                        }
                    }
                } else if (specCases.indexOf('strMatchStart') > -1) {  //  Match the beginning part of WME name with any search term
                    for (nmix=0; nmix<nameComps.length; nmix++) {
                        if ( itemName.startsWith(nameComps[nmix]) || itemNameNoNum.startsWith(nameComps[nmix]) ) {
                            PNHStringMatch = true;
                        }
                    }
                } else if (specCases.indexOf('strMatchEnd') > -1) {  //  Match the end part of WME name with any search term
                    for (nmix=0; nmix<nameComps.length; nmix++) {
                        if ( itemName.endsWith(nameComps[nmix]) || itemNameNoNum.endsWith(nameComps[nmix]) ) {
                            PNHStringMatch = true;
                        }
                    }
                } else {  // full match of any term only
                    if ( nameComps.indexOf(itemName) > -1 || nameComps.indexOf(itemNameNoNum) > -1 ) {
                        PNHStringMatch = true;
                    }
                }
                // if a match was found:
                if ( PNHStringMatch ) {  // Compare WME place name to PNH search name list
                    phlogdev('Matched PNH Order No.: '+currMatchData[ph_order_ix]);

                    PNHPriCat = catTranslate(currMatchData[ph_category1_ix]);
                    PNHForceCat = currMatchData[ph_forcecat_ix];
                    if (itemCats[0] === "GAS_STATION") {  // Gas stations only harmonized if the WME place category is already gas station (prevents Costco Gas becoming Costco Store)
                        PNHForceCat = "1";
                    }
                    if ( PNHForceCat === "1" && itemCats.indexOf(PNHPriCat) === 0 ) {  // Name and primary category match
                        PNHMatchProceed = true;
                    } else if ( PNHForceCat === "2" && itemCats.indexOf(PNHPriCat) > -1 ) {  // Name and any category match
                        PNHMatchProceed = true;
                    } else if ( PNHForceCat === "0" || PNHForceCat === "") {  // Name only match
                        PNHMatchProceed = true;
                    }

                    if (PNHMatchProceed) {
                        approvedRegions = currMatchData[ph_region_ix].replace(/ /g, '').toUpperCase().split(",");  // remove spaces, upper case the approved regions, and split by commas
                        if (approvedRegions.indexOf(state2L) > -1 || approvedRegions.indexOf(region3L) > -1 ||  // if the WME-selected item matches the state, region
                            approvedRegions.indexOf(country) > -1 ||  //  OR if the country code is in the data then it is approved for all regions therein
                            $("#WMEPH-RegionOverride" + devVersStr).prop('checked')) {  // OR if region override is selected (dev setting
                            if (devUser) {
                                t1 = performance.now();  // log search time
                                //phlogdev("Found place in " + (t1 - t0) + " milliseconds.");
                            }
                            matchPNHRegionData.push(PNHMatchData);
                            bannButt.placeMatched.active = true;
                            if (!allowMultiMatch) {
                                return matchPNHRegionData;  // Return the PNH data string array to the main script
                            }
                        } else {
                            PNHNameMatch = true;  // PNH match found (once true, stays true)
                            //matchPNHData.push(PNHMatchData);  // Pull the data line from the PNH data table.  (**Set in array for future multimatch features)
                            PNHNameTemp.push(currMatchData[ph_name_ix]);  // temp name for approval return
                            PNHOrderNum.push(currMatchData[ph_order_ix]);  // temp order number for approval return
                        }

                        currMatchNum++;  // *** Multiple matches for future work
                    }
                }
            }  // END loop through PNH places

            // If NO (name & region) match was found:
            if (bannButt.placeMatched.active) {
                return matchPNHRegionData;
            } else if (PNHNameMatch) {  // if a name match was found but not for region, prod the user to get it approved
                bannButt.ApprovalSubmit.active = true;
                //phlogdev("PNH data exists but not approved for this area.");
                if (devUser) {
                    t1 = performance.now();  // log search time
                    //phlogdev("Searched all PNH entries in " + (t1 - t0) + " milliseconds.");
                }
                return ["ApprovalNeeded", PNHNameTemp, PNHOrderNum];
            } else {  // if no match was found, suggest adding the place to the sheet if it's a chain
                bannButt.NewPlaceSubmit.active = true;
                //phlogdev("Place not found in the " + country + " PNH list.");
                if (devUser) {
                    t1 = performance.now();  // log search time
                    //phlogdev("Searched all PNH entries in " + (t1 - t0) + " milliseconds.");
                }
                return ["NoMatch"];
            }
        } // END harmoList function

        // KB Shortcut object
        var shortcut = {
            'all_shortcuts': {}, //All the shortcuts are stored in this array
            'add': function(shortcut_combination, callback, opt) {
                //Provide a set of default options
                var default_options = { 'type': 'keydown', 'propagate': false, 'disable_in_input': false, 'target': document, 'keycode': false };
                if (!opt) {opt = default_options;}
                else {
                    for (var dfo in default_options) {
                        if (typeof opt[dfo] === 'undefined') {opt[dfo] = default_options[dfo];}
                    }
                }
                var ele = opt.target;
                if (typeof opt.target === 'string') {ele = document.getElementById(opt.target);}
                // var ths = this;
                shortcut_combination = shortcut_combination.toLowerCase();
                //The function to be called at keypress
                var func = function(e) {
                    e = e || window.event;
                    if (opt.disable_in_input) { //Don't enable shortcut keys in Input, Textarea fields
                        var element;
                        if (e.target) {element = e.target;}
                        else if (e.srcElement) {element = e.srcElement;}
                        if (element.nodeType === 3) {element = element.parentNode;}
                        if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA') {return;}
                    }
                    //Find Which key is pressed
                    var code;
                    if (e.keyCode) {code = e.keyCode;}
                    else if (e.which) {code = e.which;}
                    var character = String.fromCharCode(code).toLowerCase();
                    if (code === 188) {character = ",";} //If the user presses , when the type is onkeydown
                    if (code === 190) {character = ".";} //If the user presses , when the type is onkeydown
                    var keys = shortcut_combination.split("+");
                    //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
                    var kp = 0;
                    //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
                    var shift_nums = { "`": "~","1": "!","2": "@","3": "#","4": "$","5": "%","6": "^","7": "&",
                                      "8": "*","9": "(","0": ")","-": "_","=": "+",";": ":","'": "\"",",": "<",".": ">","/": "?","\\": "|" };
                    //Special Keys - and their codes
                    var special_keys = { 'esc': 27,'escape': 27,'tab': 9,'space': 32,'return': 13,'enter': 13,'backspace': 8,'scrolllock': 145,
                                        'scroll_lock': 145,'scroll': 145,'capslock': 20,'caps_lock': 20,'caps': 20,'numlock': 144,'num_lock': 144,'num': 144,
                                        'pause': 19,'break': 19,'insert': 45,'home': 36,'delete': 46,'end': 35,'pageup': 33,'page_up': 33,'pu': 33,'pagedown': 34,
                                        'page_down': 34,'pd': 34,'left': 37,'up': 38,'right': 39,'down': 40,'f1': 112,'f2': 113,'f3': 114,'f4': 115,'f5': 116,
                                        'f6': 117,'f7': 118,'f8': 119,'f9': 120,'f10': 121,'f11': 122,'f12': 123 };
                    var modifiers = {
                        shift: { wanted: false, pressed: false },
                        ctrl: { wanted: false, pressed: false },
                        alt: { wanted: false, pressed: false },
                        meta: { wanted: false, pressed: false } //Meta is Mac specific
                    };
                    if (e.ctrlKey) {modifiers.ctrl.pressed = true;}
                    if (e.shiftKey) {modifiers.shift.pressed = true;}
                    if (e.altKey) {modifiers.alt.pressed = true;}
                    if (e.metaKey) {modifiers.meta.pressed = true;}
                    for (var i = 0; i < keys.length; i++) {
                        var k = keys[i];
                        //Modifiers
                        if (k === 'ctrl' || k === 'control') {
                            kp++;
                            modifiers.ctrl.wanted = true;
                        } else if (k === 'shift') {
                            kp++;
                            modifiers.shift.wanted = true;
                        } else if (k === 'alt') {
                            kp++;
                            modifiers.alt.wanted = true;
                        } else if (k === 'meta') {
                            kp++;
                            modifiers.meta.wanted = true;
                        } else if (k.length > 1) { //If it is a special key
                            if (special_keys[k] === code) {kp++;}
                        } else if (opt.keycode) {
                            if (opt.keycode === code) {kp++;}
                        } else { //The special keys did not match
                            if (character === k) {kp++;}
                            else {
                                if (shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
                                    character = shift_nums[character];
                                    if (character === k) {kp++;}
                                }
                            }
                        }
                    }

                    if (kp === keys.length && modifiers.ctrl.pressed === modifiers.ctrl.wanted && modifiers.shift.pressed === modifiers.shift.wanted &&
                        modifiers.alt.pressed === modifiers.alt.wanted && modifiers.meta.pressed === modifiers.meta.wanted) {
                        callback(e);
                        if (!opt.propagate) { //Stop the event
                            //e.cancelBubble is supported by IE - this will kill the bubbling process.
                            e.cancelBubble = true;
                            e.returnValue = false;
                            //e.stopPropagation works in Firefox.
                            if (e.stopPropagation) {
                                e.stopPropagation();
                                e.preventDefault();
                            }
                            return false;
                        }
                    }
                };
                this.all_shortcuts[shortcut_combination] = { 'callback': func, 'target': ele, 'event': opt.type };
                //Attach the function with the event
                if (ele.addEventListener) {ele.addEventListener(opt.type, func, false);}
                else if (ele.attachEvent) {ele.attachEvent('on' + opt.type, func);}
                else {ele['on' + opt.type] = func;}
            },
            //Remove the shortcut - just specify the shortcut and I will remove the binding
            'remove': function(shortcut_combination) {
                shortcut_combination = shortcut_combination.toLowerCase();
                var binding = this.all_shortcuts[shortcut_combination];
                delete(this.all_shortcuts[shortcut_combination]);
                if (!binding) {return;}
                var type = binding.event;
                var ele = binding.target;
                var callback = binding.callback;
                if (ele.detachEvent) {ele.detachEvent('on' + type, callback);}
                else if (ele.removeEventListener) {ele.removeEventListener(type, callback, false);}
                else {ele['on' + type] = false;}
            }
        };  // END Shortcut function

        function phlogdev(msg, obj) {
            if (devUser) {
                console.log('WMEPH' + devVersStrDash + ': ' + msg, (obj ? obj : ''));
            }
        }
    } // END runPH Function


    // This function runs at script load, and splits the category dataset into the searchable categories.
    function makeCatCheckList(CH_DATA) {  // Builds the list of search names to match to the WME place name
        var CH_CATS = [];
        var CH_DATA_headers = CH_DATA[0].split("|");  // split the data headers out
        var pc_wmecat_ix = CH_DATA_headers.indexOf("pc_wmecat");  // find the indices needed for the function
        var pc_transcat_ix = CH_DATA_headers.indexOf("pc_transcat");
        var chEntryTemp;

        for (var chix=0; chix<CH_DATA.length; chix++) {  // loop through all PNH places
            chEntryTemp = CH_DATA[chix].split("|");  // split the current PNH data line
            var catID = chEntryTemp[pc_wmecat_ix];
            var catName = chEntryTemp[pc_transcat_ix];
            if (catID.trim().length > 0) {
                CAT_LOOKUP[catName.trim().toUpperCase()] = catID;
            }
            CH_CATS.push(chEntryTemp[pc_wmecat_ix]);
        }
        return CH_CATS;
    } // END makeCatCheckList function

    // This function runs at script load, and builds the search name dataset to compare the WME selected place name to.
    function makeNameCheckList(PNH_DATA) {  // Builds the list of search names to match to the WME place name
        var PNH_NAMES = [];
        var PNH_DATA_headers = PNH_DATA[0].split("|");  // split the data headers out
        var ph_name_ix = PNH_DATA_headers.indexOf("ph_name");  // find the indices needed for the function
        var ph_aliases_ix = PNH_DATA_headers.indexOf("ph_aliases");
        var ph_category1_ix = PNH_DATA_headers.indexOf("ph_category1");
        var ph_searchnamebase_ix = PNH_DATA_headers.indexOf("ph_searchnamebase");
        var ph_searchnamemid_ix = PNH_DATA_headers.indexOf("ph_searchnamemid");
        var ph_searchnameend_ix = PNH_DATA_headers.indexOf("ph_searchnameend");
        var ph_disable_ix = PNH_DATA_headers.indexOf("ph_disable");
        var ph_speccase_ix = PNH_DATA_headers.indexOf("ph_speccase");

        var t0 = performance.now(); // Speed check start
        var newNameListLength;  // static list length

        for (var pnhix=0; pnhix<PNH_DATA.length; pnhix++) {  // loop through all PNH places
            var pnhEntryTemp = PNH_DATA[pnhix].split("|");  // split the current PNH data line
            if (pnhEntryTemp[ph_disable_ix] !== "1" || pnhEntryTemp[ph_speccase_ix].indexOf('betaEnable') > -1 ) {
                var newNameList = pnhEntryTemp[ph_name_ix].toUpperCase();  // pull out the primary PNH name & upper case it
                newNameList = newNameList.replace(/ AND /g, '');  // Clear the word "AND" from the name
                newNameList = newNameList.replace(/^THE /g, '');  // Clear the word "THE" from the start of the name
                newNameList = [newNameList.replace(/[^A-Z0-9]/g, '')];  // Clear non-letter and non-number characters, store in array

                if (pnhEntryTemp[ph_disable_ix] !== "altName") {
                    // Add any aliases
                    var tempAliases = pnhEntryTemp[ph_aliases_ix].toUpperCase();
                    if ( tempAliases !== '' && tempAliases !== '0' && tempAliases !== '') {
                        tempAliases = tempAliases.replace(/,[^A-za-z0-9]*/g, ",").split(",");  // tighten and split aliases
                        for (var alix=0; alix<tempAliases.length; alix++) {
                            newNameList.push( tempAliases[alix].replace(/ AND /g, '').replace(/^THE /g, '').replace(/[^A-Z0-9]/g, '') );
                        }
                    }
                }

                // The following code sets up alternate search names as outlined in the PNH dataset.
                // Formula, with P = PNH primary; A1, A2 = PNH aliases; B1, B2 = base terms; M1, M2 = mid terms; E1, E2 = end terms
                // Search list will build: P, A, B, PM, AM, BM, PE, AE, BE, PME, AME, BME.
                // Multiple M terms are applied singly and in pairs (B1M2M1E2).  Multiple B and E terms are applied singly (e.g B1B2M1 not used).
                // Any doubles like B1E2=P are purged at the end to eliminate redundancy.
                if (pnhEntryTemp[ph_searchnamebase_ix] !== "0" || pnhEntryTemp[ph_searchnamebase_ix] !== "") {   // If base terms exist, otherwise only the primary name is matched
                    var pnhSearchNameBase = pnhEntryTemp[ph_searchnamebase_ix].replace(/[^A-Za-z0-9,]/g, '');  // clear non-letter and non-number characters (keep commas)
                    pnhSearchNameBase = pnhSearchNameBase.toUpperCase().split(",");  // upper case and split the base-name  list
                    newNameList.push.apply(newNameList,pnhSearchNameBase);   // add them to the search base list

                    if (pnhEntryTemp[ph_searchnamemid_ix] !== "0" || pnhEntryTemp[ph_searchnamemid_ix] !== "") {  // if middle search term add-ons exist
                        var pnhSearchNameMid = pnhEntryTemp[ph_searchnamemid_ix].replace(/[^A-Za-z0-9,]/g, '');  // clear non-letter and non-number characters
                        pnhSearchNameMid = pnhSearchNameMid.toUpperCase().split(",");  // upper case and split
                        if (pnhSearchNameMid.length > 1) {  // if there are more than one mid terms, it adds a permutation of the first 2
                            pnhSearchNameMid.push.apply( pnhSearchNameMid,[ pnhSearchNameMid[0]+pnhSearchNameMid[1],pnhSearchNameMid[1]+pnhSearchNameMid[0] ] );
                        }
                        newNameListLength = newNameList.length;
                        for (var extix=1; extix<newNameListLength; extix++) {  // extend the list by adding Mid terms onto the SearchNameBase names
                            for (var altix=0; altix<pnhSearchNameMid.length; altix++) {
                                newNameList.push(newNameList[extix]+pnhSearchNameMid[altix] );
                            }
                        }
                    }

                    if (pnhEntryTemp[ph_searchnameend_ix] !== "0" || pnhEntryTemp[ph_searchnameend_ix] !== "") {  // if end search term add-ons exist
                        var pnhSearchNameEnd = pnhEntryTemp[ph_searchnameend_ix].replace(/[^A-Za-z0-9,]/g, '');  // clear non-letter and non-number characters
                        pnhSearchNameEnd = pnhSearchNameEnd.toUpperCase().split(",");  // upper case and split
                        newNameListLength = newNameList.length;
                        for (var exetix=1; exetix<newNameListLength; exetix++) {  // extend the list by adding End terms onto all the SearchNameBase & Base+Mid names
                            for (var aletix=0; aletix<pnhSearchNameEnd.length; aletix++) {
                                newNameList.push(newNameList[exetix]+pnhSearchNameEnd[aletix] );
                            }
                        }
                    }
                }
                // Clear out any empty entries
                var newNameListTemp = [];
                for ( catix=0; catix<newNameList.length; catix++) {  // extend the list by adding Hotel to all items
                    if (newNameList[catix].length > 1) {
                        newNameListTemp.push(newNameList[catix]);
                    }
                }
                newNameList = newNameListTemp;
                // Next, add extensions to the search names based on the WME place category
                newNameListLength = newNameList.length;
                var catix;
                if (pnhEntryTemp[ph_category1_ix].toUpperCase().replace(/[^A-Za-z0-9]/g, '') === "HOTEL") {
                    for ( catix=0; catix<newNameListLength; catix++) {  // extend the list by adding Hotel to all items
                        newNameList.push(newNameList[catix]+"HOTEL");
                    }
                } else if (pnhEntryTemp[ph_category1_ix].toUpperCase().replace(/[^A-Za-z0-9]/g, '') === "BANKFINANCIAL") {
                    for ( catix=0; catix<newNameListLength; catix++) {  // extend the list by adding Bank and ATM to all items
                        newNameList.push(newNameList[catix]+"BANK");
                        newNameList.push(newNameList[catix]+"ATM");
                    }
                } else if (pnhEntryTemp[ph_category1_ix].toUpperCase().replace(/[^A-Za-z0-9]/g, '') === "SUPERMARKETGROCERY") {
                    for ( catix=0; catix<newNameListLength; catix++) {  // extend the list by adding Supermarket to all items
                        newNameList.push(newNameList[catix]+"SUPERMARKET");
                    }
                } else if (pnhEntryTemp[ph_category1_ix].toUpperCase().replace(/[^A-Za-z0-9]/g, '') === "GYMFITNESS") {
                    for ( catix=0; catix<newNameListLength; catix++) {  // extend the list by adding Gym to all items
                        newNameList.push(newNameList[catix]+"GYM");
                    }
                } else if (pnhEntryTemp[ph_category1_ix].toUpperCase().replace(/[^A-Za-z0-9]/g, '') === "GASSTATION") {
                    for ( catix=0; catix<newNameListLength; catix++) {  // extend the list by adding Gas terms to all items
                        newNameList.push(newNameList[catix]+"GAS");
                        newNameList.push(newNameList[catix]+"GASOLINE");
                        newNameList.push(newNameList[catix]+"FUEL");
                        newNameList.push(newNameList[catix]+"STATION");
                        newNameList.push(newNameList[catix]+"GASSTATION");
                    }
                } else if (pnhEntryTemp[ph_category1_ix].toUpperCase().replace(/[^A-Za-z0-9]/g, '') === "CARRENTAL") {
                    for ( catix=0; catix<newNameListLength; catix++) {  // extend the list by adding Car Rental terms to all items
                        newNameList.push(newNameList[catix]+"RENTAL");
                        newNameList.push(newNameList[catix]+"RENTACAR");
                        newNameList.push(newNameList[catix]+"CARRENTAL");
                        newNameList.push(newNameList[catix]+"RENTALCAR");
                    }
                }
                newNameList = uniq(newNameList);  // remove any duplicate search names
                newNameList = newNameList.join("|");  // join the list with |
                newNameList = newNameList.replace(/\|{2,}/g, '|');
                newNameList = newNameList.replace(/\|+$/g, '');
                PNH_NAMES.push(newNameList);  // push the list to the master search list
            } else { // END if valid line
                PNH_NAMES.push('00');
            }
        }
        var t1 = performance.now();  // log search time
        //phlog("Built search list of " + PNH_DATA.length + " PNH places in " + (t1 - t0) + " milliseconds.");
        return PNH_NAMES;
    }  // END makeNameCheckList

    // Whitelist stringifying and parsing
    function saveWL_LS(compress) {
        venueWhitelistStr = JSON.stringify(venueWhitelist);
        if (compress) {
            if (venueWhitelistStr.length < 4800000 ) {  // Also save to regular storage as a back up
                localStorage.setItem(WLlocalStoreName, venueWhitelistStr);
            }
            venueWhitelistStr = LZString.compressToUTF16(venueWhitelistStr);
            localStorage.setItem(WLlocalStoreNameCompressed, venueWhitelistStr);
        } else {
            localStorage.setItem(WLlocalStoreName, venueWhitelistStr);
        }
    }
    function loadWL_LS(decompress) {
        if (decompress) {
            venueWhitelistStr = localStorage.getItem(WLlocalStoreNameCompressed);
            venueWhitelistStr = LZString.decompressFromUTF16(venueWhitelistStr);
        } else {
            venueWhitelistStr = localStorage.getItem(WLlocalStoreName);
        }
        venueWhitelist = JSON.parse(venueWhitelistStr);
    }
    function backupWL_LS(compress) {
        venueWhitelistStr = JSON.stringify(venueWhitelist);
        if (compress) {
            venueWhitelistStr = LZString.compressToUTF16(venueWhitelistStr);
            localStorage.setItem(WLlocalStoreNameCompressed+Math.floor(Date.now() / 1000), venueWhitelistStr);
        } else {
            localStorage.setItem(WLlocalStoreName+Math.floor(Date.now() / 1000), venueWhitelistStr);
        }
    }

    // Removes duplicate strings from string array
    function uniq(a) {
        "use strict";
        var seen = {};
        return a.filter(function(item) {
            return seen.hasOwnProperty(item) ? false : (seen[item] = true);
        });
    }  // END uniq function

    function phlog(m) {
        if ('object' === typeof m) {
            //m = JSON.stringify(m);
        }
        console.log('WMEPH' + devVersStrDash + ': ' + m);
    }

    function zoomPlace() {
        if (W.selectionManager.selectedItems.length === 1 && W.selectionManager.selectedItems[0].model.type === "venue") {
            W.map.moveTo(W.selectionManager.selectedItems[0].model.geometry.getCentroid().toLonLat(), 7);
        } else {
            W.map.moveTo(WMEPHmousePosition, 5);
        }
    }

    function sortWithIndex(toSort) {
        for (var i = 0; i < toSort.length; i++) {
            toSort[i] = [toSort[i], i];
        }
        toSort.sort(function(left, right) {
            return left[0] < right[0] ? -1 : 1;
        });
        toSort.sortIndices = [];
        for (var j = 0; j < toSort.length; j++) {
            toSort.sortIndices.push(toSort[j][1]);
            toSort[j] = toSort[j][0];
        }
        return toSort;
    }

    function destroyDupeLabels(){
        WMEPH_NameLayer.destroyFeatures();
        WMEPH_NameLayer.setVisibility(false);
    }

    // When a dupe is deleted, delete the dupe label
    function deleteDupeLabel(){
        //phlog('Clearing dupe label...');
        setTimeout(function() {
            var actionsList = W.model.actionManager.actions;
            var lastAction = actionsList[actionsList.length-1];
            if ( 'undefined' !== typeof lastAction && lastAction.hasOwnProperty('object') && lastAction.object.hasOwnProperty('state') && lastAction.object.state === 'Delete' ) {
                if ( dupeIDList.indexOf(lastAction.object.attributes.id) > -1 ) {
                    if (dupeIDList.length === 2) {
                        WMEPH_NameLayer.destroyFeatures();
                        WMEPH_NameLayer.setVisibility(false);
                    } else {
                        var deletedDupe = WMEPH_NameLayer.getFeaturesByAttribute('dupeID', lastAction.object.attributes.id) ;
                        WMEPH_NameLayer.removeFeatures(deletedDupe);
                        dupeIDList.splice(dupeIDList.indexOf(lastAction.object.attributes.id),1);
                    }
                    phlog('Deleted a dupe');
                }
            }
            /*
            else if ('undefined' !== typeof lastAction && lastAction.hasOwnProperty('feature') && lastAction.feature.hasOwnProperty('state') && lastAction.object.state === 'Update' &&
            lastAction.hasOwnProperty('newGeometry') ) {
                // update position of marker
            }
            */
        },20);
    }

    //  Whitelist an item
    function whitelistAction(itemID, wlKeyName) {
        'use strict';
        var item = W.selectionManager.selectedItems[0].model;
        var addressTemp = item.getAddress();
        if ( addressTemp.hasOwnProperty('attributes') ) {
            addressTemp = addressTemp.attributes;
        }
        var itemGPS = OpenLayers.Layer.SphericalMercator.inverseMercator(item.attributes.geometry.getCentroid().x,item.attributes.geometry.getCentroid().y);
        if (!venueWhitelist.hasOwnProperty(itemID)) {  // If venue is NOT on WL, then add it.
            venueWhitelist[itemID] = { };
        }
        venueWhitelist[itemID][wlKeyName] = {active: true};  // WL the flag for the venue
        venueWhitelist[itemID].city = addressTemp.city.attributes.name;  // Store city for the venue
        venueWhitelist[itemID].state = addressTemp.state.name;  // Store state for the venue
        venueWhitelist[itemID].country = addressTemp.country.name;  // Store country for the venue
        venueWhitelist[itemID].gps = itemGPS;  // Store GPS coords for the venue
        saveWL_LS(true);  // Save the WL to local storage
        WMEPH_WLCounter();
        bannButt2.clearWL.active = true;
    }

    // Keep track of how many whitelists have been added since the last pull, alert if over a threshold (100?)
    function WMEPH_WLCounter() {
        localStorage.WMEPH_WLAddCount = parseInt(localStorage.WMEPH_WLAddCount)+1;
        if (localStorage.WMEPH_WLAddCount > 50) {
            alert('Don\'t forget to periodically back up your Whitelist data using the Pull option in the WMEPH settings tab.');
            localStorage.WMEPH_WLAddCount = 2;
        }
    }

    var _googleLinkHash = {};
    function modifyGoogleLinks() {
        // MutationObserver will be notified when Google place ID divs are added, then update them to be hyperlinks.
        var observer = new MutationObserver(function(mutations) {
            mutations.forEach(function(mutation) {
                // Mutation is a NodeList and doesn't support forEach like an array
                for (var i = 0; i < mutation.addedNodes.length; i++) {
                    var addedNode = mutation.addedNodes[i];
                    // Only fire up if it's a node
                    if (addedNode.nodeType === Node.ELEMENT_NODE) {
                        if(addedNode.querySelector('div .placeId')) {
                            var placeLinkDivs = $(addedNode).find('.placeId');
                            for(i=0; i<placeLinkDivs.length; i++) {
                                var placeLinkDiv = placeLinkDivs[i];
                                var placeLinkId = placeLinkDiv.innerHTML;
                                if (_googleLinkHash.hasOwnProperty(placeLinkId)) {
                                    placeLinkDiv.innerHTML = _googleLinkHash[placeLinkId];
                                }
                            }
                        }
                    }
                }
            });
        });
        observer.observe(document.getElementById('edit-panel'), { childList: true, subtree: true });
        $.ajaxPrefilter(function(options, originalOptions, jqXHR) {
            try {
                if (originalOptions.type === "GET") {
                    if (originalOptions.url === "/maps/api/place/autocomplete/json" && !originalOptions.data.hasOwnProperty("location")) {
                        options.data = $.param($.extend(originalOptions.data, {
                            location: W.map.getCenter().transform(W.map.getProjection(), W.map.displayProjection).lat + "," + W.map.getCenter().transform(W.map.getProjection(), W.map.displayProjection).lon,
                            radius: 3200
                        }));
                    }
                }
            } catch(e) {}
        });
        $(document).ajaxSuccess(function(event, jqXHR, ajaxOptions, data) {
            try {
                var ix;
                if (ajaxOptions && ajaxOptions.hasOwnProperty("url")) {
                    if (ajaxOptions.url.startsWith("/maps/api/place/details/json")) {
                        if (data && data.hasOwnProperty("status") && data.status === "OK") {
                            if (data.hasOwnProperty("result") && data.result.hasOwnProperty("url") && data.result.hasOwnProperty("place_id")) {
                                var gpids = document.getElementsByClassName("placeId");
                                for (ix = 0; ix < gpids.length; ix++) {
                                    if (data.result.place_id === gpids[ix].innerHTML) {
                                        var html = "<a href='" + data.result.url + "' target='_wmegpid'>" + data.result.place_id + "</a>";
                                        _googleLinkHash[data.result.place_id] = html;
                                        gpids[ix].innerHTML = html;
                                    }
                                }
                            }
                        }
                    }
                    if (ajaxOptions.url.startsWith("/maps/api/place/autocomplete/json")) {
                        var uuids = document.getElementsByClassName("uuid");
                        for (ix = 0; ix < uuids.length; ix++) {
                            if (uuids[ix].className === "uuid") {
                                events = $._data(uuids[ix], "events");
                                if (events && events.hasOwnProperty("change") && events.change.length === 1) {
                                    $(uuids[ix]).change(function(event) {
                                        if (event && event.hasOwnProperty("val")) {
                                            $.get(W.Config.places_api.url.details, {placeid: event.val, key: W.Config.places_api.key});
                                        }
                                    });
                                }
                            }
                        }
                    }
                }
            } catch(e) {}
        });
    }

    // Run the script...
    placeHarmonizer_bootstrap();


    function insertCss( code ) {
        var style = document.createElement('style');
        style.type = 'text/css';
        style.innerHTML = code;
        document.head.appendChild( style );
    }  // END insertCss funtion

    var cssServButts =[
        '.serv-247 { width: 73px; height: 50px; display: inline-block; background: transparent url(data:image/png;base64,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) top center no-repeat; }',
        '.serv-ac { width: 50px; height: 50px; display: inline-block; background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAD8GlDQ1BJQ0MgUHJvZmlsZQAAOI2NVd1v21QUP4lvXKQWP6Cxjg4Vi69VU1u5GxqtxgZJk6XpQhq5zdgqpMl1bhpT1za2021Vn/YCbwz4A4CyBx6QeEIaDMT2su0BtElTQRXVJKQ9dNpAaJP2gqpwrq9Tu13GuJGvfznndz7v0TVAx1ea45hJGWDe8l01n5GPn5iWO1YhCc9BJ/RAp6Z7TrpcLgIuxoVH1sNfIcHeNwfa6/9zdVappwMknkJsVz19HvFpgJSpO64PIN5G+fAp30Hc8TziHS4miFhheJbjLMMzHB8POFPqKGKWi6TXtSriJcT9MzH5bAzzHIK1I08t6hq6zHpRdu2aYdJYuk9Q/881bzZa8Xrx6fLmJo/iu4/VXnfH1BB/rmu5ScQvI77m+BkmfxXxvcZcJY14L0DymZp7pML5yTcW61PvIN6JuGr4halQvmjNlCa4bXJ5zj6qhpxrujeKPYMXEd+q00KR5yNAlWZzrF+Ie+uNsdC/MO4tTOZafhbroyXuR3Df08bLiHsQf+ja6gTPWVimZl7l/oUrjl8OcxDWLbNU5D6JRL2gxkDu16fGuC054OMhclsyXTOOFEL+kmMGs4i5kfNuQ62EnBuam8tzP+Q+tSqhz9SuqpZlvR1EfBiOJTSgYMMM7jpYsAEyqJCHDL4dcFFTAwNMlFDUUpQYiadhDmXteeWAw3HEmA2s15k1RmnP4RHuhBybdBOF7MfnICmSQ2SYjIBM3iRvkcMki9IRcnDTthyLz2Ld2fTzPjTQK+Mdg8y5nkZfFO+se9LQr3/09xZr+5GcaSufeAfAww60mAPx+q8u/bAr8rFCLrx7s+vqEkw8qb+p26n11Aruq6m1iJH6PbWGv1VIY25mkNE8PkaQhxfLIF7DZXx80HD/A3l2jLclYs061xNpWCfoB6WHJTjbH0mV35Q/lRXlC+W8cndbl9t2SfhU+Fb4UfhO+F74GWThknBZ+Em4InwjXIyd1ePnY/Psg3pb1TJNu15TMKWMtFt6ScpKL0ivSMXIn9QtDUlj0h7U7N48t3i8eC0GnMC91dX2sTivgloDTgUVeEGHLTizbf5Da9JLhkhh29QOs1luMcScmBXTIIt7xRFxSBxnuJWfuAd1I7jntkyd/pgKaIwVr3MgmDo2q8x6IdB5QH162mcX7ajtnHGN2bov71OU1+U0fqqoXLD0wX5ZM005UHmySz3qLtDqILDvIL+iH6jB9y2x83ok898GOPQX3lk3Itl0A+BrD6D7tUjWh3fis58BXDigN9yF8M5PJH4B8Gr79/F/XRm8m241mw/wvur4BGDj42bzn+Vmc+NL9L8GcMn8F1kAcXgSteGGAAAACXBIWXMAABcSAAAXEgFnn9JSAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAANuklEQVRoBcWaCYxW1RXHv1lgREBA9mVmGPYdWQcwLAJFKogEahCMtLgTQaKJxUSxg0ItokCpgFSTxq22JG3TNFUZsOhgAImoVBgcBgTBQWRRoeyzvP7+Z+59vPn4Pvbam7x595571nvuPefc900sdvVaCqzSePQO25AhQ2qNGDGiUQio7Hjc1Dj4ZQ/TL5uyKqEUC3jKHVgKahzs2LFjaUpKSi364yJzFfQ9rgNf2etyV0SK+5U3I4YOHdp64MCBY4MgEE8pao1x29OnTzd1Q+FWAEu74YYb7uzUqdMwB/evKF8P+1HeEmyL0bVr12m1atUKevbs+RyKCh7Tu0WLFu83atTog6g2GPGiprOysvIjcKNx42g/gnKVu4MGDcpk7zdwbM2QkSNHtmzQoME2YEGPHj1+50VmZmauxZAP/bhXr14vCAfcQvjkOLjxmDRpUr2JEyc2drCraoyYSYjeIeP69etvaNWqlVZVTfOmyNChQ7MbNmz4BWMZ88KiRYtyu3fvvrtp06af7N27t0bv3r29EduEK2JaSN+tW7e86667blfLli2bVE5V8qV/ThBx85f1ErPY9OnTMxC2o3Xr1n9yXLyBNn/rrbdmec8MGDDgIAaX1alT5yiGbQRfnvhCOI7WBxtbiPbt278snBo1agyIm3fDs4vpARd6m3Jydd++fYc+8sgjNTyBDKlbt25R27Zt33Qwb4iGphjhNrNx48aFjBW5ynh0+GXENs3RV/NGqG+GdOzYcRn94Nprr+0jIM1449XR/fv3b14JSmyMMXAI0Zcx2LdvX/eioqL3Vq9e/drzzz9vZyI9PT2VQxwrLy+PGuBppXR6fn7+Xg7/SLZZEWPbFpyTIg75zZoTDo9wq7SKigrjec0111RzE0GbNm3yNm/e/I/Dhw8PdLBkOlfh5QfGcMWKFWlsIR3cACXy582b10wIKPglWyaRRzy9rfbtt98+uEmTJv8B/xjbqZ+bjHrC45tyHTp0eAmAvNhFExjxrMbosI5t6pPqpRmSl5cXEhAm54khh3X1+PHjpxJmSzHkDxJGS+SZEAbeBiKXzodv4ZwH8DZZnBEzhGh2D9tpNvAA+u1Tp05t73DNuxG6S+82b978aTFmhbVicvnvHZfQ4AjXUFnySAHbqiDRXDzM8QyQdapatWoB53DTo48+2i6Cl7SbyM2GzLaqzmoE69atS2W/l2/YsGHhsmXLRu3Zs6enEKpXr+73cVLmmqA8iaWmpoaGJUHWfMD50yLFSkpKYgSLGIf/tQULFmxXsCHyWUkzePDgCnJYOXwN1/OLCjBmw4cPzyosLPwzh7kByEaMImp1Dx061PDUqVNGy779fNy4cePnz59fDEAuN1zH2Hipz7YqKC0tje3fv39Q/Jwby6NW0pA/3tm9e/dIB4/hyZPocABdTinA6EGPlNq1a0/ftWuXqoKQ9hyPlJWVnQDhE576MDEBMIoBLycRlpFDmh07dqzfzp07u65atWr5nDlzpjz55JNfgR9vDCCWGeFEI+sn+BMqwjaaU1xcPLJZs2b7CO/51Gdl0FVHh3QeW3B4pWBIKd4qwRBjn4CngYwg2aTgb7/9dsbdd9/dPScnx+olEt0qAkOWo5ExaiEfeSTJGZER1tq1a5dHJ+C97b777utcCb38vxIu5tFHsPgnlMD2msMg4Ay9t3DhQl/hVoksRLwCAkRBSFTZkQxrnMNf0QmIWB9pgRxYPIQTLzteR42rtHhAKKgKVuUghfzgVz6Gor8GrNrqHfJMC6FE5+WROENC3njgKdHi3eLHH3+8lWhpIe/K4Tl/Q3o3E+puHRJOdpcuXcbdcccdlvQuhSFhcwH4MiafM5PpBJjAuK0lWSYPmtmiwaub77///g6O5kJG2Dyea4asiTfeeKPPL8bTJgl1E9LS0gLi/ueTJ0/2e/6cYOAE+le4OtnZ2bbNSGSrn3jiiWyPgCEf6IzooHoYB/tp+vLEl5EzcV5Z3stz585tzCKsFz06T3Y8zQYTwIFNh7GSXIDwyzIGOttm3DneRaCdGYR+RJT50AmMcRbMCODbHn744bZRRTxO/Nsb8dBDD2VTxvyLeen4ikoohxsuUriyGGOlNJ7Zeu+999qeB9mvlgjin5grZ4wZnpkrQZQz7yP456zafs5RMV7q17lzZ4t04OxmC/d2Soh3PM9wTPIz2SpaOVN2FYD+FUerV6i7BiIMAVhrNQ8EW6dMmeL3vCkq5CQtnMcDc4n32joBGVlPKZHtKHSJaqck7AxsPClTMvHkWtHD25dGQvAy/duI7I6t3qxZs3K5rR2mKxcWTpgw4aLqnUouMXmoDUYcEj2PMr7eUiLgYC+lf9Ft2rRpOSzCKgi0MMfkWRFHz5zGKZz82lxD9cmmNat4hmyaVq9evcwjR460cNkzjatqSc2aNYvJ7tqTgUu0lrXFJNpUQnDDa/Ttt9+2oqSh9qssyShTAsr5GJn7yMmTJ3eeOXPmOHR+JWWoNfGWkugRZGRkxMDt8PXXX6uEL4deHzO++uGHH0qoNioUnMDLOHHixOx0BNWkHKgNY22tNBilHD169HsYNKJbA6axgwcPNkeRIxDJS2mCSWCkeUUCmKdCXxth1SgsJUhKxVAqgE8q5c0xFqUcWDWM1ltsVHpYKeN5wz/t+PHjKW7xTBQKB998802ALtJBNAEGVUdm4gIWpAy+UZk7KdD2cnAnr1mzxh/4iP5Vu2IuyIwZM7qRk/zWkqa2tdimFYT2nwkH3PBMapys3XLLLe0o6wuZVwlTQl1nkc7LSkZn4YyLzQgKxNMUb+VjxowZlQw5Dh66iDzxjASzJYPrr79eh72Mw6piVN+9VvmbJuMLGWM8iXCZbMmtoseY5bx98zL9+2zUoowfx+X/NOfkCNdbb4QMFHKyRwoZM5/syNhFhO+lfE08gieK8VIuMLs2R5OmyxHJ+ApuO0HGeM+Qg6KRq8pimCdIZD0p08vYTt9x1xgDE99MST+Ie4eMvBHcK3aSQyzSofzH0YRITrF7uL4BEN2yHC+TH8c3OjRjVHHgZdtmyFKK8M30M0U4B104kCcRembYsGE3OQwxuCgjWKU8cJUntiKwB31rRJlzShQMtQoAY1ZRmzV3qBdlDJ+ostlmW6DRlXiRozUb7A+xejjWFvDpc4ibPJ8BQol6YhbjAAV3P/DAA50cvSmGIdHqVzyNL9ttjmjkGXKDT7oXMsbmtc1YuBVcjbUgaufV9XyToREwfApGuk9silSxthUkAYULiP8F6rsW0mL4bGABZ2alr80YX8iYkN4zTPh2dZOQZUiiJ2REBMkDR1/V98RVseEiyJC4GyIkZ70JrRmDZ1bGXQG8Dnr7R3x9X3xCORpEW9KJKJL6eMC2Bqta5A82YO+JkE/c1hKpn5NC1jD2GTq6z6wmuvk7hptN+vJ8DCE6UD/g0lJ7+/btU8iqnciYpSSedJ4yMmg1gkEpmTaF8qUVHx9+SuQoys3NnfTGG2/oY4WM8J9BjZckyBCqhtiBAwcGaUwL5+jLGCVM3TR/w6emmbx3Evr15aUUsFUMkayfSiXwHenhhU8//fQg81FeYmPNVog80pXwa5kYaNI3+77krrvusk+b4MXvawmwJkPitlY451BMrjI1uOuAJZWpOX24Yxv6j9yhV8MOSLYyIG5n1XMJcQPp5+L2wUSzPqNGjVpEaFYle4YnRr7Jf/311xUGZYTgCZtW8wJNclOprQJkKkeoncb42NixY/9CiFUo74+8XPTphzd6o8+/Dcvp7PoX92IV5lGyBNxRJFhX4pcdZSJNw1V3HlkbkRLOxcOQYTdUFqyUEingJ413X3311foRvKTdREoIWausPW9CCbHPfvbZZ79kdTax9abpoqTqVYg028eV3XP/sooxldtuJpERIRHes13Rp0+fJXhk/saNG2/mM9Nf+cLS0iFJZvw2DunP2/HfnfDEXjJ2NyEjZBfufdMRnqOcv2M/+OCDLdku+ykcD44ePbqtw/eRzQ3tZTwoKF9kpGKzl6AcfPsVgDzzzsyZM+sY5tmo54bnf5nVMBgNmsqOj32y0wdl3F7ElvljIsbeCJX9VAt/E70elNuqjOxo4o0xQ9haSx2+3QKF60MzvH6hMe2SPGKMMaQ5RkzkA0CTSh4xXWOrs8JfICCRR2yrrly5siZ55rfQyAgFAj36SaLwtttuS2RMFY9ww+wLvprBuXaP79evX8dKUCXM9S/qZUwimLYS7jfEYpR6y835c+bfMS5VizgbCggBOSHgRniSc6ZcI2O2JTDGK2yHHUNyHe+EnovoFHZD4SHkbEerKQEyQHh2ECnvy0mMp7jGWhgGLi/Z/JIlS2qxz1/asmXLDD4DfUL4fIYAcZS8tJW5gcCW8fNCh/Xr17/LFsyCVAlUtGYIueR7+rpG+8Tqg4R0EI4fC+3KmhKX7i38yuo/c5oSixcvzsADi+GufPDWY489ZttR54vgsNZL5aKle4TOTKH+ycDBzdtsoRYk2nvgr+ikZrwru//7v+ZVQuad+sCQk5Pz9+XLl3tFdFjtPuLV0ELgGTvUeOufDi6Ff1SlvT7hdvAKcBO8iZV/Tp5xSGYgXlpDgnvfwUxZGcPqT6RW+4mD+5fmzTse8P9+mxFSAo9oa22KKBTORWBX3I2PClfC0G8PHUgFBo31BeU5FbJUv+ItmJ+TQR5Xc1fU/gtvcq906SZFbAAAAABJRU5ErkJggg==) top center no-repeat; }',
        '.serv-credit { width: 73px; height: 50px; display: inline-block; background: transparent url(data:image/png;base64,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) top center no-repeat; }',
        '.serv-deliveries { width: 86px; height: 50px; display: inline-block; background: transparent url(data:image/png;base64,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) top center no-repeat; }',
        '.serv-drivethru { width: 78px; height: 50px; display: inline-block; background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE4AAAAyCAYAAADySu2nAAAD8GlDQ1BJQ0MgUHJvZmlsZQAAOI2NVd1v21QUP4lvXKQWP6Cxjg4Vi69VU1u5GxqtxgZJk6XpQhq5zdgqpMl1bhpT1za2021Vn/YCbwz4A4CyBx6QeEIaDMT2su0BtElTQRXVJKQ9dNpAaJP2gqpwrq9Tu13GuJGvfznndz7v0TVAx1ea45hJGWDe8l01n5GPn5iWO1YhCc9BJ/RAp6Z7TrpcLgIuxoVH1sNfIcHeNwfa6/9zdVappwMknkJsVz19HvFpgJSpO64PIN5G+fAp30Hc8TziHS4miFhheJbjLMMzHB8POFPqKGKWi6TXtSriJcT9MzH5bAzzHIK1I08t6hq6zHpRdu2aYdJYuk9Q/881bzZa8Xrx6fLmJo/iu4/VXnfH1BB/rmu5ScQvI77m+BkmfxXxvcZcJY14L0DymZp7pML5yTcW61PvIN6JuGr4halQvmjNlCa4bXJ5zj6qhpxrujeKPYMXEd+q00KR5yNAlWZzrF+Ie+uNsdC/MO4tTOZafhbroyXuR3Df08bLiHsQf+ja6gTPWVimZl7l/oUrjl8OcxDWLbNU5D6JRL2gxkDu16fGuC054OMhclsyXTOOFEL+kmMGs4i5kfNuQ62EnBuam8tzP+Q+tSqhz9SuqpZlvR1EfBiOJTSgYMMM7jpYsAEyqJCHDL4dcFFTAwNMlFDUUpQYiadhDmXteeWAw3HEmA2s15k1RmnP4RHuhBybdBOF7MfnICmSQ2SYjIBM3iRvkcMki9IRcnDTthyLz2Ld2fTzPjTQK+Mdg8y5nkZfFO+se9LQr3/09xZr+5GcaSufeAfAww60mAPx+q8u/bAr8rFCLrx7s+vqEkw8qb+p26n11Aruq6m1iJH6PbWGv1VIY25mkNE8PkaQhxfLIF7DZXx80HD/A3l2jLclYs061xNpWCfoB6WHJTjbH0mV35Q/lRXlC+W8cndbl9t2SfhU+Fb4UfhO+F74GWThknBZ+Em4InwjXIyd1ePnY/Psg3pb1TJNu15TMKWMtFt6ScpKL0ivSMXIn9QtDUlj0h7U7N48t3i8eC0GnMC91dX2sTivgloDTgUVeEGHLTizbf5Da9JLhkhh29QOs1luMcScmBXTIIt7xRFxSBxnuJWfuAd1I7jntkyd/pgKaIwVr3MgmDo2q8x6IdB5QH162mcX7ajtnHGN2bov71OU1+U0fqqoXLD0wX5ZM005UHmySz3qLtDqILDvIL+iH6jB9y2x83ok898GOPQX3lk3Itl0A+BrD6D7tUjWh3fis58BXDigN9yF8M5PJH4B8Gr79/F/XRm8m241mw/wvur4BGDj42bzn+Vmc+NL9L8GcMn8F1kAcXgSteGGAAAACXBIWXMAABcSAAAXEgFnn9JSAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAAWr0lEQVRoBdWbCZzNVf/H750NIbLLNiRSso6UJdOgBQmDCJGEoUSLiOd56kEoPUiJRNZU+NuStUSWki2ipEzZ932d5d7/+3Pmd65757kzXfOoV53X6zfn9zvL95zv93z3c8fl+vuXsD8ZBbfWM3/+5IWv53Iimqd79+6FNmzY0OzYsWP1w8PDvWrjCQk3j8fjpoTzXGTOSR7Nz8uTkyfF6/VmY0xidHT0N/Xr11/2yiuvnKU9LCTgDPwrFkO0Vq1aFdm+ffvMM2fOxIaFhbn0QASzX5D27du2+RqcF/8xatK3YKi2faohnrdw4cIfVqhQoffMmTOPR6QH9Df5FmU8n332WbaXXnpp0tGjR2OLFi26p1SpUp+C5JGIiAhxnCs1NdWHjsOJ5hvCaL4XYujbrXH0a7zbIbyhuNrFjcnJySUTExOb7N27t1327NnDWaOdAfR3+4O4GL323HPPlShZsuTesmXLert16zbsj8SjQ4cOo4sVK+aF434cP358gT9bsV5X3G688UYvHHDpypUrrpMnT2a/rsD9gL311lvZ4OoCSUlJrqioqEu5c+cOTYH6wfirvBpRQ2Qi7r333td//PHHPojaqbx5825AvE7YTUo3BStW36Xr9yCmPtmW2DLXDaGk64qcOnWqASrAW6lSpVdQEYOvh47TAiq2TvsK/tcfE//34KMzbtVc8HenYBwGX7x4Mdu5c+faXrhwoYEaVUBWJQCCLCgNXukxzU8b4jWApPcuX75sDIJ0X86cOV0QyoWldqWkpLhuuOEGV/Hixcc+8cQTwwU+FGQDFvf70Fw9RsP6tYf6qt0Ls0DsQp3NOOk6Hg8EiOzVq1fFX3/9NQLOu6b9OMRMhTAlDhw40Pfnn3+ujfhfqFix4rvZsmX74vDhw313794dW7BgwX0PPvhgvREjRiRyWOFZ4TgRS0iLrXVoYWw68vTp03lg61rU+XANvOgDt06OTXgRIddNN910DI5Ymz9//ovojBROzYiFg3yWCCiisQcxWDL1Fp7/pWyJj4+PxHLWhvjfVa9efRDwz2J07ti/f38seF6A4+TruT755BPPtRJORBOSqQAK79Sp091xcXGt9+3bVwlxKQHhytBnzDu1MFJl/CKqpEuXLv2QK1euEzt27NjZsWPHeS1atNjwyCOPnDOD0rg3K9ynOXZfDihfFQZ3uGfNmpUp3NjY2LAvv/wy5fz58/sQWS/67RREu+BA2UOdTFsYbomB8+qrr7qvhXDiMolFWPv27RtUq1at24kTJxpLv8jK8JxGF0xlgUR0g4rRJdIPskZsKFe+fPmaQbzK3333Xdwvv/zS7aeffpoPYv8Gse3A9jrcdy2iZgnmRfcUhNMbgnxerO1JXIeVo0ePPgJsB/+MK4hmOjl44WhYuGvXrmHvvfdeKvu/CM4pajaDnD+hEs4QDfku9cADD/T94YcfEgDo1gZLlCixDEU6qVatWttAXKeTYRk8ePDIdevWxYJgS3RHDIRrCbfWIZQZgUiMat26tcTXEiNDOH4dhgMefvjhZl999dU/MRBVZQU5PB3kprZt2w7Fy5/jNz7TV+YF40ypAbW70Xm+fkPhTKGl6TNP//79y82bN++drVu39mD8JQg2sW7dum3WrFnTbNmyZfMcooXTp8PQY0/ItkUOHDhwH6Z8GnOaw7FNif8mMK7Ili1bRrz22mtjgJGLb20u1H252rRp0/L777+fKaIVKlRoNUq+X44cOZaga6tv27btrXbt2tUHnkooMH1WNW2KUTMWDx/RQgGmSZ6+ffuWX758+Vg22DhPnjx78Z5bElR3ef/995ejxyRalnPFMWJrBccurFE23m2bTk5FAbUHEdpE6Vq1atV+WKzTBw8eTJg/f/7HQ4cOvYkxHlkuMzrIH2CbfaGk82EFnzt79mx29jT32Wefbb5r167hY8aMaUb4tfDIkSM3s4e6QUBk2GT18s0332wIhYETDmHCB0fbEjHTU9Ag79tvv13q66+//g8brI/e2Ii1iYfDFtPnRqlagqWARFSdOnWqN27cuMfdd9/dNyYmZjzcMJH3gU2aNHkWcWwIMfIwT4R0ASdS9cKFC4fDufGIwaY9e/Y0mjNnzjDBgrAa59uoxtoi5ax3dGVO9GxxLHVS+fLl3+nSpcvJe+65J0ejRo2u3HHHHTPlr6HQ644cObIow3XAQeEJli0inObZwncAp9l2i7j9trUhmk72oYceeh7PvBFicLRcuXK9Pvroo40MCocILpBLWblyZfZx48Y1QP91wA9qLWOggFlFugYj4cLEGycSzloLUpNr1669aMCAAYfEVVLecO4Xjz322IvffvvtLMZ2nTJlyl6mD+HRps1eqIMWkHSzZiqccUkD1q9fb2rWVrvWv4HahGPiGstRQYH5NSIBhsjAlwR508+7Slq/SegaM6lnz573wGmtRAhCjbfnzp27XsMcoqUyLu+wYcOGILafMK41RuIUvs44MhUJZcqU6QgXdOT7Sb4HwRU/sZnaGzdunPDpp59OJodWUVwFDBEn7MMPP1xJsD5UhEa8uj/99NN3Olsye3HeTeXMccHdx1Edv2BJc2zevLkn7fmGDx+eG5GtAfcmCNnIyMhVL774YiIT+QzOPf6w9e5PJA4gVfPU5m8c0s8x82zjXXfd9XGBAgW8KPLliI8Ut4hm2AmC5UEsxqkfEfYQM05p2bJlXUf/WBC++qmnnirXoEGDYbfeeutRkFXM9w1uTWV/mHqHqycIJvBG+yYHFzFz6HDqfRzQaQ7Ge+edd26rV6/eUurftAZrefE1ZcxUgjJJWldaH9JQs3Tp0p7o6OhFuCNGlSD+cejL87fddttuHPeCGs8B+QmzA4HKnHCfPn1iULoPYN4vgeRIXIXz9Em0Ukmr5ME6DiFH1Q2X5DQbbbd69eqOs2fP/kqn4xBXG7WPe8KECT+tWLGiH7qtERvbgFjfRQJyWO/evfMKpt0osOYCM5nwqbP24Gzrv7iOduPvzZgxY/Xtt9/eHq5eRCBeAeNwP0ahpDhEDwdZyoEhzg6pSKRtQQVc/bCN1OlPQRs0G2IDLUjV5GFDO6H2Ws2JjY01CCxYsKAdDmxPxCqFTT+3ZMmSmU5/hE4DQgiGFjSL0mYNSbh0JBycAFdBm18f/Pzzz7trrpxN1c2bN18D4Raz4VwcTAW1ZVDM3nVQqJBPiUQehfPF8W2qVKnSjT2vxE90ffPNN11wSZoAQ3vJ0FJnsIb0tcFFh5BZ8fWy+AQMghc98g9ngunD3yqIaOyUuUb0RmYGLLM+uPJR4HiBkwKx4pyxBrGGDRuOKFKkiLdmzZozURE5/Nf3hwmRMjJuEqd8cPdmDsHLOttZr6TmcvjB5phDkKgiDR6So/6iGouonksvqsGAiL3DGJiXuFKplFXOZgU8FeXemPTLLUq7sEgBlHEMkUAKJ+PmSdbDOJ2SHvk/UXBPuJQsfXpo8kaQGKyMHjpHAJ0bzo6nbRWnargOzvkejnchelXgGF2aGEtJbYrmY5nb1qhRoxGE+JJMxkLcpoO2XzXpoIrAy61IQu84wzMhXjzScJhuHZBZS2PTF3GX9eOwqlH0a7zX348LIJxEiseLh18NBKuBa4qI5xTFqW4MRkO88igRDge2ORuqia+koD+MBUW0ZIcAEg0RO4o+Ob0ao6yIF9g5mFMcH8wAx9o2JOQqxNhDPMqyfoEF20+Mm421dAAySlIBFlk38x/AkrcBVptDhw4lYEymwRn/B7deWLVq1Z1Y+mGIalk49zwqJZkDqkU9p0ePHvFjx449DDyjrwXbv7A//0+5VD4H2L8jPeGMTuKU6xDClGGhU4Qwp5wJwHR7YP9jShMB8AoI54CbbrUOo2otbBeHULod8q2nd/U54z0gnQSsKFyG/dQyPqYQBZwl9rwAJ5dD0Us/TXWIJqzkGiRjTJ7gUD+BsP8i7q0G11Zm7PP4gTDz0RIQKh8u0XcQrit6ujB4DMbNqQVR52HNm0+fPt36kYpSlEGRPgukWtp2xG1m3bTPtL+WcKYDwFH9+vXrghM5QEgiMtMGDRqkzIWKISrRwVAQWoJTKS7STZE4yDi7qtMXCJy+yXxDPLNJiOtGZHe//vrrSi+ZfWBNT6Pf1sOR5XG+X0eX5sQiv0u/2YPGYUzE3QvY3w44vwoEa8YTj4gXRa+50GuzOYC+06ZNS2ScC0Kfh4PfwiDV5KDm4Ce2dMTbl3ZiL7pkNfGq5qjAPJIas1fTkO6PUY5kONujGHV/6OX9wzfffLOExgk5Kvukm3rdPu3mTN25c+fcHNI47YU9XUFxt3VW8h9n9m13ADF6YGiSyOCMhAulG42+dvbvwunuU7ly5ST5eBi/tRxQMTtGNX5oC92YkcBYYEPCJ598shV6PpmD2PXGG29IncjwIFtpeshDXFmT0xoJy7twHFFzA7s9//zz+6QLdAoUnbaecMcy2blZrgVb8Hi0gOUms7FJkyadg5t6E3OOIXMchWsyFP1UQ+O0cWe8MUB8R+Do3koEESt9S3akNveto0grjQKvIYjmENyV0cePH28lCQGfVPzIWkjWR/T/h6u/QY8//vgoVE8/YJiQEQNokEaKkuE6395Y1xSJqlFC6ITe6IsCnMjH6BddSChGi0D2VfuXVCfxF4Cs/4AQ3yUiVxXg1UkijIlQ7rvvvst46wMhXFkMwUPo3mcZ1p5+zTOIUXvoL0S6awZcVkOHzKO6hq4NpU+lQhS3Wh1sVQrGow4HUsf2Q3Sjg5U0wGp7yVRr7nk4VmohIB9ndBwUrwf1Y2Up4bYZIpq4CgKlyG9bunRpB4h6B9bOA5uv4yRnw8I25Q3May4+osMNTdFNjTjpSNY/e8stt0yZPHnyVscYhHOfcZZwbSyKPw6DVR9xiyap8CvEkweghb0kQ7NjEIpJn2IMEtnnMZCVFRfi0sOWyFbtmHn6AzclM05jZP3lUl3GOk9xdKh0t7wFPQFpJUM48mylSGkXIXuxmPBqhQCKaOiZynjlUqj3soBRmmyyC2LUGFEeMHjw4F0M9RFB866l3H///T3Wrl07itAuEvFywTkuRKgV+uwf6JMZiGmS4JEW/5yD3Y0aqQiBGtD0PkQTZxri6UA1Dod9H2msFrgku+C+SHAyIob19YKbC+7yEVDjVYhgTE3G2Kt+LLAHsbX3DeLU7BBUhAsQV0M4bVinxaRt/KxAzqYhBs7u0yIaJ5CIaR/PmLxYue6wcDy3V8cB2BOAMpshEw9kzZVe06ZNY/ABXxanEdiPRzxWQJgOiE9TxPLfONbLgHtASpq0/CXW/5zDq4hTXNJg6vdHXMVnFPUeOGW7s6cAp9lveKiv0qOyssIPVI2B9M1Vp4hmToKTsfrM+/LLLxfmxB7EtJ8iHn2U7Oxw0kH94cjOMve//fZbhcWLFxvC+6CF8ALhzChcnypwWjGs23xcoBeBPfuZZ55JKF269EYIWAxXpK4G4moYboJjNumbKCDomiAoPFIRcXn6NosjvLLyCIThMA4rCaKZPajRFkM4Tsp8s65JpegD8Q2HcB5E6Dj+kPXlXKS6t+JMXqQvFW4JYF8LNJNaSCgCicDNiEGv6L51s3NFGInuPAjR1sLNulW3+TgDDkWfg3kZghYsFQ7fvDiGRxOy8hhY+gNcXxLTPx9nCSdkdJo2oHYR/3khWhhiXAbu6Ex/pNJJiO+TcMoN6IRwxCdjTHxLB7xovPRFCnA3ycqh0+K4CFKeK3nIkCFFIVod/RQB+LudmVLy+rlCE1k9CH45ACIfHKJpEtdd76K1LUz/WNUQTg4mCtaFH3MPSOTXQJA4Qhj0Gd52OIp5GOZ5CTm1RbgE/dWPIl7AvYIx03yGTEArqui1rcA4DGfXwwAtxNmdQxZ4EXFndYizhb6lWkeFvRRHGmpw+hcQ2ZVprS5rVV0yLH8E0Zx1glaGcCQPv+SyeCuXyzFc1bXUSDbiwUL1gqgT2HAunOM43IbaiEISSA0gcflmUIi/0wjhjCjhtW9Fd/YA1ma4ryZGpwUuT1UM1H5Uwz9R8gr4jeog3IpHGoow9gd04jYtYQ/gd5a7Ht3GOAiQv6gaRctFy1Gs3DxOuwoWbQBx3Q42voZrtiuIZk/iSN1bNiXGOwMXzp86deoWZ0di45C5zZljKodb52IQ1uDiPI4YVgX+Rtpn4eocYJBgJ/N7jjLcZvVEZFwYjqkYkjMC4ByAOXh9/1EF/W8jm4AlRDiDPFnZCTiZd+3cubMR4jgR36nXBx98sNRBcCUbX8NYXVyIY9KsSRrRfDogAHJoH2EczjGGvskNfw65HVx625lKwZeHaNOxsISQZT/GVXqX60T1Z/nALPBQa8dgmgNKr+PEMdIXBwm3EghmF+JqlMMB/jguLq4fdwJVIJriVeXZ0kxXWhJQLKzv/+Wx7o9LRAOWKdyuldNPLVAby/HbYtCHG0g6DCUE03ghkSUuT4N+bX/BWWv5LKudbX0i+4OXvYQ0CcjyGa7X2qO4hxLD9ucnCwvwxrfg0ygkURrJi2jJ0gHXpJZMHCgr+XtFczVP4+RCANMkQZWmQsdGEojfvGjRonj0XlH6lIGeRPg3yklvaZ49vIClgGkim4DG6/ABTik8hnDodx9ESzifziAOPIA4dCO4Xkp48y8sbVmUdnvq9hJ3u0HVIpSCZ7VDQBN9WOLpW0XjVPStd9UagwiYubLmKs4vmgwx1YZR+hrrOp3btHfgPA3JUDz/SHeEw1X63/zWD79V+zDFRzjn24PIhvHrH/2Abjoi48Z6joGAebC6O+GyOQA6DqEU2z4Fh+Qm1juBUp8GhyRClAidjgMroKJdHOqBQM3ZwL0E9MlYyS94X8G8VKIRWdU6jPGiVyfjDL/AlaT+YUOHasK0AIB+H3JHdBg6lOtd2I5iVen0oHgFrOfkyVxkRvLrmo3HS5Kwlf8gYshFJPy8JP/mAzj9AfgPDXjHxXkITvIyfz1JApNI1IAXXnihMa7G6ejoaC/vzZ1JQS2aH0CjG8iplcCNOYbTvs7eijk4qP+aHx0U84wB7NSpUxu4PxUX6b8SmX77SHu1eTLi1RNwxH4II0/e3iIZgIiaZN9F/2ectJS22jPbpCXuJek2nvOO26E5uqC5CCfrl49K35iUFcir63dPWhyncczPzpwr+nDSUlkyXBBO82T89CNqBQQSV09QHadBwQqbckMcF27K/UxeJ7EiE1uLHF1l3pMxJFs1j8VkYIIqbqdfY1xwVBIpn4vcW9QByaYguED9+I/1sKAFgHkIA2Fg2gNUf2YFQodBtMv4mtGkqp4ifb5DbagQr3SwLTI2wYr/GP9+DjMfjn9zYCkGDrgezEwpGGWMm9CLW/vRBPbnYdcF1MfJW8USRVRCR61JSEhohhifYMEMlbezGdPPL5HyE/NO5ucPTSDij6VLl14CsZSuagFBb6StH77b8BDgCay4VfmzYrhPmyBcYSVjVcS5KpIW4Pse0xjkj8ZIElTsO4fhQo8bI8a+tnOVcB8p+BPAZHTGxUcI9NEgnOOBCr4FVCKKsdhOtrUVP/NSMtMgkDEoX49FtBKuztu4OnUFT8jpIe83ES7sw32BRDVUmOLkMH6G0Q3DU4XHqg3foqG8aB/+xdmT/mnEA+eFc+P3BT/9mGXHBI62rVdrQzyAhJGVjSVezAdbu5UtxSn9duLEib8xNGQEHbAGpv4PC/GPIcyLYtPhpJeOoORXczF9zYmDq9v9a71lRlwRLSslM5hZgac5fwRM/70EwP9/iRw7FmvBJvsAAAAASUVORK5CYII=) top center no-repeat; }',
        '.serv-outdoor { width: 73px; height: 50px; display: inline-block; background: transparent url(data:image/png;base64,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) top center no-repeat; }',
        '.serv-parking { width: 46px; height: 50px; display: inline-block; background: transparent url(data:image/png;base64,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) top center no-repeat; }',
        '.serv-reservations { width: 55px; height: 50px; display: inline-block; background: transparent url(data:image/png;base64,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) top center no-repeat; }',
        '.serv-restrooms { width: 49px; height: 50px; display: inline-block; background: transparent url(data:image/png;base64,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) top center no-repeat; }',
        '.serv-takeaway { width: 34px; height: 50px; display: inline-block; background: transparent url(data:image/png;base64,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) top center no-repeat; }',
        '.serv-valet { width: 50px; height: 50px; display: inline-block; background: transparent url(data:image/png;base64,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) top center no-repeat; }',
        '.serv-wheelchair { width: 50px; height: 50px; display: inline-block; background: transparent url(data:image/png;base64,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) top center no-repeat; }',
        '.serv-wifi { width: 67px; height: 50px; display: inline-block; background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEMAAAAyCAYAAAAHtGYXAAAD8GlDQ1BJQ0MgUHJvZmlsZQAAOI2NVd1v21QUP4lvXKQWP6Cxjg4Vi69VU1u5GxqtxgZJk6XpQhq5zdgqpMl1bhpT1za2021Vn/YCbwz4A4CyBx6QeEIaDMT2su0BtElTQRXVJKQ9dNpAaJP2gqpwrq9Tu13GuJGvfznndz7v0TVAx1ea45hJGWDe8l01n5GPn5iWO1YhCc9BJ/RAp6Z7TrpcLgIuxoVH1sNfIcHeNwfa6/9zdVappwMknkJsVz19HvFpgJSpO64PIN5G+fAp30Hc8TziHS4miFhheJbjLMMzHB8POFPqKGKWi6TXtSriJcT9MzH5bAzzHIK1I08t6hq6zHpRdu2aYdJYuk9Q/881bzZa8Xrx6fLmJo/iu4/VXnfH1BB/rmu5ScQvI77m+BkmfxXxvcZcJY14L0DymZp7pML5yTcW61PvIN6JuGr4halQvmjNlCa4bXJ5zj6qhpxrujeKPYMXEd+q00KR5yNAlWZzrF+Ie+uNsdC/MO4tTOZafhbroyXuR3Df08bLiHsQf+ja6gTPWVimZl7l/oUrjl8OcxDWLbNU5D6JRL2gxkDu16fGuC054OMhclsyXTOOFEL+kmMGs4i5kfNuQ62EnBuam8tzP+Q+tSqhz9SuqpZlvR1EfBiOJTSgYMMM7jpYsAEyqJCHDL4dcFFTAwNMlFDUUpQYiadhDmXteeWAw3HEmA2s15k1RmnP4RHuhBybdBOF7MfnICmSQ2SYjIBM3iRvkcMki9IRcnDTthyLz2Ld2fTzPjTQK+Mdg8y5nkZfFO+se9LQr3/09xZr+5GcaSufeAfAww60mAPx+q8u/bAr8rFCLrx7s+vqEkw8qb+p26n11Aruq6m1iJH6PbWGv1VIY25mkNE8PkaQhxfLIF7DZXx80HD/A3l2jLclYs061xNpWCfoB6WHJTjbH0mV35Q/lRXlC+W8cndbl9t2SfhU+Fb4UfhO+F74GWThknBZ+Em4InwjXIyd1ePnY/Psg3pb1TJNu15TMKWMtFt6ScpKL0ivSMXIn9QtDUlj0h7U7N48t3i8eC0GnMC91dX2sTivgloDTgUVeEGHLTizbf5Da9JLhkhh29QOs1luMcScmBXTIIt7xRFxSBxnuJWfuAd1I7jntkyd/pgKaIwVr3MgmDo2q8x6IdB5QH162mcX7ajtnHGN2bov71OU1+U0fqqoXLD0wX5ZM005UHmySz3qLtDqILDvIL+iH6jB9y2x83ok898GOPQX3lk3Itl0A+BrD6D7tUjWh3fis58BXDigN9yF8M5PJH4B8Gr79/F/XRm8m241mw/wvur4BGDj42bzn+Vmc+NL9L8GcMn8F1kAcXgSteGGAAAACXBIWXMAABcSAAAXEgFnn9JSAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAAMAElEQVRoBdWafWzVVxnHb18pLW2BFkqEuVI3XjIYc7rhcEuGBAU3QRbmG9G4GU34QzOzhJhFkZBFjSS+xGXq3sxi1InZdGyoDGUsIhUIClOIMjIqY8zSN/pOS9vr53t6nl9Ob2/vvdze8nKSp+f8znnO8/I9zzm/59xf82ITV/IRnQcNjqGigv5KqCBhPM5zP3QOSjZXclXEJ8pZkbG5LGboUILQyVOnTp3X29t7B/2F8Xh8OvWyyZMn31hQUFBy8eJFuuIx2qJ4f39/W19f39HCwsLXh4aGeunrKS0t3dfc3HyKeRcD2Qa49I0bmFyBkQyEm6dMmbKwqKhozcDAwA04dPvg4GCMdiwvb1htfn5+DIdjqkU47sbFJ3CsFBcXqynE6ql3tbe376+pqTnU2NjYbTzUirBxgTJeMASCrDbLry8vL/8Uq7oIEJbj4Gw5KyehE4BwuqOj43mAaWJOHrVFg6sFAlERU61x6qGSkpL5kyZNug8QawBljmSpUL+GnoOM7ejs7NznOof/mE9mUzCUumkTU3ONHtU8AeGsrqysnMuqPQg9IAC88wrv/Tz/AicOnzt37iz8vVC4mjxmVHS2lFVXV8+/cOHCGoAW4LMUTZ52s9V+1d3d/SJ8rV6iIiXZmeOHR1fZgBEpYdVqEfkgqyMQ5vgVrQeUJ1mtQ4wdhxLPD9tSDKUtsk8rPEIGeusA5T2cOeuIvFWAPlfbj0U4AvA/OH/+/LOBZOkbMT8Yy7opw+zkL2R1vsCWeAuKl5WVxYmOgxySy+EpTNCgOSIZJRnZFM3TfJMTyQCQ2djwNc6nk9gQx4b4tGnTXsa+JRHT8NzgcXzNaDWnT59+Hc5v53QXAPGKior9rManET8lUCH+aE7Qn6tmMvk1gPIw1CBAsKsLUL6DwhKvVEBmuxiR3RKiUgb6G1HUrmiAWgnXL9GvfMFKThSasAxqi5gIeEC4ARB+Si0b49i8j+hZFsiKeIO+jJoGxGwEbpdwIkMR8WvCcGkg4XKDEKiOmnLS7I0RuWuUmwgU7G2kvTbizCJq3d5n9ecSDYe0Jdgeb4P6I4HQqwGEwBzXDEEpx/aXtG2IENn/NBwWyRFwiQISn+0QrCUajvpoOMHZcHPAmLGwYI6aYWjLcDNe8uxZ9Xj3t/lQTlT/CCD6BQqLuQPZZZBKWh9MyPWg+S9tDULtAPWC4flOwKUYGjp/KfOkTvzhfG9CxpVAdYVtci9+tHhAfk+ncheVCJBE4wTEAFQLEDvIHRbz7t7b1dX1AH0NkCZmmsiYE6P4WZ3FZJqzyEsGyEl0MC8hO+3n7nGEbTlI3pDHtjx69uzZZvSFxWQqb8g0wxQgLs8gOlbgkzLgSvzaRTa8nrEuyPGEYJijioiXMG4xicxOLldfgflNyMZppiySKbJER6+2OazIWhIl3VXmkyjd6bNUd0/RXUWkPsBxqTlzGsgoXyXEL+DAbhKpv9H3DmQlctI6UtSyR/YPECGrseE52hXofAG5n6OtrNjfmLyjrEotjNpTizHqL0TEBtpvQZkCEfIVA+rHcGQjoN6G3Ao5SjT0AcZ/IV28WgD7AEa1A0QePNIv3aXMmUGt+4hd3t6R8fD9rKen5zA2qdg2MOCHe8f+6+wj6lYi55dESDX2Pdra2voNprjjwQTO5KA8QAjrjJCyOi9TAtIVyTA5RazmeoDYozeQ5HHeNAP0TmrlJQuhtDIJ6VkA8wFkbCPd38vcfr0mqUVPIuMmyIpFoz2nqp1uIuQe5Aygp4OFWWETJCiGsVu8olMw2FsjrdFMNRBiOL4aEF5BkQBVanwC2hzIM51hbUCqdrYEtfGBx6SVyP8x8s/ITmS2o+OHRE4iKDZnrNp0xFi078tO6Dz0ETeBxgZ1okiH0se9FHurjCVU/Q4sDKsBgM3I6Fc0oOQk4G5mfEbCZHM8MihhPHwUj+Qn8r6LldwEII165WPzaXQp4qxEi2MdSWrjmVZVVfWibEbObx0fq+e2BwOPBRMTjQiGXNPAmsX8fZALYQQrsZkXMIsvXPVgKOOmbDEg3SSAvx1drylKpJvnrYE0czboGtU0nnIWcyWj+vUtpnC5E2Q+QXOS6xi9Gr47qkyQLkf1OhcwrAEZd0cc4wcgEDWiKd2mX6/gR6ABRTYR8gxjdZ473WKKzeT4KaMdTyfEbQ1AWIDz/5QRhOspDLo1MGKUkkhb7hqhjs+wuo3Yo7PkIAfvLV5NyDOWZvk7Yjtq0oiOMWba1riFaPqPX41d8C72/BpPB+YYorPqDp1dChh/lU0ctn9Amtka8mSlJNkkEzoL9A9pFVD6AoyW1tp4srkT2SfwTfcMDvJ6nSPUjwZKc7pAJkxnhDssAeQAyuq8Qrd1AuWZNM0JzZUzImubvkzkGE+Rb3wQ25oECAu2xfdlI8/kjqgjQaD9mJRwep+ibWfEpQARAjBCSZIHAyfSn4QnsUtzVD7LdhnSWwY77xnuckD7ZvIqE0ecMaCst823oVZS6LX8Oq0sVfNHXcToSyySoT2stFm5jKiEbx/vJmeoI/X+KFvuVg7hYs6iPOT3Ma4Lo13G5KS1aaYtryNniNR/OZw38sv5TuoOKCWwKQf9ZBlRChj/4JSeh+Gb+OV7G31yTganK3LE7g5Kwm7i7XMXBq4EiDu4fxTSjr6f8NzJHeQItW7Lu9GnC5q+ogl4A5PmmMX0FWHzLmQtZ+G+yS15KzNsLOnkTMHIZ9Uex/iSlpaWjUjS9w/NTbdakXJykXtZ8YcAdAUGOudx9AzPbVyaBunLA4AC+ipJsa+jlsFD9L0CWN/lxvuqOiiRzOHHpH8dj7Yy8n8CGE8x/4l0c9OBkVQTnZcCxEL27yZuiJ9XBFD+jYNPAe6Btra2BgDS9VnFbClmbBEArQefT1JPpe5n/hNct7fA1wJluj1hjelgFf8FPeS6mNGp5Eq5u7hx4J7kdNfttQdQ9NtIdaqJ4RgRsoizZBvh3qvDkPrPjE/1PE5HyJ+knYmtSaal75LgTIQ7HhxfxdlwXk4Ahn6UrQ1UyBGdOQrnZKTxSBeRshJ6AzAEyB7Ghu8Rw3N5TFkytTulkGwG5VgMgz8EEB0CAnqerslemJx0PP45XSVeA2Uhb4j9Pn/YS79F2KXIS6cvZ+Nm1HQOLpcWEx1/QroBoUjIpggM2xJLAPoYUaIIsRu2gZWN7Amb4wwmEh6SsQCi/7x5r9eWLRChsU4+kXEX1AwYfehY7RlsIUL+K9Y2Y2Zi5HEiQj/wPOytsVVNNE4rqnnJKJHXnp0s5G/x0fF3Bir84FUTIQ4MRYX2NG+AvRg4LYWR6QyXvGQ8Tg+/W9QB+mmBTn2/1+PGfDurKhfhK6OVGRaQR6wiMdO/Jv2ORKdNfVBiui6jXUZK7rCOHGIuv1CXkGQN8HyRiKrne4ayThXJDhM7zcsngXoTEJ4lX/k6Waq9WZKBJxkZl1yAYcqG8Aff8t7me8fPfWfoiLoMuBiv2+/B+1V1Aob7ZsKzHjvYAt/i/7Yep90JJQIiHmWwz1BVAfwxy1bdwFXyR989luLkEm9P4kpFzwLCvyK7aW8jGtZB9wOCvvS7n/BIuLaOIUfdkSzPc81Vbk/zBtiovU79Pzy4L9ELzoMNbAHlJ/r5/jY/nuw8ECBXNSgyeizD5Vc+Th6Ws9CX1UERv84W27L5gLBDbwtIPxmo2Njw0wT9TWb4eFTpgHOHYzIh/LdeDefCArZTF1fqPZ5Hq6tDVtdUOT3EebBd5wgH5Pt4FlAam/AoyDUY2Jy0OEd4C1RxC8XPfDlvusND1rU5R94QGBT9n5hlsHqe0GIGTagShDsnOSQbcLKHV3Apq29OauVVBJizh9flMkDTl/kz9HX5sRA0unJfLhcYzvKmpqYugNB9hZ1SpOu8PlrpRw7bAmrP5Oe6LwoM6I88q1xWO4dVTuxf5xAgvJ/Ds4mtoE+Cz/EqrTK1fN5cyvPLvGn0qbKe/lRZrE27ZmsHCInShwGkm2u+nD4GQNvJK/SbRw+kz4TH8XCF99Ki5pp1OpXhDhCcvhsw9hMhLZwlvVAn7WZep79h8uwrAcSVQl2A2Cu4lnYppNenPhGchnRYyrYJPzTREZX/AwdlnJJulTNcAAAAAElFTkSuQmCC) top center no-repeat; }'
    ];


    for (var cssix=0; cssix<cssServButts.length; cssix++) {
        insertCss(cssServButts[cssix]);
    }

    // LZ Compressor
    // Copyright (c) 2013 Pieroxy <[email protected]>
    // This work is free. You can redistribute it and/or modify it
    // under the terms of the WTFPL, Version 2
    // LZ-based compression algorithm, version 1.4.4
    var LZString = (function() {
        // private property
        var f = String.fromCharCode;
        var keyStrBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
        var keyStrUriSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$";
        var baseReverseDic = {};

        function getBaseValue(alphabet, character) {
            if (!baseReverseDic[alphabet]) {
                baseReverseDic[alphabet] = {};
                for (var i = 0; i < alphabet.length; i++) {
                    baseReverseDic[alphabet][alphabet.charAt(i)] = i;
                }
            }
            return baseReverseDic[alphabet][character];
        }
        var LZString = {
            compressToBase64: function(input) {
                if (input === null) return "";
                var res = LZString._compress(input, 6, function(a) {
                    return keyStrBase64.charAt(a);
                });
                switch (res.length % 4) { // To produce valid Base64
                    default: // When could this happen ?
                    case 0:
                        return res;
                    case 1:
                        return res + "===";
                    case 2:
                        return res + "==";
                    case 3:
                        return res + "=";
                }
            },
            decompressFromBase64: function(input) {
                if (input === null) return "";
                if (input === "") return null;
                return LZString._decompress(input.length, 32, function(index) {
                    return getBaseValue(keyStrBase64, input.charAt(index));
                });
            },
            compressToUTF16: function(input) {
                if (input === null) return "";
                return LZString._compress(input, 15, function(a) {
                    return f(a + 32);
                }) + " ";
            },
            decompressFromUTF16: function(compressed) {
                if (compressed === null) return "";
                if (compressed === "") return null;
                return LZString._decompress(compressed.length, 16384, function(index) {
                    return compressed.charCodeAt(index) - 32;
                });
            },

            compress: function(uncompressed) {
                return LZString._compress(uncompressed, 16, function(a) {
                    return f(a);
                });
            },
            _compress: function(uncompressed, bitsPerChar, getCharFromInt) {
                if (uncompressed === null) return "";
                var i, value,
                    context_dictionary = {},
                    context_dictionaryToCreate = {},
                    context_c = "",
                    context_wc = "",
                    context_w = "",
                    context_enlargeIn = 2, // Compensate for the first entry which should not count
                    context_dictSize = 3,
                    context_numBits = 2,
                    context_data = [],
                    context_data_val = 0,
                    context_data_position = 0,
                    ii;
                for (ii = 0; ii < uncompressed.length; ii += 1) {
                    context_c = uncompressed.charAt(ii);
                    if (!Object.prototype.hasOwnProperty.call(context_dictionary, context_c)) {
                        context_dictionary[context_c] = context_dictSize++;
                        context_dictionaryToCreate[context_c] = true;
                    }
                    context_wc = context_w + context_c;
                    if (Object.prototype.hasOwnProperty.call(context_dictionary, context_wc)) {
                        context_w = context_wc;
                    } else {
                        if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {
                            if (context_w.charCodeAt(0) < 256) {
                                for (i = 0; i < context_numBits; i++) {
                                    context_data_val = (context_data_val << 1);
                                    if (context_data_position === bitsPerChar - 1) {
                                        context_data_position = 0;
                                        context_data.push(getCharFromInt(context_data_val));
                                        context_data_val = 0;
                                    } else {
                                        context_data_position++;
                                    }
                                }
                                value = context_w.charCodeAt(0);
                                for (i = 0; i < 8; i++) {
                                    context_data_val = (context_data_val << 1) | (value & 1);
                                    if (context_data_position === bitsPerChar - 1) {
                                        context_data_position = 0;
                                        context_data.push(getCharFromInt(context_data_val));
                                        context_data_val = 0;
                                    } else {
                                        context_data_position++;
                                    }
                                    value = value >> 1;
                                }
                            } else {
                                value = 1;
                                for (i = 0; i < context_numBits; i++) {
                                    context_data_val = (context_data_val << 1) | value;
                                    if (context_data_position === bitsPerChar - 1) {
                                        context_data_position = 0;
                                        context_data.push(getCharFromInt(context_data_val));
                                        context_data_val = 0;
                                    } else {
                                        context_data_position++;
                                    }
                                    value = 0;
                                }
                                value = context_w.charCodeAt(0);
                                for (i = 0; i < 16; i++) {
                                    context_data_val = (context_data_val << 1) | (value & 1);
                                    if (context_data_position === bitsPerChar - 1) {
                                        context_data_position = 0;
                                        context_data.push(getCharFromInt(context_data_val));
                                        context_data_val = 0;
                                    } else {
                                        context_data_position++;
                                    }
                                    value = value >> 1;
                                }
                            }
                            context_enlargeIn--;
                            if (context_enlargeIn === 0) {
                                context_enlargeIn = Math.pow(2, context_numBits);
                                context_numBits++;
                            }
                            delete context_dictionaryToCreate[context_w];
                        } else {
                            value = context_dictionary[context_w];
                            for (i = 0; i < context_numBits; i++) {
                                context_data_val = (context_data_val << 1) | (value & 1);
                                if (context_data_position === bitsPerChar - 1) {
                                    context_data_position = 0;
                                    context_data.push(getCharFromInt(context_data_val));
                                    context_data_val = 0;
                                } else {
                                    context_data_position++;
                                }
                                value = value >> 1;
                            }
                        }
                        context_enlargeIn--;
                        if (context_enlargeIn === 0) {
                            context_enlargeIn = Math.pow(2, context_numBits);
                            context_numBits++;
                        }
                        // Add wc to the dictionary.
                        context_dictionary[context_wc] = context_dictSize++;
                        context_w = String(context_c);
                    }
                }
                // Output the code for w.
                if (context_w !== "") {
                    if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {
                        if (context_w.charCodeAt(0) < 256) {
                            for (i = 0; i < context_numBits; i++) {
                                context_data_val = (context_data_val << 1);
                                if (context_data_position === bitsPerChar - 1) {
                                    context_data_position = 0;
                                    context_data.push(getCharFromInt(context_data_val));
                                    context_data_val = 0;
                                } else {
                                    context_data_position++;
                                }
                            }
                            value = context_w.charCodeAt(0);
                            for (i = 0; i < 8; i++) {
                                context_data_val = (context_data_val << 1) | (value & 1);
                                if (context_data_position === bitsPerChar - 1) {
                                    context_data_position = 0;
                                    context_data.push(getCharFromInt(context_data_val));
                                    context_data_val = 0;
                                } else {
                                    context_data_position++;
                                }
                                value = value >> 1;
                            }
                        } else {
                            value = 1;
                            for (i = 0; i < context_numBits; i++) {
                                context_data_val = (context_data_val << 1) | value;
                                if (context_data_position === bitsPerChar - 1) {
                                    context_data_position = 0;
                                    context_data.push(getCharFromInt(context_data_val));
                                    context_data_val = 0;
                                } else {
                                    context_data_position++;
                                }
                                value = 0;
                            }
                            value = context_w.charCodeAt(0);
                            for (i = 0; i < 16; i++) {
                                context_data_val = (context_data_val << 1) | (value & 1);
                                if (context_data_position === bitsPerChar - 1) {
                                    context_data_position = 0;
                                    context_data.push(getCharFromInt(context_data_val));
                                    context_data_val = 0;
                                } else {
                                    context_data_position++;
                                }
                                value = value >> 1;
                            }
                        }
                        context_enlargeIn--;
                        if (context_enlargeIn === 0) {
                            context_enlargeIn = Math.pow(2, context_numBits);
                            context_numBits++;
                        }
                        delete context_dictionaryToCreate[context_w];
                    } else {
                        value = context_dictionary[context_w];
                        for (i = 0; i < context_numBits; i++) {
                            context_data_val = (context_data_val << 1) | (value & 1);
                            if (context_data_position === bitsPerChar - 1) {
                                context_data_position = 0;
                                context_data.push(getCharFromInt(context_data_val));
                                context_data_val = 0;
                            } else {
                                context_data_position++;
                            }
                            value = value >> 1;
                        }
                    }
                    context_enlargeIn--;
                    if (context_enlargeIn === 0) {
                        context_enlargeIn = Math.pow(2, context_numBits);
                        context_numBits++;
                    }
                }
                // Mark the end of the stream
                value = 2;
                for (i = 0; i < context_numBits; i++) {
                    context_data_val = (context_data_val << 1) | (value & 1);
                    if (context_data_position === bitsPerChar - 1) {
                        context_data_position = 0;
                        context_data.push(getCharFromInt(context_data_val));
                        context_data_val = 0;
                    } else {
                        context_data_position++;
                    }
                    value = value >> 1;
                }
                // Flush the last char
                while (true) {
                    context_data_val = (context_data_val << 1);
                    if (context_data_position === bitsPerChar - 1) {
                        context_data.push(getCharFromInt(context_data_val));
                        break;
                    } else context_data_position++;
                }
                return context_data.join('');
            },
            decompress: function(compressed) {
                if (compressed === null) return "";
                if (compressed === "") return null;
                return LZString._decompress(compressed.length, 32768, function(index) {
                    return compressed.charCodeAt(index);
                });
            },
            _decompress: function(length, resetValue, getNextValue) {
                var dictionary = [],
                    next,
                    enlargeIn = 4,
                    dictSize = 4,
                    numBits = 3,
                    entry = "",
                    result = [],
                    i,
                    w,
                    bits, resb, maxpower, power,
                    c,
                    data = {
                        val: getNextValue(0),
                        position: resetValue,
                        index: 1
                    };
                for (i = 0; i < 3; i += 1) {
                    dictionary[i] = i;
                }
                bits = 0;
                maxpower = Math.pow(2, 2);
                power = 1;
                while (power !== maxpower) {
                    resb = data.val & data.position;
                    data.position >>= 1;
                    if (data.position === 0) {
                        data.position = resetValue;
                        data.val = getNextValue(data.index++);
                    }
                    bits |= (resb > 0 ? 1 : 0) * power;
                    power <<= 1;
                }
                switch (next = bits) {
                    case 0:
                        bits = 0;
                        maxpower = Math.pow(2, 8);
                        power = 1;
                        while (power !== maxpower) {
                            resb = data.val & data.position;
                            data.position >>= 1;
                            if (data.position === 0) {
                                data.position = resetValue;
                                data.val = getNextValue(data.index++);
                            }
                            bits |= (resb > 0 ? 1 : 0) * power;
                            power <<= 1;
                        }
                        c = f(bits);
                        break;
                    case 1:
                        bits = 0;
                        maxpower = Math.pow(2, 16);
                        power = 1;
                        while (power !== maxpower) {
                            resb = data.val & data.position;
                            data.position >>= 1;
                            if (data.position === 0) {
                                data.position = resetValue;
                                data.val = getNextValue(data.index++);
                            }
                            bits |= (resb > 0 ? 1 : 0) * power;
                            power <<= 1;
                        }
                        c = f(bits);
                        break;
                    case 2:
                        return "";
                }
                dictionary[3] = c;
                w = c;
                result.push(c);
                while (true) {
                    if (data.index > length) {
                        return "";
                    }
                    bits = 0;
                    maxpower = Math.pow(2, numBits);
                    power = 1;
                    while (power !== maxpower) {
                        resb = data.val & data.position;
                        data.position >>= 1;
                        if (data.position === 0) {
                            data.position = resetValue;
                            data.val = getNextValue(data.index++);
                        }
                        bits |= (resb > 0 ? 1 : 0) * power;
                        power <<= 1;
                    }
                    switch (c = bits) {
                        case 0:
                            bits = 0;
                            maxpower = Math.pow(2, 8);
                            power = 1;
                            while (power !== maxpower) {
                                resb = data.val & data.position;
                                data.position >>= 1;
                                if (data.position === 0) {
                                    data.position = resetValue;
                                    data.val = getNextValue(data.index++);
                                }
                                bits |= (resb > 0 ? 1 : 0) * power;
                                power <<= 1;
                            }
                            dictionary[dictSize++] = f(bits);
                            c = dictSize - 1;
                            enlargeIn--;
                            break;
                        case 1:
                            bits = 0;
                            maxpower = Math.pow(2, 16);
                            power = 1;
                            while (power !== maxpower) {
                                resb = data.val & data.position;
                                data.position >>= 1;
                                if (data.position === 0) {
                                    data.position = resetValue;
                                    data.val = getNextValue(data.index++);
                                }
                                bits |= (resb > 0 ? 1 : 0) * power;
                                power <<= 1;
                            }
                            dictionary[dictSize++] = f(bits);
                            c = dictSize - 1;
                            enlargeIn--;
                            break;
                        case 2:
                            return result.join('');
                    }
                    if (enlargeIn === 0) {
                        enlargeIn = Math.pow(2, numBits);
                        numBits++;
                    }
                    if (dictionary[c]) {
                        entry = dictionary[c];
                    } else {
                        if (c === dictSize) {
                            entry = w + w.charAt(0);
                        } else {
                            return null;
                        }
                    }
                    result.push(entry);
                    // Add w+entry[0] to the dictionary.
                    dictionary[dictSize++] = w + entry.charAt(0);
                    enlargeIn--;
                    w = entry;
                    if (enlargeIn === 0) {
                        enlargeIn = Math.pow(2, numBits);
                        numBits++;
                    }
                }
            }
        };
        return LZString;
    })();
    if (typeof define === 'function' && define.amd) {
        define(function() {
            return LZString;
        });
    } else if (typeof module !== 'undefined' && module !== null) {
        module.exports = LZString;
    }

})();