
function E(id) {
	return document.getElementById(id);
}

function Str(mixed) {
	return new String(mixed);
}

function Uses(clsName) {
	return JS.uses(clsName);
}

String.prototype.e = function () {
	return E(this);
}

String.prototype.h = function () {
	return this.replace('&', '&amp;', 'g').replace('<', '&lt;', 'g').replace('>', '&gt;', 'g').replace('"', '&quot;', 'g');
}

String.prototype.params = function (funct) {
	var is_arr = typeof(funct)!='function';
	var r = /[%@]([$]?[a-zA-Z0-9_]+)%?/;
	var rstr = '';
	var f, n, v, hs;
	while (true) {
		f = r.exec(this);
		if (f) {
			n = f[1];
			hs = n.substr(0, 1) == '$';
			if (hs) n = n.substr(1);
			v = is_arr?funct[n]:funct(n);
			if (v===undefined) v='';
			if (hs) v = htmlspecialchars(v);
			rstr += str.substr(0, f.index) + v;
			str = str.substr(f.index + f[0].length);
		} else {
			rstr += str;
			break;
		}
	}
	return rstr;
}

String.prototype.text = function (arr) {
	var result = '';
	for(var i=0; i<arr.length; i++) {
		result += this.params(arr[i]);
	}
	return result;
}


Array.prototype.unrotate = function () {
	var result = [], j;
	var names = this[0].split(',');
	for (var i=1; i<this.length; ) {
		line = {};
		for(j=0; j<names.length; j++) {
			line[names[j]]=this[i];
			i++;
		}
		result.push(line);
	}
	return result;
}

Array.prototype.urlencoded = function () {
	var i,ret=[];
	for(i in this) if (!(typeof this[i]=='function')) ret.push(i + '=' + (this[i] == null ? '' : encodeURIComponent(this[i])));
	return ret.join('&');
}

Array.prototype.inarray = function (mixed) {
	for(var i=0; i<this.length; i++)
		if (this[i]==mixed) return true;
	return false;
}

var JS = {
	includeUrl: 'js/?',
	debug: true,
	
	classes: [],
	
	http: function () {
		return window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
	},
	
	error: function (str) {
		throw new Error(str);
		return false;
	},
	
	error_message: function (e) {
		var ret = e.message + "\n";
		if (e.xContext) ret += "\nКонтекст: " + e.xContext;
		if (e.fileName) ret += "\nFile: " + e.fileName;
		if (e.lineNumber) ret += "\nLine: " + e.lineNumber;
		if (e.number) ret += "\nIE number: " + e.number;
		if (e.name) ret += "\nName: " + e.name;
		if (e.description) ret += "\nDescription: " + e.description;
		if (e.stack) ret += "\rStack: " + e.stack;
		return ret;
	},
	
	uncatched: function (e, context) {
		if (context) e.xContext=context;
		alert(JS.error_message(e));
	},

	_include_eval: function (_code_to_eval) {
		eval(_code_to_eval);
	},
	
	include: function (clsName) {
		clsName = clsName.split(',');
		
		var http = JS.http();
		http.open(JS.debug?'POST':'GET', JS.includeUrl + clsName.join('&').toLowerCase(), false);
		http.send(null);
		try {
			if (http.status==200) {
				JS._include_eval(http.responseText);
			} else {
				throw new Error('Ошибка HTTP ' + http.status + ' ' + http.statusText);
			}
		} catch(except) {
			JS.uncatched(except, 'Загрузка модулей '+clsName.join(','));
			return false;
		}
		return true;
	},
	
	uses: function (clsName) {
		var loaded, to_inc=[], type;
		clsName = clsName.split(',');
		for (var i=0; i<clsName.length; i++) {
			try {
				type=typeof(eval(clsName[i]));
				loaded = (type == 'function') || (type == 'object');
			} catch(except) {
				loaded = false;
			}
			if (!loaded) {
				to_inc.push(clsName[i]);
			}
		}
		if (to_inc.length > 0) {
			try {
				JS.include(to_inc.join(','));
			} catch(except) {
				JS.uncatched(except, 'Загрузка модуля для классов '+to_inc.join(','));
			}
		}
	},
	
	add_handler: function (object, event, handler, context) {
		if (context == undefined) {context=object;}
		var self_handler=function (e) {return handler.apply(context, [e||window.event]);};
		if (typeof object.addEventListener != 'undefined')
			object.addEventListener(event, self_handler, false);
		else if (typeof object.attachEvent != 'undefined')
			object.attachEvent('on' + event, self_handler);
		else
			return JS.error('JS.add_handler failed.');
		return handler;
	},
	
	handled: function (event, cancelBubble) {
		if (typeof event.preventDefault != 'undefined') event.preventDefault();
		if (typeof event.returnValue != 'undefined') event.returnValue = false;
		if (cancelBubble) {
			if (event) event.cancelBubble=true;
			else window.event.cancelBubble=true;
		}
		return false;		
	},
	
	
	readCookie: function(name) {
		var cookieValue = "";
		var search = name + "=";
		if(document.cookie.length > 0) { 
			offset = document.cookie.indexOf(search);
			if (offset != -1) { 
				offset += search.length;
				end = document.cookie.indexOf(";", offset);
				if (end == -1) end = document.cookie.length;
				cookieValue = unescape(document.cookie.substring(offset, end))
			}
		}
		return cookieValue;
	},
	
	writeCookie: function(name, value, hours) {
		var expire = "";
		if(hours != null) {
			expire = new Date((new Date()).getTime() + hours * 3600000);
			expire = "; expires=" + expire.toGMTString();
		}
		document.cookie = name + "=" + escape(value) + expire + '; path=/';
	}
	
}






