(function(module) { 'use strict'; var utils, fs, XRegExp; if ('undefined' === typeof window) { fs = require('fs'); XRegExp = require('xregexp').XRegExp; } else { XRegExp = window.XRegExp; } module.exports = utils = { generateUUID: function() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); }, //Adapted from http://stackoverflow.com/questions/5827612/node-js-fs-readdir-recursive-directory-search walk: function(dir, done) { var results = [], path = require('path'), main_dir = path.join(__dirname, '..', 'templates'); fs.readdir(dir, function(err, list) { if (err) { return done(err); } var pending = list.length; if (!pending) { return done(null, results); } list.forEach(function(file) { file = dir + '/' + file; fs.stat(file, function(err, stat) { if (stat && stat.isDirectory()) { utils.walk(file, function(err, res) { results = results.concat(res); if (!--pending) { done(null, results); } }); } else { results.push(file.replace(main_dir + '/', '').replace('.tpl', '')); if (!--pending) { done(null, results); } } }); }); }); }, relativeTime: function(timestamp, min) { var now = +new Date(), difference = now - Math.floor(parseFloat(timestamp)); if(difference < 0) { difference = 0; } difference = Math.floor(difference / 1000); if (difference < 60) { return difference + (min ? 's' : ' second') + (difference !== 1 && !min ? 's' : ''); } difference = Math.floor(difference / 60); if (difference < 60) { return difference + (min ? 'm' : ' minute') + (difference !== 1 && !min ? 's' : ''); } difference = Math.floor(difference / 60); if (difference < 24) { return difference + (min ? 'h' : ' hour') + (difference !== 1 && !min ? 's' : ''); } difference = Math.floor(difference / 24); if (difference < 30) { return difference + (min ? 'd' : ' day') + (difference !== 1 && !min ? 's' : ''); } difference = Math.floor(difference / 30); if (difference < 12) { return difference + (min ? 'mon' : ' month') + (difference !== 1 && !min ? 's' : ''); } difference = Math.floor(difference / 12); return difference + (min ? 'y' : ' year') + (difference !== 1 && !min ? 's' : ''); }, //http://dense13.com/blog/2009/05/03/converting-string-to-slug-javascript/ slugify: function(str) { var invalidChars = XRegExp('[^\\p{L} 0-9\-]', 'g'); str = str.replace(/^\s+|\s+$/g, ''); // trim str = str.toLowerCase(); str = XRegExp.replace(str, invalidChars, ''); str = str.replace(/\s+/g, '-') // collapse whitespace and replace by - str = str.replace(/-+/g, '-'); // collapse dashes return str; }, // from http://stackoverflow.com/questions/46155/validate-email-address-in-javascript isEmailValid: function(email) { // var re = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/; var valid = email.indexOf('@') !== -1 ? true : false; return valid; }, isUserNameValid: function(name) { return (name && name !== "" && (/^['"\s\-.*0-9\u00BF-\u1FFF\u2C00-\uD7FF\w]+$/.test(name))); }, isPasswordValid: function(password) { return password && password.indexOf(' ') === -1; }, buildMetaTags: function(tagsArr) { var tags = '', tag; for (var x = 0, numTags = tagsArr.length; x < numTags; x++) { if (tags.length > 0) { tags += "\n\t"; } tag = ' 0) tags += "\n\t"; tag = ' 999999) { return (n / 1000000).toFixed(1) + 'm'; } else if(n > 999) { return (n / 1000).toFixed(1) + 'k'; } return n; } }; if (!String.prototype.trim) { String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); }; } if ('undefined' !== typeof window) { window.utils = module.exports; } })('undefined' === typeof module ? { module: { exports: {} } } : module);