// webapp.js
// ~~~~~~~~~
// www.reboul.fr client-side application 
// copyright (c) 2009 Mathieu Gosset (mathieu at devandco dot net)

register_namespace("webapp");

// public methods

webapp.attach_return_event = function(edit_id, handler)
{
	var el = dom.element(edit_id);
	dom.add_listener(el, "keydown", function(ev) {
		if (dom.ev_keycode(ev) == 13) {
			handler();
			ev.cancelBubble = true;
			return false;
		}
	});
}

webapp.init_search_box = function(frame_id)
{
	var box = new search_box(frame_id, "search_dropdown", dom.bind(this, 
		"display_search_hints"), dom.bind(this, "perform_search"));
	box.input_el.focus();
}

webapp.display_search_hints = function(search_box)
{
	if (this.searching)
		return;
	var text = search_box.get_text();
	if (text.length < 2) {
		search_box.show_hints(false);
		return;
	}
	this.searching = true;
	webapp.silent_exec("/search_hint?" + escape(text), function(result) {
		webapp.searching = null;
		if (result.ret_code == 'RET_SUCCESS') {
			if (!result.hints.length) {
				search_box.show_hints(false);
				return;
			}
			var formatter = function(item) {
				if (item.type == 0)
					return '<li class="hdr"/>' + unescape(item.label) + '</li>';
				else if (item.type == 2)
					return '<li class="prod"/>' + unescape(item.label) + '</li>';
				else if (item.type == 1)
					return '<li>' + unescape(item.label) + '</li>';
			};
			var click_handler = function(item) {
				if (item.type == 2)
					dom.redirect("/resultat.html?" + item.id);
				else if (item.type == 1)
					dom.redirect("/catalogue/resultats/" + item.id + ".html");
			}
			search_box.show_hints(true);
			search_box.populate(result.hints, formatter, click_handler);
			if (search_box.get_text() != text)
				webapp.display_search_hints(search_box);
		}
	});
}

webapp.perform_search = function(search_box)
{
	var text = search_box.get_text();
	if (text.length)
		dom.redirect("/recherche.html?" + escape(search_box.get_text()));
}

webapp.authenticate = function(form_id, redirect_url) 
{
	var form = dom.element(form_id);
	if (!form.elements['username'].value.length || !form.elements['password'].
		value.length)
		this.message_box("warning", "Vous devez indiquer une adresse email "
			+ "(ou votre code client) ainsi qu'un mot de passe !", 
			[ACTION_RETRY]);
	else this.send_form("/authenticate", form, {"redirect" : redirect_url, 
		"error" : "Les identifiants que vous avez indiqué ne sont pas "
		+ "valides ! "});
}

webapp.remind_password = function(form_id)
{
	webapp.message_box("warning", "Indiquez votre adresse e-mail ou code client"
		+ " dans le champ, puis cliquez de nouveau sur 'mot de passe oublié'", 
		[ACTION_RETRY]);
}

webapp.signup = function(form_id, redirect_url) 
{
	var form = dom.element(form_id);
	if (!form.elements['username'].value.length) {
		this.message_box("warning", "Vous devez indiquer une adresse e-mail !", 
			[ACTION_RETRY]);
	} else this.send_form("/check_account", form, {"success_action" : 
		function(result) {dom.redirect(result.redirect);}, "error" : 
		"Un compte utilisateur existe déja pour cette adresse e-mail"});
}

webapp.logout = function()
{
	this.message_box("question", "La deconnexion entrainera l'annulation du "
		+ "contenu de votre panier. Etes vous sur? ", [[function(){dom.
		redirect("/espace-client/deconnexion.html");}, "oui,&nbsp;me&nbsp;"
		+ "deconnecter", 'btn_ok'], ACTION_CANCEL]);
}

webapp.update_account_info = function(form_id, create, redirect_url) 
{
	var form = dom.element(form_id);
	var checkbox = dom.element("assert");
	if (!checkbox.checked) {
		this.message_box("warning", "Vous devez cocher la case 'je certifie l'exactitude des informations'"
			, [ACTION_RETRY]);
	} else if (form.elements['password'].value.length && form.elements['password'].
		value != form.elements['password_confirmation'].value) {
		this.message_box("warning", "Le mot de passe et la confirmation de mot"
			+ " passe ne correspondent pas !", [ACTION_RETRY]);
	} else this.send_form(create ? "/create_account" : "/update_account", 
		form, {"redirect" : redirect_url, "success" : "Les modifications "
		+ "ont été enregistrées avec succès!"});
}

register_namespace("webapp.addr_book");

webapp.addr_book.initialize = function(left_page_id, right_page_id, listbox_id,
	addr_form_id, contact_form_id, addr_summary_id)
{
	this.listbox = new listbox(listbox_id, 'addrbook_');
	this.left_page = dom.element(left_page_id);
	this.right_page = dom.element(right_page_id);
	this.addr_summary = dom.element(addr_summary_id);
	this.addr_form = dom.element(addr_form_id);
	this.contact_form = dom.element(contact_form_id);
}

webapp.addr_book.current_address = function()
{
	return this.listbox.list[this.listbox.selected_index].code;
}

webapp.addr_book.edited = function()
{
	return this.edit;
}

