in archived/SharedContent/js/Microsoft.WinJS/js/base.js [12923:13002]
function calculateScore(direction, maxDistance, historyRect, referenceRect, potentialRect) {
var score = 0;
var percentInShadow;
var primaryAxisDistance;
var secondaryAxisDistance = 0;
var percentInHistoryShadow = 0;
switch (direction) {
case DirectionNames.left:
// Make sure we don't evaluate any potential elements to the right of the reference element
if (potentialRect.left >= referenceRect.left) {
break;
}
percentInShadow = calculatePercentInShadow(referenceRect.top, referenceRect.bottom, potentialRect.top, potentialRect.bottom);
primaryAxisDistance = referenceRect.left - potentialRect.right;
if (percentInShadow > 0) {
percentInHistoryShadow = calculatePercentInShadow(historyRect.top, historyRect.bottom, potentialRect.top, potentialRect.bottom);
}
else {
// If the potential element is not in the shadow, then we calculate secondary axis distance
secondaryAxisDistance = (referenceRect.bottom <= potentialRect.top) ? (potentialRect.top - referenceRect.bottom) : referenceRect.top - potentialRect.bottom;
}
break;
case DirectionNames.right:
// Make sure we don't evaluate any potential elements to the left of the reference element
if (potentialRect.right <= referenceRect.right) {
break;
}
percentInShadow = calculatePercentInShadow(referenceRect.top, referenceRect.bottom, potentialRect.top, potentialRect.bottom);
primaryAxisDistance = potentialRect.left - referenceRect.right;
if (percentInShadow > 0) {
percentInHistoryShadow = calculatePercentInShadow(historyRect.top, historyRect.bottom, potentialRect.top, potentialRect.bottom);
}
else {
// If the potential element is not in the shadow, then we calculate secondary axis distance
secondaryAxisDistance = (referenceRect.bottom <= potentialRect.top) ? (potentialRect.top - referenceRect.bottom) : referenceRect.top - potentialRect.bottom;
}
break;
case DirectionNames.up:
// Make sure we don't evaluate any potential elements below the reference element
if (potentialRect.top >= referenceRect.top) {
break;
}
percentInShadow = calculatePercentInShadow(referenceRect.left, referenceRect.right, potentialRect.left, potentialRect.right);
primaryAxisDistance = referenceRect.top - potentialRect.bottom;
if (percentInShadow > 0) {
percentInHistoryShadow = calculatePercentInShadow(historyRect.left, historyRect.right, potentialRect.left, potentialRect.right);
}
else {
// If the potential element is not in the shadow, then we calculate secondary axis distance
secondaryAxisDistance = (referenceRect.right <= potentialRect.left) ? (potentialRect.left - referenceRect.right) : referenceRect.left - potentialRect.right;
}
break;
case DirectionNames.down:
// Make sure we don't evaluate any potential elements above the reference element
if (potentialRect.bottom <= referenceRect.bottom) {
break;
}
percentInShadow = calculatePercentInShadow(referenceRect.left, referenceRect.right, potentialRect.left, potentialRect.right);
primaryAxisDistance = potentialRect.top - referenceRect.bottom;
if (percentInShadow > 0) {
percentInHistoryShadow = calculatePercentInShadow(historyRect.left, historyRect.right, potentialRect.left, potentialRect.right);
}
else {
// If the potential element is not in the shadow, then we calculate secondary axis distance
secondaryAxisDistance = (referenceRect.right <= potentialRect.left) ? (potentialRect.left - referenceRect.right) : referenceRect.left - potentialRect.right;
}
break;
}
if (primaryAxisDistance >= 0) {
// The score needs to be a positive number so we make these distances positive numbers
primaryAxisDistance = maxDistance - primaryAxisDistance;
secondaryAxisDistance = maxDistance - secondaryAxisDistance;
if (primaryAxisDistance >= 0 && secondaryAxisDistance >= 0) {
// Potential elements in the shadow get a multiplier to their final score
primaryAxisDistance += primaryAxisDistance * percentInShadow;
score = primaryAxisDistance * ScoringConstants.primaryAxisDistanceWeight + secondaryAxisDistance * ScoringConstants.secondaryAxisDistanceWeight + percentInHistoryShadow * ScoringConstants.percentInHistoryShadowWeight;
}
}
return score;
}