function leadzeroString(number, nbdigits) {
	if(number > 999) {
		return "" + number;
	}
	if(number > 99) {
		return "0" + number;
	}
	if(number > 9) {
		return "00" + number;
	}
	return "000" + number;
}

function addParamToUrl(url, name, value) {
	if(url.indexOf("?")==-1) {
		return url + "?" + name + "=" + value;
	} else {
		return url + "&" + name + "=" + value;
	}
}

function trackCEMInGA(_cem_analytics, _gaq, _cem_commerce, _cem_debug, url) {
	
	try {
	
		if(_cem_analytics.hasError()) {
			_gaq.push(['_trackEvent', 'CEM GA Error', _cem_analytics.getErrorLabel(), JSON.stringify(_cem_analytics.getError()), 1]);	
			return false;
		}
	
		if(_cem_analytics.getAction()==null) {
			return false; //throw("CEM ERROR: no action have been defined!");
		}
		
		var cem_guidance_count = _cem_analytics.getInteractionCount();
		var nb_terms = 0;
		if(_cem_analytics.getQuery() != null) {
			nb_terms = _cem_analytics.getQuery().split(" ").length;
		}
		var event_value = nb_terms;
		if(nb_terms == 0) {
			event_value = cem_guidance_count;
		}
		var chunks = _cem_analytics.getMissChunks();
		var attributes = _cem_analytics.getAttributes();
		var tags = _cem_analytics.getTags();
		
		var changed_url = null;
		if(_cem_analytics.getQuery() != null) {
			
			var search_cat = "terms:"+nb_terms+";hits:"+_cem_analytics.getNbAttributeValues()+";misses:"+chunks.length;
			if(_cem_analytics.getIsRelax()) {
				search_cat = search_cat + ";relax:true";
			} else {
				search_cat = search_cat + ";relax:false";
			}
			changed_url = addParamToUrl(url, "cat", search_cat);
		}
		
		if(_cem_analytics.getQuery() != null) {
			_gaq.push(['_trackEvent', 'CEM Engagement', 'searches terms ', "st_"+leadzeroString(nb_terms,4), 1]);
			_gaq.push(['_trackEvent', 'CEM Engagement', 'searches', "se_"+leadzeroString(_cem_analytics.getSearchCount(),4), 1]);
			_gaq.push(['_setCustomVar',1,'Used Search','Yes',1]);
		} else if(_cem_analytics.getSearchCount() > 0) {
				_gaq.push(['_trackEvent', 'CEM Engagement', 'searches', "se_"+leadzeroString(_cem_analytics.getSearchCount(),4), 1]);
		}
		for(var i=0;i<3;i++) {
			var name = _cem_analytics.getTopPreferenceName(i);
			if(name != null) {
				_gaq.push(['_setCustomVar',i+3,name,_cem_analytics.getPreferenceValue(name),1]);
			}
		}
		
		_gaq.push(['_trackEvent', 'CEM Engagement', 'total', "to_"+leadzeroString(_cem_analytics.getTotalInteractionCount(),4), 1]);
		
		if(_cem_analytics.isGuidanceAction()) {
			_gaq.push(['_trackEvent', 'CEM Engagement', 'guidance depth', "gd_"+leadzeroString(cem_guidance_count,4), 1]);
			_gaq.push(['_trackEvent', 'CEM Engagement', 'guidance clicks', "gc_"+leadzeroString(_cem_analytics.getGuidanceCount(),4), 1]);
		} else {
			if(cem_guidance_count > 0) {
				_gaq.push(['_trackEvent', 'CEM Engagement', 'guidance depth', "gd_"+leadzeroString(cem_guidance_count,4), 1]);
			}
			if(_cem_analytics.getGuidanceCount() > 0) {
				_gaq.push(['_trackEvent', 'CEM Engagement', 'guidance clicks', "gc_"+leadzeroString(_cem_analytics.getGuidanceCount(),4), 1]);
			}
		}
		
		
		if(_cem_analytics.isChangeFilterAction()) {
			_gaq.push(['_trackEvent', 'CEM Engagement', 'change search filter', "sf_"+leadzeroString(_cem_analytics.getFilterChangeCount(),4), 1]);
		} else if(_cem_analytics.getFilterChangeCount() > 0) {
			_gaq.push(['_trackEvent', 'CEM Engagement', 'change search filter', "sf_"+leadzeroString(_cem_analytics.getFilterChangeCount(),4), 1]);
		}
		
		for(var i=0; i<chunks.length; i++) {
			_gaq.push(['_trackEvent', 'CEM Search Miss Chunks', _cem_analytics.getAction(), chunks[i], nb_terms]);
		}
		for(var attribute in attributes) {
			for(var i=0; i<attributes[attribute].length; i++) {
				_gaq.push(['_trackEvent', 'CEM Attribute - ' + _cem_analytics.getAction(), attribute, attributes[attribute][i], event_value]);
			}
		}
		for(var i=0; i<tags.length; i++) {
			_gaq.push(['_trackEvent', 'CEM Tag', _cem_analytics.getAction(), tags[i], event_value]);
		}
		if(_cem_analytics.getIsRelax()) {
			_gaq.push(['_trackEvent', 'CEM Relaxation Display', _cem_analytics.getAction(), _cem_analytics.getRelaxAsString(), _cem_analytics.getRelaxNbChoices()]);
			_gaq.push(['_trackEvent', 'CEM Engagement', 'relaxation display', "rd_"+leadzeroString(_cem_analytics.getRelaxationDisplayCount(),4), 1]);
		} else if(_cem_analytics.getRelaxationSolvedCount() > 0) {
			_gaq.push(['_trackEvent', 'CEM Engagement', 'relaxation display', "rs_"+leadzeroString(_cem_analytics.getRelaxationDisplayCount(),4), 1]);
		}
		
		if(_cem_analytics.getFilterRelaxationSolvedSuggestion()!=null) {
			_gaq.push(['_trackEvent', 'CEM Relaxation Solved', _cem_analytics.getAction(), _cem_analytics.getFilterRelaxationSolvedSuggestion(), cem_guidance_count]);
			_gaq.push(['_trackEvent', 'CEM Engagement', 'relaxation solved', "rs_"+leadzeroString(_cem_analytics.getRelaxationSolvedCount(),4), 1]);
		} else if(_cem_analytics.getRelaxationSolvedCount() > 0) {
			_gaq.push(['_trackEvent', 'CEM Engagement', 'relaxation solved', "rs_"+leadzeroString(_cem_analytics.getRelaxationSolvedCount(),4), 1]);
		}
		
		if(_cem_analytics.isRecommendationAction()) {
			_gaq.push(['_setCustomVar',2,'Used Recommendation',_cem_analytics.getRecType(),1]);
			_gaq.push(['_trackEvent', 'CEM Recommendation Click - ' + _cem_analytics.getRecType(), _cem_analytics.getProdId(), _cem_analytics.getProfiledInterestsAsString(), _cem_analytics.getProfiledInterestsAsValue()]);
			_gaq.push(['_trackEvent', 'CEM Engagement', 'rec clicks', "rc_"+leadzeroString(_cem_analytics.getRecommendationClickCount(),4), 1]);
		} else if(_cem_analytics.getRecommendationClickCount() > 0) {
			_gaq.push(['_trackEvent', 'CEM Engagement', 'rec clicks', "rc_"+leadzeroString(_cem_analytics.getRecommendationClickCount(),4), 1]);
		}

		if(_cem_analytics.isProductEngagementAction()) {
			_gaq.push(['_trackEvent', 'CEM Product Engagement', _cem_analytics.getEngagementAction(), _cem_analytics.getProdId(), _cem_analytics.getQuantity()]);
		}
		if(_cem_analytics.isStartCheckoutAction()) {
			_gaq.push(['_trackEvent', 'CEM Checkout', "start", _cem_analytics.getProfiledInterestsAsString(), cem_guidance_count]);
		}
		if(_cem_analytics.isFailTransactionAction()) {
			_gaq.push(['_trackEvent', 'CEM Checkout', "fail", _cem_analytics.getProfiledInterestsAsString(), cem_guidance_count]);
		}
		if(_cem_analytics.isTransactionAction()) {
			
			_gaq.push(['_trackEvent', 'CEM Checkout', "success", _cem_analytics.getProfiledInterestsAsString(), cem_guidance_count]);

			var t = _cem_analytics.getTransaction();
			_gaq.push(['_addTrans',
		    t.getOrderId(),           // order ID - required
		    t.getStoreName(),  // affiliation or store name
		    t.getTotal(),          // total - required
		    t.getTax(),           // tax
		    t.getShipping(),              // shipping
		    t.getCity(),       // city
		    t.getState(),     // state or province
		    t.getCountry()             // country
		  ]);
		
			var items = t.getItems();
			for(var i=0;i<items.length;i++) {
			  _gaq.push(['_addItem',
			    t.getOrderId(),           // order ID - required
			    items[i].getCode(),           // SKU/code - required
			    items[i].getName(),        // product name
			    items[i].getCategory(),   // category or variation
			    items[i].getUnitPrice(),          // unit price - required
			    items[i].getQuantity()               // quantity - required
			  ]);
			}
		  _gaq.push(['_trackTrans']); //submits transaction to the Analytics servers
		
		}
		
		if(changed_url != null) {
			_gaq.push(['_trackPageview', changed_url]);
		} else {
			_gaq.push(['_trackPageview']);
		}
		
		return true;
	} catch(e) {
		_gaq.push(['_trackEvent', 'CEM GA Error', "cem_ga.js", JSON.stringify(e), 1]);
		
		if(_cem_debug) {
		}
	}
	return false;
}