webapp.addr_book.set_mode = function(mode)
{
	if (this.contact_form != undefined)
		dom.show(this.contact_form, mode == 'contact');
	if (this.addr_form != undefined)
		dom.show(this.addr_form, mode == 'address');
	if (mode == 'address' || mode == 'delivery')
		this.enum_addresses();
	else if (mode == 'contact')
		this.enum_contacts();
	var self = this;
	this.mode = mode;
	this.add = function() {self['add_' + mode]();};
	this.del = function() {self['delete_' + mode]();};
	this.save = function() {self['save_' + mode]();};
}

webapp.addr_book.hide_ui = function()
{
	if (this.addr_form)
		dom.show(this.addr_form, false);
	if (this.contact_form)
		dom.show(this.contact_form, false);
	dom.show(this.listbox.frame, false);
	dom.set_classname(this.right_page, "progress");
	dom.set_classname(this.left_page, "progress");
}

webapp.addr_book.enum_addresses = function(selected)
{
	var self = this;
	this.hide_ui();
	webapp.silent_exec("/enum_addresses", function(result) {
		if (result.ret_code != 'RET_SUCCESS') {
			webapp.error_box(result.ret_code);
			return;
		}
		if (self.mode == 'delivery') {
			result.addresses.splice(0, 0, {'code': '$MAIN$', 'name' : 
				"Identique à l'adresse de facturation"});
			result.addresses.push({"code" : "", "name" : "Nouvelle adresse"});
		}
		self.listbox.populate(result.addresses, function(line) {
			self.get_address(line.code);}, function() {self.no_address();});
		if (selected == undefined)
			self.listbox.select_item(0, true);
		else
			self.listbox.select_by_value('code', selected, true);
		dom.show(self.listbox.frame, true);
		dom.set_classname(self.left_page, "");
		}, true, null);
}

webapp.addr_book.no_address = function()
{
	dom.set_classname(this.right_page, "");
	dom.show(this.addr_form, false);
	this.listbox.frame.innerHTML = "Aucune adresse, pour créer une nouvelle" 
		+ " adresse de livraison cliquez sur ajouter";
}

webapp.addr_book.no_contact = function()
{
	dom.set_classname(this.right_page, "");
	dom.show(this.contact_from, false);
	this.listbox.frame.innerHTML = "Aucun contact, pour créer un nouveau  "
		+ " contact cliquez sur ajouter";
}

webapp.addr_book.get_address = function(code, edit)
{
	formutils.reset(this.addr_form);
	webapp.reset_form_errors(this.addr_form);
	dom.show(this.addr_form, code == "");
	this.edit = (edit == true) ? true : false;

	if (this.addr_summary != undefined)
		dom.show(this.addr_summary, false);

	if (code != "") {
		dom.set_classname(this.right_page, "progress");
	
		if (this.addr_summary == undefined || edit == true) {
			this.retrieve_form("/get_address?id=" + code, this.addr_form, 
				"address");
		} else {
			var self = this;
			webapp.silent_exec("/get_address?id=" + code, function(result) {
				if (result.ret_code != 'RET_SUCCESS') {
					webapp.error_box(result.ret_code);
					return;
				}
				self.addr_summary.innerHTML = "Expédier à l'adresse suivante:<br/>"
					+ '<div style="margin-top: 2px; padding: 5px; border: '
					+ 'solid 1px #E5E5E5; background: white url(\'/img/ui/'
					+ 'edit_background.gif\') no-repeat top left; width: '
					+ '210px; color: black; font-size: 11px;"/>' + result.
					address.name + '<br/>' + result.address.l1 + '<br/>'
					+ (result.address.l2 != "" ? result.address.l2 + '<br/>' 
					: '') + result.address.zip + ' ' + result.address.city + 
					'<br/>' + result.address.country.name + '</div>';
				if (code != '$MAIN$')
					self.addr_summary.innerHTML += '<a href="" class="btn_simple" '
					+ 'onclick="webapp.addr_book.edit_address(); return false;"/>'
					+ '<span>modifier</span></a>';
				dom.show(self.addr_summary, true);
				dom.set_classname(self.right_page, "");
			}, true, null);
		}
	} else {
		this.edit = true;
		dom.set_classname(this.right_page, "");
	}
}

webapp.addr_book.save_address = function(handler) 
{
	var self = this;
	if (handler == undefined)
		webapp.send_form("/update_address", this.addr_form, {"success" : 
			"L'adresse a été mise à jour", "success_action": function(result) 
			{self.enum_addresses(result.address_code);}});
	else webapp.send_form("/update_address", this.addr_form, {"success_action":
		handler});
}

webapp.addr_book.add_address = function()
{
	var len = this.listbox.list.length;
	if (!len || this.listbox.list[len - 1].code != "") {
		this.listbox.list.push({"code" : "", "name" : "Nouvelle adresse"});
		this.listbox.refresh();
		++len;
	}
	this.listbox.select_item(len - 1, true);
}

webapp.addr_book.delete_address = function()
{
	if (this.listbox.selected_index != undefined) {
		var self = this;
		webapp.message_box("question", "Etes-vous sur de vouloir supprimer "
			+ "cette adresse ?", [[function(){self.delete_address_();}, 
			"oui, supprimer", "btn_ok"], ACTION_CANCEL]);
	} else
		webapp.message_box("warning", "Le carnet d'adresse est vide!", 
			[ACTION_OK]);
}

