(function() {
	var index = function() {
		// oncheck	- слой, прошел проверку, данные загружаются, если они не загружены были до этого
		// onload	- данные загружены, начинает парситься шаблон
		// onshow	- слой распарсился и показался
	//
		var infra = this;
		/* Чтобы не перезагружать data, а просто перепарсить слой */
		var _form = function(infraform, success, error) {
			$(infraform).ajaxForm({
				dataType: 'json',
				beforeSubmit: function(formData, jqForm, options) {
					infra.check(true);
				},
				success: success,
				error: error
			});
		}
		var oncheckForm = function(cb) {
			var layer = this;
			if ((infra.state == '/Управление файлами/') || (/^\/check.php(\/{0,1})$/.test(infra.state))) {
				if (!layer.config.hide || !layer.show) {
					layer.html = ' ';
					layer.show = false;
					layer.config.hide = true;
				}
			} else {
				if (layer.config.hide || !layer.show) {
					layer.config.hide = false;
					layer.html = '';
					layer.show = false;
				}
			}
			cb();
		}
		var onshowForm = function(cb) {
			if (typeof(window) != 'undefined') {
				var success = function(responseText, statusText, xhr, form) {
					var ans = responseText;
					if (ans.result) {
						infra.state = '/Все подписи/Благодарим за поддержку/';
					} else {
						if (!ans.error) ans.error = 1;
						infra.state = '/Все подписи/Ошибка'+ans.error+'/';
					}
					infra.check();
				}
				var error = function() {
					infra.state = '/Все подписи/Ошибка1/';
					infra.check();
				}
				_form(this.config.infraform, success, error);
			};
			cb()
		}
		var onloadSetFormError = function(cb) {
			var layer = this;
			var error = 'Ошибка отправки.';
			if (layer.reg_state[1] == 2) error = '<a href="#form">Заполните</a> все обязательные поля.';
			layer._data = {error:error};
			cb();
		}
		var oncheckPages = function(cb) {
			// загрузить data, так нужно чтобы шаблон загрузился после data
			// узнать реальный путь
			// подставить в шаблон
			var layer = this;
			if (layer.config.page != infra.state) infra.reparseLayer(layer);
			infra.load.json(layer.data, function(err, _data) {
				if (!err) {
					var name = infra.state;
					name = name.replace(/\/+$/, '');
					name = name.replace(/^\/+/, '');
					if (_data.obj[name + '.html']) {
						layer.tpl = '/infra/data/pages/' + _data.obj[name+'.html'].realdir +
										'/' + _data.obj[name+'.html'].realname +
										'.' + _data.obj[name+'.html'].ext;
					} else {
						/*
						layer.html = ' ';
						if (!/^\/check.php(\/{0,1})$/.test(infra.state)) {
							layer.html = 'Страница не найдена';
						}
						*/
						layer.html = 'Страница не найдена';
					}
				}
				cb();
			})
		}
		var onshowSetOldpage = function(cb, layer) {
			if (!layer) layer = this;
			//if (layer.page_name) layer.old_page_name = layer.page_name;
			layer.config.page = infra.state;
			layer.config.old_data = layer.data;
			cb();
		}
		var oncheckAllVotes = function(cb) {
			// определить номер страницы
			// переопределить data
			var layer = this;
			// номер страницы по-умолчанию 1
			var num = layer.reg_state[1];
			if (num) layer.config.num = num;
			layer.data = '/infra/layers/votes/all_votes.njs?p='+layer.config.num;
			if (layer.config.old_data && layer.config.old_data != layer.data) {
				infra.reparseLayer(layer);
			}
			cb();
		}
		var onloadAllVotes = function(cb) {
			// дополнить шаблон
			var layer = this;
			layer._data.pages = new Array(layer._data.num_pages);
			for (var i = 1; i <= layer._data.num_pages; i++) {
				layer._data.pages[i] = i;
			}
			layer._data.b = function() {
				if (this['.'] == layer._data.p) {
					this['.'] = '<b style="color:black">'+this['.']+'</b>';
				}
				return true;
			}
			cb();
		}
		var onshowChangeHidden = function(cb) {
			var layer = this;
			if (typeof(window) != 'undefined') {
				$('a.change_hidden').click(function() {
					var href = this.getAttribute('href');
					infra.load.clearCache(href);
					infra.load.clearCache(layer.data);
					infra.noscroll = true;
					infra.check(true);
					infra.load.json(href, function(err, _data) {
						if (!err) {
							infra.reparseLayer(layer);
						}
						infra.check();
					})
					return false;
				})
			}
			onshowSetOldpage(cb, layer);
		}
		var oncheckReparseParent = function(cb) {
			// TODO label
			cb();
		}
		var onshowCheckPhp = function(cb) {
			var layer = this;
			if (typeof(window) != 'undefined') {
				var success = function(responseText, statusText, xhr, form) {
					layer._data = responseText;
					if (layer._data.admin || layer._data.exit) {
						infra.load.clearCache();
						infra.reparseAll();
					} else {
						infra.reparseLayer(layer);
					}
					infra.check();
				}
				var error = function() {
					layer._data.admin_error = true;
					infra.reparseLayer(layer);
					infra.check();
				}
				_form(layer.config.infraform, success, error);
			};
			cb();
		}
		var onloadListing = function(cb) {
			var layer = this;
			layer._data.no_admin = function() {
				if (!layer._data.admin) return true;
			}
			cb()
		};
	//
		/*В объекте index берется самый последний элемент, самого последенего элемента, и тд*/
		infra.index =  {
			tag: '#base_html',
			tpl: '/infra/layers/index.tpl',
			tags: {
				'#header': {
					tpl: '/infra/layers/header.tpl',
					tags: {
						'#stat': {
							ext: '/infra/layers/yaStat/layer.js'
						}
					}
				},
				'#base_text': {
					tpl: '/infra/layers/base_text.tpl',
					tags: {
						'#base_left': {
							tpl: '/infra/layers/base_left.tpl',
							tags: {
								'#page': { tpl: '/infra/data/pages/main.html' },
								'#form': {
									tpl: '/infra/layers/votes/form.tpl',
									config: { infraform: '#voice' },
									//oncheck: oncheckForm,
									onshow: onshowForm
								}
							},
							childs: {
								'[^/]+/[^/]+': {
									data: '/infra/plugins/files/dir.njs?src=/infra/data/pages&sub=1&e=html&realname=2&obj=1',
									tag: '#page',
									config: { page: '' },
									oncheck: oncheckPages,
									onshow: onshowSetOldpage
								},
								'Все подписи': {
									tag: '#page',
									tpl: '/infra/layers/votes/Все подписи.tpl',
									config: { num: 1, page: '' },
									oncheck: oncheckAllVotes,
									onload: onloadAllVotes,
									onshow: onshowChangeHidden,
									childs: {
										'Ошибка(\\d+)': {
											tag: '#form_ans',
											_tpl: '<b><center style="color:red;font-size:22px">{{{error}}}</center></b>',
											oncheck: oncheckReparseParent,
											onload: onloadSetFormError
										},
										'test': {
											tag: '#form_ans',
											_tpl: 'test',
										},
										'Благодарим за поддержку': {
											tag: '#form_ans',
											_tpl: '<b><center class="green" style="font-size:22px">Спасибо! Скоро Ваш голос будет учтён!</center></b>',
											oncheck: oncheckReparseParent,
										}
									}
								},
								'Все подписи/(\\d+)': {
									tag: '#page',
									tpl: '/infra/layers/votes/Все подписи.tpl',
									config: { num: 1, page: '' },
									oncheck: oncheckAllVotes,
									onload: onloadAllVotes,
									onshow: onshowChangeHidden,
								},
								'check.php': {
									tpl: '/infra/layers/node-auth/auth.tpl',
									tag: '#page',
									state: '^/check.php(/{0,1})$',
									data: '/infra/layers/node-auth/isadmin.js',
									config: { infraform: '#admin' },
									onload: onloadListing,
									onshow: onshowCheckPhp,
									tags: { '#form': { html: ' ' } }
								},
								'Управление файлами': {
									ext: '/infra/layers/browser/layer.js',
									tags: { '#form': { html: ' ' } },
									tag: '#page',
								}
							}
						},
						'#base_right': {
							tpl: '/infra/layers/base_right.tpl',
							tags: {
								'#photos': {
									tpl: '/infra/layers/photos/photos.tpl',
									data: '/infra/layers/photos/photos.njs',
								},
								'#menu': {
									tpl: '/infra/layers/menu/menu.tpl',
									data: '/infra/layers/menu/menu.njs',
								}
							}
						}
					}
				},
				'#footer': {
					tpl: '/infra/layers/footer.tpl',
				}
			}
		}
	}
	if (typeof(window) != 'undefined') {
		document.addEventListener("DOMContentLoaded", function() {
			Infra.ext(index)
			// start
			infra = Infra.init();
			infra.log.logger = 'DEBUG';
			infra.set.addressBar();
			infra.set.links();
			infra.once('start', function() {
				try {
					infra.set.cache();
				} catch(e) { // можно открыть просто index.html
					infra.log.warning('fail cache');
				}
			});
			infra.check();
		});
	}
	if (typeof(window) == 'undefined') module.exports = index
})();

