// JavaScript Document

var paid_id;				// used to check which invoice is being mark/unmark as paid, also used for deleting invoice
var which_address_field;	// used to check which address field the user is typing in, and display the result
var internal = false;		// this tells the functions if they are being used by other internal functions
							// if this is set to true then there will be no confirmation of the actions displayed to the user
var open_after_save = true;
var print_after_save = false;
var fromSavePromt = false;
var print_type = 'receipt';
var t = null;				// the time for the search
var open_popup = null;
var continue_operation = true; // multi used variable to cancel internal function workings if something goes wrong.
var lastInvoiceType = null;
var contact_manager = 0;
var vendor_manager = 0;
var made_changes = false; // keep track if changes were made to an invoice
var currently_working = false;	// using this to see if a save section is currently active. If it is dont allow to save again
								// to avoid double saving

function save_promt()
{
	var contentIdIsNum = false;
	
	// if not changes were made then no need to save
	
	if (document.getElementById('invoice_type') && document.getElementById('invoice_content'))
	{
		var invoice_id = document.getElementById('invoice_id').value;
		var invoice_type = document.getElementById('invoice_type').value;
		
		// no changes were made so do not ask to save, and unset readonly
		if (!made_changes)
		{
			if (invoice_id != '')
				unsetReadonly(invoice_id);

			return false;
		}
		
		// see if the invoice is empty for the touch Invoice
		if (invoice_type == 'touchPOS_invoice' || invoice_type == 'POS_invoice' || invoice_type == 'purchase_order')
		{
			try {
				contentIdIsNum = !isNaN(document.getElementById('writeroot').nextSibling.id);
			} catch (e) {
				contentIdIsNum = false;
			}
		}
		else
			contentIdIsNum = !isNaN(document.getElementById('invoice_content').lastChild.previousSibling.id); // for the regular invoice

		if (!contentIdIsNum)
			return false;

		if (document.getElementById('readonly') && (document.getElementById('readonly').value == 1) )
			return false;
		
		// ask if you wish to save the invoice first
		var ask = confirm(LANG_save_invoice);

		// if the user clicked yes, then run the save invoice function
		if (ask)
		{
			fromSavePromt = true;
			saveInvoice(false);
		}
		else
		{
			// this invoice will not be saved, so make sure that read only is unset
			if (invoice_id != '')
				unsetReadonly(invoice_id);
		}
	}
}


function unsetReadonly(invoice_id) {
	
	var h = new invoice(unsetReadonlyHandler);

	h.unset_readonly(invoice_id);

}
// A handler is required to accept the response
// of asychronous calls...
var unsetReadonlyHandler = {
	// Function must have same name as remote method
	unset_readonly: function(result) {
		
		if (result[0] == 'fail') {
			alert(result[1]);
		}
	}
}

function openDrawer()
{
	var h = new invoice(openDrawerHandler);
	h.open_drawer();
}
var openDrawerHandler = {
	// Function must have same name as remote method
	open_drawer: function(result)
	{
		if (result[0] == 'fail') {
			alert(result[1]);
		}
	}
}

function updatePole(type, amount1, amount2)
{
	if (!type || !amount1 || !amount2)
		return false;

	var h = new invoice();
	h.update_pole(type, amount1, amount2);
}

function newInvoice(skipPromt, po) {

	// ask if the invoice is to be saved first
	if (!skipPromt)
		save_promt();
	
	// show loading image
	document.getElementById('loading').style.display = 'block';
	
	// Create the client object, passing the async
	// handler. Note lower case!
	var h = new invoice(newInvoiceHandler);

	// Call the remote method (method lower case!)
	if (po)
		h.new_invoice(true);
	else
		h.new_invoice();

}
// A handler is required to accept the response
// of asychronous calls...
var newInvoiceHandler = {
	// Function must have same name as remote method
	new_invoice: function(result) {
		
		if (!continue_operation)
		{
			continue_operation = true;
			return false;
		}
		
		if (result[0] == 'fail')
			alert(result[1]);
		else {
			// display the page
			
			if (result[0] == 'touchPOS_invoice')
			{
				window.setTimeout(result[1], 10);
			} else {
				document.getElementById('page').innerHTML = result[1];
				
				// display header buttons that are required for this page
				if (document.getElementById('save_invoice'))
					document.getElementById('save_invoice').style.display = '';
				document.getElementById('print_invoice').style.display = '';
				
				// reset the counter to start from the beginning
				counter = -1;
				
				// set the focus for the POS invoice
				if (result[0] == 'POS_invoice' || result[0] == 'purchase_order')
				{
					counter = 1;
					document.getElementById('UPC_scanner').focus();
				}
			}
		}
		
		// hide loading image
		document.getElementById('loading').style.display = 'none';
		which_address_field = null;
	}
}


function expensePage(page) {
	// ask if the invoice is to be saved first
	save_promt();
	
	// show loading image
	document.getElementById('loading').style.display = 'block';
	// Create the client object, passing the async
	// handler. Note lower case!
	if (page)
	{
		var h = new invoice(expenseMorePageHandler);
		h.expense_page(page);
	} else {
		var h = new invoice(expensePageHandler);
		h.expense_page();
	}
}

var expenseMorePageHandler = {
	// Function must have same name as remote method
	expense_page: function(result) {
		
		if (result[0] == 'fail') {
			alert(result[1]);
		} else {
			document.getElementById('writeroot').innerHTML = result[0];
			document.getElementById('pages_holder').innerHTML = result[1];
		}
		
		// hide loading image
		document.getElementById('loading').style.display = 'none';
	}
}
var expensePageHandler = {
	// Function must have same name as remote method
	expense_page: function(result) {
		
		if (result[0] == 'fail') {
			alert(result[1]);
		} else {
			document.getElementById('page').innerHTML = result[0];
		}
		
		// hide loading image
		document.getElementById('loading').style.display = 'none';
	}
}

function paymentPage()
{
	// ask if the invoice is to be saved first
	save_promt();
	
	// show loading image
	document.getElementById('loading').style.display = 'block';
	
	// Create the client object, passing the async
	// handler. Note lower case!
	var h = new invoice(paymentPageHandler);

	// Call the remote method (method lower case!)
	h.payment_page();

}

// A handler is required to accept the response
// of asychronous calls...
var paymentPageHandler = {
	// Function must have same name as remote method
	payment_page: function(result) {
		
		if (result[0] == 'fail') {
			alert(result[1]);
		} else {
			// hide the menu fields that are not needed in this page
			if (document.getElementById('save_invoice'))
				document.getElementById('save_invoice').style.display = 'none';
			document.getElementById('print_invoice').style.display = 'none';
			
			// display the page
			document.getElementById('page').innerHTML = result;
		}
		
		// hide loading image
		document.getElementById('loading').style.display = 'none';
	}
}

function configPage() {
	// ask if the invoice is to be saved first
	save_promt();
	
	// show loading image
	document.getElementById('loading').style.display = 'block';
	expense_first_time = true;
	
	// Create the client object, passing the async
	var h = new invoice(configPageHandler);

	// Call the remote method (method lower case!)
	h.config_page();

}

// A handler is required to accept the response
// of asychronous calls...
var configPageHandler = {
	// Function must have same name as remote method
	config_page: function(result) {
		
		if (result[0] == 'fail') {
			alert(result[1]);
		} else {
			// hide the menu fields that are not needed in this page
			if (document.getElementById('save_invoice'))
				document.getElementById('save_invoice').style.display = 'none';
				
			document.getElementById('print_invoice').style.display = 'none';
			
			// display the page
			document.getElementById('page').innerHTML = result;
		}
		
		// hide loading image
		document.getElementById('loading').style.display = 'none';
	}
}