webapp.addr_book.delete_address_ = function() 
{
	var self = this;
	var code = this.listbox.list[this.listbox.selected_index].code;
	if (code != "")
		webapp.exec("/delete_address?id=" + code, function(result) {
			if (result.ret_code != 'RET_SUCCESS') {
				webapp.error_box(result.ret_code);
				return;
			}
			self.listbox.remove_item(self.listbox.selected_index);
			modal.hide();
			}, true, null);
	else
		this.listbox.remove_item(this.listbox.selected_index);
}

webapp.addr_book.enum_contacts = function()
{
	var self = this;
	this.hide_ui();
	webapp.silent_exec("/enum_contacts", function(result) {
		if (result.ret_code != 'RET_SUCCESS') {
			webapp.error_box(result.ret_code);
			return;
		}
		self.listbox.populate(result.contacts, function(line) {
			self.get_contact(line.code);});
		self.listbox.select_item(0, true);
		dom.show(self.listbox.frame, true);
		dom.set_classname(self.left_page, "");
		}, true, null);
}

webapp.addr_book.get_contact = function(code)
{
	formutils.reset(this.contact_form);
	if (code != "") {
		dom.show(this.contact_form, false);
		dom.set_classname(this.right_page, "progress");
		this.retrieve_form("/get_contact?id=" + code, this.contact_form, 
			"contact");
	} else {
		formutils.enable(this.addr_form, true, "edit");
		formutils.reset(this.contact_form);
	}
}

webapp.addr_book.save_contact = function(redirect_url) 
{
	var self = this;
	webapp.send_form("/update_contact", this.contact_form, {"redirect": 
		redirect_url, "success" : "Le contact a été mis à jour", "success_action": 
		function(result) {self.enum_contacts(result.contact_code);}});
}

webapp.addr_book.add_contact = function()
{
	/*if (!webapp.contacts.length || webapp.contacts[this.contacts.length - 1].
		code != "") {
		this.contacts.push({"code" : "", "name" : "Nouveau contact"});
		this.populate_address_book(target_id, form_id, this.contacts,
			'select_address');
	}
	this.select_address(this.contacts.length - 1, form_id);*/
}

webapp.addr_book.retrieve_form = function(url, form, content_key)
{
	var self = this;
	webapp.silent_exec(url, function(result) {
		if (result.ret_code != 'RET_SUCCESS') {
			webapp.error_box(result.ret_code);
			return;
		}
		formutils.populate(form, result[content_key]);
		dom.show(form, true);
		dom.set_classname(self.right_page, "");
		}, true, null);
}

webapp.addr_book.edit_address = function()
{
	this.get_address(this.current_address(), true);
}

webapp.resolve_zip_code = function(zip_code, handler)
{
	webapp.silent_exec("/cmd_resolve_zip?code=" + zip_code, function(result) {
		handler (result.ret_code == 'RET_SUCCESS' ? result.city : '');
		}, true, null);
}

webapp.select_brand = function(brand_id)
{
	if (brand_id != this.selected_brand) {
		if (this.selected_brand != undefined) {
			var prev_brand_el = dom.element("brand_" + this.selected_brand);
			dom.set_classname(prev_brand_el, "brand_button");
		}
		this.selected_brand = brand_id;
		var brand_el = dom.element("brand_" + brand_id);
		dom.set_classname(brand_el, "brand_button selected");
		return true;
	} else
		return false;
}

