/*global exports: false, require: false */
/*jslint onevar: false */
// Released under the MIT/X11 license
// http://www.opensource.org/licenses/mit-license.php
"use strict";
// ==============================================================
var xhrMod = require("xhr");
var urlMod = require("url");
/**
* Function for the management of the prototypal inheritace
* David Flanagan, Javascript: The Definitve Guide,
* IV. edition, O'Reilly, 2006, p. 168
*
* @param superobject
* @return new object, it needs new prototype.constructor
*
* <pre>
* function Father(x) {
* this.family = x;
* }
*
* function Son(x,w) {
* Father.call(this,x);
* this.wife = w;
* }
* Son.prototype = heir(Father);
* Son.prototype.constructor = Son;
* </pre>
*/
exports.heir = function heir(p) {
function f() {};
f.prototype = p.prototype;
return new f();
};
/**
* Check whether an item is member of the list. Idea is just to make long if
* commands slightly more readable.
*
* @param mbr string to be searched in the list
* @param list list
* @return position of the string in the list, or -1 if none found.
*/
var isInList = exports.isInList = function isInList(mbr, list) {
if (!list) {
return false;
}
return (list.indexOf(mbr) !== -1);
};
/**
* format date to be in ISO format (just day part)
*
* @param date
* @return string with the formatted date
*/
exports.getISODate = function getISODate(dateStr) {
function pad(n) {
return n < 10 ? '0' + n : n;
}
var date = new Date(dateStr);
return date.getFullYear() + '-' + pad(date.getMonth() + 1) + '-' +
pad(date.getDate());
};
/**
* Make sure value returned is Array
*
* @param Array/String
* @return Array
*
* If something else than Array or String is passed to the function
* the result will be untouched actual argument of the call.
*/
var valToArray = exports.valToArray = function valToArray(val) {
var isArr = val &&
val.constructor &&
val.constructor.name === "Array";
return isArr ? val : [val];
};
/**
* Merges two comma separated string as a list and returns new string
*
* @param str String with old values
* @param value String/Array with other values
* @return String with merged lists
*/
exports.addCSVValue = function addCSVValue(str, value) {
var parts = (str.trim().length > 0 ? str.split(/,\s*/) : []);
if (!value) {
return str;
}
if (!isInList(value, parts)) {
var newValue = valToArray(value);
parts = parts.concat(newValue);
}
// this is necessary to get comma-space separated string even when
// value is an array already
parts = parts.join(",").split(",");
return parts.join(", ");
};
/**
* Treats comma separated string as a list and removes one item from it
*
* @param str String treated as a list
* @param value String with the value to be removed from str
* @return String with the resulting list comma separated
*/
exports.removeCSVValue = function removeCSVValue(str, value) {
str = str.trim();
var parts = str ? str.split(/,\s*/) : [];
var valueArr = value instanceof Array ? value : value.split(/,\s*/);
parts = parts.filter(function (e, i, a) {
return (!isInList(e, valueArr));
});
return parts.join(", ");
};
/**
*
*/
var getBugNo = exports.getBugNo = function getBugNo(url) {
var re = new RegExp(".*id=([0-9]+).*$");
var bugNo = null;
var reResult = re.exec(url);
if (reResult[1]) {
bugNo = reResult[1];
}
return bugNo;
};
/**
* Load text from URL
*
* @param URL String
* @param cb_function Function to be called when the download happens with
* the downloaded body of the HTTP message as the only parameter
* @param what optional Object argument representing this for this call
* @return none
*/
var loadText = exports.loadText = function loadText(URL, cb_function, what) {
if (what === undefined) { // missing optional argument
what = this;
}
var req = new xhrMod.XMLHttpRequest();
req.open("GET", URL, true);
req.onreadystatechange = function (aEvt) {
if (req.readyState === 4) {
if (req.status === 200) {
cb_function.call(what, req.responseText);
} else {
throw "Getting " + URL + "failed!";
}
}
};
req.send("");
};
/**
* Load JSON from URL
*
* @param URL String
* @param cb_function Function to be called when the download happens with
* the downloaded JSON as the only parameter
* @param what optional Object argument representing this for this call
* @return none
*/
exports.loadJSON = function loadJSON(URL, cb_function, what) {
if (what === undefined) { // missing optional argument
what = this;
}
loadText(URL, function (text) {
var data = JSON.parse(text);
cb_function.call(what, data);
}, what);
};