// ==UserScript== // @name GCComment // @namespace http://www.birnbaum2001.com/gccomment // @description Add comments to your geocaches on geocaching.com. // @include http://*geocaching.com/* // @require http://crypto.stanford.edu/sjcl/sjcl.js // @version 60 // @author Birnbaum2001 // ==/UserScript== /* History - 2010-04-02 22:00 started hacking a bit - 2010-04-02 23:30 worked :) - 2010-04-03 0:25 changed saving by GCCode to GUID - 2010-04-03 0:58 included icon to show on overview pages (copied some code from gcvote for branching depending on URL) - 2010-04-03 1:15 hotfix. changed GUID parser from substring to substr because full detail URLs contain more than just the GUID after guid= - 2010-04-05 0:44 kind of tooltips are created by mouseover - 2010-04-05 0:47 weniger Zeilen, wenn kommentar vorhanden, dann gleich auftoggeln - 2010-04-05 0:50 Notizblock in Suchseite - 2010-04-05 12:11 comment-list & delete function - 2010-04-06 hotfix for nullpointer in detailpage without existing comment - 2010-04-29 added some icons and changed detailpage to readonly and editmode - 2010-04-30 integrated real tooltips - 2010-05-02 content for tooltips is loaded when tooltips are shown - 2010-05-02 added timestamp to new comments - 2010-05-02 added check for updates - 2010-05-04 added import/export, cancel editing, copy from gcnote - 2010-05-17 small improvements by Schatzjäger2 ('hand' mousepointer and action on mouseout instead of mouseover - 2010-05-19 exchanged save and delete buttons and inserted javascript popup to confirm deletion - 2010-05-24 import/export handles XML characters - 2010-06-16 fixed gc layout update on cache detail page - 2010-06-20 implemented first version of server sync - 2010-07-31 cleaner code style (comment as object), waiting for gctour to finish before inserting comments - 2010-08-05 comments can be categorized and filtered on overview table - 2010-08-13 stats on gccomment-icon, server storage available, delete all button - further comments and changelog on http://userscripts.org/scripts/show/75959 */ // version information var version = "60"; var updatechangesurl = 'https://gccomment.svn.sourceforge.net/svnroot/gccomment/trunk/gccomment/src/version.xml'; var updateurl = 'http://userscripts.org/scripts/source/75959.meta.js'; // UI Elements - Profile page var configDiv; var commentTable; var importDiv; var patchDiv; var importText; var importresult; var gccRoot; var displayFilters; var waitingTag; var filter; var serverImportLink; var serverExportLink; var listener; // UI Elements - Detail page var detailCommentDiv; var detailCommentTextArea; var detailCommentTextPane; var detailCommentInputLatLng; var detailCommentLastSaveTime; var detailCommentCacheState; var detailFinalInputLatLng; var detailFinalCacheState; // Buttons var AddComment; var SaveComment; var EditComment; var DeleteComment; var CopyComment; var EditCancelComment; var SaveFinalCoords; var DeleteFinalCoords; // Detail page comment details var currentComment = null; var currentCacheGUID; var currentCacheCode; var currentCacheName; var currentCommentOrigLat; var currentCommentOrigLng; // general script variables var DELIM = "#gccom#"; var COMPREFIX = "gccomment"; var COMGCPREFIX = "gccode-"; var DEG = String.fromCharCode(176); var DEFAULTCOORDS = "<N dd" + DEG + " mm.mmm E dd" + DEG + " mm.mmm>"; var stateOptions = new Array("-", "not solved", "solved", "found"); var LAST_IMPORT = "lastimport"; var LAST_EXPORT = "lastexport"; var INDEXBUILT = "indexbuilt"; // preferences var AUTOMOVEMYSTERIES = "autoMoveMysteries"; var AUTOMOVEMYSTERIESBETA = "autoMoveMysteriesbeta"; var AUTOMOVEMYSTERIESBETAFOUND = "autoMoveMysteriesbetafound"; var AUTOMOVEMYSTERIESBETASOLVED = "autoMoveMysteriesbetasolved"; var AUTOMOVEMYSTERIESBETAHOME = "autoMoveMysteriesbetahome"; var ADDCOMMENTSETTING = "addCommentSetting"; var CHANGEORIGINALSETTING = "changeOriginalSetting"; var ADDWAYPOINTSETTING = "addWaypointSetting"; var PATCHGPX_CHANGEORIGINAL = "patchGPXChangeOriginal"; var PATCHGPX_ADDFINALWPT = "patchGPXAddFinalWpt"; var ENABLE_EXPORT = "enableExport"; var PATCHGPX_REMOVE_SOLVED = "PATCHGPX_REMOVE_SOLVED"; var PATCHGPX_REMOVE_UNSOLVED = "PATCHGPX_REMOVE_UNSOLVED"; var PATCHGPX_REMOVE_FOUND = "PATCHGPX_REMOVE_FOUND"; var PATCHGPX_REMOVE_OTHERS = "PATCHGPX_REMOVE_OTHERS"; // icons var gccIcon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAwUExURdPer+b9v0mis4rElNjQMVyuXfvzR+O+c0BOO+egPfT93X2FbL/Z3qaxkODo4J2EMhLWxjYAAAB9SURBVHjaVMwJDkMhCATQQawgLtz/tl/kt0mHjMtLFK22Wmuz/blhNHfXP2iqZ7Gl+gVXIyJbQxOqwt4gAUZnXjkQtzVgWOcERrwPMYz7FWYARjQAKBzbypIISgiQlR5QGHTD0hOK6gDEvQdwyrTeE0pm/2BmtmHH7EeAAQAb9gXg4KzWZAAAAABJRU5ErkJggg=='; var commentIcon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAARFJREFUeNqkU03OREAQbXwRseAYnMy3sJO4BJYsuJQlFm4h/unp10kLZiY6mUqeblX9XlWXolBKyS/2JzZZluVs8SAoRM+rgK7rhe/7/4cCnGma0rquqYzhHM4fidhLLksWVlUVRHIIqOzhOY4jdV8QhmEgruuSrus8+FTZJq7rSvq+5wIfm3jPtG3bhTzPM8eyLFeBewX7vpNpmjhJiGEPInD2v1WA4DiOh4DoNPYAqjIM44jxHmiaVjRNw4m4I8AadAF8iJumSWzbJm3bEsuyisc5KMvycQ4UUQomkZXuiesEQcDXOI55XwQBmd8m8Y4kSXi2KIrop/gZ6rfPiMxhGCpP8/FVQIYMU379nV8CDADQEaUK/jLo9wAAAABJRU5ErkJggg=='; var commentIconEdit = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAYJJREFUeNqUU89LAlEQnn27BMKyNzsmnvYP6FJ3b0XgPei2Ed4M6yheJFaDiPWgB5GIrkHU/9Cha+YmQkpQ2SVEZV3E15uBt2j+SAeGj5l533zzfimcc1jC1oXvCt+w9vfSmChd32UEtBTZoFAoFAVYGMscYigUgmg0CrquQ9nJwnncp9rx7Ro1oQaCzGOxGJimOXcEoRyQnz8ZVD8YPL4xUMPhcFGQN1cho313FXj/UYCJCaxVyVIdt8AWHeIi8sHRKYYttoicsXegux2fpQydTgdT91MTjEYjGA6HQexWv8AztwKy7VxRvl6vI7QnJkBiv9+HwWBAcfrkgfD1pU3ks8sKXS2u6/V6VNNUVS25rmtFIhHwfR88zyOUdlN5IsxelIExBpqmQaPRAMMwSsFjcRyH12o1/teazeZUDtfhevngJl6iGN2SyslkkjCXy9G5SAIqJxKJw2BEWRj3fD5ParZt81n1cZ95jVhA5VQqpfz3y+Y2WIaMpiz5nefarwADACQFMs6fhMd+AAAAAElFTkSuQmCC'; var commentIconDelete = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXpJREFUeNqUUr9Lw1AQvpd2qFFaRBwFHaQ46x8g0jooQqGjexy6BfpPtB3TweziYkX8tQiOrhkcTIbi4CgilKRJIc3z3YN7pLU19eC4e/fuu/vu3mOcc8iSj9M6+EHIV5aXGMXonKdAt9s9F8bAglSUbDUIFei5emwfPD0Yn1EEQjnDJAHmlUoFyuXyXBZvtSPlIxhla22Vadg5C4yyc/Oo/PVCAV5P6jb6mmBgZIGJAXVGwTGowL/Am5c9Ncb71zfXZgGwaBzHUsfjMWxf3cr43vU9hGGoxpE7mGaQJAlEojomogZBIO1u7w6GwyEMBgOZ97J/CBsXPcinwdgRwaPRSPr0pGk2BbFAupM7yOVytud5EogdUH3fn1CM4b2u61AqlaDf70OxWLTVvJZlcdd1+bQ4jvMrhnmYT+wYUcH/IKgbNI5pmtK22225FwJg50ajcTax8WntdDqyW6vV4rPu0zr3GbFzs9lkWX9kboFFwChskZ/4l/wIMADyMlZUy0YWOAAAAABJRU5ErkJggg=='; var commentIconDeleteAll = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAYUExURe6trfLy8tHR0Y+Pj7GxsQAAAIjuhv///20imzoAAAAIdFJOU/////////8A3oO9WQAAAGtJREFUeNpcjwEKwDAIA9Xo/P+Pl9iugwaq5KpgrC9ZV+KoS6CCekZFkDlke7QhQmT5ZwGR5QcYVeWu5x8goY/4AUl4zESeCfogaOx/7UCXNlBlroo5vXkrDNMXYAcmmIhNxY6qLHf8V4ABAESSBHQ3l0TpAAAAAElFTkSuQmCC'; var commentIconSave = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAZBJREFUeNqckz1LxEAQhmeTNGIjWliJIKKltWCjWAgWWihW1hYHgthb2Fmo1aE2dld5wtlZCFoINv4C/8EVnk0u2a8k7jvJHmejOQeGbDLvM7s7MxFFUdD5Taegf9jxwbYQZ812sbyyTr3PLm2tLtQCH54/aHJqmt5enyjIsoyMsWSNqQVDDy0YrKPMWveinZs/QWi0LrVgwEbIhI/wYcvznIW8oxPCsYZ7PdgImZSCK0JBEcC63MUwiGRwb4iDARtBxB8cmCQJpWlKUkpO5HdFYlgQBBSGIWv9JpHmBJKUg65bL7VbCEZzApdNSkVj4xMjzQAYsJHR5Qm8fbl5+M3iuM/Pmdk5Ajs4AcO9LjX210gIwQ7D/X0NUMgrd81+HA9OEKCSWit2FAZ2enlHt/fvg+rDfft8B6Avu+Aq7UFdtbIUKQbxbnnYypbqKsZdwCDZaro4gXsC8oNiq+R+oIaHiOPoQqd1ITb3Dov5xSVuC6CTo10Wx3xX+WMWdDVg7E4rfGBjpzHyL/3YbopvAQYALTKvvIqUmbwAAAAASUVORK5CYII='; var commentIconAdd = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXxJREFUeNqMU7uKwlAQnRgLsYitsB+QZn/BQggo+RC3CKQQUqW1UhuDIvohmr+w2cIUlrtNEE0UH/gY78x6ZeP7wDDDZE5mTmYCiAivrFQqsa/Vaj8iRvIyr1BA6HQ6PeEqkkQgr2kaRFHEse/7oHufENjfFCtUkz6T0TAM0HUd7sHzPBgOh4lcuVzGQqHwq7Tb7Z4gVx6Rz8Xc+Ro0SVqM9pRMME0TBvaAYymBQBOkpN5nsG37RkKxWATXdT9S9wj00v1+f7HNZgO73Y6lUHeaSEqDVquF/3E4HHC1WmEcx2xiAzidTjEMQ1wsFrher7mu2+2S+9uChOy23W45liuVk8znc8hkMpDP52E2mzEnpapqPwgCJorObMvlMmGUo+fZbBZyuRxMJhO6j/5Fr1gljsdjvMZoNLrJUR3Vy+kSlyhGr0g51WqVfaPRgOPxeJFDnS3L+kp88WtrNpvcrV6v46v/5OEaqbPjOMqrG3n4gnfIBOWdS3yGkwADADDQiUjr02VlAAAAAElFTkSuQmCC'; var commentIconCopy = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUJJREFUeNqckj2Kg1AQxyebrQNWHsBSLCQgiJaiZzEH8A56gBXvYCtoLfZ2KUwsPEM+/HYzj/h2JWogAw/GefN+/5lxNrZtmxzH/cCKnc/ng2VZ7uyl7/vDO3vmwNz5XlI9nU7Uv16vi9VRQJIkNMiyLKRpCnme05jjOMPMe3exAnz86HttNAg1v+BDw/4nLSiKQi+PxyP1oyiivmEY9FtV1dcZILXrOmAYZlFZ13W43+9wu92mAFmWoa5rqKoKsixbLDsIAiKy3+//ABiI4xjatiX+breblD3a5XIBSZKoEAWUZQmCIJAgXhZF8TIDhDdNQwT6vif5BIBrGobhZJX/L46mabRnjKMIQhBIAM8dd2f+8YBJDzhJHg+qo/E8Px3inKGiKIpEHavAVhGw3W4paA3gep5nvtkndzNu1Kf2K8AAAxf9KklDG6EAAAAASUVORK5CYII='; var commentIconEditCancel = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAAAFnRFWHRDcmVhdGlvbiBUaW1lADExLzA1LzA33bqJ2wAAAx9JREFUeJxVk09om3UYxz/v722ydEmb2HYiS50dWDdT5sS1uoOitTo7LSMFFRHRwnbaSUFBpzgsDHGX1YvgofUg7CIutd2GTIR2A1vcULN2rTYwti7tivRP0vRPkvf9PY+HFmm/1+9feHgcVWUrbr76+BNOMPgFxm1W49aLWKRcykq5dEPLpdMtQ/dubtU7WwPGO59MYdxk8f40Xn4Ja+0GYVzccAQnWgO+3394aLpzW8D02Q9DhevDGW9pvn41e4fA7gZqXkoS3n8QVWFl8i8Wfh3Am72LidXCjlB2ra6+8ciF0SKqyljyYOrPtga9tg+d/LhLvfySirUqXlltqah2fVXX57I6O3heR57fo0OHYjr8TF1KVXHGX29uUZHf87f+oLazi/1ffoeKMNZ7juzoMOXlHAfePUlD61FUhL+//4b7X3+GidXiqD5dIaXimdL8HE5VjEc/OYeK8MNrTzE/kabSQLg6Smz3w6gIiGVvx5vcPv8tVfl/kUDwjHFClQkvv8Su5Hu4kWrG+nqYn0gTdSFSHeXFvktEGxMsTqb57atPQZQHnj1C2SvjqZMwIhq31rIj/giI5faVn6g0EKyK0tp3iVhjgoXJNAPHk+SmxgnsDFPTmGDFKr5I3IhsnkpkY6Yqkert5sHjSfyVPGGj/+uKAiqWCvH9GYwbL87cAbE0tHVQ1fn2hnkizeCJJH4hT8SF+HOvoGJZmLq10WntjHO9be8VL7/4si9Ky+UJAuEIKsLiRJqBExvNEQN1jzXR2nsRbznHha4OQguzhF3zi1E3cMqJ1qAry2TOfoRaAWtZnpnmwX1NJFrbaX7/NK29F0GEkZ5u1uZmqDAGK3LKUVVGX9iT8tfXkn5ugZ3tb9H0QTfBzSWIRUXwlnOM9HST+TlFXcAh5NB/LCOdjqpy9Z22kJn+J2PXVuu1kKMQqibW/gbhh+KgSmH2HpnLP+KvFqgJOAQdsrNlbTx5V4vbnunq4V0pTzRp1lawXpm8VcqbtOs4BFyDK9J/LCPbn2krhg9FD/hKty/a7InWq1iwNuuIveGqfH50Ssa26v8D7vnE690mEL0AAAAASUVORK5CYII='; var waitingGif = 'data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkEAAoAAgAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAwAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAFACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQACgAGACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA=='; var errorIcon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAtZJREFUeNpUU7tLI2EQn3y72TWJutnERCRHtBEL8URIUCy0sTsQ7a6xsbG8IsWBl0qut4hgd839Baaw0ubA4k7kCtEQuEAS0DMPjXnt43a/zc3sZcX7YPgeM/Ob3zw+n2ma4K1fx8fzlmlmdV1f+2OacdMwRFEQbL8s11G+iaL4eSGTufHsJUkCnwdQzOU+af3+B2l0NKaEwxBkDPz4bg4G0LMseGo0wOh2uwFFOVrKZPb/A3CdNe1jZGpqTNV1sB8fYYA7t20AQQAIBEBQVWjiuV6t2koy+fXt3t4uAQjvo9H5bqdzHE0k1PDTE1j398A1DRzOQd3Zgd7VFTgE2ulAQBQBolHWLJcXOGN3sdnZnwwZZIl2GJ2seh0cjOogPWVrC0JLS6BubwPHNIiNiXrVcUCUZbFVKBxUKpUYMzRtjXLmGJ2MyNhBGQwLRTvdPRAL7SKTk9CqVBKc802m9/vxABbMJtpDxwEZ452W3e8DfwVk4XtoZAQ6lCrnG8zUNFFCAEIfDKNTNKvd/geAOzl7zDh2RPL7QcOaOI6TxjYLtsG5OMAKk9KL1Lq4cIXOzpAV6XxopxsG+JEFMphmgiTVuzQL+OBFd4u4ugpzuZy7O8PoJD5sabvXg+DEBAFUmIQT1nx4ABaJgIPoHgM2Pu6mICjKizOxFNHuoVwGZXaWUrgUBRzPdqv1rqEoY2o8Dkat5raydnoKWrUK7etr15kGSkZ9DYuqdbvwZnmZGJyxdDZ7E1LVo9+lkt3E4kjJJAjYVh9OWfv2FkCWwY/3wMwMNHEG7opFmFpfB6YoJ8gg//IXvh8efmmWSjtyMChOJBIwirnSqBqo72DEGtLWMHdyVlKpH1jU/VQqde57/Ruv8/nd52Lx4BmHhPqso6MUDEIoFgN1bg7UlRWqyQk65xYXF8/dz0Tteb0KhUIMqW2ibKAujfs0SgXPlyhnKPl0Ot3w7P8KMAB6SM2aovTkagAAAABJRU5ErkJggg=='; var successIcon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAAAFnRFWHRDcmVhdGlvbiBUaW1lADExLzA1LzA33bqJ2wAAAmFJREFUeJyNk89L1FEUxT/vfcfRkdG0yRZqIYiCgmVorloUhCAkKLQxguwvSKiVUJYgFLSwZW3Kje7S3AgRiNQiTDQVhyhE0RkzTPwx4zjfmXnvtpgaZyCss3vvnXPPvedxlYiQjbql6+e8Ku+RI7rZQVcaa3BtIuTa5IxrE33rTRML2XyVXaAxeGPUUbpjzd1kx0QwGAAcNH58BKSYpE2NrbVMdOYUuBcaLJiKzH77mdqtXE1scBwCpgif8YYqDk7WfLw6EtcA7/anR/5HDLDtRIiqw8rlgs0RANUcvHnRItOzsS//FHcH2llJhJmKzHLqwI+1tkXHbWJgzd08Vni5qImVhnEEYerHJ3AtUW+cpDID2qfy63dMJEOu8pbTWFibOQ+euctk7XMGw8MMLb1OX+ZrXI9BJaVei0jFn7QBXlb10V3aTon4Ga1+yp3TXYxtTfJsYQj8DhQ6AIgSrLEV6sJCl8wlvgLQWFjLXN0wADupfUo9xeymIlS9bWXPE4NAXs5ovi2NTlkTdtAA3ApcyzyWeooB6Fl4wp6JQmmuWAkYa8I6amNBPz4AHm684NX38QxpNbbB0PobKPHw2+OoQByMxwZ1nnV6A5J22zNRbof66V66z24yQs/iY/CozNzZ0BGDTZpeJSKcnW4bjRHv2HaOfuO8qmY+HEy37su11/sWiZsx2zbfqQFq3PIun/GGSpKFGdK8LEOZ9+/imAnJymFXOousZSr7cGUUKx1RbxzXYxAlmcBUPN22wY7ZtvncZcrGifeXGjDSL0aaJWUrjVgMJmSUnbFKHtjWz4vZ/F9iIi867oQHZwAAAABJRU5ErkJggg=='; var state_default = commentIcon; var state_unsolved = 'data:imag/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuNUmK/OAAAAEoSURBVDhPrVPHSgNRFM3XJ8P0RpJJ75AGKT/hTlFRUWyoCwu6EHV5nHPHZ2KiJAwOnN1p9747mcx/fWEYRjEQBAF83xd4nidwXReO48C2bZC3lknhXqGAj/l8I8gj/9uEjtuKVcBuPr9owsrbJJPzPpvheTQSvqZpSQvOuo3B62SCp+EQd73eZgMmUaDwMh7jvt/HTaeDi2bzpwG3vNzgbTqVmg+xgKCQqVetFs7qdRxXKsLP5XLJCMsGTHwcDHDb7YrgMgYTT2s1HJXLOIgiMSEvm80mBuoVVM3rdhsn1SoOSyUR7BeL8sTc/HmjIa2+nnJxD3/dwc7KeKy+dgfqINjEsiwoqL3oui5PxplZ+9dLXD1N0zRlURSn+lUMw0gvZmLq5DR1PwE9E+oxQiT4SQAAAABJRU5ErkJggg=='; var state_solved = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuNUmK/OAAAAEqSURBVDhPrVPJToRAEJ0fNmZkERgIiEIj+3bxezypUaNG4+7BJXow6heUXdX2zCiaIUSSd3tbdRWj0X99bdtucUDTNFDXNaGqKkJZllAUBeR5DsjrZKJQ3VuB+IMtBPKQPzVBx75iGaDujmdNsHKfZORsvocQPPvEj6JItMBZ+xiw1w1Yf1oD785ZbIBJKJAIXnzw711wb2ywL8zvBvjK8w2it4Bq+g+eABdiqnNlgXVmgHGsEZ8xJkaYN6Cajx64tzYJ7EsOnmidroJxpIF+oJAJ8sIwFAZyC7Kmcz0B80QH/VAlgbav0IqVnTFMzk1q9bXK2T38dQfL20udB+7cgTwIbJJlGUhM3yWOaWU4M9b+9RJ/nmaapiKZiwf9KkmSDBdj4uDkIXU/Ae1xwo0cXQQMAAAAAElFTkSuQmCC'; var state_found = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuNUmK/OAAAAESSURBVDhPrVNJaoRQEO3TqzhPmxzAjYrihAMqqCiIeqZKV9k/3YkJLRLh7d5Uv8rb7b8+27Y/7gDLssA0TYJhGARd10HTNFBVFZB3yESh7/uwbdtbIA/5XyboeFbMAjzPezbBymeSkbOuK4zjSHxBEPYWOOsZg3meYRgGaNv2vQEmoYBhmiboug7quoaiKL4b4Cu/NliWhWr2fU9AIaaWZQlZlkEcx8TneX4f4dWA1WyahgQITEzTFKIogjAMyQR5HMftBmwLrGZVVZAkCZERQRDQil3XhTzPqdVjlc97+OsOHMc5PPDhDthBYBNFUYCBvYsoirQynBlr/3qJP09TlmVKRvGlX0WSpOtiTLycfKXuJ+0c7jtCU1KuAAAAAElFTkSuQmCC'; var state_clear = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuNUmK/OAAAAFkSURBVDhPrZNLa8JQFIT9yy1uC30mNr4fIBXcKC6UCD7+RYvYRQlBwbRaY2pIbSxtKC6mOcdGY7RQQi/M4obMN3PPTSKR/1qFQuHGFfL5PHK5HCubzbIymQzS6TRSqRTcdxZ7mWSUZRm9Xm9Hki0iqOjdMUGwgVDyITPBDgHoWfT2aNuEKgeTvX0QcP0m4Mo4Z3AsFlu3oLP+BSBal7jQz3CqnewDnG4Xfn12OnhvtbBarViO48C2bZimCV3XQWvTgKbsN3+023h1Bzqv17FcLtloWRYMw8BkMoGmaQwQRXF9BD+AUs1GA8+1Gh4rFcxmM04cj8cYjUYYDocMoVaCIKwB7i0o98UiFs0mXtzUp2oVarmMh1KJDYPBAKqqQlEUTKdTbkV71/flv0oQJDiLfr/Pdf3rx7z9DjwKNUkmk/BEMFqSJPHA6MxUeyf5t98gkUhwGzKH+lXi8Xh4MyWGTg5T9xt4yvfg78PulQAAAABJRU5ErkJggg=='; var fadedMysteryIcon = 'data:image/gif;base64,R0lGODlhEAAQAJEAAOfq+JSfy4ODg/7+/iH5BAEAAAMALAAAAAAQABAAAAIznC2pxwgPRUOh2gAkE1bZvFXawGEjWYGo2ZRSqbZvek5obN+1ze18kpsAgwcOLmf0CX0FADs='; var movedMysteryIcon = 'data:image/gif;base64,R0lGODlhCQAZAOYAAA/tDw/sDw/oDw/mDw7lDg7kDg7bDg7ZDgzFDAy/DAy+DAuyCw7jDg7iDg7hDg3TDQ3RDQzDDAu1CwqlCgqjCg/rDw/nDw7eDg7dDg7aDg7YDg7XDg7WDg3PDQ3ODQ3NDQ3MDQ3IDQ3HDQzADAy8DAy7DAy3DAuvCwuqCwumCwqbCgqYChHtERPtExTtFBfuFxruGhzuHCHuISbvJifvJynvKSzvLDfwNzjwOD3wPUTxRGDzYHb1dnf1d3j1eHr1en31fX71foz2jJ34naP4o6v5q7f6t7z6vML6wv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEkALAAAAAAJABkAAAeVgEmCSUSDg0NHRToEhj1GRTIHgwE5QDsDHwmCDBU4LxgREoIGBDABGQkLgw0sAQcKhgwurrCDBTEAB5qDAzO5u4ICNrm1SQ4CNQEcJIMXBC0CECaDGgYFGAgnhiAeIgsphiEIJSiGggcd5uqGQkhBA+Y8Rz8FD4MWND43BwiDBwYONoxQJQhEhFQTKBhaMEHFinXmAgEAOw=='; var moveMysteriesIcon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAC4SURBVHjaYvz//z8DDDAyMiI4SACohpEBB2BB1nzh+hesikByMEPQLQHJgAVVbKbjsoRhzexYBgNNHqwuAQmgaL5zJBPORhbHZQgLMgekGVkBLpchewPFAFAYIPsXF0CRh8YCyCYwhgihigENhoujYwQDyCSkGaYGBWM1FWoAPpsxXECOZhBmwRVQyFGGL4UyIidldMWEYgMEmEhJ97jilGAYYA19qBwLkZbgdBVGGCCHAzHeAQgwAAYJB8lhWYArAAAAAElFTkSuQmCC'; var deleteMysteryIcon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAAAFnRFWHRDcmVhdGlvbiBUaW1lADExLzA1LzA33bqJ2wAAAp9JREFUeJxVk8tr1FcUxz/3/n55VFMT8gCtQ6uLUBqqCCbiSgqFgpa2mVIEQUo2QnFZioj0QQVduOhf0FXBnTQDpVJ3RkTETqXkYTudjRknhj6m6TiTYfL73XNOF7+ZMHM253Lvh/M9j3ucmdFry2feOOoGB7/GR7Pmo5yqoMlOVZOdoiU7X83dfbbcy7veAKv5Y4v4aL69WSGtbyEi2YOPiPaO4EbHIYTCybuVfF+Ayo3Phhs/L5XTrX9y29WniMHUhwtMX/4GQylf/5Q/C98RAX5sAoaGq63J3PQ73z9sOzNjNX9sMTTq883qU4JBMHjrUY2fzhyhFuDs7cfcOrGfAzHEDtzLY7g4Lpx6+HferX40O2eqj+prj0kNpvILzFz/FtTAFFMFU1Bl5YtP+OuHmww4kNEJnNkJrzvta+3NCtJRPnzxcxDFVDAR6HhT5bULl9hMM863mlhIr8Vu+KWZtL6FAAK8WPqRRhRlHeo2uOM1BJqacT4kpPHQjFe1gyKCkWUdHXqdqfwCmDH5wcdMvncegIl3z5G+cpghl3GYEVQPetVsVN1h1n/7tVO3ZWWo7J5rv6/gHLu8qeA1hA18ROee1sY6dOcvWQDDQJXGxjqDXRCHimx4bTWfRHtHcIB30Cgt96miCgYmQq20RuwyLjhHrPLEWzRwxY2OEwER0Cqt9KmaSJawCrXyGkMu49rmENUrfu5OqUgIBT82QeyA7Rf8W7zPyJtzu2McPPAqz395QNJssMdD4jxOtfB+WYvOzLh3/u1hXymVpbWds8Z/BIPNAA3p2zP2RTA+4EnUqs8Tm764bu2+Zbp3cmoxVZvPPkmS9aHTsOAcbXNd5f5l6rWl46NHgnE1qM2majlTAZGqUylGpl+e/kNXevn/AT0JpV86x3yxAAAAAElFTkSuQmCC'; var finalIcon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAILSURBVHjanFVBSONAFP0bJaIggbU3FcSDeKkXl4LSXrwGhF5786SHgguCdG+CRVlBKFiiFy305nEXT4UUhNKDWoRAURZaFva4Zrd1QWgp/P0zNmPaJk3ig9c/zUze/Hkz+QOICBYJEWKOaBDRJ6vEPHGlR6srOELMhMNhzOVyaBgG+kW1WsV8Po+RSIQJnRAVu7CWTCax1Wrhe9HpdDCVSjExrasJajQaFQO+6be4vX/OI8fFQaAJVFVlqokP9HNFoP8qn+V78Q6KZYO3j/7tgHz2AhbaWxM8you74hlsfAE7SqUSxGKxkkTtZQK4wRLjgt1J2o9HnPB5jxwdo+0+hKd6nfeR1zww4XGCeHl17iMEBk0Qur58nVyWQVEUWeofE5qfF+3dyeMBDbs1Pavqs0RySmBmdtpXosLzr38H+hyFF2anXH3uyZ428en+wbFv1Onh+toncTLc8LxZ4baFXPoltxctO/p9Zhmypdv3IpBwvx2Q2eOiXoJDrbCOXbHsb9mBMrZnVv75J/DRloZ1rq0u8ei1kW7CbYLnQOuT9TzbpNVsNttM+IYAbscuqB2VSoUHJnxKAK9j9+OX6Us4m82ycCoKfTqddqyvv2s1XptFfR4CTdPeCn1XmKWlxeNxLBQKaJqm78LeaDRQ13VMJBJclBgWwrbLNE4sEM0Al2mDqLNbw671X4ABANNJB/Q2gPgTAAAAAElFTkSuQmCC'; var finalIconLink = 'http://gccomment.svn.sourceforge.net/svnroot/gccomment/trunk/gccomment/res/finalcoord.png'; var cm = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAYUExURUrnIjT8ATj5CDb+BP///zP/ANLS0v///zHaLKsAAAAIdFJOU/////////8A3oO9WQAAAFFJREFUeNrk0VEOwCAIA1CwdNz/xqvRLEbxBOsfD76oZSa3iKxjY3zRoIV4xblIg8cR0thOhpj1dcHxC76/CgU7ew27GkdpWEuD8xGXFb8CDAD8WAgNrkSa2QAAAABJRU5ErkJggg=='; var cm_hvr = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAYUExURd+3t1rvKUvzGT74C+PAwDP/ADj8Bf///4LPUpoAAAAIdFJOU/////////8A3oO9WQAAAE5JREFUeNrc0dsNACAIA0AQlP03ViG+gAns5zUh0YKIVJdBEFAL48I7xfjFVUxml6YMnjFn/pExf3zzTPaDGG5UnYGuAuisk4yWTtwFGAAPCwgiHEofAAAAAABJRU5ErkJggg=='; var cm_dis = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAYUExURczMzDP/AD/+DzP9ADT2AzP9ATT8Av////A+tykAAAAIdFJOU/////////8A3oO9WQAAAEdJREFUeNpiYGdnZ2RjYWZEAkAhBnYwiwEOQDwmiDADCgCpZ0AXhEhQQZhhRAiTFiasjKBowFSMPdJAwsAoZmFkRItigAADABeaARPvgIzyAAAAAElFTkSuQmCC'; GM_registerMenuCommand("Enter a GCComment UUID", function() { var newUUID = window.prompt("Enter a new GCComment UUID. Previous one is " + GM_getValue("gccUUID") + "."); if ((newUUID != null) && (newUUID != "")) { GM_setValue("gccUUID", newUUID); } }); GM_registerMenuCommand("Enter a GCComment Server", function() { var newServer = window .prompt("Enter a new GCComment Server. Previous one is " + GM_getValue("gccServer") + "."); if ((newServer != null) && (newServer != "")) { GM_setValue("gccServer", newServer); } }); var indexbuilt = GM_getValue(INDEXBUILT); if (indexbuilt != 'done') { log( 'info', 'Building index for GCCode-GUID assignment. This is done only once after update on version 46'); var keys = GM_listValues(); for ( var i = 0; i < keys.length; i++) { if (keys[i].indexOf(COMPREFIX) >= 0) { // we got a comment var guid = keys[i].split(COMPREFIX)[1]; var comment = doLoadCommentFromGUID(guid); var indexKey = COMGCPREFIX + comment.gccode; GM_setValue(indexKey, guid); log("info", indexKey + "=" + guid); } } log('info', 'Finished building index.'); GM_setValue(INDEXBUILT, 'done'); } if (GM_getValue(ENABLE_EXPORT)) { log('info', 'Enabling export to other scripts'); unsafeWindow.getGCComment = function(guid) { return doLoadCommentFromGUID(guid); }; } // starting the GCC log('debug', 'found URL: ' + document.URL); if (document.URL.search("cache_details\.aspx") >= 0) { log('debug', 'matched gccommentOnDetailpage'); gccommentOnDetailpage(); } else if (document.URL.search("cdpf\.aspx") >= 0) { log('debug', 'matched gccommentOnPrintPage'); gccommentOnPrintPage(); } else if ((document.URL.search("\/my\/default\.aspx") >= 0) || (document.URL.search("\/my\/$") >= 0) || (document.URL.search("\/my\/#") >= 0)) { log('debug', 'matched gccommentOnProfilePage'); gccommentOnProfilePage(); } else if ((document.URL.search("\/my\/logs\.aspx") >= 0) || (document.URL.search("\/seek\/nearest\.aspx") >= 0) || (document.URL.search("\/watchlist\.aspx") >= 0) || (document.URL.search("\/bookmarks\/view\.aspx") >= 0)) { log('debug', 'matched addCommentBubblesToPage'); addCommentBubblesToPage(); } else if (document.URL.search("geocaching.com/map/beta/") >= 0) { log('debug', 'matched mysteryMoverOnBetaMap'); mysteryMoverOnBetaMap(); } else if (document.URL.search("www.geocaching.com\/map") >= 0) { log('debug', 'matched mysteryMoverOnMapPage'); mysteryMoverOnMapPage(); } else if (document.URL.search("sendtogps\.aspx") >= 0) { log('debug', 'matched sendToGPS'); sendToGPS(); } else if (document.URL.search("\/account\/ManageLocations\.aspx") >= 0) { log('debug', 'matched gccommentOnManageLocations'); gccommentOnManageLocations(); } else if (document.URL.search("\/seek\/log\.aspx") >= 0) { log('debug', 'matched gccommentOnLogPage'); gccommentOnLogPage(); } // GCComment auf der Profilseite function gccommentOnProfilePage() { checkforupdates(); // add links to each entry on that page addCommentBubblesToPage(); // add overview of all comments on top of page var h2list = document.getElementsByTagName('h2'); if (h2list.length > 0) { var root = h2list[0]; gccRoot = document.createElement('div'); gccRoot.setAttribute('style', 'outline:1px solid #D7D7D7;margin-bottom:10px;padding:3px;'); root.parentNode.insertBefore(gccRoot, root.nextSibling); var gcclink = document.createElement('a'); // gcclink.setAttribute('href', // 'http://userscripts.org/scripts/show/75959'); gcclink.setAttribute('target', 'blank'); gcclink.setAttribute('title', 'Show options'); var icon = document.createElement('img'); icon.setAttribute('src', gccIcon); icon.setAttribute('style', 'vertical-align:middle;'); gcclink.appendChild(icon); gccRoot.appendChild(gcclink); gcclink.addEventListener('mouseover', function(evt) { var stats = "<u><b>GCComment v" + version + "</b></u><br><b>Number comments: </b>" + getNumberOfComments() + " (" + GM_getValue('countWhite') + " default, " + GM_getValue('countRed') + " unsolved, " + GM_getValue('countGreen') + " solved, and " + GM_getValue('countGray') + " found)"; stats = stats + "<br/><b>Last import: </b>"; var lastim = GM_getValue(LAST_IMPORT); if (lastim) stats = stats + createTimeString(lastim); else stats = stats + " never"; stats = stats + "<br/><b>Last export: </b>"; var lastex = GM_getValue(LAST_EXPORT); if (lastex) stats = stats + createTimeString(lastex); else stats = stats + " never"; stats = stats + "<br/><b>Last check for updates: </b>"; stats = stats + createTimeString(eval(GM_getValue('updateDate'))); unsafeWindow.tooltip.show(stats, 500); }, false); gcclink.addEventListener('mouseup', function(evt) { toggleTabOnProfile('configDiv'); }, false); gcclink.setAttribute('onmouseout', 'tooltip.hide();'); gcclink.setAttribute('style', 'cursor:pointer;'); gccRoot.appendChild(document.createTextNode(' | ')); var showCommentsLink = document.createElement('a'); showCommentsLink.appendChild(document .createTextNode('Show my comments')); showCommentsLink.addEventListener('mouseup', function() { toggleTabOnProfile('gccommentoverviewtable'); }, false); showCommentsLink.setAttribute('style', 'cursor:pointer;text-decoration:underline;'); gccRoot.appendChild(showCommentsLink); // ----- displayFilters = document.createElement("div"); displayFilters.style.display = "none"; displayFilters.setAttribute('id', 'displayFilters'); var filterclear = document.createElement('img'); filterclear.setAttribute('src', state_clear); filterclear.setAttribute('style', 'cursor:pointer'); filterclear.setAttribute('title', 'Show all'); filterclear.addEventListener('mouseup', function() { filter = null; refreshTable(true); }, false); displayFilters.appendChild(document.createTextNode(' ')); displayFilters.appendChild(filterclear); var filterall = document.createElement('img'); filterall.setAttribute('src', state_default); filterall.setAttribute('style', 'cursor:pointer'); filterall.setAttribute('title', 'Show all untyped'); filterall.addEventListener('mouseup', function() { filter = stateOptions[0]; refreshTable(true); }, false); displayFilters.appendChild(document.createTextNode(' ')); displayFilters.appendChild(filterall); var filterunsolved = document.createElement('img'); filterunsolved.setAttribute('src', state_unsolved); filterunsolved.setAttribute('style', 'cursor:pointer'); filterunsolved.setAttribute('title', 'Show unsolved'); filterunsolved.addEventListener('mouseup', function() { filter = stateOptions[1]; refreshTable(true); }, false); displayFilters.appendChild(document.createTextNode(' ')); displayFilters.appendChild(filterunsolved); var filtersolved = document.createElement('img'); filtersolved.setAttribute('src', state_solved); filtersolved.setAttribute('style', 'cursor:pointer'); filtersolved.setAttribute('title', 'Show solved'); filtersolved.addEventListener('mouseup', function() { filter = stateOptions[2]; refreshTable(true); }, false); displayFilters.appendChild(document.createTextNode(' ')); displayFilters.appendChild(filtersolved); var filterFound = document.createElement('img'); filterFound.setAttribute('src', state_found); filterFound.setAttribute('style', 'cursor:pointer'); filterFound.setAttribute('title', 'Show found'); filterFound.addEventListener('mouseup', function() { filter = stateOptions[3]; refreshTable(true); }, false); displayFilters.appendChild(document.createTextNode(' ')); displayFilters.appendChild(filterFound); gccRoot.appendChild(displayFilters); // ------ gccRoot.appendChild(document.createTextNode(' | Export to ')); var exportLink = document.createElement('a'); exportLink.appendChild(document.createTextNode('GCC')); exportLink.addEventListener('mouseup', function() { var data = "<?xml version='1.0' encoding='UTF-8'?>" + buildGCCExportString(); openDownloadWindow(data, "Export data", "application/gccomment"); }, false); exportLink.setAttribute('style', 'cursor:pointer;text-decoration:underline;'); gccRoot.appendChild(exportLink); gccRoot.appendChild(document.createTextNode(' ')); var exportGPX = document.createElement('a'); exportGPX.appendChild(document.createTextNode('GPX')); exportGPX.addEventListener('mouseup', exportToGPX, false); exportGPX.setAttribute('style', 'cursor:pointer;text-decoration:underline;'); gccRoot.appendChild(exportGPX); gccRoot.appendChild(document.createTextNode(' ')); var exportCSV = document.createElement('a'); exportCSV.appendChild(document.createTextNode('CSV')); exportCSV.addEventListener('mouseup', exportToCSV, false); exportCSV.setAttribute('style', 'cursor:pointer;text-decoration:underline;'); gccRoot.appendChild(exportCSV); gccRoot.appendChild(document.createTextNode(' ')); var exportHTML = document.createElement('a'); exportHTML.appendChild(document.createTextNode('HTML')); exportHTML.addEventListener('mouseup', exportToHTML, false); exportHTML.setAttribute('style', 'cursor:pointer;text-decoration:underline;'); gccRoot.appendChild(exportHTML); if ((GM_getValue("gccServer") != undefined) && (GM_getValue("gccServer") != "")) { gccRoot.appendChild(document.createTextNode(' ')); serverExportLink = document.createElement('a'); serverExportLink.appendChild(document.createTextNode('Server')); serverExportLink.addEventListener('mouseup', storeToServer, false); serverExportLink.setAttribute('style', 'cursor:pointer;text-decoration:underline;'); gccRoot.appendChild(serverExportLink); } gccRoot.appendChild(document.createTextNode(' | Import from ')); var importLink = document.createElement('a'); importLink.appendChild(document.createTextNode('GCC')); importLink.addEventListener('mouseup', function() { toggleTabOnProfile('importDiv'); }, false); importLink.setAttribute('style', 'cursor:pointer;text-decoration:underline;'); gccRoot.appendChild(importLink); if ((GM_getValue("gccServer") != undefined) && (GM_getValue("gccServer") != "")) { gccRoot.appendChild(document.createTextNode(' ')); serverImportLink = document.createElement('a'); serverImportLink.appendChild(document.createTextNode('Server')); serverImportLink.addEventListener('mouseup', loadFromServer, false); serverImportLink.setAttribute('style', 'cursor:pointer;text-decoration:underline;'); gccRoot.appendChild(serverImportLink); } gccRoot.appendChild(document.createTextNode(' | ')); var deleteAllLink = document.createElement('a'); deleteAllLink.appendChild(document.createTextNode('Delete all')); deleteAllLink .addEventListener( 'mouseup', function() { var check = confirm('Do you really want to delete all comments?\n\nIf you press ok, all comments will be lost!!!'); if (check) { var keys = GM_listValues(); log("info", "all keys: " + keys); for ( var i = 0; i < keys.length; i++) { var key = keys[i]; if (key.indexOf(COMPREFIX) > -1) { log("info", "deleted: " + key + "(" + GM_getValue(key) + ")"); GM_deleteValue(key); } } } }, false); deleteAllLink.setAttribute('style', 'cursor:pointer;text-decoration:underline;'); gccRoot.appendChild(deleteAllLink); if (unsafeWindow.File && unsafeWindow.FileReader && unsafeWindow.FileList && unsafeWindow.Blob) { gccRoot.appendChild(document.createTextNode(' | ')); var patchGPXLink = document.createElement('a'); patchGPXLink.appendChild(document.createTextNode('Patch GPX')); patchGPXLink.addEventListener('mouseup', function() { toggleTabOnProfile('patchdiv'); }, false); patchGPXLink.setAttribute('style', 'cursor:pointer;text-decoration:underline;'); gccRoot.appendChild(patchGPXLink); patchDiv = document.createElement('div'); patchDiv.setAttribute('id', 'patchdiv'); patchDiv .setAttribute('style', 'margin:5px;padding:10px;outline:1px solid #D7D7D7;position:relative'); patchDiv.style.display = 'none'; gccRoot.appendChild(patchDiv); var removeUnusedDiv = document.createElement('div'); removeUnusedDiv.setAttribute('id', 'removeUnusedDiv'); removeUnusedDiv.setAttribute('style', 'margin-left:20px'); appendCheckBox(removeUnusedDiv, PATCHGPX_REMOVE_OTHERS, "have no GCC entry"); appendCheckBox(removeUnusedDiv, PATCHGPX_REMOVE_UNSOLVED, "you marked as not solved"); appendCheckBox(removeUnusedDiv, PATCHGPX_REMOVE_SOLVED, "you marked as solved"); appendCheckBox(removeUnusedDiv, PATCHGPX_REMOVE_FOUND, "you marked as found"); var removeUnused = document.createElement('p'); removeUnused.appendChild(document .createTextNode("Remove caches from GPX that ...")); removeUnused.appendChild(removeUnusedDiv); patchDiv.appendChild(removeUnused); appendCheckBox(removeUnused, PATCHGPX_CHANGEORIGINAL, "Change the original waypoint's coordinates to your final coordinates"); appendCheckBox(removeUnused, PATCHGPX_ADDFINALWPT, "Add additional waypoints for final coordinates"); var input = document.createElement('input'); input.setAttribute('id', 'patchgpxinput'); input.setAttribute('name', 'files[]'); input.setAttribute('type', 'file'); input.setAttribute('style', 'margin:3px'); input.addEventListener('change', function(evt) { var files = evt.target.files; var file = files[0]; var reader = new FileReader(); reader.onload = (function(theFile) { return function(e) { handleGPXFileSelected(file.name, e.target.result); }; })(file); if (file.name.indexOf('.gpx') > 0) { reader.readAsText(file); } }, false); patchDiv.appendChild(input); download = document.createElement('input'); download.setAttribute('type', 'button'); download.setAttribute('id', 'patchndownload'); download.setAttribute('style', 'margin:3px'); download.setAttribute('value', 'Patch and Download'); download.setAttribute('disabled', ''); patchDiv.appendChild(download); var patchResultDiv = document.createElement('div'); patchResultDiv.setAttribute('id', 'patchResultDiv'); patchDiv.appendChild(patchResultDiv); } configDiv = document.createElement('div'); configDiv.setAttribute('id', 'configDiv'); configDiv .setAttribute('style', 'margin:5px;padding:10px;outline:1px solid #D7D7D7;position:relative'); configDiv.style.display = 'none'; var gccintro = document.createElement('p'); gccintro.setAttribute('style', 'width:600px'); gccintro.innerHTML = "Thanks for using GCComment. Visit <a href='http://userscripts.org/scripts/show/75959' target='blank'>userscripts.org</a> for general information and documentation or <a href='http://www.geoclub.de/viewtopic.php?f=117&t=44631' target='blank'>geoclub.de</a> for discussions & feedback. If you have direct feedback or questions, contact me at <a href='mailto:birnbaum2001@gmx.de'>birnbaum2001@gmx.de</a>."; configDiv.appendChild(gccintro); var paypallink = document.createElement('a'); paypallink .setAttribute('style', 'position:absolute;left:650px;top:10px;text-align:center;text-decoration:none;'); paypallink .setAttribute( 'href', 'https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3RG7N2ELTYRX4'); paypallink.setAttribute('target', 'blank'); paypallink.appendChild(document .createTextNode('Feel free to show your appreciation :)')); paypallink.appendChild(document.createElement('br')); var paypalImg = document.createElement('img'); paypalImg.setAttribute('src', 'https://www.paypal.com/en_US/i/btn/btn_donate_SM.gif'); paypallink.appendChild(paypalImg); paypallink.appendChild(document.createElement('br')); paypallink.appendChild(document.createTextNode('Thank you.')); configDiv.appendChild(paypallink); var configTable = document.createElement('table'); var tr = document.createElement('tr'); var td = document.createElement('td'); var uuidText = document.createElement('input'); uuidText.setAttribute('id', 'uuidText'); uuidText.value = GM_getValue("gccUUID"); uuidText.size = '40'; var uuidLabel = document.createElement('label'); uuidLabel.setAttribute('for', 'uuidText'); uuidLabel.appendChild(document .createTextNode('UUID for server synchronisation')); td.appendChild(uuidLabel); tr.appendChild(td); td = document.createElement('td'); td.appendChild(uuidText); tr.appendChild(td); configTable.appendChild(tr); var serverText = document.createElement('input'); serverText.setAttribute('id', 'serverText'); serverText.value = GM_getValue("gccServer"); serverText.size = '40'; var serverLabel = document.createElement('label'); serverLabel.setAttribute('for', 'serverText'); serverLabel.appendChild(document .createTextNode('Server for server synchronisation')); tr = document.createElement('tr'); td = document.createElement('td'); td.appendChild(serverLabel); tr.appendChild(td); td = document.createElement('td'); td.appendChild(serverText); tr.appendChild(td); configTable.appendChild(tr); var label = document.createElement('label'); label .appendChild(document .createTextNode('Allow export of comment data to other scripts')); tr = document.createElement('tr'); td = document.createElement('td'); td.appendChild(label); tr.appendChild(td); td = document.createElement('td'); appendCheckBox(td, ENABLE_EXPORT, null); tr.appendChild(td); configTable.appendChild(tr); configDiv.appendChild(configTable); var saveButton = document.createElement('a'); saveButton.appendChild(document.createTextNode('Save preferences')); saveButton.setAttribute('style', 'cursor:pointer;text-decoration:underline;'); saveButton.addEventListener('mouseup', function() { GM_setValue('gccUUID', uuidText.value); GM_setValue('gccServer', serverText.value); saveButton.parentNode.appendChild(waitingTag); waitingTag.setAttribute('style', 'display:inline'); waitingTag.setAttribute("src", successIcon); setTimeout(function() { unsafeWindow.$("#waiting").fadeOut('slow', function() { }); }, 5000); }, false); configDiv.appendChild(saveButton); gccRoot.appendChild(configDiv); importDiv = document.createElement('div'); importDiv.setAttribute('id', 'importDiv'); importDiv .setAttribute('style', 'margin:5px;padding:10px;outline:1px solid #D7D7D7;position:relative'); importDiv.style.display = 'none'; gccRoot.appendChild(importDiv); if (unsafeWindow.File && unsafeWindow.FileReader && unsafeWindow.FileList && unsafeWindow.Blob) { var input = document.createElement('input'); input.setAttribute('id', 'fileinput'); input.setAttribute('name', 'files[]'); input.setAttribute('type', 'file'); importDiv.appendChild(document .createTextNode('Choose GCC file to import from: ')); importDiv.appendChild(input); importDiv.appendChild(document.createElement('br')); document.getElementById('fileinput').addEventListener('change', function(evt) { var files = evt.target.files; var file = files[0]; var reader = new FileReader(); reader.onload = (function(theFile) { return function(e) { importText.value = e.target.result; }; })(file); if (file.name.indexOf('.gcc') > 0) reader.readAsText(file); }, false); } importText = document.createElement('textarea'); importText.setAttribute('id', 'gccommentimporttextarea'); importText.cols = 100; importText.rows = 10; importDiv.appendChild(importText); var submitImport = document.createElement('a'); submitImport.appendChild(document.createTextNode('Execute import')); submitImport.setAttribute('style', 'cursor:pointer;text-decoration:underline;'); submitImport.addEventListener('mouseup', parseXMLImport, false); importDiv.appendChild(document.createElement('br')); importDiv.appendChild(submitImport); var cancelImport = document.createElement('a'); cancelImport .appendChild(document.createTextNode('Close import window')); cancelImport.addEventListener('mouseup', function() { importresult.innerHTML = ""; unsafeWindow.$('#importDiv').slideToggle('slow'); }, false); cancelImport.setAttribute('style', 'cursor:pointer;text-decoration:underline;'); importDiv.appendChild(document.createTextNode('\t')); importDiv.appendChild(cancelImport); importresult = document.createElement('p'); submitImport.parentNode.appendChild(importresult); waitingTag = document.createElement('img'); waitingTag.setAttribute('src', waitingGif); waitingTag.setAttribute('id', 'waiting'); waitingTag.setAttribute('style', 'padding-right:5px'); } } function patchNDownloadGPX(gccString) { unsafeWindow.$('#patchResultDiv').empty(); var parser = new DOMParser(); var xmlDoc = parser.parseFromString(gccString, "text/xml"); var urls = xmlDoc.getElementsByTagName('url'); var toRemove = new Array(); var toAdd = new Array(); var countCoordChanged = 0; var countWPTAdded = 0; var countWPTRemoved = 0; for ( var i = 0; i < urls.length; i++) { var url = urls[i]; var guid = url.childNodes[0].nodeValue.split('guid=')[1]; var comment = doLoadCommentFromGUID(guid); var wpt = url.parentNode; if (comment) { if ((comment.state == stateOptions[1]) && GM_getValue(PATCHGPX_REMOVE_UNSOLVED)) { countWPTRemoved++; toRemove.push(wpt); continue; } else if ((comment.state == stateOptions[2]) && GM_getValue(PATCHGPX_REMOVE_SOLVED)) { toRemove.push(wpt); countWPTRemoved++; continue; } else if ((comment.state == stateOptions[3]) && GM_getValue(PATCHGPX_REMOVE_FOUND)) { toRemove.push(wpt); countWPTRemoved++; continue; } // weave comment into existing WPT // br - br - gccomment - br content var long = wpt.getElementsByTagName('groundspeak:long_description')[0]; if (long) long .appendChild(xmlDoc .createTextNode("\n<br />\n<br />\nGCComment:\n<br />\n" + comment.commentValue + "<br />\n")); // create new WPT if (comment.lat && comment.lng) { if (GM_getValue(PATCHGPX_ADDFINALWPT)) { var newWpt = xmlDoc.createElement('wpt'); newWpt.setAttribute('lat', comment.lat); newWpt.setAttribute('lon', comment.lng); var newTime = xmlDoc.createElement('time'); newTime.appendChild(xmlDoc .createTextNode(isoTime(comment.saveTime))); newWpt.appendChild(newTime); var newName = xmlDoc.createElement('name'); newName.appendChild(xmlDoc.createTextNode(comment.gccode + " - GCC " + comment.state)); newWpt.appendChild(newName); var newDesc = xmlDoc.createElement('desc'); newDesc.appendChild(xmlDoc.createTextNode(comment.name + " - GCC " + comment.state)); newWpt.appendChild(newDesc); var newCmt = xmlDoc.createElement('cmt'); newCmt.appendChild(xmlDoc .createTextNode(comment.commentValue)); newWpt.appendChild(newCmt); // var newSym = xmlDoc.createElement('sym'); // newSym.appendChild(xmlDoc.createTextNode('')); // newWpt.appendChild(newSym); // alternativ grüne fahne // <sym>Flag, Green</sym> // oder goldene fahne mit stern // <sym>Civil</sym> var newType = xmlDoc.createElement('type'); newType.appendChild(xmlDoc .createTextNode('Waypoint|Final Location')); newWpt.appendChild(newType); var gc = xmlDoc.createElement('groundspeak:cache'); gc.setAttribute('xmlns:groundspeak', 'http://www.groundspeak.com/cache/1/0'); gc.setAttribute('archived', 'false'); gc.setAttribute('available', 'true'); var gcname = xmlDoc.createElement('groundspeak:name'); gcname.appendChild(document.createTextNode(comment.name + " - GCC " + comment.state)); gc.appendChild(gcname); var gclongdesc = document .createElement('groundspeak:long_description'); gclongdesc.appendChild(document .createTextNode(comment.commentValue)); gc.appendChild(gclongdesc); newWpt.appendChild(gc); toAdd.push(newWpt); countWPTAdded++; } if (GM_getValue(PATCHGPX_CHANGEORIGINAL)) { wpt.setAttribute('lat', comment.lat); wpt.setAttribute('lon', comment.lng); countCoordChanged++; } } } else { if (GM_getValue(PATCHGPX_REMOVE_OTHERS)) { toRemove.push(wpt); countWPTRemoved++; } } } while (toRemove.length > 0) { var removeWpt = toRemove.pop(); removeWpt.parentNode.removeChild(removeWpt); } var gpx = xmlDoc.getElementsByTagName('gpx')[0]; while (toAdd.length > 0) { var addWpt = toAdd.pop(); gpx.appendChild(addWpt); } var serializer = new XMLSerializer(); var result = serializer.serializeToString(xmlDoc); var patchResult = document.createElement('p'); patchResult.innerHTML = "Patching removed " + countWPTRemoved + " waypoints.<br/>Patching added " + countWPTAdded + " waypoints.<br/>Patching changed Coords of " + countCoordChanged + " waypoints.<br/>The GPX now contains " + xmlDoc.getElementsByTagName('wpt').length + " waypoints."; unsafeWindow.$('#patchResultDiv').append(patchResult); openDownloadWindow(result, "PatchGPX", "application/gccomment"); } var download; var oldhandler; function handleGPXFileSelected(filename, gccString) { unsafeWindow.$('#patchResultDiv').empty(); var parser = new DOMParser(); var xmlDoc = parser.parseFromString(gccString, "text/xml"); var parseStatus = document.createElement('p'); parseStatus.innerHTML = 'The file ' + filename + " contains " + xmlDoc.getElementsByTagName('wpt').length + " waypoints."; unsafeWindow.$('#patchResultDiv').append(parseStatus); download.removeAttribute('disabled'); if (oldhandler) download.removeEventListener('mouseup', oldhandler); oldhandler = function() { patchNDownloadGPX(gccString); }; download.addEventListener('mouseup', oldhandler); } function gccommentOnLogPage() { var guid = document.getElementById( 'ctl00_ContentBody_LogBookPanel1_WaypointLink') .getAttribute('href').split("guid=")[1]; log('debug', 'found guid: ' + guid); if (guid) { var comment = doLoadCommentFromGUID(guid); log('debug', 'found comment: ' + comment); if (comment) { var markfound = document.createElement('a'); markfound.appendChild(document .createTextNode('Mark as found in GCComment')); markfound.addEventListener('mouseup', function() { doSaveCommentToGUID(guid, comment.gccode, comment.name, comment.commentValue, stateOptions[3], comment.lat, comment.lng, comment.origlat, comment.origlng); }); var submitButton = document .getElementById('ctl00_ContentBody_LogBookPanel1_LogButton'); submitButton.parentNode.insertBefore(markfound, submitButton); var input = document .getElementById('ctl00_ContentBody_LogBookPanel1_ddLogType'); if (input.value == 2) markfound.style.display = 'inline'; else markfound.style.display = 'none'; input.addEventListener('change', function() { if (input.value == 2) { markfound.style.display = 'inline'; } else markfound.style.display = 'none'; }); } } } function toggleTabOnProfile(tabid) { // do specials if ((tabid == 'gccommentoverviewtable') && (!commentTable || (commentTable.style.display == 'none'))) { refreshTable(false); displayFilters.style.display = "inline"; } else { displayFilters.style.display = "none"; } // perfom actual toggle unsafeWindow.$('#' + tabid).slideToggle('slow'); // hide others if ((tabid != 'configDiv') && (configDiv.style.display != 'none')) { unsafeWindow.$('#configDiv').slideToggle('slow'); } if ((tabid != 'importDiv') && (importDiv.style.display != 'none')) { unsafeWindow.$('#importDiv').slideToggle('slow'); } if ((tabid != 'patchdiv') && (patchDiv.style.display != 'none')) { unsafeWindow.$('#patchdiv').slideToggle('slow'); } if ((tabid != 'gccommentoverviewtable') && commentTable && (commentTable.style.display != 'none')) { unsafeWindow.$('#gccommentoverviewtable').slideToggle('slow'); displayFilters.style.display = "none"; } } // wir sind auf der Detailbeschreibungsseite eines Caches function gccommentOnDetailpage() { var findtag = document .getElementById('ctl00_ContentBody_uxFindLinksHeader'); if (findtag) { AddComment = document.createElement('a'); var imgAdd = document.createElement('img'); imgAdd.src = commentIconAdd; imgAdd.title = "Add comment"; imgAdd.setAttribute('style', 'cursor:pointer'); AddComment.appendChild(imgAdd); AddComment.addEventListener('mouseup', function() { AddComment.style.display = 'none'; detailCommentCacheState.removeAttribute('disabled'); SaveComment.style.display = 'inline'; EditCancelComment.style.display = 'inline'; detailCommentTextArea.style.display = 'inline'; detailCommentInputLatLng.removeAttribute("disabled"); setTimeout(function() { detailCommentTextArea.focus(); }, 50); }, false); EditComment = document.createElement('a'); var imgEdit = document.createElement('img'); imgEdit.src = commentIconEdit; imgEdit.title = "Edit comment"; imgEdit.setAttribute('style', 'cursor:pointer'); EditComment.appendChild(imgEdit); EditComment.addEventListener('mouseup', editComment, false); EditCancelComment = document.createElement('a'); var imgEditCancel = document.createElement('img'); imgEditCancel.src = commentIconEditCancel; imgEditCancel.title = "Cancel editing"; imgEditCancel.setAttribute('style', 'cursor:pointer'); EditCancelComment.appendChild(imgEditCancel); EditCancelComment.addEventListener('mouseup', function() { detailCommentTextArea.style.display = 'none'; detailCommentCacheState.setAttribute('disabled', ''); SaveComment.style.display = 'none'; detailCommentTextPane.style.display = 'inline'; detailCommentInputLatLng.setAttribute("disabled", ""); EditCancelComment.style.display = 'none'; if (currentComment == null) { AddComment.style.display = 'inline'; EditComment.style.display = 'none'; detailCommentTextArea.value = ""; } else { AddComment.style.display = 'none'; EditComment.style.display = 'inline'; DeleteComment.style.display = 'inline'; detailCommentTextArea.value = currentComment.commentValue; if (currentComment.lat && currentComment.lng) { detailCommentInputLatLng.value = convertDec2DMS( currentComment.lat, currentComment.lng); } else detailCommentInputLatLng.value = DEFAULTCOORDS; } }, false); SaveComment = document.createElement("a"); var imgSave = document.createElement('img'); imgSave.src = commentIconSave; imgSave.title = "Save comment"; imgSave.setAttribute('style', 'cursor:pointer'); SaveComment.appendChild(imgSave); SaveComment.addEventListener('mouseup', saveComment, false); SaveFinalCoords = document.createElement("a"); SaveFinalCoords.setAttribute('style', 'margin-left:3px;margin-right:3px'); var imgSave = document.createElement('img'); imgSave.src = commentIconSave; imgSave.title = "Save final coordinate"; imgSave.setAttribute('style', 'cursor:pointer'); SaveFinalCoords.appendChild(imgSave); SaveFinalCoords.addEventListener('mouseup', saveFinalCoords, false); DeleteFinalCoords = document.createElement("a"); DeleteFinalCoords.setAttribute('style', 'margin-left:3px;margin-right:3px'); var imgDelete = document.createElement('img'); imgDelete.src = deleteMysteryIcon; imgDelete.title = "Delete final coordinate"; imgDelete.setAttribute('style', 'cursor:pointer'); DeleteFinalCoords.appendChild(imgDelete); DeleteFinalCoords .addEventListener( 'mouseup', function() { var check = confirm('Do you really want to delete the final coordinates?'); if (check) { detailFinalInputLatLng.value = DEFAULTCOORDS; detailFinalInputLatLng.setAttribute('style', 'color:grey'); saveFinalCoords(); } }, false); DeleteComment = document.createElement('a'); var imgDelete = document.createElement('img'); imgDelete.src = commentIconDelete; imgDelete.title = 'Delete comment'; imgDelete.setAttribute('style', 'cursor:pointer'); DeleteComment.appendChild(imgDelete); DeleteComment .addEventListener( 'mouseup', function() { var check = confirm('Do you really want to delete this comment?'); if (check) { GM_deleteValue(COMPREFIX + currentCacheGUID); currentComment = null; detailCommentCacheState.setAttribute( 'disabled', ''); detailFinalCacheState.options.selectedIndex = detailCommentCacheState.options.selectedIndex = 0; detailCommentTextArea.value = ""; detailCommentTextPane.innerHTML = ""; detailCommentTextArea.style.display = 'none'; detailCommentTextPane.style.display = 'none'; AddComment.style.display = 'inline'; EditComment.style.display = 'none'; SaveComment.style.display = 'none'; DeleteComment.style.display = 'none'; EditCancelComment.style.display = 'none'; detailCommentInputLatLng.setAttribute( 'disabled', ''); detailCommentInputLatLng.value = DEFAULTCOORDS; detailFinalInputLatLng.value = DEFAULTCOORDS; updateSaveTime(-1); } }, false); CopyComment = document.createElement('a'); var imgCopy = document.createElement('img'); imgCopy.src = commentIconCopy; imgCopy.title = 'Copy Comment from GC-Note'; imgCopy.setAttribute('style', 'cursor:pointer'); CopyComment.appendChild(imgCopy); CopyComment.addEventListener('mouseup', function() { var gcnote = document.getElementById('notestatic'); var text = gcnote.innerHTML; text = text.replace(/<br>/g, "\n"); if (text != null) { editComment(); detailCommentTextArea.value = detailCommentTextArea.value + "\n\ncopy from GC-Note:\n" + text; } }, false); var url = document.getElementById('ctl00_ContentBody_lnkPrintFriendly') .getAttribute('href'); var guidIndex = url.indexOf('guid='); var length = "3331cc55-49a2-4883-a5ad-06657e8c1aab".length; currentCacheGUID = url.substr(guidIndex + 5, length); currentCacheCode = trim(document .getElementById('ctl00_ContentBody_CoordInfoLinkControl1_uxCoordInfoCode').innerHTML); currentCacheName = unescapeXML(trim(document .getElementById('ctl00_ContentBody_CacheName').innerHTML)); var origCoordinates = parseCoordinates(document .getElementById('ctl00_ContentBody_LatLon').innerHTML); if (origCoordinates.length == 2) { currentCommentOrigLat = origCoordinates[0]; currentCommentOrigLng = origCoordinates[1]; } else log('error', 'Original Coordinates of cache could not be determined.'); // laden des aktuellen comments currentComment = doLoadCommentFromGUID(currentCacheGUID); detailCommentDiv = document.createElement('div'); detailCommentDiv.setAttribute('name', 'mycomments'); var header = document.createElement('p'); header.innerHTML = "<strong>My Comments</strong>"; detailCommentDiv.appendChild(header); detailCommentDiv.id = 'gccommentarea'; var small = document.createElement('small'); detailCommentLastSaveTime = document.createTextNode(''); small.appendChild(detailCommentLastSaveTime); detailCommentCacheState = document.createElement('select'); detailCommentCacheState.setAttribute("name", "detailCommentCacheState"); detailCommentCacheState.setAttribute('size', 1); detailCommentCacheState.setAttribute('disabled', ''); var option0 = document.createElement('option'); option0.appendChild(document.createTextNode(stateOptions[0])); var option1 = document.createElement('option'); option1.appendChild(document.createTextNode(stateOptions[1])); var option2 = document.createElement('option'); option2.appendChild(document.createTextNode(stateOptions[2])); var option3 = document.createElement('option'); option3.appendChild(document.createTextNode(stateOptions[3])); detailCommentCacheState.appendChild(option0); detailCommentCacheState.appendChild(option1); detailCommentCacheState.appendChild(option2); detailCommentCacheState.appendChild(option3); if (currentComment) { if (currentComment.state == stateOptions[0]) { detailCommentCacheState.options.selectedIndex = 0; } else if (currentComment.state == stateOptions[1]) { detailCommentCacheState.options.selectedIndex = 1; } else if (currentComment.state == stateOptions[2]) { detailCommentCacheState.options.selectedIndex = 2; } else if (currentComment.state == stateOptions[3]) { detailCommentCacheState.options.selectedIndex = 3; } } header.appendChild(document.createTextNode(' ')); header.appendChild(AddComment); header.appendChild(document.createTextNode(' ')); header.appendChild(EditComment); header.appendChild(document.createTextNode(' ')); header.appendChild(SaveComment); header.appendChild(document.createTextNode(' ')); header.appendChild(EditCancelComment); header.appendChild(document.createTextNode(' ')); header.appendChild(DeleteComment); var gcnote = document.getElementById('notestatic'); if (gcnote != null) { header.appendChild(document.createTextNode(' ')); header.appendChild(CopyComment); } header.appendChild(document.createTextNode(' ')); header.appendChild(small); header.appendChild(document.createElement('br')); header.appendChild(document.createTextNode('The state: ')); header.appendChild(detailCommentCacheState); header.appendChild(document.createTextNode(' Final:')); detailCommentInputLatLng = document.createElement('input'); detailCommentInputLatLng.setAttribute('style', 'margin-left:5px;margin-right:5px'); detailCommentInputLatLng.setAttribute("disabled", ""); detailCommentInputLatLng.setAttribute('size', '30'); header.appendChild(detailCommentInputLatLng); if (currentComment && currentComment.lat && currentComment.lng) { detailCommentInputLatLng.value = convertDec2DMS(currentComment.lat, currentComment.lng); } else { detailCommentInputLatLng.value = DEFAULTCOORDS; detailCommentInputLatLng.setAttribute('style', 'color:grey'); } detailCommentInputLatLng.addEventListener('click', function() { if (detailCommentInputLatLng.value == DEFAULTCOORDS) { detailCommentInputLatLng.value = ""; detailCommentInputLatLng.setAttribute('style', 'color:black'); } }, false); detailCommentInputLatLng.addEventListener('blur', function() { if (detailCommentInputLatLng.value == "") { detailCommentInputLatLng.value = DEFAULTCOORDS; detailCommentInputLatLng.setAttribute('style', 'color:grey'); } }, false); detailCommentTextArea = document.createElement('textarea'); detailCommentTextPane = document.createElement('p'); detailCommentTextPane.setAttribute('style', 'font-family:monospace;font-size:medium'); detailCommentTextArea.id = 'gccommenttextarea'; detailCommentTextArea.cols = 60; detailCommentTextArea.rows = 10; if (currentComment) { detailCommentTextArea.value = currentComment.commentValue; detailCommentTextPane.innerHTML = prepareTextPane(currentComment.commentValue); if (currentComment.saveTime) { updateSaveTime(currentComment.saveTime); } else updateSaveTime(-1); } if ((!detailCommentTextArea.value || (detailCommentTextArea.value == 'undefined')) && (detailCommentInputLatLng.value == DEFAULTCOORDS)) { AddComment.style.display = 'inline'; EditComment.style.display = "none"; EditCancelComment.style.display = "none"; SaveComment.style.display = 'none'; DeleteComment.style.display = 'none'; detailCommentTextArea.style.display = 'none'; } else { AddComment.style.display = 'none'; EditComment.style.display = "inline"; EditCancelComment.style.display = "none"; SaveComment.style.display = 'none'; detailCommentTextArea.style.display = 'none'; detailCommentTextPane.style.display = 'inline'; DeleteComment.style.display = 'inline'; } detailCommentDiv.appendChild(detailCommentTextPane); detailCommentDiv.appendChild(detailCommentTextArea); detailCommentDiv.appendChild(document.createElement('br')); detailCommentDiv.appendChild(document.createElement('br')); findtag.parentNode.insertBefore(detailCommentDiv, findtag); // instant edit when opening the page var url = "" + window.location; if (url.indexOf('mycomments') > -1) { editComment(); } } waitingTag = document.createElement('img'); waitingTag.setAttribute('src', waitingGif); waitingTag.setAttribute('id', 'waiting'); waitingTag.setAttribute('style', 'padding-right:5px'); // Mystery Mover var script = "function insertFinalMarker(lat, lng, mymap) {" + "var markermap = null;" + "if (mymap)" + "markermap = mymap;" + "else" + "markermap = map;" + "var finalLatLng = new google.maps.LatLng(lat, lng);" + "var finalmarker = new google.maps.Marker();" + "finalmarker.setPosition(finalLatLng);" + "finalmarker.setMap(markermap);" + "finalmarker.setIcon(new google.maps.MarkerImage('" + finalIcon + "'));" + "finalmarker.setTitle('Final coordinate');" + "var p1 = markermap.getCenter();" + "var p2 = finalmarker.getPosition();" + "var s = Math.min(p1.lat(), p2.lat());" + "var n = Math.max(p1.lat(), p2.lat());" + "var w = Math.min(p1.lng(), p2.lng());" + "var e = Math.max(p1.lng(), p2.lng());" + "var sw = new google.maps.LatLng(s, w);" + "var ne = new google.maps.LatLng(n, e);" + "var llb = new google.maps.LatLngBounds(sw, ne);" + "markermap.fitBounds(llb);" // + "var line = new google.maps.Polyline();" // + "var pointArray = new Array();" // + "pointArray.push(new google.maps.LatLng(mapLatLng.lat, // mapLatLng.lng));" // + "pointArray.push(p2);" // + "line.setPath(pointArray);" // + "line.setMap(map);" + "}"; appendScript("text", script, null); var hookTBody = document.getElementById('Print'); if (hookTBody) { // var url = // document.getElementById('ctl00_ContentBody_lnkPrintFriendly') // .getAttribute('href'); // var guidIndex = url.indexOf('guid='); // var length = "3331cc55-49a2-4883-a5ad-06657e8c1aab".length; // currentCacheGUID = url.substr(guidIndex + 5, length); // currentCacheCode = trim(document // .getElementById('ctl00_ContentBody_CoordInfoLinkControl1_uxCoordInfoCode').innerHTML); // currentCacheName = // trim(document.getElementById('ctl00_ContentBody_CacheName').innerHTML); var mysteryRow = document.createElement('div'); mysteryRow.setAttribute('class', 'LocationData'); hookTBody.parentNode.insertBefore(mysteryRow, hookTBody); var mysteryData = document.createElement('td'); mysteryRow.appendChild(mysteryData); detailFinalInputLatLng = document.createElement('input'); detailFinalInputLatLng.setAttribute('style', 'margin-left:5px;margin-right:5px'); detailFinalInputLatLng.setAttribute('size', '30'); // var coordComment = doLoadCommentFromGUID(currentCacheGUID); detailFinalCacheState = document.createElement('select'); detailFinalCacheState.setAttribute("name", "detailFinalCacheState"); detailFinalCacheState.setAttribute('size', 1); var option0 = document.createElement('option'); option0.appendChild(document.createTextNode(stateOptions[0])); var option1 = document.createElement('option'); option1.appendChild(document.createTextNode(stateOptions[1])); var option2 = document.createElement('option'); option2.appendChild(document.createTextNode(stateOptions[2])); var option3 = document.createElement('option'); option3.appendChild(document.createTextNode(stateOptions[3])); detailFinalCacheState.appendChild(option0); detailFinalCacheState.appendChild(option1); detailFinalCacheState.appendChild(option2); detailFinalCacheState.appendChild(option3); if (currentComment) { if (currentComment.state == stateOptions[0]) { detailFinalCacheState.options.selectedIndex = 0; } else if (currentComment.state == stateOptions[1]) { detailFinalCacheState.options.selectedIndex = 1; } else if (currentComment.state == stateOptions[2]) { detailFinalCacheState.options.selectedIndex = 2; } else if (currentComment.state == stateOptions[3]) { detailFinalCacheState.options.selectedIndex = 3; } } if (currentComment && currentComment.lat && currentComment.lng) { detailFinalInputLatLng.value = convertDec2DMS(currentComment.lat, currentComment.lng); var newSrc = addToGoogleMapsStatic(document.getElementById( 'mapPreview').getAttribute('src'), currentComment.lat, currentComment.lng, null); document.getElementById('mapPreview').setAttribute('src', newSrc); var newLnkSrc = addToGoogleMapsStatic(document.getElementById( 'lnkSmallMap').getAttribute('href'), currentComment.lat, currentComment.lng, null); newLnkSrc = newLnkSrc.replace('zoom=15', 'zoom=14'); document.getElementById('lnkSmallMap').setAttribute('href', newLnkSrc); setTimeout(function() { var newStaticSource = addToGoogleMapsStatic(document .getElementById('staticMap').getAttribute('src'), currentComment.lat, currentComment.lng, null); document.getElementById('staticMap').setAttribute('src', newStaticSource); }, 200); // override original method to add final marker unsafeWindow.__displayDynamicMap = unsafeWindow.displayDynamicMap; unsafeWindow.displayDynamicMap = function() { // code copied from gs.com var $sm = unsafeWindow.$("#staticMap"); var $map = unsafeWindow.$('<div />').addClass('map').css( { height : 325, width : 325 }); unsafeWindow.$("#lnk_slippyMap").replaceWith( unsafeWindow.$("<span>Showing Dynamic Map</span>")); var items = $sm.data("markers"); unsafeWindow.console.log(items); // walk the array to find the full bounds var bounds = new unsafeWindow.google.maps.LatLngBounds(); var markers = []; for ( var x = 0, len = items.length; x < len; x++) { var item = items[x]; var ll = new unsafeWindow.google.maps.LatLng(item.lat, item.lng); bounds.extend(ll); markers.push(new unsafeWindow.google.maps.Marker( { clickable : false, icon : item.marker, position : ll, zIndex : unsafeWindow.google.maps.Marker.MAX_ZINDEX + (item.primary ? 1 : 0) })); } $sm.replaceWith($map); var map = new unsafeWindow.google.maps.Map( $map.get(0), { zoom : 14, center : bounds.getCenter(), mapTypeId : unsafeWindow.google.maps.MapTypeId.ROADMAP, mapTypeControl : true, navigationControlOptions : { style : unsafeWindow.google.maps.NavigationControlStyle.SMALL } }); for ( var x = 0, len = markers.length; x < len; x++) { markers[x].setMap(map); } if (bounds.length > 1) map.fitBounds(bounds); unsafeWindow.insertFinalMarker(currentComment.lat, currentComment.lng, map); }; // check, if gc tidy is on and push the final coords to the minimap // if (gctidyMinimap) { if (typeof unsafeWindow.GCTidyWaypoints == "object") { addToGCTidyDetailPage(currentComment.lat, currentComment.lng); } else { setTimeout(function() { if (typeof unsafeWindow.GCTidyWaypoints == "object") addToGCTidyDetailPage(currentComment.lat, currentComment.lng); else log('info', 'No GC Tidy found, even after 2s timeout'); }, 2000); } } else { detailFinalInputLatLng.value = DEFAULTCOORDS; detailFinalInputLatLng.setAttribute('style', 'color:grey'); } detailFinalInputLatLng.addEventListener('click', function() { if (detailFinalInputLatLng.value == DEFAULTCOORDS) { detailFinalInputLatLng.value = ""; detailFinalInputLatLng.setAttribute('style', 'color:black'); } }, false); detailFinalInputLatLng.addEventListener('blur', function() { if (detailFinalInputLatLng.value == "") { detailFinalInputLatLng.value = DEFAULTCOORDS; detailFinalInputLatLng.setAttribute('style', 'color:grey'); } }, false); mysteryData.appendChild(document.createTextNode('Final coordinate ')); mysteryData.appendChild(detailFinalInputLatLng); mysteryData.appendChild(detailFinalCacheState); mysteryData.appendChild(SaveFinalCoords); mysteryData.appendChild(DeleteFinalCoords); } // check for waypoints table var wpttable = document.getElementById('ctl00_ContentBody_Waypoints'); if (wpttable && currentComment && (currentComment.lat && currentComment.lng)) { var wpttr = document.createElement('tr'); var wpttd = document.createElement('td'); wpttd.setAttribute('class', 'AlignCenter'); wpttd.setAttribute('isHidden', 'false'); wpttr.appendChild(wpttd); wpttd = document.createElement('td'); var wptViewable = document.createElement('img'); wptViewable.setAttribute('width', '16'); wptViewable.setAttribute('height', '16'); wptViewable.setAttribute('alt', 'viewable'); wptViewable.setAttribute('src', '/images/icons/icon_viewable.jpg'); wpttd.appendChild(wptViewable); wpttr.appendChild(wpttd); wpttd = document.createElement('td'); var wptIcon = document.createElement('img'); wptIcon.setAttribute('width', '16'); wptIcon.setAttribute('height', '16'); wptIcon.setAttribute('alt', 'Final Location'); wptIcon.setAttribute('src', finalIcon); wpttd.appendChild(wptIcon); wpttr.appendChild(wpttd); wpttd = document.createElement('td'); var wptSpan = document.createElement('span'); wptSpan.appendChild(document.createTextNode('FL')); wpttd.appendChild(wptSpan); wpttr.appendChild(wpttd); wpttd = document.createElement('td'); wpttd.appendChild(document.createTextNode('FL')); wpttr.appendChild(wpttd); wpttd = document.createElement('td'); wpttd.appendChild(document .createTextNode('Final Location by GCComment')); wpttr.appendChild(wpttd); wpttd = document.createElement('td'); wpttd.appendChild(document.createTextNode(convertDec2DMS( currentComment.lat, currentComment.lng))); wpttr.appendChild(wpttd); wpttd = document.createElement('td'); wpttd.appendChild(document.createTextNode(" ")); wpttr.appendChild(wpttd); wpttable.getElementsByTagName('tbody')[0].appendChild(wpttr); // note row // var wptnote = document.createElement('tr'); // wptnote.setAttribute('class', 'BorderBottom'); // // wpttd = document.createElement('td'); // wpttd.appendChild(document.createTextNode(" ")); // wptnote.appendChild(wpttd); // // wpttd = document.createElement('td'); // wpttd.appendChild(document.createTextNode(" Note: ")); // wptnote.appendChild(wpttd); // // wpttd = document.createElement('td'); // wpttd.setAttribute('colspan', '6'); // wpttd.appendChild(document.createTextNode(" ")); // wptnote.appendChild(wpttd); // wpttable.getElementsByTagName('tbody')[0].appendChild(wptnote); } // check for "links to maps" table var mapLinks = document .getElementById('ctl00_ContentBody_MapLinks_MapLinks'); if (mapLinks && currentComment && (currentComment.lat && currentComment.lng)) { var items = mapLinks.getElementsByTagName('li'); var newlink = ""; for ( var index = 0; index < items.length; index++) { var link = items[index].getElementsByTagName('a')[0]; if (link.getAttribute('href').search('maps.google.com') > -1) { newlink = link.getAttribute('href') + " to: " + convertDec2DMS(currentComment.lat, currentComment.lng) + " (Final coordinates)"; } else if (link.getAttribute('href').search('mapquest.com') > -1) { var chunks = link.getAttribute('href').split('&'); for ( var i = 0; i < chunks.length; i++) { var chunk = chunks[i]; var maplat, maplng; if (chunk.search('latitude') > -1) { maplat = chunk.split('=')[1]; } else if (chunk.search('longitude') > -1) { maplng = chunk.split('=')[1]; } } newlink = "http://www.mapquest.com/?saddr=" + maplat + "," + maplng + "&daddr=" + currentComment.lat + "," + currentComment.lng + "&zoom=10"; } else continue; if (newlink != "") { var a = document.createElement('a'); a.setAttribute('target', '_blank'); a.setAttribute('href', newlink); a.appendChild(document.createTextNode('(incl. final)')); link.parentNode.appendChild(document.createTextNode(' ')); link.parentNode.appendChild(a); } } } } function gccommentOnPrintPage() { log('debug', 'determining print page'); setTimeout(function() { var hook = document.getElementById('Content'); // log("debug", "print page: " + hook); if (hook == null) { log("debug", "gctour print page found"); // setTimeout(function() { var overLay = document .getElementsByClassName('dark_msg_overlay')[0]; if (overLay == null) { // kein overlay vorhanden? dann sofort gcTourPrintPage(); } else { // overlay, erst warten, bis es weg ist und dann // rein overLay.addEventListener('DOMNodeRemoved', function(evt) { // log("info", "removed: " + evt); gcTourPrintPage(); }, false); } // }, 100); } else { log("debug", "regular print page found"); var actionString = document.getElementById('Form1') .getAttribute('action'); currentCacheGUID = actionString.split('&')[0].split('=')[1]; var comment = doLoadCommentFromGUID(currentCacheGUID); if (comment != null) { // add marker to map if (comment.lat && comment.lng) { var mapImg = document.getElementById('map'); if (mapImg) { mapImg.setAttribute('src', addToGoogleMapsStatic( mapImg.getAttribute('src'), comment.lat, comment.lng, finalIconLink)); } unsafeWindow.__imageResize = unsafeWindow.imageResize; unsafeWindow.imageResize = function(width, height) { unsafeWindow.__imageResize(width, height); var finalMarker = "&markers=color:green|label:F|icon:" + finalIconLink + "|" + comment.lat + "," + comment.lng; var mapImgSrc = mapImg.getAttribute('src').split( '&sensor'); mapImg.setAttribute('src', mapImgSrc[0] + finalMarker + "&sensor" + mapImgSrc[1]); }; } // add comment sortable var contentGroup = hook.lastChild; while ((contentGroup.nodeName.toLowerCase() != "div") && (contentGroup != null)) { contentGroup = contentGroup.previousSibling; } var commentDiv = document.createElement('div'); commentDiv .setAttribute('class', 'item ui-widget ui-widget-content ui-helper-clearfix'); var headerDiv = document.createElement('div'); headerDiv.setAttribute('class', 'item-header'); var headText = "<span id='gccommentwidget' class='ui-icon ui-icon-minusthick'></span><h2>My GCComment"; if (comment.lat && comment.lng) headText = headText + " (final at " + convertDec2DMS(comment.lat, comment.lng) + ")"; headText = headText + "</h2>"; headerDiv.innerHTML = headText; var contentDiv = document.createElement('div'); contentDiv.setAttribute('class', 'item-content'); contentDiv.innerHTML = comment.commentValue.replace(/\n/g, '<br/>'); commentDiv.appendChild(headerDiv); commentDiv.appendChild(contentDiv); contentGroup.insertBefore(commentDiv, contentGroup.firstChild); unsafeWindow.$("#gccommentwidget").click( function() { unsafeWindow.$(this).toggleClass( "ui-icon-minusthick").toggleClass( "ui-icon-plusthick"); unsafeWindow.$(this).parents(".item:first") .toggleClass("no-print").find( ".item-content").toggle(); }); } } }, 1000); } function gccommentOnManageLocations() { setTimeout(function() { var span = document.getElementById('LatLng'); var coords = parseCoordinates(span.innerHTML); log('debug', coords.length); if (coords.length == 2) { GM_setValue('HOMELAT', "" + coords[0]); GM_setValue('HOMELNG', "" + coords[1]); log('info', 'stored new Home : ' + GM_getValue('HOMELAT') + " " + GM_getValue('HOMELNG')); } }, 2000); } function refreshTable(show) { if (commentTable) { commentTable.parentNode.removeChild(commentTable); } commentTable = document.createElement('table'); commentTable.id = 'gccommentoverviewtable'; if (!show) { commentTable.style.display = 'none'; } else { commentTable.style.display = 'block'; commentTable.setAttribute('style', 'table-layout:fixed;padding:5px'); } commentTable.setAttribute('class', 'Table'); var header = document.createElement('tr'); var headeritem = document.createElement('th'); headeritem.innerHTML = 'Cache'; headeritem.setAttribute('style', 'width:200px'); header.appendChild(headeritem); headeritem = document.createElement('th'); headeritem.innerHTML = 'My comment & final coordinates'; header.appendChild(headeritem); headeritem = document.createElement('th'); headeritem.innerHTML = 'last save'; headeritem.setAttribute('style', 'width:75px'); header.appendChild(headeritem); headeritem = document.createElement('th'); headeritem.innerHTML = 'Actions'; headeritem.setAttribute('style', 'width:120px'); header.appendChild(headeritem); commentTable.appendChild(header); var tr; var td_guid; var td_comment; var td_savetime; var td_action; var keys = GM_listValues(); var counter = 0; var commentCountWhite = 0; var commentCountRed = 0; var commentCountGreen = 0; var commentCountGray = 0; for ( var ind = 0; ind < keys.length; ind++) { var commentKey = keys[ind]; if (commentKey.indexOf(COMPREFIX) == -1) continue; tr = document.createElement('tr'); var comment = doLoadCommentFromGUID(commentKey.substr(COMPREFIX.length)); if (!comment.state || (comment.state == "undefined") || (comment.state == undefined)) comment.state = stateOptions[0]; if (comment.state == stateOptions[0]) commentCountWhite++; else if (comment.state == stateOptions[1]) commentCountRed++; else if (comment.state == stateOptions[2]) commentCountGreen++; else if (comment.state == stateOptions[3]) commentCountGray++; if (filter && (filter != comment.state)) continue; if (counter++ % 2 == 0) tr.setAttribute('class', 'AlternatingRow'); td_guid = document.createElement('td'); var img = document.createElement('img'); if (comment.state == stateOptions[1]) img.src = state_unsolved; else if (comment.state == stateOptions[2]) img.src = state_solved; else if (comment.state == stateOptions[3]) img.src = state_found; else img.src = state_default; td_guid.appendChild(img); td_guid.appendChild(document.createTextNode(' ')); var guid = commentKey.replace(/gccomment/, ''); var link = document.createElement('a'); link.href = 'http://www.geocaching.com/seek/cache_details.aspx?guid=' + guid; link.appendChild(document.createTextNode(comment.name + " (" + comment.gccode + ")")); td_guid.appendChild(link); if ((comment.lat != null) && (comment.lng != null)) { var haveFinal = document.createElement('img'); haveFinal.setAttribute('src', finalIcon); haveFinal.setAttribute('width', '16px'); haveFinal.setAttribute('height', '16px'); haveFinal.setAttribute('style', 'margin-left:3px'); haveFinal.setAttribute('title', 'I have the final coordinates :)'); td_guid.appendChild(haveFinal); } tr.appendChild(td_guid); td_comment = document.createElement('td'); var td_commentValue = ""; if (comment.lat && comment.lng) { td_commentValue = td_commentValue + "Final at " + convertDec2DMS(comment.lat, comment.lng); if (GM_getValue('HOMELAT') && GM_getValue('HOMELNG')) { td_commentValue = td_commentValue + " (" + calculateDistance(GM_getValue('HOMELAT'), GM_getValue('HOMELNG'), comment.lat, comment.lng).toFixed(2) + "km from home)"; } td_commentValue = td_commentValue + "</br>"; } if (comment.commentValue) { td_commentValue = td_commentValue + "<p style='font-family:monospace;font-size:small'>" + comment.commentValue.replace(/\n/g, '<br/>') + "</p>"; } td_comment.innerHTML = td_commentValue; tr.appendChild(td_comment); td_savetime = document.createElement('td'); if (comment.saveTime) td_savetime.innerHTML = "<small>" + createTimeString(comment.saveTime) + "</small>"; tr.appendChild(td_savetime); td_action = document.createElement('td'); var action_del = document.createElement('a'); var delImg = document.createElement('img'); delImg.src = commentIconDelete; delImg.title = "Delete comment"; action_del.appendChild(delImg); action_del.setAttribute('style', 'margin-right:3px'); action_del.href = "#" + guid + "=del"; action_del.addEventListener('click', function() { var check = confirm('Do you really want to delete this comment?'); if (check) { var url = "" + this; var guid = url.split("#")[1].split("=")[0]; var action = url.split("#")[1].split("=")[1]; if (action == "del") { GM_deleteValue(COMPREFIX + guid); } refreshTable(true); } }, false); td_action.appendChild(action_del); var action_edit = document.createElement('a'); var editimg = document.createElement('img'); editimg.src = commentIconEdit; editimg.title = "Edit on Detail page"; action_edit.appendChild(editimg); action_edit.setAttribute('style', 'margin-right:3px'); action_edit.href = "http://www.geocaching.com/seek/cache_details.aspx?guid=" + guid + "#mycomments"; td_action.appendChild(action_edit); var action_markunsolved = document.createElement('a'); var muimg = document.createElement('img'); muimg.src = state_unsolved; muimg.title = "Mark cache as unsolved!"; action_markunsolved.appendChild(muimg); action_markunsolved.setAttribute('style', 'margin-right:3px'); action_markunsolved.href = "#" + guid + "=markunsolved"; action_markunsolved.addEventListener('click', changeState, false); td_action.appendChild(action_markunsolved); var action_marksolved = document.createElement('a'); var msimg = document.createElement('img'); msimg.src = state_solved; msimg.title = "Mark cache as solved!"; action_marksolved.appendChild(msimg); action_marksolved.setAttribute('style', 'margin-right:3px'); action_marksolved.href = "#" + guid + "=marksolved"; action_marksolved.addEventListener('click', changeState, false); td_action.appendChild(action_marksolved); var action_markfound = document.createElement('a'); var mfimg = document.createElement('img'); mfimg.src = state_found; mfimg.title = "Mark cache as found!"; action_markfound.appendChild(mfimg); action_markfound.setAttribute('style', 'margin-right:3px'); action_markfound.href = "#" + guid + "=markfound"; action_markfound.addEventListener('click', changeState, false); td_action.appendChild(action_markfound); var action_markdefault = document.createElement('a'); var mdefimg = document.createElement('img'); mdefimg.src = state_default; mdefimg.title = "Mark cache as default!"; action_markdefault.appendChild(mdefimg); action_markdefault.setAttribute('style', 'margin-right:3px'); action_markdefault.href = "#" + guid + "=markdefault"; action_markdefault.addEventListener('click', changeState, false); td_action.appendChild(action_markdefault); tr.appendChild(td_action); commentTable.appendChild(tr); } gccRoot.appendChild(commentTable); GM_setValue('countWhite', "" + commentCountWhite); GM_setValue('countRed', "" + commentCountRed); GM_setValue('countGreen', "" + commentCountGreen); GM_setValue('countGray', "" + commentCountGray); } function gcTourPrintPage() { log("info", 'weaving into gctour print page'); var bodychilds = document.getElementsByTagName('body')[0].childNodes; for ( var i = 0; i < bodychilds.length; i++) { var child = bodychilds[i]; if ((child.getAttribute('class') != null) && (child.getAttribute('class') == 'cacheDetail')) { var guid = child.getAttribute('id'); if (guid != null) { var contentDiv = child.getElementsByTagName('div')[5]; var waypointDiv = contentDiv.getElementsByTagName('div')[3]; var savedComment = doLoadCommentFromGUID(guid); if (savedComment != null) { var mycomment = document.createElement('div'); if ((savedComment.lat != null) && (savedComment.lng != null)) mycomment.innerHTML = mycomment.innerHTML + "<b>Final coordinates</b><br/>" + convertDec2DMS(savedComment.lat, savedComment.lng) + "<br/>"; mycomment.innerHTML = mycomment.innerHTML + "<b>My Comment: </b>" + savedComment.commentValue.replace(/\n/g, '<br/>'); waypointDiv.parentNode.insertBefore(mycomment, waypointDiv); } } } } } // es wird eine Tabelle angezeigt (suchergebnis, profilseite, etc.). // Tooltips werden hier eingewebt. function addCommentBubblesToPage() { log("info", "weaving comments into table..."); appendScript( 'text', "var tooltip = function(){ " + "var id = 'tt'; " + "var top = 3; " + "var left = 3; " + "var maxw = 500; " + "var speed = 10; " + "var timer = 20; " + "var endalpha = 95; " + "var alpha = 0; " + "var tt,t,c,b,h; " + "var ie = document.all ? true : false; " + "return { " + "show:function(v,w) { " + "if(tt == null) { " + "tt = document.createElement('div'); " + "tt.setAttribute('id',id); " + "t = document.createElement('div'); " + "t.setAttribute('id',id + 'top'); " + "c = document.createElement('div'); " + "c.setAttribute('id',id + 'cont'); " + "b = document.createElement('div'); " + "b.setAttribute('id',id + 'bot'); " + "tt.appendChild(t); " + "tt.appendChild(c); " + "tt.appendChild(b); " + "document.body.appendChild(tt); " + "tt.style.opacity = 0; " + "tt.style.filter = 'alpha(opacity=0)'; " + "document.onmousemove = this.pos; " + "} " + "tt.style.display = 'block'; " + "c.innerHTML = v; " + "tt.style.width = w ? w + 'px' : 'auto'; " + "if(!w && ie){ " + "t.style.display = 'none'; " + "b.style.display = 'none'; " + "tt.style.width = tt.offsetWidth; " + "t.style.display = 'block'; " + "b.style.display = 'block'; " + "} " + "if(tt.offsetWidth > maxw){" + "tt.style.width = maxw + 'px'" + "} " + "h = parseInt(tt.offsetHeight) + top; " + "clearInterval(tt.timer); " + "tt.timer = setInterval(function(){tooltip.fade(1)},timer);" + "}, " + "pos:function(e){ " + "var u = ie ? event.clientY + document.documentElement.scrollTop : e.pageY; " + "var l = ie ? event.clientX + document.documentElement.scrollLeft : e.pageX; " + "tt.style.top = (u - h) + 'px'; " + "tt.style.left = (l + left) + 'px'; " + "}, " + "fade:function(d){ " + "var a = alpha; " + "if((a != endalpha && d == 1) || (a != 0 && d == -1)){ " + "var i = speed; " + "if(endalpha - a < speed && d == 1){ " + "i = endalpha - a; " + "}else if(alpha < speed && d == -1){ " + "i = a; " + "} " + "alpha = a + (i * d); " + "tt.style.opacity = alpha * .01; " + "tt.style.filter = 'alpha(opacity=' + alpha + ')'; " + "}else{ " + "clearInterval(tt.timer); " + "if(d == -1){tt.style.display = 'none'} " + "} " + "}, " + "hide:function(){ " + "clearInterval(tt.timer); " + "tt.timer = setInterval(function(){tooltip.fade(-1)},timer); " + "} };}();", null); var style = document.createElement('style'); style.type = 'text/css'; style.media = 'screen'; style.innerHTML = '* {margin:0; padding:0}#text {margin:50px auto; width:500px}.hotspot {color:#900; padding-bottom:1px; border-bottom:1px dotted #900; cursor:pointer}#tt {position:absolute; display:block}#tttop {display:block; height:5px; margin-left:5px; overflow:hidden}#ttcont {display:block; padding:2px 12px 3px 7px; margin-left:5px; background:#666; color:#FFF}#ttbot {display:block; height:5px; margin-left:5px; overflow:hidden}'; document.getElementsByTagName('head')[0].appendChild(style); var anchors = document.getElementsByTagName('a'); var reg = /cache_details\.aspx\?guid=([^&]*)/; var previousAnchor = null; for ( var i = 0; i < anchors.length; i++) { // check all links var a = anchors[i]; if (reg.exec(a.href)) { // anchor is a link to a cache if (a.href == previousAnchor) { continue; } previousAnchor = a.href; var guid = RegExp.$1; var comment = doLoadCommentFromGUID(guid); if (!comment || (!comment.commentValue && !comment.lat && !comment.lng)) continue; var target = document.createElement('img'); if (!comment.state) target.src = state_default; else { if (comment.state == stateOptions[1]) target.src = state_unsolved; else if (comment.state == stateOptions[2]) target.src = state_solved; else if (comment.state == stateOptions[3]) target.src = state_found; else target.src = state_default; } target.width = '16'; target.height = '16'; target.alt = 'Comment available'; target.addEventListener('mouseover', function(evt) { var targetNode = evt.relatedTarget; if (!targetNode) return; var cacheLink, commValue, cID; while (targetNode.nodeName.toLowerCase() != "td") { targetNode = targetNode.parentNode; if (!targetNode) break; } if (!targetNode || (targetNode.nodeName.toLowerCase() != "td")) return; var anchs = targetNode.getElementsByTagName('a'); for ( var x = 0; x < anchs.length; x++) { if (reg.exec(anchs[x].getAttribute('href'))) { cacheLink = anchs[x]; cID = RegExp.$1; commValue = doLoadCommentFromGUID(cID); if (!commValue) { targetNode.removeChild(tdElement .getElementsByTagName('img')[0]); return; } break; } } var commentTooltip = "<strong>My Comment</strong><br/>" + commValue.commentValue.replace(/\n/g, '<br/>'); if ((commValue.lat != null) && (commValue.lng != null)) { commentTooltip = commentTooltip + "<br/><br/><strong>My Final coords</strong><br/>" + convertDec2DMS(commValue.lat, commValue.lng); } unsafeWindow.tooltip.show(commentTooltip, 400); }, false); target.setAttribute('onmouseout', 'tooltip.hide();'); // if (a.parentNode.getElementsByTagName('br').length = 2) // a.parentNode.removeChild(a.parentNode // .getElementsByTagName('br')[1]); a.parentNode.appendChild(document.createTextNode(' ')); a.parentNode.appendChild(target); // a.parentNode.insertBefore(target, a.nextSibling); target.style.display = 'inline'; } } } // helper detailpage. formatiert die Zeit des letzten Speicherns und fügt es ein function updateSaveTime(time) { var txt = "last saved: " + createTimeString(time); var newNode = document.createTextNode(txt); detailCommentLastSaveTime.parentNode.insertBefore(newNode, detailCommentLastSaveTime); detailCommentLastSaveTime.parentNode.removeChild(detailCommentLastSaveTime); detailCommentLastSaveTime = newNode; } function prepareTextPane(value) { var result = value; result = result.replace(/(http:\/\/\S*)/g, '<a href="$1">$1<\/a>'); result = result.replace(/(https:\/\/\S*)/g, '<a href="$1">$1<\/a>'); result = result.replace(/(file:\/\/\S*)/g, '<a href="$1">$1<\/a>'); result = result.replace(/(ftp:\/\/\S*)/g, '<a href="$1">$1<\/a>'); result = result.replace(/\n/g, '<br/>'); return result; } function doSaveCommentWTimeToGUID(guid, gccode, name, commentValue, saveTime, state, lat, lng, origlat, origlng) { var key = COMPREFIX + guid; var value = gccode + DELIM + name + DELIM + commentValue + DELIM + saveTime + DELIM + state + DELIM + lat + DELIM + lng + DELIM + origlat + DELIM + origlng; var keyIndex = COMGCPREFIX + gccode; GM_setValue(key, value); // index entry for fast gccode-guid determination GM_setValue(keyIndex, guid); log("info", "saving " + key + " - " + value); } function doSaveCommentToGUID(guid, gccode, name, commentValue, state, lat, lng, origlat, origlng) { var now = new Date(); doSaveCommentWTimeToGUID(guid, gccode, name, commentValue, now.getTime(), state, lat, lng, origlat, origlng); } function doLoadCommentFromGUID(guid) { var c = GM_getValue(COMPREFIX + guid); // log("info", "loaded: " + c); if (!c) return null; var details = c.split(DELIM); var comment = new Object(); comment.guid = guid; comment.gccode = details[0]; comment.name = details[1]; comment.commentValue = details[2]; comment.saveTime = details[3]; comment.state = details[4]; if ((details[5] != "undefined") && (details[5] != "null") && (details[5] != "")) comment.lat = details[5]; if ((details[6] != "undefined") && (details[6] != "null") && (details[6] != "")) comment.lng = details[6]; if ((details[7] != "undefined") && (details[7] != "null") && (details[7] != "")) comment.origlat = details[7]; if ((details[8] != "undefined") && (details[8] != "null") && (details[8] != "")) comment.origlng = details[8]; return comment; } function doLoadCommentFromGCCode(gcCode) { var guid = getGUIDFromGCCode(gcCode); return doLoadCommentFromGUID(guid); } function editComment() { AddComment.style.display = 'none'; detailCommentCacheState.removeAttribute('disabled'); SaveComment.style.display = 'inline'; detailCommentTextPane.style.display = 'none'; detailCommentTextArea.style.display = 'block'; detailCommentInputLatLng.removeAttribute("disabled"); if (currentComment) detailCommentTextArea.value = currentComment.commentValue; EditComment.style.display = 'none'; EditCancelComment.style.display = 'inline'; setTimeout(function() { detailCommentTextArea.focus(); }, 50); } function saveFinalCoords() { var cstr = detailFinalInputLatLng.value; detailCommentCacheState.options.selectedIndex = detailFinalCacheState.options.selectedIndex; var error = ""; if (cstr == DEFAULTCOORDS) { if (currentComment != null) doSaveCommentToGUID( currentCacheGUID, currentComment.gccode, currentComment.name, currentComment.commentValue, detailFinalCacheState.options[detailFinalCacheState.options.selectedIndex].value, null, null, currentComment.origlat, currentComment.origlng); else { // save new doSaveCommentToGUID( currentCacheGUID, currentCacheCode, currentCacheName, " ", detailFinalCacheState.options[detailFinalCacheState.options.selectedIndex].value, null, null, currentCommentOrigLat, currentCommentOrigLng); } currentComment = doLoadCommentFromGUID(currentCacheGUID); detailCommentInputLatLng.value = DEFAULTCOORDS; detailFinalInputLatLng.value = DEFAULTCOORDS; // log('info', 'deleted final coords'); // error = "default coords!"; } else { var fin = parseCoordinates(cstr); if (fin.length == 2) { if (currentComment == null) { detailCommentInputLatLng.value = cstr; saveComment(); } else { doSaveCommentToGUID( currentCacheGUID, currentComment.gccode, currentComment.name, currentComment.commentValue, detailFinalCacheState.options[detailFinalCacheState.options.selectedIndex].value, fin[0], fin[1], currentCommentOrigLat, currentCommentOrigLng); } currentComment = doLoadCommentFromGUID(currentCacheGUID); var clean = convertDec2DMS(currentComment.lat, currentComment.lng); detailCommentInputLatLng.value = clean; detailFinalInputLatLng.value = clean; // saveComment(); // detailCommentInputLatLng.value = cstr; // log("info", "coordinatestring: " + cstr); } else { error = fin[0]; } } if (error == "") { // unsafeWindow.insertFinalMarker(lat, lng); SaveFinalCoords.parentNode.appendChild(waitingTag); waitingTag.setAttribute('style', 'display:inline'); waitingTag.setAttribute("src", successIcon); setTimeout(function() { unsafeWindow.$("#waiting").fadeOut('slow', function() { }); }, 5000); // if (document.getElementById('gctidy-small-map-link')) { if (typeof unsafeWindow.GCTidyWaypoints == "object") { var finalwpt = { lat : currentComment.lat, lng : currentComment.lng, type : 'Trailhead', title : 'Final Location', html : '<div class=\"gctidy-waypoint-infowindow-text\"><p class=\"gctidy-waypoint-cache-title\"><img src=\"' + finalIcon + '\"> <strong>Final!</strong></p></div>' }; unsafeWindow.GCTidyWaypoints.push(finalwpt); } } else { log("info", "parsing failed (" + error + ")"); SaveFinalCoords.parentNode.appendChild(waitingTag); waitingTag.setAttribute('style', 'display:inline'); waitingTag.setAttribute("src", errorIcon); setTimeout(function() { unsafeWindow.$("#waiting").fadeOut('slow', function() { }); }, 5000); } } function saveComment() { var fin = parseCoordinates(detailCommentInputLatLng.value); var finlat, finlng; if (fin.length == 2) { finlat = fin[0]; finlng = fin[1]; } else if (detailCommentInputLatLng.value != DEFAULTCOORDS) { alert('Coordinates could not be parsed. Please correct them before saving.\nError Message:' + fin[0]); return; } detailFinalCacheState.options.selectedIndex = detailCommentCacheState.options.selectedIndex; detailCommentCacheState.setAttribute('disabled', ''); detailCommentTextArea.style.display = 'none'; SaveComment.style.display = 'none'; EditCancelComment.style.display = 'none'; detailCommentTextPane.innerHTML = prepareTextPane(detailCommentTextArea.value); detailCommentTextPane.style.display = 'inline'; detailCommentInputLatLng.setAttribute("disabled", ""); if ((detailCommentTextArea.value == "") && (detailCommentInputLatLng.value == DEFAULTCOORDS)) { AddComment.style.display = 'inline'; EditComment.style.display = 'none'; DeleteComment.style.display = 'none'; GM_deleteValue(COMPREFIX + currentCacheGUID); updateSaveTime(-1); currentComment = null; detailCommentCacheState.options.selectedIndex = 0; } else { AddComment.style.display = 'none'; EditComment.style.display = 'inline'; DeleteComment.style.display = 'inline'; updateSaveTime(new Date().getTime()); doSaveCommentToGUID( currentCacheGUID, currentCacheCode, currentCacheName, detailCommentTextArea.value, detailCommentCacheState.options[detailCommentCacheState.options.selectedIndex].value, finlat, finlng, currentCommentOrigLat, currentCommentOrigLng); currentComment = doLoadCommentFromGUID(currentCacheGUID); var clean = DEFAULTCOORDS; if (currentComment.lat && currentComment.lng) { clean = convertDec2DMS(currentComment.lat, currentComment.lng); } detailCommentInputLatLng.value = clean; detailFinalInputLatLng.value = clean; } } function changeState() { var url = "" + this; var guid = url.split("#")[1].split("=")[0]; var action = url.split("#")[1].split("=")[1]; var comment = doLoadCommentFromGUID(guid); if (!comment) return; if (action == "markunsolved") { doSaveCommentToGUID(guid, comment.gccode, comment.name, comment.commentValue, stateOptions[1], comment.lat, comment.lng, comment.origlat, comment.origlng); } else if (action == "marksolved") { doSaveCommentToGUID(guid, comment.gccode, comment.name, comment.commentValue, stateOptions[2], comment.lat, comment.lng, comment.origlat, comment.origlng); } else if (action == "markfound") { doSaveCommentToGUID(guid, comment.gccode, comment.name, comment.commentValue, stateOptions[3], comment.lat, comment.lng, comment.origlat, comment.origlng); } else doSaveCommentToGUID(guid, comment.gccode, comment.name, comment.commentValue, stateOptions[0], comment.lat, comment.lng, comment.origlat, comment.origlng); refreshTable(true); } // *** // *** MysteryMover // *** function mysteryMoverOnMapPage() { unsafeWindow.__loadCachesFromJSON = unsafeWindow.loadCachesFromJSON; unsafeWindow.loadCachesFromJSON = function(a) { unsafeWindow.__loadCachesFromJSON(a); setTimeout(function() { var amm = document.getElementById('autoMoveMysteries'); document.getElementsByTagName('body')[0].appendChild(document .createTextNode('checker: ' + amm.checked)); if ((amm != null) && (amm.checked)) { var elem = document.getElementById('mysterymoverlink'); var event = document.createEvent("MouseEvents"); event.initEvent("click", true, false); elem.dispatchEvent(event); } }, 500); }; unsafeWindow.__cacheTableMouseOut = unsafeWindow.cacheTableMouseOut; unsafeWindow.cacheTableMouseOut = function(a) { unsafeWindow.__cacheTableMouseOut(a); if ((typeof unsafeWindow.mrks[a].gccommentImage != undefined) && unsafeWindow.mrks[a].gccommentImage) { unsafeWindow.mrks[a].setImage(unsafeWindow.mrks[a].gccommentImage); } }; unsafeWindow.__cacheTableMouseOver = unsafeWindow.cacheTableMouseOver; unsafeWindow.cacheTableMouseOver = function(a) { unsafeWindow.__cacheTableMouseOver(a); if ((typeof unsafeWindow.mrks[a].gccommentImage != undefined) && unsafeWindow.mrks[a].gccommentImage) { unsafeWindow.mrks[a].setImage(unsafeWindow.cm_hvr); } }; var move = "var movedMysteryIcon = 'data:image/gif;base64,R0lGODlhCQAZAOYAAA/tDw/sDw/oDw/mDw7lDg7kDg7bDg7ZDgzFDAy/DAy+DAuyCw7jDg7iDg7hDg3TDQ3RDQzDDAu1CwqlCgqjCg/rDw/nDw7eDg7dDg7aDg7YDg7XDg7WDg3PDQ3ODQ3NDQ3MDQ3IDQ3HDQzADAy8DAy7DAy3DAuvCwuqCwumCwqbCgqYChHtERPtExTtFBfuFxruGhzuHCHuISbvJifvJynvKSzvLDfwNzjwOD3wPUTxRGDzYHb1dnf1d3j1eHr1en31fX71foz2jJ34naP4o6v5q7f6t7z6vML6wv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEkALAAAAAAJABkAAAeVgEmCSUSDg0NHRToEhj1GRTIHgwE5QDsDHwmCDBU4LxgREoIGBDABGQkLgw0sAQcKhgwurrCDBTEAB5qDAzO5u4ICNrm1SQ4CNQEcJIMXBC0CECaDGgYFGAgnhiAeIgsphiEIJSiGggcd5uqGQkhBA+Y8Rz8FD4MWND43BwiDBwYONoxQJQhEhFQTKBhaMEHFinXmAgEAOw==';"; move = move + "var cm = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAYUExURUrnIjT8ATj5CDb+BP///zP/ANLS0v///zHaLKsAAAAIdFJOU/////////8A3oO9WQAAAFFJREFUeNrk0VEOwCAIA1CwdNz/xqvRLEbxBOsfD76oZSa3iKxjY3zRoIV4xblIg8cR0thOhpj1dcHxC76/CgU7ew27GkdpWEuD8xGXFb8CDAD8WAgNrkSa2QAAAABJRU5ErkJggg==';"; move = move + "var cm_hvr = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAYUExURd+3t1rvKUvzGT74C+PAwDP/ADj8Bf///4LPUpoAAAAIdFJOU/////////8A3oO9WQAAAE5JREFUeNrc0dsNACAIA0AQlP03ViG+gAns5zUh0YKIVJdBEFAL48I7xfjFVUxml6YMnjFn/pExf3zzTPaDGG5UnYGuAuisk4yWTtwFGAAPCwgiHEofAAAAAABJRU5ErkJggg==';"; move = move + "var cm_dis = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAYUExURczMzDP/AD/+DzP9ADT2AzP9ATT8Av////A+tykAAAAIdFJOU/////////8A3oO9WQAAAEdJREFUeNpiYGdnZ2RjYWZEAkAhBnYwiwEOQDwmiDADCgCpZ0AXhEhQQZhhRAiTFiasjKBowFSMPdJAwsAoZmFkRItigAADABeaARPvgIzyAAAAAElFTkSuQmCC';"; move = move + "function doMove(lat, lng, id) {" + "mrks[id].setLatLng(new GLatLng(lat, lng));" + "mrks[id].setImage(cm);" + "mrks[id].gccommentImage = cm;" + "GEvent.clearListeners(mrks[id], 'mouseover');" + "GEvent.clearListeners(mrks[id], 'mouseout');" + "GEvent.addListener(mrks[id], 'mouseover', function() {" + "mrks[id].setImage(cm_hvr);" + "$('ctRow' + id).className = 'yHover';});" + "GEvent.addListener(mrks[id], 'mouseout', function() {" + "if (mrks[id].isAvailable == true) {" + " mrks[id].setImage(cm);$('ctRow' + id).className = '';" + "} else {" + "mrks[id].setImage(cm_dis);$('ctRow' + id).className = '';" + "}});" + "}"; appendScript("text", move, null); var chkShowNumbers = document.getElementById("chkShowNumbers"); if (chkShowNumbers != null) { var mmSpan = document.createElement('span'); var mysterymoverAnchor = document.createElement("a"); addEvent(mysterymoverAnchor, "click", function() { setTimeout(moveMysteries, 0); }); mysterymoverAnchor.id = "mysterymoverlink"; mysterymoverAnchor.setAttribute('href', "#"); mysterymoverAnchor.appendChild(document .createTextNode("Move Mysteries")); var mmImg = document.createElement('img'); mmImg.setAttribute('src', moveMysteriesIcon); mmImg.setAttribute('style', 'margin-right:3px'); var mmOption = document.createElement('input'); mmOption.setAttribute('id', 'autoMoveMysteries'); mmOption.setAttribute('type', 'checkbox'); mmOption.setAttribute('class', 'Checkbox'); mmOption.addEventListener('click', function() { var amm = GM_getValue(AUTOMOVEMYSTERIES); GM_setValue(AUTOMOVEMYSTERIES, "" + (amm + 1) % 2); }, false); var amm = GM_getValue(AUTOMOVEMYSTERIES); if (amm == 1) mmOption.setAttribute('checked', 'checked'); var mmOptionLabel = document.createElement('label'); mmOptionLabel.setAttribute('for', 'autoMoveMysteries'); if (document.getElementById('gctidy-open-configuration')) mmOptionLabel.appendChild(document.createTextNode('Automatically')); else mmOptionLabel.appendChild(document.createTextNode(' auto')); mmSpan.appendChild(mmImg); mmSpan.appendChild(mysterymoverAnchor); mmSpan.appendChild(document.createTextNode(' (')); mmSpan.appendChild(mmOption); mmSpan.appendChild(mmOptionLabel); mmSpan.appendChild(document.createTextNode(')')); chkShowNumbers.parentNode.insertBefore(mmSpan, chkShowNumbers); chkShowNumbers.parentNode.insertBefore(document.createElement('br'), chkShowNumbers); } } function mysteryMoverOnBetaMap() { // @TODO GS icons change at less that zoom level 14 var move = "var movedMysteryIcon = 'data:image/gif;base64,R0lGODlhCQAZAOYAAA/tDw/sDw/oDw/mDw7lDg7kDg7bDg7ZDgzFDAy/DAy+DAuyCw7jDg7iDg7hDg3TDQ3RDQzDDAu1CwqlCgqjCg/rDw/nDw7eDg7dDg7aDg7YDg7XDg7WDg3PDQ3ODQ3NDQ3MDQ3IDQ3HDQzADAy8DAy7DAy3DAuvCwuqCwumCwqbCgqYChHtERPtExTtFBfuFxruGhzuHCHuISbvJifvJynvKSzvLDfwNzjwOD3wPUTxRGDzYHb1dnf1d3j1eHr1en31fX71foz2jJ34naP4o6v5q7f6t7z6vML6wv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEkALAAAAAAJABkAAAeVgEmCSUSDg0NHRToEhj1GRTIHgwE5QDsDHwmCDBU4LxgREoIGBDABGQkLgw0sAQcKhgwurrCDBTEAB5qDAzO5u4ICNrm1SQ4CNQEcJIMXBC0CECaDGgYFGAgnhiAeIgsphiEIJSiGggcd5uqGQkhBA+Y8Rz8FD4MWND43BwiDBwYONoxQJQhEhFQTKBhaMEHFinXmAgEAOw==';"; move = move + "var origfound = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAACaSURBVHja7JXLCoAgEEWdiGjpB4WL6KsjAsWvimhKYdAMgny0iO5qBOfMYzEXEJGRlFLuESEhBFAMBuwD12ph9dacPt3J5FKOX6AOgX03QEyXYQGQUmI4Ropo+oq6zS0L9veTFZxTtNLs4GId/+Af/AXwO0eoyCrstT+u26wnTIVNesSLgxi4b1FPrInihrWMc+48r4SZ7gIMANPlS6BG6nS1AAAAAElFTkSuQmCC';"; move = move + "var origsolved= 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAC7SURBVHja7JVLDsIwDETtNkDPwT6rIsQZuCQHghUcgivwS4Y6yCUIKVKp2fVJaaZSPflUGjMAUlbE75cfOBBYNYtxbji7NXSfXz4+KiG1WpMv0BsPNSwtkIzX0SHGQPs6Mhmgp68CP8iFBVlRw6W5kkd+P2ORjfbGlug/MjdWJuPJeDIuhZBmsHkIqbBCIjghQd+CsLk2ED1mbM9LtEniuzXJCST6hrQmqZGddoJ2pyN571+t6R/N9CnAAC9tlQThla5PAAAAAElFTkSuQmCC';"; move = move + "var finaliconfound = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFRSURBVHjaYvz//z8DDBw6dAjBIQPY2dkxwtiMIIOxGQhURJRhQL1YLWAh10B09RgWHDx48D8Iw8DGvaf/5zfPBdNgMK/tPykAZh4LLpfsO3aJwWOnKwPbjG8MDAUNYLFfGVxgmk2jDKEwsRKrfiZCXoUZBjYQZAlI7EYXGIMt5GdnYJjfzvDm3j38BlspCJGeHIAWiBxciRLmGAaLKCnB2WW8vRhmwFyN4Su0IMEaFDKy0kQ5FB7mne+JC2M1WWGc4YziemAkvjl/Hasc1lTh52QCThX4wKf0s+BgE8EhjzNVwIIDPZxBLgR5HTkuSDIYPTgYJjSADSVkIN6ggCW7fceI8zZJLkZ22bEH70hO2nhznpOVHjx7U9VglEhDy7KEilG8BoOSHbnBQdDFsGR36/FbkgxGqUGwFfKgIIC5FtkH+IIBVIPQrGpipFVlChBgAFhG0uUgufqcAAAAAElFTkSuQmCC';"; move = move + "var finaliconsolved = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJtSURBVHjanFU7axRRFP7uncc+shtfK1toQFKI22hjlTKgWR8ICv4AK+1MFbALCIqCkDKNWttEUiUWBmy2EREsjAgbBK2S9ZHd2ZnZ2Zl7nLnrzL5m9uEHw1zuOfe753733HMYESFE2WImU5ARJgQJcCSA/fvLlRxCyYKTB2s7Q9nIJyC+4rCGaCHFPa7NUhF25hCb6SYmwU17Brozi7qyDyFEm+twtlKUk8RLDebk2yc1L2fhtd7A/+CWkwevZ2Gk9tvbedJx3WDW1QOVQmy+fU/3Hz6Xf4kXj2galA9VKjdhqa5G6WNucSiCnconlN9cgr5uAsurcs6515FQP7fSdbzzoG9dTtNhKG5aXpCZ/pN4xJBMEgabBHNfnspPbngkBbx8jNrenrR5CodnoHPznHWJFs4cn15gf4PCu1dyuBHcEWPDKVWYn4/GK/lnQxxh1EOn6pGEa9QhpgHH03OnJgo00vzJ77550fYjZmx4wdm5E4k690XvX2Lt426sTe19SSFuLF6UWTEK9bsfpGyFGJuUgih+YSjHoM5BhMHRe+9iECSlSDAOyoG1VUk6ihA9NURNMgZpt1MZf+wkcIrJisG0q3z7NXVq81HGxYXz0fOeBiwipvHO4ZMdW0b9KhdUTJnHGftorFOQdtPKoQoBJedHrDrMtmw70TFMu6/ff05EbJsu4MKWYS/V4dyuFWPr60G1KmtzVJ9HYLl6jS77XAFnpzW1mEEOdE6qllV1v4kxbKSMCTtHDtwjtCwXjua013583i2VShdYXzM1mcVVpN0miPmbMi0sKjFNtJsCpM74AfrH38pSJpz+K8AAGeJxOI+fpJMAAAAASUVORK5CYII=';"; move = move + "var commentMarkers = new Array();" + "function doMoveBeta(lat, lng, name, origlat, origlng, guid, comment, state, home, wptid) {" + "var finalicon = null;" + "var linecolor = null;" + "var orig = null;" + "if (state == 'found'){" + "finalicon = finaliconfound;" + "linecolor = '#cccccc';" + "orig = origfound;" + "}else{" + "finalicon = finaliconsolved;" + "linecolor = '#66ff00';" + "orig = origsolved;}" + "var latlng = new google.maps.LatLng(lat, lng);" + "var marker = new google.maps.Marker({" + "position:latlng," + "title:name, icon:new google.maps.MarkerImage(finalicon, null,null, new google.maps.Point(11,11))});" + "marker.setMap(map);" + "commentMarkers.push(marker);" + "if (origlat && origlng && home) {" + "var linepath = new Array();" + "var finalLatLng = new google.maps.LatLng(lat, lng);" + "var origLatLng = new google.maps.LatLng(origlat, origlng);" + "linepath.push(finalLatLng);" + "linepath.push(origLatLng);" + "var distance = google.maps.geometry.spherical.computeDistanceBetween(finalLatLng, origLatLng);" + "var line = new google.maps.Polyline();" + "line.setPath(linepath);" + "line.setMap(map);" + "line.setOptions({path:linepath, strokeWeight:'2',map:map,strokeColor:linecolor});" + "commentMarkers.push(line);" + "var origlatlng = new google.maps.LatLng(origlat, origlng);" + "var origImage = new google.maps.MarkerImage(orig, null, null,new google.maps.Point(11,11));" + "var origMarker = new google.maps.Marker({position:origlatlng,icon:origImage,map:map,clickable:false});" + "commentMarkers.push(origMarker);}" + "var infowindow = new google.maps.InfoWindow({" + "content: '<img src=\"'+finalicon+'\"/> <a href=\"http://www.geocaching.com/seek/cache_details.aspx?guid='+guid+'\" target=\"blank\">'+name+'</a><br/><h3>Your comment for this <u>'+state+'</u> cache:</h3><p>'+comment+'</p>Distance: '+parseInt(distance) + 'm'});" + "google.maps.event.addListener(marker, 'click', function() {" + "infowindow.open(map, marker);" + "var url='map/beta/map.details?wptid='+wptid + userSession.getMapInfoPackage();" + "$.getJSON(url, function(k) {" + "var content = $('#cacheDetailsTemplate').tmpl(k)[0];" + "var div = document.createElement('div');" + "div.innerHTML = '<h3>GCComment for this <u>'+state+'</u> cache (Distance: '+parseInt(distance) + 'm)</h3><p style=\"font-family:monospace;font-size:x-small\">'+comment+'</p>';" + "content.appendChild(div);" + "infowindow.setContent(content);" + "});" + "google.maps.event.addListener(map, 'click', function() {" + "infowindow.close();})});" + "}" + "function showCachedMarkers() {" + "for (var i = 0; i < commentMarkers.length; i++) {" + "commentMarkers[i].setMap(map);}" + "}" + "function removeCommentMarkers() {" + "for (var i = 0; i < commentMarkers.length; i++) {" + "commentMarkers[i].setMap(undefined);" + "}" + "commentMarkers = new Array();" + "}"; appendScript("text", move, null); var stm_myCaches = document.getElementById("stm_myCaches"); if (stm_myCaches != null) { var mmDiv = document.createElement('div'); var mysterymoverAnchor = document.createElement("a"); // addEvent(mysterymoverAnchor, "click", function() { // setTimeout(moveMysteriesBeta, 0); // }); mysterymoverAnchor.id = "mysterymoverlink"; mysterymoverAnchor.setAttribute('href', "#"); mysterymoverAnchor.appendChild(document .createTextNode("Move Mysteries")); var mmImg = document.createElement('img'); mmImg.setAttribute('src', moveMysteriesIcon); mmImg.setAttribute('style', 'margin-right:3px'); var mmOption = document.createElement('input'); mmOption.setAttribute('id', 'autoMoveMysteriesBeta'); mmOption.setAttribute('type', 'checkbox'); mmOption.setAttribute('class', 'Checkbox'); mmOption .addEventListener( 'click', function() { var input = document .getElementById('autoMoveMysteriesBeta'); if (input != null) { var checked = input.getAttribute('checked') == "checked"; if (checked) { input.removeAttribute('checked'); unsafeWindow.removeCommentMarkers(); GM_setValue(AUTOMOVEMYSTERIESBETA, 0); } else { input.setAttribute('checked', 'checked'); GM_setValue(AUTOMOVEMYSTERIESBETA, 1); moveMysteriesBeta( mmSubSolvedOption .getAttribute('checked') == "checked", mmSubFoundOption .getAttribute('checked') == "checked", mmSubShowHomeOption .getAttribute('checked') == "checked"); } } }, false); var mmOptionLabel = document.createElement('label'); mmOptionLabel.setAttribute('for', 'autoMoveMysteriesBeta'); mmOptionLabel.appendChild(document .createTextNode(' Enable Mystery Mover')); var mmSub = document.createElement('div'); mmSub.setAttribute('id', 'mmSub'); mmSub.setAttribute('style', 'display:none'); var mmSubSolvedOption = document.createElement('input'); mmSubSolvedOption.setAttribute('id', 'mmSubSolvedOption'); // mmSubSolvedOption.setAttribute('checked', 'checked'); mmSubSolvedOption.setAttribute('type', 'checkbox'); mmSubSolvedOption.setAttribute('class', 'Checkbox'); mmSubSolvedOption.setAttribute('style', 'margin-left:20px'); mmSubSolvedOption .addEventListener('click', function() { var solved = mmSubSolvedOption .getAttribute('checked') == "checked"; var found = mmSubFoundOption .getAttribute('checked') == "checked"; var home = mmSubShowHomeOption .getAttribute('checked') == "checked"; if (solved) { mmSubSolvedOption.removeAttribute('checked'); GM_setValue(AUTOMOVEMYSTERIESBETASOLVED, 0); } else { mmSubSolvedOption.setAttribute('checked', 'checked'); GM_setValue(AUTOMOVEMYSTERIESBETASOLVED, 1); } moveMysteriesBeta(!solved, found, home); }, false); mmSub.appendChild(mmSubSolvedOption); var mmSubSolvedLabel = document.createElement('label'); mmSubSolvedLabel.setAttribute('for', 'mmSubSolvedOption'); mmSubSolvedLabel.appendChild(document .createTextNode(' Show solved caches ')); mmSub.appendChild(mmSubSolvedLabel); var solvedImg = document.createElement('img'); solvedImg.setAttribute('src', state_solved); mmSub.appendChild(solvedImg); mmSub.appendChild(document.createElement('br')); var mmSubFoundOption = document.createElement('input'); mmSubFoundOption.setAttribute('id', 'mmSubFoundOption'); // mmSubFoundOption.setAttribute('checked', 'checked'); mmSubFoundOption.setAttribute('type', 'checkbox'); mmSubFoundOption.setAttribute('class', 'Checkbox'); mmSubFoundOption.setAttribute('style', 'margin-left:20px'); mmSubFoundOption .addEventListener('click', function() { var found = mmSubFoundOption .getAttribute('checked') == "checked"; var solved = mmSubSolvedOption .getAttribute('checked') == "checked"; var home = mmSubShowHomeOption .getAttribute('checked') == "checked"; if (found) { mmSubFoundOption.removeAttribute('checked'); GM_setValue(AUTOMOVEMYSTERIESBETAFOUND, 0); } else { mmSubFoundOption.setAttribute('checked', 'checked'); GM_setValue(AUTOMOVEMYSTERIESBETAFOUND, 1); } moveMysteriesBeta(solved, !found, home); }, false); mmSub.appendChild(mmSubFoundOption); var mmSubFoundLabel = document.createElement('label'); mmSubFoundLabel.setAttribute('for', 'mmSubFoundOption'); mmSubFoundLabel.appendChild(document .createTextNode(' Show found caches ')); mmSub.appendChild(mmSubFoundLabel); var foundImg = document.createElement('img'); foundImg.setAttribute('src', state_found); mmSub.appendChild(foundImg); mmSub.appendChild(document.createElement('br')); var mmSubShowHomeOption = document.createElement('input'); mmSubShowHomeOption.setAttribute('id', 'mmSubShowHomeOption'); // mmSubShowHomeOption.setAttribute('checked', 'checked'); mmSubShowHomeOption.setAttribute('type', 'checkbox'); mmSubShowHomeOption.setAttribute('class', 'Checkbox'); mmSubShowHomeOption.setAttribute('style', 'margin-left:20px'); mmSubShowHomeOption .addEventListener('click', function() { var found = mmSubFoundOption .getAttribute('checked') == "checked"; var solved = mmSubSolvedOption .getAttribute('checked') == "checked"; var home = mmSubShowHomeOption .getAttribute('checked') == "checked"; if (home) { mmSubShowHomeOption.removeAttribute('checked'); GM_setValue(AUTOMOVEMYSTERIESBETAHOME, 0); } else { mmSubShowHomeOption.setAttribute('checked', 'checked'); GM_setValue(AUTOMOVEMYSTERIESBETAHOME, 1); } moveMysteriesBeta(solved, found, !home); }, false); mmSub.appendChild(mmSubShowHomeOption); var mmSubShowHomeLabel = document.createElement('label'); mmSubShowHomeLabel.setAttribute('for', 'mmSubShowHomeOption'); mmSubShowHomeLabel.appendChild(document .createTextNode(' Show link to home')); mmSub.appendChild(mmSubShowHomeLabel); mmOption.addEventListener('click', function() { if (mmSub.getAttribute('style') == "display:none") mmSub.setAttribute('style', 'display:block'); else mmSub.setAttribute('style', 'display:none'); }, false); var ammbeta = GM_getValue(AUTOMOVEMYSTERIESBETA); var ammfound = GM_getValue(AUTOMOVEMYSTERIESBETAFOUND); var ammsolved = GM_getValue(AUTOMOVEMYSTERIESBETASOLVED); var ammhome = GM_getValue(AUTOMOVEMYSTERIESBETAHOME); mmDiv.appendChild(mmOption); mmDiv.appendChild(mmOptionLabel); mmDiv.appendChild(mmSub); // stm_myCaches.appendChild(document.createElement('br')); stm_myCaches.getElementsByTagName('div')[0].appendChild(mmDiv); if (ammfound == 1) mmSubFoundOption.setAttribute('checked', 'checked'); if (ammsolved == 1) mmSubSolvedOption.setAttribute('checked', 'checked'); if (ammhome == 1) mmSubShowHomeOption.setAttribute('checked', 'checked'); if (ammbeta == 1) { waitForMapAndClick(); } } } function waitForMapAndClick() { if (unsafeWindow.map == null) { setTimeout(waitForMapAndClick, 300); } else { var event = document.createEvent("MouseEvents"); event.initEvent("click", true, false); document.getElementById('autoMoveMysteriesBeta').dispatchEvent(event); } } var cachedMarkers = false; function moveMysteriesBeta(solved, found, home) { // log("info", "moving mysteries beta ... " + solved + ":" + found); var stSolved = null; if (solved) stSolved = stateOptions[2]; var stFound = null; if (found) stFound = stateOptions[3]; // @TODO remove for performance unsafeWindow.removeCommentMarkers(); if (!cachedMarkers) { var keys = GM_listValues(); for ( var i = 0; i < keys.length; i++) { var key = keys[i]; if (key.indexOf(COMPREFIX) > -1) { var guid = key.substring(COMPREFIX.length, key.length); var comment = doLoadCommentFromGUID(guid); if (((comment.state == stSolved) || (comment.state == stFound)) && ((comment.lat != undefined) && (comment.lng != undefined))) { // log('debug', "doMoveBeta(" + comment.lat + ", " // + comment.lng + ", " + comment.name + ", " // + comment.origlat + ", " + comment.origlng + ", " // + comment.guid + ", " // + comment.commentValue.replace(/\n/g, "<br/>")); unsafeWindow.doMoveBeta(comment.lat, comment.lng, comment.name, parseFloat(comment.origlat), parseFloat(comment.origlng), comment.guid, comment.commentValue.replace(/\n/g, '<br/>'), comment.state, home, DBId2GCNew(GC2DBId(comment.gccode))); } } } // cachedMarkers = true; } else { log('info', 'showing markers from cache.'); unsafeWindow.showCachedMarkers(); } } function moveMysteries() { log("info", "moving mysteries..."); for ( var i = 0; i < unsafeWindow.mrks.length; i++) { var wpGCCode = unsafeWindow.mrks[i].waypointId; var type = unsafeWindow.mrks[i].wptTypeId; var name = unsafeWindow.mrks[i].waypointTitle; var coordComment = doLoadCommentFromGCCode(wpGCCode); if (coordComment && coordComment.lat && coordComment.lng) { unsafeWindow.doMove(coordComment.lat, coordComment.lng, i); } else { } } } function addToGCTidyDetailPage(finlat, finlng) { var gctidyMinimap = document.getElementById('gctidy-small-map-link'); var finalwpt = { lat : finlat, lng : finlng, type : 'Trailhead', title : 'Final Location', html : '<div class=\"gctidy-waypoint-infowindow-text\"><p class=\"gctidy-waypoint-cache-title\"><img src=\"' + finalIcon + '\"> <strong>Final!</strong></p></div>' }; unsafeWindow.GCTidyWaypoints.push(finalwpt); var gctstyle = gctidyMinimap.getAttribute('style'); var newStyle = addToGoogleMapsStatic(gctstyle, finlat, finlng); gctidyMinimap.setAttribute('style', newStyle); } function addToGoogleMapsStatic(href, finlat, finlng, icon) { // log('debug', href); var GMstaticDelim = '&sensor'; var hrefParts = href.split(GMstaticDelim); // log('debug', hrefParts); var result = hrefParts[0] + "&&markers=color:green|label:F|"; if (icon) result = result + "icon:" + icon + "|"; result = result + finlat + "," + finlng + '&sensor' + hrefParts[1]; return result; } // *** // *** import & export // *** function buildGCCExportString() { var result = "<gccomment>"; var commentKeys = GM_listValues(); for ( var i = 0; i < commentKeys.length; i++) { var comment = doLoadCommentFromGUID(commentKeys[i] .substr(COMPREFIX.length)); var guidIndex = commentKeys[i].indexOf(COMPREFIX); var length = "3331cc55-49a2-4883-a5ad-06657e8c1aab".length; var guid = commentKeys[i].substr(guidIndex + 9, length); if (commentKeys[i].indexOf(COMPREFIX) > -1) { result = result + "<comment>"; result = result + "<gcid>"; result = result + guid; result = result + "</gcid>"; result = result + "<gccode>"; result = result + comment.gccode; result = result + "</gccode>"; result = result + "<name>"; result = result + escapeXML(comment.name); result = result + "</name>"; result = result + "<content>"; result = result + escapeXML(comment.commentValue); result = result + "</content>"; result = result + "<save>"; result = result + comment.saveTime; result = result + "</save>"; result = result + "<state>"; result = result + comment.state; result = result + "</state>"; result = result + "<finallat>"; if (comment.lat) result = result + comment.lat; result = result + "</finallat>"; result = result + "<finallng>"; if (comment.lng) result = result + comment.lng; result = result + "</finallng>"; result = result + "<origlat>"; if (comment.origlat) result = result + comment.origlat; result = result + "</origlat>"; result = result + "<origlng>"; if (comment.origlng) result = result + comment.origlng; result = result + "</origlng>"; result = result + "</comment>"; } } result = result + "</gccomment>"; GM_setValue(LAST_EXPORT, "" + new Date().getTime()); return result; } function exportToGPX() { var result = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<gpx xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" version=\"1.0\" creator=\"Groundspeak, Inc. All Rights Reserved. http://www.groundspeak.com\" xsi:schemaLocation=\"http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd http://www.groundspeak.com/cache/1/0 http://www.groundspeak.com/cache/1/0/cache.xsd\" xmlns=\"http://www.topografix.com/GPX/1/0\">\n"; result = result + " <name>Waypoint listing with final coordinates of geocaches</name>\n"; result = result + " <desc>This is an export of " + getUserName() + "</desc>\n"; result = result + " <author>" + getUserName() + "</author>\n"; result = result + " <email>contact@geocaching.com</email>\n"; result = result + " <url>http://www.geocaching.com</url>\n"; result = result + " <urlname>Geocaching - High Tech Treasure Hunting</urlname>\n"; result = result + " <time>2011-02-27T21:07:18.0488819Z</time>\n"; result = result + " <keywords>cache, geocache, finals</keywords>\n"; result = result + " <bounds minlat=\"51.0505\" minlon=\"13.73365\" maxlat=\"51.0505\" maxlon=\"13.73365\" />\n"; var commentKeys = GM_listValues(); for ( var i = 0; i < commentKeys.length; i++) { if (commentKeys[i].indexOf(COMPREFIX) > -1) { var comment = doLoadCommentFromGUID(commentKeys[i] .substr(COMPREFIX.length)); if (comment.lat && comment.lng) { var newwpt = " <wpt lat=\"" + comment.lat + "\" lon=\"" + comment.lng + "\">\n" + " <time>" + isoTime(comment.saveTime) + "</time>\n" + " <name>" + comment.gccode + "</name>\n" + " <desc>" + escapeXML(comment.name) + "</desc>\n" + " <cmt>GCComment: " + escapeXML(comment.commentValue) + "</cmt>\n" + " <url>http://www.geocaching.com/seek/cache_details.aspx?guid=" + comment.guid + "</url>\n" + " <urlname>GCComment Final</urlname>\n" + " <sym>Final Location</sym>\n" // alternativ // <sym>Flag, // Green</sym> // gr¸ne // fahne // oder // <sym>Civil</sym> // goldene // fahne mit // stern + " <type>Waypoint|Final Location</type>\n" + " </wpt>\n"; result = result + newwpt; } } } result = result + "</gpx>"; openDownloadWindow(result, "Export as GPX", "application/gccomment"); } function exportToCSV() { // CSV var filestart = ""; var fileend = ""; var post = "\","; var pre = "\""; var lastpost = "\""; var linestart = ""; var lineend = "\n"; var replaceLineEnd = " "; performExport(filestart, fileend, pre, post, lastpost, linestart, lineend, replaceLineEnd); } function exportToHTML() { // HTML table var filestart = "<table>"; var fileend = "</table>"; var post = "</td>"; var lastpost = post; var pre = "<td>"; var linestart = "<tr>"; var lineend = "</tr>"; var replaceLineEnd = "<br/>"; performExport(filestart, fileend, pre, post, lastpost, linestart, lineend, replaceLineEnd); } function performExport(filestart, fileend, pre, post, lastpost, linestart, lineend, replaceLineEnd) { var result = ""; var commentKeys = GM_listValues(); result = result + filestart; for ( var i = 0; i < commentKeys.length; i++) { var comment = doLoadCommentFromGUID(commentKeys[i] .substr(COMPREFIX.length)); var guidIndex = commentKeys[i].indexOf(COMPREFIX); var length = "3331cc55-49a2-4883-a5ad-06657e8c1aab".length; var guid = commentKeys[i].substr(guidIndex + 9, length); if (commentKeys[i].indexOf(COMPREFIX) > -1) { result = result + linestart; result = result + pre + guid + post; result = result + pre + comment.gccode + post; result = result + pre + comment.name + post; if (replaceLineEnd) result = result + pre + comment.commentValue.replace(/\n/g, replaceLineEnd) + post; else result = result + pre + comment.commentValue + post; result = result + pre + comment.saveTime + post; result = result + pre + comment.state + post; result = result + pre + comment.lat + post; result = result + pre + comment.lng + post; result = result + pre + comment.origlat + post; result = result + pre + comment.origlng + lastpost; result = result + lineend; } } result = result + fileend; openDownloadWindow(result, "Export comments", "text/xls"); } function parseXMLImport() { // log("debug", "parsing..." + importText.value); var parser = new DOMParser(); var xmlDoc = parser.parseFromString(importText.value, "text/xml"); var comments = xmlDoc.getElementsByTagName('comment'); var result = "<br/><br/>import results (" + comments.length + "): <br/>"; for ( var i = 0; i < comments.length; i++) { var imID = comments[i].childNodes[0].childNodes[0].nodeValue; var imCode = ""; if (comments[i].childNodes[1].childNodes[0]) imCode = comments[i].childNodes[1].childNodes[0].nodeValue; var imName = unescapeXML(unescape(comments[i].childNodes[2].childNodes[0].nodeValue)); var imContent = ""; if (comments[i].childNodes[3].childNodes[0]) { imContent = unescapeXML(unescape(comments[i].childNodes[3].childNodes[0].nodeValue)); } if ((imContent == "null") || (imContent == "undefined")) imContent = ""; var imSave = comments[i].childNodes[4].childNodes[0].nodeValue; var imState; // new property "state" with version 40 if (comments[i].childNodes[5]) imState = comments[i].childNodes[5].childNodes[0].nodeValue; var imLat = "", imLng = ""; // new props lat, lng since v46 if (comments[i].childNodes[6] && comments[i].childNodes[7]) { if (comments[i].childNodes[6].childNodes[0]) imLat = comments[i].childNodes[6].childNodes[0].nodeValue; if (comments[i].childNodes[7].childNodes[0]) imLng = comments[i].childNodes[7].childNodes[0].nodeValue; } var imOriglat = "", imOriglng = ""; // new props for orig coordinate of // cache if (comments[i].childNodes[8] && comments[i].childNodes[9]) { if (comments[i].childNodes[8].childNodes[0]) imOriglat = comments[i].childNodes[8].childNodes[0].nodeValue; if (comments[i].childNodes[9].childNodes[0]) imOriglng = comments[i].childNodes[9].childNodes[0].nodeValue; } // log('debug', "importing: " + imID + ":" + imCode + ":" + imName + ":" // + imContent + ":" + imSave + ":" + imState + ":" + imLat + ":" // + imLng + ":" + imOriglat + ":" + imOriglng); var existing = doLoadCommentFromGUID(imID); if (existing != null) { if ((existing.saveTime != null) && (existing.saveTime >= imSave)) { result = result + "not imported, existing comment more recent or equally old: " + imCode + "<br/>"; } else { result = result + "imported: " + imCode + ". Overwritten existing comment (" + existing.commentValue + ") with " + imContent + "<br/>"; doSaveCommentWTimeToGUID(imID, imCode, imName, imContent, imSave, imState, imLat, imLng, imOriglat, imOriglng); } } else { doSaveCommentWTimeToGUID(imID, imCode, imName, imContent, imSave, imState, imLat, imLng, imOriglat, imOriglng); result = result + "imported: " + imCode + "<br/>"; } } importresult.style.display = 'inline'; importresult.innerHTML = result; GM_setValue(LAST_IMPORT, "" + new Date().getTime()); } // *** // *** server functions // *** function loadFromServer() { if (importDiv.style.display == "inline") { // cancel import & close importDiv unsafeWindow.$('#importDiv').slideToggle('slow'); return; } serverImportLink.parentNode.insertBefore(waitingTag, serverImportLink); waitingTag.style.display = "inline"; waitingTag.setAttribute('src', waitingGif); GM_xmlhttpRequest( { method : 'POST', url : "http://" + GM_getValue("gccServer") + ":18080/GCComment-ServerServlet/GCCommentServlet", data : "<?xml version='1.0' encoding='UTF-8'?><gccommentmessage id='gccomment' method='load' uuid='" + GM_getValue("gccUUID") + "' username='" + escapeXML(getUserName()) + "' />", onload : function(responseDetails) { performedLoad(responseDetails.responseText); }, onerror : function(responseDetails) { syncerror(responseDetails.responseText); } }); } function performedLoad(response) { waitingTag.setAttribute('src', successIcon); if (commentTable) commentTable.style.display = "none"; displayFilters.style.display = "none"; importText.value = response; unsafeWindow.$('#importDiv').slideToggle('slow'); setTimeout(function() { unsafeWindow.$("#waiting").fadeOut('slow', function() { }); }, 3000); } function syncerror(answer) { waitingTag.setAttribute("src", errorIcon); listener = function() { unsafeWindow.tooltip.show( "<strong>Action failed</strong><br>" + answer, 200); }; waitingTag.addEventListener('mouseover', listener, false); waitingTag.setAttribute('onmouseout', 'tooltip.hide();'); waitingTag.addEventListener('mouseup', function() { waitingTag.style.display = "none"; }, false); } function storeToServer() { serverExportLink.parentNode.insertBefore(waitingTag, serverExportLink); waitingTag.style.display = "inline"; waitingTag.setAttribute('src', waitingGif); waitingTag.removeEventListener('mouseover', listener, false); var dataString = "<?xml version='1.0' encoding='UTF-8'?><gccommentmessage id='gccomment' method='store' uuid='" + GM_getValue("gccUUID") + "' username='" + escapeXML(getUserName()) + "'>" + buildGCCExportString() + "</gccommentmessage>"; log('debug', 'Data string size: ' + dataString.length); GM_xmlhttpRequest( { method : 'POST', url : "http://" + GM_getValue("gccServer") + ":18080/GCComment-ServerServlet/GCCommentServlet", data : dataString, onload : function(responseDetails) { performedSave(responseDetails.responseText); }, onerror : function(responseDetails) { syncerror(responseDetails.responseText); } }); log("info", "request sent"); } function performedSave(response) { log("info", "save response: " + response); var parser = new DOMParser(); var xmlDoc = parser.parseFromString(response, "text/xml"); var response = xmlDoc.getElementsByTagName('response'); if (response.length > 0) { var msg = response[0].getAttribute('msg'); if (msg != 'storing successful') { waitingTag.setAttribute("src", errorIcon); // waitingTag.setTitle(msg); waitingTag.addEventListener('mouseover', function(evt) { unsafeWindow.tooltip.show("<b>The server said:</b><br/>" + msg, 200); }, false); waitingTag.setAttribute('onmouseout', 'tooltip.hide();'); } else { waitingTag.setAttribute("src", successIcon); setTimeout(function() { unsafeWindow.$("#waiting").fadeOut('slow', function() { }); }, 5000); } } else { waitingTag.setAttribute("src", successIcon); setTimeout(function() { unsafeWindow.$("#waiting").fadeOut('slow', function() { }); }, 5000); } } function getUserName() { var logout = document .getElementById('ctl00_ContentBody_WidgetMiniProfile1_LoggedInPanel'); var username; if (logout) { username = logout.parentNode.getElementsByTagName('span')[0].firstChild.nodeValue; GM_setValue("GCCUSER", username); } else { username = GM_getValue('GCCUSER'); } return username; } var originalGPX = ""; // Original idea from Schatzjäger2 function sendToGPS() { setTimeout(function() { var gpxTextArea = document.getElementById('dataString'); // gpxTextArea.parentNode.setAttribute('style', ""); var gpx = gpxTextArea.value; originalGPX = gpx; var anfang = gpx.indexOf('guid='); var laenge = 'a5493497-70a7-4e07-946c-6d79c7a59994'.length + 5; var currentCacheGUID = gpx.substring(anfang + 5, anfang + laenge); currentComment = doLoadCommentFromGUID(currentCacheGUID); if (currentComment && (currentComment.commentValue || (currentComment.lat && currentComment.lng))) { // build special config var writebox = document.getElementById('writeBox'); var configdiv = document.createElement('div'); configdiv.setAttribute('style', 'outline:1px solid grey;margin-bottom:5px'); var configlabel = document.createElement('p'); configlabel .appendChild(document .createTextNode('Use GCComment information to configure your GPX ')); configdiv.appendChild(configlabel); // add your comment var addComment = document.createElement('input'); addComment.setAttribute('id', 'addComment'); addComment.setAttribute('type', 'checkbox'); addComment.setAttribute('class', 'Checkbox'); addComment.addEventListener('click', function() { var state = addComment.getAttribute('checked'); if (state) addComment.removeAttribute('checked'); else addComment.setAttribute('checked', 'checked'); GM_setValue(ADDCOMMENTSETTING, state ? 0 : 1); patchGarminGPX(); }, false); configdiv.appendChild(addComment); var addCommentSetting = GM_getValue(ADDCOMMENTSETTING); if (addCommentSetting == 1) addComment.setAttribute('checked', 'checked'); var addCommentLabel = document.createElement('label'); addCommentLabel.setAttribute('for', 'addComment'); addCommentLabel.appendChild(document .createTextNode('Add your GCComment')); configdiv.appendChild(addCommentLabel); var addCommentSetting = GM_getValue(ADDCOMMENTSETTING); if (addCommentSetting == 1) addComment.setAttribute('checked', 'checked'); configdiv.appendChild(document.createElement('br')); // change Original var changeOriginal = document.createElement('input'); changeOriginal.setAttribute('id', 'changeOriginal'); changeOriginal.setAttribute('type', 'checkbox'); changeOriginal.setAttribute('class', 'Checkbox'); changeOriginal.addEventListener('click', function() { var state = changeOriginal.getAttribute('checked'); if (state) changeOriginal.removeAttribute('checked'); else changeOriginal.setAttribute('checked', 'checked'); GM_setValue(CHANGEORIGINALSETTING, state ? 0 : 1); patchGarminGPX(); }, false); configdiv.appendChild(changeOriginal); var changeOrigSetting = GM_getValue(CHANGEORIGINALSETTING); if (changeOrigSetting == 1) changeOriginal.setAttribute('checked', 'checked'); var changeOriginalLabel = document.createElement('label'); changeOriginalLabel.setAttribute('for', 'changeOriginal'); changeOriginalLabel .appendChild(document .createTextNode('Change the original coordinates to your final coordinates')); configdiv.appendChild(changeOriginalLabel); var changeOrigSetting = GM_getValue(CHANGEORIGINALSETTING); if (changeOrigSetting == 1) changeOriginal.setAttribute('checked', 'checked'); configdiv.appendChild(document.createElement('br')); if (!currentComment.lat && !currentComment.lng) { changeOriginal.setAttribute('disabled', ''); } // add waypoint var addWaypoint = document.createElement('input'); addWaypoint.setAttribute('id', 'addWaypoint'); addWaypoint.setAttribute('type', 'checkbox'); addWaypoint.setAttribute('class', 'Checkbox'); addWaypoint.addEventListener('click', function() { var state = addWaypoint.getAttribute('checked'); if (state) addWaypoint.removeAttribute('checked'); else addWaypoint.setAttribute('checked', 'checked'); GM_setValue(ADDWAYPOINTSETTING, state ? 0 : 1); patchGarminGPX(); }, false); configdiv.appendChild(addWaypoint); var addWaypointLabel = document.createElement('label'); addWaypointLabel.setAttribute('for', 'addWaypoint'); addWaypointLabel .appendChild(document .createTextNode('Add final coordinates as separate waypoint')); configdiv.appendChild(addWaypointLabel); var addWaypointSetting = GM_getValue(ADDWAYPOINTSETTING); if (addWaypointSetting == 1) addWaypoint.setAttribute('checked', 'checked'); configdiv.appendChild(document.createElement('br')); if (!currentComment.lat && !currentComment.lng) { addWaypoint.setAttribute('disabled', ''); } writebox.parentNode.insertBefore(configdiv, writebox); patchGarminGPX(); window.resizeTo(450, 550); } }, 500); } function buildGPXWPT(commentObject) { var newwpt = "<wpt lat='" + commentObject.lat + "' lon='" + commentObject.lng + "'>" + " <time>" + isoTime(commentObject.saveTime) + "</time>" + " <name>" + commentObject.gccode + "</name>" + " <cmt>GCComment: " + commentObject.commentValue + "</cmt>" + " <desc>GCComment Final and Comment</desc>" + " <url>http://www.geocaching.com/seek/cache_details.aspx?guid=" + commentObject.guid + "</url>" + " <urlname>GCComment Final</urlname>" + " <sym>Final Location</sym>" // alternativ // <sym>Flag, // Green</sym> // grüne // fahne // oder // <sym>Civil</sym> // goldene // fahne mit // stern + " <type>Waypoint|Final Location</type>" + " </wpt>"; return newwpt; } function patchGarminGPX() { var gpxTextArea = document.getElementById('dataString'); var newGPX = originalGPX; var positioncomment = originalGPX .indexOf('</groundspeak:long_description>'); if (currentComment.commentValue && (GM_getValue(ADDCOMMENTSETTING) == 1)) { newGPX = originalGPX.substring(0, positioncomment) + "\n<br />\n<br />\nGCComment:\n<br />\n" + currentComment.commentValue + "<br />\n" + originalGPX.substring(positioncomment, originalGPX.length); } if (currentComment.lat && currentComment.lng) { if (GM_getValue(CHANGEORIGINALSETTING) == 1) { var latstart = newGPX.indexOf('<wpt lat=\"') + 10; var latstop = newGPX.indexOf('\"', latstart) + 1; newGPX = newGPX.substring(0, latstart) + currentComment.lat + newGPX.substring(latstop - 1, newGPX.length); var lngstart = newGPX.indexOf('\" lon=\"') + 7; var lngstop = newGPX.indexOf('\"', lngstart) + 1; newGPX = newGPX.substring(0, lngstart) + currentComment.lng + newGPX.substring(lngstop - 1, newGPX.length); } if (GM_getValue(ADDWAYPOINTSETTING) == 1) { var newwpt = buildGPXWPT(currentComment); var endindex = newGPX.indexOf('</gpx>'); newGPX = newGPX.substring(0, endindex) + newwpt + newGPX.substring(endindex, newGPX.length); } } // set text area gpxTextArea.value = newGPX; // set text child of text area gpxTextArea.replaceChild(document.createTextNode(newGPX), gpxTextArea.firstChild); } function isoTime(time) { var saved = new Date(); saved.setTime(time); var result = saved.getFullYear() + "-" + ((saved.getMonth() < 9) ? "0" + saved.getMonth() : saved .getMonth()) + "-" + ((saved.getDate() < 9) ? "0" + saved.getDate() : saved.getDate()) + "T" + ((saved.getHours() < 9) ? "0" + saved.getHours() : saved .getHours()) + ":" + ((saved.getMinutes() < 9) ? "0" + saved.getMinutes() : saved .getMinutes()) + ":" + ((saved.getSeconds() < 9) ? "0" + saved.getSeconds() : saved .getSeconds()) + "." + ((saved.getMilliseconds() < 9) ? "0" + saved.getMilliseconds() : saved.getMilliseconds()); return result; } // *** // *** helper functions // *** function trim(zeichenkette) { return zeichenkette.replace(/^\s+/, '').replace(/\s+$/, ''); } function escapeXML(unescaped) { var result = unescaped.replace(/&/g, "&"); result = result.replace(/>/g, ">"); result = result.replace(/</g, "<"); result = result.replace(/"/g, """); result = result.replace(/'/g, "'"); // zeilenumbrüche escapen // result = result.replace(/\n/g, " "); return result; } function unescapeXML(escaped) { var result = escaped.replace(/>/g, ">"); result = result.replace(/</g, "<"); result = result.replace(/"/g, "\""); result = result.replace(/&/g, "&"); result = result.replace(/'/g, "'"); // result = result.replace(/ /g, "\n"); return result; } function updateAvailable(serverVersion) { GM_xmlhttpRequest( { method : 'GET', header : { 'Cache-Control' : 'max-age=3600, must-revalidate' }, url : updatechangesurl, onload : function(responseDetails) { handleChangesReply(responseDetails.responseText); }, onerror : function(responseDetails) { log("info", "Unable to get changes from Sourceforge! Errorcode " + responseDetails.status); } }); log("info", "current version: " + version + " latest version: " + serverVersion); var updateInfo = document.createElement('div'); updateInfo.setAttribute('id', 'gccupdateinfo'); var updatelnk = document.createElement('a'); updatelnk.setAttribute('href', 'http://userscripts.org/scripts/source/75959.user.js'); updatelnk.innerHTML = "Click here to update!"; updateInfo .appendChild(document .createTextNode("Hooray, a GCComment update is available. The new version is " + serverVersion + " while your installed version is " + version + ". ")); updateInfo.appendChild(updatelnk); updateInfo.appendChild(document.createElement('br')); updateInfo.appendChild(document.createElement('br')); gccRoot.insertBefore(updateInfo, gccRoot.firstChild); } function handleChangesReply(xmlString) { var updateInfo = document.getElementById('gccupdateinfo'); var parser = new DOMParser(); var xmlDoc = parser.parseFromString(xmlString, "text/xml"); var changes = xmlDoc.getElementsByTagName("change"); if (changes) { for ( var chindex = 0; chindex < changes.length; chindex++) { var change = changes[chindex]; var vversion, date, content; for ( var elems = 0; elems < change.childNodes.length; elems++) { var elem = change.childNodes[elems]; if (elem.nodeName == "version") vversion = elem.firstChild.nodeValue; else if (elem.nodeName == "date") date = elem.firstChild.nodeValue; else if (elem.nodeName == "content") content = elem.firstChild.nodeValue; } if (vversion <= version) break; updateInfo.appendChild(document .createTextNode('Changes in version ' + vversion + " (" + date + ")")); updateInfo.appendChild(document.createElement('br')); var divv = document.createElement('div'); divv.innerHTML = content; updateInfo.appendChild(divv); } updateInfo.appendChild(document.createElement('br')); } } function checkforupdates() { var updateDate = eval(GM_getValue('updateDate')); if (!updateDate) { updateDate = new Date(); GM_setValue('updateDate', uneval(updateDate)); } var currentDate = new Date(); // in ms. equals 1 day if (currentDate.getTime() - updateDate.getTime() > 86400000) { GM_xmlhttpRequest( { method : 'GET', header : { 'Cache-Control' : 'max-age=3600, must-revalidate' }, url : updateurl, onload : function(responseDetails) { // handleChangesReply(responseDetails.responseText); var content = responseDetails.responseText; var parseResult = /@version\s+([.\d]+)[\r\n]/.exec(content); if (parseResult) { var serverVersion = parseInt(parseResult[1]); log('info', 'updatecheck: installed version=' + version + ", server version=" + serverVersion); if (serverVersion > version) updateAvailable(serverVersion); } }, onerror : function(responseDetails) { log("info", "Unable to get version from Userscripts.org! Errorcode " + responseDetails.status); } }); GM_setValue('updateDate', uneval(currentDate)); } } // helper detailpage: macht aus dem Time-Long eine lesbare Zeitangabe function createTimeString(time) { if (time < 0) return "never"; else { var lastSave = new Date(); lastSave.setTime(time); var month = lastSave.getMonth() + 1; var day = lastSave.getDate(); var hour = lastSave.getHours(); var minute = lastSave.getMinutes(); var sec = lastSave.getSeconds(); if (month < 10) month = "0" + month; if (day < 10) day = "0" + day; if (hour < 10) hour = "0" + hour; if (minute < 10) minute = "0" + minute; if (sec < 10) sec = "0" + sec; return lastSave.getFullYear() + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + sec; } } function appendScript(type, script, context) { var element = document.createElement('script'); element.setAttribute('type', 'text/javascript'); if (type == 'src') { element.setAttribute('src', script); } else if (type == 'text') { element.textContent = script; } context = context || document; context.getElementsByTagName('head')[0].appendChild(element); return element; } function getNumberOfComments() { var keys = GM_listValues(); var counter = 0; for ( var ind = 0; ind < keys.length; ind++) { var commentKey = keys[ind]; if (commentKey.indexOf(COMPREFIX) > -1) counter++; } return counter; } function addEvent(obj, type, fn) { if (obj.addEventListener) obj.addEventListener(type, fn, false); else if (obj.attachEvent) obj.attachEvent('on' + type, function() { return fn.apply(obj, new Array(window.event)); }); } function log(level, text) { GM_log(level + ": " + text); } function getGUIDFromGCCode(gcCode) { var value = GM_getValue(COMGCPREFIX + gcCode); if (value) return value; // else // log('info', 'no GUID for GCCode ' + gcCode + ' saved. '); } function convertDec2DMS(lt, lg) { var lat = lt; var lng = lg; var result = ""; if (lat < 0) { result = result + "S "; lat = lat * -1; } else result = result + "N "; if ((lat < 10) && (lat > -10)) result = result + "0"; result = result + parseInt(lat) + String.fromCharCode(176) + " "; lat = lat - parseInt(lat); var latFormatted = (Math.round(parseFloat(lat * 60) * 1000) / 1000) .toFixed(3); if ((latFormatted < 10) && (latFormatted > -10)) result = result + "0"; result = result + latFormatted + " "; if (lng < 0) { result = result + " W "; lng = lng * -1; } else result = result + " E "; if ((lng < 10) && (lng > -10)) result = result + "00"; else if ((lng < 100) && (lng > -100)) result = result + "0"; result = result + parseInt(lng) + String.fromCharCode(176) + " "; lng = lng - parseInt(lng); var lngFormatted = (Math.round(parseFloat(lng * 60) * 1000) / 1000) .toFixed(3); if ((lngFormatted < 10) && (lngFormatted > -10)) result = result + "0"; result = result + lngFormatted; return result; } function parseCoordinates(cstr) { var regexDegMin = /([NS])\s*(\d+)\D\s*(\d+\.\d+)\s*([EW])\s*(\d+)\D\s*(\d+\.\d+)/i; var fin = new Array(); var items = regexDegMin.exec(cstr); if ((items != null) && (items.length == 7)) { log("info", "parsing successful DegMin: " + items); var lat1 = RegExp.$2; while (lat1.indexOf(0) == 0) { lat1 = lat1.substring(1, lat1.length); } if (lat1.length == 0) lat1 = 0; var lat2 = RegExp.$3; var lat = parseInt(lat1) + parseFloat(lat2) / 60; if (RegExp.$1 == "S") lat = lat * -1; var lng1 = RegExp.$5; while (lng1.indexOf(0) == 0) { lng1 = lng1.substring(1, lng1.length); } if (lng1.length == 0) lng1 = 0; var lng2 = RegExp.$6; var lng = parseInt(lng1) + parseFloat(lng2) / 60; if (RegExp.$4 == "W") lng = lng * -1; fin.push(lat); fin.push(lng); return fin; } var regexPlain = /(\d+)\s+(\d+\.\d+)\s+(\d+)\s+(\d+\.\d+)/i; items = regexPlain.exec(cstr); if ((items != null) && (items.length == 5)) { log("info", "parsing successful Plain: " + items); var lat1 = RegExp.$1; while (lat1.indexOf(0) == 0) { lat1 = lat1.substring(1, lat1.length); } if (lat1.length == 0) lat1 = 0; var lat2 = RegExp.$2; var lat = parseInt(lat1) + parseFloat(lat2) / 60; var lng1 = RegExp.$3; while (lng1.indexOf(0) == 0) { lng1 = lng1.substring(1, lng1.length); } if (lng1.length == 0) lng1 = 0; var lng2 = RegExp.$4; var lng = parseInt(lng1) + parseFloat(lng2) / 60; fin.push(lat); fin.push(lng); return fin; } var regexDec = /(\d+\.\d+)(,\s*|\s+)(\d+\.\d+)/i; items = regexDec.exec(cstr); if ((items != null) && (items.length == 4)) { log("info", "parsing successful Dec: " + items); var lat1 = RegExp.$1; while (lat1.indexOf(0) == 0) { lat1 = lat1.substring(1, lat1.length); } if (lat1.length == 0) lat1 = 0; var lat = parseFloat(lat1); var lng1 = RegExp.$3; while (lng1.indexOf(0) == 0) { lng1 = lng1.substring(1, lng1.length); } if (lng1.length == 0) lng1 = 0; var lng = parseFloat(lng1); fin.push(lat); fin.push(lng); return fin; } fin.push("Coordinates do not match DegMin, Dec, or Plain"); return fin; } function calculateDistance(lat1, lon1, lat2, lon2) { if (typeof (Number.prototype.toRad) === "undefined") { Number.prototype.toRad = function() { return this * Math.PI / 180; }; } var R = 6371; // km var lat1dec = parseFloat(lat1); var lon1dec = parseFloat(lon1); var lat2dec = parseFloat(lat2); var lon2dec = parseFloat(lon2); var dLat = (lat2dec - lat1dec).toRad(); var dLon = (lon2dec - lon1dec).toRad(); var lat1 = lat1dec.toRad(); var lat2 = lat2dec.toRad(); var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2); var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); var d = R * c; return d; } function appendCheckBox(parentNode, id, label, extrafunction) { var currentValue = GM_getValue(id); // log('debug', 'cv: ' + currentValue); if ((currentValue == undefined) || (currentValue == null) || (currentValue == "undefined")) GM_setValue(id, false); var checkbox = document.createElement('input'); checkbox.setAttribute('type', 'checkbox'); checkbox.setAttribute('id', id); checkbox.setAttribute('class', 'Checkbox'); checkbox.setAttribute('style', 'margin:3px'); checkbox.addEventListener('mouseup', function() { var oldValue = GM_getValue(id); GM_setValue(id, !oldValue); }); var checked = GM_getValue(id); if (checked) { checkbox.setAttribute('checked', 'checked'); } parentNode.appendChild(checkbox); if (label) { var newLabel = document.createElement('label'); newLabel.setAttribute('for', id); newLabel.appendChild(document.createTextNode(label)); parentNode.appendChild(newLabel); newLabel.addEventListener('mouseup', function() { var oldValue = GM_getValue(id); GM_setValue(id, !oldValue); }); } if (extrafunction) { checkbox.addEventListener('mouseup', extrafunction); newLabel.addEventListener('mouseup', extrafunction); } parentNode.appendChild(document.createElement('br')); } /** * Base64 encode / decode http://www.webtoolkit.info/ */ var Base64 = { // private property _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", // public method for encoding encode : function(input) { var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; input = Base64._utf8_encode(input); while (i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); } return output; }, // public method for decoding decode : function(input) { var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = this._keyStr.indexOf(input.charAt(i++)); enc2 = this._keyStr.indexOf(input.charAt(i++)); enc3 = this._keyStr.indexOf(input.charAt(i++)); enc4 = this._keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } output = Base64._utf8_decode(output); return output; }, // private method for UTF-8 encoding _utf8_encode : function(string) { string = string.replace(/\r\n/g, "\n"); var utftext = ""; for ( var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if ((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128); } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128); } } return utftext; }, // private method for UTF-8 decoding _utf8_decode : function(utftext) { var string = ""; var i = 0; var c = c1 = c2 = 0; while (i < utftext.length) { c = utftext.charCodeAt(i); if (c < 128) { string += String.fromCharCode(c); i++; } else if ((c > 191) && (c < 224)) { c2 = utftext.charCodeAt(i + 1); string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); i += 2; } else { c2 = utftext.charCodeAt(i + 1); c3 = utftext.charCodeAt(i + 2); string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); i += 3; } } return string; } }; function openDownloadWindow(content, title, mimetype) { var c = Base64.encode(content); window.open("data:" + mimetype + ";base64," + c, title, "width=300,height=400,left=100,top=200"); } function GC2DBId(gcCode) { var gcId = 0; var sequence = "0123456789ABCDEFGHJKMNPQRTVWXYZ"; var rightPart = gcCode.substring(2).toUpperCase(); var base = 31; if ((rightPart.length < 4) || ((rightPart.length == 4) && (sequence.indexOf(rightPart .charAt(0)) < 16))) { base = 16; } for ( var p = 0; p < rightPart.length; p++) { gcId *= base; gcId += sequence.indexOf(rightPart.charAt(p)); } if (base == 31) { gcId += Math.pow(16, 4) - 16 * Math.pow(31, 3); } return gcId; } function DBId2GCNew(newGcId) { var gcNewCode = ""; var sequence = "tHpXJR8gyfzCrdV5G0Kb3Y92N47lTBPAhWnvLZkaexmSwq6sojDcEQMFO"; var base = 57; var rest = 0; var divResult = newGcId; do { rest = divResult % base; divResult = Math.floor(divResult / base); gcNewCode = sequence.charAt(rest) + gcNewCode; } while (divResult != 0); return gcNewCode; }
Continue reading...