var catalyst = initCatalyst();

function initCatalyst(){
	var obj = {
		pagename: '',
		channel: '',
		prop1: '',
		prop2: '',
		prop3: '',
		prop4: '',
		prop5: '',
		prop6: '',
		prop7: '',
		prop8: '',
		prop9: '',
		prop10: '',
		campaign: '',
		events: '',
		products: [],
		eVar3: '',
		eVar4: '',
		eVar5: '',
		eVar6: '',		
		eVar8: '',
		eVar9: '',
		eVar10: ''
	};
	switch (location.hostname) {
		case "wilton2.ignitesolutions.com":
			obj.account = "wiwiltondev";
			break;
		case "www.wilton.com":
			obj.account = "wiwiltoncomprod";
			break;
	}
	return obj;
}

function appendCatalystProduct(attribs) {
	if( typeof catalyst.products == 'undefined') catalyst.products = [];
	var prodObj = {};
	prodObj.category = cleanCatalystString(attribs.category).replace(/[,;]/g," ");
	prodObj.name = cleanCatalystString(attribs.name).replace(/[,;]/g," ");
	if( typeof attribs.sku != 'undefined') prodObj.sku = attribs.sku;
	if( typeof attribs.price != 'undefined') prodObj.price = attribs.price;
	if (typeof attribs.quantity != 'undefined') prodObj.quantity = attribs.quantity;
	if (typeof attribs.status != 'undefined') prodObj.status = attribs.status;
	catalyst.products.push(prodObj);
}

function catalystAddToCart(cartitems, newcart) {
	var products = "";
	for( var i=0; i<cartitems.length; i++) {
		var sku = cartitems[i].SKU;
		var str = ';' + sku;
		products += products.length ? ',' + str : str;
	}
	// also pass event scOpen if this is the first cart add
	s.pageName = 'Store:Cart:Add To Cart';
	s.prop1 = 'Store';
	s.prop2 = s.prop1 + ':Cart';
	s.prop3 = s.prop2;
	s.prop4 = s.prop2;
	s.prop5 = s.prop2;
	s.events = 'scAdd';
	if( newcart == 1) s.events += ',scOpen';
	s.products = products;
	s.t();
}

function _hbLink(lid,lpos) {
	flashBannerTrack(lid,lpos);
}

function flashBannerTrack(lid,lpos){
	
	var pagename = s.pageName;
	var opts = initCatalyst();
	var s2=s_gi(opts.account); 
	s2.linkTrackVars='prop11,prop12,prop13,prop14'; 
	s2.prop11=pagename; 
	s2.prop12=lid; 
	s2.prop13=s2.prop11 + '|' + s2.prop12; 
	s2.prop14=lpos; 
	//s2.tl('LINK URL','o',lid);
	s2.tl('','o',lid);

}

function catalystCustomTrack(config) {
	var opts = initCatalyst();
	opts.pagename = (typeof config.pagename == 'undefined') ? '' : cleanCatalystString(config.pagename);
	opts.channel = (typeof config.channel == 'undefined') ? '' : config.channel;
	opts.prop1 = (typeof config.prop1 == 'undefined') ? '' : config.prop1;
	opts.prop2 = (typeof config.prop2 == 'undefined') ? '' : config.prop2;
	opts.prop3 = (typeof config.prop3 == 'undefined') ? '' : config.prop3;
	opts.prop4 = (typeof config.prop4 == 'undefined') ? '' : config.prop4;
	opts.prop5 = (typeof config.prop5 == 'undefined') ? '' : config.prop5;
	opts.prop6 = (typeof config.prop6 == 'undefined') ? '' : config.prop6;
	opts.prop7 = (typeof config.prop7 == 'undefined') ? '' : config.prop7;
	opts.prop8 = (typeof config.prop8 == 'undefined') ? '' : config.prop8;
	opts.prop9 = (typeof config.prop9 == 'undefined') ? '' : config.prop9;
	opts.prop10 = (typeof config.prop10 == 'undefined') ? '' : config.prop10;
	
	opts.eVar3 = (typeof config.eVar3 == 'undefined') ? '' : config.eVar3;
	opts.eVar4 = (typeof config.eVar4 == 'undefined') ? '' : config.eVar4;
	opts.eVar5 = (typeof config.eVar5 == 'undefined') ? '' : config.eVar5;
	opts.eVar6 = (typeof config.eVar6 == 'undefined') ? '' : config.eVar6;
	opts.eVar8 = (typeof config.eVar8 == 'undefined') ? '' : config.eVar8;
	opts.eVar9 = (typeof config.eVar9 == 'undefined') ? '' : config.eVar9;
	opts.eVar10 = (typeof config.eVar10 == 'undefined') ? '' : config.eVar10;

	opts.events = (typeof config.events == 'undefined') ? '' : config.events;

	if(typeof config.products != 'undefined') opts.products = config.products;

	var my_s = s_gi(opts.account);
	my_s = setCatalystNativeVars(opts, my_s);
	my_s.t();
}

