/**
 * 
 * JavaScript for displaying Job Data
 * Iowa - Department of Management (c) 2009 - State of Iowa
 * Department of Administrative Services
 * 
 * @author DAS/ITE
 * @authored 2009
 * 
 * Q) What is with all the setInterval() setTimeout() stuff?
 * A) Some browsers are slow and appear to freeze up without it.
 * 
 */

// script base url
var base = 'http://www.iowa.gov/recovery';
//var base = 'http://localhost/projects/IowaStats/Recovery';

// version info
var version = '0.0.1';

// graph data object
var jobdata = null;
var filltimer = {};
var displayed = 0;
var fte_total = 0;
var minwidth = 0;
var buildKey = 0;
var buildId = 0;

// graphs and charts
var chart = {};
chart.data = new Array();
chart.is3D = true;
chart.width = '740';
chart.height = '300';
chart.legend = 'left';
chart.disableformat = true;
chart.tooltipWidth = '200';

// chart colors
var colors = new Array();
colors[7] = '02377e';
colors[6] = '795300';
colors[5] = '025e04';
colors[4] = 'bf8200';
colors[3] = '009d04';
colors[2] = '006cff';
colors[1] = 'ffae00';
colors[0] = '00ff06';

// custom sorts for jQuery sort()
function sortJobs(a,b){  
	return parseFloat($(a).children('.value').text()) < parseFloat($(b).children('.value').text()) ? 1 : -1;  
}; 
function sortSubJobs(a,b){  
	return parseFloat($(a).children('.subval').children('.count').text()) < parseFloat($(b).children('.subval').children('.count').text()) ? 1 : -1;  
};

/*
 * window positioning utilities
 */
function getHorizonalOffset() {
	var scrOfX = 0;
	if ( typeof( window.pageYOffset ) == 'number' ) {
		scrOfX = window.pageXOffset;
	} else {
		if ( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
			scrOfX = document.body.scrollLeft;
		} else {
			if ( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
				scrOfX = document.documentElement.scrollLeft;
			}
		}
	}
	return scrOfX;
}

function getVerticalOffset() {
	var scrOfY = 0;
	if ( typeof( window.pageYOffset ) == 'number' ) {
		scrOfY = window.pageYOffset;
	} else { 
		if ( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
			scrOfY = document.body.scrollTop;
		} else {
			if ( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
				scrOfY = document.documentElement.scrollTop;
			}
		}
	}
	return scrOfY;
}

function clickedRegistrantIcon(idOrLat,lon,cluster)
{
	if (typeof cluster == 'undefined'){
		cluster = false;
	}
	if ( typeof jsonQueryString !='undefined' && regid == idOrLat) {
		var backQueryString = jsonQueryString.replace('registrant=' + regid + '&','');
		document.location.href = baseUrl + '/registrant/' + idOrLat + '/' + backQueryString;
	} else {
		if ( typeof jsonQueryString !='undefined') {
			if (typeof regid != 'undefined' && regid!='') {
				queryString = jsonQueryString.replace('registrant='+regid+'&','');
				queryString = queryString.replace('registrant='+regid,'');
			} else {
				queryString = jsonQueryString.replace('registrant=','crumb=');
			}            
		}
		if ( typeof queryString == 'undefined') {
			if (lon) {
				document.location.href=baseUrl + '/advancedsearch/?lat=' + idOrLat + '&lon=' + lon;
			} else {
				document.location.href=baseUrl + '/registrant/' + idOrLat + '/';
			}
		} else {
			if (lon) {
				queryString = queryString.replace('&type=map&mapformat=Map Results','');
				queryString+='&cluster=true';
				document.location.href=baseUrl + '/geo/' + queryString +  '&lat=' + idOrLat + '&lon=' + lon;
			} else {
				document.location.href=baseUrl + '/registrant/' + idOrLat + '/' + queryString;
			}
		}
	}
}

