// Choicestream Phase 2 - Personalization

var csCalled = false;

TESCODIRECT.lib.CSPersonalization = function() {

    var _maxRecos = 3;
    var _extraRecos = 7;

    var CS_API_KEY = 'd6f3f90a74ae7d93';
    var _userId = '';
    var _cookieId = '';

    var _csPlaceHolder = null;

    var _context = '';
    var _pageContext = '';
    var _filter = '';


    var _productSoldSep;
    var _responseId = '';

    var _requestComplete = false;
    var _endecaInfo = '';
    var _csResponse = null;

    var _defaultContent = null;
    var _csTimeOutTries = 2;
    var _ajax = null;
    var _logit = false;

    function csTimeout() {
        var tries = 0;

        setTimeout(function() {
            if (tries < _csTimeOutTries && !_requestComplete) {
                setTimeout(arguments.callee, 500);
                tries++;
            }
            else {
                if (!_requestComplete) {
                    handleError("Code 1: ChoiceStream did not respond in time", true);
                }
            }
        }
        , 10);
    }
    function init() {
        try {
            _context = new csAny.Context();
            _context.setApiKey(CS_API_KEY);

            _userId = readCookie('CID', ';');
            if (_userId) {
                _context.setUserId(_userId);
            }

            _cookieId = readCookie('SM', ';');
            _cookieId = _cookieId.replace('*', '');
            _cookieId = _cookieId.replace(/_/g, '');
            if (_cookieId) _context.setCookieId(_cookieId);
        }
        catch (Error) { _userId = ''; _cookieId = ''; };
    }
    function setUserId() {
//        _userId = (document.getElementById('CustomerID') != null ? document.getElementById('CustomerID').value : '');
//        //_userId = '77764317';
//        if (_userId != '') {
//            _context.setUserId(_userId);
//        }
    }

    this.SendRequest = function() {
		
		document.getElementById('onOff').className = "show";
	
        if (document.getElementById('CS_PERSONALIZE_ON') == null) return;

        _pageContext = (document.getElementById('CS_CONTEXT') != null ? document.getElementById('CS_CONTEXT').value : '');
        _logit = (document.getElementById('CS_LOGGING_ENABLED') == null ? 'false' : 'true');
        _filter = (document.getElementById('CS_Filter') != null ? document.getElementById('CS_Filter').value : '');
        //alert(_pageContext);
        //alert(_userId);
//if (_filter == '') return;
        //setUserId();
        if (_pageContext == '') return;
        if (_filter == '' && (_pageContext != 'TD_SearchResultsPage' && _pageContext != 'TD_ListPage' && _pageContext != 'TD_HomePage')) {
            _filter = 'category' + ' =~ ' + '"' + _pageContext + '"';
        }
        else if (_filter == '' && _pageContext != 'TD_HomePage') {
            return;
        }
        //alert(_filter);
        try {
            _requestComplete = false;

            _csPlaceHolder = document.getElementById('ChoiceStream');			
            if (_csPlaceHolder == null) return;

            _defaultContent = _csPlaceHolder.innerHTML;
            _csPlaceHolder.innerHTML = (_pageContext == 'TD_SearchResultsPage' || _pageContext == 'TD_ListPage' ? '' : searchHTML());

            var r = new csAny.Request();

            if (_pageContext != 'TD_SearchResultsPage' && _pageContext != 'TD_ListPage' && _pageContext != 'TD_HomePage') {
                _pageContext = 'TD_CatPage';
                _context.setAppcontext(_pageContext);
            }
            else {
                _context.setAppcontext(_pageContext);
            }
            

            var recommender = setRecommender();
            var maxRecosElem = document.getElementById('CS_MaxRecos');
            _maxRecos = (maxRecosElem != null ? parseInt(maxRecosElem.value) : _maxRecos);

            var extraRecosElem = document.getElementById('CS_ExtraRecos');
            _extraRecos = (extraRecosElem != null ? parseInt(extraRecosElem.value) : _extraRecos);

            var csTimeOutTries = document.getElementById('CS_TimeOut');
            _csTimeOutTries = (csTimeOutTries != null ? parseInt(csTimeOutTries.value) : _csTimeOutTries);



            // Get Extra recos to increase the odds of us getting at least the maximum asked for
            var getRecos = new csAny.GetRecos(recommender, Number(_maxRecos) + Number(_extraRecos));

            r.setContext(_context);
			if (recommender != "homepage") {
            getRecos.setParameter('choice_set_filter', _filter);
			}

            r.addGetRecos(getRecos);
            r.setSuccessCallback(displayRecos);
            r.setErrorCallback(csError);



            csCalled = true;
            csTimeout();
            r.send();
        }
        catch (Error) {
            handleError('Code 2: ' + Error.message);
        }
    }

    function setRecommender() {
        switch (_pageContext) {
            case "TD_SearchResultsPage":
                return "search_page";
                break;
            case "TD_ListPage":
                return "category_page";
                break;
            case "TD_HomePage":
                return "homepage";
                break;
            default:
                return "category_page";
                break;
        }
    }

    function displayRecosContinue(response) {

        if (response == null || response == '') {
            handleError('Code 3: No AJAX Response');
            return;
        }
        _endecaInfo = eval('(' + response + ')');
        try {
            var numRecoSets = _csResponse.getNumRecoSets();
            if (numRecoSets == 1) {
                processRecoSet(_csResponse);
            }
            else
                handleError('Code 4: Wrong number of recoSets returned');
        }
        catch (Error) {
            handleError('Code 5: ' + Error.message);
        }
    }

    function displayRecos(response) {
        try {
            var status = response.getStatus();
            if (status.getCode() == 0) {
                _csResponse = response;
                getEndecaData();
            }
            else {
                handleError('Code 6: ' + Error.message);
            }
        }
        catch (Error) {
            handleError('Code 7:' + Error.message);
        }
    }

    function processRecoSet(response) {
        try {
            var recoset = response.getRecoSet(0);
            if (recoset.getStatus().getCode() == 0) {
                _responseId = recoset.getAttribute("response_id");
                var num_recos = recoset.getNumRecos();

                var num_inStock = (num_recos > 0 ? howMany(recoset) : 0);
                // DEBUG TESTING ONLY
                // num_inStock = 0;
                // END OF DEBUG TESTING ONLY

                if (num_inStock > 0) {
                    var html = startHtml(num_inStock);
                    var shown = 0;
                    for (var i = 0; i < num_recos; i++) {
                        var reco = recoset.getReco(i);
                        var item = itemHtml(reco);
                        if (item != '') {
                            html += item;
                            shown++;
                            if (shown >= _maxRecos) break;
                        }
                    }
                    html += endHtml();
                    renderHtml(html);
                }
                else {
                    handleError('Code 8: Error in loading ' + _type);
                }
            }
            else {
                csError('Code 9: ' + recoset.getStatus());
            }
        }
        catch (Err) {
            handleError('Code 10: ' + Err.message);
        }
    }
    function howMany(recoset) {
        var count = 0;
        for (var i = 0; i < recoset.getNumRecos(); i++) {
            try {
                var reco = recoset.getReco(i);
                if (inStock(reco.getAttribute("item_id"))) count++;
            }
            catch (Error) { };
        }
        return count;
    }
    function inStock(catalogNo) {
        try {
            for (var i = 0; i < _endecaInfo.recos.length - 1; i++) {
                //If we have catalog Number then it is in stock
                if (_endecaInfo.recos[i].catNo == catalogNo) return true;
            }
            return false;
        } catch (Error) { return false }
    }

    function getPriceInfo(catalogNo, type) {
        try {
            for (var i = 0; i < _endecaInfo.recos.length - 1; i++) {
                if (_endecaInfo.recos[i].catNo == catalogNo) {
                    return (_endecaInfo.recos[i][type] != null ? _endecaInfo.recos[i][type] : 0);
                }
            }
        } catch (Error) { return 0 }
        return 0;
    }

    function renderHtml(html) {
        //return
        if (_requestComplete == true) return;
        if (_csPlaceHolder == null) return;
        _csPlaceHolder.innerHTML = html;
        _requestComplete = true;
		initRot();
    }

    function startHtml(count) {
        var html = '';
        html += '<form action="/basket/" method="post" name="addToBasket">';
        html += '<h3>We Recommend</h3>';
        return html;
    }

    function itemHtml(reco) {

        var catalogNo = reco.getAttribute("item_id");
        if (!inStock(catalogNo)) {
            return '';
        }
        var recoName = reco.getAttribute("name");

        recoName = recoName.replace('&', '&amp;');
        recoName = recoName.replace('\'', '');
        recoName = recoName.replace('"', '');

        var productLink = reco.getAttribute("link");
        //var recoImage = reco.getAttribute("image_link");

        //recoImage = recoImage.replace('List', 'thumb');
        //var recoImage = getPriceInfo(catalogNo, 'image_thumb');
        ////alert(recoImage);
        //if (recoImage == '') {
		 var recoImage = reco.getAttribute("image_link");			
        //}
        //else {
            //recoImage = 'http://direct.tesco.com/pi/' + recoImage;
        //}
        //alert(recoImage);
        var recoPrice = getPriceInfo(catalogNo, 'price');
        var wasPrice = getPriceInfo(catalogNo, 'was');
        var savePrice = getPriceInfo(catalogNo, 'save');

        var itemSoldSep = reco.getAttribute("can_be_bought_separately");

        var html = '';
        html += '<div class="cs_reco">';

        html += '<a class="imgRec" href="' + productLink + '" onclick="csPersonalization.sendActivity(\'' + catalogNo + '\',\'item_clicks\',\'' + _responseId + '\',\'' + _logit + '\')"><img class="cs_image" src="' + recoImage + '"/></a>';

        //if (wasPrice != '') {
            //html += '<span class="cs_was_price">' + CurrencyFormatted(wasPrice, "Was") + '</span>';
           //html += '<div class="cs_now_price">' + CurrencyFormatted(recoPrice, "Now") + (savePrice != '' ? '<span class="cs_save_price">&#160;' + CurrencyFormatted(savePrice, "Save") + '</span>' : '') + '</div>';
        //}
        //else {
            html += '<div class="cs_price">' + CurrencyFormatted(recoPrice, "") + '</div>';
        //}
        //        if (savePrice != '') {
        //            html += '<span class="cs_save_price">' + CurrencyFormatted(savePrice, "Save") + '</span>';
        //        }
        //html += '<a href="' + productLink + '"><img src="/direct/i/b/browse_more_infoWhiteBg.gif" alt="More Info"/></a>';

		html += '<p><a class="title" href="' + productLink + '">' + recoName + '</a></p>';

        if (itemSoldSep == 'Y') html += addToBasketHtml(catalogNo, recoName);

        html += '</div>';
        return html;
    }

    function endHtml() {
        var html = '';
        html += '</form>';
        return html;
    }

    function addToBasketHtml(catalogNo, recoName) {
        var html = '';
        recoName = recoName.replace('\'', '');
        recoName = recoName.replace('"', '');
        html += '<input type="hidden" name="countControls' + catalogNo + '" value="1"/>';
        html += '<p class="cs_addtobasket"><input type="image" src="/p/i/diycar/homepage/add.jpg" title="Add ' + recoName + ' to basket" name="ba[' + catalogNo + ']" onclick="csPersonalization.sendActivity(\'' + catalogNo + '\',\'item_clicks\',\'' + _responseId + '\',\'' + _logit + '\')"/></p>';
        return html;
    }

    function searchHTML() {
        return '<h3 style="margin-bottom:1px">We Recommend</h3><p class="search">Searching for related items...<img class="load" src="/p/i/diycar/homepage/preload.gif"/></p>';
    }

    function csError(status) {
        if (status != null) {
            handleError('Code 11: Error code ' + status.getCode() + ' : ' + status.getMessage());
        }
        else {
            handleError('Code 12: Error processing ChoiceStream Data');
        }
    }

    function handleError(message, timeOut) {
        //alert('Error=' + message);
        if (_requestComplete) return;

        if (_csPlaceHolder != null) {
            if (_pageContext == 'search' || _pageContext == 'browse') {
                _csPlaceHolder.innerHTML = '';
                _csPlaceHolder.style.display = 'none';
            }
            else
                _csPlaceHolder.innerHTML = _defaultContent;
        }
        _requestComplete = true;
    }

    function CurrencyFormatted(amount, labelText) {

        var i = parseFloat(amount);
        if (isNaN(i)) return '&#160';
        if (i == 0) return '&#160;';

        var minus = '';
        if (i < 0) { minus = '-'; }
        i = Math.abs(i);
        i = parseInt((i + .005) * 100);
        i = i / 100;
        s = new String(i);
        if (s.indexOf('.') < 0) { s += '.00'; }
        if (s.indexOf('.') == (s.length - 2)) { s += '0'; }
        s = minus + s;
        return (labelText != '' ? labelText + ' ' : '') + '\u00A3' + s;
    }

    function readCookie(name, delimit) {
        if (document.cookie == '') {
            return false;
        }
        else {
            var fC, lC;
            var mcookie = unescape(document.cookie);
            fC = mcookie.indexOf(name);
            var ph = fC + name.length;
            if ((fC != -1) && (mcookie.charAt(ph) == '=')) {
                fC += name.length + 1;
                lC = mcookie.indexOf(delimit, fC);
                if (lC == -1) lC = mcookie.length;
                return unescape(mcookie.substring(fC, lC));
            }
            else {
                return false;
            }
        }
    }

    function getCatNos() {
        var cats = '';
        try {
            var recoAcc = _csResponse.getRecoSet(0);
            if (recoAcc.getStatus().getCode() == 0) {
                for (var i = 0; i < recoAcc.getNumRecos(); i++) {
                    var reco = recoAcc.getReco(i);
                    cats += reco.getAttribute("item_id") + ';';
                }
            }
        } catch (Error) { };
        if (cats != '') return 'cats=' + cats;
        return cats;
    }

    function getEndecaData() {
        _ajax = new TESCODIRECT.lib.Ajax("/choicestream", getCatNos(), displayRecosContinue);
        if (_ajax != null) _ajax.invoke();
    }
    init();

    this.sendActivity = function(catalogNumber, activityType, _responseId, logit, orderDetails) {
        _logit = logit;
        try {
            var doActivity = document.getElementById('CS_ACTIVITY_ENABLED');
            if (doActivity == null) return;

            if (catalogNumber == '') return;

            var r = new csAny.Request();
            _pageContext = (document.getElementById('CS_CONTEXT') != null ? document.getElementById('CS_CONTEXT').value : '');

            if (_pageContext != 'TD_SearchResultsPage' && _pageContext != 'TD_ListPage' && _pageContext != 'TD_HomePage') {
                _pageContext = 'TD_CatPage';
                _context.setAppcontext(_pageContext);
            }
            else {
                _context.setAppcontext(_pageContext);
            }

           
            
            //setUserId();
            r.setContext(_context);
            r.addActivity(csActivity(catalogNumber, activityType, _responseId));
            r.send();
        }
        catch (Error) {
        }
    }
    function csActivity(catalogNumber, activityType, responseId) {
        var item = new csAny.Activity(activityType);
        item.setAttribute("item_id", catalogNumber);
        if (responseId != '') item.setAttribute("recommendation_id", responseId);
        logit('catNo= "' + catalogNumber + '", Type="' + activityType + '", Page="' + _pageContext + '", CS ResponseId="' + responseId + '", CustId="' + _userId + '", cookieID="' + _cookieId + '"');
        return item;
    }
    function logit(message) {
        try {
            if (_logit == 'true') {
                var stamp = new Date();

                message = stamp.toDateString() + ' ' + stamp.getHours() + ':' + stamp.getMinutes() + ':' + stamp.getSeconds() + ' ACTIVITY ' + message;
                var logWindow = window.open("", "debugWindow");
                logWindow.top.document.writeln('<p>' + message + '</p>');
            }
        } catch (Error) { };
    }

}

var csPersonalization = new TESCODIRECT.lib.CSPersonalization();