webapp.enum_products = function(folder_id) 
{
	if (webapp.enum_product_state != undefined) {
		webapp.enum_product_state = 'RETRY';
		return;
	} else
		webapp.enum_product_state = 'PENDING';

	var re = new RegExp("\"", 'g');
	var spec_re = new RegExp("", 'g');
	var info_el = dom.element("result_info");
	var target_el = dom.element("product_list");
	target_el.innerHTML = "";
	target_el.style.height = "300px";
	target_el.style.border = "solid 1px #E3E3E3";
	info_el.innerHTML = "recherche en cours...";
	dom.set_classname(target_el, "progress");

	var filter_values = '{"brand_id" : ' + (this.selected_brand ? this.
		selected_brand : 0) + ', "filter_inputs" : [';
	var c = 0;
	for (var key in controls) {
		var control = controls[key];
		if (control.selected() == undefined || control.selected().value == "")
			continue;
		var m = /([0-9]+)_([0-9]+)/.exec(control.target_id);
		filter_values += (c ? ',' : '') + '{"spec_id" : ' + m[1] + 
			', "index_id" : ' + m[2] + ', "options" : [{"value" : "' + 
			control.selected().value.replace(re, "\\\"") + '"}]}';
		++c;
	}

	filter_values += "]}";

	webapp.silent_exec("/enum_products?folder_id=" + folder_id, function(result) {
		var code = '<table class="prod" id="product_list" cellspacing="0" cellpadding="1" border="0"/>'
			+ '<tr><th class="first"/>Aperçu</th>'
			+ '<th>Référence / Désignation</th>'
			+ '<th>Prix unitaire ' + (webapp.include_vat ? 'TTC' : 'HT') + '</th>'
			+ '<th>Quantité<br/><img src="/img/ui/dummy.gif" style="width:103px; height: 0px;"/></th>'
			+ '<th>Disponibilité</th>'
			+ '<th>Marque</th>';
		for (var i = 0; i < result.columns.length;++i)
			code += '<th>' + unescape(result.columns[i]) + '</th>';
		code += '</tr>';
		for (var i = 0; i < result.rows.length; ++i) {
			var row = result.rows[i];
			code += '<tr class="' + ((i & 1) ? 'even' : 'odd') + '"/><td class="thumbnail"/>'
			+ '<a href="descriptif_' + row.id + '.html"/><img src="' + row.img_id
			+ '" alt="apercu"/></a></td>'
			+ '<td class="label_fixed"/><a class="product_link" href="descriptif_'
			+ row.id + '.html"/><strong>' + unescape(row.reference) + '</strong><br />'
			+ unescape(row.label) + '</a><br />';
			if (row.cart_qty != 0.0)
				code += '<span style="font-weight:bold;" id="qty_label_' + 
					row.id + '"/> actuellement dans votre commande: ' + 
					row.cart_qty + '</span>';
			code += '</td><td class="price"/><table class="price_table" cellpadding="0" cellspacing="0" border="0"/>'
				+ '<tr><td>' + row.min_qty + '+</td><td class="first"/>' + row.price + '&nbsp;&euro;</td></tr>';
			if (row.qty_1 != 0.0)
				code += '<tr><td>' + row.qty_1 + '+</td><td>' + row.qty_1_price + '&nbsp;&euro;</td></tr>';
			if (row.qty_2 != 0.0)
				code += '<tr><td>' + row.qty_2 + '+</td><td>' + row.qty_2_price + '&nbsp;&euro;</td></tr>';
			if (row.qty_3 != 0.0)
				code += '<tr><td>' + row.qty_3 + '+</td><td>' + row.qty_3_price + '&nbsp;&euro;</td></tr>';
			code += '</table></td><td class="quantity" style="width: 120px; text-align: center;"/>'
				+ '<a href="/nojs.html" onclick="return webapp.qty_offset(' + row.id + ', -' 
				+ row.min_qty + ');"/><img src="/img/ui/btn_minus.gif" /></a><input type="text" '
				+ 'id="item_qty_edit_' + row.id + '" onkeydown="return webapp.qty_on_keydown(this, '
				+ row.id + ', ' + row.min_qty + ');" maxlength="4" style="width: 25px; text-align: center;" value="' 
				+ (row.cart_qty != 0.0 ? row.cart_qty : row.min_qty) + '"/><a href="/nojs.html" onclick="'
				+ 'return webapp.qty_offset(' + row.id + ', ' + row.min_qty + ');"/><img src="/img/ui/btn_plus.gif"'
				+ '/></a><a id="item_btn_' + row.id + '" href="/nojs.html" onclick="webapp.update'
				+ '_item_qty(' + row.id + '); return false;"/><img src="/img/ui/small_btn_' 
				+ (row.cart_qty != 0.0 ? 'update.gif' : 'buy.gif') + '"/></a></td>'
				+ '<td class="avl"/><span id="item_avl_' + row.id + '"/><img src="/img/ui/availability_'
				+ row.availability + '.gif"/></span></td><td class="brand"/>' + row.brand + '<br/></td>';
			for (var j = 0; j < result.spec_ids.length; ++j)
				code += '<td class="spec"/>' + unescape(row[result.spec_ids[j]]) + '</td>';
			code += '</tr>';			
		}
		target_el.style.height = "";
		target_el.style.border = "";
		target_el.innerHTML = code;
		dom.set_classname(target_el, "");
		info_el.innerHTML = result.rows.length + ((result.rows.length > 1) ? 
			" produits selectionnés" : " produit selectionné");
		populate_filters(result.filters);
		if (webapp.enum_product_state == 'RETRY') {
			webapp.enum_product_state = undefined;
			webapp.enum_products(folder_id);
		} else
			webapp.enum_product_state = undefined;
	}, true, filter_values);
}

webapp.enum_documents = function(doc_type, target)
{
	var target_el = dom.element(target);
	target_el.innerHTML = '';
	dom.set_classname(target_el, 'doc_hst_container_pending');

	this.silent_exec("/enum_documents?type=" + doc_type, function(result) {
		dom.set_classname(dom.element(target), 
			'doc_hst_container');
		if (result.ret_code == 'RET_SUCCESS')
			webapp.populate_document_list(target, doc_type, result.documents);
		else
			webapp.error_box(result.ret_code);
		}, true, null);
}

webapp.enum_tickets = function(doc_type, target)
{
	var target_el = dom.element(target);
	target_el.innerHTML = '';
	dom.set_classname(target_el, 'doc_hst_container_pending');

	this.silent_exec("/enum_tickets", function(result) {
		dom.set_classname(dom.element(target), 'doc_hst_container');
		if (result.ret_code == 'RET_SUCCESS')
			webapp.populate_ticket_list(target, doc_type, result.tickets);
		else
			webapp.error_box(result.ret_code);
		}, true, null);
}

