/* 
 * jQuery plugin for scrollable quotes
 * @version: $Id$
 * @author:  Sergey Bugaev <sbugaev@vtsystems.com>
 */


(function($) {
	$.scrollQuotes = {
		version: '0.1.0',

		defaultConf: {
			url: "/pairs/activePairsFeed.php",
			feed: {
				//pairs: ["EUR/USD","GBP/USD","USD/CHF","USD/MXN"],
				//unit: "UnitName"
			},
			speed: 0.9,
			timeScroll: 4,
			timeLoad: 10,
			pipette: true,
			click: null
			/*
			click: function(event, key) {
				console.log("click", key);
			}
			*/
		},

		templates: {
			base:  '\
				<div class="sq-scroll-wrapper">\
					<ul class="sq-quotes-container">\
					<% for ( var key in quotes ) { %>\
						<li key="<%=key%>" class="sq-quote <%=getClass(quotes[key])%>">\
						<%=templateQuote(key, quotes[key])%>\
						</li>\
					<% } %>\
					</ul>\
				</div>\
			',
			quote: '\
				<span class="sq-quote-key"><%=key%>:</span>\
				<span class="sq-quote-value"><%=value%></span>\
				<span class="sq-quote-arrow sq-quote-arrow-up">&#9650;</span>\
				<span class="sq-quote-arrow sq-quote-arrow-down">&#9660;</span>\
				<span class="sq-spaser"></span>\
			',
			value: '\
				<%=sell%><sup class="sq-pipette"><%=sellPipette%></sup>/<%=buy%><sup class="sq-pipette"><%=buyPipette%></sup>\
			'
		}
	};
	
	var domain = $("script:last").attr("src").match( /^((https?:)?\/\/[^\/]+)/ );
		domain = domain ? domain[1] : "";
	
	$.scrollQuotes.defaultConf.url = domain + "/pairs/activePairsFeed.php";
	
	
	function scrollQuotes(conf, root) {
		var self = this, $self = $(this),
			container = null, wrapper = null;;
		
		$.each(conf, function(name, fn) {
			if ($.isFunction(fn)) {$self.bind(name, fn);}
		});
		
		$.extend(this, {
			version: null,
			init: function() {
				self.load();
			},
			
			load: function() {
				var parameters = $.extend(conf.feed, {
					protocol: 2,
					version: self.version,
					pipette: true
				});
				
				jQuery.getJSON(conf.url + "?callback=?", parameters, function(data) {
					self.version = data.version;
					self.render(data.pairs);
					self.startLoading();
				});
			},
			
			render: function(quotes) {
				if (container) {
					self.update(quotes);
					return;
				}
				
				root.html($.tmpl($.scrollQuotes.templates.base, {
					quotes: quotes,
					getClass: self.getClass,
					templateQuote: function(key, quote) {
						return $.tmpl($.scrollQuotes.templates.quote, {
							key: key,
							quote: quote,
							value: self.getValue(quote)
						});
					}
				}));
				
				root.find(".sq-quote").click(function() {
					$self.trigger("click", $(this).attr("key"));
				});
				
				if (!conf.pipette) {
					root.find(".sq-quote-value .sq-pipette").hide();
				}
				
				root.find(".sq-scroll-wrapper").mouseenter(function() {
					self.stopAnimate();
				});
				
				root.find(".sq-scroll-wrapper").mouseleave(function() {
					self.startAnimate();
				});
				
				wrapper = root.find(".sq-scroll-wrapper");
				container = wrapper.find(".sq-quotes-container");
				wrapper[0].scrollLeft = 0;
				
				self.startAnimate();
			},
			
			update: function(quotes) {
				for (var key in quotes) {
					var q = container.find("[key='"+key+"']");
					
					q.find(".sq-quote-value").html(quotes[key].rate);
					q.removeClass("sq-positive sq-negative");
					q.addClass(self.getClass(quotes[key]));
				}
			},
			
			getClass: function(quote) {
				return quote.tdir ? "sq-positive" : "sq-negative";
			},
			
			getValue: function(quote) {
				var p = quote.pipette,
					buy = String(quote.buy.toFixed(p)),
					sellPipette = String(quote.sell.toFixed(p+1)),
					buyPipette = String(quote.buy.toFixed(p+1));
					
				return $.tmpl($.scrollQuotes.templates.value, {
					sell		: quote.sell.toFixed(p),
					buy			: buy.substr(buy.length - 2),
					sellPipette	: sellPipette.substr(sellPipette.length - 1),
					buyPipette	: buyPipette.substr(buyPipette.length - 1)
				})
			},
			
			startAnimate: function() {
				self.stopAnimate();
				self.timeoutScroll = setTimeout(self.animate, conf.timeScroll*1000);
			},
			
			stopAnimate: function() {
				clearTimeout(self.timeoutScroll);
				self.timeoutScroll = null;
			},
			
			animate: function() {
				var quote = container.find(".sq-quote:first"),
					width = quote.width();
				
				wrapper.animate({
					scrollLeft: width
				}, conf.speed*1000, function() {
					container.append(quote);
					wrapper[0].scrollLeft = 0;
					
					self.startAnimate();
    			});
			},
			
			startLoading: function() {
				self.timeoutLoad = setTimeout(self.load, conf.timeLoad*1000);
			}
		});
		
		

		self.init();
			
	};

	// jQuery plugin implementation
	$.fn.scrollQuotes = function(conf) {
		var conf = $.extend($.scrollQuotes.defaultConf, conf);
		
		return this.each(function(i) {
			var root = $(this);

			if (root.data("scrollQuotes")) {
				return;
			}

			root.data("scrollQuotes", new scrollQuotes(conf, root));
		});
	};

}) (jQuery);

