/**
 * Could (should) tidy this up to move the Quote/Invoice etc Specific
 * functionality into seperate files.
 *
 *
 * Karl - 20/5/2011
 */


$(function() {


	/**
	 * A more generic way of handling the HABTM <ul> <li>[REMOVE BUTTON] NAME [HIDDEN INPUT]</li> </ul>
	 * Copypasta'd from add_edit_shipment.js. 
	 */
	function addToList(modelName, id, value, ULelement) {
		var thisLI = $('<li></li>');
		var thisButton = $('<button>X</button>');
		thisButton.addClass('removeFromList');
		thisButton.button();

		var thisHiddenInput = $('<input type="hidden">');

		var modelString = '['+modelName+']';

		thisHiddenInput.attr('name', 'data[PurchaseOrder]'+modelString+'[]');

		thisHiddenInput.attr('value', id);

		thisLI.attr('id', modelName+'ID_'+id);
		thisLI.html(value);
		thisLI.prepend(thisButton);
		thisLI.append(thisHiddenInput);
		ULelement.append(thisLI);



	}


	//Remove X button clicked.
	$('.removeFromList').live('click', function() {
		$(this).parent().remove();
	});




	// var config defined in global.js
	loadLineItems();
	var docID = $('#documentID').html();



	$("#lineItemDetails").hide();

	$( "#addLineItemModal" ).dialog({
		autoOpen: false,
		height: 900,
		width: 600,
		modal: true,
		buttons: {
			"Add Line Item": function() {

				$('#LineItemDescription').ckeditor(function() {
					this.updateElement();
				});


				var thisLineItemInputs = $('#LineItemAddForm').find('input,select,textarea');

				$.post('/line_items/ajax_add', thisLineItemInputs, function(data) {

					if(data == 'SUCCESS') {
						loadLineItems();
						$( "#addLineItemModal" ).dialog('close');
					}
					else {
						alert("Line Item could not be saved")
						$('#LineItemDescription').ckeditor(config);
					}

				});

			},
			Cancel: function() {
				$( this ).dialog( "close" );
			}
		},
		close: function() {
			loadLineItems();
		}

	});

	$( "#editLineItemModal" ).dialog({
		autoOpen: false,
		height: 900,
		width: 600,
		modal: true,
		buttons: {
			"Edit Line Item": function() {
				$('#LineItemDescription').ckeditor(function() {
					this.updateElement();
				});

				var thisLineItemInputs = $('#LineItemEditForm').find('input,select,textarea');

				$.post('/line_items/ajax_edit', thisLineItemInputs, function(data) {
					if(data == 'SUCCESS') {
						$( "#editLineItemModal" ).dialog('close');
					}
					else {
						alert("Line Item could not be saved")
						$('#LineItemDescription').ckeditor(config);
					}
				});

			},
			Cancel: function() {
				$( "#editLineItemModal" ).dialog('close');

			}
		},
		close: function() {
			loadLineItems();

		}
	});


	$( "#QuoteDetails" ).dialog({
		autoOpen: false,
		height: 900,
		width: 600,
		modal: true,
		buttons: {
			"Edit Quote Details": function() {


				$('#QuoteCommercialComments').ckeditor(function() {
					this.updateElement();
					this.destroy();
				});


				var quoteInputs = $('#QuoteEditForm').find('input,select,textarea');

				$.post('/quotes/ajax_edit', quoteInputs, function(data) {
					$( "#QuoteDetails" ).dialog('close');
				});

			},
			Cancel: function() {
				$( this ).dialog( "close" );

			}
		},
		close: function() {
			loadLineItems();
		}
	});



	$( "#addJobConfirmation" ).dialog({
		autoOpen: false,
		height: 400,
		width: 400,
		modal: true,
		buttons: {
			"Create Order Acknowledgement": function() {

				var documentID = $("#documentID").html();

				//window.location.href = "/documents/convert_to_oa/"+documentID;
				//var newOAform = $('#DocumentConvertToOaForm').find('input');
				var newOAform = $('#DocumentConvertToOaForm');
				newOAform.submit();



				/*$.post('/documents/convert_to_oa', newOAform, function(data) {
				  if(data =='SUCCESS') {
				  $("#flashMessage").html("Invoice Saved Successfully");
				  }
				  else {
				  $("#flashMessage").html("Unable to Save Invoice");
				  }

				  $("#flashMessage").show();


				  loadLineItems();
				  });
				  */


			},
			Cancel: function() {
				$( this ).dialog( "close" );

			}
		},
		close: function() {
		}
	});


	$("#pageContentFactory").hide();


	//Add a new Page Element.
	$("#addPage").button().click(function(event) {
		event.preventDefault();

		newPage(false);
		return false;
	});


	//Open the LineItem dialog
	$(".addLineItem").button().click(function() {



		$('#LineItemDescription').ckeditor(function() {
			this.destroy();
		});


		$("#editLineItemModal").empty();



		var nextItemNo = $(".lineItem").length;
		nextItemNo++;

		$.get('/line_items/add/'+docID, function(data) {
			$("#addLineItemModal").html(data);


			$("#LineItemItemNumber").val(nextItemNo); //Auto fill in the next Item No


			$("#productDetails").hide();

			$('#LineItemDescription').ckeditor(config);

			showHideTextPrices();

			$( "#addLineItemModal" ).dialog('open');

		});

		return false;
	});


	$(".editLineItem").live('click', function() {


		$('#LineItemDescription').ckeditor(function() {
			this.destroy();
		});

		$("#addLineItemModal").empty();

		var thisLineItemID = $(this).parent('td').attr('id');
		$.get('/line_items/edit/'+thisLineItemID, function(data) {
			$("#editLineItemModal").html(data);
			$("#productDetails").hide();
			$('#LineItemDescription').ckeditor(config);
			showHideTextPrices();
			$( "#editLineItemModal" ).dialog('open');

		});
	});


	var products = {};
	$("#principleSelect").live('change',function() {


		var principleID = getSelectedID('#principleSelect');

		$("#productDetails").hide();

		$.get('/documents/getProducts/'+principleID, function(data) {
			$('#productsDiv').html(data);

			var resp = $(data).filter(".products_json");
			products = jQuery.parseJSON(resp.html());

		});
	});


	//Search for a Product 
	$("#productSearch").live('change', function() {
		productSearch();
	});

	$("#productSearchButton").live('click', function() {
		productSearch();
	});

	function productSearch() {
		var searchVal = $("#productSearch").val();
		searchVal = searchVal.toLowerCase();
		var param = "term="+searchVal;

		$.getJSON("/products/autocomplete", param, function(data) {
	
			$("#productList").empty();

			for(var id in data) {
				var link = "<li><a href=\"#\" class=\"search_product\" data-product-id=\""+id+"\">"+data[id]+"</a></li>";
				$("#productList").append(link);
			}
		});
	}

	//Click on a search product name. 
	$(".search_product").live('click', function() {
		var productID = $(this).data('product-id');
		getProductDetails(productID);
		return false;
	});

	$("#productSelect").live('change',function() {

		var productID = getSelectedID('#productSelect');

		getProductDetails(productID);

	});

	function getProductDetails(productID) {
		$.get('/documents/getProductDetails/'+productID, function(data) {

			$("#lineItemDetails").show();
			$("#LineItemProductId").val(data.id);
			$("#LineItemTitle").val(data.title);

			var descText = '';
			if(data.item_code) {
				descText = descText + '<br><b>Item Code:</b> ' + data.item_code;
			}

			if(data.item_description) {
				descText = descText + '<br><b>Item Description:</b> ' + data.item_description + '<br>';

			}

			descText = descText + data.description;

			$("#LineItemDescription").val(descText);




		}, "json");
	}

	//Autocomplete product title for adding lineItem
	

	
	$( "#productAutocomplete" ).live('focus', function() {
		$(this).autocomplete({
			source: "/products/autocomplete",
			minLength: 2,
			select: function( event, ui ) {
				console.log(ui);
			},
			appendTo: '#searchProducts'
		});
	});

	$("#productAutocomplete").insertAfter();

	// Initialize the editor.
	// Callback function can be passed and executed after full instance creation.
	$('.page').ckeditor(config);


	$("#LineItemHasTextPrices").live('change', function() {
		showHideTextPrices();
	});


	//Remove this Page
	$(".removePage").live('click',function() {

		$('.page').ckeditor(function() {
			this.destroy();
		});

		$(this).parents(".docPage").remove();

		$('.page').ckeditor(config);

	});


	$("#savePages").click(function() {
		savePages();

	});

	var timeoutID = window.setTimeout(savePages, 30000);


	$(".quickpricing").live('change', function() {
		calculateQuickPrices();
	});


	$('.removeLineItem').live('click', function() {
		var thisLineItemID = $(this).parent('td').attr('id');
		$.post('/line_items/ajax_delete/'+thisLineItemID, function(data) {
			loadLineItems();
		});
	});


	$("#editQuoteDetails").click(function() {
		var quoteID = $("#quoteID").html();

		$('#QuoteCommercialComments').ckeditor(function() {
			this.destroy();
		});

		$.get('/quotes/edit/'+quoteID, function(data) {
			$("#QuoteDetails").html(data);
			$('#QuoteCommercialComments').ckeditor(config);
			$("#QuoteDetails").dialog('open');
		});
	});


	$("#generateFirstPage").click(function() {

		if($(".firstPage").length == 0) {
			newPage(true);
		}
		else {
			var confirmed = confirm("This will overwrite any changes you have made to the first page");
		}

		if(confirmed) {
			$.get('/documents/generateFirstPage/'+docID, function(data) {
				$(".firstPage").val(data);
				savePages();
			});
		}

	});

	$("#pdfDocButton").click(function() {
		window.location = $(this).data('url');
	});

	$("#emailDocButton").click(function() {
		var confirmed = confirm("This will email this Document and all Attachments to the Contact. Are you sure you want to do this?");

		if(confirmed) {
			window.location = $(this).data('url');
		}
	});


	//Invoice View
	$('#shippingDetails').ckeditor(config);

	$("#DocumentBillTo").ckeditor(config);
	$("#DocumentShipTo").ckeditor(config);

	$("#saveInvoiceButton").click(function() {
		saveDocument('Invoice');
	});
	//OA  View.
	$("#saveOAButton").click(function() {
		saveDocument('Order Acknowledgement');
		//if the job has changed, the create invoice button wont work properly.
		//window.location.reload(true);
		$('.job-title').html($("#OrderAcknowledgementJobId :selected").text());
	});


	//This is fucked beyond all words. 
	$("#PurchaseOrderDeliverTo").ckeditor(config);
	$("#PurchaseOrderOrderedFrom").ckeditor(config);
	$("#PurchaseOrderShippingInstructions").ckeditor(config);
	$("#PurchaseOrderDescription").ckeditor(config);

	//PackingList View. Damn you past Karl.
	$("#savePackingListButton").click(function() {
		saveDocument('Packing List');
		//if the job has changed, the create invoice button wont work properly.
		//window.location.reload(true);
		$('.job-title').html($("#PackingListJobId :selected").text());
	});


	//PurchaseOrder View. Damn you past Karl.
	$("#savePurchaseOrderButton").click(function() {
		saveDocument('Purchase Order');
	});




	$("#createOA").click(function() {
		$("#addJobConfirmation").dialog('open');
	});

	$(".button-link").click(function() {
		location.href = $(this).data('href');	
	});

	//Choosing an address
	$(".billing_address").click(function() {
		var address = $(this).next().html();
		setAddress(address, '#DocumentBillTo', 'Bill To');	
	});
	$(".shipping_address").click(function() {
		var address = $(this).next().html();
		setAddress(address, '#DocumentShipTo', 'Ship To');	
	});



	//Fuck it. Copypaste. Autocompletion of jobs on PO document view
	$( "#job_autocomplete" ).autocomplete({
		source: "/jobs/autocomplete",
		minLength: 2,
		select: function( event, ui ) {

			if($('#JobID_'+ui.item.id).length == 0) { //This Job is not already in the List.
				addToList('Job', ui.item.id, ui.item.value, $('#jobsList'));

				var jobs_val = $("#PurchaseOrderJobsText").val();

				$("#PurchaseOrderJobsText").val(jobs_val +', '+ ui.item.value)	
				console.log(ui.item.id);
				console.log(ui.item.value);
				//POST the job ID to a method on the documents controller to add the LineItems
				$.post('/documents/add_job_items_to_po/'+ui.item.id+'/'+$("#DocumentId").val(), function(data) {

					loadLineItems();
					saveDocument('Purchase Order');


				});


			}
		}
	});



});


