var POP = {};

/*** Testimonials Pop Up ***/
POP.popup = function(target, options) {
	var self = this;
	self.el = $(target);
	self.win = null;
	self.options = $.extend({
		winWidth: 758,
		winHeight: 800,
		content: 'testimonials.html'
	}, options || {});
	self.setListeners();
}

POP.popup.prototype = {
	setListeners: function() {
		var self = this;
		$(self.el).click(function(e){
			e.preventDefault();
			self.onClick(e);
		});
		
	},
	onClick: function(e) {
		var self = this;
		if(self.win === null || self.win.closed) {
			self.win = window.open(self.options.content, 'windowName', 'width='+self.options.winWidth+', height='+self.options.winHeight+', toolbar=no, scrollbars=1, resizable=0', '');
		}else {
			self.win.focus();
		}		
	}
}

/*** News Ticker ***/

ticker = function(target, options){
	var base = this;

	base.options = $.extend({
		transitionSpeed: 700,
		loadData: 'path to url',
		awayLink: 'http://google.com',
		truncateText: true,
		truncateOffset: 0,
		truncateAfter: '...',
		autoCycle: true,
		cycleSpeed: 5000,
		disableLink: true
	}, options || {});

	base.elWrapper = target;
	base.elTickerWrapper = target.children('div.ticker');
	base.elNodeWrapper = $('<ul class="nodes" />');
	base.currentNode = 0;
	base.cycling = false;

	base.init();
};

ticker.prototype = {
	init:function(){
		var base = this,
			nodeListReady;

		base.buildNodeList();

		nodeListReady = setInterval(function(){
			if($(base.elNodeWrapper).children('li').length >= 1){
				clearInterval(nodeListReady);

				base.elWrapper.show();

				base.elNode = $(base.elNodeWrapper).children('li');
				base.totalNodes = Math.ceil(base.elNode.length);
				base.nodeHeight = $(base.elNode[0]).height();
				base.nodeWidth = base.elTickerWrapper.innerWidth(true);

				if(base.options.truncateText){
					base.truncate();
				}

				base.elNode.filter(':first').clone(true).appendTo(base.elNodeWrapper).addClass('cloned');
				base.elNode.filter(':last').clone(true).prependTo(base.elNodeWrapper).addClass('cloned');

				base.elNodeWrapper.css({ 'position' : 'absolute', 'left' : '0', 'top' : '-' + base.nodeHeight + 'px', 'width' : base.nodeWidth + 'px' });

				if(base.totalNodes > 1){
					base.addControls();
					base.events();

					if(base.options.autoCycle){
						setTimeout(function(){
							base.autoCycle();
						}, base.options.cycleSpeed);
					}
				}
			}
		}, 10);
	},

	buildNodeList:function(){
		var base = this,
			i = 0,
			ii = 0,
			items = [];

		$.ajax({
			url: base.options.loadData,
			dataType: 'json',
			error: function(XMLHttpRequest, textStatus, errorThrown){
				return;				
				//throw new Error('JSON failed to load.');
			},
			success: function(data){
				for(i = 0, ii = data.callout.length; i < ii; i++){
					$('<li class="item-' + i + '"><a href="' + base.options.awayLink + '" target="_blank">\"' + data.callout[i].body + '\"</a></li>').appendTo(base.elNodeWrapper);
				}
			}
		});

		base.elNodeWrapper.appendTo(base.elTickerWrapper);
	},

	addControls:function(){
		var base = this;

		base.elBtnNext = $('<li class="btn-next"><a>' + base.elTickerWrapper.attr('data-copy-next') + '</a></li>');
		base.elBtnPrev = $('<li class="btn-prev"><a>' + base.elTickerWrapper.attr('data-copy-prev') + '</a></li>');
		base.elNavWrapper = $('<ul class="nav" />').append(base.elBtnPrev, base.elBtnNext);

		$(base.elTickerWrapper).append(base.elNavWrapper);
	},

	truncate:function(){
		var base = this,
			truncateWidth = base.nodeWidth - base.options.truncateOffset,
			index = 1,
			placeHolder,
			nodeText;

		for(var i = 0; i < base.elNode.length; i++){
			if(($('a', base.elNode[i]).width() - base.options.truncateOffset) > truncateWidth){		 
				nodeText = $(base.elNode[i]).text();

				$(base.elNode[i]).children('a').html('<span id="truncateWrapper' + '-' + i + '" style="display:inline;">' + base.options.truncateAfter + '</span>');			

				placeHolder = $('#truncateWrapper' + '-' + i);

				while(placeHolder.width() <= truncateWidth){
					placeHolder.text(nodeText.substr(0, index) + base.options.truncateAfter);
					index++;

					if(index > truncateWidth){
						break;
					}
				}

				placeHolder.html($('#truncateWrapper' + '-' + i).html());
			}
		}
	},

	events:function(){
		var base = this;
		if(base.options.disableLink) {
			$('a', base.options.disableLink).click(function(e) {
				e.preventDefault();
			});
		}
		base.elBtnNext.click(function(e){
			e.preventDefault();

			base.moveToNode(base.currentNode + 1);
		});

		base.elBtnPrev.click(function(e){
			e.preventDefault();

			base.moveToNode(base.currentNode - 1);
		});
	},

	moveToNode:function(node){
		var base = this,
			dir = (node < base.currentNode) ? 1 : -1,
			n = Math.abs(base.currentNode - node),
			top = base.nodeHeight * dir * n;

		if(!base.cycling){
			base.cycling = true;
			clearTimeout(base.resetCycle);
			clearTimeout(base.progressInterval);

			base.elNodeWrapper.filter(':not(:animated)').animate(
				{ 'top' : '+=' + top },
				{ queue: false, duration: base.options.transitionSpeed, easing: 'easeOutBack', callback: base.snapEnds(node) }
			);
		}

		return false;
	},

	snapEnds:function(node){
		var base = this;

		if(node < 0){
			base.elNodeWrapper.css({ 'top' : '-' + (base.nodeHeight * (base.totalNodes + 1)) + 'px' });
			node = base.totalNodes - 1;
		}else if(node === base.totalNodes){
			base.elNodeWrapper.css({ 'top' : 0 });
			node = 0;
		}

		base.resetCycle = setTimeout(function(){
			base.cycling = false;
		}, base.options.transitionSpeed);

		base.autoCycle();

		base.currentNode = node;
	},

	autoCycle:function(){
		var base = this;

		(function cycleNode(){
			base.moveToNode(base.currentNode + 1);
			base.progressInterval = setTimeout(cycleNode, base.options.cycleSpeed);
		})();
	}
};
