﻿Array.prototype.clean = function (deleteValue)
{
    for (var i = 0; i < this.length; i++)
    {
        if (this[i] == deleteValue)
        {
            this.splice(i, 1);
            i--;
        }
    }
    return this;
};

var NetminersTracker = function ()
{
    this.bc = new Array('[Site]', '[Region]', '[Market]', '[Currency]', '[Client ID]', '[Product ID]', '[Collection]', '[Category]', '[Material]', '[Stone]', '[Price Range]');

    this.Regions =
	{
	    "AE": { Region: "Europe", Market: "Middle East", Currency: "AED" },
	    "AE": { Region: "Europe", Market: "Middle East", Currency: "AED" },
	    "AT": { Region: "Europe", Market: "CWE", Currency: "EUR" },
	    "AU": { Region: "Asia", Market: "Australia", Currency: "AUD" },
	    "BE": { Region: "Europe", Market: "Europe", Currency: "EUR" },
	    "BE": { Region: "Europe", Market: "Europe", Currency: "EUR" },
	    "BR": { Region: "South America", Market: "South America", Currency: "BRL" },
	    "CA": { Region: "North America", Market: "North America", Currency: "CAD" },
	    "CA": { Region: "North America", Market: "North America", Currency: "CAD" },
	    "CH": { Region: "Europe", Market: "CWE", Currency: "CHF" },
	    "CH": { Region: "Europe", Market: "CWE", Currency: "CHF" },
	    "CN": { Region: "Asia", Market: "PAP", Currency: "CNY" },
	    "CN": { Region: "Asia", Market: "PAP", Currency: "CNY" },
	    "CZ": { Region: "Europe", Market: "CEE", Currency: "CZK" },
	    "DE": { Region: "Europe", Market: "CWE", Currency: "EUR" },
	    "DK": { Region: "Europe", Market: "Nordic", Currency: "DKK" },
	    "EE": { Region: "Europe", Market: "CEE", Currency: "EEK" },
	    "ES": { Region: "Europe", Market: "Europe", Currency: "EUR" },
	    "FI": { Region: "Europe", Market: "Nordic", Currency: "EUR" },
	    "FR": { Region: "Europe", Market: "Europe", Currency: "EUR" },
	    "GB": { Region: "Europe", Market: "Europe", Currency: "DKK" },
	    "GR": { Region: "Europe", Market: "CCE", Currency: "DKK" },
	    "HK": { Region: "Asia", Market: "PAP", Currency: "HKD" },
	    "HK": { Region: "North America", Market: "North America", Currency: "BMD" },
	    "HU": { Region: "Europe", Market: "CEE", Currency: "HUF" },
	    "IE": { Region: "Europe", Market: "Europe", Currency: "EUR" },
	    "IL": { Region: "Europe", Market: "Middle East", Currency: "ILS" },
	    "IT": { Region: "Europe", Market: "CWE", Currency: "EUR" },
	    "JM": { Region: "North America", Market: "Jamaica", Currency: "JMD" },
	    "LT": { Region: "Europe", Market: "CEE", Currency: "LTL" },
	    "MX": { Region: "North America", Market: "North America", Currency: "MXN" },
	    "NL": { Region: "Europe", Market: "CWE", Currency: "EUR" },
	    "NO": { Region: "Europe", Market: "Nordic", Currency: "NOK" },
	    "NZ": { Region: "Asia", Market: "Australia", Currency: "NZD" },
	    "PL": { Region: "Europe", Market: "CEE", Currency: "PLN" },
	    "PT": { Region: "Europe", Market: "Europe", Currency: "EUR" },
	    "RO": { Region: "Europe", Market: "CEE", Currency: "RON" },
	    "RS": { Region: "Europe", Market: "CEE", Currency: "RSD" },
	    "RU": { Region: "Europe", Market: "CEE", Currency: "RUB" },
	    "SE": { Region: "Europe", Market: "Nordic", Currency: "SEK" },
	    "SG": { Region: "Asia", Market: "PAP", Currency: "SGD" },
	    "SK": { Region: "Europe", Market: "CEE", Currency: "EUR" },
	    "TR": { Region: "Europe", Market: "Europe", Currency: "TRY" },
	    "UA": { Region: "Europe", Market: "CEE", Currency: "UAH" },
	    "US": { Region: "North America", Market: "North America", Currency: "USD" },
	    "ZA": { Region: "Africa", Market: "Africa", Currency: "ZAR" }
	};

    this.Indexes =
	{
	    Site: 0,
	    Region: 1,
	    Market: 2,
	    Currency: 3,
	    ClientID: 4,
	    ProductID: 5,
	    Collection: 6,
	    Category: 7,
	    Material: 8,
	    Stone: 9,
	    PriceRange: 10
	};

    this.normalizeWord = function (word, keepRestAsItIs)
    {
        return word.substring(0, 1).toUpperCase() + (keepRestAsItIs ? word.substring(1) : word.substring(1).toLowerCase());
    };

    this.padLeft = function (x)
    {
        switch (x.length)
        {
            case 1:
                return '00' + x;

            case 2:
                return '0' + x;

            default:
                return x;
        }
    }

    this.getPage = function (href)
    {
        var pageParts = href.match(/\?Page=([0-9]+)/im);
        return pageParts && pageParts.length == 2 && pageParts[1] ? this.padLeft(pageParts[1]) : '001';
    }

    this.getCleanUrl = function (url)
    {
        var matches = url.match(/(?:\/\w{2}-\w{2}\/(.*)|\/(.*))/);
        return matches[1] ? matches[1] : matches[2];
    }

    this.buildGenericAppendix = function (url, keepRestAsItIs)
    {
        var isWishlistUrl = /wishlists\/(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$/;
        var cleanUrl = this.getCleanUrl(unescape(url));
        if (cleanUrl.match(isWishlistUrl))
        {
            cleanUrl = 'wishlists';
        }

        var urlAppendix = cleanUrl.replace(/-/g, ' ').split(' ');

        for (var i = 0; i < urlAppendix.length; i++)
            urlAppendix[i] = this.normalizeWord(urlAppendix[i], true);

        urlAppendix = urlAppendix.join(' ').split('/');

        for (var i = 0; i < urlAppendix.length; i++)
            urlAppendix[i] = this.normalizeWord(urlAppendix[i], keepRestAsItIs);

        return urlAppendix.join(' > ');
    }
};

NetminersTracker.prototype.Indexes = function ()
{
    return this.Indexes.slice(0);
};

NetminersTracker.prototype.BuildBreadcrumbs = function (location, userEmail, siteLanguage)
{
    this.bc[this.Indexes.Site] = location.host.toLowerCase();

    var urlParts = siteLanguage.split('-');

    if (urlParts && urlParts.length == 2)
    {
        var countryCode = urlParts[1].toUpperCase();
        var languageCode = urlParts[0].toLowerCase();

        var regionInfo = this.Regions[countryCode];

        if (regionInfo)
        {
            this.bc[this.Indexes.Region] = regionInfo.Region;
            this.bc[this.Indexes.Market] = regionInfo.Market;
            this.bc[this.Indexes.Currency] = regionInfo.Currency;
        }
    }

    if (userEmail)
        this.bc[this.Indexes.ClientID] = userEmail.toLowerCase();

    var productsRegex = /.*?\/.*?\/(jewellery|ranges|materials|stone|price)(?:\/(\w+)\/((?:\w|-)+)(?:\/?(\w+)?))?/im

    var appendix = null;
    var url = location.pathname;
    var href = location.href;
    if (url.match(/\/\w{2}-\w{2}\/$/g) || url.match(/\/\w{2}-\w{2}$/g))
    {
        appendix = "FrontPage";
        var result = this.bc.join(' > ');
        result += ' > ' + appendix;
        return result;
    }
    if (url.match(productsRegex))
    {
        // we are in "product mode", try to grab product info
        var urlParts = url.match(productsRegex);

        if (urlParts && urlParts.length >= 3 && urlParts[1])
        {
            switch (urlParts[1].toLowerCase())
            {
                case 'jewellery':
                    var prefix = '';

                    if (urlParts[2])
                    {
                        switch (urlParts[2].toLowerCase())
                        {
                            case 'collections':
                                this.bc[this.Indexes.Collection] = this.normalizeWord(urlParts[3]);
                                break;

                            case 'ranges':
                                this.bc[this.Indexes.Category] = this.normalizeWord(urlParts[3]);
                                break;

                            case 'materials':
                                this.bc[this.Indexes.Material] = this.normalizeWord(urlParts[3]);
                                break;

                            case 'stone':
                                this.bc[this.Indexes.Stone] = this.normalizeWord(urlParts[3]);
                                break;

                            case 'price':
                                var parts = urlParts[3].split('-');

                                if (parts && parts.length == 2)
                                    this.bc[this.Indexes.PriceRange] = 'Range ' + parts[1].toUpperCase();
                                break;
                        }

                        if (urlParts.length >= 5 && urlParts[4])
                        {
                            this.bc[this.Indexes.ProductID] = urlParts[4].toUpperCase();
                        }
                        else
                        {
                            appendix = 'Jewelry > Result > Page ' + this.getPage(href);
                        }
                    }
                    else
                    {
                        appendix = 'Pandora Club > Jewelry';
                    }
                    break;
            }
        }
    }
    else
    {
        var urlAppendix = url.match(/^\/(?:\w{2}-\w{2}\/)?(.*)/im);

        if (urlAppendix && urlAppendix.length == 2 && (urlAppendix[1] == "" || urlAppendix[1].match(/\w{2}-\w{2}\\/)))
        {
            appendix = 'Front Page';
        }

        else
            if (urlAppendix && urlAppendix.length >= 2)
            {
                switch (unescape(urlAppendix[1]).toLowerCase())
                {
                    case 'my-pandora':
                        appendix = 'Pandora Club';
                        if (urlAppendix.length == 2)
                            appendix += ' > Front Page';
                        break;

                    case '':
                    case '/':
                        appendix = 'Front Page';
                        break;
                    case 'my-pandora/my designs area/my-jewellery':
                        var pageId = $('div.paging li.active:eq(1) a span').text();
                        appendix = 'Pandora Club > Jewelry > Page ';
                        appendix += pageId ? pageId : '1';
                        break;
                    case 'my-pandora/my designs area/my-stores':
                        appendix = 'Pandora Club > My Stores';
                        break;
                    case 'my-pandora/my designs area/my-wishlist':
                        var pageId = $('div.paging li.active:eq(1) a span').text();
                        appendix = 'Pandora Club > My Wishlist > Page ';
                        appendix += pageId ? pageId : '1';
                        break;
                    case 'my-pandora/my-designs/my-wishlist':
                        // 20 aug 2010 by OCH -  page numnber must be presented as well
                        appendix = 'Pandora Club > My Wishlist > Page ';
                        var pageId = $('div.paging li.active:eq(1) a span').text();
                        appendix += pageId ? pageId : '1';
                        break;

                    case 'my-pandora/my-designs/my-jewellery':
                        // 20 aug 2010 by OCH -  page numnber must be presented as well
                        var pageId = $('div.paging li.active:eq(1) a span').text();
                        appendix = 'Pandora Club > Jewelry > Page ';
                        appendix += pageId ? pageId : '1';
                        break;

                    case 'my-pandora/my-designs/my-stores':
                        appendix = 'Pandora Club > My Stores';
                        break;

                    case 'my-pandora/my-profile':
                        appendix = 'Pandora Club > Profile';
                        break;
                    case 'error.htm':
                        appendix = '404';
                        break;
                    case 'views/consumer/mypandora/emailandsendbuttonpopup.aspx':
                        appendix = 'Pandora Club > My Wishlist > Send';
                        break;
                    case 'global/search':
                        var searchResultString = $.trim($("div.content-search fieldset p label").text());
                        var results = searchResultString.split(" ").clean("").clean('\r').clean('\n')[5];
                        if (results == '0')
                        {
                            appendix = 'Search > 0 results';
                            break;
                        }
                        if (results >= '1' && results <= '10')
                        {
                            appendix = 'Search > 1 - 10 results';
                            break;
                        }
                        if (results > 10)
                        {
                            appendix = 'Search > 11+ results';
                            break;
                        }
                        appendix = '';
                        break;
                    default:
                        appendix = this.buildGenericAppendix(url, true);
                        break;
                }
            }
    }

    var result = this.bc.join(' > ');

    if (appendix)
        result += ' > ' + appendix;

    return result;
}

NetminersTracker.prototype.SetExternalPager = function (pager)
{
    this.externalPager = pager;
}

NetminersTracker.GetStandardBreadcrumbs = function (breadCrumbs, itemNumber)
{
    itemNumber = itemNumber || "[ProductID]";
    
    var crumbParts = new Array();
    var breadCrumbsParts = breadCrumbs.split(' > ');
    var tracker = new NetminersTracker();
    crumbParts.push(breadCrumbsParts[tracker.Indexes.Site]);
    crumbParts.push(breadCrumbsParts[tracker.Indexes.Region]);
    //        crumbParts.push(breadCrumbsParts[tracker.Indexes.Country]);
    //        crumbParts.push(breadCrumbsParts[tracker.Indexes.Language]);
    crumbParts.push(breadCrumbsParts[tracker.Indexes.Market]);
    crumbParts.push(breadCrumbsParts[tracker.Indexes.Currency]);
    crumbParts.push(breadCrumbsParts[tracker.Indexes.ClientID]);
    breadCrumbsParts[tracker.Indexes.ProductID] = itemNumber;
    crumbParts.push(breadCrumbsParts[tracker.Indexes.ProductID]);
    crumbParts.push(breadCrumbsParts[tracker.Indexes.Collection]);
    crumbParts.push(breadCrumbsParts[tracker.Indexes.Category]);
    crumbParts.push(breadCrumbsParts[tracker.Indexes.Material]);
    crumbParts.push(breadCrumbsParts[tracker.Indexes.Stone]);
    crumbParts.push(breadCrumbsParts[tracker.Indexes.PriceRange]);

    return crumbParts.join(' > ');
}

