您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Resets WME layers to your preferred state plus other fancy stuff.
当前为
// ==UserScript== // @name WME KeepMyLayers // @description Resets WME layers to your preferred state plus other fancy stuff. // @namespace https://greasyfork.org/users/11629-TheLastTaterTot // @version 0.4.0.3 // @include https://editor-beta.waze.com/*editor/* // @include https://www.waze.com/*editor/* // @exclude https://www.waze.com/user/*editor/* // @author TheLastTaterTot // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // @run-at document-start // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJQAAACUCAYAAAB1PADUAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AELCAcUa3kMkQAAGqZJREFUeNrtXXl4VEW2P1W30/u+pkNICIKILGIAERf2PexhERACiIDLjDOOzuLIzLwPfc7m+MYZZwARQQRE2Zew74IgEJRFxLAlIXS60/venb5V7w/Ce7436twk3bc7yf39l+9L9a0651dnq3PrAggQIECAAAECBAgQIECAAAECBHwnkCCCHwalVAIA1vo/bQihmCAVgVANIRC27aEdxAR+xSZgNo3/P4GJAbAYVpI4vGEeg64ihIggNYFQ34nqU2w7VI0uYAJKLv9PMARpG9qtTR/mpiC9O8CCCAAopVL7NrKdqUI3uJIJAAATUDJV6IZ9G9lOKZUKkhQsFDhKyQIShSVAmr41sRQWmkfhpQKhWiFcx9lOiVp0kiZAm1SBisArMtGHDY8yVwRCtRLUbCOnIQ49U7h+CmI4mz0W9xYI1bLd26skCouAgJinCDWOpbDYPAq/JhCqBcFdSh6si8MumgBLWoQsAnuWGEbqR+FzAqGad/aGa3fRXSQMwzIipZbDXtNINLIl165aLKHsu8lrNAg/A4BMS+ejSAlvWkbgVwVCNQf3dpD0r/PDUpqAThkteBFcyVLDAv0gfEQgVAai6jAxSIKwlEShuDnNG8thY0wOC9oOwC6BUBkC50HyfMIN/wUATDNdAsvo4QXTIPyOQKh0EukI2z/uQqswgfyWsDEIhgqxgZYY+zNHBELxm70ZHdvpmzQOs1pkYCuGVeYx6CWEkFMgVGqJJKrdR2eCH1a09J4RDACghjmmoehDhFBCIFSSESfsfe4t6DCQ9BQn08gsu348HSDGzNcCoZJjldSO7XQtjUMRtGIgMew0j0HTEUJ+gVCNRM1u8jSEYRkIPZH/6wflMD97BH5XIBR3i4T8h2j7qB+u0ESzLQOkVmkiYKVq6KQeiK4jhKhAqB+AfRs5QuPwOAjNf/927yExHLOMxf0FQn2Xe9tBfg5x+IPg3hrhBsXwi+zR+I8CoQDAtp90wUHYRxP/86qSgMa5QRtRwlDrEHypVRKKUiq276SHIQp9BTokEVI4YSlCAxFC8VZDKHsp+Q82Cj/DBBQCA5IPgiHESOFNyyj82xZNKN9+MigchPdQAtoJaucBYrghk8M8zRB8sEURyulPKMin+H0ShsmCltMQt8vhE/wYmWNUi0LNnlDO/WRRwgu/A+Gl0rR7QpEWfmscktoXJlJGKNcRtl+dCy0Dktmdk62wzHAly0DnG/ozR5sFocIxkh3cB2+RKDwhaC+DeSWFj5RD4adyCa7JSEJRSpH9EC0BN7wvqKsZQQ9zLAPRqmQd4SSFUO7TbM94FdoFBEyChpqlG6wVt6Uj9b2Zs2klVH1ryfs0DhMFrTR/IDFsMo9Bc5rSIoMaSSTGs4uWxKPwnnD21uKsFYil8JRuJFqFEGJTTqhbn7FtsQ1dwQRkgvRbcI0BQ4RYaafcvkxVA/nI2SqJa7aR/aJqVCmQqRUYKgIyUTWqrNlG9lNKOV8uwslC2XeTJ2gY1gARipOt1A2ySA4zLCPw+iYTyrubPBINwnFBqgLEWnhEPwR/1iSXF4sKZBJwB3VBONGkGIpS2o4mBEEKqOdDAoBSmt9oQiGEbgpRk4BvswUhVNEkl4eVMF2QpAAAAFDCtCaXDczD8Dqshp8K0mzlxkkNP8kehj9KStkAAKDmIOlO/bAMJaCPIN5WFDeJ4BRSw/zsQfg8l/9vcKW89iB5lvXCa0BAJ4i7RcdLHkYLr5oG4X80ZFijD4ftpeQjGoapguRbHpAc1ltG4Ub1szWp28B3kHSIBmEnjcO9ghpaAJHE8I1UCUWaQfhqo38jGROxl5I5bBT+igmoBLU0PxAMAUYKL1hG4SY3Rya1Bdixg2wgUZgIwr0EzSbmxlLYZB6NJyXNyiV9hpQqHFtpufBqeYa7NxHYzONQR4RQUl+tSnodHCEUsozHOaCEiUKVPSOzNwAlTLSMxznJJlNKLNS/xFfbyAoahzmCJjMi6H7fMhbPTekzeHHUlObWbKUnUALaCmpNQ6AkgqrscegRhNCtlJOWt0VRilxHyYBELTooqJg/iEx0kKEfPszXTXe8Z2OUUrV9J/0dRIXzwZRCCm9ZitDv+L7kNW3pfTxB7nFug08wgQcF7ScPBMM541iYLBbha+mK+ZOGveU35VvPXNZw+V+xCF/LmYgLs0x0hpANJkeTWSY6I2ciLuRKpkOnrmj2lt+UZyShNh84/vPyfccdtz4v867btKuU6zhDf2atWZuQM0r4k8CKxoFRwp/M2oTc0J9Zy3XM2o2lu746e8Zbvu947ZYDJ17OGJe358yFfrYr15b4nL7OmLnDT8ISkCllUY1Z94upY4a+zbnEcIQtJB60BCWgt0ATTtnbaayjCy39mTKuY9Zv3/djn8Pzh0gwIv22vjRGzWVrp3sWDu/V7WhaCLXz3BVtsKryzzU3bj91d2L/4s9ZAgarocKYkzN6xGOFF7n+tnM/eSrhhz8CAb1Am+/0K26RGn5uHILf4zpk96dlXZ23b+9w2Vz5P6Sv7IKc95Rt814qerCTlzdClZ764tmbZV+9w7Lc3lQmLAFzQc7uaWOHjmxANsg49tDVNPjv205bE5AS1pmHo5kNeU18/fZ9u2uu3x7+fUT6FxfKMJDX8/7nRj/U4x8pJdTR65WFlw989kk8Fm/fYPNMKEhkkoClY/7i8QMe5hwv+feT9uEwbIQ49GjVTBLDF3I5FKuH4Otch2w5fPJle3nFolgkpkK44bZDLBFf7zy47+R+7fPKkkooSqlo7cbdS70O91xCmnY7BmEJaAya86aCtvOLHu15ius4RylZkIjCnzEBZSsrAwQZObxkGYGXcibSsZN9vJU1y3xOX3euVul7vSvGoDXrV0wvHrGAy2fW/i2hDpTb1Dc/O+EJeUO4MSz/3gdjBNkFue8b7rvnRwML2nI+pKxvkRkP0OK/A8NiKWxpSGvJoRtVCtfX1/5Wc+PWHEqSVxinhIJCoyDtHnlEN7ij1d+ksoHj4vntYX84qWS6O0nbtao5l0qP+HYeP7uQ6zjzaDwJKSEHicHRYuMkMTiQEnIaQqbtJ84+c6n0iM92rSqpZLq7+cOBMHZcOr+1SRbKVhfUb1i6OeVf60YYgUwhu3D/4Mee7JtrOc91XM1eMhmCsBoISFpI9hYDJczMHoY/4TrkeJX9ga8Pfro6Eop0SzaRvgsTF4zXt8lSeRpFqOq6gG7T0i1u3uoqhIIxP/ufub0LF/XLMXIiMqUU2bfT1RCHGc086F5jGYNmcj3EPXrbabh1umyxs6LmmWR7jx/CrGem6DSMxNvoGOqjrXsP1lbZB/Ip2yxxFuT36Dx5RO/uG7kKmFKqq9lKy5rbVxqoCG5mj0OFCCEP1w1UeuZ8cdW5y5/Uxet4nas5L/vA1LFDhzQpKD9VZVNdPHTCm+ygnAtkCpmj89D+jz6aa7rKUdi4dh8dTIKwN+OvasQAWAnDTEPRAYQQp9kev1Xb4fK+I8cjoYiZV9ITCkqtku00oI/20bw2waSUDdZs3PV3f613AddiZrLAMAyo9KoPnpwyej5CKMZxvpLanfT3JAo/yUguSeG/TEXolw1ZzwfrdiwL+QKz0iF/tUm7dEbxyOeTUjb4P3678nbnK/uObY1G4h353iFShRQ02YYpU0YN2sh1R98+zXbAVWhHxnzNAcMV0paOzunNcLa4H5ceLPbVuD6OhqLAt4eQysTlXYf0G9c333qZc4LVmAftOnthesXZS2v49uEAAAq1wtF76pAe3SRqG9cxtmPsGGRHm9NYu2KphU6wPs5s5zrgQsxvPb1+/xchf8jM92SzxFmQ37PLjJE9u61t6NhGU37fhctqT6Vtse1q1Y+bWo1t8EZnMGiN2n3TJ40azjVoZz+Lq50e0SIahpd4rSnJ4c9GXWIx01fs52iV0NoNpXu8Tu9QwvIbCBKWgLVD27d1edZFQ7t1blSnZ5Nt6N6LX/eynb+yzOf0PcinSa5vkYlpc8wvThk5gPMhpvsU2zVmQ8tTfYsMFcEpiZXO0/dhOHdZfLzr8LPe246/RIIRCZ+blBIKGqPmnLV7p/nDut53pkkbKFmT2nbs8+eqLpS/QQhR8b2rdBadS2Uy9J0w+NFyruOc+8m8uBfewpDcs0ECEBRr4afGIXg51zGbDxzvGKh1feaxewy8W3uMA227dfzV2McfeicpFjmZkzvsC0tqT55eVVNemY5bWYgpz7rnibFDRnHemXdaZJbQIMxLygzU8K5lKHqmIa0lH23bX1pbaRsOafieYHbHvPWmh3uXDNDIY8n6zZT4qI27D90f9gbXue3u7nzuOMISkCqkYWPb7NeKh/d/g3PQvp90RmH4EOJQ2KgHi6GMyuFJ6xDMORvauOfIr5xVNa9GQ1E53zLSW/Tn5VrltOIRA79KesyYEp9MKUII0U37P33BVVH9ejgYVfAutGz9RbXVXDKuXx/OvTy1e8kzbBBe53yZGgYPo4RXTMPwEq7P2H7sVE9vtWOV2+7uwrdM5EppyJDf5tcThzz217s6ahaE+v9Yt2XPDuctx0i+zTphCeTcm7chy6SbM75XjyDXcY695CUShFcIAQkGkHyr3MASgBjGEGPk8JppBP4L19/ccuYLZdzu/tB2tWoc33ESABBjrnnXtPHDR6c8q+VrRaVnLxa4r9086bK5zGkIPMP53Tu9PPqxXpyzQUopKt9KFRoxyMQJEAEAxEWQ8MUh0nEcCjVkd28/dvqFygvf/CchRM73hjJYDQ5tQV6f0b273+SlTML3Vvm49GCJr8a1LBwIi/lOjVU61aXcHvcvHNqt06d8PHNX2YUBtovl/wx4Avfx7d5kCllcm2OcP2XUoFV86jctbw7XF+82+Jy+iXyfTQEAmPOz3zF1KfjNoPYdUtKac/DSdb39m/L/dFY7FvC9NoZhQGPUbJo+adQkvu4zSCmhGhLsfR136T5de+hyJBixpEPwbR/oNG9038IVyRI8pRRtO37mqeoL5e+mY6PIlDL7Y9MHdr5PbPAkW1dpIdRyu39nLErv62KKDB4gz77JcVF40+6jE9w2x4ZoOMrvbsIIRCLRjQfGDJ7a12o63ZTf+sxW2/vL7QfWJxKJAj46J78NqVwK2hxz8aTh/bZwPTjfH75dcKVWsV8mRl/PtaqLMopQqxyBZ4MR8ue6BJVhAEAMApkELX0qW/UiQijMKbNKhOR7Nh98y+/0z+f7DAshBCqd6phMq1o1eeTAtQihCMfNINtQenhG2OefFfAEHqeUXyJhBoPaqF42fMKgn5pFijDHOcvfqwm8FYnR+ZSlQAAgS4QiShl+qcSs+kdaCbUu4O8cCMDecITkflfIiRgERi0uekKj3MXVtB65UdXt6tHPS8OBcC7vuTVLADMYNEZNmbZNdqn7Zs1WmU4WEUulLABAPBplYqGYXJtjHuutrhnlc/oK747h3b0pZFUdB/Qp6l/Q9gLnuNUTHOX2kx2U/VdVEACQy/AtlQqGTVOpL/NOqFWOwE5fgOV0zCGRIFtPY6RXL2n2ba6/v+/ClTHfHDuzlRCS9huF724GSmna54Ixpvc+3mvc0G6dOLfCnInW5Jx1ys7GYjSby/+rVbh0trlxbpCzgO4GcGu8gZ97feTVugRVNWRfIgaBQoK2zbWqx3Edc6qiVnfj/JeLaytsz4EAMOVb3yno/sCiPvkmD9cxK2z+raEYHftdVul7LfUdNxjQavBrM7SqPzYkeOdMqDXeQGEoSN8Px0j3xhp4AgASMWKVMjxvplG1kuu4A9/ceKDi5Ln3Qv5Qz9ZIJIVacTb/4QefGnxvwZdcx6x2BmYHI2R5LE6ZpuhLLsFfKpRo7gytqixphFrjCrziCrCvQ5Iy4Xp/fVuEoHCuVW3nOm7H8bLnKr688hdCEuLWQCSMRfH8Bzq9OPrRwncaYJEsCQrnwhFiTVpkxwAY1MwrM/SqN5pMqHWewKxaN5uSaitCiFWp0NbZJnUx1zGHDh0SueLoH7byqqdbMpmsHdu+axDTZwcOHMj5I70rHf6NgSAdRylNSauzSc+UTNOpPmgSod6p8FE2kbp0uN5f+5Uq/OsSvervXMfVn9qvdNvdXdORZaUqy9RZdBd1bSyzxzze52wDEqTngxHyel2CqlMpCUaE4Ll8DWo0ocqi9nZHqyU3+FAXAQClHF/QKvG0SSrlJa7jthw68WPH9Vu/i4aiOr7fCkkW6t/q8Rjzc347cchjf+M6blMw0NUdoOuCYdKVLx0NzU206yIxVjTaQi295aOxGH8FOwIABg3zob4Czy7qqeActa3btm+Xs7JmRHMklDEvu0GXse08G2Kc+WSlx8c+yadtlkgQLMj9YQv1b+ejlOGHeQ1EAcDjY5+8bki4NgSCnFtzp40dOvK+h3oU6My6q3xX2hvt3sy6qwV9HihoCJk2BQNPXzckXD6eycSVC5x8xGp3oNgfIB/XJSjmcxEEAGQSVGbRovnjlWrOMcVHW/Y+FfD4loT9YVGmxVeEJSBXyxMqnWbhE+OHvcedSN5etV60NBKjhXzrIEuEiFKFJ5foVZuSVocCAFhu8++IxGhRQ4pkyUpbNUrmbau87tVhcn2A67APN5Ru8td6J6Tj5P87l3Hnte7NT04aNZHrmL1ht8oWznrdF2R/BDwvo/5Mduc8q5pzp2eDo9idIa+p0o2u18Up71cTIgZBGyOeMVGp4vxG6+7TF4328mvX/G6/Op1kUuvVfkvHe+4Z0burk+uYjwPB6XYXu4b3DQwAWWIUzNPT9kUKbW2DdNTYB652BqYHI2RNXZx/a8UgdKmXOTShjyyH83t4Ww6fLK69UbUhEojwdkcAJRRkKhmYCtpOGj/g4Y1cx52K3O54xqHYzFLahW+rlCVGoJThGTONqrWN2vRNebitLijb6STLwzEyne+FAwOglOElHdX+Xz4uy/VxUjClkrUbS5d57J5ZqW41wQwGrUn7wfTiUZxvjTkWuaUp96t/H4yQhemQp1yC1xYZ8TxrljLS2J9JylY9Fqnp/FWtbF+sjrZJhxu0GvGYYoVyJ9cDzG/i7ryjaw8ejoaiBckmFkIIpArpjX7TBw24V6yv5Eh0tDEULLI5yfZ0uDdJFqq+3xQZ+rgs+3KT1580804p2hwKTrhlZzdCGiCRIG+uLt61SGGq5jrf0lNloyu+vLKNrUuOOWCyGMjtdu+YMX17cib3zlBtm1se8cVYjGr5zxIAco1M8QSFcnOyWoGTHkwcj1QbygOq3/vDZF6aspKP5lnVnL++8EXUob68+9xij93148YSi8liQGcxvN15xIOLekjNnG8tWW7zr4vE6BPpyJrVcry8oyrwy0dlbZJ6KW/KotNtQU+vahdeWZegXXit8wCARIxAIkbT5lrUH3Edd+jyjR7XPy/7IOQLdeMatNff332h/UOFswZ2LviC67NW2P1PxOJ0XSxOeb/QIEuELrUxkNljlbozKdnUqV7AhmDgBbuLvMkmKMM3seQyXN1eG+0xRG7mnKqXnj5fUnnuq78n6hJySin+njiJiLJE4YKeXZ4f3rMb506Mw2GH6Ruv9Fw4QtrwTSRGhFiLAb84Sal6O5XP4SV/Xu63ybLiyr97fOxcvgWJEKIKBdoz16LmfLzxTdwtPrnpU72pfX4ff61zkK/GZQAA0GYbXQqL4YDrasXnD098zH2vWB/nbJVs/r2hCB3CdxsxAQCdhllRJw4+P09tjaRc3nwu7uNg4BGvn74bjpD703B84Fcr8Cszjap3+FzzamfgJ/4QWVyXoEq+1yyX4a+0avT0FKXqBG8bOB0Z2Rp34GW3n7xKWarme7cq5fiGSo7GTtWoLqZ4jd0iMbo9GCb5vFtlBvn1KvzaDIOK96+kpq2BiFLKfFAb3OkLsMPT8XyNhtlUYlQVp+K3VzkDm3w+dkJa1qVi9swyKYsaculZiyDUXaz3BDr4IvRAOELy+HYJDIOCZj1+bapa9YekrMUf+IXDTRaxLFWkwb1VamRo8FSd6mo69ZkxLY6rHIGfhSPkT7EERbwrQ4IvScRocYlZtb4xv7Gy1j81Vkd/E4lQ3mNDiQhRuQy/XGJWvZkJesy4ntnlNv/BSIQOSEc2lCVCIJOiJRKMlkSAOqzyaDhPhMLdJKY6AIALsdqsygSV28JSuQyQuY7ShaEIXViX4L+ehBCiMhk6NM+qHpxJ+svIJuwtwUC+w0svRmMknV/vZAGABQYIsHCnlM0AAhYw3LnRLm0fgJRKcNCoRV0mKlWVmaa7jO7qX+0MzPCHyIfpsACZhrsWVK3CT87Uq9Zk6jwz/jWR+haZVZEYnZyOk/iMUNKdM8pPioy4pCmtJQKhvoWyqL3NZ3bp52yC5rQmMjEidLuvJfpQodRS3Rzm22w8SaHUUt3O6Mqz6JkpjAi1BiKBRc9MaWd05TUXMjUrC/VtfBF1qMs80j8EY2nobEw5kwCUErykUBf9RUNaYQRCJQG7Qs7eN51Za+sStENL4FKWCF1tZ6TTRyq0p5vrGlqE79gUCM685UqsAPbOfeLN0Colco3M3IlK1epmn0C0FE+xJejX+cLoL54AO7u5BIYEAHQqZqVGTl8cr1R7WoIeWlx0uyHoe8jtRcuiMfJAJs9TKsFf6rV0/iSl5vMWVeJoqVnSOm/gl04vWURZKs8ogTMobNTixdO0qt+3RLm3+Px7lTuw0edhJ2bCXDQ6ZlOJPjUtMwKheMRqb6B7JEy3hiOkHd/xVX1ryU2ZHI2bqVWdb+mybhWE+h9iOQM/84fIf9QlUt+vVH/2FlIr8G9nGjOjtUQgVIqwwu4/HArRfqlqkal/MeLoXIt6QGuTbaskFADArpAjv8ojPRmOkexkWav6Zr2atrrowyMV5orWKNdWS6i7WOnwzwpF6KqmtMjcbS1RyFDJbLP6g9Ysz1ZPKIA79xy8awt8EovT4oa2yCAGgUSMNj5tVU1Ox/fpBEJlMPaG3TnXXMwVrpepZYlR4B4De98wuf62ID2BUN9nrfAHnmAHSMCvWJbODoYJ3L0CFgOAUo6BYdBKEMEbs3TKq1y/TycQSsBdgknOxRxWAIAHJWYb18vDBAgQIECAAAECBAgQIECAAAECBPwf/DfxZiKnP39/WwAAAABJRU5ErkJggg== // ==/UserScript== (function () { function kmllog(str, _) { console.log('WMEKMLayers:', str); } var kmlPLlayers = '', kmlPLhref = false, kmlPLhost = false, kmlPLpath = false, kmlayersBetaChk, kmlayersStartupChk = [(localStorage.WME_KMLSettings.indexOf('&x') !== -1), ( localStorage.WME_KMLSettings.indexOf('&b') !== -1), (localStorage.WME_KMLSettings .indexOf('&l') !== -1)]; if (location.href.lastIndexOf('&kmlayers') === -1) { //not a layers-removal redirect //if (!kmlayersStartupChk[0] || kmlayersStartupChk[1] || kmlayersStartupChk[2]) { if (!kmlayersStartupChk[0]) { // allow autocheck layers at startup kmlPLhref = location.href.match(/&layers=(\d+)/); if (kmlPLhref && kmlPLhref[1]) { kmlPLlayers = ('&kmlayers=' + kmlPLhref[1]); kmlPLhref = location.href.replace(kmlPLhref[0], ''); } // else PL has no layers setTimeout(function () { if (localStorage.WME_KeepMyLayers_lV) { localStorage.layerVisibility = localStorage.WME_KeepMyLayers_lV; } // children if (localStorage.WME_KeepMyLayers_lF) { sessionStorage.layerFilters_orig = localStorage.layerFilters; // save a duplicate as backup localStorage.layerFilters = localStorage.WME_KeepMyLayers_lF; } }, 0); } } //if (kmlayersBetaChk === true || kmlayersBetaChk === false || kmlayersLangChk === true) { if (kmlayersStartupChk[1]) { // beta toggle check //&& location.href.substr(-18).indexOf('&b') === -1 kmlayersBetaChk = GM_getValue("WMEKMLayers_Beta"); if (kmlayersBetaChk === true && //if set to beta-editor location.host.indexOf('editor-b') === -1) { //if PL is not editor-beta.waze.com kmlPLhost = 'https://editor-beta.waze.com'; } else if (kmlayersBetaChk === false && //if set to production editor location.host.indexOf('www.waze') === -1) { //if PL is not www.waze.com kmlPLhost = 'http://www.waze.com'; } } if (kmlayersStartupChk[2]) { // language check if (GM_getValue("WMEKMLayers_Lang") === true) { //if set to filter out language if (location.pathname !== '/editor/') { kmlPLpath = '/editor/'; } } } switch (true) { case (!kmlPLhost && !kmlPLpath && !kmlPLhref): //no modifications are necessary break; default: if (!kmlPLhost) kmlPLhost = location.origin; if (!kmlPLpath) kmlPLpath = location.pathname; if (!kmlPLhref) kmlPLhref = location.href; //mllog(location.origin, '/'); //kmllog(location.pathname, '/'); //kmllog('Redirecting to ' + kmlPLhost + kmlPLpath + location.href.substring( // location.href.indexOf('?'), location.href.length), '/'); location.replace(kmlPLhost + kmlPLhref.substr(kmlPLhref.indexOf(kmlPLpath)) + kmlPLlayers); } //========================================================================== var resetLocalWithKMLayers = function () { if (localStorage.WME_KeepMyLayers_lV) { //sessionStorage.layerVisibility_orig = localStorage.layerVisibility; // save a duplicate as backup localStorage.layerVisibility = localStorage.WME_KeepMyLayers_lV; } // children if (localStorage.WME_KeepMyLayers_lF) { sessionStorage.layerFilters_orig = localStorage.layerFilters; // save a duplicate as backup localStorage.layerFilters = localStorage.WME_KeepMyLayers_lF; } }; //========================================================================== var KeepMyLayers = function () { var kml = Array(10).fill(0), //counter kml_W_map_layers = unsafeWindow.Waze.map.layers, $ = unsafeWindow.$, myKMLayers, kmlVersion = '0.4'; // --------------------------------------------------------------------- var getSavedKMLayers = function () { //kmllog('getSavedKMLayers()', '/'); var myKMLayers; if (typeof myKMLayers !== "undefined") { if (myKMLayers.visibleInLayersMenu !== undefined) { //kmllog('Replaced myKMLayers in memory with saved from disk.', '/'); myKMLayers = JSON.parse(localStorage.WME_KeepMyLayers); myKMLayers.reset = false; return myKMLayers; } else { return false; } } else if (localStorage.WME_KeepMyLayers !== undefined) { //kmllog('Found some saved settings to load!','/'); myKMLayers = JSON.parse(localStorage.WME_KeepMyLayers); myKMLayers.reset = false; if (myKMLayers.visibleInLayersMenu !== undefined) { //check that required object key is present /* ~~~~~~ TEMP ~~~~~~~ */ if (myKMLayers.visibleInLayersMenu.constructor !== Array) { var tempHoldingVar = JSON.parse(JSON.stringify(myKMLayers.visibleInLayersMenu)); myKMLayers.visibleInLayersMenu = [tempHoldingVar]; myKMLayers.layerSetNames = ['My default layers']; myKMLayers.idx = 0; } /* ~~~~~~ TEMP ~~~~~~~ */ return myKMLayers; } else { return false; } } else { // myKMLayers has not been saved yet /* TODO: Call to popup of instructions for saving default layers set will maybe go here */ return false; } }; // W.map.layers.forEach(function(a,i){console.debug('[' + i + ']', a["name"] + ':', a["visibility"])}); var getWazeMapLayersFromSwitcher = function (wazeMapLayers) { // get OL layers that show up under the WME Layer switcher panel var kml_lay = wazeMapLayers.length, kml_layerName, kml_layerUniqName, kml_layerSwitcher = { accelerator: {}, uniqueName: {} }; while (kml_lay--) { kml_layerName = wazeMapLayers[kml_lay].accelerator; kml_layerUniqName = wazeMapLayers[kml_lay].uniqueName; if (kml_layerName !== undefined) { // accelerator is a marker with high specificity and selectivity of whether the layer appears in the layer switcher menu if (kml_layerUniqName !== undefined) { // uniqueName is used by WME for resetting layers to last PL kml_layerSwitcher.uniqueName[kml_layerUniqName] = kml_lay; kml_layerSwitcher.accelerator[kml_layerName] = kml_lay; } else { kml_layerSwitcher.accelerator[kml_layerName] = kml_lay; } } } return kml_layerSwitcher; }; // ------------------------------------------------------------------------- var saveKMLayers = function () { //kmllog('saveKMLayers()', '/'); var kml_j, kml_lname, kml_layerSwitcher = getWazeMapLayersFromSwitcher(kml_W_map_layers), kml_layerNames = Object.keys(kml_layerSwitcher.accelerator), kml_numLayers = kml_layerNames.length, visibleInLayersMenu = {}; // Get names of visible menu layers for (kml_j = kml_numLayers; kml_j--;) { kml_lname = kml_layerNames[kml_j]; if (kml_W_map_layers[kml_layerSwitcher.accelerator[kml_lname]].getVisibility()) { visibleInLayersMenu[kml_lname] = true; } } myKMLayers = getSavedKMLayers(); if (!myKMLayers) { myKMLayers = { idx: 0, layerSetNames: ["My default layers"], visibleInLayersMenu: [] }; } if (myKMLayers.idx === 0) { // Save to localStorage localStorage.WME_KeepMyLayers_lV = localStorage.layerVisibility; if (localStorage.layerFilters) { localStorage.WME_KeepMyLayers_lF = localStorage.layerFilters; } else { localStorage.WME_KeepMyLayers_lF = '{"update_requests":' + kml_W_map_layers[kml_layerSwitcher.accelerator.toggleUpdateRequests] .visibility + ',"problems":' + kml_W_map_layers[kml_layerSwitcher.accelerator.toggleMapProblems].visibility + ',"mapProblem":0,"mapUpdateRequest":0,"venue":1}'; } } myKMLayers.visibleInLayersMenu[myKMLayers.idx] = visibleInLayersMenu; //save only visible localStorage.WME_KeepMyLayers = JSON.stringify(myKMLayers); $('#layer-switcher-list').after( '<div id="KMLpopup" style="font-weight: bold; color: #DD3300; position: absolute; display: block; bottom: -30px; right: 14px">Saved <</div>' ); document.getElementById('iKMLsaveLayers').classList.remove("kml-icn-nsave"); //document.getElementById('iKMLsaveLayers').className = document.getElementById('iKMLsaveLayers').className.replace(' kml-icn-nsave',''); setTimeout(function () { document.getElementById('KMLpopup').remove(); }, 800); //return myKMLayers; }; var enableUndoKMLayersReset = function (kml_layerSwitcher) { //kmllog('enableUndoKMLayersReset()', '/'); var convertLayersToObj = function () { var getLayersFromPL = function () { kmlayers = location.href.match(/&kmlayers=(\d*)/); if (kmlayers && kmlayers[1]) { return kmlayers[1]; } }; var kml_layerVisibility_orig = {}, uniqueLayerVal = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2080], kml_uniqueName = ['satellite_imagery', 'cities', 'roads', 'gps_points', 'area_managers', 'landmarks', 'speed_cameras', 'problems', 'update_requests', 'editable_areas', 'live_users', 'place_updates' ], kml_lay = uniqueLayerVal.length, kmlayers = getLayersFromPL(); if (kmlayers !== undefined && kmlayers !== null) { while (kml_lay--) { if (kmlayers > uniqueLayerVal[kml_lay]) { kmlayers = kmlayers - uniqueLayerVal[kml_lay]; kml_layerVisibility_orig[kml_uniqueName[kml_lay]] = true; } else { kml_layerVisibility_orig[kml_uniqueName[kml_lay]] = false; } } sessionStorage.layerVisibility_orig = JSON.stringify( kml_layerVisibility_orig); return kml_layerVisibility_orig; } else { return JSON.parse(localStorage.WME_KeepMyLayers_lV); } }; // the following blocks of code needs cleaning up.... if (document.getElementById('iKMLtempUndo') !== null && $("a.kml-icn").length < 4) { kml[2] = 0; //reset counter if (typeof myKMLayers !== "undefined" && myKMLayers.reset !== undefined && myKMLayers.reset === true) { var kml_layerVisibility_orig = convertLayersToObj(), kml_layerVisibility_kmlayers = JSON.parse(localStorage.WME_KeepMyLayers_lV), kml_layerNames = Object.keys(kml_layerVisibility_orig), kml_numlnames = kml_layerNames.length, kml_toggledLayers = []; kml[3] = 0; while (kml_numlnames--) { if (kml_layerVisibility_kmlayers[kml_layerNames[kml_numlnames]] !== undefined) { if (kml_layerVisibility_orig[kml_layerNames[kml_numlnames]] !== kml_layerVisibility_kmlayers[kml_layerNames[kml_numlnames]] ) { kml_toggledLayers[kml[3]++] = kml_layerNames[kml_numlnames]; } } } //TOG = kml_toggledLayers; //KML = myKMLayers; var nToggled = kml_toggledLayers.length; if (nToggled !== 0) { //kmllog('Layer visibilities were reset to preferred default setting.', '/'); $('#iKMLtempUndo').wrap( '<a href="javascript:void(0)" class="kml-icn"></a>'); $('#iKMLtempUndo').toggleClass("kml-icn-off"); document.getElementById("iKMLtempUndo").onclick = function () { var kml_tog = nToggled; while (kml_tog--) { kml_W_map_layers[kml_layerSwitcher.uniqueName[kml_toggledLayers[ kml_tog]]] .setVisibility(!kml_W_map_layers[kml_layerSwitcher.uniqueName[ kml_toggledLayers[kml_tog]]].getVisibility()); } }; } // else do nothing, as there is nothing to undo bc layers were not reset } } else if ($("a.kml-icn").length > 3) { kml[2] = 0; return true; //button already enabled } else if (kml[2]++ < 30) { setTimeout(enableUndoKMLayersReset, 200); } else { console.warn('WMEKMLayers:', 'Unable to activate "Undo KMLayers Reset".', 'Element #iKMLtempUndo not found on page.'); } }; //---------------------------------------------------------------------- /* ["toggleLiveUsers", "toggleRouteCheckerScript", "toggleJunctionAngleInfo", "toggleWMEClosestSegment", "toggleRoadClosures", "toggleEditableAreas", "toggleUpdateRequests", "toggleMapProblems", "toggleSpeedcameras", "toggleJunctionboxes", "togglePlaceupdates", "togglePlaces", "toggleAreaManagers", "toggleGPSpoints", "toggleRoads", "toggleCities", "toggleSatelliteImagery"] */ var checkForReqLayers = function (permalink) { switch (true) { case permalink.indexOf('&mapUp') !== -1: return "toggleUpdateRequests"; case permalink.indexOf('&ven') !== -1: return "togglePlaces"; case permalink.indexOf('&mapPr') !== -1: return "toggleMapProblems"; case permalink.indexOf('&bigJ') !== -1: return "toggleJunctionboxes"; case permalink.indexOf('&cam') !== -1: return "toggleSpeedcameras"; default: return false; } }; //---------------------------------------------------------------------- var resetLayersToSavedKMLayers = function (kml_exclude) { //kmllog('resetLayersToSavedKMLayers(' + kml_exclude + ')', '/'); function resetLayersCatchUp(callback) { // check if any W.map.layers are missing compared to saved set var maxWait = 20, //4 seconds kml_wait = 0, kml_m = visibleMyKMLayersAccelName.length, kmlWaitAccelName = []; while (kml_m--) { // Identify missing layers due to slower loading time if (switcherAccelObj[visibleMyKMLayersAccelName[kml_m]] === undefined) { kmlWaitAccelName.push(visibleMyKMLayersAccelName[kml_m]); } } //kmllog('Missed setting layers for ' + kmlWaitAccelName); var waitForMissedLayers = function () { var kml_layerSwitcher_m = getWazeMapLayersFromSwitcher(kml_W_map_layers), switcherAccelObj_m = kml_layerSwitcher_m.accelerator, kmlWaitAccelName_m = [], kml_m = kmlWaitAccelName.length; //kmllog('start kml_m = ' + kml_m); //kmllog('kml_wait = ' + kml_wait); while (kml_m--) { if (switcherAccelObj_m[kmlWaitAccelName[kml_m]] !== undefined) { kml_W_map_layers[switcherAccelObj_m[kmlWaitAccelName[ kml_m]]].setVisibility( visibleMyKMLayersAccelObj[kmlWaitAccelName[kml_m]]); /*kmllog(kmlWaitAccelName[kml_m] + 'visibility set to ' + visibleMyKMLayersAccelObj[kmlWaitAccelName[kml_m]], '/');*/ } else { kmlWaitAccelName_m.push(kmlWaitAccelName); } } //while kmlWaitAccelName = kmlWaitAccelName_m; if (kml_wait++ < maxWait && kml_m) { setTimeout(waitForMissedLayers, 200); } else { callback(kml_layerSwitcher_m); } }; }; //resetLayersCatchUp() if (typeof myKMLayers !== "undefined" && myKMLayers) { var kml_layerSwitcher = getWazeMapLayersFromSwitcher(kml_W_map_layers), switcherAccelObj = kml_layerSwitcher.accelerator, switcherAccelNames = Object.keys(switcherAccelObj), kml_sw = switcherAccelNames.length, kml_lname, visibleMyKMLayersAccelObj = myKMLayers.visibleInLayersMenu[myKMLayers.idx], visibleMyKMLayersAccelName = Object.keys(visibleMyKMLayersAccelObj); // Adjust layer visibility if necessary if (kml_exclude) visibleMyKMLayersAccelObj[kml_exclude] = true; kml[4] = 0; while (kml_sw--) { kml_lname = switcherAccelNames[kml_sw]; kml_W_map_layers[switcherAccelObj[kml_lname]].setVisibility(!!visibleMyKMLayersAccelObj[kml_lname]); } myKMLayers.reset = true; resetLayersCatchUp(enableUndoKMLayersReset); //setTimeout(enableUndoKMLayersReset, 500); } }; // --------------------------------------------------------------------- var applyAdditionalKMLSettings = function () { //kmllog('applyAdditionalKMLSettings()', '/'); // ['&x', '&b', '&l', '&1', '&5', '&2']; //disable, beta, lang, city, am, roads if (localStorage.WME_KMLSettings.indexOf('&1') !== -1) { kml_W_map_layers[1].setOpacity(1); //kmllog('Opacity of Cities layer increased.', '/'); } else { kml_W_map_layers[1].setOpacity(0.5); //kmllog('Opacity of Cities layer at default.', '/'); } if (localStorage.WME_KMLSettings.indexOf('&5') !== -1) { kml_W_map_layers[5].setOpacity(0.6); //kmllog('Opacity of AM layer decreased.', '/'); } else { kml_W_map_layers[5].setOpacity(1); //kmllog('Opacity of AM layer at default.', '/'); } if (localStorage.WME_KMLSettings.indexOf('&2') !== -1) { kml_W_map_layers[2].setOpacity(0.8); //kmllog('Opacity of Roads layer decreased.', '/'); } else { kml_W_map_layers[2].setOpacity(1); //kmllog('Opacity of Roads layer at default.', '/'); } }; // --------------------------------------------------------------------- var runSecondaryKMLayersCheck = function () { //kmllog('runSecondaryKMLayersCheck()', '/'); if (localStorage.WME_KMLSettings === undefined) { localStorage.WME_KMLSettings = ':'; } if (localStorage.WME_KMLSettings.indexOf('&x') !== -1) { // user has set WMEKMLayers to be disabled console.log('WMEKMLayers:', 'Autocheck of KeepMyLayers at startup is disabled (2).'); return false; } else { var myKMLayers = getSavedKMLayers(); //kmllog('Secondary check completed. Any saved layers will be applied (2).', '/'); if (myKMLayers) { return myKMLayers; } else { return false; } } }; //====================================================================== myKMLayers = runSecondaryKMLayersCheck(); //KML = myKMLayers; if (myKMLayers) { resetLayersToSavedKMLayers(checkForReqLayers(location.href)); } applyAdditionalKMLSettings(); var kmlayersBetaChk = GM_getValue("WMEKMLayers_Beta"), kmlayersLangChk = GM_getValue("WMEKMLayers_Lang"); //====================================================================== var userResetOfLayersToSavedKMLayers = function () { //kmllog('userResetOfLayersToSavedKMLayers()', '/'); if (getSavedKMLayers()) { resetLayersToSavedKMLayers(false); } else { //kmllog('Nothing to reset.', '/'); return false; } }; //---------------------------------------------------------------------- var getGMBetaValue = function (callback) { setTimeout(function () { callback(GM_getValue("WMEKMLayers_Beta")) }, 0); }; //---------------------------------------------------------------------- // Beta Editor Toggle Button var toggleKMLToggle = function (e, disableBetaTog) { var enableKMLBetaToggle = function (kmlBetaToggleGM) { localStorage.WME_KMLSettings = localStorage.WME_KMLSettings.replace('#b', '&b'); //reset // kmllog('kmlBetaToggleGM = ' + kmlBetaToggleGM) kmlBetaToggleGM = (kmlBetaToggleGM.substr(kmlBetaToggleGM.indexOf('-') + 1) == "true"); // kmllog('WMEKMLayers_Beta = ' + kmlBetaToggleGM) setTimeout(function () { GM_setValue("WMEKMLayers_Beta", kmlBetaToggleGM) }, 0); document.getElementById('cbKMLtoggle').disabled = false; document.getElementById('cbKMLtoggle').checked = kmlBetaToggleGM; document.getElementsByClassName('kml-toggle-innerD')[0].className = "kml-toggle-inner"; //document.getElementsByClassName('kml-toggle-switchD')[0].className = "kml-toggle-switch"; //setTimeout(function () { // document.getElementsByClassName('kml-toggle')[0].ondblclick = toggleKMLToggle; //}, 100); }; var disableKMLBetaToggle = function () { var kmlBetaToggleChecked = document.getElementById('cbKMLtoggle').checked, kmlBetaToggleGM = 'disabled-' + kmlBetaToggleChecked; //localStorage.WME_KMLSettings = localStorage.WME_KMLSettings.replace('&b', '#b'); setTimeout(function () { GM_setValue("WMEKMLayers_Beta", kmlBetaToggleGM) }, 0); //kmllog('WMEKMLayers_Beta = ' + kmlBetaToggleGM) document.getElementById('cbKMLtoggle').disabled = true; document.getElementById('cbKMLtoggle').checked = kmlBetaToggleChecked; document.getElementsByClassName('kml-toggle-inner')[0].className = "kml-toggle-innerD"; //document.getElementsByClassName('kml-toggle-switch')[0].className = "kml-toggle-switchD"; //setTimeout(function () { // document.getElementsByClassName('kml-toggle')[0].onclick = toggleKMLToggle; //}, 100); }; //---------------------------------------------------- //kmllog('disableBetaTog = ' + disableBetaTog) if (disableBetaTog === undefined || disableBetaTog === null) { //kmllog("cbKMLtoggle status: " + document.getElementById('cbKMLtoggle').disabled); if (document.getElementById('cbKMLtoggle').disabled) { //enable it //kmllog('Enabling Beta Toggle...') getGMBetaValue(enableKMLBetaToggle); } else { //kmllog('Disabling Beta Toggle...') disableKMLBetaToggle(); } } else if (disableBetaTog) { disableKMLBetaToggle(); } else { getGMBetaValue(enableKMLBetaToggle); } }; var insertKMLBetaToggle = function (kmlToggleArg) { //kmllog('insertKMLBetaToggle()', '/'); var doInsertBetaToggle = function (kmlBetaTogVal) { $('#user-details').prepend( '<div class="kml-toggle-container"><div class="kml-toggle">' + '<input type="checkbox" name="kml-toggle" class="kml-toggle-checkbox" id="cbKMLtoggle"' + kmlBetaTogVal + '>' + '<label class="kml-toggle-label" for="cbKMLtoggle">' + '<span class="kml-toggle-inner"></span>' + '<span class="kml-toggle-switch"></span></label></div></div>'); // Event listeners for beta/prod toggle document.getElementById('cbKMLtoggle').onclick = function () { setTimeout(function () { GM_setValue("WMEKMLayers_Beta", document.getElementById('cbKMLtoggle').checked); }, 0) }; document.getElementsByClassName('kml-toggle')[0].ondblclick = toggleKMLToggle; } //--------------- if ($('#user-details').length !== 0 && $('#cbKMLtoggle').length === 0) { kml[4] = 0; //reset counter var kmlBetaTogVal, kmlBetaGMType; //kmllog(kmlToggleArg); if (kmlToggleArg.constructor === Boolean) { kmlBetaGMType = kmlToggleArg; setTimeout(function () { GM_setValue("WMEKMLayers_Beta", kmlToggleArg) }, 0); } else { //insertKMLBetaToggle('disabled') kmlToggleArg = (kmlToggleArg.substr(kmlToggleArg.indexOf('-') + 1) == "true"); //bool kmlBetaGMType = 'disabled'; } (kmlToggleArg) ? kmlBetaTogVal = 'checked': kmlBetaTogVal = ''; doInsertBetaToggle(kmlBetaTogVal); // Disable toggle? if (kmlBetaGMType === 'disabled') { if (localStorage.WME_KMLSettings.indexOf('#b') !== -1) { toggleKMLToggle(null, false); // enable toggle } else { toggleKMLToggle(null, true); // disable toggle } } } else if ($('#cbKMLtoggle').length > 0) { kml[4] = 0; return true; } else if (kml[4]++ < 20) { setTimeout(function () { insertKMLBetaToggle(kmlToggleArg) }, 400); } else { console.warn('WMEKMLayers:', 'Unable to insert "Beta-Editor Toggle".', 'Element #user-details not found on page.') } }; //---------------------------------------------------------------------- var showKMLPrefsPanel = function () { //kmllog('showKMLPrefsPanel()'); var kmlInitStatus = !!(location.host.indexOf('editor-beta') + 1), kmlOptions, kmlSettingsUI; // setup checkbox list for UI kmlOptions = ['Show WME Beta Editor toggle in the left side-panel', //[0] 'Remove language specifications from clicked permalinks', //[1] 'Increase the opacity of city polygons to make them more visible', //[2] layer 1 - 1city 'Make area manager polygons more translucent', //[3] layer 5 - 5am 'Add a small amount of transparency to Roads layer', //[4] layer 2 - 2roads 'Disable checking layers at startup']; //[5] xx kmlSettingsUI = '<div id="KMLsettings" class="kml-panel-blackout">' + '<div class="kml-panel">' + ' <i id="iKMLsettings" class="icon-cog icon-4x pull-left fa fa-cog fa-4x fa-pull-left"></i>' + ' <h2>KeepMyLayers Preferences</h2>' + ' <hr class="kml-panel-hr">' + ' <div class="kml-panel-section">'; var selectedKML = Array(kmlOptions.length), allStr = ['b', '&l', '&1', '&5', '&2', '&x'], //beta, lang, city, am, roads, disable cbKMLSettingsStr; //kmllog('kmlayersBetaChk = ' + kmlayersBetaChk) //TODO: Clean the following code up.... if (localStorage.WME_KMLSettings === undefined) { localStorage.WME_KMLSettings = ':'; cbKMLSettingsStr = ':'; } else { cbKMLSettingsStr = localStorage.WME_KMLSettings; } // Setup KMLayers settings panel var kml_s, numKmlOpt = kmlOptions.length; for (kml_s = 0; kml_s < numKmlOpt; kml_s++) { (cbKMLSettingsStr.indexOf(allStr[kml_s]) !== -1) ? selectedKML[kml_s] = ' checked': selectedKML[kml_s] = ' '; kmlSettingsUI += '<div class="controls-container">' + '<input type="checkbox" id="cbKML_' + kml_s + '" class="btn btn-default"' + selectedKML[kml_s] + '></input>' + '<label for="cbKML_' + kml_s + '">' + kmlOptions[kml_s] + '</label>' + '</div>'; } kmlSettingsUI += '</div>' + '<div style="font-size: 9pt; font-style: italic; margin-left: 35px; margin-top: 0px; margin-bottom: 0px;">' + ' Does not include any of the above settings' + '</div>' + '<hr class="kml-panel-hr">' + '<div class="kml-panel-btn">' + ' <div id="KMLnote" style="line-height: 10pt; color: #D36343; position: absolute; left: 0px; display: inline-block; text-align: left; ' + ' width: 300px; vertical-align: middle">' + //line-height: 15px; height: 40px; '' + // notes and layers menu go here ' </div>' + ' <div style="position: absolute; right: 0px; display: inline-block;">' + ' <button id="btnKMLsave" style="width: 85px" class="btn btn-primary kml-panel-btn">Save</button>' + ' <button id="btnKMLcancel" class="btn btn-default kml-panel-btn">Cancel</button>' + ' </div>' + '</div></div></div>'; $('#map').append(kmlSettingsUI); kmlSettingsUI = null; // Notice about neding to save default layers if (!getSavedKMLayers()) { $('#KMLnote').append( '<span style="font-size:10px">' + 'To save a default layers setting, select your layers under the Layer Switcher menu and then click ' + ' <div style="color: #48758C; font-size: 11pt; font-style: normal; margin-right: 4px; display:inline-block" ' + ' class="icon-save fa fa-save kml-icn-nsave"></div> (bottom-right).' + '</span>' ); } else { // Dropdown menu of saved layer settings $('#KMLnote').append( '<div class="" style="display: inline-block; vertical-align: middle;">' + ' <select id="selKMLset" class="" style="width: 200px;"></select>' + ' <div style="display: inline-block; vertical-align: middle;">' + ' <div id="addKMLset" style="color: #AAAAAA; margin-left: 4px; display:inline-block; cursor: pointer;" class="icon-plus-sign icon-2x fa fa-plus-circle fa-2x"></div>' + ' <div id="removeKMLset" style="color: #AAAAAA; margin-left: 4px; display:inline-block; cursor: pointer;" class="icon-minus-sign icon-2x fa fa-minus-circle fa-2x"></div>' + '</div></div>' + ''); var kml_sel, numSets = myKMLayers.layerSetNames.length; for (kml_sel = 0; kml_sel < numSets; kml_sel++) { document.getElementById("selKMLset").add(new Option(myKMLayers.layerSetNames[kml_sel])); }; document.getElementById("selKMLset").selectedIndex = myKMLayers.idx; document.getElementById("selKMLset").value = myKMLayers.layerSetNames[myKMLayers.idx]; document.getElementById("selKMLset").onchange = function () { myKMLayers.idx = document.getElementById("selKMLset").selectedIndex; if (Object.keys(myKMLayers.visibleInLayersMenu[myKMLayers.idx]).length === 0) { document.getElementById("iKMLsaveLayers").classList.add('kml-icn-nsave'); } else { document.getElementById("iKMLsaveLayers").classList.remove('kml-icn-nsave'); } }; document.getElementById("addKMLset").onclick = function () { var newKMLayerSetName = prompt("Please enter a name", ""), newKMLayerOpt = document.createElement('option'); newKMLayerOpt.appendChild(document.createTextNode(newKMLayerSetName)); document.getElementById("selKMLset").appendChild(newKMLayerOpt); document.getElementById("selKMLset").selectedIndex = myKMLayers.layerSetNames.length; myKMLayers.idx = myKMLayers.layerSetNames.length; myKMLayers.layerSetNames[myKMLayers.idx] = newKMLayerSetName; myKMLayers.visibleInLayersMenu[myKMLayers.idx] = {}; document.getElementById("iKMLsaveLayers").classList.add('kml-icn-nsave'); }; document.getElementById("removeKMLset").onclick = function () { if (myKMLayers.layerSetNames.length > 1) { myKMLayers.layerSetNames.splice(document.getElementById("selKMLset").selectedIndex, 1) myKMLayers.visibleInLayersMenu.splice(document.getElementById("selKMLset").selectedIndex, 1) document.getElementById("selKMLset").removeChild(document.getElementById("selKMLset").options[document.getElementById("selKMLset").selectedIndex]); myKMLayers.idx = myKMLayers.layerSetNames.length - 1; document.getElementById("selKMLset").selectedIndex = myKMLayers.idx; document.getElementById("selKMLset").value = myKMLayers.layerSetNames[myKMLayers.idx]; } }; } var applyKMLayersSettings = function () { if (document.getElementById("cbKML_0").checked) { insertKMLBetaToggle(kmlInitStatus); } else { if (document.getElementsByClassName('kml-toggle-container').length !== 0) { setTimeout(function () { GM_deleteValue("WMEKMLayers_Beta") }, 0); document.getElementsByClassName('kml-toggle-container')[0].remove(); } } if (document.getElementById("cbKML_1").checked) { setTimeout(function () { GM_setValue("WMEKMLayers_Lang", true) }, 0); } else { setTimeout(function () { GM_deleteValue("WMEKMLayers_Lang") }, 0); } var storeStr = ':'; if ($('#cbKML_5')[0].checked) storeStr += '&x'; //disable KML if ($('#cbKML_0')[0].checked) storeStr += '&b'; //beta if ($('#cbKML_1')[0].checked) storeStr += '&l'; //lang if ($('#cbKML_2')[0].checked) storeStr += '&1'; //city if ($('#cbKML_3')[0].checked) storeStr += '&5'; //am if ($('#cbKML_4')[0].checked) storeStr += '&2'; //roads localStorage.WME_KMLSettings = storeStr + '&' + kmlVersion; localStorage.WME_KeepMyLayers = JSON.stringify(myKMLayers); //kmllog(document.getElementById("KMLsettings")) setTimeout(applyAdditionalKMLSettings, 0); if (Object.keys(myKMLayers.visibleInLayersMenu[myKMLayers.idx]).length !== 0) { userResetOfLayersToSavedKMLayers(); } document.getElementById("KMLsettings").remove(); }; document.getElementById('btnKMLsave').onclick = applyKMLayersSettings; document.getElementById('btnKMLcancel').onclick = function () { document.getElementById("KMLsettings").remove(); var tempResetHolder = myKMLayers.reset; myKMLayers = getSavedKMLayers(); myKMLayers.reset = tempResetHolder; if (Object.keys(myKMLayers.visibleInLayersMenu[myKMLayers.idx]).length === 0) { document.getElementById("iKMLsaveLayers").classList.add('kml-icn-nsave'); } else { document.getElementById("iKMLsaveLayers").classList.remove('kml-icn-nsave'); } }; }; //====================================================================== var initKMLButtons = function () { //kmllog('inside initKMLButtons()', '/'); if (document.getElementById("layer-switcher-list") && document.getElementById("iKMLsaveLayers") === null) { kml[6] = 0; //reset counter var panelHeight = 350, panelWidth = 540, kmlStyle = document.createElement("style"); // Create CSS container element kmlStyle.type = "text/css"; kmlStyle.id = "kml-css-container"; // CSS for KMLayers icons under Layers dropdown menu kmlStyle.innerHTML = 'div.kml-icn { position: absolute; display: inline-block; vertical-align: middle; ' + ' bottom: 0px; right: 0px; padding: 0; margin: 0px 10px 10px 0px; }\n' + '.kml-icn-nsave { font-weight: 400; color: #D36343 !important; } \n' + // '.kml-icn-save { position: relative; display: block; bottom: 45px; right: 0px }\n' + '.kml-icn-btn { position: relative; display: inline-block; padding-left: 4px; padding-right: 4px; }\n' + //right: 30px; top: 10px; 'width: 12px; height: 12px; '.kml-icn:active, .kml-icn:focus, .kml-icn:hover, .kml-icn.active { ' + ' text-decoration: none; background-image: none; outline: 0; ' + ' -webkit-box-shadow: none; box-shadow: none; cursor: pointer }\n' + '.kml-icn-off, .kml-icn-off:hover, .kml-icn-off:focus { ' + ' color: #B1D4DF !important; cursor: default !important; }\n' + 'span.kml-icn-btn { padding: 0; margin: 0px 10px 10px 0px; }\n'; // CSS for settings panel kmlStyle.innerHTML += 'div.kml-panel-blackout { position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; ' + ' background: rgba(0,0,0,0.5); z-index: 2000; }\n' + 'div.kml-panel-clear { position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; ' + ' background: transparent; z-index: 2001; }\n' + '.kml-panel { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); ' + ' width: ' + panelWidth + 'px; ' + //height: ' + panelHeight + 'px; ' + ' padding: 10px; margin: 0; overflow-y: auto; overflow-x: auto; word-wrap: break-word; ' + ' background-color: white; box-shadow: 0px 5px 20px #555555; ' + ' border: 1px solid #858585; border-radius: 10px; }\n' + '.kml-panel h2 { margin-top:10px; margin-bottom: 10px; font-size: 20pt; font-weight: bold; text-align: left; color: #C0C0C0 }\n' + 'div.kml-panel-section {display: block; font-size: 12pt; text-align: left; padding: 0px 5px; }\n' + '.kml-panel-hr { display: block; border: 0; height: 0; border-top: 1px solid rgba(0, 0, 0, 0.1); ' + ' border-bottom: 1px solid rgba(255, 255, 255, 0.3); ' + ' margin-top: 8px; margin-bottom: 12px; }\n' + '.kml-panel-btn { margin: 0px 5px 0px; padding: 0px 15px; display: inline-block; height: 32px; }\n' + 'div.kml-panel-btn {display: block; position: relative; padding: 0; width: 480px; margin: auto; ' + ' vertical-align: middle; height: 40px; }\n' + '.kml-panel ul>li {padding-bottom: 4px}'; // CSS for beta-editor toggle kmlStyle.innerHTML += '.kml-toggle-container { position: absolute; right: 10px; top: 10px; }\n' + '.kml-toggle { position: relative; width: 40px; ' + ' -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; }\n' + '.kml-toggle-checkbox { display: none; }\n' + '.kml-toggle-label { display: block; overflow: hidden; cursor: pointer; border: 2px solid #DADBDC; border-radius: 20px; }\n' + '.kml-toggle-inner { display: block; width: 200%; margin-left: -100%; transition: margin 0.2s ease-in 0s; }\n' + '.kml-toggle-inner:before, .kml-toggle-inner:after { ' + ' display: block; float: left; width: 50%; height: 19px; ' + ' padding: 0; line-height: 20px; font-size: 10px; box-sizing: border-box; }\n' + '.kml-toggle-inner:before { content: ""; padding-left: 5px; background-color: #FC6C70; }\n' + '.kml-toggle-inner:after { content: ""; padding-right: 5px; background-color: #93C4D3; }\n' + '.kml-toggle-switch { display: block; width: 22px; margin: 0px; ' + ' position: absolute; top: 0; bottom: 0; right: 17px; background: #FFFFFF; ' + ' border: 2px solid #DADBDC; border-radius: 20px; transition: all 0.2s ease-in 0s; }\n' + '.kml-toggle-checkbox:checked + .kml-toggle-label .kml-toggle-inner { margin-left: 0; }\n' + '.kml-toggle-checkbox:checked + .kml-toggle-label .kml-toggle-switch { right: 0px; }\n' + '.kml-toggle-switchD { display: block; width: 22px; margin: 1px 0px 1px; ' + ' position: absolute; top: 0; bottom: 0; right: 17px; background: #FFFFFF; ' + ' border: 2px solid #DADBDC; border-radius: 20px; }\n' + '.kml-toggle-innerD { display: block; width: 200%; margin-left: -100%; }\n' + '.kml-toggle-innerD:before, .kml-toggle-innerD:after { ' + ' display: block; float: left; width: 50%; height: 20px; ' + ' padding: 0; line-height: 20px; font-size: 10px; box-sizing: border-box; }\n' + '.kml-toggle-innerD:before { content: ""; padding-left: 5px; background-color: #DADBDC; }\n' + '.kml-toggle-innerD:after { content: ""; padding-right: 5px; background-color: #DADBDC; }\n'; document.body.appendChild(kmlStyle); kmlStyle = null; // Add save layers icon to Layers switcher dropdown panel var kmlDiv = document.createElement("div"); kmlDiv.className = "kml-icn"; kmlDiv.innerHTML = '<a href="javascript:void(0)" class="kml-icn"><div id="iKMLsaveLayers" class="icon-save fa fa-save kml-icn-btn reload-button" data-toggle="tooltip" title="Save Current Set of Layers"></div></a>' + '<a href="javascript:void(0)" class="kml-icn"><div id="iKMLsettings" class="icon-cog fa fa-cog kml-icn-btn reload-button" data-toggle="tooltip" title="Preferences"></div></a>' + '<a href="javascript:void(0)" class="kml-icn"><div id="iKMLresetLayers" class="icon-magic fa fa-magic kml-icn-btn reload-button" data-toggle="tooltip" title="Reset Layers to My Default Set"></div></a>' + '<div id="iKMLtempUndo" class="icon-eye-open fa fa-eye kml-icn-btn reload-button kml-icn-off" data-toggle="tooltip" title="Toggle Layers from Permalink"></div>'; document.getElementById("layer-switcher-list").parentNode.insertBefore( kmlDiv, document.getElementById("layer-switcher-list").nextSibling); kmlDiv = null; //------------------ Setup event listeners ------------------- // buttons under layer menu document.getElementById("iKMLsaveLayers").onclick = saveKMLayers; document.getElementById("iKMLsettings").onclick = showKMLPrefsPanel; document.getElementById("iKMLresetLayers").onclick = userResetOfLayersToSavedKMLayers; $(".kml-icn-btn[data-toggle=tooltip]").tooltip(); //{ placement: 'bottom' } // doubleclick layer menu shortcut for KMLayers preferences panel document.getElementById("layer-switcher-menu").ondblclick = showKMLPrefsPanel; // Insert beta/prod toggle var kmlBetaToggle = GM_getValue("WMEKMLayers_Beta") if (localStorage.WME_KMLSettings.indexOf('&b') !== -1) { //normal beta toggle setting insertKMLBetaToggle(kmlBetaToggle); } else if (localStorage.WME_KMLSettings.indexOf('#b') !== -1) { // temporary disable of toggle is active insertKMLBetaToggle('disabled'); } // Make save button red if nothing saved //kmllog('Checking for localStorage.WME_KeepMyLayers_lV'); setTimeout(function () { switch (true) { case !myKMLayers: case !myKMLayers.visibleInLayersMenu: case !Object.keys(myKMLayers.visibleInLayersMenu[myKMLayers.idx]).length: document.getElementById("iKMLsaveLayers").classList.add('kml-icn-nsave'); break; } //kmllog('Done checking for localStorage.WME_KeepMyLayers_lV'); }, 300); } else if (document.getElementById("iKMLsaveLayers") !== null) { kml[6] = 0; return true; //icons already inserted into page } else if (kml[6]++ < 20) { setTimeout(initKMLButtons, 500); } else { console.warn('WMEKMLayers:', 'Unable to insert WME KeepMyLayers under Layers menu.', 'Element #layer-switcher-list not found on page.') } }; /* var initPermalinkReplacer = function () { // make sure the welcome log-in screen is not up //document.getElementById("welcome-popup").className.lastIndexOf('hide') === -1 if (document.getElementsByClassName('WazeControlPermalink')) { var kmlAltBetaKey = !!(location.host.indexOf('editor-b') + 1), //if beta, then true kmlPLselector = eval('document.querySelectorAll(\'a[href*="waze.com' + location.pathname + '"]\')'), //NOTE: this returns an array kmlPLElement = eval('document.querySelector(\'a[href*="waze.com' + location.pathname + '"]\')'), kmlPLhref = kmlPLElement.getAttribute("href"), kmlNewPL = kmlPLhref.substr(kmlPLhref.indexOf(location.pathname)), toggledBetaKey = false, numPLsOnPage = kmlPLselector.length, kml_sel, fuckingNode; var updateWMEPermalink = function (kmlNode, togSuffix) { if (kmlAltBetaKey) { //if true, then beta-editor, so change PL to prod kmlNode.setAttribute("href", 'https://www.waze.com' + kmlNewPL + togSuffix); console.log(kmlNode.getAttribute()); } else { // else, production editor kmlNode.setAttribute("href", 'https://editor-beta.waze.com' + kmlNewPL + togSuffix); console.log(kmlNode.getAttribute()); } }; var fuckingJSConstraints = function (ee) { for (kml_sel = 0; kml_sel < numPLsOnPage; kml_sel++) { fuckingNode = kmlPLselector[kml_sel]; this['kml_' + kml_sel] = function (ee) { //kmllog('fuckingNode = ') //kmllog(fuckingNode); if (ee.altKey) { toggledBetaKey = true; updateWMEPermalink(fuckingNode, '&b=0'); } }; } }; var fmlIHopeThisWorks = new fuckingJSConstraints(), kmlNode, kmlIndex; //FUCK = fmlIHopeThisWorks; for (kml_sel = 0; kml_sel < numPLsOnPage; kml_sel++) { //kmllog(kml_sel + 'A - kmlPLselector[kml_sel] = ' + kmlPLselector[kml_sel]); kmlIndex = kml_sel; kmlNode = kmlPLselector[kmlIndex]; kmlNode.addEventListener('mouseover', function (e) { window.addEventListener("keydown", fmlIHopeThisWorks["kml_" + kmlIndex], false); }, false); kmlNode.addEventListener('mouseout', function (e) { if (toggledBetaKey) { toggledBetaKey = false; updateWMEPermalink(kmlNode, ''); window.removeEventListener("keydown", fmlIHopeThisWorks["kml_" + kmlIndex]); } }, false); } //kmllog('6 - kmlPLselector = ' + kmlPLselector); } else { setTimeout(initPermalinkReplacer, 500); } }; */ //========================================================================== //kmllog('Stepping into initKMLButtons()...', '/'); initKMLButtons(); //initPermalinkReplacer(); //========================================================================== window.addEventListener("beforeunload", function () { if (localStorage.WME_KMLSettings !== undefined && localStorage.WME_KMLSettings.indexOf('&x') === -1) { // user has NOT set WMEKMLayers to be disabled resetLocalWithKMLayers(); } }, false); // ~~~ TEMP (clean-up) ~~~ localStorage.removeItem("WME_KML_Settings"); GM_deleteValue("WMEKML_Beta"); GM_deleteValue("WMEKML_Lang"); //kmllog('Done performing cleanup') // ~~~~~~~~~~~~~~~~~~~~~~~ var kmlNoticePanel = function (kmlPanelType, kmlVersion, kmlNoticeText, kmlForumURL) { var kmlNoticeUI = document.createElement("div"); kmlNoticeUI.id = "divKMLnotice"; kmlNoticeUI.innerHTML = '<i id="iKMLnotice" class="icon-exclamation-sign icon-4x pull-left fa fa-exclamation-circle fa-4x fa-pull-left"></i>' + '<h2>WME KMLayers Update</h2>' + '<hr class="kml-panel-hr">'; kmlNoticeUI.innerHTML += '<div class="kml-panel-section" style="font-size: 10pt">' + kmlNoticeText + '</div>' + '<div style="margin-top: 6px; font-size: 10pt">' + 'For details and screenshots of new features, please visit the forum post <a href="' + kmlForumURL + '" target="_blank">here</a>.' + '</div>' + '<div style="margin-top:10px; font-size: 8pt;"> ' + 'Note: This is a one-time alert for WME KMLayers v. ' + kmlVersion + '</div>'; kmlNoticeUI.innerHTML += '<hr class="kml-panel-hr">' + '<div style="position: relative; width: 70px; display: block; left: 148px; bottom: 0px; margin: 10px; vertical-align: middle; padding: 0">' + '<button id="btnKMLokay" style="width: 70px" class="btn btn-primary kml-panel-btn">OK</button></div>' + '</div>'; switch (kmlPanelType) { case "child": //requires also opening the settings panel beforehand kmlNoticeUI.className = "kml-panel"; kmlNoticeUI.style.width = "500px"; kmlNoticeUI.style.height = "270px"; document.getElementsByClassName("kml-panel")[0].appendChild(kmlNoticeUI); break; case "blackout": kmlNoticeUI.innerHTML = '<div class="kml-panel" style="width: 420px; padding-left: 15px; padding-right: 15px;">' + kmlNoticeUI.innerHTML; kmlNoticeUI.innerHTML += '</div>'; kmlNoticeUI.className = "kml-panel-blackout" document.getElementById("map").appendChild(kmlNoticeUI); break; case "clear": kmlNoticeUI.innerHTML = '<div class="kml-panel" style="width: 420px; padding-left: 15px; padding-right: 15px;">' + kmlNoticeUI.innerHTML; kmlNoticeUI.innerHTML += '</div>'; kmlNoticeUI.className = "kml-panel-clear" document.getElementById("map").appendChild(kmlNoticeUI); break; } //document.getElementsByClassName("kml-panel")[0].appendChild(kmlNoticeUI); document.getElementById('btnKMLokay').onclick = function () { document.getElementById('divKMLnotice').remove(); localStorage.WME_KMLSettings += '&' + kmlVersion; }; }; if (localStorage.WME_KMLSettings.indexOf('&' + kmlVersion) === -1) { //Display update notice var kmlNoticeText, kmlForumURL = "https://www.waze.com/forum/viewtopic.php?f=819&t=172335&p=1304954#p1304954"; kmlNoticeText = 'Woohoo! Another update! This update to version 0.4 brings you the following new beta features and bug-fixes:<p>' + '<ul><li>Thanks to rickzabel\'s help, the bug that caused part of the URL to repeat itself <i>ad infinitum</i> has been found and squashed</li>' + '<li>Double-click on the beta/prod toggle to quickly disable/enable</li>' + '<li>Press <b>Alt</b>-key once while hovering the cursor over any PL within the WME window to switch it to the alternative editor (i.e., beta or prod) </li>' + '<li>Within the preference pane, you can now add additional sets of layers to accommodate various editing contexts </li>' + '<li>Double-click on the WME Layer menu icon for easy access to the KMLayers preference pane</li>' + '</ul>'; kmlNoticePanel("blackout", kmlVersion, kmlNoticeText, kmlForumURL); } //KML = myKMLayers; }; //////////////////////////////////////////////////////////////////////////// function waitForWazeMap_KMLayers() { var waitCount = 0, maxWait = 100; //5 seconds //kmllog('Waiting for Waze...', '/'); var tryInit_KMLayers = function () { try { if (waitCount < maxWait && "undefined" !== typeof (unsafeWindow) && unsafeWindow.$ && unsafeWindow.Waze && unsafeWindow.Waze.map && unsafeWindow.Waze.map.layers ) { //kmllog('Initializing...', '/'); KeepMyLayers(); } else if (waitCount++ < maxWait) { setTimeout(tryInit_KMLayers, 50); } else { //kmllog('waitCount = ' + waitCount, '/'); //kmllog('typeof Waze = ' + typeof(unsafeWindow.Waze), '/'); //kmllog('Waze.map = ' + !!unsafeWindow.Waze.map, '/'); //kmllog('Waze.map.layers = ' + !!unsafeWindow.Waze.map.layers, '/'); console.error('WMEKMLayers:', 'KeepMyLayers could not find necessary Waze map objects.'); } } catch (err) { console.error( 'WMEKMLayers:', 'WME KeepMyLayers failed to load', 'due to some kind of technical script error. :('); console.error(err); } }; tryInit_KMLayers(); }; //////////////////////////////////////////////////////////////////////////// document.onreadystatechange = function () { //kmllog('<' + document.readyState + '>', '/'); if (document.readyState === 'interactive') { //kmllog('Inside DOM interactive event interval.', '/'); setTimeout(waitForWazeMap_KMLayers, 0); if (localStorage.WME_KMLSettings !== undefined && localStorage.WME_KMLSettings.indexOf('&x') !== -1) { // user has set WMEKMLayers to be disabled console.log("WMEKMLayers:", "Autocheck of KeepMyLayers at startup is disabled (1)."); } else { resetLocalWithKMLayers(); } } }; })();