$(document).ready(function() 
{	
	//Ajax report submit
    $('#report-form button.ok-btn').live('click',function()
    {
		//Clear any existing data
		$('#report_results').html('');
	
        $('#report').remove();
        $('.messages').hide();
        $('.in-dialog-preloader').show();
		
		$('#report-form').ajaxSubmit(
		{
			success: function(response)
			{
				$('.in-dialog-preloader').hide();
				$('#report_results').html(response);
				
				init_dataTables();
			},
			error: function(jqXHR)
			{
				//If a user's session is expired the request will return a 401 status
				//We use that as an indication that we should redirect the user.
				if(jqXHR.status == '401')
				{
					window.location.href = webRoot + 'login/session_expired';
				}
			}
		});
		
        $( "#date" ).datepicker();
	});
});


//Initialize checkboxtree items
function init_report_view()
{
	$(".checkBoxTree").each(function()
	{          
		addTreeView($(this), "", "", false, false);
		$(this).TreeViewCheckboxes();              
		$(this).show();                            
	});
	
	$("#hiddenStartDate").datepicker({
		showOn: 'button',
		dateFormat: "m/d/yy",
		buttonImage: webRoot + '/common/images/ui-elements/reports/calendar.jpg',
		buttonImageOnly: true,
		showAnim: "fadeIn",
		onSelect: function(dateText, inst) {

			// explode date
			var dateparts = dateText.split("/");

			// set date dropdowns
            $('select[name=startMonth]').val(dateparts[0]);
            $('select[name=startDay]').val(dateparts[1]);
            $('select[name=startYear]').val(dateparts[2]);
		}
	});
	
	$("#hiddenEndDate").datepicker({
		showOn: 'button',
		dateFormat: "m/d/yy",
		buttonImage: webRoot + '/common/images/ui-elements/reports/calendar.jpg',
		buttonImageOnly: true,
		showAnim: "fadeIn",
		onSelect: function(dateText, inst) {

			// explode date
			var dateparts = dateText.split("/");

			// set date dropdowns
            $('select[name=endMonth]').val(dateparts[0]);
            $('select[name=endDay]').val(dateparts[1]);
            $('select[name=endYear]').val(dateparts[2]);
		}
	});
}

function init_dataTables()
{
	/** Adds table magick! http://www.datatables.net **/
	$('#report').dataTable(
	{
		"bAutoWidth":false,
		"bFilter":false,
		"bInfo":true,
		"bLengthChange":false,
		"bPaginate":true,
		"bProcessing":false,
		"bSort":true,
		"iDisplayLength":5,
		"sPaginationType":"full_numbers"
	});
}

function addTreeView(element, animation, persist, collapsed, unique) 
{
	$(element).treeview(
	{                                               
		animated: animation,                                              
		persist: persist,                                                 
		collapsed: collapsed,                                             
		unique: unique                                                    
	});                                                                 
}

jQuery.fn.uncheck = function() 
{
   return this.each(function() {
     this.checked = false;
   });
};

jQuery.fn.check = function() 
{
   return this.each(function() {
     this.checked = true;
   });
};

jQuery.fn.TreeViewCheckboxesOff = function() 
{
	$(this).each(function() {
		$(this).parent().find(":checkbox").uncheck();
		$(this).removeClass("checkbox-checked").addClass("checkbox-unchecked").removeClass("checkbox-partial");
	});
};

jQuery.fn.TreeViewCheckboxesOn = function() 
{
	$(this).each(function() {
		$(this).parent().find(":checkbox").check();
		$(this).addClass("checkbox-checked").removeClass("checkbox-unchecked").removeClass("checkbox-partial");
	});
};

