js = {
    get : {},
    set : {},
    cookies : {},
    hash : {},
    html : {},
    tags : {},
    ajax : {},
	drag : {},
	glbl : {
		email : 'shushik@leopards.ru',
		http : false,
		func : false,
		pos : 1000,
		button : false,
		drag : false,
		cursor : {x : 0, y : 0, button : false},
		moved : {x : 0, y : 0}
	},
    lang : [
        'января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря',
        'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье',
        ' б', ' кб', ' мб', ' гб', ' тб',
    ]
}
//	Получить элемент по id
js.get.element = function(id) {
	if(typeof js.tags[id] == 'undefined') {js.set.cache(id);}
	return(js.tags[id]);
}
//	Получить массив с содержанием хэша
js.get.hash = function() {
    var lcl = {hash : document.location.hash.replace(/#/, '').split(';')}
    for(var i in lcl.hash) {
        lcl.temp = lcl.hash[i].split('=');
        js.hash[lcl.temp[0]] = lcl.temp[1];
    }
}
//	Получить массив с куками
js.get.cookies = function() {
    if(document.cookie) {
        var lcl = {cookies : document.cookie.split('; ')}
        for(var i in lcl.cookies) {
            lcl.temp = lcl.cookies[i].split('=');
            if(lcl.temp[1]) {js.cookies[lcl.temp[0]] = lcl.temp[1];}
        }
    } else {js.cookies = false;}
}
//	Получить координаты элемента
js.get.pos = function(el) {
	var lcl = {
		top : el.offsetTop,
		left : el.offsetLeft
	}
	return({x : lcl.left, y : lcl.top});
}
//	Получить псевдослучайное число в диапазоне от start до stop
js.get.rand = function(start, stop) {
	start = start - 0;
	stop = stop - 0;
	return(Math.floor(Math.random() * (stop - start + 1)) + start);
}
//	Получить форматированную дату (на входе надо отдавать UTC)
js.get.fdate = function(old, shab) {
    var lcl = {temp : new Date()}
    lcl.temp.setTime(old);
    lcl.change = {
        'Y' : lcl.temp.getFullYear(),
        'y' : String(lcl.temp.getFullYear()).substr(2, 2),
        'M' : js.lang[lcl.temp.getMonth()],
        'm' : lcl.temp.getMonth() + 1,
        'D' : js.lang[lcl.temp.getDay() + 12 - 1],
        'd' : lcl.temp.getDate(),
        'h' : lcl.temp.getHours() ,
        'i' : lcl.temp.getMinutes(),
        's' : lcl.temp.getSeconds()
    }
    lcl.change['H'] = lcl.change['h'];
    if(String(lcl.change['H']).length < 2) {lcl.change['H'] = '0' + lcl.change['H'];}
    lcl.change['I'] = lcl.change['i'];
    if(String(lcl.change['I']).length < 2) {lcl.change['I'] = '0' + lcl.change['I'];}
    lcl.change['S'] = lcl.change['s'];
    if(String(lcl.change['S']).length < 2) {lcl.change['S'] = '0' + lcl.change['S'];}
    for(var i in lcl.change) {shab = shab.replace(i, lcl.change[i]);}
    return(shab);
}
//	Получить отформатированный размер файла (на входе надо отдавать размер в байтах)
js.get.fsize = function(bytes) {
    var lcl = {result : 0 + js.lang[19]}
    if(bytes > 0) {
        if(bytes >= 1099511627776) {lcl.result = Math.round(bytes / 1099511627776 * 100) / 100 + js.lang[23];}
        else if(bytes >= 1073741824) {lcl.result = Math.round(bytes / 1073741824 * 100) / 100 + js.lang[22];}
        else if(bytes >= 1048576) {lcl.result = Math.round(bytes/1048576 * 100) / 100 + js.lang[21];}
        else if(bytes >= 1024) {lcl.result = Math.round(bytes / 1024 * 100) / 100 + js.lang[20];}
        else {lcl.result = bytes + js.lang[19];}
    }
    return(lcl.result);
}
//	Обновить элемент в кэше
js.set.cache = function(id) {
	js.tags[id] = document.getElementById(id);
}
//	Установить куку
js.set.cookie = function(cookie, value, year) {
    var lcl = {gdate : new Date()}
    lcl.exptime = lcl.gdate.getTime() + (year * 365 * 24 * 60 * 60 * 1000);
    lcl.gdate.setTime(lcl.exptime);
    document.cookie = cookie + '=' + value + '; expires=' + lcl.gdate.toGMTString();
}
//	Установить событие
js.set.event = function(object, ename, handler) {
	if (object.attachEvent) {object.attachEvent('on' + ename, handler);}
	else if (object.addEventListener) {object.addEventListener(ename, handler, true);}
}
//	Получить координаты курсора мыши на странице
js.set.cursor = function(event) {
	var lcl = {
		x : js.glbl.cursor.x,
		y : js.glbl.cursor.y
	}
	if(!event) {event = window.event;}
	if(event.which) {js.glbl.cursor.button = event.button;}
	if(event.pageX || event.pageY) {
		js.glbl.cursor.x = event.pageX;
		js.glbl.cursor.y = event.pageY;
	} else if(event.clientX || event.clientY) {
		js.glbl.cursor.x = event.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
		js.glbl.cursor.y = event.clientY + (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop;
	}
	js.glbl.moved.x = lcl.x - js.glbl.cursor.x;
	js.glbl.moved.y = lcl.y - js.glbl.cursor.y;
}
//	Установить функцию-обработчик для нажатия клавиши
js.set.keyboard = function(event) {
	if(!event) {event = window.event;}
	if(js.glbl.func) {
		var lcl = {func : js.glbl.func + '(event);'}
		eval(lcl.func);
//		if(event.keyCode) {alert(event.keyCode);} // Раскомментировать, если нужно получить код какой-нибудь клавиши
//		event.ctrlKey - Контрл, event.shiftKey - Шифт.
	}
}
//	Установить элементу класс
js.set.cname = function(el, c0, c1) {
	el.className = c1 && el.className == c0 ? c1 : c0;
}
//	Установить прозрачность элемента
js.set.opacity = function(el, no) {
	var lcl = {ie : (no - 0) * 100}
	el.style['opacity'] = no;
	el.style['-moz-opacity'] = no;
	el.style['-khtml-opacity'] = no;
	el.style['filter'] = 'alpha(opacity=' + lcl.ie + ')';
}
//	Установить элемент поверх остальных
js.set.pos = function(el) {
	js.glbl.pos++;
	el.style.zIndex = js.glbl.pos;
}
//	Установить или изменить содержимое элемента по id
js.set.html = function(id, content) {js.get.element(id).innerHTML = content;}
//	Обновить объект аякса
js.ajax.refresh = function() {
    if(navigator.appName == "Microsoft Internet Explorer") {js.glbl.http = new ActiveXObject("Microsoft.XMLHTTP");}
    else {js.glbl.http = new XMLHttpRequest();}
}
//	Javascript-инклюд
js.ajax.include = function(path) {
    js.ajax.refresh();
    js.glbl.http.open("GET", path, false);
    js.glbl.http.setRequestHeader('Accept-Charset', 'windows-1251');
    js.glbl.http.onreadystatechange = function() {
        if(js.glbl.http.readyState == 4) {eval(js.glbl.http.responseText);}
    }
    js.glbl.http.send(null);
}
//	Подгрузить содержимое блока через Ajax и заменить его
js.ajax.replace = function(id, path) {
    js.ajax.refresh();
    js.glbl.http.open("GET", path, true);
//  js.glbl.http.setRequestHeader('Accept-Language', 'en');
    js.glbl.http.setRequestHeader('Accept-Charset', 'windows-1251');
    js.glbl.http.onreadystatechange = function() {
        if(js.glbl.http.readyState == 4) {js.html.replace(id, js.glbl.http.responseText);}
    }
    js.glbl.http.send(null);
}
//	Задать элемент для "таскалки"
js.drag.start = function(el) {
	js.set.pos(el);
	js.glbl.drag = el;
	el.onmousemove = function() {js.drag.ing();}
	el.onmouseover = function() {js.drag.ing();}
	el.onmouseup = function() {js.drag.stop();}
	el.onmouseout = function() {js.drag.stop();}
}
//	Тащить элемент мышкой
js.drag.ing = function() {
	if(js.glbl.drag != false) {
		var lcl = {curr : js.get.pos(js.glbl.drag)}
		lcl.y = lcl.curr.y - js.glbl.moved.y;
		lcl.x = lcl.curr.x - js.glbl.moved.x;
		js.glbl.drag.style.top = lcl.y + 'px';
		js.glbl.drag.style.left = lcl.x + 'px';
	}
}
//	Если кнопка мыши отжата или курсор вышел за пределы блока - отмена всех действий
js.drag.stop = function() {
	js.glbl.drag.onmouseover = '';
	js.glbl.drag.onmouseout = '';
	js.glbl.drag.onmouseup = '';
	js.glbl.drag = false;
}
//
js.sign = function(el) {
	el.href = 'mailto:' + js.glbl.email;
}