// ==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...