$('.generateCommercialComments').live('click', function(event) {
	event.preventDefault();



	var deliveryTime = $("#QuoteDeliveryTime").val();
	var deliveryTF = $("#QuoteDeliveryTimeFrame").val();
	var paymentTerms = $("#QuotePaymentTerms").val();
	var daysValid = $("#QuoteDaysValid").val();
	var deliveryPoint = $("#QuoteDeliveryPoint").val();
	var exchangeRate = $("#QuoteExchangeRate").val();
	var customsDuty = $("#QuoteCustomsDuty").val();


	deliveryTime = deliveryTime.toUpperCase();
	paymentTerms = paymentTerms.toUpperCase();
	deliveryPoint = deliveryPoint.toUpperCase();

	var commComments = $("#commCommentsInitialString").clone();

	var commList = commComments.find('ol');

	commList.append('<li>DELIVERY IS ESTIMATED AT '+deliveryTime+ ' '+deliveryTF+ ' FROM RECEIPT OF YOUR TECHNICALLY AND COMMERCIALLY CLEAR ORDER');
	commList.append('<li>PAYMENT TERMS: '+paymentTerms+'</li>');
	commList.append('<li>QUOTATION IS VALID <u>FOR '+daysValid+' DAYS</li>');
	commList.append('<li>ALL PRICES ARE <u>'+deliveryPoint+'</u></li>');
	commList.append('<li>EXCHANGE RATE: '+exchangeRate+'</u></li>');
	commList.append('<li>CUSTOMS DUTY INCLUDED AT: '+customsDuty+'</li>');
	commList.append('<li>GST 10% EXTRA</li>');
	commList.append('<li>WHEN PAYMENTS ARE MADE INTO OUR BANK ACCOUNT, BANK CHARGES ARE YOUR RESPONSIBILITY</li>');
	$('#QuoteCommercialComments').val(commComments.html());


});