function cemGAtrackEscalationEvent(type, param){
	var _ca = _cem_analytics || new cemAnalytics;
  var label =_ca.getContextAsString();
  var eventValue = _ca.getInteractionCount();
	_gaq.push(['_trackEvent', 'CEM Escalation', ""+type, label, eventValue]);
	reportWait();
}

function reportEventClickEscalation() {
	return cemGAtrackEscalationEvent("click");
}

function reportEventTrySendEscalation() {
	return cemGAtrackEscalationEvent("try_send");
}

function reportEventSucceedSendEscalation() {
	return cemGAtrackEscalationEvent("succeed_send");
}

function reportEventAutoCompletionQueryClick(textBefore, textAfter) {
	
	var cem_action = "finish";
	if((textAfter.indexOf(textBefore.trim()+" ") === 0)) {
		cem_action = "add_new";
	}
	var _ca = _cem_analytics || new cemAnalytics;
  var eventValue = _ca.getInteractionCount();
	_gaq.push(['_trackEvent', 'CEM AutoCompletion Query', cem_action, textBefore + " => " + textAfter, eventValue]);
	reportWait();
}

function cemGAtrackACEvent(type, textBefore, param) {
	if(type == "query") {
		return reportEventAutoCompletionQueryClick(textBefore, param);
	} else { // should be product
		return reportEventAutoComplectionProductClick(textBefore, param);
	}
}