function getX(obj)
{
	var curleft = 0;
	if (obj.offsetParent) {
		while(1){ curleft+=obj.offsetLeft;if (!obj.offsetParent){ break; } obj = obj.offsetParent;}
	} else {
		if (obj.x) { curleft += obj.x; }
	}
	return curleft; 
}

function getY(obj)
{
	var curtop = 0;
	if (obj.offsetParent) {
		while(1) { curtop += obj.offsetTop; if (!obj.offsetParent){ break; } obj = obj.offsetParent;} 
	} else {
		if (obj.y){
			curtop += obj.y; 
		}
	}
	return curtop;
}

function getClientWidth() {
	var width = 0;
	if ( typeof( window.innerWidth ) == 'number' ) {
		width = window.innerWidth;
	} else {
		if ( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
			width = document.documentElement.clientWidth;
		} else {
			if ( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
				width = document.body.clientWidth;
			}
		}
	}
	return width + getHorizonalOffset();
}

function getClientHeight() {
	var height = 0;
	if ( typeof( window.innerWidth ) == 'number' ) {
		height = window.innerHeight;
	} else {
		if ( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
			height = document.documentElement.clientHeight;
		} else {
			if ( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
				height = document.body.clientHeight;
			}
		}
	}
	return height + getVerticalOffset();
}

function getBottomEdge(targetObject)
{
	var pY = getY(targetObject);
	pY = (pY + parseInt(targetObject.style.height,10));
	return pY;
}
function getRightEdge(targetObject)
{
	var pX = 0;
	if ( targetObject.style.width == 'auto') {
		pX = getX(targetObject);
		pX = (pX + parseInt($('#'+targetObject.id).width(),10));
	} else {
		pX = getX(targetObject);
		pX = (pX + parseInt(targetObject.style.width,10));
	}
	return pX;
}


/*
 * Positions the object on the screen so it does not bleed off the page.
 */
function controlBleed(targetObject,extramargin)
{
	if (typeof extramargin == 'undefined') {
		extramargin = 20;
	}
	var differenceX = (getRightEdge(targetObject) - getClientWidth());
	if (differenceX>0)
	{
		targetObject.style.left = ((getX(targetObject) - differenceX) - extramargin) + 'px';
	}
	var differenceY = (getBottomEdge(targetObject) - getClientHeight());
	if (differenceY>0)
	{
		targetObject.style.top = (getY(targetObject) - (differenceY+10)) + 'px';
	}
	if ((getX(targetObject)-getHorizonalOffset())<1)
	{
		targetObject.style.left = (getHorizonalOffset()+2) + 'px';
	}

	if ((getY(targetObject)-getVerticalOffset())<1)
	{
		targetObject.style.top = (getVerticalOffset()+2) + 'px';
	}
}

function hideMessages() {
	$('.messages').fadeOut('slow');
}

function number_format(nStr)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}

// ready to build
$(document).ready( function() {
	fetchdata();
});

function group_complete() {
	
	$('.joblist').css('overflow','auto');
	$('.busy').hide();
}

function display() {

	var totals = number_format(Math.ceil(parseFloat($('#total_fte').text())));
	$('#total_fte').text(totals);
	$('.progressbox').hide();
	$('.loading').hide();
	$('.joblist').css('padding','6px');
	$('.joblist').css('border-top','1px solid #aaa');
	$('.joblist').css('background','#bbb');
	$('.joblist').css('-moz-box-shadow','inset 0px 0px 10px 5px #888');
	$('.joblist').css('-webkit-box-shadow','inset 0px 0px 10px 5px #888');
	
	$('.major').append('<div class="jobdetailsfoot">&nbsp;</div>');
	$('.jobs').animate({height: "500px"}, 990 );
	$('.joblist').animate({height: "450px"}, 1000 );
	
	$('.joblist div.major').animate({top: "0px"}, 1800, function () {
		displayed++;
		if (displayed==$('.joblist div.major').length) {
			group_complete();
		}
	});

	$('#jobcounter').text(totals);
	
	$('.expandmajor').click(function () {
		
		var reclick = false
		if ($(this).parent().attr('class') == 'focusedmajor') {
			reclick = true;
		}
		$('.jobdetailsfoot').hide();
		$('.jobdetails').hide();
		$('.busy').fadeIn('fast');
		$('.focusedmajor').attr('class','major');
		
		if (reclick) {
		 $('.busy').fadeOut('slow');
		 return;
		}
		
		$(this).parent().children('.jobdetails').show();
		$(this).parent().children('.jobdetailsfoot').show();
		var offset = $(this).parent().parent()[0].scrollTop;
		var scroll = (offset + $(this).parent().position().top);
		if(scroll>11) {
			$(this).parent().parent().scrollTo((scroll-10),0);
		}
		$(this).parent().attr('class','focusedmajor');
		$('.busy').fadeOut('slow');
		
	});
	
	
	
	
}

