/*******************************************************************************
AToMPM - A Tool for Multi-Paradigm Modelling
Copyright (c) 2011 Raphael Mannadiar (raphael.mannadiar@mail.mcgill.ca)
This file is part of AToMPM.
AToMPM is free software: you can redistribute it and/or modify it under the
terms of the GNU Lesser General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.
AToMPM is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with AToMPM. If not, see .
*******************************************************************************/
var utils = {};
/* return a vobject geometric attribute (i.e., position, etc.) value given its
current and new values...
oldVal newVal result
aa;bbbb ccccc aa;cccc
aa ccccc aa;cccc */
utils.buildVobjGeomAttrVal =
function(oldVal,newVal)
{
if( (matches = String(oldVal).match(/^(.*?)(;.*){0,1}$/)) )
oldVal = matches[1];
return oldVal+';'+newVal;
};
utils.clone =
function(obj)
{
return (obj == undefined ? undefined : utils.jsonp(utils.jsons(obj)));
};
utils.contains =
function(arr,x)
{
return arr.indexOf(x) > -1;
};
/* cause one type to inherit properties from another */
utils.extend =
function(child,parent)
{
for( var prop in parent.prototype )
if( !(prop in child.prototype) )
child.prototype[prop] = parent.prototype[prop];
};
/* remove specified elements from the array in-place, and return array */
utils.filter =
function(arr,items)
{
for( var i=0; i max )
max = meas;
});
return max;
};
/* merge an array of dictionaries into a single dictionary... in case of key
clashes, the value in the furthest dictionary is taken */
utils.mergeDicts =
function(dicts)
{
if( dicts.length == 0 )
return {};
var merged = {};
dicts.forEach(
function(d)
{
for( var key in d )
merged[key] = d[key];
});
return merged;
};
/* escapes regexp special characters from a string (so the string can be used as
data within a regexp) */
utils.regexpe =
function(str)
{
return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
};
/* return a dicts keys sorted by value according to the given function */
utils.sortDict =
function(dict,sortf)
{
var tuples = [];
for(var key in dict)
tuples.push([key, dict[key]]);
tuples.sort( function(a,b) {return sortf(a[1],b[1]);} );
return tuples.map( function(t) {return t[0];} );
};
/* remove specified keys from given dictionary (in-place) and return dictionary
of removed entries */
utils.splitDict =
function(dict,keys)
{
var other = {};
keys.forEach(
function(k)
{
if( k in dict )
{
other[k] = dict[k];
delete dict[k];
}
});
return other;
};
/* returns the numeric part of a sequence# of the form 'src#number' */
utils.sn2int =
function(sn)
{
return parseInt(sn.match(/.*#(\d*)/)[1]);
};
/* return the given array's last element */
utils.tail =
function(arr)
{
return arr[arr.length-1];
};
/* transform the given array into a set (i.e., remove duplicate elements) */
utils.toSet =
function(arr)
{
var set = [];
arr.forEach(
function(_)
{
if( ! utils.contains(set,_) )
set.push(_);
});
return set;
};
/* return an array containing all the values of a hash */
utils.values =
function(hash)
{
var values = [];
for( var k in hash )
values.push(hash[k]);
return values;
};
/* creates a cookie with given name and value, which expires after the given
amount of days (undefined == expire when browser closes) */
utils.createCookie =
function(name,value,days) {
if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires = "; expires="+date.toGMTString();
}
else var expires = "";
document.cookie = name+"="+value+expires+"; path=/";
}
/* returns the value of the cookie with given name */
utils.readCookie =
function(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}
/* erases the cookie with given name */
utils.eraseCookie =
function(name) {
createCookie(name,"",-1);
}
__pendingCalls = {};
/* performs a function after the specified amount of milleseconds
unless this call is repeated during that time interval. If it is,
the timer is reset. 'args' is an array containing arguments for the
function call. */
utils.doAfterUnlessRepeated =
function(func, args, ms) {
function doIt() {
func.apply(undefined, args);
}
if (__pendingCalls[func]) {
clearTimeout(__pendingCalls[func]);
}
__pendingCalls[func] = setTimeout(doIt, ms);
}
/* NOTE: 'exports' exists in back-end 'require', but not in browser import...
this ensures no errors are reported during browser imports */
var exports = exports || {};
exports.buildVobjGeomAttrVal = utils.buildVobjGeomAttrVal;
exports.clone = utils.clone;
exports.contains = utils.contains;
exports.extend = utils.extend;
exports.filter = utils.filter;
exports.flatten = utils.flatten;
exports.head = utils.head;
exports.isArray = utils.isArray;
exports.isObject = utils.isObject;
exports.incrementSequenceNumber = utils.incrementSequenceNumber;
exports.isHttpSuccessCode = utils.isHttpSuccessCode;
exports.jsond = utils.jsond;
exports.jsone = utils.jsone;
exports.jsonp = utils.jsonp;
exports.jsons = utils.jsons;
exports.keys = utils.keys;
exports.max = utils.max;
exports.mergeDicts = utils.mergeDicts;
exports.regexpe = utils.regexpe;
exports.sortDict = utils.sortDict;
exports.splitDict = utils.splitDict;
exports.sn2int = utils.sn2int;
exports.tail = utils.tail;
exports.toSet = utils.toSet;
exports.values = utils.values;
exports.createCookie = utils.createCookie;
exports.readCookie = utils.readCookie;
exports.eraseCookie = utils.eraseCookie;
exports.doAfterUnlessRepeated = utils.doAfterUnlessRepeated