function deleteCheckAccount()
{
	document.getElementById('loading').style.display = 'block';
	
	var h = new invoice(deleteCheckAccountHandler);
	h.delete_check_account(document.getElementById('check_account').value);
}
var deleteCheckAccountHandler = {
	// Function must have same name as remote method
	delete_check_account: function(result) {
		
		if (result[0] == 'fail') {
			alert(result[1]);
		} else {
			var from = document.getElementById('check_account');
			from.options[from.selectedIndex] = null;
		}
		
		// hide loading image
		document.getElementById('loading').style.display = 'none';
	}
}

function checksPage() {
	save_promt();
	
	document.getElementById('loading').style.display = 'block';
	checks_first_time = true;
	var h = new invoice(checksPageHandler);
	h.checks_page();
}

// A handler is required to accept the response
// of asychronous calls...
var checksPageHandler = {
	// Function must have same name as remote method
	checks_page: function(result) {
		
		if (result[0] == 'fail') {
			alert(result[1]);
		} else {
			// hide the menu fields that are not needed in this page
			if (document.getElementById('save_invoice'))
				document.getElementById('save_invoice').style.display = 'none';
			document.getElementById('print_invoice').style.display = 'none';
			
			// display the page
			document.getElementById('page').innerHTML = result;
		}
		
		// hide loading image
		document.getElementById('loading').style.display = 'none';
	}
}

function getNextCheckNum(account)
{
	if (account === false || account === null)
		return false;
		
	var h = new invoice(getNextCheckNumHandler);
	h.get_next_checknum(account);
}

var getNextCheckNumHandler = {
	// Function must have same name as remote method
	get_next_checknum: function(result)
	{
		if (result[0] == 'fail')
			alert(result[1]);
		else
			document.getElementById('check_num').value = result;
	}
}


function incomeExpensePage(itemsSold) {
	// ask if the invoice is to be saved first
	save_promt();
	
	if (!itemsSold)
		itemsSold = false;
	
	// show loading image
	document.getElementById('loading').style.display = 'block';
	var h = new invoice(incomeExpenseHandler);

	// Call the remote method (method lower case!)
	h.income_expense_page(itemsSold);

}
var incomeExpenseHandler = {
	income_expense_page: function(result) {
		
		if (result[0] == 'fail') {
			alert(result[1]);
		} else {
			// hide the menu fields that are not needed in this page
			if (document.getElementById('save_invoice'))
				document.getElementById('save_invoice').style.display = 'none';
			document.getElementById('print_invoice').style.display = 'none';
			
			// display the page
			document.getElementById('page').innerHTML = result;
		}
		
		// hide loading image
		document.getElementById('loading').style.display = 'none';
	}
}



function reportPage(payments, page) {
	// ask if the invoice is to be saved first
	save_promt();
	
	// show loading image
	document.getElementById('loading').style.display = 'block';
	// Create the client object, passing the async
	// handler. Note lower case!
	var h = new invoice(reportPageHandler);

	// Call the remote method (method lower case!)
	if (page)
		h.reports_page(payments, page);
	else
		h.reports_page(payments);
}

// A handler is required to accept the response
// of asychronous calls...
var reportPageHandler = {
	// Function must have same name as remote method
	reports_page: function(result) {
		
		if (result[0] == 'fail') {
			alert(result[1]);
		} else {
			// hide the menu fields that are not needed in this page
			if (document.getElementById('save_invoice'))
				document.getElementById('save_invoice').style.display = 'none';
			document.getElementById('print_invoice').style.display = 'none';
			
			// display the page
			document.getElementById('page').innerHTML = result;
		}
		
		// hide loading image
		document.getElementById('loading').style.display = 'none';
	}
}



function taxreportPage() {
	// ask if the invoice is to be saved first
	save_promt();
	
	// show loading image
	document.getElementById('loading').style.display = 'block';
	// Create the client object, passing the async
	// handler. Note lower case!
	var h = new invoice(taxreportPageHandler);

	// Call the remote method (method lower case!)
	h.tax_reports_page();

}

// A handler is required to accept the response
// of asychronous calls...
var taxreportPageHandler = {
	// Function must have same name as remote method
	tax_reports_page: function(result) {
		
		if (result[0] == 'fail') {
			alert(result[1]);
		} else {
			// hide the menu fields that are not needed in this page
			if (document.getElementById('save_invoice'))
				document.getElementById('save_invoice').style.display = 'none';
			document.getElementById('print_invoice').style.display = 'none';
			
			// display the page
			document.getElementById('page').innerHTML = result;
		}
		
		// hide loading image
		document.getElementById('loading').style.display = 'none';
	}
}




function getUserInfo(id) {
	// 0 means is on a black option, for creating a new user
	if (id == 0)
	{
		document.getElementById('user_id').value = '0';
		document.getElementById('user_name').value = '';
		document.getElementById('f_name').value = '';
		document.getElementById('l_name').value = '';
		document.getElementById('user_input').value = 'Add New User';
		document.getElementById('del_user').style.display = 'none';
		
		// the user rights information
		document.getElementById('can_create').checked = true;
		document.getElementById('can_modify').checked = true;
		document.getElementById('can_delete').checked = false;
		document.getElementById('can_report').checked = true;
		document.getElementById('can_view_all').checked = true;
		document.getElementById('can_open').checked = true;
		return false;
	}
	
	// show loading image
	document.getElementById('loading').style.display = 'block';
	// Create the client object, passing the async
	// handler. Note lower case!
	var h = new invoice(getUserInfoHandler);

	// Call the remote method (method lower case!)
	h.get_user_info(id);
}

// A handler is required to accept the response
// of asychronous calls...
var getUserInfoHandler = {
	// Function must have same name as remote method
	get_user_info: function(result) {
		
		if (result[0] == 'fail') {
			alert(result[1]);
		} else {
			document.getElementById('user_id').value = result['id'];
			document.getElementById('user_name').value = result['username'];
			document.getElementById('f_name').value = result['real_first'];
			document.getElementById('l_name').value = result['real_last'];
			document.getElementById('user_input').value = 'Save User Info';
			document.getElementById('del_user').style.display = '';
			
			// the user rights information
			document.getElementById('can_create').checked = (result['create']==1) ? true:false;
			document.getElementById('can_modify').checked = (result['modify']==1) ? true:false;
			document.getElementById('can_delete').checked = (result['delete']==1) ? true:false;
			document.getElementById('can_report').checked = (result['reports']==1) ? true:false;
			document.getElementById('can_view_all').checked = (result['view_all']==1) ? true:false;
			document.getElementById('can_open').checked = (result['open']==1) ? true:false;
			
			if (result['config'] != '' && result['config'] != null)
			{
				document.getElementById('accountant').checked = ( result['config'].substring(0,1) == '1' ) ? true:false;
				document.getElementById('print_checks').checked = ( result['config'].substring(1,2) == '1' ) ? true:false;
			} else {
				document.getElementById('accountant').checked = false;
				document.getElementById('print_checks').checked = false;
			}
		}
		
		// hide loading image
		document.getElementById('loading').style.display = 'none';
	}
}