function buildcharts(size) {
	
	
	$('.major').each(function () {
		
		var label = $(this).children('.title').text();
		label = label.replace('Occupations','');
		var index = chart.data.length;
		var value = parseFloat($(this).children('.value').text());
		if (index<15) {
			
			chart.data[index] = {};
			chart.data[index].value = value;
			chart.data[index].label = label;
		}
			
		$(this).children('.jobdetails').each(function () {
		
			var subvalue = parseFloat($(this).children('.subval').children('.count').text());
			var remainder = (value - subvalue);
			var subpercent = Math.ceil((subvalue/value)*100);
			
			var sub = {};
			sub.type = 'p3';
			sub.size = '68x68';
			sub.transparent = true;
			sub.data = new Array();
			sub.data[0] = {};
			sub.data[0].value = (subvalue*10);
			sub.data[0].label = '';
			sub.data[0].color = '54b8fd';
			sub.data[1] = {};
			sub.data[1].value = (remainder*10);
			sub.data[1].label = '';
			sub.data[1].color = '555555';
			
			$(this).children('.subchart').mouseover(function (event) {
				
				var scolloffset = 0;
				if ( typeof $('.joblist')[0].scrollTop != 'undefined') {
					scolloffset = $('.joblist')[0].scrollTop;
				}
				
				var display = '<div class="chat-bubble">';
				//display += '<div class="targetsubchart"></div>';
				display += '<strong>' + subvalue + ' of ' + value + ' jobs ('+subpercent+'%)</strong><br/>';
				display += '<div class="targetsubchart"></div>';
				display += '<br/><em class="dyn">' + subvalue + ' of the ' + value + ' jobs created for '+label+' Occupations were for this entry.</em>';
				display += '<div class="chat-bubble-arrow-border"></div><div class="chat-bubble-arrow"></div>';
				
				var top = (parseInt(event.pageY,10));
				var elementTop = ($(this).offset().top - 10);
				
				
				$('#dynamicblock').css('top',(elementTop)+'px');
				$('#dynamicblock').css('left',(parseInt(event.pageX,10)-38)+'px');
				
				$('#dynamicblock').css('background','transparent');
				$('#dynamicblock').css('border','0');
				$('#dynamicblock').css('-webkit-box-shadow','none');
				$('#dynamicblock').css('-moz-box-shadow','none');
				$('#dynamicblock').css('padding','0');
				$('#dynamicblock').css('margin','0');
				$('#dynamicblock').css('width','290px');
				$('#dynamicblock').css('height','auto');
				$('#dynamicblock').html(display);
				$('#dynamicblock').show();
				
				$('#dynamicblock').css('top',(elementTop - (parseInt($('#dynamicblock').height(),10)))+'px');
				$('.chat-bubble').children('.targetsubchart').chart(sub);
				
				
			});
			
			$(this).children('.subchart').mousemove(function (event) {
				if ($('#dynamicblock').is (':visible')) {
					$('#dynamicblock').css('left',(parseInt(event.pageX,10)-38)+'px');
				}
			});
			
			$(this).children('.subchart').mouseout(function (event) {
				if ($('#dynamicblock').is (':visible')) {
					$('#dynamicblock').hide();
				}
			});
			
		}); 
		
	});
	$('.progress').css('width', '100%');
	$('.status').text('Waiting for Browser to Catch Up');
	$('.jobschart').slideDown(1000);
	$('#jobschart').visualization(chart);
	setTimeout(display,200);
	
	
	/** progress bar enabler
	buildKey = 0;
	$('.status').text('Building Charts...');
	$('.progress').css('width', '0%');
	buildId = setInterval(addgraph,1);
	**/
			
		
	
}

