if(!mt4pips) throw 'mt4pips library not loaded';

$.extend(mt4pips, {
	analysis : {
		charts : {},
		init : function(){
			if($('#tab-tradesSummary').hasClass('active')) this.trades.init();
			if($('#tab-pipsSummary').hasClass('active')) this.pips.init();
			if($('#tab-tradeComposition').hasClass('active')) this.tradecomp.init();
			if($('#tab-hourlyActivity').hasClass('active')) this.hourly.init();
		},
		renderChart : function(chart, datafile){
			try{
				var flashpath  = chart.flashpath;
				var flashid    = chart.flashid;
				var width      = chart.width;
				var height     = chart.height;
				var flashvars  = chart.flashvars;
				var params     = chart.params;
				var attributes = chart.attributes;
				
				if(datafile)
					flashvars = $.extend({}, flashvars, { data_file: datafile });
				
				$('#'+flashid).parent().width(width+'px').height(height+'px');
			
				swfobject.embedSWF(flashpath, flashid, width, height, "9.0.0", "/expressInstall.swf", flashvars, params, attributes);
			}catch(err){ alert('Problem rendering analysis chart.'); }
		},
		timeline : {
			config : {
				range : { min: null, max: new Date(), start: null, end: null, offset: 0 }
			},
			fields : {
				start : null,
				end   : null
			},
			init : function(){
				$('.analysis-options a.timeframe').click(function(){ $('#timeframe').toggle('fast'); return false; });
				$('#timeframe').hide();
				
				this.fields.start = $('#timeframe .options .datefield #range_start');
				this.fields.end   = $('#timeframe .options .datefield #range_end');
				
				var range = this.config.range
				
				range.max.setTime(this.getAdjustedOffset(range.max));
				range.min.setTime(this.getAdjustedOffset(range.min));
				range.start.setTime(this.getAdjustedOffset(range.start));
				range.end.setTime(this.getAdjustedOffset(range.end));

				var min = range.min
				var max = range.max

				$('#timeframe .options .range button').each(function(){
					var btn = $(this);
					
					if(btn.hasClass('1d'))  btn.data('rangeStart', new Date(max.getFullYear(), max.getMonth(), max.getDate() - 1));
					if(btn.hasClass('1w'))  btn.data('rangeStart', new Date(max.getFullYear(), max.getMonth(), max.getDate() - 7));
					if(btn.hasClass('1m'))  btn.data('rangeStart', new Date(max.getFullYear(), max.getMonth() - 1, max.getDate()));
					if(btn.hasClass('6m'))  btn.data('rangeStart', new Date(max.getFullYear(), max.getMonth() - 6, max.getDate()));
					if(btn.hasClass('1y'))  btn.data('rangeStart', new Date(max.getFullYear() - 1, max.getMonth(), max.getDate()));
					if(btn.hasClass('all')) btn.data('rangeStart', min);

					btn.data('rangeEnd', max);
					
					btn.click(function(){ mt4pips.analysis.timeline.btnClick(this); return false; });
				});
				
				this.setRange();
				
				$('#timeframe .options .datefield input').datepicker({
					maxDate: max,
					minDate: min,
					onSelect: function(){ mt4pips.analysis.timeline.onSelect(); }
				}).closest('body').find('#ui-datepicker-div').wrap('<div class="uitheme"></div>');
				
				$('#timeframe button.analyze').click(function(){ mt4pips.analysis.timeline.analyze(); return false; });
			},
			getStartDate : function() {
				var date_start = new Date(this.config.range.start);
				return date_start.format("yyyy-mm-dd 00:00:00");
			},
			getEndDate : function() {
				var date_end = new Date(this.config.range.end);
				return date_end.format("yyyy-mm-dd 23:59:59");
			},
			getRangeQueryString : function() {
				return '?range_start=' + escape(this.getStartDate()) + '&range_end=' + escape(this.getEndDate());
			},
			getAdjustedOffset : function(dateObj) {
				var old_time   = dateObj.getTime();
				var offset     = (dateObj.getTimezoneOffset() * 60 * 1000) + (this.config.range.offset * 1000);
				return old_time + offset;
			},
			onSelect : function(dateText, inst){
				this.config.range.start = new Date(this.fields.start.val()); 
				this.config.range.end   = new Date(this.fields.end.val());
				
				$('#timeframe .options .range button').removeClass('selected').each(function(){
					if($(this).data('rangeStart').getTime() == mt4pips.analysis.timeline.config.range.start.getTime())
						$(this).addClass('selected');
				});
			},
			setRange : function(range){
				var range = $.extend(this.config.range, range || {});

				this.fields.start.val( $.datepicker.formatDate('mm/dd/yy', range.start) );
				this.fields.end.val( $.datepicker.formatDate('mm/dd/yy', range.end) );
			},
			btnClick : function(btn){
				var btn = $(btn);
				
				var start = btn.data('rangeStart');
				var end   = btn.data('rangeEnd');
				
				var min   = this.config.range.min;
				var max   = this.config.range.max;
				
				if(start < min) start = min;
				if(end > max) end = max;
				if(end < start) end = start;
				if(start > end) start = end;
				
				this.config.range.start = start;
				this.config.range.end   = end;
				
				this.setRange();
				
				$('#timeframe .options .range button').removeClass('selected');
				btn.addClass('selected');
			},
			analyze : function(){
				$(document).trigger('mtpips-analyzeTimeline');
			}
		},
		trades : {
			init : function(){
				$('#analysis-summary-charts .header').tabs({ selected: 0 });
				$('#profitability-chart .chart-options').tabs({ selected: 0 });
				
				this.advStats.init();
				this.summary.init();
				
				mt4pips.analysis.timeline.init();
				
				$(document).bind('mtpips-analyzeTimeline', function(){ mt4pips.analysis.trades.analyze(); });
				
				$(document).trigger('mt4pips-tradesSummaryInit');
			},
			analyze : function(){
				var range = mt4pips.analysis.timeline.getRangeQueryString();
				
				function renderchart(chart){
					var datafile = chart.flashvars.data_file + escape(range); 
					mt4pips.analysis.renderChart( chart, datafile );
				}

				renderchart(mt4pips.analysis.charts.gainTimeChart);
				renderchart(mt4pips.analysis.charts.balanceTimeChart);
				renderchart(mt4pips.analysis.charts.tradesAccuracyChart);
				renderchart(mt4pips.analysis.charts.profitabilityChart);
				renderchart(mt4pips.analysis.charts.profitabilityPipsChart);
				
				mt4pips.analysis.trades.summary.show();
			},
			summary : {
				container : null,
				init : function(){
					this.container = $('.trades-summary-analysis');
				},
				show : function(){
					var range = mt4pips.analysis.timeline.getRangeQueryString();
					
					$.getJSON($('#tab-tradesSummary').attr('href') + '.json' + range, function(data){
						if(data.success)
							mt4pips.analysis.trades.summary.container.html(data.html).slideDown('normal');
					});
				}
			},
			advStats : {
				button    : null,
				container : null,
				summary   : null,
				init : function(){
					$('#analysis-advanced-stats').append('<div class="b-advanced-stats"></div>');
					
					this.container = $('#analysis-advanced-stats .b-advanced-stats');
					this.button    = $('#analysis-advanced-stats .b-show-advanced-stats');
					
					this.hide();
					
					this.button.click(function(){
						mt4pips.analysis.trades.advStats.show();
						return false;
					});
					
					$(document).bind('mtpips-analyzeTimeline', function(){ mt4pips.analysis.trades.advStats.analyze(); });
				},
				show : function(){
					if(this.button.data('shown')){
						this.hide(); return;
					}
					
					this.load();
					
					this.button.html('Hide advanced statistics...');
					this.button.data('shown', true);
				},
				hide : function(){
					this.container.slideUp('normal');
					
					this.button.html('Show advanced statistics...');
					this.button.data('shown', false);
				},
				load : function(){
					var range = mt4pips.analysis.timeline.getRangeQueryString();
					
					$.getJSON(this.button.attr('href') + '.json' + range, function(data){
						if(data.success)
							mt4pips.analysis.trades.advStats.container.html(data.html).slideDown('normal');
						else
							window.location = data.url;
					});
				},
				analyze : function(){
					if(this.button.data('shown'))
						this.load();
				}
			}
		},
		pips : {
			init : function(){
				mt4pips.analysis.timeline.init();
				$(document).bind('mtpips-analyzeTimeline', function(){ mt4pips.analysis.pips.analyze(); });
				$(document).trigger('mt4pips-pipsSummaryInit');
			},
			analyze : function(){
				var range = mt4pips.analysis.timeline.getRangeQueryString();
				
				function renderchart(chart){
					var datafile = chart.flashvars.data_file + escape(range); 
					mt4pips.analysis.renderChart( chart, datafile );
				}

				renderchart(mt4pips.analysis.charts.pipsTimeChart);
				renderchart(mt4pips.analysis.charts.pipsTradesChart);
			}
		},
		tradecomp : {
			init : function(){
				$('#pairs-info-chart .chart-options').tabs({ selected: 0 });
				$('#pairs-mostprofitable-chart .chart-options').tabs({ selected: 0 });
				$('#pairs-averagegainloss-chart .chart-options').tabs({ selected: 0 });
				mt4pips.analysis.timeline.init();
				$(document).bind('mtpips-analyzeTimeline', function(){ mt4pips.analysis.tradecomp.analyze(); });
				$(document).trigger('mt4pips-tradeCompositionInit');
			},
			analyze : function(){
				var range = mt4pips.analysis.timeline.getRangeQueryString();

				$.getJSON($('#tab-tradeComposition').attr('href') + '.json' + range, function(data) {
				    if(data.success)
				        $('.pairs-info').replaceWith(data.html);
				    else
				        window.location = data.url;
				});
				
				function renderchart(chart){
					var datafile = chart.flashvars.data_file + escape(range); 
					mt4pips.analysis.renderChart( chart, datafile );
				}
				
				renderchart(mt4pips.analysis.charts.pairsInfoChart);
				renderchart(mt4pips.analysis.charts.pairsInfoWinnersChart);
				renderchart(mt4pips.analysis.charts.pairsInfoLosersChart);
				
				renderchart(mt4pips.analysis.charts.pairsWinsLossesChart);
				
				renderchart(mt4pips.analysis.charts.pairsMostProfitableDollarChart);
				renderchart(mt4pips.analysis.charts.pairsMostProfitablePipsChart);
				
				renderchart(mt4pips.analysis.charts.pairsTotalLotsTradedChart);
				
				renderchart(mt4pips.analysis.charts.pairsAverageGainLossCurrencyChart);
				renderchart(mt4pips.analysis.charts.pairsAverageGainLossPipsChart);
				
				renderchart(mt4pips.analysis.charts.dailyWinsLossesChart);
				renderchart(mt4pips.analysis.charts.dailyWinsLossesProfitChart);
				renderchart(mt4pips.analysis.charts.dailyLongsShortsChart);
				renderchart(mt4pips.analysis.charts.dailyLongsShortsProfitChart);
			}
		},
		hourly : {
			init : function(){
				$('#average-trade-duration .chart-options').tabs({ selected: 0 });
				mt4pips.analysis.timeline.init();
				$(document).bind('mtpips-analyzeTimeline', function(){ mt4pips.analysis.hourly.analyze(); });
				$(document).trigger('mt4pips-hourlyActivityInit');
			},
			analyze : function(){
				var range = mt4pips.analysis.timeline.getRangeQueryString();
				
				function renderchart(chart){
					var datafile = chart.flashvars.data_file + escape(range); 
					mt4pips.analysis.renderChart( chart, datafile );
				}

				renderchart(mt4pips.analysis.charts.hourlyTradesChart);
				renderchart(mt4pips.analysis.charts.hourlyPipsChart);
				renderchart(mt4pips.analysis.charts.hourlyPairsAverageTradeDurationChart);

				renderchart(mt4pips.analysis.charts.hourlyAverageTradeDurationChart);
				renderchart(mt4pips.analysis.charts.hourlyAverageTradeDurationWinnersChart);
				renderchart(mt4pips.analysis.charts.hourlyAverageTradeDurationLosersChart);
				renderchart(mt4pips.analysis.charts.hourlyAverageTradeDurationShortsChart);
				renderchart(mt4pips.analysis.charts.hourlyAverageTradeDurationLongsChart);
			}
		}
	}
});

$(document).bind('mt4pips-contentLoaded', function(){ mt4pips.analysis.init(); });