function UserManagement() {
	
	var data = new Array();
	var password = document.getElementById('password').value;
	var username = document.getElementById('user_name').value;
	var f_name = document.getElementById('f_name').value;
	var l_name = document.getElementById('l_name').value;
	var id = document.getElementById('user_id').value;
	
	if ( (username == '') || (f_name == '') || (l_name == '') )
	{
		alert(LANG_all_fields_required);
		return false;
	}
	
	data['id'] = id;
	data['username'] = username;
	data['f_name'] = f_name;
	data['l_name'] = l_name;

	// the user rights
	data['create'] = (document.getElementById('can_create').checked) ? 1:0;
	data['open'] = (document.getElementById('can_open').checked) ? 1:0;
	data['modify'] = (document.getElementById('can_modify').checked) ? 1:0;
	data['reports'] = (document.getElementById('can_report').checked) ? 1:0;
	data['view_all'] = (document.getElementById('can_view_all').checked) ? 1:0;
	data['delete'] = (document.getElementById('can_delete').checked) ? 1:0;
	data['accountant'] = (document.getElementById('accountant').checked) ? 1:0;
	data['print_checks'] = (document.getElementById('print_checks').checked) ? 1:0;
	
	if (id > 0) {
	// information is been updated
		var h = new invoice(UpdateUserHandler);
		
		if (password != '')
			data['password'] = password;
		
		// execute the update user info function
		h.update_user(data);
			
	} else {
	// new user
		if (password == '')
		{
			alert(LANG_all_fields_required);
			return false;
		} else {
			data['password'] = password;
		}
		
		var h = new invoice(addUserHandler);
		
		// execute the add new user function
		h.add_user(data);
	}
	
	// show loading image
	document.getElementById('loading').style.display = 'block';
}

// A handler is required to accept the response
// of asychronous calls...
var addUserHandler = {
	// Function must have same name as remote method
	add_user: function(result) {
		
		if (result[0] == 'fail') {
			alert(result[1]);
		} else {
			configPage();
		}
		
		// hide loading image
		document.getElementById('loading').style.display = 'none';
	}
}
var UpdateUserHandler = {
	// Function must have same name as remote method
	update_user: function(result) {
		
		if (result[0] == 'fail') {
			alert(result[1]);
		} else {
			configPage();
		}
		
		// hide loading image
		document.getElementById('loading').style.display = 'none';
	}
}


function delUser()
{
	// show loading image
	document.getElementById('loading').style.display = 'block';

	var h = new invoice(delUserHandler);
	
	var user_id = document.getElementById('user_id').value;

	h.del_user(user_id);
}
var delUserHandler = {
	// Function must have same name as remote method
	del_user: function(result) {
		
		if (result[0] == 'fail') {
			alert(result[1]);
		} else {
			configPage();
		}
		
		// hide loading image
		document.getElementById('loading').style.display = 'none';
	}
}


function viewInvoices_popup()
{
	if (open_popup && !open_popup.closed)
		open_popup.focus();
	else
		open_popup = window.open("view_invoices.php", "open_invoices", "width=790, height=494, status=0, toolbar=0, resizable=1, scrollbars=1");
	
	return;
}

function openInvoice_popup(id)
{
	// try to get an element that is only available in the touch screen
	// if its not there, then we are not using the touch screen window
	try {
		var keypadLCD = window.opener.document.getElementById('keypadLCD').value;
	}
	catch(err)
	{
		window.opener.focus();
		window.opener.openInvoice(id, true);
		return;
	}

	// we are in the touch screen so, open the invoice in the touch screen
	window.opener.openInvoice_touch(id);
}

function quickInvoiceFind()
{
	var num = prompt(LANG_what_invoice_num);
	
	if (!num)
		return false;
		
	openInvoice(num, 1, 'quickfind');
}
function openInvoice(input, ask, action)//ask, quickfind, prev, next)
{
	// check if we are in another invoice, then ask to be saved
	if (ask)
		save_promt();
		
	// no action to be taken
	if (!action)
		var action = 'none';

	document.getElementById('loading').style.display = 'block';

	var h = new invoice(openInvoiceHandler);
	h.open_invoice(input, action);
}
var openInvoiceHandler = {
	// Function must have same name as remote method
	open_invoice: function(result) {

		if (result[0] == 'fail')
			alert(result[1]);
		else
		{
			// reset all initial variables
			counter = result[1];
			made_changes = false;
			which_address_field = null;
			
			document.getElementById('page').innerHTML = result[0];
			
			var invoice_type = document.getElementById('invoice_type').value;
			
			// display header buttons that are required for this page
			if (document.getElementById('readonly').value == 1)
			{
				if (document.getElementById('save_invoice'))
					document.getElementById('save_invoice').style.display = 'none';
				alert(LANG_read_only);
			}
			else
			{
				if (document.getElementById('save_invoice'))
					document.getElementById('save_invoice').style.display = '';
			}
			
			document.getElementById('print_invoice').style.display = '';
			
			// resize the note and/or check due field
			if (invoice_type != 'POS_invoice' && invoice_type != 'touchPOS_invoice' && invoice_type != 'purchase_order') {
				check_due();
				noteResize(document.getElementById('notes'));
			}
			else
			{
				check_due(true);
				
				if (print_after_save)
				{
					print_after_save = false;
					printReceipt( document.getElementById('invoice_db_invoice').value );
				}
			}
		}
		
		// hide loading image
		document.getElementById('loading').style.display = 'none';
		// hide the message window
		document.getElementById('messages').style.display = 'none';
	}
}

function saveProducts(current_id) {
	
	var name = document.getElementById('p_' + current_id).value;
	var cost = document.getElementById('c_' + current_id).value;
	var p_tax = document.getElementById('x_' + current_id).value;
	
	if (name == '' || cost == '')
	{
		alert(LANG_name_price_required);
		return false;
	}
	
	which_address_field = current_id;
	
	if (!internal)
		document.getElementById('loading').style.display = 'block';
	
	var h = new invoice(saveProductsHandler);
	
	h.save_product(name, cost, p_tax);
	
}
var saveProductsHandler = {
	save_product: function(result)
	{
		if (!internal)
		{
			if (result[0] == 'fail'){
				alert(result[1]);
			} else if (result[0] == 'exists') {
				alert(LANG_product_exists);
				document.getElementById('product_id_' + which_address_field).value = result[1];
			} else {
				//document.getElementById('msg_center').innerHTML = 'Product saved with ID #' + result[1];
				document.getElementById('product_id_' + which_address_field).value = result[1];
				//document.getElementById('messages').style.display = 'block';
			}
		} else {
			if (result[0] != 'fail')
				document.getElementById('product_id_' + which_address_field).value = result[1];
		}
		
		// hide loading image
		if (!internal)
			document.getElementById('loading').style.display = 'none';
	}
}



// this sets a time before the functions is executed
// it prevents a lot of searches when the user is stil typing
function searchAddressStart(oCell, q, which_window)
{
	if (t)
		window.clearTimeout(t);
	
	switch (which_window)
	{
		case 3:
			contact_manager = 0;
			vendor_manger = 0;
			purchase_order = 1;
		break
		case 2:
			contact_manager = 0;
			vendor_manager = 1;
			purchase_order = 0;
		break;
		case 1:
			contact_manager = 1;
			vendor_manager = 0;
			purchase_order = 0;
		break
		default:
			contact_manager = 0;
			vendor_manager = 0;
			purchase_order = 0;
	}

	t = window.setTimeout("searchAddress('"+ oCell +"', '"+ q +"')", 350);
}

// this is what sets the timeout for the search address, it only executes when the user stops typing (or types slow)
function searchAddress(which, q) {
	
	/*if (customer_window)
		contact_manager = 1;
	else
		contact_manager = 0;*/
	
	which_address_field = which;
	
	// if the passed string is not longer than 3 characters do not continue
	if (q.length < 3) {
		
		if (!contact_manager && !vendor_manager)
			document.getElementById(which_address_field + '_address_drop').style.display = 'none';
		
		return false;
	}
	
	var h = new invoice(searchAddressHandler);
	
	// call the php search function
	if (which_address_field == 'check')
		h.search_address(q, 1, 0, 0);
	else if (purchase_order == true)
		h.search_address(q, 0, 0, 1); // we set for vendor manager, but without the contact manager set to 1 the function wont return vendor manager format
	else if (vendor_manager == true)
		h.search_address(q, 0, 1, 1);
	else if (contact_manager == true)
		h.search_address(q, 0, 1, 0);
	else
		h.search_address(q, 0, 0, 0);

}

