// Choicestream Phase 1

var csAccessoriesInit = false;
var csCalled = false;

function initCarousel(carouselName) {
    if (carouselName != '') {
        if (carouselName == 'csAccessories') {
            if (!csCalled) return;
            if (csAccessoriesInit) return;
        }
        var cList = document.getElementsByClassName(document.body, 'featuredSpaceWrapper');

        if (cList) {
            for (var idx = 0; idx < cList.length; idx++) {
                if (cList[idx].id == carouselName) {
                     new TESCODIRECT.lib.DOM.rect.Position.Animation.Carousel(50, cList[idx], 'horizontal');
                     if ( carouselName == 'csAccessories' ) csAccessoriesInit = true;
                }
            }
        }
    }
}

TESCODIRECT.lib.ChoiceStream = function() {

    var _catNo = '';
    var _productTitle = '';
    var _type = '';

    var MAX_PRODUCT_ACCESSORIES = 5;
    var MAX_PRODUCT_ACCESSORIES_PANE = 5;
    var MAX_PRODUCT_ALTERNATIVES = 5;
    var MAX_BASKET_ATTACHMENT_ACCESSORIES = 7;

    var CS_API_KEY = 'd6f3f90a74ae7d93';
    var _userId = '';
    var _cookieId = '';
    var _appContext = '';
    var _context = '';
    var _pageContext = '';
    var _services;
    var _productSoldSep;
    var _relatedItems;
    var _showOtherPrices = false;

    var _responseId_Alternatives = '';
    var _responseId_Accessories = '';

    var _logit = false;

    var _requestComplete = false;
    var _endecaInfo = '';
    var _csResponse = null;
    var _csTimeOutTries = 60;
    var _ajax = null;

    function csTimeout() {
        var tries = 0;
        setTimeout(function() {
            if (tries < _csTimeOutTries && !_requestComplete) {
                //alert(_csTimeOutTries);
                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('CustomerId', ';');


            //var CID = readCookie('CID', ';');
            _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 : '');
    }

    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 : '');
            
            //setUserId();
            //_context.setAppcontext(_appContext);
            r.setContext(_context);

            if (activityType == 'confirmation') {
                // using responseId to pass OrderNo
                var orderLines = orderDetails.split(";");
                for (var line = 0; line < orderLines.length; line++) {
                    var elements = orderLines[line].split("+");
                    r.addActivity(csActivity(elements[0], 'purchase_items', responseId, elements[1], elements[2]));
                }
            }
            else
                if (activityType == 'add_to_basket') {
                var allInputs = document.getElementsByTagName("input");
                for (var i = 0; i < allInputs.length; i++) {
                    if (allInputs[i].getAttribute("type") == "checkbox") {
                        if (allInputs[i].checked == true) {
                            var catId = allInputs[i].id;
                            if (catId.indexOf('csAccessories') > -1) {
                                catId = catId.substr(14);
                                r.addActivity(csActivity(catId, 'item_clicks', _responseId_Accessories, null, null));
                            }
                        }
                    }
                }
            }
            else {
                r.addActivity(csActivity(catalogNumber, activityType, responseId, null, null));
            }
            r.send();

        }
        catch (Error) {
        }
    }

    function csActivity(catalogNumber, activityType, responseId, quantity, unitPrice) {
        var item = new csAny.Activity(activityType);
        item.setAttribute("item_id", catalogNumber);
        //Adding Activities appcontext value
        if (_pageContext == 'Basket_Attachment') {
            _appContext = 'TD_BsktAttach_CrossSellItemClick';
        }
        else if (_pageContext == 'Product_Page' && responseId == _responseId_Accessories && activityType != 'item_views') {
            _appContext = 'TD_ProdDetail_CrossSellItemClick';
        }
        else if (_pageContext == 'Product_Page' && responseId == _responseId_Alternatives && activityType != 'item_views') {
            _appContext = 'TD_ProdDetail_UpSellItemClick';
        }
        else if (_pageContext == 'Product_Page' && activityType == 'item_views') {
            _appContext = 'TD_ProdDetail_ItemView';
        }
        else if (activityType == 'purchase_items') {
            _appContext = 'TD_OrderConfirm_PurchaseItem';
        }
        item.setAppcontext(_appContext);
        
        if (activityType == 'purchase_items') {
            if (responseId != '') {
                item.setAttribute("purchase_id", responseId);
            }
            item.setAttribute("quantity", quantity);
            item.setAttribute("unit_price", unitPrice);
            logit('catNo= "' + catalogNumber + '", Type="' + activityType + '", Page="' + _pageContext + '", OrderId="' + responseId + '", Quantity="' + quantity + '", UnitPrice="' + unitPrice + '", CustId="' + _userId + '", cookieID="' + _cookieId + '"');
        }
        else {
            if (responseId != '') item.setAttribute("recommendation_id", responseId);
            logit('catNo= "' + catalogNumber + '", Type="' + activityType + '", Page="' + _pageContext + '", CS ResponseId="' + responseId + '", CustId="' + _userId + '", cookieID="' + _cookieId + '"');
        }
        return item;
    }
    this.csRequest = function(catalogNumber, requestType, logit) {
        _logit = logit;
        _catNo = catalogNumber;

        var csTimeOutTries = document.getElementById('CHOICE_STREAM_TIMEOUT');
        _csTimeOutTries = (csTimeOutTries != null ? parseInt(csTimeOutTries.value) : _csTimeOutTries);
        //setUserId();
        var maxProductAccessoriesPane = document.getElementById('csMaxRelatedItems_Pane');

        MAX_PRODUCT_ACCESSORIES_PANE = (maxProductAccessoriesPane != null ? parseInt(maxProductAccessoriesPane.value) : MAX_PRODUCT_ACCESSORIES_PANE);

        _pageContext = (document.getElementById('CS_CONTEXT') != null ? document.getElementById('CS_CONTEXT').value : '');
        _productTitle = (document.getElementById('CS_PRODUCT_TITLE') != null ? document.getElementById('CS_PRODUCT_TITLE').value : 'product');
        _productSoldSep = (document.getElementById('CS_SOLD_SEP') != null ? false : true);

        _relatedItems = (document.getElementById('CS_RELATED_ITEMS') != null ? document.getElementById('CS_RELATED_ITEMS').value : '');
        _type = '';
        try {
            _requestComplete = false;
            _services = document.getElementById('Services');
            if (catalogNumber == '') return;
            var csInstr = document.getElementById('csInstr');
            if (csInstr != null) {
                if (_pageContext == 'Basket_Attachment') {
                    var html = '<h4>To make the most of your <a href="http://direct.tesco.com/product/default.aspx?r=' + catalogNumber + '">' + _productTitle + '</a> you may want to consider the following:</h4>';
                    if (_services != null) html += addAllToBasketHTML();
                    html += '<div class="xsell">';
                    html += '<h3>You May Also Like:</h3>';
                    html += searchHTML();
                    html += '</div><div class="clear">&#160;</div>';
                    csInstr.innerHTML = html;
                }
                else
                    csInstr.innerHTML = searchHTML();
            }
            var r = new csAny.Request();

            var blackList = getBlackList();
            //alert('blacklist=' + blackList);

            //_context.setAppcontext(_pageContext);
            if (requestType == 'BOTH' || requestType == 'RECOS_ONLY') {

                var maxRecos = (_pageContext == 'Basket_Attachment' ? MAX_BASKET_ATTACHMENT_ACCESSORIES : MAX_PRODUCT_ACCESSORIES);

                //WARNING! Always asking for Accessories to preserve the order of RecoSets from ChoiceStream (Product Details and Basket Attachment pages if not OOS will always need recos)

                var maxAccessories = document.getElementById('csMaxRelatedItems');
                if (maxAccessories != null) maxRecos = parseInt(maxAccessories.value);

                var recommender = "cross_sell";
                if (_pageContext == 'Basket_Attachment') {
                    recommender += '_basket';
                    _appContext = 'TD_BsktAttach_CrossSell';
                }
                else {
                    _appContext = 'TD_ProdDetail_CrossSell';
                }
                var getAccessories = new csAny.GetRecos(recommender, maxRecos);
                getAccessories.setAppcontext(_appContext);
                getAccessories.setParameter("recogroup", "0");
                getAccessories.setParameter("item_ids", catalogNumber);
                if (blackList != '') {
                    getAccessories.setParameter("blacklist", blackList);
                }
                //if (_relatedItems != '') {
                //   getAccessories.setParameter("whitelist", _relatedItems);
                //}
                r.addGetRecos(getAccessories);

                if (document.getElementById('csAlternatives') != null) {
                    _appContext = 'TD_ProdDetail_UpSell';
                    maxRecos = MAX_PRODUCT_ALTERNATIVES;
                    var maxAlternatives = document.getElementById('csMaxAlternatives');
                    if (maxAlternatives != null) maxRecos = parseInt(maxAlternatives.value);

                    var getAlt = new csAny.GetRecos("substitute", maxRecos);
                    getAlt.setAppcontext(_appContext);
                    getAlt.setParameter("recogroup", "1");
                    getAlt.setParameter("item_ids", catalogNumber);

                    if (blackList != '') getAlt.setParameter("blacklist", blackList);
                    r.addGetRecos(getAlt);
                }

                r.setSuccessCallback(displayRecos);
                r.setErrorCallback(csError);
            }
            if (requestType == 'BOTH' || requestType == 'ACTIVITIES_ONLY') {
                if (_pageContext != 'Basket_Attachment') { // Don't record the product view twice.

                    r.addActivity(csActivity(catalogNumber, 'item_views', ''));
                    
                }
            }
            r.setContext(_context);
            csCalled = true;
            csTimeout();
            r.send();
        }
        catch (Error) {
            handleError('Code 2: ' + Error.message);
        }
    }
    function getBlackList() {
        try {
            var basketElem = document.getElementById('CS_ITEMS_IN_BASKET');

            if (basketElem != null) {
                var itemsInBasket = basketElem.value;
                if (itemsInBasket != '') {
                    itemsInBasket = itemsInBasket.replace(/;/g, '&');
                }
                return itemsInBasket;
            }
        }
        catch (Error) {
            return '';
        }
        return '';
    }

    function displayRecosContinue(response) {
        if (response == null || response == '') {
            handleError('Code 3: No AJAX Response');
            return;
        }
        _endecaInfo = eval('(' + response + ')');
        _type = 'csAccessories';
        try {

            var numRecoSets = _csResponse.getNumRecoSets();
            processRecoSet(_csResponse, "csAccessories");
            if (_pageContext == 'Basket_Attachment') {
                initCarousel('csAccessories');
            }
            else {
                if (showingRelated) {
                    initCarousel('csAccessories');
                }
                var recoset = _csResponse.getRecoSet(0);
                var countControlsOriginal = document.getElementsByName('countControlsOriginal' + _catNo);
                if (countControlsOriginal != null) {
                    if (countControlsOriginal.length > 0) {

                        var countControls = document.getElementsByName('countControls' + _catNo);
                        if (countControls != null) {
                            if (countControls.length > 0) {
                                countControls[0].value = (parseInt(countControlsOriginal[0].value) + parseInt(recoset.getNumRecos()));
                            }
                        }
                    }
                }
            }
            if (numRecoSets == 2) {
                _type = 'csAlternatives';
                processRecoSet(_csResponse, "csAlternatives");
                initCarousel('csAlternatives');
            }
        }
        catch (Error) {
            handleError('Code 4: ' + Error.message);
        }
    }

    function displayRecos(response) {
        _type = 'csAccessories';
        try {
            var status = response.getStatus();
            if (status.getCode() == 0) {
                _csResponse = response;
                getEndecaData();
            }
            else {
                handleError('Code 5: ' + Error.message);
            }
        }
        catch (Error) {
            handleError('Code 6:' + Error.message);
        }
    }

    function processRecoSet(response) {
        try {
            var elementAccessories = '';
            if (_type == 'csAccessories') {
                elementAccessories = document.getElementById('ChoiceStream_accessories');
            }


            var element = document.getElementById(_type);

            if (_pageContext == "Basket_Attachment") {
                element = document.getElementById('csInstr');
            }
            var recoset = response.getRecoSet((_type == "csAccessories" ? 0 : 1));
            if (recoset.getStatus().getCode() == 0) {

                if (_type == "csAccessories") _responseId_Accessories = recoset.getAttribute("response_id");
                else _responseId_Alternatives = recoset.getAttribute("response_id");

                var num_recos = recoset.getNumRecos();
                var num_inStock = (num_recos > 0 ? howMany(recoset) : 0);
                // DEBUG TESTING ONLY
                //if (_type == 'csAccessories') num_inStock = 0;
                // if (_type == 'csAlternatives') num_inStock = 0;
                // num_inStock = 0;
                // END OF DEBUG TESTING ONLY
                var html = '';
                var html1 = '';
                if (num_inStock > 0) {
                    if (_type == 'csAlternatives')
                        html += '<a name="csAlternateProducts"/>';

                    html += startHtml(num_inStock);
                    _showOtherPrices = false;
                    for (var index = 0; index < num_recos; index++) {
                        var tmpReco = recoset.getReco(index);
                        if (getPriceInfo(tmpReco.getAttribute("item_id"), "was") > 0 || getPriceInfo(tmpReco.getAttribute("item_id"), "save") > 0) _showOtherPrices = true;
                    }
                    for (var i = 0; i < num_recos; i++) {
                        var reco = recoset.getReco(i);
                        html += carouselItem(reco);
                    }
                    html += endHtml();

                    if (_pageContext == 'Basket_Attachment') {
                        html = '<h4>To make the most of your <a href="http://direct.tesco.com/product/default.aspx?r=' + _catNo + '">' + _productTitle + '</a> you may want to consider the following:</h4>' + addAllToBasketHTML() + html;
                        if (_services == null) html += addAllToBasketHTML();
                    }
                    if (_pageContext == 'Basket_Attachment' && _services == null) html += '<div class="basketAttachmentMain"><p><a href="#" title="Click to go back to top of the page">Back to Top</a></p><p><a href="/" title="Continue Shopping on Tesco Direct">Continue Shopping</a></p></div>';

                    renderHtml(element, html);

                    if (_type == 'csAccessories' && _pageContext != 'Basket_Attachment') {
                        var shown = 0;
                        var itemsInPane = (num_inStock < MAX_PRODUCT_ACCESSORIES_PANE ? num_inStock : MAX_PRODUCT_ACCESSORIES_PANE);
                        html1 += startHtmlAccessories(itemsInPane);
                        _showOtherPrices = false;
                        for (var index = 0; index < num_recos; index++) {
                            var tmpReco = recoset.getReco(index);
                            if (getPriceInfo(tmpReco.getAttribute("item_id"), "was") > 0 || getPriceInfo(tmpReco.getAttribute("item_id"), "save") > 0) _showOtherPrices = true;
                        }
                        for (var i = 0; i < num_recos; i++) {
                            var reco = recoset.getReco(i);
                            var itemHTML = carouselItemAccessories(reco);
                            if (itemHTML != '') {
                                html1 += itemHTML;
                                shown++;
                                if (shown >= MAX_PRODUCT_ACCESSORIES_PANE) break;
                            }
                        }
                        html1 += endHtmlAccessories();

                        renderHtml(elementAccessories, html1);

                    }
                    if (_type == 'csAlternatives') {

                        var altLink = document.getElementById('csAltProdLink');
                        if (altLink != null) {
                            altLink.innerHTML = '<a href="#csAlternateProducts" title="Click to see our recommended Alternative Products"><img src="/direct/i/b/alternativeitems.gif" alt="Click to see our recommended Alternative Products"/></a>';
                        }
                    }
                }
                else {
                    handleError('Code 7: Error in loading ' + _type);
                }
            }
            else {
                csError('Code 8: ' + recoset.getStatus());
            }
        }
        catch (Err) {
            handleError('Code 9: ' + 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(element, html) {


        if (_pageContext == 'Basket_Attachment' || _type != 'csAccessories') {
            element.innerHTML = html;
        }
        else {
            element.innerHTML = html;
            var csInstr = document.getElementById('csInstr');
            if (csInstr != null) {
                if (_services != null) {
                    csInstr.innerHTML = 'Here is a selection of items <a href="#Accessories">You May Also Like</a> and <a href="#Services">Related Services</a><br/><br/>Select the item(s) you require with the tick boxes and then click add to basket';
                }
                else {
                    csInstr.innerHTML = 'Here is a selection of items <a href="#Accessories">You May Also Like</a><br/><br/>';
                    if (_productSoldSep) csInstr.innerHTML += 'Select the item(s) you require with the tick boxes and then click add to basket';
                }
            }
        }
        _requestComplete = true;
    }
    function carouselItem(reco) {
        var catalogNo = reco.getAttribute("item_id");
        if (!inStock(catalogNo)) {
            //alert(catalogNo + ' does not exist or is OOS ');
            return '';
        }
        var recoName = stripOuterQuotes(reco.getAttribute("name"));
        var productLink = reco.getAttribute("link");
        //var recoImage = reco.getAttribute("image_link");
        var recoImage = getPriceInfo(catalogNo, 'image_product');

        if (recoImage == '') {
            recoImage = reco.getAttribute("image_link");


        }
        else {
            recoImage = 'http://direct.tesco.com/pi/' + recoImage;
        }
        //alert(recoImage);
        var recoCategory = findCategory(reco.getAttribute("category"));

        var recoPrice = getPriceInfo(catalogNo, 'price');
        var wasPrice = getPriceInfo(catalogNo, 'was');
        var savePrice = getPriceInfo(catalogNo, 'save');

        var responseId = (_type == 'csAccessories' ? _responseId_Accessories : _responseId_Alternatives);
        var itemSoldSep = reco.getAttribute("can_be_bought_separately");

        var html = '<li>';
        html += '<div class="listItemCarousel">';
        html += '<div class="itemImage">';
        html += '<a class="csAnchor" href="' + productLink + '" onclick="choiceStream.sendActivity(\'' + catalogNo + '\',\'item_clicks\',\'' + responseId + '\',\'' + _logit + '\')">';
        html += '<img class="pi tn" width="100px" height="100px"  src="' + recoImage + '"/>';

        recoName = recoName.replace('&', '&amp;');
        recoName = recoName.replace('\'', '');
        recoName = recoName.replace('"', '');

        html += '<p class="csTitle">' + recoName + '<br/>' + catalogNo + '</p>';
        html += '</a>';

        //if (_showOtherPrices) html += '<p class="csWasPrice">CS  ' + CurrencyFormatted(reco.getAttribute("previous_price"), "Was") + '</p>';
        html += '<p class="csPrice">' + CurrencyFormatted(recoPrice, (wasPrice > 0 ? "" : '')) + '</p>';

        if (_showOtherPrices) html += '<p class="csWasPrice">' + CurrencyFormatted(wasPrice, "") + '</p>';

        //html += '<p class="csPrice">CS  ' + CurrencyFormatted(reco.getAttribute("price"), (wasPrice > 0 ? "Now" : '')) + '</p>';


        //if (_showOtherPrices) html += '<p class="csSavePrice">CS  ' + CurrencyFormatted(reco.getAttribute("save"), "Save") + '</p>';
        if (_showOtherPrices) html += '<p class="csSavePrice">' + CurrencyFormatted(savePrice, "Save") + '</p>';

        html += addCheckbox(catalogNo, productLink, itemSoldSep);
        if (recoCategory != '') html += '<div>' + recoCategory + '</div>';
        html += '</div>';
        html += '</div>';
        html += '</li>';
        return html;
    }
    function startHtml(count) {
        var html = '<a name="Accessories"/><div class="jsEnabled featuredSpaceWrapper infoContainer carousel xsell" id="' + _type + '">';

        html += '<h3>';
        if (_type == 'csAccessories') {
            html += '<div style="margin-bottom:10px" class="removeAll"> </div>';
            html += '<div valign="center" class="counter"> </div>';
        }
        html += (_type == 'csAccessories' ? 'You May Also Like: ' : 'Alternative Products ');
        html += ' (' + count + ')';
        html += '</h3>';

        html += '<div><div class="featuredSpaceContainer">';
        html += '<ul class="featuredSpaceList">';
        return html;
    }
    function startHtmlAccessories(count) {

        var html = '<div id="choiceStreamWrapper">';
        html += '<form action="/basket/" method="post" name="addToBasket">';
        html += '<h3>';

        html += (_type == 'csAccessories' ? 'You May Also Like: ' : 'Alternative Products ');
        html += ' (' + count + ')';
        html += '</h3>';

        html += '<div class="cs_recoContainer">';
        return html;

    }

    function carouselItemAccessories(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 recoCategory = findCategory(reco.getAttribute("category"));
        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 == '') {
            recoImage = reco.getAttribute("image_link");

            recoImage = recoImage.replace('List', 'thumb');
        }
        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 href="' + productLink + '" onclick="choiceStream.sendActivity(\'' + catalogNo + '\',\'item_clicks\',\'' + _responseId_Accessories + '\',\'' + _logit + '\')"><img class="cs_image" src="' + recoImage + '"/></a>';

        html += '<a href="' + productLink + '" onclick="choiceStream.sendActivity(\'' + catalogNo + '\',\'item_clicks\',\'' + _responseId_Accessories + '\',\'' + _logit + '\')"><div class="cs_title">' + recoName + '</div></a>';

        html += '<div class="cs_price_info">';

        if (wasPrice != '') {
            html += '<div class="cs_now_price">' + CurrencyFormatted(recoPrice, "") + '</div>';
            html += '<div class="cs_was_price">' + CurrencyFormatted(wasPrice, "") + '</div>' + (savePrice != '' ? '<div class="cs_save_price">' + CurrencyFormatted(savePrice, "Save") + '</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 += '</div>';
        if (recoCategory != '') html += '<div class="categoryInfo">' + recoCategory + '</div>';
        if (itemSoldSep == 'Y') {
            html += addToBasketHtml(catalogNo, recoName);

        }
        else {
            html += '<div class="cs_message">Sorry, this item cannot be bought separately.</div>';
        }

        html += '</div>';
        return html;
    }

    function addCheckbox(catalogNo, productLink, itemSoldSep) {
        var html = '';
        if (_type == 'csAccessories') {
            if (_productSoldSep) {
                var showIt = true;
                if (itemSoldSep != 'Y') {
                    if (_relatedItems.indexOf(catalogNo) < 0) {
                        showIt = false;
                        html += '<br/><br/><br/>';
                    }
                }
                if (showIt) {
                    html += '<p class="csSelect"><input type="checkbox" name="carouselCheckBox" value="' + catalogNo + '" id="' + _type + '-' + catalogNo + '"/>';
                    html += '<label class="itemCheckBox" id="label-' + _type + '-' + catalogNo + '"';
                    html += ' for="' + _type + '-' + catalogNo + '">';
                    html += 'Select Item<br/><br/></label></p>';
                }
            }
        }
        else {
            html += '<p class="csBottom"><a href="' + productLink + '" onclick="choiceStream.sendActivity(\'' + catalogNo + '\',\'item_clicks\',\'' + _responseId_Alternatives + '\',\'' + _logit + '\')"><img src="/direct/i/b/browse_more_infoWhiteBg.gif" alt="More Info"/></a></p>';
        }
        return html;
    }

    function endHtmlAccessories() {
        var html = '';
        html += '</div></form></div>';
        return html
    }

    function endHtml() {
        var html = '</ul>';
        html += '</div></div></div>';
        html += '<div class="carouselButtons">';
        html += ' <div class="carousel-previous" id="carousel-previous-' + _type + '">';
        html += '  <img src="/direct/css/i/carouselleft.gif"/>';
        html += '  </div>';
        html += '  <div class="carousel-next" id="carousel-next-' + _type + '">';
        html += '   <img src="/direct/css/i/carouselright.gif"/>';
        html += '  </div>';
        html += '</div>';
        html += '<div class="clear">&#160;</div>';
        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="/direct/i/b/addToBasket.gif" title="Add ' + recoName + ' to basket" name="ba[' + catalogNo + ']" onclick="choiceStream.sendActivity(\'' + catalogNo + '\',\'item_clicks\',\'' + _responseId_Accessories + '\',\'' + _logit + '\')"/></p>';
        return html;
    }
    function searchHTML() {
        return '<p class="csSearching"><img src="/direct/css/i/searching_cs.gif"/></p>';
    }

    function addAllToBasketHTML() {
        return '<div class="xsellRight"><input type="hidden" name="BasketAttachment" value="basketAttachment" /><input type="image" src="/direct/i/b/Addallselecteditemstobasket.gif" alt="Click to add all selected products" name="ba[202-3280]" onclick="choiceStream.sendActivity(\'' + _catNo + '\',\'add_to_basket\',\'\',\'' + _logit + '\');"/></div>';
    }

    this.searchFor = function(category) {
        var searchForm = document.getElementById('fSearch');
        var searchBox = document.getElementById('searchBox');
        if (searchForm != null && searchBox != null) {
            searchBox.value = category;
            searchForm.submit();
        }
    }

    function findCategory(category) {
        if (category == null || category == '') return '';

        var pos = category.lastIndexOf('.');
        category = (pos >= 0 && pos < category.length ? category.substring(pos + 1) : '');
        if (category != '') {
            if (category.indexOf('\'') > -1) return '';
            category = capWords(category.replace(/_/g, ' '));
            category = '<a href="javascript:choiceStream.searchFor(\'' + category + '\')" class="csMore">More ' + category + '</a><br/>';
        }
        return category;
    }

    function capWords(str) {
        words = str.split(" ");
        for (i = 0; i < words.length; i++) {
            testwd = words[i];
            firLet = testwd.substr(0, 1); //lop off first letter
            rest = testwd.substr(1, testwd.length - 1)
            words[i] = firLet.toUpperCase() + rest
        }
        return words.join(" ");
    }

    function csError(status) {
        if (status != null) {
            handleError('Code 10: Error code ' + status.getCode() + ' : ' + status.getMessage());
        }
        else {
            handleError('Code 11: Error processing ChoiceStream Data');
        }
    }

    function handleError(message, timeOut) {
        //alert('Error=' + message);
        if (_type != 'csAlternatives' || timeOut) {
            var csInstr = document.getElementById('csInstr');
            if (csInstr != null) {

                if (_pageContext == 'Basket_Attachment') {
                    if (_services == null)
                        csInstr.innerHTML = '<div class="xsell"><h3>You May Also Like:</h3><p class="csErrMsg">Sorry. We could not find any Related Items for this product.</p></div><div class="clear">&#160;</div>';
                    else
                        csInstr.innerHTML = '<h4>To make the most of your <a href="http://direct.tesco.com/product/default.aspx?r=' + _catNo + '">' + _productTitle + '</a> you may want to consider the following:</h4><div class="xsellRight"><input type="hidden" name="BasketAttachment" value="basketAttachment" /><input type="image" src="/direct/i/b/Addallselecteditemstobasket.gif" alt="Click to add all selected products" name="ba[202-3280]" /></div><div class="xsell"><h3>You May Also Like:</h3><p class="csErrMsg">Sorry. We could not find any Related Items for this product.</p></div><div class="clear">&#160;</div>';
                }
                else {
                    if (_services != null)
                        csInstr.innerHTML = 'Here is a selection of <a href="#Services">Related Services</a><br/><br/>Select the item(s) you require with the tick boxes and then click add to basket';
                    else
                        csInstr.innerHTML = '<p class="csSearching">Sorry. We could not find any Related Items for this product</p>';
                }
            }
        }
    }

    function stripOuterQuotes(name) {
        if (name.indexOf('"') == 0) name = name.substring(1);
        if (name.lastIndexOf('"') == name.length - 1) name = name.substr(0, name.length - 1);
        name = name.replace('""', '"');
        return name;
    }

    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 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) { };
    }

    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) { };
        try {
            var recoAlt = _csResponse.getRecoSet(1);
            if (recoAlt.getStatus().getCode() == 0) {
                var numAlts = recoAlt.getNumRecos();
                for (var i = 0; i < recoAlt.getNumRecos(); i++) {
                    var alt = recoAlt.getReco(i);
                    cats += alt.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();
}

var choiceStream = new TESCODIRECT.lib.ChoiceStream();


