/**
 * The distance function that is specifically made for Poker Hands data set.
 * The suit of the cards does not play an important role when finding
 * the differences in poker hands so it was not used in calculations.
 * @param  {node} source
 * @param  {node} target
 * @return {number}      the distance between source and target nodes.
 */
function calculateDistancePoker (source, target) {
  var sumDiff = 0.0,
    ordDiff = 1.0,
    ORD_FACTOR = 1.5,
    cards = ['C1', 'C2', 'C3', 'C4', 'C5'],
    cols = 0;

  // Iterate through cards
  for (var i = 0; i < cards.length; i++) {
    card = cards[i];
    if (source.hasOwnProperty(card) && target.hasOwnProperty(card)) {
      var s = parseInt(source[card]),
        t = parseInt(target[card]);
      // Calculate the squared difference.
      sumDiff += (s - t) * (s - t);
    }
  }

  // Class of poker hands describes the similarities the best
  // so give it more priority than checking the differences between cards.
  if (source.hasOwnProperty('CLASS') && target.hasOwnProperty('CLASS')) {
    var s = parseInt(source['CLASS']),
      t = parseInt(target['CLASS']);

    // If classes differ, then scale them by a factor.
    if (s !== t) {
      ordDiff *= (ORD_FACTOR * (Math.abs(s - t)));
    }
  }

  sumDiff = Math.sqrt(sumDiff);
  sumDiff *= ordDiff;

  return sumDiff;
}