//Save the current document
//@param string documentName for message
function saveDocument(documentName) {
	updateTextFields(); //Update the CKEditor instances.
	var fields = $('#DocumentEditForm').find('input,select,textarea');

	$.post('/documents/ajax_edit', fields, function(data) {
		if(data =='SUCCESS') {
			$("#flashMessage").html(documentName+" saved Successfully");
		}
		else {
			$("#flashMessage").html("Unable to save "+documentName);
		}
		$("#flashMessage").show();
		loadLineItems();
	});
}


//Set the address given the addressFieldID and a label FieldName
function setAddress(address, addressFieldID, fieldName) {
	console.log(address);
	if($(addressFieldID).val() == '') {
		$(addressFieldID).val(address);
	} 
	else {	
		var c = confirm("Set " + fieldName+  " to this address?");
		if(c) {
			$(addressFieldID).val(address);
		}
	}
}

function showHideTextPrices() {
	if( $('#LineItemHasTextPrices').val() == 1) {
		$("#noCosting").hide();
		$("#noCosting").find('input').val('');
		$("#textPrices").show();
	}
	else {
		$("#noCosting").show();
		$("#textPrices").hide();
	}
}


//I am a much better programmer now.
//FUCK YEAH!!
function updateTextFields() {
	var fields = [
		'#shippingDetails',
		"#DocumentBillTo",
		"#DocumentShipTo",
		"#PurchaseOrderDeliverTo",
		"#PurchaseOrderOrderedFrom",
		"#PurchaseOrderShippingInstructions",
		"#PurchaseOrderDescription"
	];

	for (i in fields) {	
		$(fields[i]).ckeditor(function() {
			this.updateElement();
		});
	}
}