// sets a timeout for the drop downs to hide
function searchAddressDelay() {
	window.setTimeout("searchAddressHide()",400);
}

// hides the drop downs
function searchAddressHide() {
	if (document.getElementById(which_address_field + '_address_drop'))
		document.getElementById(which_address_field + '_address_drop').style.display = 'none';
	return true;
}
var searchAddressHandler = {
	search_address: function(result) {
		if (result != 'none') {
			document.getElementById(which_address_field + '_address_drop').innerHTML = result;
			document.getElementById(which_address_field + '_address_drop').style.display = 'block';
		} else {
			if (contact_manager)
				document.getElementById(which_address_field + '_address_drop').innerHTML = '&nbsp;';
			else
				document.getElementById(which_address_field + '_address_drop').style.display = 'none';
		}
		
	}
}


// this sets a time before the functions is executed
// it prevents a lot of searches when the user is stil typing
function searchProductsStart(oCell, q) {
	if (t) {
		window.clearTimeout(t);
	}
	
	var Id = oCell.parentNode.id;
	
	t = window.setTimeout("searchProducts('"+ Id +"','"+ q +"')",350);
}

function searchProducts(oCell, q) {
	
	which_address_field = oCell; // even if its "which_address_field" its a global that can be used for thish purpuse
	
	// if the passed string is not longer than 3 characters do not continue
	if (q.length < 3)
	{
		document.getElementById('products_drop_' + which_address_field).style.display = 'none';
		return false;
	}
	
	var h = new invoice(searchProductsHandler);
	
	// call the search product php function
	h.search_product(q);
}
function searchProductsDelay() {
	window.setTimeout("searchProductsHide()",400);
}
function searchProductsHide() {
	document.getElementById('products_drop_' + which_address_field).style.display = 'none';
}
var searchProductsHandler = {
	search_product: function(result) {
		if (result != 'none') {
			document.getElementById('products_drop_' + which_address_field).innerHTML = result;
			document.getElementById('products_drop_' + which_address_field).style.display = 'block';
		} else {
			document.getElementById('products_drop_' + which_address_field).style.display = 'none';
		}
	}
}




function delLineItem(cell, id) {
	
	// display the loading image
	document.getElementById('loading').style.display = 'block';
	
	var h = new invoice(delLineItemHandler);
	var invoice_type = document.getElementById('invoice_type').value;
	
	// run the php code
	h.del_line_item(id);
	
	// remove the row from the page and also get rid of the amount
	if (invoice_type == 'POS_invoice' || invoice_type == 'touchPOS_invoice' || invoice_type == 'purchase_order')
		removeRow(cell, true);
	else
		removeRow(cell);
}
var delLineItemHandler = {
	del_line_item: function(result) {
		made_changes=true;
		document.getElementById('loading').style.display = 'none';
	}
}





function getProducts(product_id) {
	
	// display the loading image
	document.getElementById('loading').style.display = 'block';
	
	var h = new invoice(getProductHandler);
	
	h.get_product(product_id);
	
}
var getProductHandler = {
	get_product: function(result) {
		
		// hide loading image
		document.getElementById('loading').style.display = 'none';
		
		if (result != 'fail') {
			// hide the displays
			searchProductsHide();
			document.getElementById('product_id_' + which_address_field).value = result['ID'];
			document.getElementById('p_' + which_address_field).value = result['NAME'];
			document.getElementById('c_' + which_address_field).value = result['COST'];
			document.getElementById('x_' + which_address_field).value = result['P_TAX'];
			// get the total, incase the qt has been changed
			total(which_address_field);
			document.getElementById('p_' + which_address_field).focus();
		} else {
			alert(result[1]);
		}
	}
}






function getAddress(address_id) {
	
	// display the loading image
	document.getElementById('loading').style.display = 'block';
	
	// get the address field if its not set
	if (which_address_field == '' || which_address_field == null || !which_address_field)
	{
		try {
			var invoice_type = document.getElementById('invoice_type').value;
		} catch (err) {
			return false;
		}
		
		if (invoice_type == 'touchPOS_invoice' || invoice_type == 'POS_invoice')
			which_address_field = 'pos';
		else if (invoice_type == 'purchase_order')
			which_address_field = 'po';
		else
			which_address_field = 'pos';
	}

	
	var h = new invoice(getAddressHandler);
	
	switch (which_address_field)
	{
		case 'check':
			h.get_address(address_id, 1);
			break;
		case 'po':
			h.get_address(address_id, 2);
			break;
		default:
			h.get_address(address_id);
	}
}
var getAddressHandler = {
	get_address: function(result) {
		
		// hide loading image
		document.getElementById('loading').style.display = 'none';
		
		if (result != 'fail')
		{
			
			searchAddressHide();
			
			if (which_address_field == 'check')
			{
				document.getElementById(which_address_field + '_name').value = result['payee_name'];
				document.getElementById(which_address_field + '_address').value = result['payee_address'];
				document.getElementById(which_address_field + '_city').value = result['payee_city'];
				document.getElementById(which_address_field + '_state').value = result['payee_state'];
				document.getElementById(which_address_field + '_zip').value = result['payee_zip'];
				document.getElementById(which_address_field + '_payee_id').value = result['payee_id'];
				document.getElementById('areacode').value = result['payee_phone'].substring(0,3);
				document.getElementById('phone1').value = result['payee_phone'].substring(3,6);
				document.getElementById('phone2').value = result['payee_phone'].substring(6,10);
			}
			else
			{
				if (which_address_field == 'pos' && document.getElementById('invoice_type').value == 'touchPOS_invoice')
				{
					document.getElementById('customer_name').value = result['NAME'];
					document.getElementById('pos_id').value = result['ID'];
					
					checkCredit(result['ID']);
				}
				else
				{
					document.getElementById(which_address_field + '_name').value = result['NAME'];
					document.getElementById(which_address_field + '_address').value = result['ADDRESS'];
					document.getElementById(which_address_field + '_city').value = result['CITY'];
					document.getElementById(which_address_field + '_state').value = result['STATE'];
					document.getElementById(which_address_field + '_zip').value = result['ZIP'];
					document.getElementById(which_address_field + '_id').value = result['ID'];
					document.getElementById(which_address_field + '_area').value = result['PHONE'].substring(0,3);
					document.getElementById(which_address_field + '_phone1').value = result['PHONE'].substring(3,6);
					document.getElementById(which_address_field + '_phone2').value = result['PHONE'].substring(6,10);
				}
			}
			
			// reset the which address field after we are done
			which_address_field = null;
			
		} else {
			alert(result[1]);
		}
		
	}
}


function checkCredit(address_id) {
	
	if (!address_id)
		return false;
	
	// display the loading image
	document.getElementById('loading').style.display = 'block';
	
	var h = new invoice(checkCreditHandler);
	
	h.check_credit(address_id);
}
var checkCreditHandler = {
	check_credit: function(result)
	{
		// hide loading image
		document.getElementById('loading').style.display = 'none';
		
		if (result[0] != 'fail')
		{
			
			document.getElementById('credit_balance').value = result['due'];
			
			if (result['limit'] != 0)
				document.getElementById('credit_limit').value = result['limit'];
			else
				document.getElementById('credit_limit').value = ' ';
			
		} else {
			alert(result[1]);
		}
		
	}
}


