This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/app/assets/javascripts/discourse/components/utilities.js
2013-03-13 16:04:48 -04:00

169 lines
4.6 KiB
JavaScript

/**
General utility functions
@class Utilities
@namespace Discourse
@module Discourse
**/
Discourse.Utilities = {
translateSize: function(size) {
switch (size) {
case 'tiny':
size = 20;
break;
case 'small':
size = 25;
break;
case 'medium':
size = 32;
break;
case 'large':
size = 45;
}
return size;
},
categoryUrlId: function(category) {
var id, slug;
if (!category) {
return "";
}
id = Em.get(category, 'id');
slug = Em.get(category, 'slug');
if ((!slug) || slug.isBlank()) {
return "" + id + "-category";
}
return slug;
},
// Create a badge like category link
categoryLink: function(category) {
var color, name, description, result;
if (!category) return "";
color = Em.get(category, 'color');
name = Em.get(category, 'name');
description = Em.get(category, 'description');
// Build the HTML link
result = "<a href=\"/category/" + this.categoryUrlId(category) + "\" class=\"badge-category\" ";
// Add description if we have it
if (description) result += "title=\"" + description + "\" ";
return result + "style=\"background-color: #" + color + "\">" + name + "</a>";
},
avatarUrl: function(username, size, template) {
var rawSize;
if (!username) {
return "";
}
size = Discourse.Utilities.translateSize(size);
rawSize = (size * (window.devicePixelRatio || 1)).toFixed();
if (template) {
return template.replace(/\{size\}/g, rawSize);
}
return "/users/" + (username.toLowerCase()) + "/avatar/" + rawSize + "?__ws=" + (encodeURIComponent(Discourse.BaseUrl || ""));
},
avatarImg: function(options) {
var extraClasses, size, title, url;
size = Discourse.Utilities.translateSize(options.size);
title = options.title || "";
extraClasses = options.extraClasses || "";
url = Discourse.Utilities.avatarUrl(options.username, options.size, options.avatarTemplate);
return "<img width='" + size + "' height='" + size + "' src='" + url + "' class='avatar " +
(extraClasses || "") + "' title='" + (Handlebars.Utils.escapeExpression(title || "")) + "'>";
},
tinyAvatar: function(username) {
return Discourse.Utilities.avatarImg({ username: username, size: 'tiny' });
},
postUrl: function(slug, topicId, postNumber) {
var url;
url = "/t/";
if (slug) {
url += slug + "/";
}
url += topicId;
if (postNumber > 1) {
url += "/" + postNumber;
}
return url;
},
emailValid: function(email) {
// see: http://stackoverflow.com/questions/46155/validate-email-address-in-javascript
var re;
re = /^[a-zA-Z0-9!#$%&'*+\/=?\^_`{|}~\-]+(?:\.[a-zA-Z0-9!#$%&'\*+\/=?\^_`{|}~\-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-]*[a-zA-Z0-9])?$/;
return re.test(email);
},
selectedText: function() {
var html = '';
if (typeof window.getSelection !== "undefined") {
var sel = window.getSelection();
if (sel.rangeCount) {
var container = document.createElement("div");
for (var i = 0, len = sel.rangeCount; i < len; ++i) {
container.appendChild(sel.getRangeAt(i).cloneContents());
}
html = container.innerHTML;
}
} else if (typeof document.selection !== "undefined") {
if (document.selection.type === "Text") {
html = document.selection.createRange().htmlText;
}
}
// Strip out any .click elements from the HTML before converting it to text
var div = document.createElement('div');
div.innerHTML = html;
$('.clicks', $(div)).remove();
var text = div.textContent || div.innerText || "";
return String(text).trim();
},
// Determine the position of the caret in an element
caretPosition: function(el) {
var r, rc, re;
if (el.selectionStart) {
return el.selectionStart;
}
if (document.selection) {
el.focus();
r = document.selection.createRange();
if (!r) return 0;
re = el.createTextRange();
rc = re.duplicate();
re.moveToBookmark(r.getBookmark());
rc.setEndPoint('EndToStart', re);
return rc.text.length;
}
return 0;
},
// Set the caret's position
setCaretPosition: function(ctrl, pos) {
var range;
if (ctrl.setSelectionRange) {
ctrl.focus();
ctrl.setSelectionRange(pos, pos);
return;
}
if (ctrl.createTextRange) {
range = ctrl.createTextRange();
range.collapse(true);
range.moveEnd('character', pos);
range.moveStart('character', pos);
return range.select();
}
}
};