function newPage(firstPage) {


	$('.page').ckeditor(function() {
		this.destroy();
	});



	var newPage = $('#pageContentFactory').clone();
	newPage.removeAttr('id');
	newPage.show();



	var pageCount = $('.docPage').length;

	//alert(pageCount);

	pageCount++;
	var model = 'DocPage';
	var field = 'content';
	var ID = getCakeID(model,pageCount, field);
	var name = getCakeName(model, pageCount, field);

	newPage.find('label').attr('for', ID);

	newPage.find('textarea').attr('id', ID).attr('name', name);
	newPage.addClass('docPage');


	if(firstPage == true) {
		newPage.find('textarea').addClass('firstPage');
	}


	var hiddenName = getCakeName(model, pageCount, 'page_number');

	newPage.append('<input type="hidden" name="'+hiddenName+'" value="'+pageCount+'">');
	$('.pages').append(newPage);

	$('.page').ckeditor(config);
}

function savePages() {
	var docPages = $('#DocumentEditForm').find('input,select,textarea');

	$('.page').ckeditor(function() {
		this.updateElement();
	});

	$.post('/documents/ajax_edit', docPages, function(data) {
		$("#flashMessage").html("Document saved");
		$("#flashMessage").show();
		loadLineItems();
	});
}


function loadLineItems() {
	var documentID = $("#documentID").html();

	/*$.get('/line_items/getTable/'+documentID, function(data) {
	  $("#lineItems").html(data);
	  });*/

	$.ajax({
		url: '/line_items/getTable/'+documentID,
		cache: false,
		success: function(data) {
			$("#lineItems").html(data);
		}
	});

}


