  function contains(arrayObj, obj){
    var i;
    for(i=0; i<arrayObj.length; i++){
      if(arrayObj[i]==obj) break;
    }
    return i<arrayObj.length;
  } 
  
  var alreadyShown=new Array();
  
  function showRandomFeature(){
    var i,j,k,l,m;
  
		if((typeof randomize) == "undefined" || randomize=="yes"){
  		var tw=0;
      for(m=0; m<weights.length; m++){
        if(!contains(alreadyShown,m)) tw+=weights[m];
      }
      
      k=Math.round(Math.random()*(tw));
  
      for(j=0; j<weights.length; j++){
        if(contains(alreadyShown,j)) continue;
        k-=weights[j];
        if(k<=0) break;
      }
		}else{
		  var maxwt=0;
      for(m=0; m<weights.length; m++){
        if(!contains(alreadyShown,m) && maxwt<weights[m]) maxwt=weights[m];
      }
      for(j=0; j<weights.length; j++){
        if(contains(alreadyShown,j)) continue;
        if(weights[j]==maxwt) break;
      }
		}
    
    alreadyShown[alreadyShown.length]=j;
    if(j<features.length){
		  if(features[j].match( /^\s*$/ ) == null){
        i=features[j].replace(/\%POS\%/g, new String(alreadyShown.length)).
          replace(/\%RND\%/g,new String(Math.random()*1000000000));
        //alert(i);
        document.write(i);
			}else{
			  showRandomFeature();
			}
    }
  }


// MR 12.3.08 added new functions for Issuer Pilot

var issuerChosen = "";
var sponsoredHighPriority = false;
var sponsoredFeatureDisplayed = false;

function chooseFeature() {
	var possibleFeatures = new Array();

	// Look for sponsored high priority features
	if(issuerChosen == "") {
		possibleFeatures = choosePossibleFeatures(true, issuerChosen, true);
	} 
	
	// If there are no possible high priority features, look for issuer features
	if(possibleFeatures.length == 0) {
		possibleFeatures = choosePossibleFeatures(false, issuerChosen, true);
	}
	
	// If there are no possible issuer features, look for any non-sponsored feature
	if(possibleFeatures.length == 0) {
		possibleFeatures = choosePossibleFeatures(false, issuerChosen, false);
	}
	
	// Only choose a random feature if there is more than 1 to choose from
	if(possibleFeatures.length == 0) {
		return null;
	} else {
		if(randomize == "yes"){
			// Choose a random feature from the possible options
			chosenFeature = chooseRandomFeature(possibleFeatures);	
		} else {
			// Choose a static feature from the possible options
			chosenFeature = chooseStaticFeature(possibleFeatures);		
		}
	}
		
	// Remove the chosen feature from the original feature list
	removeChosenFeatureFromOriginalList(chosenFeature);
	
	// Set flags
	if(issuerChosen == "" && chosenFeature.links[0].issuer) {
		issuerChosen = chosenFeature.links[0].issuer;
	}
	if(!sponsoredHighPriority) {
		sponsoredHighPriority = chosenFeature.links[0].sponsoredHighPriority;
	}
	
	return chosenFeature;
}

function choosePossibleFeatures(highPriority, issuer, sponsored) {
	var possibleFeatures = new Array();
	
	// Loop through the features
	for(var i = 0; i < features.length; i++) {
		var feature = features[i];
		
		// Look for high priority first, then sponsored, finally non-sponsored
		if(highPriority) {
			// If this feature is high priority
			if(feature.links[0].sponsoredHighPriority) {
				possibleFeatures[possibleFeatures.length] = feature;			
			}
		} else if(sponsored) {
			// If this feature is sponsored, but not high priority and either we don't care about which issuer or the issuer matches
			if(feature.links[0].sponsored && !feature.links[0].sponsoredHighPriority && (issuer == "" || issuer == feature.links[0].issuer)) {
				possibleFeatures[possibleFeatures.length] = feature;			
			}	
		} else if(!feature.links[0].sponsored && issuer == "" && feature.title) {
			// As long as this feature is not sponsored and we have not already chosen issuer features then we take it
			possibleFeatures[possibleFeatures.length] = feature;
		}
	}
	
	return possibleFeatures;
}

function chooseRandomFeature(possibleFeatures) {
	var chosenFeature = null;
	var sumOfFeaturesWeights = 0;
	// find sum of possibleFeatures weights
	for(var i = 0; i < possibleFeatures.length; i++) {
		sumOfFeaturesWeights += possibleFeatures[i].weight;
	}
	
	var random = Math.round(Math.random()*(sumOfFeaturesWeights));
	
	// Use the weights to pick a random feature
	for(var j = 0; j < possibleFeatures.length; j++) {
		// loop through weights, subtracting from random, until result is less than 1
		if ((random - possibleFeatures[j].weight) < 1){
			// if result is less than 1, choose this feature and stop the loop
			chosenFeature = possibleFeatures[j];
			break;
		} else{
			random -= possibleFeatures[j].weight;
		}
	}
		
	return chosenFeature;
}

