var app = {
	showTab:true,
	showNumberLine:true,
	tab:function (count){
		var res = '';
		if(this.showTab){
			while(count --> 0) res+=' → ';
			return '<span class="tab">'+res+'</span>';
		} else {
			while(count --> 0) res+='&nbsp;&nbsp;&nbsp;&nbsp;';
			return res;
		}
	},
	clearCpace:function(text){
		var isString = false,out = '';
		for(var i=0,l=text.length;i<l;i++){
			if(!isString){
				while((/\s/i).test(text[i])) i++;
			}
			if(text[i] == "'" && text[i-1] !="\\")  isString = !isString;
			out += text[i];
		}
		return out;
	},
	format:function(){
		var tabSpacer = '<span style="color:#eee"> → </span>';
		var text = this.clearCpace(document.getElementById('in').value);
		var out = '';
		var countObject = 0;
		var countArray = 0;
		var isString = false;
		var prevSpell;
		var stack = [];
		for(var i=0,l=text.length;i<l;i++){
			switch(text[i]){
				case '{':
					if(!isString && text[i+1] != '}'){
						stack.push('{');
						out += text[i] + '<br/>' + this.tab(stack.length);
					} else {
						out += text[i];
					}
				break;
				case '}':
					if(!isString && text[i-1] != '{' ){
						var type = stack.pop();
						if(type != '{'){
							out += '<b class="err">-- Не закрыт массив дожен быть знак ] --</b>';
						}
						out += '<br/>'+ this.tab(stack.length) + text[i];
					} else {
						out += text[i];
					}
				break;
				case '[':
					if(!isString && text[i+1] != ']'){
						stack.push('[');
						out += text[i] + '<br/>' + this.tab(stack.length);
					} else {
						out += text[i];
					}
				break;
				case ']':
					if(!isString && text[i-1] != '[' ){
						var type = stack.pop();
						if(type != '[') out += '<b class="err">-- Не закрыт обьект дожен быть знак } --</b>';
						out += '<br/>'+ this.tab(stack.length) + text[i];
					} else {
						out += text[i];
					}
				break;
				case ',':
					if(!isString && text[i+1] != '{' && text[i+1] != '['){
						if(text[i+1] == ']' || text[i+1] == '}'){
							out += '<b class="err">'+text[i] + ' - Лишняя запятая</b><br/>'+lpad(tabSpacer,countObject);
						} else {
							out += text[i] + '<br/>'+this.tab(stack.length);
						}
					} else {
						out += text[i];
					}
				break;
				case "'":
					if(text[i-1] !="\\") isString = !isString;
				default:
					out += text[i];
				break;
			}
		}
		if(this.showNumberLine) out = '<ol>'+out.split('<br/>').map(function(c) '<li>' + c + '</li>').join('')+'</ol>';
		document.getElementById('console').innerHTML = out;
	},
	clear:function(){
		document.getElementById('in').value = '';
		document.getElementById('console').innerHTML = '';
	}
};
