- /* global $ */
- /* global I18n */
- /* global W */
-
- // ==UserScript==
- // @name Restriction Manager
- // @version 1.6
- // @description Save, and load, restrictions from local storage.
- // @namespace mailto:waze.kjg53@gmail.com
- // @include https://www.waze.com/editor
- // @include https://www.waze.com/editor*
- // @include https://www.waze.com/*/editor*
- // @include https://beta.waze.com/*
- // @exclude https://www.waze.com/user/*
- // @exclude https://www.waze.com/*/user/*
- // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAjCAIAAABzZz93AAAABnRSTlMA/wD/AP83WBt9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABV0lEQVRIiWP8//8/A70ACxl6vm6JgjC4fZaRpJGRVJ/BbYID4q1kotAmkgBpllHoAhIso9BbJFiG3yYi3UFyarx39rRewx0IO6nBZ5IxL/F6ifIZisOffoAzrzzFrub/v7/kW0YqYGRiJtMy4tMFQZUELKM8BZJgGSZQkhbAI4vfcfgsI+gtHWksSRGPLpokEJItoyS2cOnFbhl10wUByygHWJ2LxTIC3pLiMyPXBeiWkRKAIupS+KQxjaJtakSzjwmPHA7AqwNlCKiSaDdKG4RGiRDeSEH4jEY2IQMmkm16fjOvdDmP73Ie391TnxOlA244yQnk3ulH825AmG/K1z0jSS8TA4kBeOfxG5IsgACIFST7TEVWhAzLIID0+sxULkkDwhTpDMKbqzEA4////+mQDhkYGLh9ljExkN4/IM8mhoGpPGnqObjh6F0m6sYfmh9I7p9RAgAFyXyizju5WQAAAABJRU5ErkJggg==
- // @resource jqUI_CSS https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css
- // @grant none
- // @copyright 2018, kjg53
- // @author kjg53
- // @license MIT
- // ==/UserScript==
-
-
- (function() {
- var initialized = false;
- var lsPrefix = "rtmgr:";
-
- // Map the css class used to identify the three restriction blocks to the direction constants used in the data.
- var classToDirection={"forward-restrictions-summary": "FWD",
- "reverse-restrictions-summary": "REV",
- "bidi-restrictions-summary": "BOTH"};
-
- // Convert the segment's default type to the driving modality that implied the type. Creating a Toll Free restriction
- // implies that the segment is otherwise (i.e. defaults) to tolled which is what is then stored in the model.
- // Finding the tolled default thereby implies that the current restriction is specifying a toll free rule.
- var defaultType2drivingModality = {"TOLL": "DRIVING_TOLL_FREE",
- "FREE":"DRIVING_BLOCKED",
- "BLOCKED":"DRIVING_ALLOWED"};
-
- // Map the single bit constants used in the weekdays property to the integer numbers encoded in each week days HTML display.
- var weekdayBit2Idx = {
- 1:1,
- 2:2,
- 4:3,
- 8:4,
- 16:5,
- 32:6,
- 64:0
- };
-
- var clipboardTarget = "*Clipboard*";
-
- // Get a sorted list of saved restrictions found in local storage.
- function allSavedRestrictions() {
- var all = [];
- for(var i = 0; i < localStorage.length; i++) {
- var key = localStorage.key(i);
-
- if (key.indexOf(lsPrefix) == 0) {
- key = key.substring(lsPrefix.length);
-
- all.push(key);
- }
- }
- all.sort();
-
- return all;
- }
-
- function extractRestrictions() {
- var extracted = {};
- for(var i = 0; i < localStorage.length; i++) {
- var key = localStorage.key(i);
-
- if (key.indexOf(lsPrefix) == 0) {
- var name = key.substring(lsPrefix.length);
-
- extracted[name] = localStorage.getItem(key);
- }
- }
-
- return extracted;
- }
-
- // Convert list of saved restrictions into a string of HTML option elements.
- function allSavedRestrictionAsOptions() {
- var all = allSavedRestrictions();
- return all.length == 0 ? "" : "<option selected></option><option>" + all.join("</option><option>") + "</option>";
- }
-
- // Update all restriction selectors to display the saved restrictions returned by allSavedRestrictions
- function updateSavedRestrictionSelectors(root) {
- $("div.rtmgr div.name select", root).html(allSavedRestrictionAsOptions()).each(resizeDivName);
- }
-
- // The content of the div.name element are positioned relative to its location. As a result, the
- // div normally collapses to a point in the screen layout. This function expands the div to enclose
- // its contents such that other elements are laid out around them.
- function resizeDivName(idx, child) {
- var div = $(child).parents("div.name").first();
- var height = 0;
- var width = 0;
-
- div.children().each(function(idx, child) {
- child = $(child);
- height = Math.max(height, child.height());
- width = Math.max(width, child.width());
- });
-
- div.width(width).height(height);
- }
-
-
- // Identify the direction of the restrictions associated with the specified button.
- function direction(btn) {
- var classes = btn.parents("div.restriction-summary-group").attr('class').split(' ');
-
- while(classes.length) {
- var cls = classes.pop();
- var dir = classToDirection[cls];
-
- if (dir) {
- return dir;
- }
- }
- }
-
-
- function setValue(selector, model, value) {
- if (value != null) {
- var sel = $(selector, model);
- var oldValue = sel.val();
- if (oldValue != value) {
- sel.val(value);
- sel.change();
- }
- }
- }
-
- function setCheck(selector, model, value) {
- if (value != null) {
- value = !!value;
- var sel = $(selector, model);
- var oldValue = sel.prop('checked');
- if (oldValue != value) {
- sel.prop('checked', value);
- sel.change();
- }
- }
- }
-
- function setSelector(name, model, value) {
- setValue('select[name="' + name + '"]', model, value);
- }
-
- function lastFaPlus(modal) {
- return $("i.fa-plus", modal).last();
- }
-
- function clearMessages() {
- $("div.modal-header-messages div.rtmgr").remove();
- }
- function addMessage(text, icon, color) {
- var rvr = $("div.modal-header-messages");
- if (icon) {
- icon = '<i class="fa fa-' + icon + '"/> ';
- } else {
- icon = "";
- }
- if (color) {
- color = ' style="color: ' + color + '"';
- } else {
- color = "";
- }
- rvr.append('<div class="modal-header-message"' + color + '>' + icon + text + '</div>');
- }
-
- var timeRegexp = /(\d\d?):(\d\d?)/
-
- function time2Int(time, ifNull) {
- var m = timeRegexp.exec(time);
-
- return m == null ? -1 : (m[1] * 60) + m[2];
- }
-
- function compareTimeFrames(a, b) {
- if (a == null) {
- return (b == null ? 0 : -1);
- } else if (b == null) {
- return 1;
- } else {
- a = a[0];
- b = b[0];
-
- var c = time2Int(a.fromTime, -1) - time2Int(b.fromTime, -1);
- if (c == 0) {
- c = time2Int(a.toTime, 1440) - time2Int(b.toTime, 1440);
- }
-
- return c;
- }
- }
-
- function compareRestrictions(a, b) {
- var c = compareTimeFrames(a.timeFrames, b.timeFrames);
- if (c == 0) {
- c = a.defaultType.localeCompare(b.defaultType);
- }
- return c;
- }
-
- function handleImportDragOver(evt) {
- evt.stopPropagation();
- evt.preventDefault();
- evt.dataTransfer.dropEffect = "copy";
- }
-
- function handleImportFile(file) {
- var reader = new FileReader();
-
- reader.onload = function(e) {
- var restrictions = JSON.parse(e.target.result);
-
- for(var restriction in restrictions) {
- localStorage.setItem(lsPrefix + restriction, restrictions[restriction]);
- }
- };
-
- reader.readAsText(file);
- }
-
- function handleImportDrop(evt) {
- evt.stopPropagation();
- evt.preventDefault();
-
- var i, f, item, seen = {};
- for(i = 0; item = evt.dataTransfer.items[i]; i++) {
- if (item.kind === 'file') {
- f = item.getAsFile();
- handleImportFile(f);
- seen[f.name] = true;
- }
- }
- for(i = 0; f = evt.dataTransfer.files[i]; i++) {
- if (seen[f.name] !== true) {
- handleImportFile(f);
- }
- }
- }
-
- function initializeRestrictionManager() {
- if (initialized) {
- return;
- }
-
- var observerTarget = document.getElementById("dialog-region");
-
- if (!observerTarget) {
- window.console.log("Restriction Manager: waiting for WME...");
- setTimeout(initializeRestrictionManager, 1015);
- }
-
- // Inject my stylesheet into the head
- var sheet = $('head').append('<style type="text/css"/>').children('style').last();
- sheet.append('div.rtmgr-column {display: flex; flex-direction: column; align-items: center}');
- sheet.append('div.rtmgr-row {display: flex; flex-direction: row; justify-content: space-around}');
- sheet.append('div.rtmgr button.btn {margin-top: 5px; border-radius: 40%}');
- sheet.append('div.rtmgr div.name input {width: 250px; position: absolute; left: 0px; top: 0px; z-index: 1}');
- sheet.append('div.rtmgr div.name select {width: 275px; position: absolute; left: 0px; top: 0px}');
- sheet.append('div.rtmgr div.name {width: 275px; position: relative; left: 0px; top: 0px}');
- sheet.append('div.modal-dialog div.modal-header .modal-title img.icon {float:right;height:20px;width:20px}');
- sheet.append('dialog.rtmgr span.cmd {text-decoration: underline}');
- sheet.append('dialog.rtmgr .import, dialog.rtmgr .export {width:30px; height: 30px}');
-
- // create an observer instance
- var observer = new MutationObserver(function(mutations) {
- var si = W.selectionManager.getSelectedFeatures();
-
- mutations.forEach(function(mutation) {
- if("childList" == mutation.type && mutation.addedNodes.length) {
- var restrictionsModal = $("div.modal-dialog.restrictions-modal", observerTarget);
-
- if (restrictionsModal) {
- var modalTitle = $(restrictionsModal).find("div.modal-header .modal-title").first();
- var title = modalTitle.text().trim();
-
- if (I18n.translations[I18n.locale].restrictions.modal_headers.restriction_summary == title) {
- if (modalTitle.data('rtmgr') === undefined) {
- // Flag this modal as having already augmented
- modalTitle.data('rtmgr', true);
- modalTitle.append("<img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAjCAIAAABzZz93AAAABnRSTlMA/wD/AP83WBt9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABV0lEQVRIiWP8//8/A70ACxl6vm6JgjC4fZaRpJGRVJ/BbYID4q1kotAmkgBpllHoAhIso9BbJFiG3yYi3UFyarx39rRewx0IO6nBZ5IxL/F6ifIZisOffoAzrzzFrub/v7/kW0YqYGRiJtMy4tMFQZUELKM8BZJgGSZQkhbAI4vfcfgsI+gtHWksSRGPLpokEJItoyS2cOnFbhl10wUByygHWJ2LxTIC3pLiMyPXBeiWkRKAIupS+KQxjaJtakSzjwmPHA7AqwNlCKiSaDdKG4RGiRDeSEH4jEY2IQMmkm16fjOvdDmP73Ie391TnxOlA244yQnk3ulH825AmG/K1z0jSS8TA4kBeOfxG5IsgACIFST7TEVWhAzLIID0+sxULkkDwhTpDMKbqzEA4////+mQDhkYGLh9ljExkN4/IM8mhoGpPGnqObjh6F0m6sYfmh9I7p9RAgAFyXyizju5WQAAAABJRU5ErkJggg==' class='icon'>"
- + "<dialog class='rtmgr'>"
- + "<p style='text-align: center; font-weight: bold; font-size: 1.3em'>Restriction Manager</p>"
- + "<p style='font-style: italic; font-size: .7em'>Stores restrictions in your browser's local storage so that they may be easily applied to other segments.</p>"
- + "<p style='padding-left: 3em; text-indent: -3em;'>"
- + "<span class='cmd'>Save</span>: Saves these restrictions to the selected key.<br>"
- + "<span style='font-style: italic; font-size: .7em'>Note: Newly edited restrictions must be applied to the segment before the manager can save them.</span>"
- + "</p>"
- + "<p>"
- + "<span class='cmd'>Apply</span>: Replaces the current restrictions with the restrictions associated with the selected key.</p>"
- + "<p>"
- + "<span class='cmd'>Delete</span>: Delete the selected key from your browser's local storage.</p>"
- + "</dialog>");
- if (window.File && window.FileReader && window.FileList && window.Blob) {
- $('dialog.rtmgr', modalTitle)
- .append("<p>Offline Storage: "
- + "<a download='restrictions.txt'><img title='Click here to export all saved restrictions' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAABBVJREFUeJzt3btqVFEUh/FPDXiLJIhooYENKUQrqxQitrYiGgufQfENBBG08AnEWkGwsUojFhbeQFBUsBNBRBGJsZBg4lgMBzRkkrPO7NvM+v/gdJl9lrM+MqOFB/zZB9wA3gO/gSXgITBfcijJYw74AvQGXPeB7cWmk6QOAt8YvPzmul1qQEnrFpsvv7mOFZpREtkKLNI+gOtlxsxva+kBMjkATBl+/kiqQWrjJQDrF7sdSaaokJcAZAAF4JwCcE4BOKcAnFMAzikA5xSAcwrAOQXgnAJwTgE4pwCcUwDOKQDnFIBzCsA5BeCcAnBOATinAJxTAM4pAOcUgHMKwDkF4JwCcE4BOKcAnFMAzikA5xSAcwrAOQXgnAJwTgE4pwCcUwDOKQDnFIBzCsA5BeCcAnBOATg3kfj8WWAG+Am8AZYT328c7ALOAseBSeAj8AB4WnIoqzPAO/7/P/iXgJvA7gLzBNo/K6AHLBSYEeAU8HnATA+AvYXmMrnKxm/ua2B/5pnCJjPVEMA5+g+x2miul8DOArO1dpp2b/Bb8kYQWs5VKoA2y2+ua5lnM3lF+zc5ZwTBMFfuACzL79F/8FWVX94PYXuTc0YQjHPlCsC6/OY6HGuAmCXNdHjNUeAR+b8T1OAccIdufxObjDVEzAB+dHydxwiGWT7Ah3ijxLMN+Ir911mOj4NgnCXlR0DXX/vN9TjhbEO7Qvc/WMoIgnGOVAHMM9zyV4GTiWaLYjvwhPoiCMYZUgQw7PJ7wMUEc0U3DbygrgiC8f6xA4ix/MuRZ0qqtgiC8d4xA3C3/EZNEQTjfWMF4Hb5jVoiCMZ7xgjA/fIbNUQQjPcbNgAtf43SEQTjvYYJQMsfoGQEwXifrgHMAyvGe7lYfqNUBMF4jy4BaPktlYggGM+3BqDlG00Dz8kXQTCebQlAy+8oZwTBeG7bALT8IeWKIBjPbBOAlh9JjgiC8bzNAtDyI0sdQTCetVEA59Hyk0gZQTCeMygALT+xVBEE4xnrBaDlZ5IigmB8/doAtPzMYkcQjK/9NwAtv5CYEQTj65oAtPzCpogTwZzxNQto+dWIEcEn489/QcuvSowIcl5afgKjEoGWn1DtEWj5GdQagZafUW0RaPkF1BKBll9Q6Qi0/AqUikDLr8gU8Awt37VcEWj5FUsdgZY/AlJFoOWPkNgRaPkjKFYEWv4IGzYCLX8MdI1Ayx8j1gi0/DE0Rf+hCxst/g9wqdSAkt4e4B7rL38RuFButDK2lB6gkDn6TzWZBX7R/3i4C3wvOZSIiIiIiIiIiIhIGjH/KfgElT/RakwsAztiHVblI0glHwXgnAJwTgE4pwCcUwDOKQDnFIBzCsA5BeCcAnBOATinAJybiHhWD1iNeJ6sbyXmYX8BhFf7gV3QQHIAAAAASUVORK5CYII=' class='export' download='restrictions.txt'></a>"
- + "<img title='Drag file here to import restrictions' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAA61JREFUeJzt3U+LjWEcxvHvDEJKhIVslNlYSZGsiKJmUPZ2lpaaF8DGglfA5uQNKOIVyChRLCkLf2qyUEaTGSkWx6TJzJnzPM9937/7nOv61NmdGb9xfZmaOmcgrSngtx9ZH1eGXmMIkyk/mY0eByDOAYhzAOIcgDgHIM4BiHMA4hyAOAcgzgGIcwDiHIC4zYk/3yLwOPHntNU+RR9gZmZmZmZmZmYjaFP0AYEmgIPAfvo/wfwVeo0Vsx24Cczz78UWP4EHwOHAu6yAvcAr1n/VzSIwHXadZbUPeMPGL71aAmaCbrRMhh3fEYyhpuM7gjHSdnxHMAa6ju8IRliq8R3BCEo9viMYIbnGdwQjIPf4jqBipcZfeSzjCKpRenxHUJGo8R1BBaLHdwSBahnfEQSobXxHUFCt4zuCAmof3xFklGL8hczPdwSZpBj/NtBr+DEn6R7BhfR/HVpSjQ/NAwBHECrl+NAuAHAEIVKPD+0DAEdQVI7xoVsA4AiKyDU+dA8AHEFWOceHNAGAI8gi9/iQLgBwBEmVGB/SBgCOIIlS40P6AMARdFJyfMgTAKSJ4GKDP28slB4f8gUAjqCRiPEhbwDgCIYSNT7kDwAcwUCR40OZAMARrCl6fCgXADiCVWoYH8oGAI4AqGd8KB8AiEdQ0/gQEwCIRlDb+BAXAIhFsBN4TV3jQ2wA0D2CJeBYhruSu0t940N8ANA9grlMdyWzh/67btY2PtQRAHSPYCrjbZ3NUOf4UE8A0C2CyykPSf17A3e3/Lg7wGzKQyo3B5wHvrf42NxxdnKa+v7lr+g1vKuENv8THCp0Wytbga/UNz7UGQA0i+Bpwbtam6W+8aHeAGC4CH4ARwvf1cokcJ/BX8ytgLt6G9wUGQDAceDDOrd8Ac4G3NTJVeAtq7+Ql8CloHt61B0AwA7gGvAQeAE8Aa4Du4LuSeIAcIT+j4cj9ag/gOJS//bwtXz++7AKpf45gI0YByDOAYhzAOIcgDgHIM4BiHMA4hyAOAcgzgGIcwDiHIA4ByDOAYhzAOIcgDgHIM4BiHMA4hyAOAcgzgGIcwDiHIA4ByDOAYhzAOIcgDgHIM4BiHMA4hyAOAcgzgGIcwDiHIA4ByDOAYhzAOIcgDgHIE4pAJn3/21CKYCFBs/9lu2KyigF8LzBc59lu8LCbAM+MtxbxU8H3WiZnaH/a1gHjX8v7Dor4hTwnv+HXwZuoPVtkYnoA4JsAc4BJ+h/a3gHPALmI48yMyvrD75JO5BlUd2tAAAAAElFTkSuQmCC' class='import'>"
- + "</p>");
- }
- $('dialog.rtmgr', modalTitle).append("<p style='text-align: right; font-style: italic; font-size: .5em'>Click anywhere to close.</p>");
- $("img.icon", modalTitle).click(function(evt) {
- $("dialog.rtmgr", modalTitle)[0].showModal();
- });
- $("dialog.rtmgr", modalTitle).click(function(evt) {
- evt.currentTarget.close();
- });
- if (window.File && window.FileReader && window.FileList && window.Blob) {
- $("img.export", modalTitle).click(function(evt) {
- var data = JSON.stringify(extractRestrictions());
- evt.target.parentNode.href = "data:text/plain;base64," + btoa(data);
- });
-
- var imgImport = $("img.import", modalTitle)[0];
-
- imgImport.addEventListener('dragover', handleImportDragOver, false);
- imgImport.addEventListener('drop', handleImportDrop, false);
- }
-
- // Add the UI elements to the modal
- // Original, single, jquery statement split up after it stopped working.
- var restrictionSummaryGroups = $("div.restriction-summary-group div.restriction-summary-title", restrictionsModal);
- restrictionSummaryGroups.before ("<div class='rtmgr rtmgr-column'>"
- + "<div class='name'>"
- + "<input type='text'/>"
- + "<select/>"
- + "</div>"
- + "</div>");
- var rtmgrColumns = restrictionSummaryGroups.parent().children("div.rtmgr-column");
- rtmgrColumns.append ("<div class='rtmgr-row'>"
- + "<button class='btn save'>Save</button>"
- + "<button class='btn apply'>Apply</button>"
- + "<button class='btn delete'>Delete</button>"
- + "</div>");
-
- // Initialize the saved restriction selectors
- updateSavedRestrictionSelectors(restrictionsModal);
-
- // When a selection is made copy it to the overlapping input element to make it visible.
- $("div.rtmgr select").change(function(evt) {
- var tgt = evt.target;
- var txt = $(tgt).parent().children("input");
- var opt = tgt.options[tgt.selectedIndex];
- txt.val(opt.text);
-
- $(opt).prop('selected', false);
- $(opt).parent().children("option:first").prop("selected", "selected");
- });
-
- // Delete action
- $("div.rtmgr button.delete", restrictionsModal).click(function(evt) {
- var tgt = $(evt.target);
- var inp = tgt.parents('div.rtmgr').find("input");
- var name = inp.val();
- if (name == "") {
- addMessage("Specify the name of the restrictions being deleted.", 'ban', 'red');
- } else {
- localStorage.removeItem(lsPrefix + name);
- updateSavedRestrictionSelectors(restrictionsModal);
- inp.val("");
- }
- });
-
- // Save action (only one segment currently selected)
- if (si.length == 1) {
- $("div.rtmgr button.save", restrictionsModal).click(function(evt) {
- var tgt = $(evt.target);
- var input = tgt.parents('div.rtmgr').find("input");
- var name = input.val();
- if (name == "") {
- addMessage("The restrictions require a name before they can be saved.", 'ban', 'red');
- } else {
- var dir = direction(tgt);
- var attrs = si[0].model.attributes;
- var src = attrs.restrictions;
-
- // Checking for pending updates to the selected segment's restrictions. If found, save a copy of them.
- // This is a convenience feature that enables an editor to Apply a restriction change to a segment and then store it for re-use without first having to save it on the original segment.
- var actions = W.model.actionManager.getActions();
- for(var i = actions.length; i-- > 0;) {
- var action = actions[i];
- if (action.model.hasOwnProperty('subActions') && action.subActions[0].attributes.id == si[0].model.attributes.id && action.subActions[0].newAttributes.hasOwnProperty('restrictions')) {
- src = action.subActions[0].newAttributes.restrictions;
- break;
- }
- }
-
- var restrictions = [];
- for (i = 0; i< src.length; i++) {
- var restriction = src[i];
- if (restriction._direction == dir) {
- restrictions.push(restriction);
- }
- }
-
- restrictions = JSON.stringify(restrictions);
-
- clearMessages();
- if (clipboardTarget == name) {
- input.val(restrictions).select();
- document.execCommand('copy');
- input.val(clipboardTarget).blur();
- addMessage("Restrictions copied to clipboard");
- } else {
- localStorage.setItem(lsPrefix + name, restrictions);
- addMessage("Restrictions saved to " + name);
- }
- input.val("");
-
- updateSavedRestrictionSelectors(restrictionsModal);
- }
- });
- } else {
- $("div.rtmgr button.save", restrictionsModal).click(function(evt) {
- clearMessages();
- addMessage("Save is only enabled when displaying the restrictions for a SINGLE segment", 'ban', 'red');
- });
- }
-
- // Apply saved restrictions to the current segment
- $("div.rtmgr button.apply", restrictionsModal).click(function(evt) {
- var tgt = $(evt.target);
- var input = tgt.parents('div.rtmgr').find("input");
- var name = input.val().trim();
- if (name == "") {
- addMessage("Specify the name of the restrictions being applied.", 'ban', 'red');
- } else {
- var restrictions;
-
- input.val("");
-
- if (name.startsWith('[') & name.endsWith(']')) {
- restrictions = name;
- } else {
- restrictions = localStorage.getItem(lsPrefix + name);
- }
- restrictions = JSON.parse(restrictions).sort(compareRestrictions);
-
- var rsg = $(evt.target).parents("div.restriction-summary-group").first();
- var classes = rsg.attr('class').split(' ');
- classes.splice(classes.indexOf('restriction-summary-group'), 1);
-
- // Delete all current restrictions associated with the action's direction
- while (true) {
- var doDelete = "." + classes[0] + " .restriction-editing-actions i.do-delete";
- var deleteRestrictions = $(doDelete, restrictionsModal);
-
- if (deleteRestrictions.length == 0) {
- break;
- }
-
- deleteRestrictions.eq(0).click();
- }
-
- // Create new restrictions
- while (restrictions.length) {
- var restriction = restrictions.shift();
-
- $("." + classes[0] + " button.do-create", restrictionsModal).click();
-
- setSelector('disposition', restrictionsModal, restriction.disposition);
- setSelector('laneType', restrictionsModal, restriction.laneType);
- setValue('textarea[name="description"]', restrictionsModal, restriction.description);
-
- if (restriction.timeFrames != null && restriction.timeFrames.length != 0) {
- var weekdays = restriction.timeFrames[0].weekdays;
-
- var bit = 1;
- for(var idx = 0; idx < 7; idx++) {
- var set = weekdays & bit;
- set = (set != 0);
- setCheck('input#day-ordinal-' + weekdayBit2Idx[bit] + '-checkbox', restrictionsModal, set);
- bit <<= 1;
- }
-
- if (restriction.timeFrames[0].fromTime && restriction.timeFrames[0].toTime) {
- setCheck("input#is-all-day-checkbox", restrictionsModal, false);
- setValue("input.timepicker-from-time", restrictionsModal, restriction.timeFrames[0].fromTime);
- setValue("input.timepicker-to-time", restrictionsModal, restriction.timeFrames[0].toTime);
- }
-
- if (restriction.timeFrames[0].startDate && restriction.timeFrames[0].endDate) {
- setCheck("input#is-during-dates-on-radio", restrictionsModal, true);
-
- // Ref: http://www.daterangepicker.com/
- var drp = $('input.btn.datepicker', restrictionsModal).data('daterangepicker');
-
- var re = /(\d{4})-(\d{2})-(\d{2})/;
- var match = re.exec(restriction.timeFrames[0].startDate);
- var startDate = match[2] + "/" + match[3] + "/" + match[1];
-
- match = re.exec(restriction.timeFrames[0].endDate);
- var endDate = match[2] + "/" + match[3] + "/" + match[1];
-
- // WME's callback is fired by drp.hide().
- drp.show();
- drp.setStartDate(startDate);
- drp.setEndDate(endDate);
- drp.hide();
-
- setCheck("input#repeat-yearly-checkbox", restrictionsModal, restriction.timeFrames[0].repeatYearly);
- }
- }
-
- var drivingModality;
- // if ALL vehicles are blocked then the default type is simply BLOCKED and the modality is blocked.
- if ("BLOCKED" == restriction.defaultType && !restriction.driveProfiles.hasOwnProperty("FREE") && !restriction.driveProfiles.hasOwnProperty("BLOCKED")) {
- drivingModality = "DRIVING_BLOCKED";
- } else {
- drivingModality = defaultType2drivingModality[restriction.defaultType];
- }
-
- setValue("select.do-change-driving-modality", restrictionsModal, drivingModality);
-
- var driveProfiles, driveProfile, i, j, vehicleType, plus, driveProfileItem, subscription;
- if (restriction.driveProfiles.hasOwnProperty("FREE")) {
- driveProfiles = restriction.driveProfiles.FREE;
- for(i = 0; i < driveProfiles.length; i++) {
- driveProfile = driveProfiles[i];
- var numDriveProfileItems = Math.max(1, driveProfile.vehicleTypes.length);
-
- for(j = 0; j < numDriveProfileItems; j++) {
- $("div.add-drive-profile-item.do-add-item", restrictionsModal).click();
-
- vehicleType = driveProfile.vehicleTypes[j];
-
- if (vehicleType !== undefined) {
- plus = lastFaPlus(restrictionsModal);
- plus.click();
- driveProfileItem = plus.parents("div.drive-profile-item");
- $("div.btn-group.open a.do-init-vehicle-type", driveProfileItem).click();
-
- $("div.vehicle-type span.restriction-chip-content", driveProfileItem).click();
-
- $('a.do-set-vehicle-type[data-value="' + vehicleType + '"]', driveProfileItem).click();
- }
-
- if (driveProfile.numPassengers > 0) {
- plus = lastFaPlus(restrictionsModal);
- plus.click();
- driveProfileItem = plus.parents("div.drive-profile-item");
- $("div.btn-group.open a.do-init-num-passengers", driveProfileItem).click();
-
- if (driveProfile.numPassengers > 2) {
- $("a.do-set-num-passengers[data-value='" + driveProfile.numPassengers + "']", driveProfileItem).click();
- }
- }
-
- for(var k = 0; k < driveProfile.subscriptions.length; k++) {
- subscription = driveProfile.subscriptions[k];
-
- plus = lastFaPlus(restrictionsModal);
- plus.click();
- driveProfileItem = plus.parents("div.drive-profile-item");
- $("div.btn-group.open a.do-init-subscription", driveProfileItem).click();
-
-
- $("div.subscription span.restriction-chip-content", driveProfileItem).click();
-
- $('a.do-set-subscription[data-value="' + subscription + '"]', driveProfileItem).click();
- }
- }
- }
- } else if (restriction.driveProfiles.hasOwnProperty("BLOCKED")) {
- driveProfiles = restriction.driveProfiles.BLOCKED;
-
- for(i = 0; i < driveProfiles.length; i++) {
- driveProfile = driveProfiles[i];
-
- if (driveProfile.vehicleTypes.length > 0) {
- setCheck('input#all-vehicles-off-radio', restrictionsModal, true);
-
- for(j = 0; j < driveProfile.vehicleTypes.length; j++) {
- vehicleType = driveProfile.vehicleTypes[j];
-
- setCheck('input#vehicle-type-' + vehicleType + '-checkbox', restrictionsModal, true);
- }
- }
- }
- }
-
- $("div.modal-footer button.do-create", restrictionsModal).click();
- }
- clearMessages();
- addMessage("Restrictions from " + name + " applied to current selection.");
- }
- });
- }
- }
- }
- }
- });
- });
-
- // configuration of the observer:
- var config = { attributes: false, childList: true, characterData: false, subtree: true };
-
- // pass in the target node, as well as the observer options
- observer.observe(observerTarget, config);
-
- initialized = true;
- }
-
- setTimeout(initializeRestrictionManager, 1000);
- })();