jQuery.fn.TreeViewCheckboxesToggle = function()
{
	var check = $(":checkbox[id='"+this.attr("for")+"']")[0];
	var wasChecked = check.checked;

	var parentListItem = this.parent();
	var parentNodes = parentListItem.parents().filter(".expandable, .collapsable");
	var hasChildren = $(parentListItem).hasClass("expandable") || $(parentListItem).hasClass("collapsable");

	if (hasChildren) {
		// An expandable node was clicked.  We have to either check/uncheck all children below.
		var childItems = $(parentListItem).find("li label");
		if (wasChecked) {
			$(childItems).TreeViewCheckboxesOff();
			this.addClass("checkbox-checked").removeClass("checkbox-unchecked").removeClass("checkbox-partial");
		} else {
			$(childItems).TreeViewCheckboxesOn();
			this.removeClass("checkbox-checked").addClass("checkbox-unchecked").removeClass("checkbox-partial");
		}
	}

	// Now, traverse up the tree to update any higher-level checkboxes
	if (parentNodes.length > 0) {
		$(parentNodes).each(function(){
			var label = $(this).children("label");
			var allChildrenSize = $(this).find("li :checkbox").length;
			var checkedChildrenSize = $(this).find("li :checkbox:checked").length;

			if (wasChecked) {
				checkedChildrenSize -= 1;
			} else {
				checkedChildrenSize += 1;
			}

			var theCheckBox = $(":checkbox[id='"+$(label).attr("for")+"']"); 
			if (allChildrenSize != checkedChildrenSize && checkedChildrenSize == 0) {
				$(label).removeClass("checkbox-partial").removeClass("checkbox-checked").addClass("checkbox-unchecked");
				theCheckBox.uncheck();
			} else if (allChildrenSize != checkedChildrenSize) {
				$(label).addClass("checkbox-partial").removeClass("checkbox-checked").removeClass("checkbox-unchecked");
				theCheckBox.uncheck();
			} else {
				$(label).addClass("checkbox-checked").removeClass("checkbox-unchecked").removeClass("checkbox-partial");
				theCheckBox.check();
			}
		});
	}

	// Click the hidden input box for IE only.  Firefox will cascade the click down.
	if ($.browser.msie) {
		check.click();
	}

	this.toggleClass("checkbox-checked").toggleClass("checkbox-unchecked");
}

jQuery.fn.TreeViewCheckboxes = function()
{
	$(":checkbox", this)
	// Hide native checkboxes
	.hide()
	// Find related labels and add the styles
	.each(function(){
		var check = this;
		var jlabel = $("label[for='"+$(check).attr("id")+"']");
		var disabled = $(check).attr("disabled");

		// Initial state check
		if (check.checked) {
			if (!check.disabled) {
				jlabel.addClass("checkbox-checked");
			} else {
				jlabel.addClass("checkbox-checked-disabled");
			}
		} else {
			if (!check.disabled) {
				jlabel.addClass("checkbox-unchecked");
			} else {
				jlabel.addClass("checkbox-unchecked-disabled");
			}
		}

		jlabel.hover(
			function() { $(this).addClass("over"); },
			function() { $(this).removeClass("over"); }
		)

		// Label click state
		jlabel.click(function(){
			var check = $(":checkbox[id='"+$(this).attr("for")+"']")[0];
			if ($(check).attr("disabled") != true) {
				$(this).TreeViewCheckboxesToggle();
			}
		});
	});
	var treeNodes = $(this).find("li:first").markInputs();
}

jQuery.fn.markInputs = function()
{
	var treeNodes = $(this).find("li.expandable, li.collapsable").andSelf();
	treeNodes.each(function() {
		$(this).markInput();
	});
};

jQuery.fn.markInput = function()
{
	var label = $(this).children("label");
	var check = $(this).children(":checkbox");
	var allChildrenSize = $(this).find("li :checkbox").length;
	var checkedChildrenSize = $(this).find("li :checkbox:checked").length;
	
	if (allChildrenSize != checkedChildrenSize && checkedChildrenSize == 0) {
		if ($(check).attr("disabled") != true) {
			$(label).removeClass("checkbox-partial").removeClass("checkbox-checked").addClass("checkbox-unchecked");
		} else {
			$(label).removeClass("checkbox-partial-disabled").removeClass("checkbox-checked-disabled").addClass("checkbox-unchecked-disabled");
		}
		$(check).uncheck();
	} else if (allChildrenSize != checkedChildrenSize) {
		if ($(check).attr("disabled") != true) {
			$(label).addClass("checkbox-partial").removeClass("checkbox-checked").removeClass("checkbox-unchecked");
		} else {
			$(label).addClass("checkbox-partial-disabled").removeClass("checkbox-checked-disabled").removeClass("checkbox-unchecked-disabled");
		}
		$(check).uncheck();
	} else {
		if ($(check).attr("disabled") != true) {
			$(label).addClass("checkbox-checked").removeClass("checkbox-unchecked").removeClass("checkbox-partial");
		} else {
			$(label).addClass("checkbox-checked-disabled").removeClass("checkbox-unchecked-disabled").removeClass("checkbox-partial-disabled");
		}
		$(check).check();
	}
};

/**
 *	set_fixed_date()
 *
 *	Updates report date dropdowns to reflect a fixed search back in time from NOW
 */
function set_fixed_date()
{
	//fixed_val will be a representation of days (weekly = 7, monthly = 31, yearly = 356)
	//This value will be used to calculate the number of seconds back from now that we want 
	//to search within.
	var fixed_val = $('#fixedDate').val();
	
	var dt = new Date();
	var timestamp = dt.getTime() - fixed_val * 24 * 60 * 60 * 1000;
	
	var newDate = new Date(timestamp);

	// Set the date fields
	$('#startMonth').val(newDate.getMonth() + 1);
	$('#startDay').val(newDate.getDate());
	$('#startYear').val(newDate.getFullYear());
}  
