var sentImpressions = new Array();

var impressionsToSend = new Array();

/**
 * 
 * @param impression see com.alp.core.util.impression.ImpressionItemTagged
 * @return
 */
function registerImpression(impression) {
	if (isAlreadySentOrRegistered(impression)) {
		return;
	}
	impressionsToSend.push(impression);
}

function isAlreadySentOrRegistered(impression) {
	return containsImpression(sentImpressions, impression) || containsImpression(impressionsToSend, impression);
}

function containsImpression(collection, impression) {
	for (var i = 0; i < collection.length; i++) {
		if (equals(impression, collection[i])) {
			return true;
		}
	}
	return false;
}

var impressionsBeingSend = null;

function flushImpressions() {
	if (impressionsToSend.length == 0) {
		return;
	}
	
	if (impressionsBeingSend != null) {
		return;
	}
	
	impressionsBeingSend = impressionsToSend;
	impressionsToSend = new Array();
	
	DynamicImpressionService.getUrls(impressionsBeingSend, {
		callback: function(urls) {
			$.each(urls, function (index, url) {
				 Util.reportImpression(url);
			});
	
			$.each(impressionsBeingSend, function(index, impression) {
				sentImpressions.push(impression);
			});
			
			impressionsBeingSend = null;
		}, 
		errorHandler: function(errorString, exception) {
			impressionsToSend = impressionsBeingSend;
			impressionsBeingSend = null;
		}
	});
}

function getProgramItemTypeByProductType(productType) {
	return {
		'STORE':'STORE_PRODUCT',
		'SWEEPSTAKE':'SWEEPSTAKE',
		'SPECIAL':'SPECIAL',
		'PROMOTION':'INSERTION_ORDER',
		'GROUP_BUY':'GROUP_BUY',
        'COUPON':'COUPON'
	}[productType];
}

if (typeof flushImpressionsScheduled == "undefined") {
	setInterval("flushImpressions()", 5000);
}
var flushImpressionsScheduled = true;

