NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Grepolis Maps QT // @namespace Quack // @description A screenshot tool for grepolismaps.org // @include http://*.grepolismaps.org/* // @icon http://s1.directupload.net/images/140711/eshmcqzu.png // @version 1.0 // @require http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js // @grant none // ==/UserScript== var lID = window.location.href.substring(7, 9); var wID = window.location.href.substring(7, 11); var QT = {}; QT.Lang = { get : function (a, b) { if (QT.Lang[lID] != undefined && QT.Lang[lID][a] != undefined && QT.Lang[lID][a][b] != undefined) { return QT.Lang[lID][a][b] } else { return QT.Lang.en[a][b] } }, de : { tools : { brush_size : 'Pinselstärke', color : 'Farbe', eraser : 'Radiergummi', pencil : 'Zeichenstift', arrow : 'Pfeil', rectangel : 'Rechteck', line : 'Linie', arc : 'Kreis', delete_drawing : 'Zeichnung löschen', fill : 'Füllen' }, colors : { black : "schwarz", blue : "blau", red : "rot", green : "grün", yellow : "gelb", gray : "grau" } }, en : { tools : { brush_size : 'Brush Size', color : 'Color', eraser : 'Eraser', pencil : 'Pencil', arrow : 'Arrow', rectangel : 'Rectangel', line : 'Line', arc : 'Arc', delete_drawing : 'Delete drawing', fill : 'Fill' }, colors : { black : "black", blue : "blue", red : "red", green : "green", yellow : "yellow", gray : "gray" } } }; QT.Helper = { regexNum : function () { var regexNum = /\d/g; if (!regexNum.test(wID)) { return; } }, grepo_dropdown : function (ID, Options) { var str = '<span class="grepo_input"><span class="left"><span class="right"><select name="' + ID + '" id="' + ID + '" type="text">'; $.each(Options, function (a, b) { if (b[1]) { str += '<option value="' + b[0] + '">' + b[1] + '</option>' } else { str += '<option value="' + b + '">' + b + '</option>' } }); str += '</select></span></span></span>'; return str; } }; QT.Maps = { createToolbar : function () { $(".table").before('\ <div id="#qt_canvas_toolbar" style="position: absolute; left:502px; top:70px">\ <a id="eraser" class="qt_canvas_tool" href="#"></a>\ <a id="pencil" class="qt_canvas_tool active" href="#"></a>\ <a id="arrow" class="qt_canvas_tool" href="#"></a>\ <a id="line" class="qt_canvas_tool" href="#"></a>\ <a id="rectangel" class="qt_canvas_tool" href="#"></a>\ <a id="arc" class="qt_canvas_tool" href="#"></a>\ <div id="fill" class="checkbox_new">' + QT.Lang.get("tools", "fill") + '<div class="cbx_icon"></div></div>\ <div class="qt_canvas_tools_select">' + QT.Lang.get("tools", "brush_size") + '\ ' + QT.Helper.grepo_dropdown("selWidth", [1, 3, 5, 7, 9, 11, 13, 15]) + '\ </div>\ <div class="qt_canvas_tools_select">' + QT.Lang.get("tools", "color") + '\ ' + QT.Helper.grepo_dropdown("selColor", [["black", "" + QT.Lang.get("colors", "black") + ""], ["blue", "" + QT.Lang.get("colors", "blue") + ""], ["red", "" + QT.Lang.get("colors", "red") + ""], ["green", "" + QT.Lang.get("colors", "green") + ""], ["yellow", "" + QT.Lang.get("colors", "yellow") + ""], ["gray", "" + QT.Lang.get("colors", "gray") + ""]]) + '\ </div>\ <a id="clearArea" class="qt_canvas_tool" href="#"></a>\ <a id="upload" class="qt_canvas_tool" href="#"></a>\ </div>\ '); $("#map").after('\ <canvas id="myCanvas" width="1000" height="1000" style="position:absolute;left:0px;top:0px"></canvas>\ <canvas id="canvasTemp" width="1000" height="1000" style="position:absolute;left:0px;top:0px"></canvas>\ <div id="ajax_export" style="left:0px; top:0px; display:none; background:url(http://gpde.innogamescdn.com/images/game/ajax-loader_2.76.gif) no-repeat scroll center center rgba(0, 0, 0, 0.5); position:absolute; width:100%; height:100%; z-index:1000"></div>\ '); $(".qt_canvas_tool").css({ "width" : "22px", "height" : "23px", "display" : "inline-block", "background-position" : "0px 0px" }); $("#eraser").css({ "background" : "url(http://fs1.directupload.net/images/141218/5u8ojvzq.png)" }); $("#pencil").css({ "background" : "url(http://fs1.directupload.net/images/141213/9rjcrqfy.png)", "background-position" : "0px -23px" }); $("#arrow").css({ "background" : "url(http://fs1.directupload.net/images/141214/tapgcj8q.png)" }); $("#rectangel").css({ "background" : "url(http://fs1.directupload.net/images/141213/xi25lbk7.png)" }); $("#line").css({ "background" : "url(http://fs1.directupload.net/images/141213/8pyhdwes.png)" }); $("#arc").css({ "background" : "url(http://fs1.directupload.net/images/141213/eufhyzin.png)" }); $("#clearArea").css({ "background" : "url(http://fs2.directupload.net/images/141219/5agwrzkr.png)" }); $("#upload").css({ "background" : "url(http://s14.directupload.net/images/141014/3j8vsimv.png)" }); $(".checkbox_new").css({ "cursor" : "pointer", "display" : "inline-block", "line-height" : "16px", "overflow" : "hidden", "padding" : "0px", "position" : "relative", "text-align" : "left", "vertical-align" : "middle", "margin-bottom" : "14px" }); $(".cbx_icon").css({ "background" : "url(http://fs1.directupload.net/images/141219/amylfy94.png) no-repeat scroll -14px 0px rgba(0, 0, 0, 0)", "float" : "right", "height" : "15px", "position" : "relative", "width" : "14px", "margin-left" : "5px" }); $(".qt_canvas_tools_select").css({ "bottom" : "6px", "position" : "relative", "display" : "inline-block" }); $("span.grepo_input").css({ "height" : "23px", "overflow" : "hidden" }); $("span.grepo_input span").css({ "background" : "url(http://gpde.innogamescdn.com/images/game/layout/input_bg_2.33.png) no-repeat scroll 0 0 rgba(0, 0, 0, 0)", "display" : "inline-block" }); $("span.grepo_input span.left").css({ "background-position" : "left 0" }); $("span.grepo_input span.right").css({ "background-position" : "right -23px" }); $("span.grepo_input select").css({ "background" : "url(http://gpde.innogamescdn.com/images/game/layout/input_bg_2.33.png) repeat-x scroll 0 -46px rgba(0, 0, 0, 0)", "border" : "0 none", "height" : "22px", "margin" : "0 3px", "padding" : "3px 0" }); $("span.grepo_input option").css({ "background" : "none repeat scroll 0 0 #fff0cb" }); $("#selWidth").val("5"); $("#selColor").val("red"); $(".qt_canvas_tool").hover( function () { $(this).not(".active").css({ "background-position" : "0px -23px" }); }, function () { $(this).not(".active").css({ "background-position" : "0px 0px" }); }); $(".qt_canvas_tool:not(#clearArea,#upload)").click(function () { $(".qt_canvas_tool").removeClass("active").css({ "background-position" : "0px 0px" }); $(this).addClass("active").css({ "background-position" : "0px -23px" }); }); $("#fill").click(function () { if ($(".cbx_icon").hasClass("checked")) { $(".cbx_icon").removeClass("checked").css({ "background-position" : "-14px 0px" }); } else { $(".cbx_icon").addClass("checked").css({ "background-position" : "0px 0px" }); } }); QT.Maps.init(); }, init : function () { var lastX, lastY, startX, startY, canvasEl, canvasTemp, ctx, ctxTemp, tool; var mousePressed = false; var fill = false; var map = document.getElementById('map'); var tools = {}; tools.arc = function (x, y) { ctxTemp.beginPath(); ctxTemp.clearRect(0, 0, ctxTemp.canvas.width, ctxTemp.canvas.height); ctxTemp.arc(x, y, Math.abs(x - startX), 0, Math.PI * 2, true); ctxTemp.closePath(); ctxTemp.stroke(); if (fill) { ctxTemp.fill(); } }; tools.arrow = function (x, y) { ctxTemp.clearRect(0, 0, ctxTemp.canvas.width, ctxTemp.canvas.height); ctxTemp.beginPath(); ctxTemp.moveTo(startX, startY); ctxTemp.lineTo(x, y); ctxTemp.stroke(); var endRadians = Math.atan((y - startY) / (x - startX)); endRadians += ((x >= startX) ? 90 : -90) * Math.PI / 180; ctxTemp.save(); ctxTemp.translate(x, y); ctxTemp.rotate(endRadians); ctxTemp.moveTo(0, -1.9 * ctxTemp.lineWidth); ctxTemp.lineTo(2.5 * ctxTemp.lineWidth, 3.2 * ctxTemp.lineWidth); ctxTemp.lineTo(-2.5 * ctxTemp.lineWidth, 3.2 * ctxTemp.lineWidth); ctxTemp.closePath(); ctxTemp.restore(); ctxTemp.fill(); }; tools.eraser = function (x, y) { ctx.beginPath(); ctx.lineJoin = "round"; ctx.globalCompositeOperation = "destination-out"; ctx.strokeStyle = 'rgba(0,0,0,1.0)'; ctx.moveTo(lastX, lastY); ctx.lineTo(x, y); ctx.closePath(); ctx.stroke(); }; tools.line = function (x, y) { ctxTemp.clearRect(0, 0, ctxTemp.canvas.width, ctxTemp.canvas.height); ctxTemp.beginPath(); ctxTemp.moveTo(startX, startY); ctxTemp.lineTo(x, y); ctxTemp.stroke(); ctxTemp.closePath(); }; tools.pencil = function (x, y) { ctxTemp.beginPath(); ctxTemp.lineJoin = "round"; ctxTemp.moveTo(lastX, lastY); ctxTemp.lineTo(x, y); ctxTemp.closePath(); ctxTemp.stroke(); }; tools.rectangel = function (x, y) { ctxTemp.beginPath(); ctxTemp.clearRect(0, 0, ctxTemp.canvas.width, ctxTemp.canvas.height); ctxTemp.rect(startX, startY, x - startX, y - startY); ctxTemp.closePath(); ctxTemp.stroke(); if (fill) { ctxTemp.fill(); } }; function Draw(x, y, tool, isDown) { if (isDown) { tools[tool](x, y); } lastX = x; lastY = y; } function img_update() { ctx.drawImage(canvasTemp, 0, 0); ctxTemp.clearRect(0, 0, canvasTemp.width, canvasTemp.height); } function clearArea() { ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); ctx.drawImage(map, 0, 0); } canvasEl = document.getElementById('myCanvas'); ctx = canvasEl.getContext("2d"); canvasTemp = document.getElementById('canvasTemp'); ctxTemp = canvasTemp.getContext("2d"); $('#canvasTemp').mousedown(function (e) { mousePressed = true; if ($(".cbx_icon").hasClass("checked")) { fill = true; } else { fill = false; } ctxTemp.lineWidth = $('#selWidth').val(); ctxTemp.strokeStyle = $('#selColor').val(); ctxTemp.fillStyle = $('#selColor').val(); ctx.lineWidth = $('#selWidth').val(); ctx.globalCompositeOperation = "source-over"; startX = e.pageX - $(this).offset().left; startY = e.pageY - $(this).offset().top; tool = $('.qt_canvas_tool.active').prop('id'); Draw(e.pageX - $(this).offset().left, e.pageY - $(this).offset().top, tool, false); }); $('#canvasTemp').mousemove(function (e) { if (mousePressed) { Draw(e.pageX - $(this).offset().left, e.pageY - $(this).offset().top, tool, true); } }); $('#canvasTemp').mouseup(function (e) { mousePressed = false; img_update(); }); $('#canvasTemp').mouseleave(function (e) { mousePressed = false; img_update(); }); $('#clearArea').click(function () { clearArea(); }); $('#upload').click(function () { var uploadCanvas = document.createElement("canvas"); uploadCanvas.id = "uploadCanvas"; uploadCanvas.width = 1000; uploadCanvas.height = 1000; var upC_ctx = uploadCanvas.getContext("2d"); upC_ctx.drawImage(map, 0, 0); upC_ctx.drawImage(canvasEl, 0, 0); $("#ajax_export").show(); $.ajax({ url : 'https://api.imgur.com/3/upload.json', type : 'POST', headers : { Authorization : 'Client-ID ed9c3c98c1f5bba' }, data : { type : 'base64', name : 'quack_toolsammlung.jpg', title : 'Grepolis - Quack Toolsammlung', description : 'Powered by http://www.grepolisqt.de', image : uploadCanvas.toDataURL().split(',')[1] }, dataType : 'json' }).done(function (data) { console.log(data); $("#ajax_export").hide(); var image_url; if (lID == "de") { image_url = 'http://grepolisqt.de/de/image-de/' + data.data.id; } else { image_url = 'http://grepolisqt.de/en/image-en/' + data.data.id; } if (/chrom(e|ium)/.test(navigator.userAgent.toLowerCase())) { window.open(image_url, '_blank', 'width=1000,height=600'); } else { window.open(image_url, '_blank'); } }).fail(function () { $("#ajax_export").hide(); }); }); } }; $(document).ready(function () { QT.Maps.createToolbar(); });