var API = {
	language: null,
	key: null,
	debug: {
		logs: [],
		log: function(msg) {
			this.logs.push(msg);
		}
	},
	locale: {
		lang: function(iso) {
			nano.ajax.post('/WSUser.lang', {lang: iso}, function() {
				if (this.response.header('X-Response-State') == '1') {
					location.reload();
				} else {
					API.debug.log(this.response.header('X-' + this.response.header('X-Response-Responder').split('.')[0] + '-Message'));
				}
			}, {onerror: function() {
				API.debug.log('No server response');
			}});
		},
		literal: function(name, id) {
			nano.ajax.get('/WSSystem.literal', {name: name, id: id}, function() {
				if (this.response.header('X-Response-State') == '1') {
					nano(this.response.header('X-WSSystem-ID')).set(this.response.header('X-WSSystem-Literal'));
				} else {
					API.debug.log(this.response.header('X-' + this.response.header('X-Response-Responder').split('.')[0] + '-Message'));
				}
			}, {onerror: function() {
				API.debug.log('No server response');
			}});
		}
	},
	login: function(login, pass) {
		nano.ajax.post('/WSAuth.login', {login: login, pass: pass}, function() {
			if (this.response.header('X-Response-State') == '1') {
				location.reload();
			} else {
				var message = this.response.header('X-' + this.response.header('X-Response-Responder').split('.')[0] + '-Message');
				nano('header-login-message').empty().add({tag: 'p', text: message}).opacity(0).fx('fadein', {time: 200});
				API.debug.log(message);
			}
		}, {onerror: function() {
			API.debug.log('No server response');
		}});
	},
	logout: function() {
		nano.ajax.post('/WSAuth.logout', {}, function() {
			if (this.response.header('X-Response-State') == '1' || this.response.header('X-Response-State') == '2') {
				location = '/';
			} else {
				API.debug.log(this.response.header('X-' + this.response.header('X-Response-Responder').split('.')[0] + '-Message'));
			}
		}, {onerror: function() {
			API.debug.log('No server response');
		}});
	},
	menu: {
		node: null,
		build: function(menu) {
			eval('var nodes = ' + menu + ';');
			var node = nano(this.node);
			var ul   = node.add({tag: 'ul'}), li_ul;
			for (var i = 0; i < nodes.length; i++) {
				var li = ul.add({tag: 'li'});
				if (!nano.empty(nodes[i].link)) {
					li.add({tag: 'a', css: 'menu-link', text: nodes[i].text, href: nodes[i].link});
				} else {
					li.add({tag: 'span', css: 'menu-header', text: nodes[i].text});
				}
				if (nano.type(nodes[i].nodes) === 'array') {
					li_ul = li.add({tag: 'ul'});
					for (var j = 0; j < nodes[i].nodes.length; j++) {
						li = li_ul.add({tag: 'li'});
						if (!nano.empty(nodes[i].nodes[j].link)) {
							li.add({tag: 'a', css: 'menu-link', text: nodes[i].nodes[j].text, href: nodes[i].nodes[j].link});
						} else {
							li.add({tag: 'span', css: 'menu-header', text: nodes[i].nodes[j].text});
						}
					}
				}
			}
			node.find('tag', 'a', true).each(function() {
				if (this.get('href') === location.href) {
					this.addClass('menu-selected');
				}
			});
		},
		load: function(node, name) {
			this.node = node;
			nano.ajax.get('/WSData.menu', {menu: name}, function() {
				if (this.response.header('X-Response-State') == '1') {
					API.menu.build(this.response.text);
				} else {
					API.debug.log(this.response.header('X-' + this.response.header('X-Response-Responder').split('.')[0] + '-Message'));
				}
			}, {onerror: function() {
				API.debug.log('No server response');
			}});
		}
	},
	table: {
		cache: {},
		build: function(table, page) {
			var data  = this.cache[table].pages[page];
			var range = this.cache[table].range;
			var node  = this.cache[table].node.add({tag: 'table', css: 'datatable'});
			var head  = node.add({tag: 'thead'}).add({tag: 'tr', css: 'datatable-row'});
			var body  = node.add({tag: 'tbody'});
			for (var i = 0; i < data.head.length; i++) {
				head.add({tag: 'th', css: 'datatable-head', text: data.head[i]});
			}
			var row = null, k = 0;
			for (var j = 0; j < data.body.length; j++) {
				row = body.add({tag: 'tr', css: 'datatable-row'});
				for (k = 0; k < data.body[j].length; k++) {
					if (data.body[j][k].edit === '1') {
						row.add({
							tag : 'td',
							css : 'datatable-cell datatable-edit',
							text: data.body[j][k].text,
							attr: {
								datatable: {
									cache : page,
									table : table,
									field : data.body[j][k].field,
									id    : data.body[j][k].id,
									length: data.body[j][k].length,
									type  : data.body[j][k].type
								}
							},
							evt : {
								click: API.table.edit
							}
						});
					} else {
						row.add({
							tag : 'td',
							css : 'datatable-cell',
							text: data.body[j][k].text
						});
					}
				}
			}
		},
		edit: function() {
			if (nano(this).find('tag', 'input').length < 1) {
				var cell = nano(this);
				var attr = cell.node.datatable;
				var text = cell.get();
				cell.set('');
				var input = cell.add({tag: 'input', type: 'text', text: text, attr: {length: attr.length, datatable: attr}, evt: {keyup: API.table.update}}).focus();
			}
		},
		update: function() {
			if (nano.env.key === 13) {
				var input = nano(this);
				var text  = input.get();
				nano.ajax.post('/WSForms.update', {table: input.node.datatable.table, field: input.node.datatable.field, id: input.node.datatable.id, text: text, page: input.node.datatable.cache}, function() {
					if (this.response.header('X-Response-State') == '1') {
						alert(this.response.header('X-' + this.response.header('X-Response-Responder') + '-Message'));
						var table = this.response.header('X-WSForms-Table');
						var page  = this.response.header('X-WSForms-Page');
						if (API.table.cache[table].pages[page]) {
							API.table.cache[table].pages[page] = null;
						}
					} else {
						API.debug.log(this.response.header('X-' + this.response.header('X-Response-Responder').split('.')[0] + '-Message'));
					}
				}, {onerror: function() {
					API.debug.log('No server response');
				}});
				var cell = nano(this).parent();
				cell.empty();
				cell.set(text);
			}
		},
		load: function(node, table, range, page) {
			if (!this.cache[table]) {
				this.cache[table] = {
					pages: [],
					range: range,
					node : node
				};
			}
			if (!this.cache[table].pages[page]) {
				nano.ajax.get('/WSData.table', {data: table, range: range, page: page || 1}, function() {
					if (this.response.header('X-Response-State') == '1') {
						eval("API.table.cache[this.response.header('X-WSData-Table')].pages[this.response.header('X-WSData-Page')] = " + this.response.text);
						API.table.build(this.response.header('X-WSData-Table'), this.response.header('X-WSData-Page'));
					} else {
						API.debug.log(this.response.header('X-' + this.response.header('X-Response-Responder').split('.')[0] + '-Message'));
					}
				}, {onerror: function() {
					API.debug.log('No server response');
				}});
			} else {
				this.build(table, page);
			}
		}
	},
	form: {
		token: null,
		form: null,
		inputs: null,
		files: null,
		build: function(data) {
			var form = new nano({tag: 'div', id: nano.uniq(10)});
			for (var i = 0; i < data.length; i++) {
				form.add({tag: 'label', css: 'datatable-label', text: data[i].label});
				switch (data[i].type) {
					case 'text':
						form.add({tag: 'input', type: 'text', css: 'datatable-input-text', attr: {length: data[i].length}, evt: {blur: function() {
							var input = nano(this);
							if (input.validate()) {
								if (input.hasClass('datatable-error')) {
									input.delClass('datatable-error')
								}
							} else {
								input.addClass('datatable-error')
								input.focus();
							}
						}}});
						break;
				}
				form.add({tag: 'button', css: 'datatable-submit', text: 'Save', evt: {click: function() { API.form.submit(nano(this).parent().get('id')); }}});
			}
		},
		load: function(table) {
			nano.ajax.get('/WSData.form', {data: table}, function() {
				if (this.response.header('X-Response-State') == '1') {
					API.form.build(this.response.text);
				} else {
					API.debug.log(this.response.header('X-' + this.response.header('X-Response-Responder').split('.')[0] + '-Message'));
				}
			}, {onerror: function() {
				API.debug.log('No server response');
			}});
		},
		upload: function() {
			var input = this.files[this.fileIndex];
			if (input.get() !== '') {
				var id   = nano.uniq(10);
				var form = input.parent();
				form.add({tag: 'input', type: 'hidden', name: 'id', text: nano.uniq(32)});
				form.add({tag: 'input', type: 'hidden', name: 'token', text: this.token});
				form.add({tag: 'input', type: 'hidden', name: 'timestamp', text: nano.time()});
				var iframe = '<iframe style="display: block;" src="about:blank" id="' + id + '" name="' + id + '" onload="API.form.uploadComplete(\'' + id + '\');"></iframe>';
				var div    = new nano({parent: nano.body(), tag: 'div', text: iframe});
				form.attr({action: '/WSForms.upload', method: 'post', enctype: 'multipart/form-data', target: id});
				form.node.submit();
			} else {
				API.form.fileIndex++;
				if (API.form.fileIndex !== API.form.files.length) {
					API.form.upload();
				} else {
					API.form.send();
				}
			}
		},
		uploadComplete: function(id) {
			var iframe = nano(id);
			if (/OUT\:\d{1}/.test(iframe.node.contentDocument.getElementsByTagName('body')[0].innerHTML)) {
				if (/OUT\:(1|2)/.test(iframe.node.contentDocument.getElementsByTagName('body')[0].innerHTML)) {
					iframe.del();
					API.form.fileIndex++;
					if (API.form.fileIndex !== API.form.files.length) {
						API.form.upload();
					} else {
						API.form.send();
					}
				} else {
					API.debug.log('File not uploaded');
					iframe.del();
				}
			} else {
				API.debug.log('No server response');
				iframe.del();
			}
		},
		submit: function(form) {
			this.form   = nano(form);
			this.token  = nano.uniq(32);
			this.files  = this.form.find('type', 'file', true);
			this.inputs = {};
			this.form.find('tag', 'input', true).each(function() {
				var types = ['file', 'reset', 'submit'];
				if (nano.equal(types, this.node.type.toLowerCase()).length < 1) {
					API.form.inputs[this.node.name] = this.get();
				}
			});
			if (this.files.length > 0) {
				this.fileIndex = 0;
				this.upload();
				return false;
			} else {
				return this.send();
			}
		},
		send: function() {
			nano.ajax.post('/WSForms.submit', this.inputs, function() {
				if (this.response.header('X-Response-State') == '1') {
					alert(this.response.header('X-' + this.response.header('X-Response-Responder') + '-Message'));
				} else {
					API.debug.log(this.response.header('X-' + this.response.header('X-Response-Responder').split('.')[0] + '-Message'));
				}
			}, {onerror: function() {
				API.form.abort();
			}});
			this.token = null;
			return false;
		},
		abort: function() {
			API.debug.log('Form not sent');
			this.token = null;
			this.form = null;
			this.inputs = null;
			this.files = null;
			this.fileIndex = 0;
			return false;
		}
	},
	system: {
		notify: function(code, id) {
			nano.ajax.get('/WSSystem.literal', {name: code, id: id || 'error-messages'}, function() {
				if (this.response.header('X-Response-State') == '1') {
					nano(this.data.id).add({tag: 'div', css: 'error-message', text: this.response.text});
				} else {
					API.debug.log(this.response.header('X-' + this.response.header('X-Response-Responder').split('.')[0] + '-Message'));
				}
			}, {onerror: function() {
				API.debug.log('No server response');
			}});
		}
	},
	print: function(url) {
		window.open(url);
	},
	init: function(zone) {
		switch (zone) {
			case 'gestion':
				nano(function() {
					API.menu.load('menu-gestion', 'gestion');
				});
				break;
		}
	},
	toggleEpigrafe: function (id,element) {
		nano(id).toggle();
		var img = element.src;
		if (img.indexOf('close') < 0) {
			element.src = '/imgfiles/img/edit_close.png';
		} else {
			element.src = '/imgfiles/img/edit_open.png';
		}
	}
};