function saveInvoice(ofs, pas, pt) {
	
	// check if another save session is going on, if there is cut this function short
	// if there isnt set the variable to true for this session
	if (currently_working)
		return false;
	else
		currently_working = true;
	
	// show loading image
	document.getElementById('loading').style.display = 'block';
	
	if (document.getElementById('readonly').value == 1) {
		alert(LANG_read_only);
		document.getElementById('loading').style.display = 'none';
		return false;
	}
	
	// get the type of invoice
	var invoice_type = document.getElementById('invoice_type').value;
	lastInvoiceType = invoice_type;
	
	open_after_save = ofs;
	if (pas)
		print_after_save = pas;
	
	// check if the credit terminal set to auto print receipts
	/*if (!print_after_save && invoice_type == 'touchPOS_invoice')
	{
		if (document.getElementById('receiptNeeded').value == '1')
			print_after_save = true;
	}*/
	
	if (print_after_save)
	{
		if (pt != false || pt != '')
			print_type = pt;
		else
			print_type = 'receipt';
	}
	
	// the number of product this invoice contains
	var num_prod;

	// POS adds the newer items at the top so get the object after writeroot to know how many items are in this invoice
	if (invoice_type == 'touchPOS_invoice' || invoice_type == 'POS_invoice' || invoice_type == 'purchase_order')
	{
		try {
			num_prod = document.getElementById('writeroot').nextSibling.id;
		} catch (e) {
			num_prod = "s"; // the value of this is irrelevant, as long as its not an integer
		}
	}
	else
		num_prod = document.getElementById('invoice_content').lastChild.previousSibling.id; // regular invoices add items at the bottom of the list
	
	var i;
	var data = new Array();

	// if the variable does not hold a number that means that there is no product, there for do not continue
	if (isNaN(num_prod)) {
		alert(LANG_invoice_empty);
		document.getElementById('loading').style.display = 'none';
		return false;
	}

	// set internal to true so that all functions accessed within this function would not
	// require user interaction, or notify the user of any internal actions
	internal = true;

	data['products'] = new Array();
	data['billing'] = new Array();
	data['shipping'] = new Array();
	
	// check if there is already an id number
	data['id_number'] = document.getElementById('invoice_id').value;
	if (data['id_number'] == '')
		data['id_number'] = 0;
		
	data['db_id_number'] = document.getElementById('invoice_db_invoice').value;
	if (data['db_id_number'] == '')
		data['db_id_number'] = 0;
	
	// get some standalone data
	if (invoice_type != "touchPOS_invoice")
		data['notes'] = document.getElementById('notes').value;

	data['tax'] = document.getElementById('sub_tax').value;
	data['total'] = document.getElementById('sub_total').value;
	data['amount_tendered'] = document.getElementById('paid').value;
	data['invoice_type'] = invoice_type;
	data['date'] = document.getElementById('invoice_date').value;
	
	// if the address id is set 0, that means that the address was changed or not saved at all
	if (invoice_type != "POS_invoice" && invoice_type != "touchPOS_invoice" && invoice_type != 'purchase_order')
	{
		if ( document.getElementById('bill_id').value == 0 ) {
			data['billing']['id']		= 0;
			data['billing']['name']		= document.getElementById('bill_name').value;
			data['billing']['address']	= document.getElementById('bill_address').value;
			data['billing']['city']		= document.getElementById('bill_city').value;
			data['billing']['state']	= document.getElementById('bill_state').value;
			data['billing']['zip']		= document.getElementById('bill_zip').value;
			data['billing']['phone']	= document.getElementById('bill_area').value + document.getElementById('bill_phone1').value + document.getElementById('bill_phone2').value;
		} else {
			// if there is an ID then we don't need to give any more information
			data['billing']['id']		= document.getElementById('bill_id').value;
		}
	
		// if the address id is set 0, that means that the address was changed or not saved at all
		if ( document.getElementById('ship_id').value == 0 ) {
			data['shipping']['id'] 		= 0;
			data['shipping']['name']	= document.getElementById('ship_name').value;
			data['shipping']['address']	= document.getElementById('ship_address').value;
			data['shipping']['city']	= document.getElementById('ship_city').value;
			data['shipping']['state'] 	= document.getElementById('ship_state').value;
			data['shipping']['zip'] 	= document.getElementById('ship_zip').value;
			data['shipping']['phone'] 	= document.getElementById('ship_area').value + document.getElementById('ship_phone1').value + document.getElementById('ship_phone2').value;
		} else {
			// if there is an ID then we don't need to give any more information
			data['shipping']['id'] = document.getElementById('ship_id').value;
		}
		
	}
	else
	{
		if (invoice_type == 'purchase_order')
			data['customer_id'] = document.getElementById('po_id').value;
		else
			data['customer_id'] = document.getElementById('pos_id').value;
	}
	
	if (invoice_type != 'purchase_order')
		data['payments'] = document.getElementById('payments').value;
	
	// check anyother information that the invoice could have and pass it
	var other_field;
	for(i=1; i<=5; i++)
	{
		other_field = document.getElementById('other_' + i);
		
		if (other_field)
			data['other_' + i] = other_field.value;
	}
	
	// get the line items information
	for (i=0; i<=num_prod; i++) {
		
		if (!document.getElementById('p_' + i))
			continue;
		
		//create a new array for each product inside the products array
		data['products'][i] = new Array();
		
		// assign each individual fields
		if (invoice_type == "POS_invoice" || invoice_type == "touchPOS_invoice" || invoice_type == "purchase_order"){
			data['products'][i]['upc'] = document.getElementById('i_' + i).value;
			data['products'][i]['id'] = document.getElementById('id_' + i).value;
			data['products'][i]['tax_m'] = document.getElementById('ta_' + i).value;
			data['products'][i]['price_change'] = document.getElementById('pc_' + i).value;
		} else {
			data['products'][i]['id'] = document.getElementById('product_id_' + i).value;
			data['products'][i]['name'] = document.getElementById('p_' + i).value;
			data['products'][i]['tax_p'] = document.getElementById('x_' + i).value;
			data['products'][i]['tax_m'] = document.getElementById('m_' + i).value;
		}
		data['products'][i]['qty'] = document.getElementById('q_' + i).value;
		data['products'][i]['lineItemId'] = document.getElementById('i_id_' + i).value;
		data['products'][i]['cost'] = document.getElementById('c_' + i).value;
		data['products'][i]['subtotal'] = document.getElementById('t_' + i).value;
			   
		// manually break out of the for loop, otherwise the function does not continue
		// past the for loop
		if(i == num_prod)
			break;
	}
	
	var h = new invoice(saveInvoiceHandler);

	// Call the remote method (method lower case!)
	h.save_invoice(data);
	
	// this part is needed for the save and print part
	return true;
	
}
var saveInvoiceHandler = {
	save_invoice: function(result)
	{
		// hide loading image
		hideAll();
		currently_working = false; // set the currently working variable to false, because this function is done
		
		if (result[0] == 'fail')
		{
			continue_operation = false;
			alert(result[1]);
		}
		else
		{			
			// print request for all other invoices
			if (print_after_save)
			{
				print_after_save = false;
				printReceipt(result[0]);
			}
			
			if (open_after_save)
			{
				open_after_save = false;
				
				if (lastInvoiceType == 'touchPOS_invoice')
					window.location = 'touchInvoice.php?open='+result[0];
				else
					openInvoice(result[0]);
			}
			else
			{
				// if its from the save promt then some other action is going to happen
				// so do not create a new invoice
				if (!fromSavePromt)
				{
					// create a new invoice but dont ask to save because we just saved it
					if (lastInvoiceType == 'touchPOS_invoice')
						window.location = 'touchInvoice.php';
					else
						newInvoice(true);
				}
				else
					fromSavePromt = false; // reset it back to false
			}
		}
		
		// set internal to false we have reached the end of the function
		internal = false;
		
	}
}