function calculateQuickPrices() {

	var quantity = $('#LineItemQuantity').val();

	var gross_unit_price = $("#LineItemGrossUnitPrice").val();
	var net_unit_price = $("#LineItemNetUnitPrice").val();
	var discount_percent = $("#LineItemDiscountPercent").val();
	var discount_amount_unit = $("#LineItemDiscountAmountUnit").val();
	var discount_amount_total = $("#LineItemDiscountAmountTotal").val();
	var gross_price = $("#LineItemGrossPrice").val();
	var net_price = $("#LineItemNetPrice").val();

	gross_price = quantity * gross_unit_price;
	$("#LineItemGrossPrice").val(gross_price);

	discount_amount_unit = (discount_percent/100) * gross_unit_price;
	discount_amount_unit = discount_amount_unit.toFixed(2);

	discount_amount_total = (discount_percent/100) * gross_price;
	discount_amount_total = discount_amount_total.toFixed(2);
	$("#LineItemDiscountAmountTotal").val(discount_amount_total);

	net_price = gross_price - discount_amount_total;
	$("#LineItemNetPrice").val(net_price);


	$("#LineItemDiscountAmountUnit").val(discount_amount_unit);
	net_unit_price = gross_unit_price - discount_amount_unit;
	$("#LineItemNetUnitPrice").val(net_unit_price);



}


function calcNetPrice() {
	var discountPercent = $("#discountPercent").val();
	var unitPrice = $('#unitPrice').val();


	var quantity = $('#LineItemQuantity').val();


	var grossSellPrice = quantity * unitPrice;

	//Calculate the Sale Discount amount.
	var UnitDiscountAmount = (discountPercent/100) * unitPrice;

	var TotalDiscountAmount = (discountPercent/100) * grossSellPrice;
	UnitDiscountAmount = UnitDiscountAmount.toFixed(2);
	TotalDiscountAmount = TotalDiscountAmount.toFixed(2);

	$('#total_discountAmount').val(TotalDiscountAmount);
	$('#discountAmountEach').val(UnitDiscountAmount);
	$('#net_price_each').val(unitPrice - UnitDiscountAmount);

	$('#grossPrice').val(grossSellPrice);

	var netPrice = grossSellPrice - TotalDiscountAmount;
	$('#netPrice').val(netPrice);

}


function checkNaN(value) {
	if( isNaN(value) == true) {
		return 0;
	}
	else {
		return value;
	}




}
