/*	Набор необходимых скриптов для Octopus
	(c) Copyright Siorre.ru creative group | Авторское право Siorre.ru
	Исп. редактор EditPlus2. Значение табуляции "4", значение отступа "4"	*/

/*	JSLib : Набор скриптов общего назначения */

var global = new Object()	//	Содержит глобальные перменные
var mem = new Object()		//	Содержит кратковременные переменные
var key = new Array()		//	Содержит последовательность кодов нажатых клавиш
var map = "secManag"		//	Карта текущей работы с системой (Управление разделами по умолч.)
//var cash = new Object()		//	Служит для кэширования объектов


function getNodesByClass (className, p1, p2)
{
	/*	className : string
		p1 : array | string
		p2 : boolean | string	*/

	var nodes
	var result = new Array()
	var names  = new Array()

	if (className.search(/&/)!=-1)
		names = className.split("&")
	else
		names [0] = className;

	if ((typeof p1)=="string")
	{
		nodes = document.getElementById(p1)
		if (p2)
		{
			nodes = nodes.getElementsByTagName(p2)
		}
		else
			nodes = nodes.childNodes
	}
	else
		nodes = p1

	for (var j=0; j<names.length; j++)
	{
		for (var i=0; i<nodes.length; i++)
			if (nodes[i].className==names[j])
				result.push(nodes[i])
	}

	return result
}

function getSiblingNode(node, dir, mode)
{
	/*	dir : "next" | "previous", mode : true | false
		Если в процессе перебора соседних узлов
		встречается узел с типом "#text" то этот
		узел удаляется или игнорируется (true, false)
		в соответствии со значением mode	*/

	var n = eval("node."+dir+"Sibling")

	while (n)
	{
		if (n.nodeType!=1)
		{
			if (mode)
			{
				node.parentNode.removeChild(n)
				n = eval("node."+dir+"Sibling")
			}
			else
				n = eval("n."+dir+"Sibling");
		}

		if (n && n.nodeType==1)
			return n
	}

	return false
}

/*	Функция проверяет узел (node) на содержание
	дочерних узлов определенного типа	*/
function hasChildsByType(node)
{
	var args = hasChildsByType.arguments
	var type = (args.length > 1) ? args[0] : 1
	var flag = false

	node = node.firstChild
	
	while (node)
	{
		if (node.nodeType==type)
			return true
		else
			node = node.nextSibling
	}

	return false
}

function getFirstChild(node)
{
	var n = node.firstChild

	while (n)
	{
		if (n.nodeType!=1)
			n = n.nextSibling
		if (n && n.nodeType==1)
			return n
	}

	return false
}
function getLastChild(node)
{
	var n = node.lastChild

	while (n)
	{
		if (n.nodeType!=1)
			n = n.previousSibling
		if (n && n.nodeType==1)
			return n
	}

	return false
}

/*	Создание определенного элемента HTML */
function createElement(name)
{
	/*	Если передан только один параметр,
		то создается элемент с названием name.
		Если несколько параметров, то из первого параметра
		берется имя для элемента, а из других
		атрибут-значение
		createElement(name, [attr, val [,attr, val .. ]]) */

	var node
	var args = createElement.arguments

	node = eval('document.createElement("'+name+'")')
	
	if (args.length==1 || args.length % 2 == 0)
		return node
	
	if (name.toLowerCase()=="img")
	{
		var attrs = ""

		for (i=1; i<args.length; i+=2)
		{
			if (args[i]=="alt")
				attrs += args[i];
			if (args[i]=="border")
				attrs += args[i];
		}
		
		if (!attrs.match(/alt/))
			node.alt="";
		if (!attrs.match(/border/))
			node.border="0";
	}

	for (i=1; i<args.length; i+=2)
	{
		var attr = args[i]
		var val = args[i+1]
		eval('node.'+attr+'="'+val+'"')
	}

	return node
}

function call()
{
	/*	Функция call служит для проверки
		объявления других функций.
		call(p1, [p2,..,pN])
		p1		: String			/ ссылка на функцию (имя функции)
		p2..N	: Собственный тип	/ параметры для вызова проверяемой функции

		Функция проверяет существует ли возможность
		вызова функции (p1), если да, то инициализирует
		вызов, нет - возвращает false	*/
	
	var args = call.arguments
	if (args.length==0)
		return false

	var cmd  = "(typeof "+args[0]+")"

	if (!eval(cmd).match(/function/))
		return false

	cmd = args[0]+"("
	for (var i=1; i<args.length; i++)
	{
		cmd += "args["+i+"]"

		if (i!=args.length-1)
			cmd += ","
	}
	cmd += ")"
	eval(cmd)
		return
	try {
		eval(cmd)
	}
	catch(e) {
		alert("general.js : Function "+args[0]+" passed with errors");
	}

}

function parseNum(value)
{
	/*	Функция принимает на входе
		строковое значение, содержащее
		цифры и символы (точно в таком порядке),
		"парсит" только цифры и возвращает
		числовое целое значение.
		Пример
		на входе	: "100%" или "200px"
		на выходе	: 100 или 200 */
	
	if (typeof value == "string")
	{
		/*	Шаблон для выражения типа [-]число */
		var v = value.match(/^-?\d+/)
		return parseInt(v)
	}
	else
		if (typeof value == "number")
			return value
		else
			return alert("general.js : Function parseNum called with wrong formatted value")
}