/*
	Copyright (C) 2008 - Juan Ferrer Toribio

	This program is free software; you can redistribute it and/or
	modify it under the terms of the GNU Lesser General Public
	License as published by the Free Software Foundation; either
	version 2.1 of the License, or (at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
	Lesser General Public License for more details.

	You should have received a copy of the GNU Lesser General Public
	License along with this program; if not, write to the Free
	Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
	02111-1307 USA.
*/

var ORDER_ID = 8;

var VnOrder = new Class
({
	Extends: VnModule,

	activate: function (id)
	{
		var n, m;
		var div;
		var table;
		var colgroup;
		var col;
		var tbody;
		var tr;
		var td;
		var a;
		var img;
		var row;
		var input;
		var select;
		var option;
		var textarea;
		var label;
		var stmt;
		var model;
		var data;
		var calendar;
		var renderer;
		var rendspin;
		var rendprice;
		var rendedit;
		var rendImage;
		var treeview;
		var foot;
		var form;
		var entry;
		var gui = this.gui
		var db = this.db;
		var orderId = gui.getData (VnOrders);
		var vbox;
		var frame;
		var hbox;
		var box;

		if (id == null)
			id = orderId;
			
		vbox = new HtkVBox ();
		this.setChild (vbox);
	
// Action
		
		hbox = new HtkHBox ();
		hbox.setSize (260, -1);
		vbox.add (hbox, false);
		
		model = new DbModel (db);
		model.setUpdatable ('order_view');
		
		stmt = new SqlString (
			'SELECT date_make, date_send, type_id, wh_id, note, pay_cash, insurance, address_id, id ' +
				'FROM order_view WHERE id = %s'
		);
		stmt.addValue (id);
		model.setStmt (stmt);

		n = 0;
		form = new DbForm (model);
		form.setRow (0);
		
		frame = new HtkFrame (TEXT_Actions);
		hbox.add (frame, false);

		table = document.createElement ('table');
		table.style.borderCollapse = 'separate';
		table.cellSpacing = '4px';
		frame.setChild (table);

		tbody = document.createElement ('tbody');
		table.appendChild (tbody);

		tr = new VnOrdersAction (TEXT_Confirm, 'confirm.png', this, this.confirmClicked);
		tbody.appendChild (tr.getNode ());

		tr = new VnOrdersAction (TEXT_Close, 'close.png', this, this.closeClicked);
		tbody.appendChild (tr.getNode ());

		tr = new VnOrdersAction (TEXT_Catalog, 'catalog.png', this, this.catalogClicked);
		tbody.appendChild (tr.getNode ());

		tr = new VnOrdersAction (TEXT_Exit, 'exit.png', this, this.exitClicked);
		tbody.appendChild (tr.getNode ());

		tr = new VnOrdersAction (TEXT_Delete, 'delete.png', this, this.delClicked);
		tbody.appendChild (tr.getNode ());

// Data
		
		frame = new HtkFrame (TEXT_Data);
		hbox.add (frame, true);

		table = document.createElement ('table');
		table.style.borderCollapse = 'separate';
		table.cellSpacing = 3;
		frame.setChild (table);

		colgroup = document.createElement ('colgroup');
		table.appendChild (colgroup);

		col = document.createElement ('col');
		col.style.width = '150px';
		colgroup.appendChild (col);

		col = document.createElement ('col');
		colgroup.appendChild (col);

		tbody = document.createElement ('tbody');
		table.appendChild (tbody);

		tr = document.createElement ('tr');
		tbody.appendChild (tr);

		td = document.createElement ('td');
		td.style.textAlign = 'right';
		tr.appendChild (td);

		label = document.createElement ('label');
		label.appendChild (document.createTextNode (TEXT_Id + ':'));
		td.appendChild (label);

		td = document.createElement ('td');
		td.appendChild (document.createTextNode (id));
		tr.appendChild (td);

		tr = document.createElement ('tr');
		tbody.appendChild (tr);

		td = document.createElement ('td');
		td.style.textAlign = 'right';
		tr.appendChild (td);

		label = document.createElement ('label');
		label.appendChild (document.createTextNode (TEXT_DateMake + ':'));
		td.appendChild (label);

		td = document.createElement ('td');
		tr.appendChild (td);

		entry = new HtkDate ();
		form.bindParam (entry, n++);
		td.appendChild (entry.getNode ());

		tr = document.createElement ('tr');
		tbody.appendChild (tr);

		td = document.createElement ('td');
		td.style.textAlign = 'right';
		tr.appendChild (td);

		label = document.createElement ('label');
		label.appendChild (document.createTextNode (TEXT_ShipCollect + ':'));
		td.appendChild (label);

		td = document.createElement ('td');
		tr.appendChild (td);
		
		entry = new HtkDate ();
		entry.setEditable (true);
		entry.format = DATE_FORMAT_FULL_DATE;
		form.bindParam (entry, n++);
		td.appendChild (entry.getNode ());

		tr = document.createElement ('tr');
		tbody.appendChild (tr);

		td = document.createElement ('td');
		td.style.textAlign = 'right';
		tr.appendChild (td);

		label = document.createElement ('label');
		label.appendChild (document.createTextNode (TEXT_Type + ':'));
		td.appendChild (label);

		td = document.createElement ('td');
		tr.appendChild (td);

		model = new DbModel (db);
		model.setSql ('SELECT Id_Agencia, Agencia FROM vn2008.Agencias WHERE vista != 0 ORDER BY Agencia');

		select = new HtkSelect (model);
		form.bindParam (select, n++);
		select.style.maxWidth = '200px';
		td.appendChild (select.getNode ());

		tr = document.createElement ('tr');
		tbody.appendChild (tr);

		td = document.createElement ('td');
		td.style.textAlign = 'right';
		tr.appendChild (td);

		label = document.createElement ('label');
		label.appendChild (document.createTextNode (TEXT_Warehouse + ':'));
		td.appendChild (label);

		td = document.createElement ('td');
		tr.appendChild (td);

		model = new DbModel (db);
		model.setSql ('SELECT id, name FROM vn2008.warehouse WHERE fuente = FALSE ORDER BY name');

		select = new HtkSelect (model);
		form.bindParam (select, n++);
		select.style.maxWidth = '200px';
		td.appendChild (select.getNode ());

		tr = document.createElement ('tr');
		tbody.appendChild (tr);

		td = document.createElement ('td');
		td.style.textAlign = 'right';
		tr.appendChild (td);

		label = document.createElement ('label');
		label.appendChild (document.createTextNode (TEXT_Notes + ':'));
		td.appendChild (label);

		td = document.createElement ('td');
		tr.appendChild (td);

		textarea = new HtkTextArea ();
		form.bindParam (textarea, n++);
		td.appendChild (textarea.getNode ());

		tr = document.createElement ('tr');
		tbody.appendChild (tr);

		td = document.createElement ('td');
		td.style.textAlign = 'right';
		tr.appendChild (td);

		label = document.createElement ('label');
		label.appendChild (document.createTextNode (TEXT_Payment + ':'));
		td.appendChild (label);

		td = document.createElement ('td');
		tr.appendChild (td);

		input = new HtkCheck ();
		form.bindParam (input, n++);
		td.appendChild (input.getNode ());
		
		td.appendChild (document.createTextNode (TEXT_Cash));

		tr = document.createElement ('tr');
		tbody.appendChild (tr);

		td = document.createElement ('td');
		tr.appendChild (td);

		td = document.createElement ('td');
		tr.appendChild (td);

		input = new HtkCheck ();
		form.bindParam (input, n++);
		td.appendChild (input.getNode ());
		
		td.appendChild (document.createTextNode (TEXT_Insurance));

// Address

		renderer = new HtkCellRendererText ();
		rendspin = new HtkCellRendererSpin ();
		
		entry = new HtkTable ();
		form.bindParam (entry, n++);

		n = 0;
		treeview = entry.treeview;
		treeview.setSize (78, -1);
		treeview.appendColumn (++n, renderer, TEXT_Province);
		treeview.appendColumn (++n, rendspin, TEXT_PC);
		treeview.appendColumn (++n, renderer, TEXT_City);
		treeview.appendColumn (++n, renderer, TEXT_Street);
		vbox.add (treeview, false);
		
		model = new DbModel (db);
		model.setSql ('SELECT id, province, zip_code, city, name FROM vn_address_view');
		entry.setModel (model);

// Movement

		rendImage = new HtkCellRendererImage ();
		rendImage.url = '';

		rendprice = new HtkCellRendererSpin ();
		rendprice.unit = '€';
		rendprice.digits = 2;
		
		rendedit = new HtkCellRendererSpin ();
		rendedit.style.width = '40px';
		rendedit.editable = true;

		n = 0;
		treeview = new HtkTreeView ();
		treeview.appendColumnWithFunc (this.availableRenderer, rendImage, '');
		treeview.appendColumn (++n, rendedit, TEXT_Amount);
		treeview.appendColumn (++n, rendspin, TEXT_Aval);
		treeview.appendColumn (++n, renderer, TEXT_Name);
		treeview.appendColumn (++n, rendspin, TEXT_Siz);
		treeview.appendColumn (++n, rendspin, TEXT_Stems);
		treeview.appendColumn (++n, renderer, TEXT_Color);
		treeview.appendColumn (++n, renderer, TEXT_Cat);
		treeview.appendColumn (++n, renderer, TEXT_Pack);
		treeview.appendColumn (++n, renderer, TEXT_Origin);
		treeview.appendColumn (++n, rendprice, TEXT_Price);
		treeview.appendColumn (++n, rendspin, TEXT_Disc);
		treeview.appendColumnWithFunc (this.subtotalRenderer, rendprice, TEXT_Subtotal);
		vbox.add (treeview, true);

		model = new DbModel (db);
		model.setView ('m', 'order_row_view');
		model.setUpdatable ('order_row_view');
		treeview.setModel (model);

		stmt = new SqlString ("CALL item (%s, %s)");
		stmt.addParam (form.getParam (3));
		stmt.addParam (form.getParam (1));
		model.addPreStmt (stmt);

		stmt = new SqlString (
			'SELECT m.id, m.amount, available, Article, Medida, Tallos, ' +
			'Color, Categoria, Grouping, o.Abreviatura, price, discount, fixed ' +
				'FROM order_row_view m ' +
				'INNER JOIN vn2008.Articles a ON a.Id_Article = m.item_id ' +
				'LEFT JOIN item c ON c.item_id = m.item_id ' +
				'LEFT JOIN vn2008.Origen o ON a.id_origen = o.id ' +
					'WHERE m.order_id = %s'
		);
		stmt.addValue (id);
		model.setStmt (stmt);

		foot = document.createElement ('tr');
		treeview.setFoot (foot);

		td = document.createElement ('td');
		td.colSpan = ++n;
		td.style.textAlign = 'right';
		td.appendChild (document.createTextNode (TEXT_OrderTotal + ':'));
		foot.appendChild (td);

		td = document.createElement ('td');
		td.style.textAlign = 'right';
		td.style.paddingRight = '8px';
		foot.appendChild (td);

		entry = new VnOrderSubtotal (vnOrderSubtotal);
		model.addForeach (entry);
		td.appendChild (entry.getNode ());

		td = document.createElement ('td');
		foot.appendChild (td);
		
		this.entryTotal = entry;
		this.form = form;
	},

	subtotalRenderer: function (renderer, row)
	{	
		renderer.value = vnOrderSubtotal (row);
	},
	
	availableRenderer: function (renderer, row)
	{
		if (row[1] > row[2])
			renderer.value = 'unavailable';
		else
			renderer.value = 'invisible';
	},

	confirmClicked: function ()
	{	
		new VnOrdersConfirmAction (this.gui, this.form.getValue (ORDER_ID));
	},
	
	catalogClicked: function ()
	{
		this.gui.setData (VnOrders, this.form.getValue (ORDER_ID));
		this.gui.openModule (VnCatalog);
	},

	closeClicked: function ()
	{
		this.gui.clearData (VnOrders);
		this.gui.openModule (VnOrders);
	},

	exitClicked: function ()
	{
		this.gui.openModule (VnOrders);		
	},

	delClicked: function ()
	{
		if (confirm (TEXT_SureDelOrder))
		{
			var gui = this.gui;
			var form = this.form;
		
			if (gui.getData (VnOrders) == form.getValue (ORDER_ID))
				gui.clearData (VnOrders);
		
			form.delRow ();
			gui.openModule (VnOrders);
		}
	}
});

var VnOrderSubtotal = new Class
({
	Extends: HtkSpin,
	Implements: DbModelForeach,
	
	initialize: function (func)
	{
		this.parent ();
		this.unit = '€';
		this.digits = 2;
		this.func = func;
	},

	pre: function (row)
	{
		this.subtotal -= this.func (row);
	},
	
	post: function (row)
	{
		this.subtotal += this.func (row);
	},
	
	init: function ()
	{
		this.subtotal = 0;
	},
	
	done: function ()
	{
		this.setValue (this.subtotal);
	}
});

function vnOrderSubtotal (row)
{
	return row[10] * row[1] * ((100 - row[11]) / 100);
}