webapp.render_document = function(doc_id, doc_type)
{
	this.exec("/render_document?id=" + doc_id + "&type=" + doc_type, function
		(result) {
		if (result.ret_code == 'RET_SUCCESS') {
			modal.show('doc_box');
			var box = dom.element("doc_box");
			box.innerHTML = unescape(result.page);
		} else
			webapp.error_box(result.ret_code);
		}, true, null);
}

webapp.render_ticket = function(ticket_id)
{
	this.exec("/get_ticket_thread?id=" + ticket_id, function
		(result) {
		if (result.ret_code == 'RET_SUCCESS') {
			modal.show('doc_box');
			var box = dom.element("doc_box");
			box.innerHTML = unescape(result.page);
		} else
			webapp.error_box(result.ret_code);
		}, true, null);
}

webapp.close_popup = function()
{
	modal.hide();
}

webapp.update_cart_status = function(quantity, amount)
{
	var qty_el = dom.element("cart_qty");
	var amount_el = dom.element("cart_amount");
	if (qty_el && amount_el) {
		if (quantity) {
			qty_el.innerHTML = quantity + " article" + ((quantity > 1) ? "s" : "");
		} else
			qty_el.innerHTML = "aucun article";
		amount_el.innerHTML = amount + " &euro;" + (this.include_vat ? "TTC" : "HT");
	}
}

webapp.reset_form_errors = function(form)
{
	for (var i = 0; i < form.elements.length; ++i) {
		var el = form.elements[i];
		var err_el = dom.element("err#" + el.name);
		if (err_el)
			dom.set_classname(err_el, "");
	}
}

webapp.enum_rmas = function(target)
{
	var target_el = dom.element(target);	
	target_el.innerHTML = '';
	dom.set_classname(target_el, 'doc_hst_container_pending');
	this.silent_exec("/enum_rmas", function(result) {
		dom.set_classname(target_el, 'rma_list_container');
		if (result.ret_code == 'RET_SUCCESS')
			webapp.populate_rma_list(target, result.rmas);
		else
			webapp.error_box(result.ret_code);
		}, true, null);
}

webapp.enum_rma_events = function(target, rma_id)
{
	var target_el = dom.element(target);
	target_el.innerHTML = '';
	dom.set_classname(target_el, 'rma_hst_container_pending');
	this.silent_exec("/enum_rma_events?id=" + rma_id, function(result) {
		dom.set_classname(target_el, 'rma_hst_container');
		if (result.ret_code == 'RET_SUCCESS')
			webapp.populate_rma_event_list(target, result.events);
		else
			webapp.error_box(result.ret_code);
		}, true, null);
}

webapp.populate_document_list = function(target_id, doc_type, documents)
{
	var target = dom.element(target_id);
	var html_code = '<table class="doc_hst" cellpadding="1" cellspacing="0"/>\r\n';
	var states = ['', 'En cours', 'Partielle', 'Soldée'];
	for (var i = 0; i < documents.length; ++i) {
		var doc = documents[i];
		html_code += '<tr class="' + (i & 1 ? 'odd' : 'even') + '"/>'
			+ '<td class="id first"/><a href="/nojs.html" onclick="webapp.render_document('
			+ doc.id + ', ' + doc_type + '); return false;"/>' + doc.id + '</a></td>'
			+ '<td class="user_ref"/>' + doc.reference + '</td>'
			+ '<td class="created"/>' + doc.order_date + '</td>'
			+ '<td class="updated"/>' + doc.delivery_date + '</td>'
			+ '<td class="state"/>' + states[doc.state] + '</td>'
			+ '</tr>\r\n';
	}
	html_code += '</table>';
	target.innerHTML = html_code;
}

webapp.populate_ticket_list = function(target_id, doc_type, tickets)
{
	var target = dom.element(target_id);
	var html_code = '<table class="doc_hst" cellpadding="1" cellspacing="0"/>\r\n';
	var states = ['En cours', 'En cours', 'Cloturé'];
	for (var i = 0; i < tickets.length; ++i) {
		var ticket = tickets[i];
		html_code += '<tr class="' + (i & 1 ? 'odd' : 'even') + '"/>'
			+ '<td class="id first"/><a href="/nojs.html" onclick="webapp.render_ticket('
			+ ticket.id + '); return false;"/>' + ticket.id + '</a></td>'
			+ '<td class="id"/>n°' + i + '</td>'
			+ '<td class="created"/>' + ticket.date_created + '</td>'
			+ '<td class="updated"/>' + ticket.date_updated + '</td>'
			+ '<td class="state"/>' + ticket.type.label + '</td>'
			+ '</tr>\r\n';
	}
	html_code += '</table>';
	target.innerHTML = html_code;
}

/*var DOC_LIST_FORMAT =
	[{"css":"id first", "key" : "id", "link" : ""},
	 {"css":"user_ref", "key" : "reference"},
	 {"css":"created", "key": "order_date"},
	 {"css":"updated", "key": "delivery_state"},
	 {"css":"state", "key": ""}];*/