function applylabels() {
	
	$('.value').each(function () {
		if ($(this).text()=='1') {
			$(this).append(' Job');
		} else {
			$(this).append(' Jobs');
		}
		if (parseInt($(this).outerWidth(),10)>minwidth) {
			minwidth = $(this).outerWidth();
		}
		$(this).css('width',minwidth);
	});
	$('.status').text('Building Charts (this may take a moment) ...');
	$('.progress').css('width', (parseFloat($('.progress').css('width'))+5) + '%');
	setTimeout(buildcharts,100);
}

function sortjobs() {
	$('.status').text('Applying Friendly Labels');
	$('.progress').css('width', (parseFloat($('.progress').css('width'))+5) + '%');
	setTimeout(applylabels,100);
}

function cleanup() {
	
	var displayhtml = '';
	for (var handle in jobdata.display) {
		displayhtml+=jobdata.display[handle];
	}
	$('.joblist').html(displayhtml);
	$('.status').text('Sorting Data');
	$('.progress').css('width', (parseFloat($('.progress').css('width'))+5) + '%');
	setTimeout(sortjobs,100);
	
}

function dosum() {
	$('.status').text('Sorting Data');
}

function addgraph() {
	
	var graphcount = $('.jobdetails').length;
	if (buildKey>=(graphcount-2)) {
		$('.status').text('Waiting for Browser To Render...');
	}
	if (buildKey>=(graphcount)) {
		clearInterval(buildId);
		$('.progress').css('width', '100%');
		$('.status').text('Waiting for Browser to Catch Up');
		$('.jobschart').slideDown(1000);
		$('#jobschart').visualization(chart);
		setTimeout(display,100);
		return;
	}
	
	var label = $('.jobdetails:eq(' + buildKey + ')').parent().children('.title').text(); 
	var value = parseFloat( $('.jobdetails:eq(' + buildKey + ')').children('.subval').attr('grouptotal'));
	var subvalue = parseFloat( $('.jobdetails:eq(' + buildKey + ')').children('.subval').children('.count').text());
	
	var remainder = (value - subvalue);
	var subpercent = Math.ceil((subvalue/value)*100);
	
	var sub = {};
	sub.type = 'p3';
	sub.size = '48x48';
	sub.transparent = true;
	sub.data = new Array();
	sub.data[0] = {};
	sub.data[0].value = (subvalue*10);
	sub.data[0].label = '';
	sub.data[0].color = '54b8fd';
	sub.data[1] = {};
	sub.data[1].value = (remainder*10);
	sub.data[1].label = '';
	sub.data[1].color = '555555';
	
	 $('.jobdetails:eq(' + buildKey + ')').children('.subchart').chart(sub);
	
	 $('.jobdetails:eq(' + buildKey + ')').children('.subchart').mouseover(function (event) {
		
		var scolloffset = 0;
		if ( typeof $('.joblist')[0].scrollTop != 'undefined') {
			scolloffset = $('.joblist')[0].scrollTop;
		}
		
		var display = '<div class="chat-bubble">';
		display += '<strong>' + subvalue + ' of ' + value + ' jobs ('+subpercent+'%)</strong><br/>';
		display += '<em class="dyn">' + subvalue + ' of the ' + value + ' jobs created for '+label+' Occupations were for this entry.</em>';
		display += '<div class="chat-bubble-arrow-border"></div><div class="chat-bubble-arrow"></div>';
		
		var top = (parseInt(event.pageY,10));
		var elementTop = ($(this).offset().top);
		
		$('#dynamicblock').css('top',(elementTop)+'px');
		$('#dynamicblock').css('left',(parseInt(event.pageX,10)-55)+'px');
		
		$('#dynamicblock').css('background','transparent');
		$('#dynamicblock').css('border','0');
		$('#dynamicblock').css('-webkit-box-shadow','none');
		$('#dynamicblock').css('-moz-box-shadow','none');
		$('#dynamicblock').css('padding','0');
		$('#dynamicblock').css('margin','0');
		$('#dynamicblock').css('width','290px');
		$('#dynamicblock').css('height','auto');
		$('#dynamicblock').html(display);
		$('#dynamicblock').show();
		
		$('#dynamicblock').css('top',(elementTop - (parseInt($('#dynamicblock').height(),10)))+'px');
		
		
	});
	
	 $('.jobdetails:eq(' + buildKey + ')').children('.subchart').mousemove(function (event) {
		if ($('#dynamicblock').is (':visible')) {
			$('#dynamicblock').css('left',(parseInt(event.pageX,10)-55)+'px');
		}
	});
	
	 $('.jobdetails:eq(' + buildKey + ')').children('.subchart').mouseout(function (event) {
		if ($('#dynamicblock').is (':visible')) {
			$('#dynamicblock').hide();
		}
	});
	
	var percent = Math.ceil((buildKey/graphcount)*100);
	$('.progress').css('width', (percent) + '%');
	buildKey++;
	
	
	
	
}

