This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
2.6 KiB
175 lines
2.6 KiB
/*! |
|
* @name JavaScript/NodeJS Merge v1.2.0 |
|
* @author yeikos |
|
* @repository https://github.com/yeikos/js.merge |
|
|
|
* Copyright 2014 yeikos - MIT license |
|
* https://raw.github.com/yeikos/js.merge/master/LICENSE |
|
*/ |
|
|
|
;(function(isNode) { |
|
|
|
/** |
|
* Merge one or more objects |
|
* @param bool? clone |
|
* @param mixed,... arguments |
|
* @return object |
|
*/ |
|
|
|
var Public = function(clone) { |
|
|
|
return merge(clone === true, false, arguments); |
|
|
|
}, publicName = 'merge'; |
|
|
|
/** |
|
* Merge two or more objects recursively |
|
* @param bool? clone |
|
* @param mixed,... arguments |
|
* @return object |
|
*/ |
|
|
|
Public.recursive = function(clone) { |
|
|
|
return merge(clone === true, true, arguments); |
|
|
|
}; |
|
|
|
/** |
|
* Clone the input removing any reference |
|
* @param mixed input |
|
* @return mixed |
|
*/ |
|
|
|
Public.clone = function(input) { |
|
|
|
var output = input, |
|
type = typeOf(input), |
|
index, size; |
|
|
|
if (type === 'array') { |
|
|
|
output = []; |
|
size = input.length; |
|
|
|
for (index=0;index<size;++index) |
|
|
|
output[index] = Public.clone(input[index]); |
|
|
|
} else if (type === 'object') { |
|
|
|
output = {}; |
|
|
|
for (index in input) |
|
|
|
output[index] = Public.clone(input[index]); |
|
|
|
} |
|
|
|
return output; |
|
|
|
}; |
|
|
|
/** |
|
* Merge two objects recursively |
|
* @param mixed input |
|
* @param mixed extend |
|
* @return mixed |
|
*/ |
|
|
|
function merge_recursive(base, extend) { |
|
|
|
if (typeOf(base) !== 'object') |
|
|
|
return extend; |
|
|
|
for (var key in extend) { |
|
|
|
if (typeOf(base[key]) === 'object' && typeOf(extend[key]) === 'object') { |
|
|
|
base[key] = merge_recursive(base[key], extend[key]); |
|
|
|
} else { |
|
|
|
base[key] = extend[key]; |
|
|
|
} |
|
|
|
} |
|
|
|
return base; |
|
|
|
} |
|
|
|
/** |
|
* Merge two or more objects |
|
* @param bool clone |
|
* @param bool recursive |
|
* @param array argv |
|
* @return object |
|
*/ |
|
|
|
function merge(clone, recursive, argv) { |
|
|
|
var result = argv[0], |
|
size = argv.length; |
|
|
|
if (clone || typeOf(result) !== 'object') |
|
|
|
result = {}; |
|
|
|
for (var index=0;index<size;++index) { |
|
|
|
var item = argv[index], |
|
|
|
type = typeOf(item); |
|
|
|
if (type !== 'object') continue; |
|
|
|
for (var key in item) { |
|
|
|
var sitem = clone ? Public.clone(item[key]) : item[key]; |
|
|
|
if (recursive) { |
|
|
|
result[key] = merge_recursive(result[key], sitem); |
|
|
|
} else { |
|
|
|
result[key] = sitem; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return result; |
|
|
|
} |
|
|
|
/** |
|
* Get type of variable |
|
* @param mixed input |
|
* @return string |
|
* |
|
* @see http://jsperf.com/typeofvar |
|
*/ |
|
|
|
function typeOf(input) { |
|
|
|
return ({}).toString.call(input).slice(8, -1).toLowerCase(); |
|
|
|
} |
|
|
|
if (isNode) { |
|
|
|
module.exports = Public; |
|
|
|
} else { |
|
|
|
window[publicName] = Public; |
|
|
|
} |
|
|
|
})(typeof module === 'object' && module && typeof module.exports === 'object' && module.exports); |