function chooseStaticFeature(possibleFeatures){
	var chosenFeature = null;
	var maxWeight = 0;
	for(var i = 0; i < possibleFeatures.length; i++) {
		// look for the highest weight
		maxWeight = maxWeight<possibleFeatures[i].weight ? possibleFeatures[i].weight : maxWeight;
	}
	for(var j = 0; j < possibleFeatures.length; j++) {
		// choose the first feature with the highest weight
		if (possibleFeatures[j].weight == maxWeight){
			chosenFeature = possibleFeatures[j];
			break;
		}			
	}
	return chosenFeature;
}

function removeChosenFeatureFromOriginalList(chosenFeature) {
	var chosenFeatureArrayIndex;
	// loop through features array looking for chosenFeature
	for(var i = 0; i < features.length; i++) {
		if (features[i] == chosenFeature){
			chosenFeatureArrayIndex = i;
			break;
		}
	}
	
	// Removes the chosen feature from the original features so it cannot be chosen again
	features.splice(chosenFeatureArrayIndex, 1);
}

function displayFeature(feature, position) {
	var featureHTML = "";

	if(position == 1) {
		featureHTML += '<div class="featureModule" id="featurePrimary">';
	} else if(position == 2) {
		featureHTML += '<div class="featureModule" id="featureSecondary">';
	}
	
	// write out html for sponsored
	if (feature.links[0].sponsored){
		$("div.featureModuleContainer").trigger("featureDisplayed", feature.links[0].image);

		// If this is the first sponsored feature
		if(!sponsoredFeatureDisplayed) {
			// Write out the sponsored feature header
			featureHTML += '<h3 id="headerSponsored">Sponsored Products</h3>';
			sponsoredFeatureDisplayed = true;
		}	
		// add horizontal line above the second sponsored feature
		if(position == 2) {
			featureHTML += '<div class="rightColRuleSponsored"></div>';
		}
		featureHTML += "<img class='featureSponsoredImg' src='" + feature.links[0].image + "'>";
		// Write out title, description, and "Learn more" link
		featureHTML += "<h3>" + feature.title + "</h3>";
		featureHTML += "<ul>";
		featureHTML += "<li>" + feature.links[0].description + "</li>";
		featureHTML += "<li><a href='" + feature.links[0].url + "' class='sponsoredFeature' target='_blank'>Learn more</a> ></li>";
		featureHTML += "</ul>";
	} else { // write out html for regular feature
		
		if(feature.links.length > 1){
			featureHTML += "<h3>" + feature.title + "</h3>";
			featureHTML += "<ul>";
			
			for(var i = 0; i < feature.links.length; i++) {
				featureHTML += "<li><a href='" + feature.links[i].url + "'>" + feature.links[i].description + "</a></li>";
			}		
		}else {
			featureHTML += "<h3><a href='" + feature.links[0].url + "'>" + feature.title + "</a></h3>";
			featureHTML += "<ul><li>" + feature.links[0].description + "</li>";		
		}
		
		
		
		featureHTML += "</ul>";		
	}	
	
	featureHTML += '</div>';	
		
	$('div.featureModuleContainer').append(featureHTML);
}

function createRandomFeature(featureCount){
	var chosenFeature = null;
	var chosenFeatures = new Array();
	
	$("div.featureModuleContainer").bind("featureDisplayed", function(event, feature) { 
		VISA.Analytics.event(event, {
			type: "impression",
			item: "featuredLink",
			featureDesc: feature
		});
	});

	// Loop as many times as number of features required
	for(var i = 0; i < featureCount; i++) {
		chosenFeature = chooseFeature();
	
		// If a feature was returned add it to the array
		if(chosenFeature) {
			chosenFeatures[chosenFeatures.length] = chosenFeature;	
		} else {
			// No other features could be found - stop looking
			break;
		}
	}
	
	// Loop through the chosen features and display them
	for(var i = 0; i < chosenFeatures.length; i++) {
		displayFeature(chosenFeatures[i], i + 1);
	}
	
	// Make sure we append a cleaner
	$('div.featureModuleContainer').append('<div class="cleaner">&nbsp;</div>');
	
	if (issuerChosen != ""){
		// adjust css for sponsored features
		$("div.featureModule ul").css("padding","0 0 0 0");
		$("div.featureModule ul li").css("padding","2px 4px 0 0");
		$("div.featureModule ul li a").css("text-decoration","underline");
		$("div.featureModule h3").css({ background:"none", padding:"0" });
		$("#headerSponsored").css("padding-bottom","10px");	
		$(".featureSponsoredImg").css({display: "block", paddingBottom: "5px"});
		$(".rightColRuleSponsored").css({borderBottom: "1px solid #DCDCDC", padding: "0", margin: "10px 0"});	
	}
	
	$('a.sponsoredFeature').click(function(event) {
		VISA.Analytics.event(event, {
			type: "navigation",
			item: "featuredLink",
			featureDesc: $(event.target).parents("ul").prevAll("img").attr("src")
		});		
	});	
}