/*function deleteSelected()
{
	alert(document.check_form.check[0].length);
}*/
function deleteCheck(id)
{
	// show loading image
	document.getElementById('loading').style.display = 'block';
	
	var ask = confirm(LANG_delete_check);
	
	if (ask)
	{
		var h = new invoice(deleteCheckHandler);
		h.delete_check(id);
	}
	else
	{
		document.getElementById('loading').style.display = 'none';
		return false;
	}
}
var deleteCheckHandler = {
	delete_check: function(result)
	{

		if (result[0] == 'fail') {
			alert(result[1]);
		} else {

			if (result[1] > 1)
			{
				for (i=0; i<result[1]; i++)
				{
					document.getElementById('check_' + result[2][i]).style.display = 'none';
				}
			}
			else
			{
				document.getElementById('check_' + result[2]).style.display = 'none';
			}
		}
		
		document.getElementById('loading').style.display = 'none';
	}
}

function deleteSchedule(id)
{
	// show loading image
	document.getElementById('loading').style.display = 'block';
	
	var ask = confirm(LANG_delete_check);
	
	if (ask)
	{
		var h = new invoice(deleteScheduleHandler);
		h.delete_schedule(id);
	}
	else
	{
		document.getElementById('loading').style.display = 'none';
		return false;
	}
}
var deleteScheduleHandler = {
	delete_schedule: function(result)
	{

		if (result[0] == 'fail') {
			alert(result[1]);
		} else {

			if (result[1] > 1)
			{
				for (i=0; i<result[1]; i++)
				{
					document.getElementById('schedule_' + result[2][i]).style.display = 'none';
				}
			}
			else
			{
				document.getElementById('schedule_' + result[2]).style.display = 'none';
			}
		}
		
		document.getElementById('loading').style.display = 'none';
	}
}

function printAllSelected()
{	
	var check_ids = document.all_checks.check_id;
	var printed_field = document.getElementById('printed_check_field');
	var to_print = '';
	
	for (i = 0; i < check_ids.length; i++)
	{
		if (check_ids[i].checked == true)
		{
			// set this check to the print list
			to_print += ',' + check_ids[i].value;
			
			// move it to the printed list (even if not printed yet)
			printed_field.parentNode.insertBefore(check_ids[i].parentNode.parentNode, printed_field.nextSibling);
			
			// uncheck the checkbox
			check_ids[i].checked = false;
		}
	}
	
	// print the checks
	document.all_checks.checks_to_print.value = to_print;
	document.all_checks.submit();
}

function moveCheckToPrinted(checkField)
{
	if (checkField.parentNode.id == 'printed_checks_holder')
		return false;
	else
	{
		var printed_field = document.getElementById('printed_check_field');
		
		// move the this check row to the printed window
		printed_field.parentNode.insertBefore(checkField, printed_field.nextSibling);
	}
}


function saveCheck(schedule)
{
	if (!schedule)
		 schedule = false;

	// show loading image
	document.getElementById('loading').style.display = 'block';
	
	data['check_id'] 			= document.getElementById("new_check_id").value;
	data['check_payee_id'] 		= document.getElementById("check_payee_id").value;
	data['check_account'] 		= document.getElementById("check_account").value;
	
	data['check_name'] 			= document.getElementById("check_name").value;
	data['check_address'] 		= document.getElementById("check_address").value;
	data['check_city'] 			= document.getElementById("check_city").value;
	data['check_state'] 		= document.getElementById("check_state").value;
	data['check_zip'] 			= document.getElementById("check_zip").value;
	data['areacode'] 			= document.getElementById("areacode").value;
	data['phone1'] 				= document.getElementById("phone1").value;
	data['phone2'] 				= document.getElementById("phone2").value;
	
	data['check_num'] 			= document.getElementById("check_num").value;
	data['check_amount'] 		= document.getElementById("check_amount").value;
	data['check_memo'] 			= document.getElementById("check_memo").value;
	data['check_date'] 			= document.getElementById("check_date").value;
	data['draft'] 				= (document.getElementById("draft").checked) ? 1 : 0;
	
	if (schedule)
	{
		schedule_type = document.getElementById('schedule_type').value;
		
		switch (schedule_type)
		{
			case '2':
				data['schedule_data'] = '';

				for (var i = 0; i < 7; i++)
				{
					if (document.getElementById('week_days' + i).checked)
						data['schedule_data'] += i + ',';
				}

				if (data['schedule_data'] == '')
					return false;

				break;
			case '3':
				data['schedule_data'] = document.getElementById('monthly_schedule').value;

				if (data['schedule_data'] == '')
					return false;

				break;
			case '4':
			
				if (document.getElementById('monthly_schedule').value == '')
					return false;
					
				data['schedule_data'] = document.getElementById('monthly_schedule').value + '-' + document.getElementById('yearly_month').value;
				
				if (data['schedule_data'] == '')
					return false;
					
				break;
		}
		
		data['schedule_id'] = document.getElementById('schedule_id').value;
		data['schedule_type'] = schedule_type;
	}
	
	var h = new invoice(saveCheckHandler);
	h.save_check(data);
}
var saveCheckHandler = {
	save_check: function(result) {
		
		if (result[0] == 'fail')
		{
			if (checks_first_time){
				checks_first_time = false;
				saveCheck();
			}else{
				checks_first_time = false;
				alert(result[1]);
			}
		} else {
			// reset the form
			document.getElementById("new_check_id").value = 0;
			document.getElementById("check_payee_id").value = 0;
			//document.getElementById("check_account").value = ;

			document.getElementById("check_name").value = '';
			document.getElementById("check_address").value = '';
			document.getElementById("check_city").value = '';
			document.getElementById("check_state").value = '';
			document.getElementById("check_zip").value = '';
			document.getElementById("phone1").value = '';
			document.getElementById("phone2").value = '';
				
			document.getElementById("check_num").value;
			document.getElementById("check_amount").value = '';
			document.getElementById("check_memo").value = '';
			//document.getElementById("check_date").value = '';
			document.getElementById("draft").checked = false;
			document.getElementById('schedule_id').value = 0;
			
			// set the paper type to default
			changeLayout('top');
			changePrintOption(1);
			
			// the check is already in the tray, no need to create it, just update it
			if (result[3] == '1' && result[5] == 0 && document.getElementById("check_" + result[2]).parent.id != 'scheduled_checks_holder')
			{
				info = document.getElementById("check_" + result[2]);
				info.innerHTML = result[1];
			}
			else
			{
				if (result[5] != 0) // is a schedule
				{
					checkField = document.getElementById("scheduled_check_field");
					
					info = checkField.cloneNode(true);
					info.innerHTML = result[1];
					info.id = 'schedule_' + result[2];
					info.style.display = '';
					
					checkField.parentNode.insertBefore(info, checkField.nextSibling);
				}
				else // its a check
				{
					checkField = document.getElementById("check_field");
					
					info = checkField.cloneNode(true);
					info.innerHTML = result[1];
					info.id = 'check_' + result[2];
					info.style.display = '';
					
					checkField.parentNode.insertBefore(info, checkField.nextSibling);
					
					document.getElementById("check_num").value = result[4];
				}
			}
		}
		
		document.getElementById('loading').style.display = 'none';
	}
}