webapp.populate_rma_list = function(target_id, rmas)
{
	var target = dom.element(target_id);
	var html_code = '<table class="rma_list" cellpadding="1" cellspacing="0"/>\r\n';
	for (var i = 0; i < rmas.length; ++i) {
		var rma = rmas[i];
		html_code += '<tr class="' + (i & 1 ? 'odd' : 'even') + '"/>'
			+ '<td class="id first"/><a href="/nojs.html" onClick="webapp.enum_rma_events(\''
			+ 'rma_hst\',' + rma.id + '); return false;"/>' + rma.id + '</a></td>'
			+ '<td class="date"/>' + rma.date + '</td>'
			+ '<td class="product"/>' + rma.product + '</td>'
			+ '<td class="state"/>' + rma.state + '</td>'
			+ '</tr>\r\n';
	}
	html_code += '</table>';
	target.innerHTML = html_code;
}

webapp.populate_rma_event_list = function(target_id, events)
{
	var target = dom.element(target_id);
	var html_code = '<table class="rma_hst" cellpadding="1" cellspacing="0"/>\r\n';
	for (var i = 0; i < events.length; ++i) {
		var event = events[i];
		html_code += '<tr class="' + (i & 1 ? 'odd' : 'even') + '"/>'
			+ '<td class="date"/>' + event.date + '</td>'
			+ '<td class="type"/>' + event.type + '</td>'
			+ '</tr>\r\n';
	}
	html_code += '</table>';
	target.innerHTML = html_code;
}

webapp.qty_offset = function(product_id, offset)
{
	var edit_el = dom.element('item_qty_edit_' + product_id);
	var min_qty = Math.abs(offset);
	var val = (parseInt(edit_el.value) / min_qty | 0) * min_qty;
	if (val + offset >= 0) {
		this.check_item_avl(product_id);
		edit_el.value = val + offset;
	}
	var qty = parseInt(edit_el.value);
	if (qty < min_qty || qty % min_qty)
		edit_el.style.color = '#ff0000';
	else
		edit_el.style.color = '#000000';

	return false;
}

webapp.qty_on_keydown = function(edit_el, product_id, min_qty)
{
	if (edit_el.onkeyup == undefined) {
		var self = this;
		var key = edit_el.event;
		var qty = edit_el.value;
		edit_el.onkeyup = function(event) {
			self.qty_on_keyup(edit_el, qty, min_qty, product_id);
		}
	}
	return true;
}

webapp.qty_on_keyup = function(edit_el, prev_value, min_qty, product_id)
{
	var filtered = '';
	for(var i = 0; i < edit_el.value.length; ++i) {
		c = edit_el.value.charAt(i);
		if (c >= '0' && c <= '9')
			filtered += c;
	}
	if (edit_el.value != filtered)
		edit_el.value = filtered;

	var qty = parseInt(edit_el.value);
	if (qty < min_qty || qty % min_qty)
		edit_el.style.color = '#ff0000';
	else
		edit_el.style.color = '#000000';

	if (prev_value != filtered)
		this.check_item_avl(product_id);

	edit_el.onkeyup = null;
	return true;
}

webapp.check_item_avl = function(product_id)
{
	if (this.avail_check_state == 'TIMER')
		return;
	var delay_el = dom.element('item_avl_' + product_id);
	var flash_el = dom.element('flash_avl_' + product_id);
	if (delay_el != undefined) {
		delay_el.innerHTML = '<img src="/img/ui/avl_progress.gif"/>';
		setTimeout('webapp.check_item_avl_(' + product_id + ');',
			500);
		this.avail_check_state = 'TIMER';
	}
	if (flash_el != undefined)
		flash_el.innerHTML = "";
}

webapp.check_item_avl_ = function(product_id)
{
	this.avail_check_state = 'PENDING'; 
	var quantity = parseInt(dom.element('item_qty_edit_' + product_id).value);
	if (isNaN(quantity)) {
		this.show_availability(product_id, quantity, 0, null, '');
		return;
	}
	var handler = function(result) {
		this.avail_check_state = 'IDLE';
		if (result.ret_code == 'RET_SUCCESS')
			webapp.show_availability(product_id, quantity, result.ordered_qty, 
				result.availability, result.delivery_date);
		else
			webapp.error_box(result.ret_code);
	}

	this.silent_exec("/check_item_avl?id=" + escape(product_id) + "&quantity="
		+ quantity, handler, true, null);
}

webapp.set_ui_element = function(type, classname, inner_html)
{
	if (this.UI_ELEMENTS == undefined)
		this.UI_ELEMENTS = {};
	this.UI_ELEMENTS[type] = {'classname': classname, 'inner_html' : inner_html};
}

webapp.set_order_change_handler = function(handler)
{
	this.order_change_handler = handler;
}

webapp.set_price_mode = function(mode, handler)
{
	this.include_vat = (mode == 'vat');
	this.silent_exec("/set_price_mode?mode=" + mode, handler, true, null);
}

webapp.show_availability = function(product_id, quantity, ordered_qty, delay, 
	delivery_date)
{
	var delay_el = dom.element('item_avl_' + product_id);
	var flash_el = dom.element('flash_avl_' + product_id);
	var edit_el = dom.element('item_qty_edit_' + product_id);
	var button_el = dom.element('item_btn_' + product_id);

	if (delay_el != undefined) {
		if (delay != undefined)
			delay_el.innerHTML = '<img src="/img/ui/availability_' + delay + '.gif"/>';
		else
			delay_el.innerHTML = '<img src="/img/ui/availability_8.gif"/>';
	}
	if (flash_el != undefined) {
		if (delivery_date != "")
			flash_el.innerHTML = delivery_date + '&nbsp<a href="/infos/livraison_express.html">[voir conditions]</a>';
	}
	/*var balloon = document.createElement("div");
	dom.set_classname(balloon, 'balloon_update');
	var pos = dom.position(button_el);
	balloon.style.left = pos.x - 80;
	balloon.style.top = pos.y - 70;
	document.body.appendChild(balloon);*/

	if (ordered_qty != 0) {
		if (edit_el != undefined && edit_el.value == '')
			edit_el.value = ordered_qty;
		this.update_item_button(product_id, ordered_qty, ordered_qty);
	}
}

