// =======================================
// = Heardable.com javascript namespace  =
// =======================================
if (typeof window.HH == 'undefined') window.HH = {};
if (typeof window.HH.fn == 'undefined') window.HH.fn = {};

// =======================================
// = A handy way to store all the months =
// =======================================
HH.months = [
	['Jan'	, 'January'		],
	['Feb'	, 'February'	],
	['Mar'	, 'March'			],
	['Apr'	, 'April'			],
	['May'	, 'May'				],	
	['Jun'	, 'June'			],
	['Jul'	, 'July'			],
	['Aug'	, 'August'		],
	['Sep'  , 'September'	],
	['Oct'	, 'October'		],
	['Nov'	, 'November'	],
	['Dec'	, 'December'	]
]

HH.fake_portfolio = [ 
	'dell.com' , 
	'hp.com' , 
	'lenovo.com' ,
	'apple.com' ,
	'toshiba.com'
];

// ============================================================
// = console.log is handy, but some browsers don't support it =
// ============================================================
// to log using javascript, use HH.fn.log('some message')
// if console.log exists, it will be used, otherwise messages will be stored in HH.custom_logger
// to retrieve messages, use HH.fn.log() without an argument
if (typeof console != 'undefined' && typeof console.log == 'function')
	HH.fn.log = function(message){
		console.log(message);
	}
else {
	HH.custom_logger = [];
	HH.fn.log = function(message){
		if (typeof message == 'undefined')
			var returner = HH.custom_logger;
		else{
			HH.custom_logger.push(message);
			var returner = HH.custom_logger[HH.custom_logger.length - 1];
		}	
		return returner;
	}
}


// ==================================================
// = Return an array of month names (full or abbr.) =
// ==================================================
// HH.fn.get_months = function(abbreviate){
// 	var i = abbreviate ? 0 : 1;
// 	return jQuery.map(HH.months, function(val){
// 		return val[i];
// 	});		
// }

// ===============================================
// = Convert a month name or abbr to a timestamp =
// ===============================================
// HH.fn.time = function(month, year){
// 	returner = null;
// 	year = year || 2009;
// 	month = month + ""; // force string conversion just to be safe
// 	var i = jQuery.inArray(month, HH.fn.get_months());
// 	if (i == -1) i = jQuery.inArray(month, HH.fn.get_months(true));
// 	if (i != -1) var returner = new Date(year,i,1).getTime();	
// 	return returner;
// }

// ==============================
// = Generate a random data set =
// ==============================
// label: can be a string or an array of strings
// returns a 12 member array:
// ex	=> [ [0, 123], [1,902], ..., [11, 388] ]
// HH.fn.generate_random_data = function(label){
// 	if (isArray(label)){
// 		var returner = jQuery.map(label, function(one_label){
// 			return HH.fn.generate_random_data(one_label).pop();
// 		});		
// 	} else {
// 		var data = [];
// 		jQuery.each(HH.fn.get_months(), function(){
// 				var xy =  [ HH.fn.time(this),1000*Math.random() ];
// 				data.push(xy);
// 		});	
// 		var returner = { 'data' : data, 'label' : label};		
// 	}
// 	
// 	if (! isArray(returner) ) returner = [returner];
// 	
// 	return returner;
// }

// ================================
// = Retrieve chart data via AJAX =
// ================================
HH.fn.retrieve_chart_data = function(portfolio){
	var returner = null;
	jQuery.get('/ajax_chart_data.php', {'domains[]': portfolio}, function(response){
		HH.fn.log(response);
		returner = response;
	}, 'json');
	return returner;
}

// ===========================================
// = Load new data into the chart and redraw =
// ===========================================
HH.fn.reload_chart = function(portfolio, callback){
	portfolio = portfolio || HH.fake_portfolio;
	
	// if the chart hasn't been created yet, create it first
	if (typeof HH.chart == 'undefined') {
		HH.fn.log('creating new chart');
		var existing_chart = false;
		HH.fn.create_chart(portfolio);
	}
	else  {
		var existing_chart = true;
		jQuery.get('/ajax_chart_data.php', {'domains[]': portfolio}, function(response){
			HH.fn.log('redrawing existing chart');
			HH.fn.log(response);
			HH.chart.setData(response);
			HH.chart.setupGrid()
			HH.chart.draw();		
			HH.fn.tag_tick_labels();
		}, 'json');
	}
	
	if (callback) callback();
	return existing_chart;
}

