There are 43 previous versions of this script.
the source is over 100KB, syntax highlighting in the browser is too slow
// ==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 65
// @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 $ = unsafeWindow.$;
var version = "65";
var updatechangesurl = 'https://gccomment.svn.sourceforge.net/svnroot/gccomment/trunk/gccomment/src/version.xml';
var updateurl = 'http://userscripts.org/scripts/source/75959.meta.js';
// thanks to Geggi
// Check for Scriptish bug in Fennec browser
GM_setValue("browser", "firefox");
var test_browser = GM_getValue("browser");
if (!test_browser) {
console.log("Scriptish GM_getValue bug detected");
var FENNEC_PREFIX = "scriptvals.GCComment@httpwww.birnbaum2001.comgccomment.";
// GM_getValue Funktion überschreiben
var GM_getValue_Orig = GM_getValue;
GM_getValue = function(key, def) {
return GM_getValue_Orig(FENNEC_PREFIX + key, def);
};
// GM_listValues überschreiben: FENNEC_PREFIX wird von den Keys gelöscht
var GM_listValues_Orig = GM_listValues;
GM_listValues = function() {
var keys = GM_listValues_Orig();
for ( var i = 0; i < keys.length; i++) {
if (keys[i].indexOf(FENNEC_PREFIX) >= 0) {
// we got a comment
keys[i] = keys[i].split(FENNEC_PREFIX)[1];
}
}
return keys;
};
}
// end thanks ;)
// UI Elements - Profile page
var configDiv;
var commentTable;
var exportDiv;
var importDiv;
var deleteAllDiv;
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;
// Map
var markers = new Array();
// 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 AUTOMOVEMYSTERIESBETA = "autoMoveMysteriesbeta";
var AUTOMOVEMYSTERIESBETAFOUND = "autoMoveMysteriesbetafound";
var AUTOMOVEMYSTERIESBETASOLVED = "autoMoveMysteriesbetasolved";
var AUTOMOVEMYSTERIESBETAHOME = "autoMoveMysteriesbetahome";
var AUTOMOVEMYSTERIESBETAUNSOLVED = "autoMoveMysteriesbetaunsolved";
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";
var EXPORT_FILTER_ALL = "EXPORT_FILTER_ALL";
var EXPORT_FILTER_UNTYPED = "EXPORT_FILTER_UNTYPED";
var EXPORT_FILTER_UNSOLVED = "EXPORT_FILTER_UNSOLVED";
var EXPORT_FILTER_SOLVED = "EXPORT_FILTER_SOLVED";
var EXPORT_FILTER_FOUND = "EXPORT_FILTER_FOUND";
var DELETEALL_FILTER_ALL = "DELETEALL_FILTER_ALL";
var DELETEALL_FILTER_UNTYPED = "DELETEALL_FILTER_UNTYPED";
var DELETEALL_FILTER_UNSOLVED = "DELETEALL_FILTER_UNSOLVED";
var DELETEALL_FILTER_SOLVED = "DELETEALL_FILTER_SOLVED";
var DELETEALL_FILTER_FOUND = "DELETEALL_FILTER_FOUND";
// 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 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 origfound = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAACaSURBVHja7JXLCoAgEEWdiGjpB4WL6KsjAsWvimhKYdAMgny0iO5qBOfMYzEXEJGRlFLuESEhBFAMBuwD12ph9dacPt3J5FKOX6AOgX03QEyXYQGQUmI4Ropo+oq6zS0L9veTFZxTtNLs4GId/+Af/AXwO0eoyCrstT+u26wnTIVNesSLgxi4b1FPrInihrWMc+48r4SZ7gIMANPlS6BG6nS1AAAAAElFTkSuQmCC';
var origsolved = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAC7SURBVHja7JVLDsIwDETtNkDPwT6rIsQZuCQHghUcgivwS4Y6yCUIKVKp2fVJaaZSPflUGjMAUlbE75cfOBBYNYtxbji7NXSfXz4+KiG1WpMv0BsPNSwtkIzX0SHGQPs6Mhmgp68CP8iFBVlRw6W5kkd+P2ORjfbGlug/MjdWJuPJeDIuhZBmsHkIqbBCIjghQd+CsLk2ED1mbM9LtEniuzXJCST6hrQmqZGddoJ2pyN571+t6R/N9CnAAC9tlQThla5PAAAAAElFTkSuQmCC';
var origunsolved = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAACvSURBVHjaYvz//z8DHDAyInGIA39ZEGzm3/8Z4UaBDUYyEKSQ+Q+Q8R+hCK/BrIz/Qep/cSDE2L7/Z2RCtxlsK5GGoqtn+4HkeaBTIa4lwTB84Bcn43+QBUzo4UQpgLkabDA4TKkMmKhuIjRIqW8wzVw8avCowcPBYGgRTPVCiA5BASw0wKUbGdUSOnioyY4o20FVE6iwx8AgcWIwmr6rR4+C9TJSWpliKzJBACDAAOfWdEr4Mcv8AAAAAElFTkSuQmCC';
var finaliconfound = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFRSURBVHjaYvz//z8DDBw6dAjBIQPY2dkxwtiMIIOxGQhURJRhQL1YLWAh10B09RgWHDx48D8Iw8DGvaf/5zfPBdNgMK/tPykAZh4LLpfsO3aJwWOnKwPbjG8MDAUNYLFfGVxgmk2jDKEwsRKrfiZCXoUZBjYQZAlI7EYXGIMt5GdnYJjfzvDm3j38BlspCJGeHIAWiBxciRLmGAaLKCnB2WW8vRhmwFyN4Su0IMEaFDKy0kQ5FB7mne+JC2M1WWGc4YziemAkvjl/Hasc1lTh52QCThX4wKf0s+BgE8EhjzNVwIIDPZxBLgR5HTkuSDIYPTgYJjSADSVkIN6ggCW7fceI8zZJLkZ22bEH70hO2nhznpOVHjx7U9VglEhDy7KEilG8BoOSHbnBQdDFsGR36/FbkgxGqUGwFfKgIIC5FtkH+IIBVIPQrGpipFVlChBgAFhG0uUgufqcAAAAAElFTkSuQmCC';
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=';
var finaliconunsolved = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIVSURBVHjaYvz//z8DHDAy/v/PBKT+MRAN3kgyMHwTYGBg/s3wX/o2SDcEsICI/8yM/2GGfeNlYuD+COR8/UqUweyyPAwi1/8zvJJlYAQ5DCz4/z/Iif/BLv3JycjA/h3IfvCAgUFUFKKLi4tol38WATr2PyMD77t/YIOZQIZ+AJrD/uoTUPYzw/aL9xgK+lYwbDpxDaJjfjtRBvO++cfA+/gzPEjBQfHAkIPBgIcHLPabhxdM7zt2icFjpysD24xvDAwFDWCxXxkQH7BplCFMTKxEseAv0ETmPwwM4MDWOfADp0tghoENBFkCErvRBcZgC/nZwb56c+8eOOiYoHHFhG6QlYIQA8kAaIHIwZWQUPj8FbvBIkpKcHYZby+GGTBXY/gKLUiYsDlARlaaKIfCw7zzPYYcVoPVZIVxhjOK64GR+Ob8daxyLNgE/ZxMwKkCH/iUfhYcbCI45JlwaYQFB3o4g1wI8jpyXJBkMHpwMExoABtKyEC8QQFLdvuOEedtklyM7LJjD96RnLSZ8Ek6WenBszdVDUaJNFCWJQL84+Nm+McMNfiKAwcDrmRHanCADf0LNfjvX9xVBizZ3Xr8liiD/7DAUgWwUDYGlp/f+ZgYOJ98QFXFx8eQYKsKdK0wjlzyCYV7OUSdQfcbUg2CXDXBwcePxAU+Pz8K9+6OHdeV3d21GCmtTMFVHEwP0KUwMYAAAwD3trv/JouOHAAAAABJRU5ErkJggg==';
// currently not used
// var fadedMysteryIcon =
// 'data:image/gif;base64,R0lGODlhEAAQAJEAAOfq+JSfy4ODg/7+/iH5BAEAAAMALAAAAAAQABAAAAIznC2pxwgPRUOh2gAkE1bZvFXawGEjWYGo2ZRSqbZvek5obN+1ze18kpsAgwcOLmf0CX0FADs=';
// 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);
if (!comment)
continue;
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);
};
}
// register own CSS styles
appendCSS(
"text",
"a.gccselect {padding-bottom:5px;background-color:#EBECED;outline:1px solid #D7D7D7}",
null);
// 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("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();
appendScript('src',
'http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.0/jquery.dataTables.js');
appendCSS(
'src',
'http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.0/css/jquery.dataTables.css');
appendCSS(
'text',
'.odd{background-color:#ffffff} .even{background-color:#E8E8E8} .ui-icon{display:inline-block;}');
// 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('style',
'cursor:pointer;padding-left:5px;padding-right:5px;margin-left:5px');
gcclink.setAttribute('id', 'configDivButton');
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();');
gccRoot.appendChild(document.createTextNode(' | '));
var showCommentsLink = document.createElement('a');
showCommentsLink.setAttribute('id', 'gccommenttabledivButton');
showCommentsLink.appendChild(document
.createTextNode('Show my comments'));
showCommentsLink.addEventListener('mouseup', function() {
toggleTabOnProfile('gccommenttablediv');
}, false);
showCommentsLink
.setAttribute('style',
'cursor:pointer;text-decoration:none;padding-left:5px;padding-right:5px');
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;vertical-align:bottom');
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;vertical-align:bottom');
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;vertical-align:bottom');
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;vertical-align:bottom');
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;vertical-align:bottom');
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(' | '));
var exportToggleButton = document.createElement('a');
exportToggleButton.setAttribute('id', 'exportDivButton');
exportToggleButton.appendChild(document.createTextNode('Export'));
exportToggleButton
.setAttribute('style',
'cursor:pointer;text-decoration:none;padding-left:5px;padding-right:5px');
exportToggleButton.addEventListener('mouseup', function() {
toggleTabOnProfile('exportDiv');
}, false);
gccRoot.appendChild(exportToggleButton);
gccRoot.appendChild(document.createTextNode(' '));
// var exportButtonGCC = document.createElement('a');
// exportButtonGCC.appendChild(document.createTextNode('GCC'));
// exportButtonGCC.addEventListener('mouseup', function() {
// var data = "<?xml version='1.0' encoding='UTF-8'?>"
// + buildGCCExportString();
// openDownloadWindow(data, "Export data", "application/gccomment");
// }, false);
// exportButtonGCC.setAttribute('style',
// 'cursor:pointer;text-decoration:underline;');
// gccRoot.appendChild(exportButtonGCC);
//
// gccRoot.appendChild(document.createTextNode(' '));
//
// var exportButtonGPX = document.createElement('a');
// exportButtonGPX.appendChild(document.createTextNode('GPX'));
// exportButtonGPX.addEventListener('mouseup', exportToGPX, false);
// exportButtonGPX.setAttribute('style',
// 'cursor:pointer;text-decoration:underline;');
// gccRoot.appendChild(exportButtonGPX);
//
// gccRoot.appendChild(document.createTextNode(' '));
//
// var exportButtonCSV = document.createElement('a');
// exportButtonCSV.appendChild(document.createTextNode('CSV'));
// exportButtonCSV.addEventListener('mouseup', exportToCSV, false);
// exportButtonCSV.setAttribute('style',
// 'cursor:pointer;text-decoration:underline;');
// gccRoot.appendChild(exportButtonCSV);
//
// gccRoot.appendChild(document.createTextNode(' '));
//
// var exportButtonHTML = document.createElement('a');
// exportButtonHTML.appendChild(document.createTextNode('HTML'));
// exportButtonHTML.addEventListener('mouseup', exportToHTML, false);
// exportButtonHTML.setAttribute('style',
// 'cursor:pointer;text-decoration:underline;');
// gccRoot.appendChild(exportButtonHTML);
gccRoot.appendChild(document.createTextNode(' | '));
var importLink = document.createElement('a');
importLink.setAttribute('id', 'importDivButton');
importLink.appendChild(document.createTextNode('Import'));
importLink.addEventListener('mouseup', function() {
toggleTabOnProfile('importDiv');
}, false);
importLink
.setAttribute('style',
'cursor:pointer;text-decoration:none;padding-left:5px;padding-right:5px');
gccRoot.appendChild(importLink);
gccRoot.appendChild(document.createTextNode(' | '));
var deleteAllLink = document.createElement('a');
deleteAllLink.setAttribute('id', 'deleteAllDivButton');
deleteAllLink.appendChild(document.createTextNode('Delete'));
deleteAllLink.addEventListener('mouseup', function() {
toggleTabOnProfile('deleteAllDiv');
}, false);
deleteAllLink
.setAttribute('style',
'cursor:pointer;text-decoration:none;padding-left:5px;padding-right:5px');
gccRoot.appendChild(deleteAllLink);
//
// PATCH DIV
//
if (unsafeWindow.File && unsafeWindow.FileReader
&& unsafeWindow.FileList && unsafeWindow.Blob) {
gccRoot.appendChild(document.createTextNode(' | '));
var patchGPXLink = document.createElement('a');
patchGPXLink.setAttribute('id', 'patchDivButton');
patchGPXLink.appendChild(document.createTextNode('Patch GPX'));
patchGPXLink.addEventListener('mouseup', function() {
toggleTabOnProfile('patchDiv');
}, false);
patchGPXLink
.setAttribute('style',
'cursor:pointer;text-decoration:none;padding-left:5px;padding-right:5px');
gccRoot.appendChild(patchGPXLink);
patchDiv = document.createElement('div');
patchDiv.setAttribute('id', 'patchDiv');
patchDiv
.setAttribute(
'style',
'margin:5px;padding:10px;outline:1px solid #D7D7D7;position:relative;background-color:#EBECED');
patchDiv.style.display = 'none';
gccRoot.appendChild(patchDiv);
var patchDivExplanation = document.createElement('p');
patchDivExplanation
.appendChild(document
.createTextNode("You can open an existing GPX file and patch it according to the options selected below. By pressing 'Patch and Download', the GPX file will be loaded and you will be asked to save a file with a strange filename. Save it and rename the file to something useful, e.g., 'onlysolved.gpx'."));
patchDiv.appendChild(patchDivExplanation);
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);
}
//
// CONFIG DIV
//
configDiv = document.createElement('div');
configDiv.setAttribute('id', 'configDiv');
configDiv
.setAttribute(
'style',
'margin:5px;padding:10px;outline:1px solid #D7D7D7;position:relative;background-color:#EBECED');
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 (e.g., GC Tour)'));
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('input');
saveButton.setAttribute('type', 'button');
saveButton.setAttribute('value', 'Save preferences');
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);
//
// gccommenttablediv
//
var tableDiv = document.createElement('div');
tableDiv.setAttribute('id', 'gccommenttablediv');
tableDiv
.setAttribute(
'style',
'margin: 5px; padding: 4px; outline: 1px solid rgb(215, 215, 215); position: relative; background-color: rgb(235, 236, 237);display:none');
gccRoot.appendChild(tableDiv);
//
// EXPORT DIV
//
exportDiv = document.createElement('div');
exportDiv.setAttribute('id', 'exportDiv');
exportDiv
.setAttribute(
'style',
'margin:5px;padding:10px;outline:1px solid #D7D7D7;position:relative;background-color:#EBECED');
exportDiv.style.display = 'none';
exportDiv.appendChild(document
.createTextNode("1. Choose which type of comments to export."));
// single selection: gcc, gpx, csv, html, server
// multi selection: all, untyped, unsolved, solved, found
var exportFilterDiv = document.createElement('div');
appendCheckBox(exportFilterDiv, EXPORT_FILTER_ALL, "all",
toggleExportFilterOptions);
appendCheckBox(exportFilterDiv, EXPORT_FILTER_UNTYPED, "untyped");
appendCheckBox(exportFilterDiv, EXPORT_FILTER_UNSOLVED, "unsolved");
appendCheckBox(exportFilterDiv, EXPORT_FILTER_SOLVED, "solved");
appendCheckBox(exportFilterDiv, EXPORT_FILTER_FOUND, "found");
exportDiv.appendChild(exportFilterDiv);
var exportTypeDiv = document.createElement('div');
exportTypeDiv.appendChild(document
.createTextNode('2. Choose the target format: '));
var exportTypeSelector = document.createElement('select');
exportTypeSelector.setAttribute("name", "exportTypeSelector");
exportTypeSelector.setAttribute("id", "exportTypeSelector");
exportTypeSelector.setAttribute('size', 1);
var option0 = document.createElement('option');
option0.appendChild(document.createTextNode("GCC"));
var option1 = document.createElement('option');
option1.appendChild(document.createTextNode("GPX"));
var option2 = document.createElement('option');
option2.appendChild(document.createTextNode("CSV"));
var option3 = document.createElement('option');
option3.appendChild(document.createTextNode("HTML"));
// var option4 = document.createElement('option');
// option4.appendChild(document.createTextNode("Server"));
exportTypeSelector.appendChild(option0);
exportTypeSelector.appendChild(option1);
exportTypeSelector.appendChild(option2);
exportTypeSelector.appendChild(option3);
// exportTypeSelector.appendChild(option4);
exportTypeDiv.appendChild(exportTypeSelector);
exportDiv.appendChild(exportTypeDiv);
var explainP = document.createElement('p');
explainP.setAttribute('style', 'margin-top:1.5em');
explainP
.appendChild(document
.createTextNode("By pressing the 'Perform Export' button, your caches will be filtered and the output will be generated. You will be asked to save a cryptically named file. Just store it where you like and rename it appropriately, e.g., 'myfinds2012.html'."));
exportDiv.appendChild(explainP);
var exportButton = document.createElement('input');
exportButton.setAttribute('type', 'button');
exportButton.setAttribute('value', 'Perform Filtered Export');
exportButton.addEventListener('click', performFilteredExport, false);
exportButton.setAttribute('style', 'margin:5px');
exportDiv.appendChild(exportButton);
if ((GM_getValue("gccServer") != undefined)
&& (GM_getValue("gccServer") != "")) {
gccRoot.appendChild(document.createTextNode(' '));
serverExportLink = document.createElement('input');
serverExportLink.setAttribute('type', 'button');
serverExportLink.setAttribute('value', 'Export all to server');
serverExportLink.addEventListener('mouseup', storeToServer, false);
exportDiv.appendChild(serverExportLink);
}
gccRoot.appendChild(exportDiv);
//
// IMPORT DIV
//
importDiv = document.createElement('div');
importDiv.setAttribute('id', 'importDiv');
importDiv
.setAttribute(
'style',
'margin:5px;padding:10px;outline:1px solid #D7D7D7;position:relative;background-color:#EBECED');
importDiv.style.display = 'none';
gccRoot.appendChild(importDiv);
var importDivExplanation = document.createElement('p');
importDivExplanation
.appendChild(document
.createTextNode("You can import backups that were previously exported using GCComment. The only file formatted supported right now is GCC, i.e., GCComments own file format. After pressing the 'Execute Import' button, the import will be parsed. Comments will be imported, unless there is already a comment with a newer time stamp. So more recent comments cannot be overwritten by older backups."));
importDiv.appendChild(importDivExplanation);
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 (*.gcc): '));
importDiv.appendChild(input);
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);
}
if ((GM_getValue("gccServer") != undefined)
&& (GM_getValue("gccServer") != "")) {
serverImportLink = document.createElement('input');
serverImportLink.setAttribute('type', 'button');
serverImportLink.setAttribute('value', 'Load from server');
serverImportLink.addEventListener('mouseup', loadFromServer, false);
importDiv.appendChild(serverImportLink);
}
importText = document.createElement('textarea');
importText.setAttribute('id', 'gccommentimporttextarea');
importText.cols = 100;
importText.rows = 10;
importDiv.appendChild(importText);
var submitImport = document.createElement('input');
submitImport.setAttribute('type', 'button');
submitImport.setAttribute('value', 'Execute import');
submitImport.setAttribute('style', 'margin:5px');
submitImport.addEventListener('mouseup', parseXMLImport, false);
importDiv.appendChild(document.createElement('br'));
importDiv.appendChild(submitImport);
var cancelImport = document.createElement('input');
cancelImport.setAttribute('type', 'button');
cancelImport.setAttribute('value', 'Close import window');
cancelImport.addEventListener('mouseup', function() {
importresult.innerHTML = "";
toggleTabOnProfile('importDiv');
}, false);
cancelImport.setAttribute('style', 'margin:5px');
importDiv.appendChild(document.createTextNode('\t'));
importDiv.appendChild(cancelImport);
importresult = document.createElement('p');
submitImport.parentNode.appendChild(importresult);
//
// DELETE DIV
//
deleteAllDiv = document.createElement('div');
deleteAllDiv.setAttribute('id', 'deleteAllDiv');
deleteAllDiv
.setAttribute(
'style',
'margin:5px;padding:10px;outline:1px solid #D7D7D7;position:relative;background-color:#EBECED');
deleteAllDiv.style.display = 'none';
deleteAllDiv.appendChild(document
.createTextNode("Select the types you want to delete:"));
deleteAllDiv.appendChild(document.createElement('br'));
appendCheckBox(deleteAllDiv, DELETEALL_FILTER_ALL, "all",
toggleDeleteAllFilterOptions);
appendCheckBox(deleteAllDiv, DELETEALL_FILTER_UNTYPED, "untyped");
appendCheckBox(deleteAllDiv, DELETEALL_FILTER_UNSOLVED, "unsolved");
appendCheckBox(deleteAllDiv, DELETEALL_FILTER_SOLVED, "solved");
appendCheckBox(deleteAllDiv, DELETEALL_FILTER_FOUND, "found");
var deleteAllButton = document.createElement('input');
deleteAllButton.setAttribute('type', 'button');
deleteAllButton.setAttribute('value', 'Perform Delete All');
deleteAllButton.addEventListener('click', performFilteredDeleteAll,
false);
deleteAllDiv.appendChild(deleteAllButton);
gccRoot.appendChild(deleteAllDiv);
waitingTag = document.createElement('img');
waitingTag.setAttribute('src', waitingGif);
waitingTag.setAttribute('id', 'waiting');
waitingTag.setAttribute('style', 'padding-right:5px');
if (GM_getValue(EXPORT_FILTER_ALL))
toggleExportFilterOptions();
if (GM_getValue(DELETEALL_FILTER_ALL))
toggleDeleteAllFilterOptions();
}
}
function toggleExportFilterOptions() {
if (GM_getValue(EXPORT_FILTER_ALL)) {
$('#EXPORT_FILTER_UNTYPED').attr('disabled', 'disabled');
$('#EXPORT_FILTER_UNSOLVED').attr('disabled', 'disabled');
$('#EXPORT_FILTER_SOLVED').attr('disabled', 'disabled');
$('#EXPORT_FILTER_FOUND').attr('disabled', 'disabled');
} else {
$('#EXPORT_FILTER_UNTYPED').removeAttr('disabled');
$('#EXPORT_FILTER_UNSOLVED').removeAttr('disabled');
$('#EXPORT_FILTER_SOLVED').removeAttr('disabled');
$('#EXPORT_FILTER_FOUND').removeAttr('disabled');
}
}
function toggleDeleteAllFilterOptions() {
if (GM_getValue(DELETEALL_FILTER_ALL)) {
$('#DELETEALL_FILTER_UNTYPED').attr('disabled', 'disabled');
$('#DELETEALL_FILTER_UNSOLVED').attr('disabled', 'disabled');
$('#DELETEALL_FILTER_SOLVED').attr('disabled', 'disabled');
$('#DELETEALL_FILTER_FOUND').attr('disabled', 'disabled');
} else {
$('#DELETEALL_FILTER_UNTYPED').removeAttr('disabled');
$('#DELETEALL_FILTER_UNSOLVED').removeAttr('disabled');
$('#DELETEALL_FILTER_SOLVED').removeAttr('disabled');
$('#DELETEALL_FILTER_FOUND').removeAttr('disabled');
}
}
function performFilteredDeleteAll() {
var check = confirm('Do you really want to delete comments according to your filters?\n\nIf you press ok, all comments will be lost!\n\nMake sure to have a backup!');
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) {
var comment = doLoadCommentFromGUID(key
.substr(COMPREFIX.length));
if (GM_getValue(DELETEALL_FILTER_ALL)
|| (comment.state === stateOptions[0] && GM_getValue(DELETEALL_FILTER_UNTYPED))
|| (comment.state === stateOptions[1] && GM_getValue(DELETEALL_FILTER_UNSOLVED))
|| (comment.state === stateOptions[2] && GM_getValue(DELETEALL_FILTER_SOLVED))
|| (comment.state === stateOptions[3] && GM_getValue(DELETEALL_FILTER_FOUND))) {
log("info", "deleted: " + key + "(" + GM_getValue(key)
+ ")");
GM_deleteValue(key);
}
}
}
}
}
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, false);
}
function gccommentOnLogPage() {
var guid = document.getElementById(
'ctl00_ContentBody_LogBookPanel1_WaypointLink')
.getAttribute('href').split("guid=")[1];
if (guid) {
var comment = doLoadCommentFromGUID(guid);
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);
}, false);
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';
}, false);
}
}
}
function toggleTabOnProfile(tabid) {
log('debug', 'tabid ' + tabid);
// do specials
if ((tabid == 'gccommenttablediv')
&& (!commentTable || ($('#gccommenttablediv').css('display') === 'none'))) {
refreshTable(false);
displayFilters.style.display = "inline";
} else {
displayFilters.style.display = "none";
}
// perfom actual toggle
$('#' + tabid).slideToggle('slow');
$('#' + tabid + 'Button').toggleClass('gccselect');
// hide others
if ((tabid != 'configDiv') && (configDiv.style.display != 'none')) {
$('#configDiv').slideToggle('slow');
$('#configDivButton').removeClass('gccselect');
}
if ((tabid != 'exportDiv') && (exportDiv.style.display != 'none')) {
$('#exportDiv').slideToggle('slow');
$('#exportDivButton').removeClass('gccselect');
}
if ((tabid != 'importDiv') && (importDiv.style.display != 'none')) {
$('#importDiv').slideToggle('slow');
$('#importDivButton').removeClass('gccselect');
}
if ((tabid != 'deleteAllDiv') && (deleteAllDiv.style.display != 'none')) {
$('#deleteAllDiv').slideToggle('slow');
$('#deleteAllDivButton').removeClass('gccselect');
}
if ((tabid != 'patchDiv') && (patchDiv.style.display != 'none')) {
$('#patchDiv').slideToggle('slow');
$('#patchDivButton').removeClass('gccselect');
}
if ((tabid != 'gccommenttablediv') && commentTable
&& ($('#gccommenttablediv').css('display') != 'none')) {
$('#gccommenttablediv').slideToggle('slow');
$('#gccommenttabledivButton').removeClass('gccselect');
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('uxLatLon').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]) {
option0.setAttribute('selected', 'true');
} else if (currentComment.state === stateOptions[1]) {
option1.setAttribute('selected', 'true');
} else if (currentComment.state === stateOptions[2]) {
option2.setAttribute('selected', 'true');
} else if (currentComment.state === stateOptions[3]) {
option3.setAttribute('selected', 'true');
} else
log('debug', 'Error, invalid state ' + currentComment.state);
}
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');
var hookTBody = document.getElementById('Print');
if (hookTBody) {
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');
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]) {
option0.setAttribute('selected', 'true');
} else if (currentComment.state === stateOptions[1]) {
option1.setAttribute('selected', 'true');
} else if (currentComment.state === stateOptions[2]) {
option2.setAttribute('selected', 'true');
} else if (currentComment.state === stateOptions[3]) {
option3.setAttribute('selected', 'true');
} else
log('debug', 'Invalid state: ' + currentComment.state);
}
if (currentComment && currentComment.lat && currentComment.lng) {
detailFinalInputLatLng.value = convertDec2DMS(currentComment.lat,
currentComment.lng);
unsafeWindow.L.OrigMap = unsafeWindow.L.Map;
unsafeWindow.L.Map = function(id, params) {
var result = new unsafeWindow.L.OrigMap(id, params);
if (id === 'map_canvas' | id === 'map_preview_canvas')
setTimeout(
function() {
var latlng = new unsafeWindow.L.LatLng(
currentComment.lat, currentComment.lng);
var pinIcon = unsafeWindow.L.Icon
.extend( {
iconSize : new unsafeWindow.L.Point(
20, 23),
iconAnchor : new unsafeWindow.L.Point(
10, 23),
shadowUrl : null
});
var marker = new unsafeWindow.L.Marker(
latlng,
{
icon : new pinIcon(
{
iconUrl : finalIcon,
iconAnchor : new unsafeWindow.L.Point(
10, 23)
}),
title : "Final",
clickable : false
});
result.addLayer(marker);
var latlngHome = new unsafeWindow.L.LatLng(
currentComment.origlat,
currentComment.origlng);
var bounds = new unsafeWindow.L.LatLngBounds();
bounds.extend(latlngHome);
bounds.extend(latlng);
result.fitBounds(bounds);
}, 1000);
return result;
};
} 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) {
$('#gccommenttablediv').empty();
}
commentTable = document.createElement('table');
commentTable.setAttribute('id', 'gccommentoverviewtable');
commentTable
.setAttribute(
'style',
'width:auto; outline: 1px solid rgb(215, 215, 215); position: relative;background-color:#EBECED');
// commentTable.setAttribute('class', 'Table');
var thead = document.createElement('thead');
commentTable.appendChild(thead);
var header = document.createElement('tr');
var headeritem = document.createElement('th');
headeritem.innerHTML = 'Cache';
headeritem.setAttribute('style', 'width:200px;font-weight:bold');
header.appendChild(headeritem);
headeritem = document.createElement('th');
headeritem.innerHTML = 'My comment & final coordinates';
headeritem.setAttribute('style', 'font-weight:bold');
header.appendChild(headeritem);
headeritem = document.createElement('th');
headeritem.innerHTML = 'last save';
headeritem.setAttribute('style', 'width:65px;font-weight:bold');
header.appendChild(headeritem);
headeritem = document.createElement('th');
headeritem.innerHTML = 'Actions';
headeritem.setAttribute('style', 'width:120px;font-weight:bold');
header.appendChild(headeritem);
thead.appendChild(header);
var tbody = document.createElement('tbody');
commentTable.appendChild(tbody);
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);
tbody.appendChild(tr);
}
$('#gccommenttablediv').append(commentTable);
if (!show) {
$('#gccommenttablediv').css('display', 'none');
// $('#gccommentoverviewtable').css('display', 'none');
} else {
// commentTable.style.display = 'block';
// commentTable.setAttribute('style', 'table-layout:fixed;');
}
$('#gccommentoverviewtable').dataTable( {
"bAutoWidth" : false,
"bJQueryUI" : true,
"aoColumns" : [ {
"sWidth" : "200px"
}, {
"sWidth" : "457px"
}, {
"sWidth" : "80px"
}, {
"sWidth" : "120px",
"bSortable" : false
} ]
});
$('#gccommentoverviewtable_length').append(". ").append(
$('#gccommentoverviewtable_filter > label').css('margin', '10px'))
.css('padding', '5px').css('font-weight', '500').append(
$('#gccommentoverviewtable_info')).append(
$('#gccommentoverviewtable_paginate'));
$('#gccommentoverviewtable').css('margin-bottom', '0px');
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 == "") {
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() {
// @TODO GS icons change at less that zoom level 14
var stm_myCaches = document.getElementById("search");
if (stm_myCaches != null) {
var mmDiv = document.createElement('div');
var mmOption = document.createElement('input');
mmOption.setAttribute('id', 'autoMoveMysteriesBeta');
mmOption.setAttribute('type', 'checkbox');
mmOption.setAttribute('class', 'Checkbox');
var mmOptionLabel = document.createElement('label');
mmOptionLabel.setAttribute('id', 'autoMoveMysteriesLabelBeta');
mmOptionLabel.setAttribute('for', 'autoMoveMysteriesBeta');
mmOptionLabel.appendChild(document
.createTextNode('Enable Mystery Mover'));
mmOptionLabel.addEventListener('click', toggleMoveMysteries, false);
var mmSub = document.createElement('div');
mmSub.setAttribute('id', 'mmSub');
mmSub.setAttribute('data-role', 'controlgroup');
mmSub.setAttribute('data-type', 'horizontal');
mmSub.setAttribute('style', 'display:none');
var mmSubSolvedOption = document.createElement('input');
mmSubSolvedOption.setAttribute('id', 'mmSubSolvedOption');
mmSubSolvedOption.setAttribute('type', 'checkbox');
mmSubSolvedOption.setAttribute('class', 'Checkbox');
mmSub.appendChild(mmSubSolvedOption);
var mmSubSolvedLabel = document.createElement('label');
mmSubSolvedLabel.setAttribute('for', 'mmSubSolvedOption');
mmSubSolvedLabel.appendChild(document.createTextNode('Solved'));
mmSubSolvedLabel.setAttribute('style',
'font-size:12px;width:81px;text-align:center;');
mmSub.appendChild(mmSubSolvedLabel);
mmSubSolvedLabel.addEventListener('click', function() {
var oldValue = GM_getValue(AUTOMOVEMYSTERIESBETASOLVED);
if (oldValue === 1) {
GM_setValue(AUTOMOVEMYSTERIESBETASOLVED, 0);
} else {
GM_setValue(AUTOMOVEMYSTERIESBETASOLVED, 1);
}
moveMysteriesBeta();
}, false);
var mmSubFoundOption = document.createElement('input');
mmSubFoundOption.setAttribute('id', 'mmSubFoundOption');
mmSubFoundOption.setAttribute('type', 'checkbox');
mmSubFoundOption.setAttribute('class', 'Checkbox');
mmSub.appendChild(mmSubFoundOption);
var mmSubFoundLabel = document.createElement('label');
mmSubFoundLabel.setAttribute('for', 'mmSubFoundOption');
mmSubFoundLabel.appendChild(document.createTextNode('Found'));
mmSubFoundLabel.setAttribute('style',
'font-size:12px;width:81px;text-align:center;');
mmSub.appendChild(mmSubFoundLabel);
mmSubFoundLabel.addEventListener('click', function() {
var oldValue = GM_getValue(AUTOMOVEMYSTERIESBETAFOUND);
if (oldValue === 1) {
GM_setValue(AUTOMOVEMYSTERIESBETAFOUND, 0);
} else {
GM_setValue(AUTOMOVEMYSTERIESBETAFOUND, 1);
}
moveMysteriesBeta();
}, false);
var mmSubUnsolvedOption = document.createElement('input');
mmSubUnsolvedOption.setAttribute('id', 'mmSubUnsolvedOption');
mmSubUnsolvedOption.setAttribute('type', 'checkbox');
mmSubUnsolvedOption.setAttribute('class', 'Checkbox');
mmSub.appendChild(mmSubUnsolvedOption);
var mmSubUnsolvedLabel = document.createElement('label');
mmSubUnsolvedLabel.setAttribute('for', 'mmSubUnsolvedOption');
mmSubUnsolvedLabel.appendChild(document.createTextNode('Unsolved'));
mmSubUnsolvedLabel.setAttribute('style',
'font-size:12px;width:81px;text-align:center;');
mmSub.appendChild(mmSubUnsolvedLabel);
mmSubUnsolvedLabel.addEventListener('click', function() {
var oldValue = GM_getValue(AUTOMOVEMYSTERIESBETAUNSOLVED);
if (oldValue === 1) {
GM_setValue(AUTOMOVEMYSTERIESBETAUNSOLVED, 0);
} else {
GM_setValue(AUTOMOVEMYSTERIESBETAUNSOLVED, 1);
}
moveMysteriesBeta();
}, false);
var mmSubShowHomeOption = document.createElement('input');
mmSubShowHomeOption.setAttribute('id', 'mmSubShowHomeOption');
mmSubShowHomeOption.setAttribute('type', 'checkbox');
mmSubShowHomeOption.setAttribute('class', 'Checkbox');
mmSub.appendChild(mmSubShowHomeOption);
var mmSubShowHomeLabel = document.createElement('label');
mmSubShowHomeLabel.setAttribute('for', 'mmSubShowHomeOption');
mmSubShowHomeLabel.appendChild(document.createTextNode('Home'));
mmSubShowHomeLabel.setAttribute('style',
'font-size:12px;width:81px;text-align:center;');
mmSub.appendChild(mmSubShowHomeLabel);
mmSubShowHomeLabel.addEventListener('click', function() {
var oldValue = GM_getValue(AUTOMOVEMYSTERIESBETAHOME);
if (oldValue === 1) {
GM_setValue(AUTOMOVEMYSTERIESBETAHOME, 0);
} else {
GM_setValue(AUTOMOVEMYSTERIESBETAHOME, 1);
}
moveMysteriesBeta();
}, false);
mmDiv.appendChild(mmOption);
mmDiv.appendChild(mmOptionLabel);
mmDiv.appendChild(mmSub);
stm_myCaches.insertBefore(mmDiv, stm_myCaches.firstChild);
// fill with already set content
var ammbeta = GM_getValue(AUTOMOVEMYSTERIESBETA);
var ammfound = GM_getValue(AUTOMOVEMYSTERIESBETAFOUND);
var ammsolved = GM_getValue(AUTOMOVEMYSTERIESBETASOLVED);
var ammhome = GM_getValue(AUTOMOVEMYSTERIESBETAHOME);
if (ammfound == 1)
mmSubFoundOption.setAttribute('checked', 'checked');
if (ammsolved == 1)
mmSubSolvedOption.setAttribute('checked', 'checked');
if (ammhome == 1)
mmSubShowHomeOption.setAttribute('checked', 'checked');
if (ammbeta == 1) {
GM_setValue(AUTOMOVEMYSTERIESBETA, 0);
setTimeout(function() {
var event = document.createEvent('MouseEvent');
event.initMouseEvent('click', true, true, window, 1, 0, 0, 0,
0, false, false, false, false, 0, mmOptionLabel);
mmOptionLabel.dispatchEvent(event);
}, 100);
}
setTimeout(function() {
$('#mmSub span.ui-btn-inner').css('padding', '5px 10px 5px 10px');
$('#autoMoveMysteriesLabelBeta span.ui-btn-inner').css('width',
'257');
$('#autoMoveMysteriesLabelBeta').css('width', '327');
}, 1000);
}
}
function toggleMoveMysteries() {
var oldValue = GM_getValue(AUTOMOVEMYSTERIESBETA);
$('#mmSub').slideToggle();
if (oldValue === 1) {
removeMarkers("all");
GM_setValue(AUTOMOVEMYSTERIESBETA, 0);
} else {
GM_setValue(AUTOMOVEMYSTERIESBETA, 1);
moveMysteriesBeta();
}
}
function drawMarker(lat, lng, type, state, gccode, comment) {
var oldIconProto = unsafeWindow.L.Icon.prototype;
if (type === "final" && state === "found")
unsafeWindow.L.Icon.prototype.options.iconUrl = finaliconfound;
else if (type === "final" && state === "solved")
unsafeWindow.L.Icon.prototype.options.iconUrl = finaliconsolved;
else if (type === "final" && state === "not solved")
unsafeWindow.L.Icon.prototype.options.iconUrl = finaliconunsolved;
else if (type === "home" && state === "found")
unsafeWindow.L.Icon.prototype.options.iconUrl = origfound;
else if (type === "home" && state === "solved")
unsafeWindow.L.Icon.prototype.options.iconUrl = origsolved;
else if (type === "home" && state === "not solved")
unsafeWindow.L.Icon.prototype.options.iconUrl = origunsolved;
unsafeWindow.L.Icon.prototype.options.iconSize = new unsafeWindow.L.Point(
22, 22);
unsafeWindow.L.Icon.prototype.options.iconAnchor = new unsafeWindow.L.Point(
11, 11);
unsafeWindow.L.Icon.prototype.options.shadowSize = new unsafeWindow.L.Point(
0, 0);
var FinalIcon = unsafeWindow.L.Icon.extend( {
iconUrl : finalIcon
});
// http://www.geocaching.com/map/map.details?i=GC2KHDH&_=1330805175632
var finalMarker = new FinalIcon();
var marker = new unsafeWindow.L.Marker(new unsafeWindow.L.LatLng(lat, lng),
{
icon : finalMarker
});
marker.on('click', function(event) {
var gcurl = "http://www.geocaching.com/map/map.details?i=" + gccode
+ "&_=" + new Date().getTime();
// log('debug', 'gcurl: ' + gcurl);
$.ajax( {
url : gcurl,
success : function(a) {
// log('debug', 'result: ' + a.data);
var b = "cd" + Math.ceil(9999999999999 * Math.random());
var h = [ '<div id="', b, '"></div>' ].join("");
// h = h + "<div id='comment' class='links Clear'>" + comment
// + "</div>";
var popup = new unsafeWindow.L.Popup( {
offset : new unsafeWindow.L.Point(-178, 2)
});
popup.setContent(h);
popup.setLatLng(marker.getLatLng());
unsafeWindow.MapSettings.Map.openPopup(popup);
$('#map_canvas').find("#" + b).link(a, "#cachePopupTemplate")
.delegate(
"a.prev-item",
"click",
function(a) {
a.preventDefault();
$(this).parents("div.map-item").hide()
.prev().show();
return false;
}).delegate(
"a.next-item",
"click",
function(a) {
a.preventDefault();
$(this).parents("div.map-item").hide()
.next().show();
return false;
});
$('#map_canvas').find("#" + b).parent().width('401px');
setTimeout(function() {
popup._adjustPan();
}, 100);
}
});
});
unsafeWindow.MapSettings.Map.addLayer(marker);
markers.push(marker);
unsafeWindow.L.Icon.prototype = oldIconProto;
}
function drawLine(finallat, finallng, origlat, origlng, state) {
var latlngs = new Array();
latlngs.push(new unsafeWindow.L.LatLng(finallat, finallng));
latlngs.push(new unsafeWindow.L.LatLng(origlat, origlng));
var color = "red";
if (state === "found")
color = "#cccccc";
else if (state === "solved")
color = "#66ff00";
else if (state === "not solved")
color = "#ff0000";
var link = new unsafeWindow.L.Polyline(latlngs, {
color : color,
weight : 2,
clickable : false,
opacity : 1,
fillOpacity : 1
});
unsafeWindow.MapSettings.Map.addLayer(link);
markers.push(link);
}
function removeMarkers(type) {
for ( var i = 0; i < markers.length; i++) {
unsafeWindow.MapSettings.Map.removeLayer(markers[i]);
}
markers = new Array();
}
function createMovedFinal(finallat, finallng, name, origlat, origlng, guid,
commentValue, state, home, newid, gccode) {
// log('debug', 'drawing ' + guid + " lat: " + finallat + " lng: " +
// finallng
// + " origlat: " + origlat + " origlng: " + origlng);
drawMarker(finallat, finallng, "final", state, gccode, commentValue);
if (home && origlat && origlng) {
drawLine(finallat, finallng, origlat, origlng, state);
drawMarker(origlat, origlng, "home", state, gccode, commentValue);
}
}
function moveMysteriesBeta() {
// log("info", "moving mysteries beta ... " + solved + ":" + found);
var found = GM_getValue(AUTOMOVEMYSTERIESBETAFOUND);
var solved = GM_getValue(AUTOMOVEMYSTERIESBETASOLVED);
var unsolved = GM_getValue(AUTOMOVEMYSTERIESBETAUNSOLVED);
var home = GM_getValue(AUTOMOVEMYSTERIESBETAHOME);
var stUnsolved = null;
if (unsolved)
stUnsolved = stateOptions[1];
var stSolved = null;
if (solved)
stSolved = stateOptions[2];
var stFound = null;
if (found)
stFound = stateOptions[3];
removeMarkers("all");
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.state == stUnsolved))
&& ((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/>"));
createMovedFinal(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)), comment.gccode);
}
}
}
}
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(filtered) {
var result = "<gccomment>";
var filteredComments = getComments(filtered);
for ( var i = 0; i < filteredComments.length; i++) {
var comment = filteredComments[i];
result = result + "<comment>";
result = result + "<gcid>";
result = result + comment.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 getComments(filtered) {
var filteredComments = new Array();
var commentKeys = GM_listValues();
for ( var i = 0; i < commentKeys.length; i++) {
if (commentKeys[i].indexOf(COMPREFIX) > -1) {
// log('debug', 'key: ' + commentKeys[i]);
var guid = commentKeys[i].substr(COMPREFIX.length);
// log('debug', 'guid: ' + guid);
var comment = doLoadCommentFromGUID(guid);
if (filtered) {
var filteredInclude = false;
if (GM_getValue(EXPORT_FILTER_ALL))
filteredInclude = true;
if (GM_getValue(EXPORT_FILTER_UNTYPED)
&& comment.state === stateOptions[0])
filteredInclude = true;
if (GM_getValue(EXPORT_FILTER_UNSOLVED)
&& comment.state === stateOptions[1])
filteredInclude = true;
if (GM_getValue(EXPORT_FILTER_SOLVED)
&& comment.state === stateOptions[2])
filteredInclude = true;
if (GM_getValue(EXPORT_FILTER_FOUND)
&& comment.state === stateOptions[3])
filteredInclude = true;
if (!filteredInclude)
continue;
}
filteredComments.push(comment);
}
}
return filteredComments;
}
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\" xmlns:groundspeak=\"http://www.groundspeak.com/cache/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 filteredComments = getComments(true);
for ( var i = 0; i < filteredComments.length; i++) {
var comment = filteredComments[i];
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"
+ " <cmt>GCComment: "
+ escapeXML(comment.commentValue)
+ "</cmt>\n"
+ " <desc>"
+ escapeXML(comment.name)
+ "</desc>\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 performFilteredExport() {
var exportType = $('#exportTypeSelector option:selected').text();
if (exportType === "GCC") {
var data = "<?xml version='1.0' encoding='UTF-8'?>"
+ buildGCCExportString(true);
openDownloadWindow(data, "Export data", "application/gccomment");
} else if (exportType === "CSV")
exportToCSV();
else if (exportType === "HTML")
exportToHTML();
else if (exportType === "GPX")
exportToGPX();
}
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 = "";
result = result + filestart;
var filteredComments = getComments(true);
for ( var i = 0; i < filteredComments.length; i++) {
var comment = filteredComments[i];
result = result + linestart;
result = result + pre + comment.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() {
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);
importText.value = response;
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 = encodeURIComponent("<?xml version='1.0' encoding='UTF-8'?><gccommentmessage id='gccomment' method='store' uuid='"
+ GM_getValue("gccUUID")
+ "' username='"
+ escapeXML(getUserName())
+ "'>"
+ buildGCCExportString(false)
+ "</gccommentmessage>");
log('debug', 'Data string size: ' + dataString.length);
// log('debug', 'Data string content: ' + dataString);
GM_xmlhttpRequest( {
method : 'POST',
url : "http://" + GM_getValue("gccServer")
+ ":18080/GCComment-ServerServlet/GCCommentServlet",
data : dataString,
headers : {
"Content-Type" : "application/x-www-form-urlencoded"
},
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 appendCSS(type, css, context) {
var element = document.createElement('style');
element.setAttribute('type', 'text/css');
if (type == 'src') {
element.setAttribute('src', css);
} else if (type == 'text') {
element.textContent = css;
}
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);
}, false);
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() {
if (!checkbox.getAttribute('disabled')) {
var oldValue = GM_getValue(id);
GM_setValue(id, !oldValue);
}
}, false);
}
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;
}