webapp.update_item_button = function(product_id, qty, ordered_qty)
{
	var label_el = dom.element('qty_label_' + product_id);
	var button_el = dom.element('item_btn_' + product_id);

	if (label_el != undefined) {
		if (ordered_qty > 0)
			label_el.innerHTML = utils.format(this.UI_ELEMENTS
				['ITEM_LABEL'].inner_html, ordered_qty);
		else
			label_el.innerHTML = '&nbsp;';
	}
	if (button_el != undefined) {
		button_params = this.UI_ELEMENTS[(ordered_qty > 0) ? 'UPDATE_BUTTON'
			: 'BUY_BUTTON'];
		if (button_params != undefined) {
			dom.set_classname(button_el, button_params['classname']);
			button_el.innerHTML = button_params['inner_html'];
		}
	}
}

webapp.update_item_qty = function(product_id, del) 
{
	var edit_el = dom.element('item_qty_edit_' + product_id);
	var qty = (del != undefined ? 0 : edit_el.value);

	var handler = function(result) {
		if (result.ret_code == 'RET_SUCCESS') {
			webapp.update_cart_status(parseInt(result.quantity, 10), result.
				price);
			var popup_html = '';
			var deleted = false;
			if (result.item.quantity == 0) {
				var el = dom.element('row_' + product_id);
				if (el != undefined) {
					el.parentNode.removeChild(el);
					deleted = true;
				} else 
					edit_el.value = 1;
				popup_html += '<div class="popup_msg" style="padding: 50px 0 50px 0;"/><strong>Cet article a bien été supprimé de votre commande</strong></div>';
			} else {
				edit_el.value = result.item.quantity;
				edit_el.style.color = '#000000';
				popup_html += '<span class="popup_msg"/>Cet article a bien été ajouté à votre commande!' + 
					'</span><div style="clear: left; display: block; height: 100px; margin-top: 3px;"/>' +
					'<img class="thumb" src="/storage/' + result.item.image_id + '_s.jpg"/><table style="text-align: ' + 
					'left; width: 340px;"/><tr><td class="col"/>DESIGNATION:</td><td colspan="3" class="val"/><div style="overflow: hidden; width: 230px; height: 14px; display:block;"/>' + result.item.label + 
					'</div></td></tr><td class="col" style="width: 30%;"/>CODE&nbsp;COMMANDE:</td><td class="val" colspan="3"/>' + result.item.code + 
					'</td></tr><tr><td class="col"/>REFERENCE:</td><td class="val" colspan="3"/>' + result.item.reference +
					'</td></tr><tr><td class="col"/>QUANTITÉ:</td><td class="val" colspan="3"/>' + result.item.quantity + 
					'</td></tr><td class="col"/>DISPONIBILITÉ:</td><td class="val"/><img src="/img/ui/availability_' + result.item.avl_index + '.gif"/>' +
					'</td><td class="col" style="text-align: right;"/>PRIX TOTAL:</td><td class="total"/>' + result.item.total_price + 
					'&euro;</td></tr></table></div><div style="clear: both;"/></div>' + 
					'<a href="/commande/contenu.html" style="margin-left: 10px;" class="btn_cart"/><span>' +
					'visualiser ma commande</span></a>';
			}
			if (!deleted) {
				webapp.update_item_button(product_id, qty, qty);
				webapp.check_item_avl(product_id);
			}
			popup_html += '<a href="/nojs.html" style="margin-left: 50px;" onclick="webapp.close_popup(); return false;" class="btn_next"/><span>continuer mes achats</span></a>';
			dom.element("cart_popup").innerHTML = popup_html;
			modal.show("cart_popup");
			if (webapp.order_change_handler != undefined)
				webapp.order_change_handler(result.item, parseInt(result.quantity, 10), 
					result.deliveries, result.weight);
		} else 
			webapp.error_box(result.ret_code);
	}
	this.exec("/update_item_qty?id=" + escape(product_id) + "&quantity=" + 
		escape(qty), handler, true, null);
}

// private methods

webapp.send_form = function(url, form, actions)
{
	this.reset_form_errors(form);
	this.exec(url, function(result) {	
		if (result.ret_code == 'RET_SUCCESS') {
			if (actions["success_action"] != undefined)
				actions["success_action"](result);
			if (actions["redirect"] != undefined)
				dom.redirect(actions["redirect"]);
			else if (actions["success"] != undefined)
				webapp.message_box("success", actions["success"], 
					[ACTION_OK]);
		} else if (result.ret_code == 'RET_INVALID_INPUT' && result.form_errors
			 != undefined) {
			webapp.display_form_errors(form, result.form_errors);
		} else if (result.ret_code == 'RET_FAILURE' && actions["error"] 
			!= undefined)
			webapp.message_box("warning", actions["error"], [ACTION_RETRY]);
		else
			webapp.error_box(result.ret_code);
	}, true, formutils.serialize(form));
}