function setCatalystVars() {
	s = setCatalystNativeVars(catalyst, s);
}

function setCatalystNativeVars(config, sobj) {
	if( typeof config.pagename.length == 0) config.pagename = document.title;
	
	// clean all of our variables first
	config.pagename = cleanCatalystString(toTitleCase(config.pagename));
	config.channel = cleanCatalystString(toTitleCase(config.channel));
	config.prop1 = cleanCatalystString(toTitleCase(config.prop1));
	config.prop2 = cleanCatalystString(toTitleCase(config.prop2));
	config.prop3 = cleanCatalystString(toTitleCase(config.prop3));
	config.prop4 = cleanCatalystString(toTitleCase(config.prop4));
	config.prop5 = cleanCatalystString(toTitleCase(config.prop5));
	config.prop6 = cleanCatalystString(config.prop6);
	config.prop7 = cleanCatalystString(config.prop7);
	config.prop8 = cleanCatalystString(config.prop8);
	config.prop9 = cleanCatalystString(config.prop9);
	config.prop10 = cleanCatalystString(config.prop10);
	
	config.eVar3 = cleanCatalystString(config.eVar3);
	config.eVar4 = cleanCatalystString(config.eVar4);
	config.eVar5 = cleanCatalystString(config.eVar5);
	config.eVar6 = cleanCatalystString(config.eVar6);
	config.eVar8 = cleanCatalystString(config.eVar8);
	config.eVar9 = cleanCatalystString(config.eVar9);
	config.eVar10 = cleanCatalystString(config.eVar10);
		
	sobj.server="";
	sobj.channel=config.channel;
	sobj.pageType="";
	sobj.prop1 = config.prop1;
	sobj.prop2 = (config.prop2.length) ? sobj.prop1 + ':' + config.prop2 : sobj.prop1;
	sobj.prop3 = (config.prop3.length) ? sobj.prop2 + ':' + config.prop3 : sobj.prop2;
	sobj.prop4 = (config.prop4.length) ? sobj.prop3 + ':' + config.prop4 : sobj.prop3;
	sobj.prop5 = (config.prop5.length) ? sobj.prop4 + ':' + config.prop5 : sobj.prop4;
	
	if( typeof config.events != 'undefined' && config.events.indexOf('prodView') != -1) sobj.pageName = 'Store:Product:' + config.pagename;
	else sobj.pageName=((sobj.prop5.length) ? sobj.prop5 + ':' : '') + config.pagename;

	sobj.prop6 = (typeof config.prop6 == 'undefined') ? '' : config.prop6;
	sobj.prop7 = (typeof config.prop7 == 'undefined') ? '' : config.prop7;
	sobj.prop8 = (typeof config.prop8 == 'undefined') ? '' : config.prop8;
	sobj.prop9 = (typeof config.prop9 == 'undefined') ? '' : config.prop9;
	sobj.prop10 = (typeof config.prop10 == 'undefined') ? '' : config.prop10;

	/* Conversion Variables */
	sobj.campaign="";
	sobj.state = (typeof config.state == 'undefined') ? '' : config.state;
	sobj.zip = (typeof config.zip == 'undefined') ? '' : config.zip;
	sobj.events = (typeof config.events == 'undefined') ? '' : config.events;
	if( typeof config.products == 'undefined' || config.products.length == 0) sobj.products="";
	else {
		sobj.products = "";
		if (sobj.events.indexOf('prodView') != -1) {
			var conversioncnt = 0;
			for (var i = 0; i < config.products.length; i++) {
				if(config.products[i].status != 'Discontinued') conversioncnt++;
			}
			for (var i = 0; i < config.products.length; i++) {
				var str = ';' + config.products[i].sku;
				var cval = 0;
				if(config.products[i].status != 'Discontinued' && conversioncnt > 0) {
					cval = roundNumber(0.05*(config.products[i].price/conversioncnt),4);
				}
				str += ';;;event5=' + cval;
				sobj.products += sobj.products.length ? ',' + str : str;
			}
		}
		else if (sobj.events.indexOf('purchase') != -1) {
			for (var i = 0; i < config.products.length; i++) {
				var str = ';' + config.products[i].sku;
				str += ';' + config.products[i].quantity;
				str += ';' + config.products[i].quantity * config.products[i].price;
				sobj.products += sobj.products.length ? ',' + str : str;
			}
		}
		else if (sobj.events.indexOf('event4') != -1) { // retailer locator
			sobj.products = config.products;
		}
		else {
			for (var i = 0; i < config.products.length; i++) {
				var str = ';' + config.products[i].sku;
				sobj.products += sobj.products.length ? ',' + str : str;
			}
		}
	}
	sobj.purchaseID=(typeof config.purchaseID == 'undefined') ? '' : config.purchaseID;
	sobj.transactionID="";
	
	sobj.eVar1 = sobj.purchaseID;
	
	if(typeof config.eVar3 != 'undefined' && config.eVar3 != '') sobj.eVar3 = config.eVar3;
	else if (sobj.events.indexOf('prodView') != -1) sobj.eVar3 = '';
	else sobj.eVar3 = sobj.pageName;
	
	sobj.eVar4 = (typeof config.eVar4 == 'undefined') ? '' : config.eVar4;
	sobj.eVar5 = (typeof config.eVar5 == 'undefined') ? '' : config.eVar5;
	sobj.eVar6 = (typeof config.eVar6 == 'undefined') ? '' : config.eVar6;
	sobj.eVar8 = (typeof config.eVar8 == 'undefined') ? '' : config.eVar8;
	sobj.eVar9 = (typeof config.eVar9 == 'undefined') ? '' : config.eVar9;
	sobj.eVar10 = (typeof config.eVar10 == 'undefined') ? '' : config.eVar10;

	/* Hierarchy Variables */
	sobj.hier1="";
	
	sobj.trackLinkViews = (typeof config.trackLinkViews != 'undefined') ? true : false;
	
	return sobj;
}

