Advertisement
Guest User

Untitled

a guest
Sep 30th, 2014
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name            WME Street to River PLUS
  3. // @description     This script create a new river landmark in waze map editor (WME). It transforms the the geometry of a new unsaved street to a polygon.
  4. // @namespace       https://greasyfork.org/scripts/1879-wme-street-to-river-plus
  5. // @grant           none
  6. // @version         14.06.03
  7. // @include         https://www.waze.com/editor/*
  8. // @include         https://www.waze.com/*/editor/*
  9. // @include         https://editor-beta.waze.com/*
  10. // ==/UserScript==
  11.  
  12. // Base on WME Street to river
  13.  
  14. // Mini howto:
  15. // 1) install this script as greasemonkey script or chrome extension
  16. // 2) draw a new street but do not save the street
  17. // 3) add and apply a street name to define the rivers name and the the width of the river
  18. //    Example: "20m Spree" creates a 20 meters width river named "Spree"
  19. // 4) Select the helper street
  20. // 5) Click the "Street to river" button
  21. // 4) Delete the helper street
  22. // 5) Edit the new landmark as you like
  23. //
  24. // Updated by: Eduardo Carvajal
  25.  
  26. var version = '14.06.03'
  27.  
  28. var idMeters  = 0;
  29. var idWidth = 1;
  30. var idTitle = 2;
  31. var idStreetToRiver = 3;
  32. var idUnlimitedSize=4
  33. var idNoUsavedStreet=5
  34. var idAllSegmentsInside=6
  35. var idMultipleSegmentsInside=7
  36.  
  37.  
  38. function streetToRiver_bootstrap()
  39. {
  40.     var bGreasemonkeyServiceDefined = false;
  41.  
  42.     try
  43.     {
  44.         if ("object" === typeof Components.interfaces.gmIGreasemonkeyService)
  45.         {
  46.             bGreasemonkeyServiceDefined = true;
  47.         }
  48.     }
  49.     catch (err)
  50.     {
  51.         //Ignore.
  52.     }
  53.     if ( "undefined" === typeof unsafeWindow  ||  ! bGreasemonkeyServiceDefined)
  54.     {
  55.         unsafeWindow    = ( function ()
  56.         {
  57.             var dummyElem   = document.createElement('p');
  58.             dummyElem.setAttribute ('onclick', 'return window;');
  59.             return dummyElem.onclick ();
  60.         } ) ();
  61.     }
  62.     /* begin running the code! */
  63.     setTimeout(streetToRiver_init,999);
  64. }
  65.  
  66.  
  67.  
  68.  
  69. // 2014-01-09: Add new controls to Waze Editors.
  70. function streetToRiver_init() {
  71.    
  72.     var defaultWidth = 20;
  73.     var scriptLanguage = "us";
  74.     var langText;
  75.    
  76.     function insertButtons() {
  77.        
  78.         if(Waze.selectionManager.selectedItems.length == 0) return;
  79.        
  80.         // 2013-04-19: Catch exception
  81.         try{
  82.             if(document.getElementById('streetToRiver') != null) return;
  83.         }
  84.         catch(e){ }
  85.        
  86.        
  87.         // 2014-01-09: Add Create River and Create Railway buttons
  88.         var btn1 = $('<button class="btn btn-primary" title="' + getString(idTitle) + '">' + getString(idStreetToRiver) + '</button>');
  89.         btn1.click(doRiver);
  90.        
  91.         var strMeters =  getString(idMeters);
  92.        
  93.         // 2014-01-09: Add River Width Combobox
  94.         var selRiverWidth = $('<select id="riverWidth" data-type="numeric" class="form-control" />');  
  95.         selRiverWidth.append( $('<option value="5"> 5 ' + strMeters + '</option>') );
  96.         selRiverWidth.append( $('<option value="8"> 8 ' + strMeters + '</option>') );
  97.         selRiverWidth.append( $('<option value="10">10 ' + strMeters + '</option>') );
  98.         selRiverWidth.append( $('<option value="15">15 ' + strMeters + '</option>') );
  99.         selRiverWidth.append( $('<option value="20">20 ' + strMeters + '</option>') );
  100.         selRiverWidth.append( $('<option value="25">25 ' + strMeters + '</option>') );
  101.         selRiverWidth.append( $('<option value="30">30 ' + strMeters + '</option>') );
  102.        
  103.        
  104.         // 2014-01-09: Add Unlimited size river with checkbox
  105.         var chk = $('<label class="checkbox"><input type="checkbox" id="_isUnlimitedSize">' + getString(idUnlimitedSize) + '</label>');
  106.        
  107.  
  108.         // 2014-01-09: Add streetToRiver section with new HTML controls
  109.         var cnt = $('<section id="streetToRiver" />');
  110.        
  111.         // 2014-01-09: Add River width to section
  112.         var divGroup1 = $('<div class="form-group" />');
  113.         divGroup1.append( $('<label class="col-xs-4">' + getString(idWidth) + ':</label>') );
  114.         var divControls1 = $('<div class="col-xs-8 controls" />');
  115.         divControls1.append(selRiverWidth);
  116.         divControls1.append(chk);
  117.         divGroup1.append(divControls1);
  118.         cnt.append(divGroup1);
  119.  
  120.         // 2014-01-09: Add river buttons to section
  121.         var divGroup2 = $('<div class="form-group"/>');
  122.         divGroup2.append( $('<label class="col-xs-4">&nbsp;</label>') );
  123.         var divControls2 = $('<div class="col-xs-8 controls" />');
  124.         divControls2.append(btn1);
  125.         divGroup2.append(divControls2);
  126.         cnt.append(divGroup2);
  127.        
  128.         // 2014-01-09: Add Script version to section.
  129.         var divGroup3 = $('<div class="form-group"/>');
  130.         divGroup3.append( $('<label class="control-label"></label>') );
  131.         var divControls3 = $('<div class="controls"/>');
  132.         divControls3.append( $('<label class="checkbox"><a href="https://www.waze.com/forum/viewtopic.php?f=819&t=87931" target="_blank">Street to River+</a> ' + version + '</label>') );
  133.         divGroup3.append(divControls3);
  134.         cnt.append(divGroup3);
  135.        
  136.        
  137.         $("#segment-edit-general").append(cnt);
  138.        
  139.        
  140.         // 2013-06-09: Select last river width
  141.         var lastRiverWidth = getLastRiverWidth(20);
  142.         console_log("Last river width: " + lastRiverWidth);
  143.         var selRiverWidth = document.getElementById('riverWidth');
  144.         if(selRiverWidth!=null){
  145.             for(var i=0; i < selRiverWidth.options.length; i++){
  146.                 if(selRiverWidth.options[i].value == lastRiverWidth){
  147.                     selRiverWidth.selectedIndex = i;
  148.                     break;
  149.                 }
  150.             }
  151.         }
  152.        
  153.         // 2013-10-20: Last time user select unlimited size?
  154.         var isUnlimitedSize = document.getElementById('_isUnlimitedSize')
  155.         if(isUnlimitedSize!=null){
  156.             isUnlimitedSize.checked = getLastIsUnlimitedSize(false);
  157.         }
  158.        
  159.  
  160.         console_log("Street to River Language: " + scriptLanguage);
  161.         console_log("Street to river PLUS initialized");
  162.     }
  163.    
  164.    
  165.     // 2014-01-09: Process River Button
  166.     function doRiver(ev) {
  167.         var convertOK;
  168.         var foundSelectedSegment = false;
  169.  
  170.         // 2013-10-20: Get river's width
  171.         var selRiverWidth = document.getElementById('riverWidth');
  172.         defaultWidth = parseInt(selRiverWidth.options[selRiverWidth.selectedIndex].value);
  173.                
  174.         setLastRiverWidth(defaultWidth);
  175.         console_log("River width: " + defaultWidth);        
  176.        
  177.         // 2013-10-20: Is limited or unlimited?
  178.         var isUnlimitedSize = document.getElementById('_isUnlimitedSize');
  179.         setLastIsUnlimitedSize(isUnlimitedSize.checked);
  180.  
  181.        
  182.         // 2014-01-09: Search for helper street. If found create or expand a river
  183.         for (var s=Waze.selectionManager.selectedItems.length-1; s>=0; s--) {
  184.             var sel = Waze.selectionManager.selectedItems[s];
  185.             if (sel.model.type == "segment" && sel.model.state == "Insert") {
  186.                 // found segment
  187.                 foundSelectedSegment = true;
  188.                 convertOK = convertToLandmark(sel, "H3010",isUnlimitedSize.checked);
  189.             }
  190.         }
  191.         if (! foundSelectedSegment) {
  192.             alert(getString(idNoUsavedStreet));
  193.         }
  194.  
  195.     }
  196.    
  197.    
  198.     // 2014-01-09: Base on selected helper street creates or expand an existing river/railway
  199.     function convertToLandmark(sel, lmtype,isUnlimitedSize) {
  200.         var leftPa, rightPa, leftPb, rightPb;
  201.         var prevLeftEq, prevRightEq;
  202.         var street = getStreet(sel);
  203.        
  204.         var displacement = getDisplacement(street);
  205.         var streetVertices = sel.geometry.getVertices();
  206.         var polyPoints = null;
  207.         var firstPolyPoint = null;
  208.         var secondPolyPoint = null;
  209.        
  210.         console_log("Street vertices: "+streetVertices.length);
  211.        
  212.         // 2013-10-13: Is new street inside an existing river?
  213.         var bAddNew = !0;
  214.         var riverLandmark=null;
  215.         var repo = Waze.model.venues;
  216.        
  217.         for (var t in repo.objects)
  218.         {
  219.             riverLandmark =  repo.objects[t];                        
  220.            
  221.             // 2014-06-27: Veriy if the landkmark object has containsPoint function
  222.             if ("function" === typeof riverLandmark.geometry.containsPoint){
  223.                 if(riverLandmark.geometry.containsPoint(streetVertices[0])){
  224.                     bAddNew = false;    // Street is inside an existing river
  225.                     break;
  226.                 }
  227.             }
  228.         }
  229.        
  230.         // 2013-10-13: Ignore vertices inside river
  231.         var bIsOneVerticeStreet = false;
  232.         var firstStreetVerticeOutside = 0;
  233.         if(!bAddNew){
  234.             console_log("Expanding an existing river");
  235.             while(firstStreetVerticeOutside < streetVertices.length){
  236.                 if(!riverLandmark.geometry.containsPoint(streetVertices[firstStreetVerticeOutside]))
  237.                     break;
  238.                 firstStreetVerticeOutside += 1;                
  239.             }
  240.             if(firstStreetVerticeOutside ===  streetVertices.length){
  241.                 alert(getString(idAllSegmentsInside));
  242.                 return false;
  243.             }
  244.             bIsOneVerticeStreet = firstStreetVerticeOutside === (streetVertices.length-1);
  245.             if(bIsOneVerticeStreet){
  246.                 console_log("It's one vertice street");                
  247.             }
  248.             if(firstStreetVerticeOutside > 1){
  249.                 alert(getString(idMultipleSegmentsInside));      
  250.                 return false;
  251.             }
  252.             console_log("First street vertice outside river:" + firstStreetVerticeOutside);
  253.         }
  254.        
  255.        
  256.         // 2013-10-13: Add to polyPoints river polygon
  257.         console_log("River polygon: Create");
  258.         var first;
  259.         if(bAddNew)
  260.             first = 0;
  261.         else
  262.             first = firstStreetVerticeOutside - 1;
  263.        
  264.         for (var i=first; i< streetVertices.length-1; i++)
  265.         {
  266.             var pa = streetVertices[i];
  267.             var pb = streetVertices[i+1];
  268.             var scale = (pa.distanceTo(pb) + displacement) / pa.distanceTo(pb);
  269.            
  270.             leftPa = pa.clone();
  271.             leftPa.resize(scale, pb, 1);
  272.             rightPa = leftPa.clone();
  273.             leftPa.rotate(90,pa);
  274.             rightPa.rotate(-90,pa);
  275.            
  276.             leftPb = pb.clone();
  277.             leftPb.resize(scale, pa, 1);
  278.             rightPb = leftPb.clone();
  279.             leftPb.rotate(-90,pb);
  280.             rightPb.rotate(90,pb);
  281.            
  282.            
  283.             var leftEq = getEquation({ 'x1': leftPa.x, 'y1': leftPa.y, 'x2': leftPb.x, 'y2': leftPb.y });
  284.             var rightEq = getEquation({ 'x1': rightPa.x, 'y1': rightPa.y, 'x2': rightPb.x, 'y2': rightPb.y });
  285.             if (polyPoints == null) {
  286.                 polyPoints = [ leftPa, rightPa ];
  287.             }
  288.             else {
  289.                 var li = intersectX(leftEq, prevLeftEq);
  290.                 var ri = intersectX(rightEq, prevRightEq);
  291.                 if (li && ri) {
  292.                     // 2013-10-17: Is point outside river?
  293.                     if(i>=firstStreetVerticeOutside){
  294.                         polyPoints.unshift(li);
  295.                         polyPoints.push(ri);
  296.                        
  297.                         // 2013-10-17: Is first point outside river? -> Save it for later use
  298.                         if(i==firstStreetVerticeOutside){
  299.                             firstPolyPoint = li.clone();
  300.                             secondPolyPoint = ri.clone();
  301.                             polyPoints = [ li,ri   ]
  302.                         }
  303.                     }
  304.                 }
  305.                 else {
  306.                     // 2013-10-17: Is point outside river?
  307.                     if(i>=firstStreetVerticeOutside){
  308.                         polyPoints.unshift(leftPb.clone());
  309.                         polyPoints.push(rightPb.clone());
  310.  
  311.                         // 2013-10-17: Is first point outside river? -> Save it for later use
  312.                         if(i==firstStreetVerticeOutside){
  313.                             firstPolyPoint = leftPb.clone();
  314.                             secondPolyPoint = rightPb.clone();
  315.                             polyPoints = [ leftPb,rightPb   ]
  316.                         }
  317.                     }
  318.                 }
  319.             }
  320.            
  321.             prevLeftEq = leftEq;
  322.             prevRightEq = rightEq;
  323.            
  324.             // 2013-06-03: Is Waze limit reached?
  325.             if( (polyPoints.length > 50) && !isUnlimitedSize){        
  326.                 break;
  327.             }
  328.         }
  329.        
  330.         if(bIsOneVerticeStreet){
  331.             firstPolyPoint = leftPb.clone();
  332.             secondPolyPoint = rightPb.clone();
  333.             polyPoints = { x: leftPb, y: rightPb   }
  334.             console_log("One vertice river:"+polyPoints.length);
  335.         }
  336.         else{
  337.             polyPoints.push(rightPb);
  338.             polyPoints.push(leftPb);
  339.         }
  340.         console_log("River polygon: done");
  341.              
  342.         // 2014-01-09: Create or expand an existing river?
  343.         if(bAddNew){
  344.             // 2014-01-09: Add new river
  345.             // 2014-01-09: Create new river's Polygon
  346.             var polygon = new OpenLayers.Geometry.Polygon(new OpenLayers.Geometry.LinearRing(polyPoints));
  347.             polygon.calculateBounds();
  348.             window.polytest = polygon;
  349.             // 2014-01-09: Creates river's Landmark
  350.             var wfvl = require("Waze/Feature/Vector/Landmark");
  351.             riverLandmark = new wfvl(polygon, {categories: ["RIVER_STREAM"] });
  352.             //riverLandmark.attributes.mtfcc = lmtype;
  353.            
  354.             // 2014-01-09: Add river's name base on Street Name
  355.             if (street) {
  356.                 riverLandmark.attributes.name = street.name.replace(/^\d+(m|ft)\s*/, '');
  357.             }
  358.            
  359.             riverLandmark.attributes.geometry=new OpenLayers.Geometry.Point(polygon.bounds.left,polygon.bounds.top);
  360.             riverLandmark.attributes.initialGeometry=new OpenLayers.Geometry.Point(polygon.bounds.left,polygon.bounds.top);
  361.             window.rivertest = riverLandmark;
  362.             // 2014-01-09: Add new Landmark to Waze Editor
  363.             var waa = require("Waze/Action/AddLandmark");
  364.             Waze.model.actionManager.add(new waa(riverLandmark));
  365.         }
  366.         else{
  367.             // 2014-01-09: Expand an existing river
  368.             var i;
  369.             var originalGeometry = riverLandmark.geometry.clone();
  370.             var riverVertices = riverLandmark.geometry.getVertices();
  371.             console_log("Total river vertices:" + riverVertices.length);
  372.            
  373.             // 2013-06-01: Adjust first street vertice in case of a 2 vertice river
  374.             if(firstStreetVerticeOutside==0)
  375.                 firstStreetVerticeOutside=1;
  376.  
  377.  
  378.             // 2013-06-01: Find on selected river, the nearest point from the begining of road
  379.                    
  380.             var distance=0;
  381.             var minDistance = 100000;          
  382.             var indexNearestPolyPoint=0;
  383.             for(i=0; i < polyPoints.length; i++){
  384.                 distance = polyPoints[i].distanceTo(streetVertices[firstStreetVerticeOutside])
  385.                 if(distance < minDistance){
  386.                     minDistance = distance;
  387.                     indexNearestPolyPoint = i;
  388.                 }
  389.             }
  390.             console_log("polyPoints.length: " + polyPoints.length);
  391.             console_log("indexNearestPolyPoint: " + indexNearestPolyPoint);
  392.                
  393.             var indexNearestRiverVertice=0;
  394.             var nextIndex;
  395.             minDistance = 100000;
  396.             for(i=0; i < riverVertices.length; i++){
  397.                 nextIndex = getNextIndex(i,riverVertices.length,+1);
  398.                 if(isIntersectingLines(riverVertices[i],riverVertices[nextIndex],streetVertices[0],streetVertices[1])){
  399.                     distance = polyPoints[indexNearestPolyPoint].distanceTo(riverVertices[i]);
  400.                     if(distance< minDistance){
  401.                         minDistance = distance;
  402.                         indexNearestRiverVertice = i;
  403.                     }
  404.                 }
  405.             }
  406.             console_log("indexNearestRiverVertice: " + indexNearestRiverVertice);
  407.             var nextRiverVertice = getNextIndex(indexNearestRiverVertice,riverVertices.length,1);
  408.                                    
  409.            
  410.            
  411.             // 2013-06-01: Is river's Polygon clockwise or counter-clockwise?
  412.                      
  413.            
  414.             console_log("indexNearestRiverVertice: " + indexNearestRiverVertice);
  415.             console_log("nextRiverVertice: " + nextRiverVertice);
  416.            
  417.             console_log("firstPolyPoint:" + firstPolyPoint );
  418.             console_log("secondPolyPoint:" + secondPolyPoint);
  419.            
  420.             var inc=1;
  421.             var incIndex=0;
  422.             if(isIntersectingLines(riverVertices[indexNearestRiverVertice],firstPolyPoint,riverVertices[nextRiverVertice], secondPolyPoint)){
  423.                 //inc = -1;
  424.                 console_log("Lines intersect: clockwise polygon" );
  425.                 inc = +1;
  426.                 incIndex=1;
  427.             }
  428.             else{
  429.                 inc = +1;
  430.                 console_log("Lines doesn't itersect: counter-clockwise polygon" );
  431.             }
  432.            
  433.            
  434.             // 2013-06-03: Update river's polygon (add new vertices)
  435.             indexLastPolyPoint =getNextIndex(index,polyPoints.length,-inc);
  436.             var indexNextVertice=1;
  437.             var index= polyPoints.length/2 - 1;
  438.            
  439.             if(bIsOneVerticeStreet)
  440.                 index +=1;
  441.            
  442.             for(i= 0; i < polyPoints.length; i++){
  443.                 if(!originalGeometry.containsPoint(polyPoints[index])){
  444.                    
  445.                     // 2014-01-09: Save's old Landmark
  446.                     var undoGeometry = riverLandmark.geometry.clone();
  447.                    
  448.                     // 2014-01-09: Add a new point to existing river landmark
  449.                     riverLandmark.geometry.components[0].addComponent(polyPoints[index],indexNearestRiverVertice+indexNextVertice);
  450.                    
  451.                     // 2014-01-09: Update river landmark on Waze editor
  452.                     var waufg = require("Waze/Action/UpdateFeatureGeometry");
  453.                     Waze.model.actionManager.add(new waufg(riverLandmark, Waze.model.venues,undoGeometry,riverLandmark.geometry));
  454.                     delete undoGeometry;
  455.                    
  456.                     console_log("Added: " + index);
  457.                     indexNextVertice+=incIndex;
  458.                 }
  459.                 index = getNextIndex(index,polyPoints.length,inc);
  460.             }
  461.  
  462.             // 2013-06-03: Notify Waze that current river's geometry change.
  463.             //Waze.model.actionManager.add(new Waze.Action.UpdateFeatureGeometry(riverLandmark,Waze.model.landmarks,originalGeometry,riverLandmark.geometry));
  464.             //delete originalGeometry;
  465.         }
  466.       return true;
  467.   }
  468.    
  469.     // 2013-06-02: Returns TRUE if line1 intersects lines2
  470.     function isIntersectingLines(pointLine1From, pointLine1To, pointLine2From, pointLine2To){
  471.         var segment1;
  472.         var segment2;
  473.        
  474.         // 2013-06-02: OpenLayers.Geometry.segmentsIntersect requires that start and end are ordered so that x1 < x2.
  475.         if(pointLine1From.x <=  pointLine1To.x)
  476.             segment1 = { 'x1': pointLine1From.x, 'y1': pointLine1From.y, 'x2': pointLine1To.x, 'y2': pointLine1To.y };
  477.         else
  478.             segment1 = { 'x1': pointLine1To.x, 'y1': pointLine1To.y ,'x2': pointLine1From.x, 'y2': pointLine1From.y };
  479.        
  480.         if(pointLine2From.x <=  pointLine2To.x)
  481.             segment2 = { 'x1': pointLine2From.x, 'y1': pointLine2From.y, 'x2': pointLine2To.x, 'y2': pointLine2To.y };
  482.         else
  483.             segment2 = { 'x1': pointLine2To.x, 'y1': pointLine2To.y ,'x2': pointLine2From.x, 'y2': pointLine2From.y };
  484.        
  485.         return OpenLayers.Geometry.segmentsIntersect(segment1,segment2,!1);
  486.     }
  487.    
  488.     // 2013-06-02: Returns TRUE if polygon's direction is clockwise. FALSE -> counter-clockwise
  489.     // Based on: http://stackoverflow.com/questions/1165647/how-to-determine-if-a-list-of-polygon-points-are-in-clockwise-order
  490.     function isClockwise(vertices,index,count){
  491.         var total=0;
  492.         var nextIndex;
  493.        
  494.         if(count > vertices.length)
  495.             count = vertices.length;
  496.        
  497.        
  498.         for(var i=0; i < vertices.length-1; i++){
  499.             nextIndex = getNextIndex(index,vertices.length,+1);
  500.             total += (vertices[nextIndex].x-vertices[index].x) * (vertices[nextIndex].y+vertices[index].y)
  501.             index = nextIndex;
  502.         }
  503.         return total>=0;
  504.     }
  505.    
  506.     // 2013-06-01: Increment/decrement index by 1
  507.     function getNextIndex(index,length,inc){
  508.         var next = index + inc
  509.         if(next == length)
  510.             next = 0;
  511.         if(next < 0)
  512.             next = length-1;
  513.         return next;
  514.     }
  515.    
  516.    
  517.     function getEquation(segment) {
  518.         if (segment.x2 == segment.x1)
  519.             return { 'x': segment.x1 };
  520.        
  521.         var slope =  (segment.y2 - segment.y1) / (segment.x2 - segment.x1);
  522.         var offset = segment.y1 - (slope  * segment.x1)
  523.         return { 'slope': slope, 'offset': offset };
  524.     }
  525.    
  526.     //
  527.     // line A: y = ax + b
  528.     // line B: y = cx + b
  529.     //
  530.     // x = (d - b) / (a - c)
  531.     function intersectX(eqa,eqb,defaultPoint) {
  532.         if ("number" == typeof eqa.slope && "number" == typeof eqb.slope) {
  533.             if (eqa.slope == eqb.slope)
  534.                 return null;
  535.            
  536.             var ix = (eqb.offset - eqa.offset) / (eqa.slope - eqb.slope);
  537.             var iy = eqa.slope * ix + eqa.offset;
  538.             return new OpenLayers.Geometry.Point(ix, iy);
  539.         }
  540.         else if ("number" == typeof eqa.x) {
  541.             return new OpenLayers.Geometry.Point(eqa.x, eqb.slope * eqa.x + eqb.offset);
  542.         }
  543.             else if ("number" == typeof eqb.y) {
  544.                 return new OpenLayers.Geometry.Point(eqb.x, eqa.slope * eqb.x + eqa.offset);
  545.             }
  546.             return null;
  547.     }
  548.    
  549.    
  550.     function getStreet(segment) {
  551.         if (! segment.attributes.primaryStreetID)
  552.             return null;
  553.         var street = segment.model.streets.get(segment.attributes.primaryStreetID)
  554.         return street;
  555.     }
  556.    
  557.     function getDisplacement(street) {
  558.         if (!street)
  559.             return defaultWidth;
  560.         if (street.name.match(/^(\d+)m\b/))
  561.             return parseInt(RegExp.$1);
  562.         if (street.name.match(/^(\d+)ft\b/))
  563.             return parseInt(RegExp.$1) * 0.3048;
  564.         return defaultWidth;
  565.     }
  566.  
  567.     // 2013-06-09: Save current river Width    
  568.     function setLastRiverWidth(riverWidth){
  569.         if(typeof(Storage)!=="undefined"){
  570.             // 2013-06-09: Yes! localStorage and sessionStorage support!
  571.             sessionStorage.riverWidth=Number(riverWidth)
  572.          }
  573.          else{
  574.            // Sorry! No web storage support..
  575.            console_log("No web storage support");
  576.          }
  577.     }
  578.    
  579.     // 2013-06-09: Returns last saved river width
  580.     function getLastRiverWidth(defaultRiverWidth){
  581.         if(typeof(Storage)!=="undefined"){
  582.             // 2013-06-09: Yes! localStorage and sessionStorage support!
  583.             if(sessionStorage.riverWidth)
  584.                 return Number(sessionStorage.riverWidth);
  585.             else
  586.                 return Number(defaultRiverWidth);   // Default river width
  587.          }
  588.          else{
  589.            // Sorry! No web storage support..
  590.            return Number(defaultRiverWidth);    // Default river width
  591.          }        
  592.     }
  593.  
  594.     // 2013-10-20: Save current unlimited size preference
  595.     function setLastIsUnlimitedSize(isUnlimitedSize){
  596.         if(typeof(Storage)!=="undefined"){
  597.             // 2013-06-09: Yes! localStorage and sessionStorage support!
  598.             sessionStorage.isUnlimitedSize=Number(isUnlimitedSize)
  599.          }
  600.          else{
  601.            // Sorry! No web storage support..
  602.            console_log("No web storage support");
  603.          }
  604.     }
  605.    
  606.     // 2013-10-20: Returns last saved unlimite size preference
  607.     function getLastIsUnlimitedSize(defaultValue){
  608.         if(typeof(Storage)!=="undefined"){
  609.             // 2013-10-20: Yes! localStorage and sessionStorage support!
  610.             if(sessionStorage.isUnlimitedSize)
  611.                 return Number(sessionStorage.isUnlimitedSize);
  612.             else
  613.                 return Number(defaultValue);    // Default preference
  614.          }
  615.          else{
  616.            // Sorry! No web storage support..
  617.            return Number(defaultValue); // Default preference
  618.          }        
  619.     }
  620.    
  621.     // 2014-06-05: Returns WME interface language
  622.     function getLanguage(){
  623.         var wmeLanguage;
  624.         var urlParts;
  625.        
  626.         urlParts = location.pathname.split("/");
  627.         wmeLanguage = urlParts[1].toLowerCase();
  628.         if (wmeLanguage==="editor")
  629.             wmeLanguage = "us";
  630.        
  631.         return wmeLanguage;
  632.        
  633.     }
  634.    
  635.     // 2014-06-05: Translate text to different languages
  636.     function intLanguageStrings(){
  637.         switch(getLanguage()){
  638.             case "es":      // 2014-06-05: Spanish
  639.             case "es-419":
  640.                 langText = new Array("metros","Ancho","Cree una nueva calle, selecciónela y oprima este botón.","Calle a Río","Tamaño ilimitado",
  641.                                      "¡No se encontró una calle sin guardar!","Todos los segmentos de la calle adentro del río. No se puede continuar.",
  642.                                      "Múltiples segmentos de la calle dentro del río. No se puede continuar");
  643.                 break;
  644.             case "pt-ptBETA":       // 2014-06-05: Portuguese
  645.             case "pt-brBETA":
  646.                 langText = new Array("metros","Largura","Criar uma nova rua, selecione e clique neste botão.","Rua em um rio","Ilimitado tamanho (inseguro)",
  647.                                      "Sem nova rua não salvos e selecionados encontrado!","Todos os segmentos de rua dentro do rio. Não é possível continuar.",
  648.                                      "Vários segmentos de rua dentro do rio. Não é possível continuar.");
  649.                 break;
  650.             case "fr":      // 2014-06-05: French
  651.                 langText = new Array("mètres","Largeur","Créez une nouvelle rue, sélectionnez la et cliquez sur ce bouton.","Rue á rivière","Taille illimitée (dangereux)",
  652.                                      "Pas de nouvelle rue non enregistré trouvée!","Tous les segments de la rue dans la rivière. Vous ne pouvez pas continuer.",
  653.                                      "Plusieurs segments de rues à l'intérieur de la rivière. Vous ne pouvez pas continuer.");
  654.                 break;
  655.             case "ru":      // 2014-06-05: Russian
  656.                 langText = new Array("метров","Ширина","Создайте новую дорогу (не сохраняйте), выберите ее и нажмите эту кнопку.","Дорога в реку","Неограниченная длина (небезопасно)",
  657.                                      "Не выделено ни одной не сохранённой дороги!","Все сегменты дороги находятся внутри реки. Преобразование невозможно.",
  658.                                      "Слишком много сегментов дороги находится внутри реки. Преобразование невозможно.");
  659.                 break;                
  660.             case "hu":      // 2014-07-02: Hungarian
  661.                 langText = new Array("méter","Szélesség","Hozzon létre egy új utcát, válassza ki, majd kattintson erre a gombra.","Utcából folyó","Korlátlan méretű (nem biztonságos)",
  662.                                      "Nem található nem mentett és kiválasztott új utca!","Az útszakasz a folyón belül található! Nem lehet folytatni.",
  663.                                      "Minden útszakasz a folyón belül található! Nem lehet folytatni.");
  664.                 break;                
  665.  
  666.             case "cs":     // 2014-07-03: Czech
  667.                 langText = new Array("metrů","Šířka","Vytvořte osu řeky, vyberte segment a stiskněte toto tlačítko.","Silnice na řeku","Neomezená šířka (nebezpečné)",
  668.                                      "Nebyly vybrány žádné neuložené segmenty!","Všechny segmenty jsou uvnitř řeky! Nelze pokračovat.",
  669.                                      "Uvnitř řeky je více segmentů! Nelze pokračovat.");
  670.                 break;
  671.  
  672.             default:        // 2014-06-05: English
  673.                 langText = new Array("meters","Width","Create a new street, select and click this button.","Street to River","Unlimited size (unsafe)",
  674.                                      "No unsaved and selected new street found!","All street segments inside river. Cannot continue.",
  675.                                      "Multiple street segments inside river. Cannot continue.");
  676.         }
  677.     }
  678.    
  679.     // 2014-06-05: Returns the translated  string to current language, if the language is not recognized assumes English
  680.     function getString(stringID){
  681.         return langText[stringID];
  682.     }
  683.    
  684.     function console_log(msg) {
  685.         //if (console.log)
  686.         // 2013-05-19: Alternate method to valided console object
  687.         if(typeof console != "undefined")
  688.             console.log(msg);
  689.     }
  690.        
  691.     // 2014-06-05: Get interface language
  692.     scriptLanguage = getLanguage();
  693.     intLanguageStrings();
  694.     Waze.selectionManager.events.register("selectionchanged", null, insertButtons);
  695.    
  696. }
  697.  
  698. streetToRiver_bootstrap();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement