var rim = rim || {};

rim.AddToCompare = function() {
    this.ItemCache = {};
    // "choose compare" options
    this.CompareChooseSelector = '.chooseToCompare';
    this.CompareChooseLinks = $(this.CompareChooseSelector);
    // "add to compare" options
    this.CompareSelector = '.addToCompare';
    this.CompareLinks = $(this.CompareSelector);
    this.CompareExecSelector = '.compareLink .cta, .addToCompare';
    this.CompareExecLinks = $(this.CompareExecSelector);
    this.CompareCountSelector = '#compare_count';
    this.CompareCountSpan = $(this.CompareCountSelector);
    this.CompareItem = null;
    this.CompareItemName = null;
    // compare cart
    this.CompareCart = {};
    this.productTable = {};
    this.CompareCartSize = 0;
    this.CompareInCartClass = 'compareCart';
    this.CompareInCartText = rim.lang.compare.compareInCartText;
    this.CompareOutCartText = rim.lang.compare.compareOutCartText;
    this.CompareCartAjaxUrl = rim.lang.rootPath + 'includes_refresh/compareCart.jsp';
    this.CompareCartLink = rim.lang.compare.comparePath;
    this.cartArray = [];
    // modal info
    this.CompareModalSelector = '#compareModal';
    this.Modal = new Rf.Modal(null, {
        DialogID: 'compareModal',
        AllowCache: false,
        ZIndex: '10000',
        Template: '<div><a href="#" class="close">' + rim.lang.close + '</a><div class="content" role="main"></div><div class="end"></div></div>'
    });
    this.CurrentChooseItem = null; // will hold the jQuery object
    this.CurrentChooseContentSelector = null;
    this.ModalNotchMarkup = '<div id="notch"></div>';
    this.cartCookieName = 'bbCompareCart';
    this.InitRun = false;
    this.InitCompare();
};
rim.AddToCompare.prototype = {
    InitCompare: function() {
        var me = this;

        me.cartCookieArray();

        $('.modal-overlay').live('click', function(e) {
            e.preventDefault();
            me.Modal.Close();
        });
        me.Modal.Bind(Rf.Modal.Events.Show, function(event) {
            var content = $(me.CurrentChooseContentSelector).html();
            $('#' + me.Modal.DialogID).find('div.content').html(content);
            Cufon.refresh('.replace');
            $('.modal-overlay').css('cursor', 'default');
        });
        me.Modal.Bind(Rf.Modal.Events.Hide, function(event) {
            $('#notch').hide();
        });
        me.Modal.Bind(Rf.Modal.Events.Centered, function(event) {
            me.PositionModal();
        });
        $(me.ModalNotchMarkup).appendTo('body');

    },
    setupUi: function() {
        var me = this;

        me.CompareCountSpan.html(rim.AddToCompare.cartArray.length);
        me.CompareChooseLinks.live('click', function(e) {
            e.preventDefault();
            me.CurrentChooseItem = $(this).parents('li.model');
            var href = $(this).attr('href');
            href = href.split('#').pop();
            href = '#' + href;
            me.CurrentChooseContentSelector = href;
            me.Modal.Open();
        });
        me.addCompareCartLinks();
        me.CompareExecLinks.live('click', function(e) {
            e.preventDefault();

            me.CompareItem = me.FindModel($(this));
            me.CompareItemName = me.FindModelName(me.CompareItem);

            var in_cart = false;

            for (i = 0; i < rim.AddToCompare.cartArray.length; i++) {
                if (rim.AddToCompare.cartArray.toString().indexOf(me.CompareItem) > -1) {
                    in_cart = true;
                }
            }

            if (in_cart) {
                document.location = this.href;
            } else {
                //add to compare cart
                me.AddToCompareCart(me.CompareItem);
            }
        });
    },
    AddToCompareCart: function(item) {
        var me = this;

        var itemName = me.FindModelName(item);

        //me.cartCookieArray(); //update cart count
        var count = rim.AddToCompare.cartArray.length;
        if ((count + 1) < 6) {
            //rim.AddToCompare.cartArray.push(item);
            $.ajax({
                url: me.CompareCartAjaxUrl,
                cache: false,
                data: {
                    add: item
                },
                success: function(data) {
                    // update UI
                    me.cartCookieArray(data);
                    me.CompareCountSpan.html(rim.AddToCompare.cartArray.length);
                    me.CompareCart[count] = item;
                    // add new class and change text
                    me.UpdateCompareInCartLinks(item);
                    //console.log("add "+rim.AddToCompare.cartArray)
                    doOmnitureCompareAddEvent(item, itemName);
                },
                error: function() {

                }
            });
        } else {
            if ($(me.CompareModalSelector).size() > 0 && typeof(rim.CurrentModal) != "undefined") {
                rim.CurrentModal.endCloseOverlay();
                rim.CurrentModal.endClose();
            }
            me.AddToCompareLimitWarning();
        }
    },
    addCompareCartLinks: function() {
        var me = this;
        var cartCookieCount = rim.AddToCompare.cartArray.length;
        $(this.CompareExecSelector).each(function(e) {
            me.CompareItem = me.FindModel($(this));
            if (rim.AddToCompare.cartArray.toString().indexOf(me.CompareItem) > -1) {
                me.UpdateCompareInCartLinks(me.CompareItem)
            }
        });
    },
    UpdateCompareInCartLinks: function(item) {
        var me = this;
        if ($('li[rimpid="' + item + '"]').attr('rimpid')) {
            $('li[rimpid="' + item + '"]').each(function(e) {
                $(this).find('.cta').attr('href', rim.lang.compare.comparePath).addClass(me.CompareInCartClass).text(me.CompareInCartText);
            });
        }
        if ($('a[rimpid="' + item + '"]').attr('rimpid')) {
            $('a[rimpid="' + item + '"]').each(function(e) {
                $(this).attr('href', rim.lang.compare.comparePath).addClass(me.CompareInCartClass).text(me.CompareInCartText).parent('li').addClass(me.CompareInCartClass);
            });
        }


    },
    UpdateCompareOutCartLinks: function(item) {
        var me = this;
        if ($('li[rimpid="' + item + '"]').attr('rimpid')) {
            $('li[rimpid="' + item + '"]').each(function(e) {
                $(this).find('.cta').attr('href', '#').removeClass(me.CompareInCartClass).text(me.CompareOutCartText);
            });
        }
        if ($('a[rimpid="' + item + '"]').attr('rimpid')) {
            $('a[rimpid="' + item + '"]').each(function(e) {
                $(this).attr('href', '#').removeClass(me.CompareInCartClass).text(me.CompareOutCartText).parent('li').removeClass(me.CompareInCartClass);
            });
        }
    },
    cartCookieArray: function(data) {
        var me = this;
        var strippedData = "";
        if (data) {
            strippedData = data.replace(/<.*?>/g, '');
            strippedData = strippedData.replace(/^\s*|\s|\r|\n*$/g, '');
            rim.AddToCompare.cartArray = strippedData.split(',');
        } else {
            $.ajax({
                url: me.CompareCartAjaxUrl,
                cache: false,
                data: {
                    show: 'compareCart'
                },
                success: function(data) {
                    strippedData = data.replace(/<.*?>/g, '');
                    strippedData = strippedData.replace(/^\s*|\s|\r|\n*$/g, '');
                    if (strippedData == "") {
                        rim.AddToCompare.cartArray = [];
                    } else {
                        rim.AddToCompare.cartArray = strippedData.split(',');

                    }
                    if (!me.InitRun) {
                        me.InitRun = true;
                        me.setupUi();
                    }

                },
                error: function() {

                }
            });
        }
    },
    cartCookieCount: function() {
        var me = this;
        return me.cartArray.length;
    },
    FindModel: function(link) {
        // find the model by traversing the DOM to find the first LI with a class of "model".
        // we we then pull the value of the rimpid attribute of the element
        if (link.attr('rimpid')) {
            return link.attr('rimpid');
        } else {
            var $li = link.parents('li:first');
            if ($li.size() > 0) {
                var model = $li.attr('rimpid');
                return model;
            }
        }

    },
    findJSONName: function(model) {
        var me = this;
        var modelName = model + '-name';
        var modelNum = model + '-number';
        return me.productTable[modelName] + " " + me.productTable[modelNum];
    },
    parseJSON: function(json) {
        var me = this;
        me.productTable = json;
    },
    FindModelName: function(model) {
        // find the model name by looking for an LI with the rimpid attribute of the model name passed to the function.
        // we will then try to find the element with a class of 'replace' and if we find one, return the .text()
        //var $li = $('.'+model+':first');
        var $li = $('li[rimpid="' + model + '"]:first');
        if ($li.size() > 0) {
            return $li.find('a:first').text();
        }
    },
    PositionModal: function() {
        if (this.CurrentChooseItem.find('ul.details').length > 0) {
            var me = this,
                $dialog = $('#' + me.Modal.DialogID),
                $notch = $('#notch'),
                linkPosition = me.CurrentChooseItem.find('ul.details').offset(),
                dialogWidth = $dialog.width(),
                dialogHeight = $dialog.height(),
                pagePosition = $('#hdr').offset(),
                pageWidth = $('#hdr').width(),
                viewportWidth = $(window).width(),
                origDialogLeft = $dialog.css('left'),
                css = {},
                notchCss = {},
                dialogLeft, dialogTop;

            // either center the dialog over the link, or leave it centered on the screen
            dialogLeft = linkPosition.left - (dialogWidth / 2);
            css.left = (dialogLeft > 0) ? dialogLeft + 'px' : $dialog.css('left');

            // make sure modal doesn't extend past right edge
            var currentLeft = parseFloat(css.left),
                pageRightEdge = pagePosition.left + pageWidth,
                dialogRightEdge = currentLeft + dialogWidth;

            if (dialogRightEdge > pageRightEdge) {
                css.left = 'auto';
                css.right = viewportWidth - pageRightEdge;
            }

            // move the modal to just above the "Choose Compare" link
            css.top = (linkPosition.top - (dialogHeight - 10)) + 'px';

            // adjust the notch
            notchCss = {
                'left': (linkPosition.left - 3) + 'px',
                'top': (linkPosition.top + 46) + 'px'
            }
            $dialog.css(css).fadeIn('slow', function() {
                $notch.css(notchCss).show();
            });
        }
    },
    AddToCompareLimitWarning: function() {
        var me = this;
        var WarningDialogID = 'compareLimitModal',
            WarningModal = new Rf.Modal(rim.lang.compare.comparePath + "../modalContent.jsp?modalid=removeCartItem&productids=" + rim.AddToCompare.cartArray.toString(), {
                DialogID: WarningDialogID,
                Url: rim.lang.compare.comparePath + "../modalContent.jsp?modalid=removeCartItem&productids=" + rim.AddToCompare.cartArray.toString(),
                AllowCache: false,
                ZIndex: '10000',
                OverlayOpacity: 0.8,
                Template: '<div><a href="#" class="close">' + rim.lang.close + '</a><div class="content" role="main"></div><div class="end"></div></div>'
            }),
            WarningPhoneReplaceLinks = $('#compareLimitModal ul.compareList li');
        //WarningModal.Open();
        // rim.WarningModal = WarningModal;
        //       WarningModal.Bind(Rf.Modal.Events.Data, function(event) {
        //           $.ajax({
        //               url:CompareCartAjaxUrl,
        //               data:{
        //                   modalid: 'removeCartItem',
        //                   productids: $.cookie(me.cartCookieName)
        //               },
        //               success: function (data) {
        //                   console.log(rim.WarningModal)
        //                   rim.WarningModal.Init(event);
        //                   $('#'+WarningDialogID).find('div.content').html(data);
        //                   Cufon.refresh('.replace');
        //               },
        //               error: function () {
        //
        //               }
        //           });
        //});
        WarningModal.Bind(Rf.Modal.Events.Show, function(event) {
            $('.modal-overlay').css('cursor', 'default');
            Cufon.refresh('.replace');
            $('.replace').css({
                visibility: 'visible'
            });
            $('#' + WarningDialogID).show();
            WarningModal.Center();
            setTimeout(function() {
                $('#compareLimitModal .content a').trigger('focus');
            }, 100);
        });
        // WarningModal.Bind(Rf.Modal.Events.Hide, function(event) {
        //                  me.UpdateCompareInCartLinks(me.CompareItem)
        //              });
        WarningModal.Open();
        //draw focus away from the compare link that was clicked
            
        WarningPhoneReplaceLinks.live('click', function(e) {
            e.preventDefault();
            //console.log("me.CompareItem: "+me.CompareItem);
            var currentModel = $(this).attr('rimpid'),
                currentName = me.FindModelName(currentModel),
                currentCount = rim.AddToCompare.cartArray.length;
            // remove replaced one
            me.UpdateCompareOutCartLinks(currentModel);
            // update cart
            $.ajax({
                url: me.CompareCartAjaxUrl,
                cache: false,
                data: {
                    remove: currentModel
                },
                success: function(data) {
                    me.cartCookieArray(data);
                    // add new phone
                    me.AddToCompareCart(me.CompareItem);
                    me.UpdateCompareInCartLinks(me.CompareItem);
                },
                error: function() {

                }
            });

            $(this).fadeOut('fast', function() {
                $(this).attr({
                    'class': function() {
                        return 'model rimpid' + me.CompareItem;
                    },
                    'rimpid': me.CompareItem
                });
                $(this).html('<p>' + me.findJSONName(me.CompareItem) + '</p>');
                $(this).fadeIn('slow', function() {
                    WarningPhoneReplaceLinks.die('click');
                });
            });
        });


    }
};

rim.OnloadEvents.Register(function() {
    rim.liveAddToCompare = new rim.AddToCompare();
});