function openCheck(id)
{
	// show loading image
	document.getElementById('loading').style.display = 'block';
	
	var h = new invoice(openCheckHandler);
	h.open_check(id);
}
var openCheckHandler = {
	open_check: function(result) {
		document.getElementById('loading').style.display = 'none';
		//document.check_form.reset();
		
		if (result[0] == 'fail') {
			alert(result[1]);
		} else {
			document.check_form.new_check_id.value 		= result[1]['check_id'];
			document.check_form.check_payee_id.value 	= result[1]['payee_id'];

			// the select account
			for (var i= 0; i < document.check_form.check_account.options.length; i++)
			{
				if (document.check_form.check_account.options[i].value == result[1]['account_id'])
				{
					var sel_text = document.check_form.check_account.options[i].innerHTML;
					var sel_value = document.check_form.check_account.options[i].value;
					document.check_form.check_account.options[i] = new Option(sel_text, sel_value, 0, 1);
				}
			}
			
			// fill in the form
			document.check_form.check_name.value 		= result[1]['payee_name'];

			document.check_form.check_address.value 	= result[1]['payee_address'];
			document.check_form.check_city.value 		= result[1]['payee_city'];
			document.check_form.check_state.value 		= result[1]['payee_state'];
			document.check_form.check_zip.value 		= result[1]['payee_zip'];
			document.check_form.areacode.value 			= result[1]['areacode'];
			document.check_form.phone1.value 			= result[1]['phone1'];
			document.check_form.phone2.value 			= result[1]['phone2'];

			document.check_form.check_num.value 		= result[1]['check_num'];
			document.check_form.check_amount.value 		= result[1]['amount'];
			document.check_form.check_memo.value 		= result[1]['memo'];
			document.check_form.check_date.value 		= result[1]['date'];
			document.check_form.draft.checked 			= (result[1]['draft'] == 1 || result[1]['draft'] == '1') ? true : false;

			// change the print type
			changePrintOption(0);
		}
	}
}

// print the check on the top
function submit_check() {
	if (document.getElementById('check_print_type').value == '1')
	{
		var next_check_num = parseInt(document.check_form.check_num.value) + 1;
		var check_id = parseInt(document.getElementById('new_check_id').value);
		var check_amount = document.check_form.check_amount.value;
		
		document.check_form.submit();

		if (check_id != 0)
		{
			printedCheckField = document.getElementById("printed_check_field");
			printedCheckField.parentNode.insertBefore(document.getElementById('check_' + check_id), printedCheckField.nextSibling);

			//document.getElementById('check_' + check_id).style.display = 'none';
		}
			
		document.check_form.reset();
		document.check_form.check_num.value = next_check_num;
	}
	else if (document.getElementById('check_print_type').value == '2')
	{
		saveCheck(true);
	}
	else
	{
		saveCheck(false);
	}
}


/* ************************ EXPENSE ***************** */
function deleteExpense(id){
	
	// show loading image
	document.getElementById('loading').style.display = 'block';
	
	var ask = confirm('Continue deleting this transaction?');
	
	if (ask)
	{
		var h = new invoice(deleteExpenseHandler);
		h.delete_expense(id);
	}
	else
	{
		document.getElementById('loading').style.display = 'none';
		return false;
	}
}
var deleteExpenseHandler = {
	delete_expense: function(result) {
		document.getElementById('loading').style.display = 'none';
		
		if (result[0] == 'fail') {
			alert(result[1]);
		} else {
			document.getElementById('expense_'+result[1]).style.display = 'none';
		}
	}
}

function saveExpense(exp_id) {
	
	if (!exp_id) {
		exp_id = '';
		var editing = false;
	} else {
		var editing = true;
	}

	data['check_num'] 	= document.getElementById('expense_num' + exp_id).value;
	data['date'] 		= document.getElementById('expense_date' + exp_id).value;
	data['payee'] 		= document.getElementById('expense_payee' + exp_id).value;
	data['memo']		= document.getElementById('expense_memo' + exp_id).value;
	data['category']	= document.getElementById('expense_category' + exp_id).value;
	data['payment']		= document.getElementById('expense_payment' + exp_id).value;
	data['deposit']		= document.getElementById('expense_deposit' + exp_id).value;

	if (exp_id == '')
		exp_id = 0;

	if (data['date'] == '' || data['date'] == LANG_date)
	{
		alert(LANG_exp_date_error);
		return false;
	}
	else if (data['payee'] == LANG_payee || data['payee'] == '')
	{
		alert(LANG_payee_error);
		return false;
	}
	else if (data['category'] == '' || data['category'] == LANG_category)
	{
		alert(LANG_category_error);
		return false;
	}
	else if ( (data['payment'] == "" || data['payment'] == LANG_payment) && (data['deposit'] == "" || data['deposit'] == LANG_deposit) )
	{
		alert(LANG_payment_error);
		return false;
	}
	else if ( (data['payment'] != "" && data['payment'] != LANG_payment) && (data['deposit'] != "" && data['deposit'] != LANG_deposit) )
	{
		alert(LANG_exp_dep_error);
		return false;
	}
	
	// show loading image
	document.getElementById('loading').style.display = 'block';
	
	if (editing)
	{
		var h = new invoice(editExpenseHandler);
		//h.edit_expense(data, exp_id);
	}
	else
	{
		var h = new invoice(saveExpenseHandler);
		//h.save_expense(data, expense_first_time);
	}
	h.save_expense(data, expense_first_time, exp_id);
}
var saveExpenseHandler = {
	save_expense: function(result) {
		document.getElementById('loading').style.display = 'none';
		
		if (result[0] == 'fail')
			alert(result[1]);
		else {
			if (expense_first_time) {
				expense_first_time = false;
				saveExpense();
			} else {
				var sp1 = document.createElement("div");
				var sp2 = document.getElementById("writeroot");
				
				sp1.id = 'expense_' + result[2];
				sp1.innerHTML = result[1];
				
				sp2.appendChild(sp1);
				
				document.getElementById('expense_num').value = 'Check #';
				document.getElementById('expense_date').value = 'Date';
				document.getElementById('expense_payee').value = 'Payee';
				document.getElementById('expense_memo').value = 'Memo';
				document.getElementById('expense_category').value = 'Category';
				document.getElementById('expense_payment').value = 'Payment';
				document.getElementById('expense_deposit').value = 'Deposit';
			}
		}
	}
}

var editExpenseHandler = {
	save_expense: function(result) {
		document.getElementById('loading').style.display = 'none';
		
		if (result[0] == 'fail') {
			alert(result[1]);
		} else {
			if (expense_first_time) {
				expense_first_time = false;
				saveExpense(result[2]);
			} else {
				return;
			}
		}
	}
}


function editPayment(id)
{
	var h = new invoice(editPaymentHandler);
	h.edit_payment(id);
}
var editPaymentHandler = {
	edit_payment: function(result)
	{

		if (result[0] == 'fail') {
			alert(result[1]);
		} else {
			document.getElementById('prev_amount').value = result[1]['amount_paid'];
			document.getElementById('amount').value = result[1]['amount_paid'];
			document.getElementById('date').value = result[1]['date_paid'];
			document.getElementById('check').value = result[1]['check_num'];
			document.getElementById('note').value = result[1]['comments'];
			document.getElementById('payment_id').value = result[1]['payment_id'];
			document.getElementById('method').options[result[1]['payment_method']].selected = true;
		}

		
	}
}


/* *******************************************
 * FUNCTIONS FOR THE POS SYSTEM
 ******************************************* */