function reportEventAutoComplectionProductClick(textBefore, prodId) {
	var _ca = _cem_analytics || new cemAnalytics;
  var eventValue = _ca.getInteractionCount();
	_gaq.push(['_trackEvent', 'CEM AutoCompletion Product', "click", textBefore + " => " + prodId, eventValue]);
	reportWait();
}

function cemGAtrackGuidanceEvent(type, attribute, param){
	if(type == "guidance_change") {
		return reportEventChangeAttributeClick(param);
	}
	if(type == "alternatives") {
		return reportEventOpenAlternativeChoices();
	}
	if(type == "filter_choices") {
		return reportEventOpenAttributeFilterChoices(attribute);
	}
}

function reportEventChangeAttributeClick(attribute) {
	
	var _ca = _cem_analytics || new cemAnalytics;
  var label =_ca.getContextAsString();
  var eventValue = _ca.getInteractionCount();
	_gaq.push(['_trackEvent', 'CEM Guidance Change', attribute, label, eventValue]);
	reportWait();
}

function reportEventOpenAlternativeChoices() {
	var _ca = _cem_analytics || new cemAnalytics;
  var label =_ca.getContextAsString();
  var eventValue = _ca.getInteractionCount();
	_gaq.push(['_trackEvent', 'CEM Guidance Alternative', "open", label, eventValue]);
	reportWait();
}

function reportEventOpenAttributeFilterChoices(attribute) {
	var _ca = _cem_analytics || new cemAnalytics;
  var label =_ca.getContextAsString();
  var eventValue = _ca.getInteractionCount();
	_gaq.push(['_trackEvent', 'CEM Guidance Filter', attribute, label, eventValue]);
	reportWait();
}

function cemGAtrackCompareEvent(type, param){
	return reportEventChangeAttributeClick();
}

function reportEventCompareProduct() {
	_gaq.push(['_trackEvent', 'CEM Compare Product', "compare", "", 0]);	
	reportWait();
}

function cemGAtrackProductEngagementEvent(type, itemId) {
	_gaq.push(['_trackEvent', 'CEM Product Engagement', type, ""+itemId, 1]);
	reportWait();
}

function reportSendToFriendEvent(prodId) {
	return cemGAtrackProductEngagementEvent("open send to friend", prodId);
}

function reportPrintEvent(prodId) {
	return cemGAtrackProductEngagementEvent("print", prodId);
}

function reportWait() {
	/*// pause to allow google script to run
	var date = new Date();
	var curDate = null;
	do {
		curDate = new Date();
	} while(curDate-date < 300);*/
}

function cemGAtrackproductEngagementTimeout(seconds, itemId){
	return productEngagementTimeout(seconds, itemId);
}

function productEngagementTimeout(seconds, prodId)
{
	var t=setTimeout("if(document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset){_gaq.push(['_trackEvent', 'CEM Product Engagement', 'scrolled', \"\"+"+prodId+", 1]);}_gaq.push(['_trackEvent', 'CEM Product Engagement', 'time on page over "+seconds+" seconds', \"\"+"+prodId+", 1])",seconds*1000);
}