function cleanCatalystString(str) {
 str = str.replace(/&trade;/g,"");
 str = str.replace(/&copy;/g,"");
 str = str.replace(/&reg;/g,"");
 str = str.replace(/&lsquo;/g,"");
 str = str.replace(/&rsquo;/g,"");
 str = str.replace(/&ldquo;/g,"");
 str = str.replace(/&rdquo;/g,"");
 str = str.replace(/&ndash;/g,"-");
 str = str.replace(/&mdash;/g,"-");
 str = str.replace(/&frac14;/g," 1/4");
 str = str.replace(/&frac12;/g," 1/2");
 str = str.replace(/&frac34;/g," 3/4");
 str = str.replace(/&eacute;/g,"e");
 str = str.replace(/&egrave;/g,"e");
 str = str.replace(/&hellip;/g,"");
 str = str.replace(/&deg;/g,"");
 str = str.replace(/&dagger;/g,"");
 str = str.replace(/&#8211;/g,"-");
 str = str.replace(/\u2122/g,""); // hex equavalent
 str = str.replace(/\uA9/g,""); // hex equavalent
 str = str.replace(/<[^>]*>/g," "); // remove any html formatting
 str = str.replace(/[^a-zA-Z 0-9_,.:>|&/\-()\\]/g,""); // allow only these characters
 str = str.replace(/ +/g," "); // strip repeat white space
 str = str.replace(/^\s*/, "").replace(/\s*$/, ""); // trim leading and trailing white space
 return str;
}

function roundNumber(number, digits) {
    var multiple = Math.pow(10, digits);
    var rndedNum = Math.round(number * multiple) / multiple;
    return rndedNum;
}

function toTitleCase(s) {
  return s.replace(/\b([a-z])/g, function (_, initial) {
      return initial.toUpperCase();
  });
}