HH.fn.create_chart = function(portfolio, elm){
	if (typeof elm == 'undefined') elm = '#chart_placeholder';
	
	HH.chart_data = {};
	
	var portfolio = portfolio || HH.fake_portfolio;
	
	// HH.chart_data['random'] = HH.fn.generate_random_data(portfolio);
		
	HH.chart_elm = jQuery(elm);	

	jQuery.get('/ajax_chart_data.php', {'domains[]': portfolio}, function(response){
		HH.fn.log(response);
			HH.chart_data['ajax'] = response;

		  HH.chart = jQuery.plot(HH.chart_elm,
						HH.chart_data['ajax'],
		         { lines: { show: true },
		           points: { show: false },
		           selection: { mode: "xy" },
		           grid: { hoverable: true, clickable: true },
		           xaxis: {
								mode: "time",
								timeformat: "%m/%d"
		                  },             
		           yaxis: { min: 0, max: 1000 }
		           });

		  HH.previousPoint = null;

		  HH.chart_elm.bind("plotclick", function (event, pos, item) {
		      if (item) {
		          jQuery("#clickdata").text(parseInt(item.datapoint[1]));
		          HH.chart.highlight(item.series, item.datapoint);
		      }
		  });

			HH.fn.tag_tick_labels();

			HH.fn.observe_plothover();			
	}, 'json');
}

HH.fn.tag_tick_labels = function(){
	jQuery.each(jQuery('.tickLabel'), function(){
		var this_month = jQuery(this).html();
		jQuery(this).attr('rel', this_month);
	});	
}

HH.fn.observe_plothover = function(){
  function showTooltip(x, y, contents) {
		jQuery('<div id="tooltip">' + contents + '</div>').css( {
	    position: 'absolute',
	    display: 'none',
	    top: y + 5,
	    left: x + 5,
	    border: '1px solid #7dbe1a',
	    padding: '8px',
	    'background-color': '#40c740',
	    'font-weight': 'bold',
	    '-moz-border-radius': '3px',
	    color: '#ffffff',
	    opacity: 1
		}).appendTo("body").fadeIn(200);
  }	
	
  HH.chart_elm.bind("plothover", function (event, pos, item) {
		jQuery("#x").text(pos.x.toFixed(2));
		jQuery("#y").text(pos.y.toFixed(2));
		if (item) {	
			var date 	= new Date(item.datapoint[0]);
			var month = (date.getMonth() + 1) + '';
			var day   = date.getDate() + '';
			var label = month + '/' + day;
			var labelElm = jQuery('.tickLabel[rel=' + label + ']');

			labelElm.addClass('active').siblings().removeClass('active');

			if (HH.previousPoint != item.datapoint) {
				HH.previousPoint = item.datapoint;

				jQuery("#tooltip").remove();

				var x = item.datapoint[0].toFixed(2),
				y = item.datapoint[1].toFixed(2);
				d = 140000000;
				HH.chart.setSelection({ xaxis: { from: item.datapoint[0]-d, to:item.datapoint[0]+d }, yaxis: { from: 0, to: 1000 } });

				showTooltip(item.pageX, item.pageY, parseInt(y));
			}
		}
		else {
			HH.chart.clearSelection();
	    jQuery("#tooltip").remove();
	    HH.previousPoint = null;            
		}

 });	
}

// =================================================================================================
// = from: http://www.bram.us/2008/02/01/javascript-isarray-check-if-an-elementobject-is-an-array/ =
// =================================================================================================
// X-Browser isArray(), including Safari
function isArray(obj) {
    return obj.constructor == Array;
}