blob: 6728a1b87588634d0552d0fd0a61d9a8cf60fdff [file] [log] [blame]
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
// This file creates a set of helper functions that will be loaded for all html
// templates. These functions should be self contained and not rely on any
// external dependencies as they are loaded prior to the application. We may
// want to change this later, but for now this should be thought of as a
// "purely functional" helper system.
define([
"jquery",
"lodash"
],
function ($, _) {
var onWindowResize = {};
var utils = {
// Thanks to: http://stackoverflow.com/a/2880929
getParams: function (queryString) {
if (queryString) {
// I think this could be combined into one if
if (queryString.substring(0, 1) === "?") {
queryString = queryString.substring(1);
} else if (queryString.indexOf('?') > -1) {
queryString = queryString.split('?')[1];
}
}
var hash = window.location.hash.split('?')[1];
queryString = queryString || hash || window.location.search.substring(1);
var match,
urlParams = {},
pl = /\+/g, // Regex for replacing addition symbol with a space
search = /([^&=]+)=?([^&]*)/g,
decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); },
query = queryString;
if (queryString) {
while ((match = search.exec(query))) {
urlParams[decode(match[1])] = decode(match[2]);
}
}
return urlParams;
},
// this takes the current URL and replaces all ?x=x with whatever new params are passed
replaceQueryParams: function (params) {
var fragment = window.location.hash.replace(/\?.*$/, "");
if (!_.isEmpty(params)) {
fragment = fragment + "?" + $.param(params);
}
return fragment;
},
addWindowResize: function (fun, key) {
onWindowResize[key] = fun;
// You shouldn't need to call it here. Just define it at startup and each time it will loop
// through all the functions in the hash.
//app.initWindowResize();
},
removeWindowResize: function (key) {
delete onWindowResize[key];
utils.initWindowResize();
},
initWindowResize: function () {
//when calling this it should be overriding what was called previously
window.onresize = function (e) {
// could do this instead of the above for loop
_.each(onWindowResize, function (fn) {
fn();
});
};
},
removeSpecialCharacters: function (name) {
return name.replace(/[^\w\s]/gi, "");
},
safeURLName: function (name) {
var testName = name || "";
var checkforBad = testName.match(/[\$\-/,+-]/g);
return (checkforBad !== null) ? encodeURIComponent(name) : name;
},
getDocTypeFromId: function (id) {
if (id && /^_design\//.test(id)) {
return 'design doc';
}
return 'doc';
},
// Need this to work around backbone router thinking _design/foo
// is a separate route. Alternatively, maybe these should be
// treated separately. For instance, we could default into the
// json editor for docs, or into a ddoc specific page.
getSafeIdForDoc: function (id) {
if (utils.getDocTypeFromId(id) === 'design doc') {
var ddoc = id.replace(/^_design\//, '');
return '_design/' + utils.safeURLName(ddoc);
}
return utils.safeURLName(id);
},
// a pair of simple local storage wrapper functions. These ward against problems getting or
// setting (e.g. local storage full) and allow you to get/set complex data structures
localStorageSet: function (key, value) {
if (_.isObject(value) || _.isArray(value)) {
value = JSON.stringify(value);
}
var success = true;
try {
window.localStorage.setItem(key, value);
} catch (e) {
success = false;
}
return success;
},
localStorageGet: function (key) {
var data;
if (_.has(window.localStorage, key)) {
data = window.localStorage[key];
try {
return JSON.parse(data);
} catch (e) {
return data;
}
}
return data;
},
stripHTML: function (str) {
var tmpElement = document.createElement("div");
tmpElement.innerHTML = str;
return tmpElement.textContent || tmpElement.innerText;
}
};
return utils;
});