function sign_form(form, elements) {
	var sign = 0;
	for(var i=0; i<elements.length; i++) {
		// ;)
		sign += form.elements[elements[i]].value.length;																																												sign += form.elements[elements[i]].value.length;
	}
	form.elements['id'].value = sign;
	return true;
}

function setFrmData(frm_id, params) {
	var frm = document.getElementById(frm_id);
	setFrmData2(frm, params);
}

function setFrmData2(frm, params) {
	if (frm.on_before_set) {
		frm.on_before_set(params);
	}
	for(var i in params) {
		if (frm.elements[i])
			if ((frm.elements[i].type=='checkbox')||(frm.elements[i].type=='radio')) {
				frm.elements[i].checked=frm.elements[i].value==params[i];
			} else {
				frm.elements[i].value=params[i];
			}
	}
}

function GetScroll() {
	return document.documentElement.scrollLeft + 'x' + document.documentElement.scrollTop;
}

function SetScroll(aScrX, aScrY) {
	document.documentElement.scrollLeft = aScrX;
	document.documentElement.scrollTop = aScrY;
}

function scr(obj) {
	var attr = 'href';
	if (obj.tagName.toLowerCase() == 'form') {
		switch (obj.method.toLowerCase()) {
			case 'get':
				attr = false;
			break;
			case 'post':
				attr = 'action';
			break;
		}
	}
	if (attr) {
		var val = obj.getAttribute(attr);
		if (/(\?|&)scr=\d+x\d+($|&)/.test(val)) {
			val = val.replace(/(\?|&)scr=\d+x\d+($|&)/, '$1scr='+GetScroll()+'$2');
		} else {
			val += (/\?/.test(val)?'&':'?')+'scr='+GetScroll();
		}
		obj.setAttribute(attr, val);
	}
	return true;
}


function window_load() {
	var href = document.location.href;
	var Reg = /(\?|&)scr=(\d+)x(\d+)($|&)/;
	var R = Reg.exec(href);
	if (R) {
		SetScroll(R[2], R[3]);
	}
}


JS.add_handler(window, 'load', window_load, window);MainMenu = {
	Index:{},
	
	elArrow:null,
	SelectedMenuId:false,
	
	Build: function (Menu) {
		var mmplace='mmplace'.e();
		
		if (mmplace.innerHTML) {
			Menu=eval('('+mmplace.innerHTML+')');
			mmplace.innerHTML='';
		}
		
		// Создаем главное меню
		
		Menu = Menu.unrotate();
		
		for(var i=0; i<Menu.length; i++) {
			var menuitem=Menu[i];
			if (menuitem.parent_id == 0) {
				var div, span, a;
				
				/* Создаем подменю */
				
				var SiteMapStr='';
				for(var j=0; j<Menu.length; j++) {
					var mi=Menu[j];
					if (mi.parent_id == menuitem.id) {
						SiteMapStr+='<span class="sm-i"><h1>'+mi.title+'</h1><ul>';
						for(var k=0; k<Menu.length; k++) 
							if (Menu[k].parent_id == mi.id)
								SiteMapStr+='<li>' + Menu[k].title+ '</li>';
						SiteMapStr+='</ul></span>';
					}
				}
				menuitem.html = SiteMapStr;
				
				/* Добавляем на верхний бар */
				
				mmplace.appendChild(div=document.createElement('span'));
				div.className='mm-tb-item';
				div.appendChild(span=document.createElement('span'));
				span.className='mm-tb-al';
				div.appendChild(a=document.createElement('a'));
				a.href='#mm-'+menuitem.id;
				a.innerHTML = menuitem.title;
				
				JS.add_handler(a, 'click', MainMenu.OpenByA);
				JS.add_handler(div, 'click', MainMenu.OpenByA, a);

				JS.add_handler(a, 'mouseover', MainMenu.OpenByA);
				JS.add_handler(div, 'mouseover', MainMenu.OpenByA, a);

				this.Index[menuitem.id] = {'div':div, 'a':a, 'menu':menuitem};
			}
			if (i==0) this.Index['default'] = menuitem.id;
		}
		
		// Создаем стрелочку
		this.elArrow = document.createElement('div');
		this.elArrow.className = 'mm-arr';
		
		// Окрываем главное меню
		if (this.Index['default']) this.OpenByHash();
	},
	
	OpenByA: function (e) {
		MainMenu.OpenByHash(this.hash.substr(1));
		return JS.handled(e, true);
	},
	
	OpenByHash: function (hash) {
		var r;
		if (hash) {
			r = /mm-([a-z0-9_]+)/.exec(hash);
			r = (r&&this.Index[r[1]])?r[1]:this.Index['default'];
		} else {
			r = JS.readCookie('menuitem');
			r = r?r:this.Index['default'];
		}
		JS.writeCookie('menuitem', r);
		var mi = this.Index[r];
		if (this.SelectedMenuId) {this.Index[this.SelectedMenuId].div.className='mm-tb-item';}
		mi.div.className = 'mm-sel mm-tb-item';
		mi.div.insertBefore(this.elArrow, mi.div.firstChild);
		mi.a.blur();
		E('mmblock').innerHTML = mi.menu.html;
		this.SelectedMenuId = mi.menu.id;
	}

};
