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+'devices/compare/compareCart.jsp';
	this.CompareCartLink = rim.lang.rootPath+'devices/compare/';
	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);

		doOmnitureCompareAddEvent(item, itemName);
		//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)
                	},
                	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.rootPath+'devices/compare/').addClass(me.CompareInCartClass).text(me.CompareInCartText);
		    });
		}
		if($('a[rimpid="'+item+'"]').attr('rimpid')){
		    $('a[rimpid="'+item+'"]').each(function(e) {
		        $(this).attr('href',rim.lang.rootPath+'devices/compare/').addClass(me.CompareInCartClass).text(me.CompareInCartText);
		    });
		}


	},
	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);
		    });
		}
	},
	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.rootPath+"devices/modalContent.jsp?modalid=removeCartItem&productids="+rim.AddToCompare.cartArray.toString(), {
			    DialogID: WarningDialogID,
			    Url: rim.lang.rootPath+"devices/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();
		});
        // WarningModal.Bind(Rf.Modal.Events.Hide, function(event) {
        //                  me.UpdateCompareInCartLinks(me.CompareItem)
        //              });


		WarningModal.Open();
		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();
});
