/**
 * Calculate the distances by using the numbers, strings and dates.
 * @param  {node} source
 * @param  {node} target
 * @param  {array} properties - the properties of the nodes.
 * @return {number}            the distance between source and target nodes.
 */
function calculateManhattanDistance (source, target, properties, normArgs) {
  var sum = 0.0,
    cols = 0;

  // console.log(properties);
  // Iterate through every column of data
  for (var i = 0; i < properties.length; i++) {
    property = properties[i];
    if (property.toLowerCase() !== 'class' && property.toLowerCase() !== 'app' && property.toLowerCase() !== 'user' && property.toLowerCase() !== 'weekday') {
      var s = source[property],
        t = target[property];

      if (s !== t) {
        cols++;
      }

      if (normArgs.sig[i] !== 0) {
        s = (s - normArgs.avg[i]) / (2.0 * normArgs.sig[i]);
        t = (t - normArgs.avg[i]) / (2.0 * normArgs.sig[i]);
      }
      sum += Math.abs(s - t);
    }
  }

  // console.log(Math.sqrt(sumDiff)/cols);
  return sum * (cols / properties.length);
}
