blob: 62dec34a30da5820f1b1e5c9e3235f53e0a49886 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
/* brooklyn utility methods */
define([
'jquery', 'underscore'
], function ($, _) {
var Util = {};
/**
* @return {string} empty string if s is null or undefined, otherwise result of _.escape(s)
*/
Util.escape = function (s) {
if (s == undefined || s == null) return "";
return _.escape(s);
};
function isWholeNumber(v) {
return (Math.abs(Math.round(v) - v) < 0.000000000001);
}
Util.roundIfNumberToNumDecimalPlaces = function (v, mantissa) {
if (!_.isNumber(v) || mantissa < 0)
return v;
if (isWholeNumber(v))
return Math.round(v);
var vk = v, xp = 1;
for (var i=0; i < mantissa; i++) {
vk *= 10;
xp *= 10;
if (isWholeNumber(vk)) {
return Math.round(vk)/xp;
}
}
return Number(v.toFixed(mantissa));
};
Util.toDisplayString = function(data) {
if (data==null) return null;
data = Util.roundIfNumberToNumDecimalPlaces(data, 4);
if (typeof data !== 'string')
data = JSON.stringify(data);
return Util.escape(data);
};
Util.toTextAreaString = function(data) {
if (data==null) return null;
data = Util.roundIfNumberToNumDecimalPlaces(data, 8);
if (typeof data !== 'string')
data = JSON.stringify(data, null, 2);
return data;
};
if (!String.prototype.trim) {
// some older javascripts do not support 'trim' (including jasmine spec runner) so let's define it
String.prototype.trim = function(){
return this.replace(/^\s+|\s+$/g, '');
};
}
// from http://stackoverflow.com/questions/646628/how-to-check-if-a-string-startswith-another-string
if (typeof String.prototype.startsWith != 'function') {
String.prototype.startsWith = function (str){
return this.slice(0, str.length) == str;
};
}
if (typeof String.prototype.endsWith != 'function') {
String.prototype.endsWith = function (str){
return this.slice(-str.length) == str;
};
}
// poor-man's copy
Util.promptCopyToClipboard = function(text) {
window.prompt("To copy to the clipboard, press Ctrl+C then Enter.", text);
};
/**
* Returns the path component of a string URL. e.g. http://example.com/bob/bob --> /bob/bob
*/
Util.pathOf = function(string) {
if (!string) return "";
var a = document.createElement("a");
a.href = string;
return a.pathname;
};
/**
* Extracts the value of the given input. Returns true/false for for checkboxes
* rather than "on" or "off".
*/
Util.inputValue = function($input) {
if ($input.attr("type") === "checkbox") {
return $input.is(":checked");
} else {
return $input.val();
}
};
/**
* Updates or initialises the given model with the values of named elements under
* the given element. Force-updates the model by setting silent: true.
*/
Util.bindModelFromForm = function(modelOrConstructor, $el) {
var model = _.isFunction(modelOrConstructor) ? new modelOrConstructor() : modelOrConstructor;
var inputs = {};
// Look up all named elements
$("[name]", $el).each(function(idx, inp) {
var input = $(inp);
var name = input.attr("name");
inputs[name] = Util.inputValue(input);
});
model.set(inputs, { silent: true });
return model;
};
/**
* Parses xhrResponse.responseText as JSON and returns its message. Returns
* alternate message if parsing fails or the parsed object has no message.
* @param {jqXHR} xhrResponse
* @param {string} alternateMessage
* @param {string=} logMessage if false or null, does not log;
* otherwise it logs a message and the xhrResponse, with logMessage
* (or with alternateMessage if logMessage is true)
* @returns {*}
*/
Util.extractError = function (xhrResponse, alternateMessage, logMessage) {
if (logMessage) {
if (logMessage === true) {
console.error(alternateMessage);
} else {
console.error(logMessage);
}
console.log(xhrResponse);
}
try {
var response = JSON.parse(xhrResponse.responseText);
return response.message ? response.message : alternateMessage;
} catch (e) {
return alternateMessage;
}
};
secretWords = [ "password", "passwd", "credential", "secret", "private", "access.cert", "access.key" ];
Util.isSecret = function (key) {
if (!key) return false;
key = key.toString().toLowerCase();
for (secretWord in secretWords)
if (key.indexOf(secretWords[secretWord]) >= 0)
return true;
return false;
};
Util.logout = function logout() {
window.location.href = 'logout.html';
};
Util.setSelectionRange = function (input, selectionStart, selectionEnd) {
if (input.setSelectionRange) {
input.focus();
input.setSelectionRange(selectionStart, selectionEnd);
}
else if (input.createTextRange) {
var range = input.createTextRange();
range.collapse(true);
range.moveEnd('character', selectionEnd);
range.moveStart('character', selectionStart);
range.select();
}
};
Util.setCaretToPos = function (input, pos) {
Util.setSelectionRange(input, pos, pos);
};
$.fn.setCaretToStart = function() {
this.each(function(index, elem) {
Util.setCaretToPos(elem, 0);
$(elem).scrollTop(0);
});
return this;
};
$("#logout-link").on("click", function (e) {
e.preventDefault();
Util.logout();
return false;
});
return Util;
});