/**
 * stocker Singleton
 *
 *
 * @author Justen Robertson <justen@justenrobertson.com>
 * @link http://www.justenrobertson.com
 * @version 0.4.1a 6/8/2009
 * @license Proprietary (all rights reserved)
 * @copyright 2009 Justen Robertson
 */
var stocker = function() {
	var paper;
	var tabs = false;
	var opts = {};
	var stocks = [];
	var sym = [];
	var gridLines = [];
	var updatedStocks = 0;
	// Some simple spatial functions. x & y return the width & height of the
	// box, and if param update is true, will update it to match the new window
	// size. cx & cy return calculated center x & y of the view.

	var x = function(update) {
		if(update) {
			var x = stocker.x();
			stocker.paper.node.attr('width', x);
		}
		return $(stocker.field).width()-stocker.paper.node.offset().left;
	};

	var y = function(update){
		if(update) {
			$(stocker.field).attr('height', $('body').height());
			var y = stocker.y();
			$(stocker.paper.node).attr('height', y);
		}
		return $(stocker.field).height()-$(stocker.paper.node).offset().top;
	};

	var cx = function(){return stocker.x()/2;};
	var cy = function(){return stocker.y()/2;};

	// center coordinates
	var cc = function() {return new Coord(stocker.cx(), stocker.cy());};



	var bindObservers = function() {
		stocker.unbindObservers();
		
		$(window).bind('resize', function(){stocker.x(1); stocker.y(1);});

		$('a#toggleLines').bind('click', function(e){
			e.preventDefault();
			for(var i=0;i<stocker.stocks.count();i++) {
				stocker.stocks[i].toggleLines();
			}
		});

		$('#datePick').datepicker({});

		$('.stocker-button').hover(
			function(){
				$(this).addClass("ui-state-hover");
			},
			function(){
				$(this).removeClass("ui-state-hover");
			}
		);

		$('#addStockButton').bind('click', function() {
			var symbols = $('#addStocks').attr('value');
			if(symbols == '') return;
			$('#addStocks').attr({value:''});
			stocker.addStocks(symbols);
		});

		$('#addStocks').keyup(function(event) {
			if(event.keyCode != 13) return;
			var symbols = $('#addStocks').attr('value');
			if(symbols == '') return;
			$('#addStocks').attr({value:''});
			stocker.addStocks(symbols);
		});

	};




	// Unbind observers needs to exactly mirror bindObservers
	var unbindObservers = function() {
		$(window).unbind();
		$('a#toggleLines').unbind();
		$('#putHere>span').unbind();
		$('.stocker-button').unbind();
		$('#addStockButton').unbind();
	};




	/**
	 * build sets up all the initial values, generates the simulation field,
	 * and creates the initial population.
	 */
	var build = function() {
		stocker.field = $('#paperBox')[0];
		$(stocker.field).attr('height', $('body').height());
		stocker.paper = Raphael(stocker.field, $(stocker.field).width()-10, $(stocker.field).height());
		try {
			//stocker.field.getChildren('svg')[0].setProperty('id', 'rpaper');
			stocker.paper.node = $('#rpaper');
		} catch(e) {} // this is for IE compatibility
		try {
			if(!$('#rpaper')) {
				stocker.paper.attr('id', 'rpaper');
				stocker.paper.node = $('#rpaper');
			}
		} catch(e) {}
		stocker.gridLines.push(stocker.paper.path({stroke:'#444444', 'stroke-width':.5}).moveTo(10, stocker.paper.height*.25).lineTo(stocker.paper.width, stocker.paper.height*.25));
		stocker.gridLines.push(stocker.paper.path({stroke:'#444444', 'stroke-width':.5}).moveTo(10, stocker.paper.height*.5).lineTo(stocker.paper.width, stocker.paper.height*.5));
		stocker.gridLines.push(stocker.paper.path({stroke:'#444444', 'stroke-width':.5}).moveTo(10, stocker.paper.height*.75).lineTo(stocker.paper.width, stocker.paper.height*.75));
		var sym = $('#sym').val();
		stocker.addStocks(sym);

		$('#setupForm').remove();
		$('#info').css({display:'block'});
		bindObservers();
	}; // end build




	var setupStock = function(sym) {
		var stock = new Stock(sym, stocker.paper);
		stock.systemUpdateCallback = function() {
			stocker.updateCallback();
		};
		stock.buildData();
		stocker.stocks.push(stock);
	};




	var addStocks = function(symbols) {
		symbols=symbols.split(' ');
		symbols.each(function(sym){
			stocker.sym.push(sym);
			stocker.setupStock(sym);
		});
		if($('#stockSymbols').tabs) $('#stockSymbols').tabs('destroy');
		$('#stockSymbols').tabs();
	}




	var updateCallback = function() {
		return false;
	}




	var init = function() {/*
		google.load("gdata", "1.x");
    var item = new google.gdata.finance.FinanceService('exampleCo-exampleApp-1');
		var scope = "http://finance.google.com/finance/feeds/";
		var token = google.accounts.user.login(scope);*/
		build();
		//bindObservers();
	};




	return {
		// properties
		paper:paper, opts:opts, stocks:stocks, updatedStocks:updatedStocks, 
		gridLines:gridLines, tabs:tabs, sym:sym,

		// methods
		// spatial functions
		x:x, y:y, cx:cx, cy:cy, cc:cc,
		init: init,
		bindObservers: bindObservers,
		unbindObservers: unbindObservers,
		build:build,
		setupStock:setupStock,
		addStocks:addStocks,
		updateCallback:updateCallback
	};

}();
$(
		function () {
			$('#generate').bind('click', function() {stocker.init();});
	 }
);