﻿///<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/dialogue.js" />
///<reference path="UI/entities.js" />

TESCO.$("sites.retail").SiteTracker = (function() {

    var _si = TESCO.sites.retail.system.SiteTracker;
    var APP = TESCO.sites.Configuration.application;
    
    function _year() {
		var _date = new Date();
			_date.setTime(_date.getTime() + (365 * 24 * 60 * 60 * 1000));
        return _date;
    }
	var _siCookie = new TESCO.system.Cookie("siDeferredTag", _year(), TESCO.sites.Configuration.application.domain.cookie);

    function _constructor() {
        this.metaData = {};
        var _self = this;
        TESCO.system.event.document.addEventListener("load",
	        function() {

	            //Attach SI link tracker event
	            TESCO.system.event.attach(document.body, "click", 
					function(e) { 
						_self.siLinkTrack(e); 
					}
				);

	            //Attach basket event	    
	            TESCO.system.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
	            TESCO.system.event.attach(TESCO.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 : TESCO.system.DOM.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
                this.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)) {
					if (TESCO.UI.Window.Relationship.getFromNode(e.target)) {	// does it open in another window?
						TESCO.sites.retail.system.SiteTracker.SiSendAdditionalTracer(document.location.href, "eventID=linkClick&linkCategory=external&destination=" + e.target.href);
					} else {
						e.stopEvent();
						document.location.href = APP.domain.public + APP.path + "/out?goto=" + e.target.href;
					}
                } else {
                    //Else internal link, so check if it's contained within a featured space
                    var _candidate = TESCO.system.DOM.node.getAncestorByAttributeRegExp(e.target, "id", new RegExp('^c-'));
                    if (_candidate) {
                        var _featuredSpace = TESCO.system.DOM.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];
                        this.saveTag(_tagData);
                    }
                }
            }
        }
    }

    _constructor.prototype.saveTag = function(tagData) {
        _siCookie.setAllValues(tagData);
        //todo: add externalClickID here?
    }

    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;
})();