X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/8acdba8bdd2be14c2408518812660431fa9e59fb..ea63736b5c1b6e1d1adbf043f025cc9cb4171bcb:/app/assets/javascripts/site.js diff --git a/app/assets/javascripts/site.js b/app/assets/javascripts/site.js index be16dd059..311798aa5 100644 --- a/app/assets/javascripts/site.js +++ b/app/assets/javascripts/site.js @@ -1,8 +1,7 @@ -//= require prototype -//= require prototype_ujs -//= require effects -//= require dragdrop -//= require controls +//= require jquery +//= require jquery_ujs +//= require jquery.autogrowtextarea +//= require jquery.timers /* * Called as the user scrolls/zooms around to aniplate hrefs of the @@ -22,50 +21,50 @@ function updatelinks(lon,lat,zoom,layers,minlon,minlat,maxlon,maxlat,objtype,obj maxlat = Math.round(maxlat * decimals) / decimals; } - $$(".geolink").each(function (link) { + $(".geolink").each(function (index, link) { var args = getArgs(link.href); - if (link.hasClassName("llz")) { + if ($(link).hasClass("llz")) { args.lat = lat; args.lon = lon; args.zoom = zoom; - } else if (minlon && link.hasClassName("bbox")) { + } else if (minlon && $(link).hasClass("bbox")) { args.bbox = minlon + "," + minlat + "," + maxlon + "," + maxlat; } - if (layers && link.hasClassName("layers")) { + if (layers && $(link).hasClass("layers")) { args.layers = layers; } - if (objtype && link.hasClassName("object")) { + if (objtype && $(link).hasClass("object")) { args[objtype] = objid; } - if (link.hasClassName("minzoom[0-9]+")) { - $w(link.className).each(function (classname) { - if (match = classname.match(/^minzoom([0-9]+)$/)) { - var minzoom = match[1]; - var name = link.id.replace(/anchor$/, ""); - - if (zoom >= minzoom) { - link.onclick = null; - link.title = i18n("javascripts.site." + name + "_tooltip"); - link.removeClassName("disabled"); - } else { - link.onclick = function () { alert(i18n("javascripts.site." + name + "_zoom_alert")); return false; }; - link.title = i18n("javascripts.site." + name + "_disabled_tooltip"); - link.addClassName("disabled"); - } + var classes = $(link).attr("class").split(" "); + + $(classes).each(function (index, classname) { + if (match = classname.match(/^minzoom([0-9]+)$/)) { + var minzoom = match[1]; + var name = link.id.replace(/anchor$/, ""); + + $(link).off("click.minzoom"); + + if (zoom >= minzoom) { + $(link).attr("title", i18n("javascripts.site." + name + "_tooltip")); + $(link).removeClass("disabled"); + } else { + $(link).on("click.minzoom", function () { alert(i18n("javascripts.site." + name + "_zoom_alert")); return false; }); + $(link).attr("title", i18n("javascripts.site." + name + "_disabled_tooltip")); + $(link).addClass("disabled"); } - }); - } + } + }); link.href = setArgs(link.href, args); }); - node = $("shortlinkanchor"); - if (node) { - var args = getArgs(node.href); + $("#shortlinkanchor").each(function () { + var args = getArgs(this.href); var code = makeShortCode(lat, lon, zoom); var prefix = shortlinkPrefix(); @@ -76,22 +75,22 @@ function updatelinks(lon,lat,zoom,layers,minlon,minlat,maxlon,maxlat,objtype,obj // This is a hack to omit the default mapnik layer from the shortlink. if (layers && layers != "M") { - args["layers"] = layers; + args.layers = layers; } else { - delete args["layers"]; + delete args.layers; } // Here we're assuming that all parameters but ?layers= and // ?{node,way,relation}= can be safely omitted from the shortlink // which encodes lat/lon/zoom. If new URL parameters are added to // the main slippy map this needs to be changed. - if (args["layers"] || args[objtype]) { - node.href = setArgs(prefix + "/go/" + code, args); + if (args.layers || args[objtype]) { + this.href = setArgs(prefix + "/go/" + code, args); } else { - node.href = prefix + "/go/" + code; + this.href = prefix + "/go/" + code; } - } + }); } /* @@ -109,7 +108,7 @@ function shortlinkPrefix() { * Called to get the arguments from a URL as a hash. */ function getArgs(url) { - var args = new Object(); + var args = {}; var querystart = url.indexOf("?"); if (querystart >= 0) { @@ -120,7 +119,7 @@ function getArgs(url) { if (match = queryitems[i].match(/^(.*)=(.*)$/)) { args[unescape(match[1])] = unescape(match[2]); } else { - args[unescape(queryitems[i])] = null + args[unescape(queryitems[i])] = null; } } } @@ -132,10 +131,9 @@ function getArgs(url) { * Called to set the arguments on a URL from the given hash. */ function setArgs(url, args) { - var queryitems = new Array(); + var queryitems = []; - for (arg in args) - { + for (arg in args) { if (args[arg] == null) { queryitems.push(escape(arg)); } else { @@ -146,23 +144,6 @@ function setArgs(url, args) { return url.replace(/\?.*$/, "") + "?" + queryitems.join("&"); } -/* - * Called to get a CSS property for an element. - */ -function getStyle(el, property) { - var style; - - if (el.currentStyle) { - style = el.currentStyle[property]; - } else if( window.getComputedStyle ) { - style = document.defaultView.getComputedStyle(el,null).getPropertyValue(property); - } else { - style = el.style[property]; - } - - return style; -} - /* * Called to interpolate JavaScript variables in strings using a * similar syntax to rails I18n string interpolation - the only @@ -171,7 +152,7 @@ function getStyle(el, property) { * rails and then later by javascript. */ function i18n(string, keys) { - string = i18n_strings[string] || string + string = i18n_strings[string] || string; for (var key in keys) { var re_key = '\\[\\[' + key + '\\]\\]'; @@ -204,7 +185,7 @@ function interlace(x, y) { * Called to create a short code for the short link. */ function makeShortCode(lat, lon, zoom) { - char_array = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_@"; + char_array = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_~"; var x = Math.round((lon + 180.0) * ((1 << 30) / 90.0)); var y = Math.round((lat + 90.0) * ((1 << 30) / 45.0)); // JavaScript only has to keep 32 bits of bitwise operators, so this has to be @@ -225,3 +206,64 @@ function makeShortCode(lat, lon, zoom) { } return str; } + +/* + * Click handler to switch a rich text control to preview mode + */ +function previewRichtext(event) { + var editor = $(this).parents(".richtext_container").find("textarea"); + var preview = $(this).parents(".richtext_container").find(".richtext_preview"); + var width = editor.outerWidth() - preview.outerWidth() + preview.innerWidth(); + var minHeight = editor.outerHeight() - preview.outerHeight() + preview.innerHeight(); + + if (preview.contents().length == 0) { + preview.oneTime(500, "loading", function () { + preview.addClass("loading"); + }); + + preview.load(editor.attr("data-preview-url"), { text: editor.val() }, function () { + preview.stopTime("loading"); + preview.removeClass("loading"); + }); + } + + editor.hide(); + preview.width(width); + preview.css("min-height", minHeight + "px"); + preview.show(); + + $(this).siblings(".richtext_doedit").prop("disabled", false); + $(this).prop("disabled", true); + + event.preventDefault(); +} + +/* + * Click handler to switch a rich text control to edit mode + */ +function editRichtext(event) { + var editor = $(this).parents(".richtext_container").find("textarea"); + var preview = $(this).parents(".richtext_container").find(".richtext_preview"); + + preview.hide(); + editor.show(); + + $(this).siblings(".richtext_dopreview").prop("disabled", false); + $(this).prop("disabled", true); + + event.preventDefault(); +} + +/* + * Setup any rich text controls + */ +$(document).ready(function () { + $(".richtext_preview").hide(); + $(".richtext_content textarea").change(function () { + $(this).parents(".richtext_container").find(".richtext_preview").empty(); + }); + $(".richtext_doedit").prop("disabled", true); + $(".richtext_dopreview").prop("disabled", false); + $(".richtext_doedit").click(editRichtext); + $(".richtext_dopreview").click(previewRichtext); +});