webapp.display_form_errors = function(form, errors)
{
	var self = this;
	this.reset_form_errors(form);
	for (var key in errors) {
		var err = dom.element("err#" + key);
		if (err) {
			var msg = errors[key];
			dom.set_classname(err, "error");
			err.onclick = function() {
				webapp.message_box("warning", msg, [ACTION_RETRY]);
			}
		}
	}
	webapp.message_box("warning", "Le formulaire est incomplet ou contient"
		+ " des erreurs. Pour plus d'information cliquez sur le point d'"
		+ "exclamation présent à coté du champ", [ACTION_RETRY]);
}

var ACTION_OK = [function() {webapp.close_popup();}, 'ok', 'btn_ok'];
var ACTION_RETRY = [function() {webapp.close_popup();}, 'recommencer', 'btn_ok'];
var ACTION_CANCEL = [function() {webapp.close_popup();}, 'annuler', 'btn_no'];

webapp.message_box = function(type, message, links)
{
	var icon = dom.element("message_icon");
	var msg = dom.element("message_text");
	var div = dom.element("message_buttons");
	dom.set_classname(icon, type);
	msg.innerHTML = message;
	if (links != null) {
		div.innerHTML = "";
		for(var i = 0; i < links.length; ++i) {
			div.innerHTML += '<a id="msgbox_button' + i + '" href="/nojs.html"'
				+ ' style="position: absolute;" class="' + links[i][2]
				+ '" onfocus=""/><span>'
				+ links[i][1] + '</span></a>';
		} /*modal.set_focus(this);*/
		var wrap = function(fun) {return function() {fun(); return false;}};
		for(var i = 0; i < links.length; ++i)
			dom.element("msgbox_button" + i).onclick = wrap(links[i][0]);
	}
	modal.show("msg_box");
	msg.style.top = (180 - msg.offsetHeight) / 2 + "px";
	var part = 400 / links.length;
	for(var i = 0; i < links.length; ++i) {
		var el = dom.element("msgbox_button" + i);
		var pos = i * part + (part - el.offsetWidth) / 2;
		el.style.left = pos + "px";
	}
}

webapp.error_box = function(error_code)
{
	var error_msg;
	if (error_code == 'RET_REQUIRE_SESSION')
		error_msg = "Impossible d'établir une session sur le serveur, assurez-"
			+ "vous que les cookies sont bien activés sur votre navigateur et "
			+ "recommencez l'opération.";
	else if (error_code == 'RET_NOT_FOUND')
		error_msg = "La ressource concernée par la requête n'a pas été trouvée"
			+ " sur le serveur.";
	else if (error_code == 'RET_PARSE_ERROR')
		error_msg = "Le résultat de la requête n'a pas pu être interprété.";
	else
		error_msg = "Une erreur inattendue s'est produite durant l'opération.";

	this.message_box("error", error_msg, [[function() {webapp.close_popup();},
		'ok', 'btn_ok']]);
}

webapp.enlarge_img = function(img)
{
	var div = dom.element('img_box');
	div.innerHTML = '<img src="/storage/' + img + '_l.jpg"/><br><a href="/nojs.html" onclick="' + 
		'webapp.close_popup(); return false;" class="btn_delete"/><span>fermer et retourner à la fiche produit</span></a>';
	modal.show('img_box');
	//div.style.top = (500 - img.offsetHeight) / 2 + "px";
}

webapp.exec = function(command, completion_handler, allow_retry, post_data, 
	silent)
{
	var self = this;
	var wrapped_handler = function(status, response) {
		var query = new Object();
		query.completion_handler = completion_handler;
		if (allow_retry) {
			query.command = command;
			query.post_data = post_data;
		}
		webapp._exec_internal_handler(status, response, query);
	}
	if (rpc.execute(post_data != undefined ? 'POST' : 'GET', command, 
		wrapped_handler, post_data)) {
		if (silent != false)
			modal.show("progress_popup");
	}
}

webapp.silent_exec = function(command, completion_handler, allow_retry, 
	post_data)
{
	this.exec(command, completion_handler, allow_retry, post_data, false);
}

webapp._exec_internal_handler = function(status, response_text, query)
{
	var result;
	if (status == 200) {
		try {
			result = eval("(" + response_text + ")");
		} catch (err) {
			result = new Object();
			result.ret_code = 'RET_PARSE_ERROR';
		}
		if (result.ret_code == 'RET_REQUIRE_SESSION' && query.command != 
			undefined){
			var self = this;
			var retry_handler = function(result) {
				// re-execute original query on success
				if (result.ret_code == 'RET_SUCCESS')
					webapp.silent_exec(query.command, query.completion_handler, 
						false, query.post_data);
				else
					query.completion_handler(result);
			}
			// attempt to open a session
			this.silent_exec("/open_session?" + result['session_key'],
				retry_handler, false);
			return;
		}
	} else {
		result = new Object();
		result.ret_code = 'RET_NOT_FOUND';
	}
	query.completion_handler(result);
}