function onReceipt(UPC)
{
	// this function checks if an item is on invoice
	// returns -1 if its not on the invoice or the ID of the section that is on
	var holder = document.getElementById('invoice_content');
	var nodes = holder.childNodes;
	
	//alert(nodes.length);
	for (var i=0; i<nodes.length; i++)
	{
		if (nodes[i].id == "writeroot" || nodes[i].id == "section_header_id" || nodes[i].id == "readroot")
			continue;
		
		if( document.getElementById('i_'+nodes[i].id).value == UPC )
		{
			return nodes[i].id;
			break;
		}
		
		//alert(nodes[i].id);
	}
	
	return -1;
}
// checks the key that is pressed, basicly checking the enter key
function keyEvent(event, setFocus)
{
	if (!setFocus)
		setFocus = false;

	//alert(event);
	if(event.keyCode==13)
	{
		if (setFocus)
			document.getElementById('UPC_scanner').focus();
		else
		{
			if (document.getElementById('UPC_scanner').value != "" && document.getElementById('UPC_scanner').value.length > 0)
				searchPosIventory();
			else
				enterSale(false);
		}
	}
	else
	{
		return false;
	}
}
function discountChange(field)
{
	// clear the opsite field
	if (field.id == 'other_3')
		document.getElementById('other_2').value = '';
	else if (field.id == 'other_2')
		document.getElementById('other_3').value = '';
		
	check_due(true);
}

function updateProdQTY(exists, qty)
{
	if (!exists)
		return false;
		
	if (qty)
		var new_qty = qty;
	else
		var new_qty = parseInt(document.getElementById('q_'+exists).value)+1;
		
	var old_total = parseFloat(document.getElementById('t_'+exists).value);
	var prod_price = parseFloat(document.getElementById('c_'+exists).value);
	var old_sub_total = parseFloat(document.getElementById('sub_total').value);
	var old_wic_total = parseFloat(document.getElementById('wic_total').value);
	var old_ebt_total = parseFloat(document.getElementById('ebt_total').value);
	
	if (document.getElementById('tb_'+exists).value == '1')
	{
		var old_sub_tax = parseFloat(document.getElementById('sub_tax').value);
		var old_prod_tax = parseFloat(document.getElementById('ta_' + exists).value);

		var new_prod_tax = (new_qty * prod_price)*(CONF_taxRate/100);
		var new_total = (new_qty * prod_price) + new_prod_tax;
		
		document.getElementById('ta_'+exists).value = CurrencyFormatted( new_prod_tax );
		document.getElementById('sub_tax').value = CurrencyFormatted( old_sub_tax - old_prod_tax + new_prod_tax );
	}
	else
	{
		var new_total = new_qty * prod_price;
	}
	
	document.getElementById('q_'+exists).value = new_qty;
	document.getElementById('t_'+exists).value = CurrencyFormatted( new_total );
	document.getElementById('sub_total').value = CurrencyFormatted(old_sub_total - old_total + new_total);
	
	//update the wic total
	if (document.getElementById('wic_'+exists).value == '1')
	{
		document.getElementById('wic_total').value = CurrencyFormatted(old_wic_total - old_total + new_total);
		//document.getElementById('pos_wic_sales').style.display = '';
	}
	
	//update the ebt total
	if (document.getElementById('ebt_'+exists).value == '1')
	{
		document.getElementById('ebt_total').value = CurrencyFormatted(old_ebt_total - old_total + new_total);
		//document.getElementById('pos_ebt_sales').style.display = '';
	}
	
	made_changes = true;
	check_due(true);
}

function searchPosIventory(currentValue) // gets an item information based on the barcode
{
	// set the company name pole diplay timeout to zero because we started another transaction
	clearTimeout(poleNameTimeout);
	
	// check if that item is already on the list
	if (!currentValue)
		var currentValue = document.getElementById('UPC_scanner').value;
		
	// check if the product is already in the receipt
	var exists = 0;
	exists = onReceipt(currentValue);

	// if it is, then no need to search just update the qty
	if (exists > -1)
	{
		// clear the keypad
		if (document.getElementById('invoice_type').value == 'touchPOS_invoice')
			cancelSale();
		
		// update the QTY
		updateProdQTY(exists);
	}
	else
	{
		// clear the keypad
		if (document.getElementById('invoice_type').value == 'touchPOS_invoice')
			cancelSale();
			
		// get the total
		$total = document.getElementById('sub_total').value;
		
		// search for the UPC code
		var h = new invoice(searchPosIventoryHandler);
		h.search_pos_inventory( currentValue, $total);
	}
	
	// clear the scanner and set the focus to that field
	document.getElementById('UPC_scanner').value = '';
	document.getElementById('UPC_scanner').focus();
	
}
var searchPosIventoryHandler = {
	search_pos_inventory: function(result)
	{
		if (result[0] == 'fail')
		{
			alert(result[1]);
		}
		else if(result[0] == 'newItem')
		{
			var newInventoryWindow = window.open("new_inventory_product.php?who=invoice&UPC_code="+result[1], "new_inventory_popup", "width=350, height=350, status=0, toolbar=0, resizable=0, menubar=0");
			newInventoryWindow.focus();
		}
		else
		{
			var field_id = moreFields();
			document.getElementById('id_'+field_id).value = result[1]['inventory_id'];
			document.getElementById('i_'+field_id).value = result[1]['UPC_code'];
			document.getElementById('q_'+field_id).value = 1;
			document.getElementById('p_'+field_id).value = result[1]['description'];
			document.getElementById('c_'+field_id).value = CurrencyFormatted(result[1]['sale_price']);
			document.getElementById('t_'+field_id).value = CurrencyFormatted(result[1]['sale_price']);
			document.getElementById('tb_'+field_id).value = result[1]['taxable'];
			document.getElementById('wic_'+field_id).value = result[1]['wic_item'];
			document.getElementById('ebt_'+field_id).value = result[1]['ebt_item'];
			
			if (result[1]['taxable'] == 1)
			{
				var taxamount = document.getElementById('t_'+field_id).value * (CONF_taxRate/100);
				
				document.getElementById('ta_'+field_id).value = CurrencyFormatted( taxamount );
				document.getElementById('sub_total').value = CurrencyFormatted( parseFloat(document.getElementById('sub_total').value) + parseFloat(result[1]['sale_price']) );
				document.getElementById('sub_tax').value = CurrencyFormatted( parseFloat(document.getElementById('sub_tax').value) + taxamount );
			} else {
				document.getElementById('ta_'+field_id).value = '0.00';
				document.getElementById('sub_total').value = CurrencyFormatted( parseFloat(document.getElementById('sub_total').value) + parseFloat(result[1]['sale_price']) );
			}
			
			// if its a wic item, or ebt item set the wic/ebt total to the product price, ignoring taxing
			// because "updateProdQTY()" will take care of doing the correct calculations
			if (result[1]['wic_item'] == 1)
			{
				document.getElementById('wic_total').value = CurrencyFormatted( parseFloat(document.getElementById('wic_total').value) + parseFloat(result[1]['sale_price']) );
			
				if (document.getElementById('sale_highlight').value == 'wic')
					document.getElementById('wic_'+field_id).parentNode.style.backgroundColor = '#FFFF99';
			}
			if (result[1]['ebt_item'] == 1)
			{
				document.getElementById('ebt_total').value = CurrencyFormatted( parseFloat(document.getElementById('ebt_total').value) + parseFloat(result[1]['sale_price']) );
			
				if (document.getElementById('sale_highlight').value == 'ebt')
					document.getElementById('ebt_'+field_id).parentNode.style.backgroundColor = '#99FFFF';
			}
			
			made_changes = true;
			check_due(true);
			updateProdQTY(field_id, 1);
		}
	}
}