function addentry () {
	
	var added = 0;
	var current = 0;
	var j = buildKey;
	var entries = jobdata.dataset.length;
	
	if (buildKey>(entries-2)) {
		$('.status').text('Waiting for Browser to Catch Up...');
	}
	if (buildKey>entries || typeof jobdata.dataset[j] == 'undefined') {
		clearInterval(buildId);
		cleanup();
		return;
	}
	
	var append = '';
	var percent = Math.ceil((j/(entries+4))*100);
	var fte_count = parseFloat(jobdata.dataset[j]['fte_count']);
	var handle = jobdata.dataset[j]['handle'];
	
	jobdata.display[handle] = '<div id="' + handle + '" class="major ' + handle + '"><span class="value">' + fte_count + '</span><img class="expandmajor" src="' + site_url + '/images/application_form_magnify.png"><label class="title">' + jobdata.dataset[j]['group'] + '</label>';
	
	for(var e = 0;e<jobdata.dataset[j]['entries'].length;e++) {
		jobdata.display[handle]+= '<div class="jobdetails"><div class="subchart"><img src="/recovery/images/view_statistics.png"></div><label><em>Project:</em>&nbsp;' + jobdata.dataset[j]['entries'][e][2] + '<br/><em>Sub Classification:</em>&nbsp;' + jobdata.dataset[j]['entries'][e][7] + '<br/><em>Agency:</em>&nbsp;' + jobdata.dataset[j]['entries'][e][1] + '</label><div class="subval" grouptotal="' + fte_count + '"><span class="count">' + jobdata.dataset[j]['entries'][e][11] + '</span> Jobs (' +  jobdata.dataset[j]['entries'][e][10] + ' work hours) </div></div>'; 
		// from ' + jobdata.dataset[j]['entries'][e][8] + ' to ' + jobdata.dataset[j]['entries'][e][9] + '
	}
	
	jobdata.display[handle]+= '</div>';
	
	fte_total+=fte_count;
	$('.progress').css('width', (percent) + '%');
	$('#total_fte').text(Math.ceil(fte_total));
	
	buildKey++;
	added++;
	j = buildKey;
			
}

//process data obtained from the server
function process() {
	buildId = setInterval(addentry,1);
}

// gets job data
function fetchdata() {
			
	var service = base + '/api/jobs.php?jobs.json=' + new Date().getTime();
    	$.get(service, {}, function(data) {
    		jobdata = data;
    		process();
    	},'json');
}


