﻿///<reference path="../../TESCO.js" />
///<reference path="../../system/event.js" />
///<reference path="../../system/event.manager.js" />
///<reference path="../../system/exception.js" />
///<reference path="system/site-tracker.js" />
///<reference path="UI/entities.js" />

if (TESCO.sites.Configuration.siteTracker.enabled) {

    TESCO.$("sites.retail").SiteTracker = (function() {
		
		var APP = TESCO.sites.Configuration.application;
        var EVENT = TESCO.system.event;
        var NODE = TESCO.system.DOM.node;
        
        var _si = TESCO.sites.retail.system.SiteTracker;
        var _siCookie = new TESCO.system.Cookie("siDeferredTag", _year(), APP.domain.cookie);

        function _saveTag(tagData) {
            _siCookie.setAllValues(tagData);
        }
        
        function _year() {
	        var _date = new Date();
		        _date.setTime(_date.getTime() + (365 * 24 * 60 * 60 * 1000));
            return _date;
        }
        
        function _constructor() {
            this.metaData = {};
            var _self = this;
            EVENT.document.addEventListener("load",
                function() {

                    //Attach SI link tracker event
                    EVENT.attach(document.body, "click", 
				        function(e) { 
					        _self.siLinkTrack(e); 
				        }
			        );

                    //Attach basket event	    
                    EVENT.attach(TESCO.UI.entities.Product.event, "quantityupdateend",
	                    function(product) {
					        if (product.trace) {
						        var _tagData = "eventID=basketUpdate";
						        _tagData += "&productID=" + product.getTPNB();
						        _tagData += "&quantity=" + product.newQuantity;
						        _tagData += "&location=" + product.trace.name;
						        _si.SiSendAdditionalTracer(document.location.href, _tagData);
					        }
	                    }
	                );

                    //Attach carousel event
                    EVENT.attach(TESCO.sites.retail.UI.Carousel.event, "scroll",
	                    function(prodObj) {
	                        var _tagData = "eventID=carouselClick";
	                        _tagData += "&featuredSpaceID=";
	                        _tagData += prodObj.fsID;
	                        _tagData += "&candidateId=";
	                        for (var c=0;c<prodObj.products.length;c++) {
	                            _tagData += "+" + prodObj.products[c].firstChild.id.split("-")[1];
	                        }
	                        _si.SiSendAdditionalTracer(document.location.href, _tagData);
	                    }
	                );
                    //Check for cookie and fire tag if found
                    var _siDeferredTag = _siCookie.getAllValues();
                    if (_siDeferredTag) {
                        _si.SiSendAdditionalTracer(document.location.href, _siDeferredTag);
                        _siCookie.expire();
                    }
                }
            );
        }

        _constructor.prototype.siLinkTrack = function(e) {

            var _siLinkData;
            var _siElement = e.target.className.indexOf("si_") != -1 ? e.target : NODE.getAncestorByAttributeRegExp(e.target, "class", new RegExp('^si_'));
            if (_siElement) {

                var _classnames = _siElement.className.split(" ");

                for (var c = 0; c < _classnames.length; c++) {
                    if (_classnames[c].indexOf("si_") != -1) {
                        _siLinkCategory = _classnames[c].split("_")[1];
                        _siLinkData = _classnames[c].split("_")[2];
                        break;
                    }
                }

                //Check for any metaData
                var _metaData = this.metaData[_siLinkCategory];

                var _tagData = "eventID=linkClick&linkCategory=" + _siLinkCategory + "&";
                if (_metaData.data) { 
					_tagData += _metaData.data + "&"; 
				}

                //Loop through each field
                var _fields = _siLinkData.split("-");
                for (var f = 0; f < _fields.length; f++) {
                    _tagData += _metaData.fields[f] + "=" + _fields[f] + "&";
                }

                _tagData = _tagData.substring(0, _tagData.length - 1);

                //If this was a JS event, fire tag now
                if (!_metaData.reload) { 
			        _si.SiSendAdditionalTracer(document.location.href, _tagData);
		        } else { //Otherwise save the tag data in a cookie
                    _saveTag(_tagData);
                }
            } else {
                //Check if this is an external link
                if (e.target.tagName.toLowerCase() == "a") {
                    var _uri = e.target.href.toLowerCase();
                    var _secureUri = new TESCO.system.URI(APP.domain.secure)
                    if ((_uri.indexOf(APP.path.toLowerCase()) == -1) && (_uri.indexOf(_secureUri.domain) == -1)) {
					    TESCO.sites.retail.system.SiteTracker.SiSendAdditionalTracer(document.location.href, "eventID=linkClick&linkCategory=external&destination=" + e.target.href);
                    } else {
                        //Else internal link, so check if it's contained within a featured space
                        var _candidate = NODE.getAncestorByAttributeRegExp(e.target, "id", new RegExp('^c-'));
                        if (_candidate) {
                            var _featuredSpace = NODE.getAncestorByAttributeRegExp(_candidate, "id", new RegExp('^fs-'));
                        }
                        if (_candidate && _featuredSpace) {
                            var _tagData = "eventID=linkClick&linkCategory=featuredSpace&featuredSpaceID=" + _featuredSpace.id.split("-")[1] + "&candidateID=" + _candidate.id.split("-")[1];
							_saveTag(_tagData);
                        }
                    }
                }
            }
        }

        TESCO.system.Exception.handler.addEventListener("exceptionRaised",
	        function(msg) {
	            _si.SiAddTrackParam("ERROR", msg + "\nTESCO.system.browser.agent: " + TESCO.system.browser.agent);
	            _si.SiSendTrackParams();
	        }
        );
     
        return new _constructor;
    })();
}

