// текущий видимый элемент
g_current_visible = null;
// ширина клиентской области ( null, т.к. документ не загрузился)
g_all_width = null;
// высота клиентской области
g_all_height = null;
// полная высота документа
g_all_scroll = null;
// рут документа
g_root = document.URL.match( /(.*\/)[^\/]*$/)[1];

function getText( node) {
	temp = node.text ? node.text : node.textContent;
	return temp ? temp : node.innerText;
}

// генерируем условия совпадения элемента для get_elements()
function get_expression( element, value) {
    if ( !value.tagName) {
        return {
            exp: null,
            num: null
        }
    }
	// определяем, что надо искать
	// ищем любые элементы с классом
    regExp = /^\.([^\[]+)(?:\[(\d+)\])?/;
    regExp2 = /^(\w+)\.([^\[]+)(?:\[(\d+)\])?/;
    regExp3 = /^([^\[]+)(?:\[(\d+)\])?$/;
	if ( element.match( regExp) ) {
		expression = (value.className == element.match( regExp)[1]);
		// если запрашивается элемент под определённым номером
		if ( element.match( regExp)[2]) {
    		number = element.match( regExp)[2];
		} else {
		  number = null;
		}
	// ищем определённые элементы с классом
	} else if ( element.match( regExp2) ) {
		expression = (value.tagName.toLowerCase() == element.match( regExp2)[1] && value.className == element.match( regExp2)[2]);
		// если запрашивается элемент под определённым номером
		if ( element.match( regExp2)[3] ) {
			number = element.match( regExp2)[3];
		} else {
            number = null;
		}
	// ищем определённые элементы без класса
	} else if ( element.match( regExp3) ) {
		expression = (value.tagName.toLowerCase() == element.match( regExp3)[1]);
		// если запрашивается элемент под определённым номером
		if ( element.match( regExp3)[2] ) {
			number = element.match( regExp3)[2];
		} else {
            number = null;
		}
	}
    return {
        exp: expression,
        num: number
    }
}

// получаем массив, удовлетворяющий условиям
function get_elements( element, root) {
	// определяем, является ли предыдущий запрошенный элемент массивом
	result = [];
	if ( root[0]) {
		for ( var i in root ) {
            counter = -1;
			// ищем в текущем элементе
			for( var j in current_children = root[i].children ) {
                value = current_children[j];
                // если выбранное условие выполняется, пишем в результат
                if ( get_expression( element, value).exp) {
                    counter ++;
                    if ( get_expression( element, value).num) {
                        if ( counter == get_expression( element, value).num ) {
                            result[result.length] = value;
                            break;
                        } else {
                            continue;
                        }
                    } else {
                        result[result.length] = value;
                    }
                }
			}
		}
	} else {
	    counter = -1;
		for( var j in current_children = root.children ) {
            value = current_children[j];
            // если выбранное условие выполняется, пишем в результат
            if ( get_expression( element, value).exp ) {
                counter ++;
                if ( get_expression( element, value).num) {
                    if ( counter == get_expression( element, value).num ) {
                        result[result.length] = value;
                        break;
                    } else {
                        continue;
                    }
                } else {
                    result[result.length] = value;
                }
            }
		}
	}
    return result;
}

// обрабатываем принудительные флаги
function accept_flag( root, flag) {
    switch ( flag ) {
        // если результат должен быть массивом в любом случае
        case "array":
/*          
            if ( root && typeof root != "object") {
                root = [root];
            }
*/
            break;
        default:
            // если массив с одним элементом, то вытаскиваем его из массива
            if ( root && root.length == 1) {
                root = root[0];
            }
    }
    return root
}

// получаем элемент по css пути
function $( path, root) {
    // если в адресе есть id, то обрезаем адрес до него
    regexp = /^([^#]+)(#.+)$/; 
    path = trim( path).replace( regexp, "$2");
	path_elements = path.split( " ");
	root = root || document.body;
    flag = null;
	for ( var i in path_elements) {
		switch ( path_elements[i].substr( 0, 1) ) {
			case ".":
				root = get_elements( path_elements[i], root);
				break;
			case "#":
				root = document.getElementById( path_elements[i].substr( 1));
				break;
			case ":":
				alert( ":");
				break;
			case "!":
                flag = path_elements[i].substr( 1);
				break;
			default:
				root = get_elements( path_elements[i], root);
		}
	}
    return accept_flag( root, flag);
}

// копируем контент элемента
function copyElementContent( fromElem, toElem) {
	tempArray = new Array();
    
	childArray = fromElem.childNodes;
	for ( var i in childArray) {
		if ( childArray[i].nodeType && childArray[i].nodeType == 1) {
			tempArray[i] = childArray[i];
		}
	}
	for ( var i in tempArray) {
		toElem.appendChild( tempArray[i]);
	}
}

// удаляем дочерние элементы
function deleteChildren( node) {
	while ( node.firstChild) {
		node.removeChild(node.firstChild);
	}
}

// выдаём "координаты" ячейки в таблице
function getTableCoord( tdElement) {
    trElementArray = getElementsArray( tdElement.parentNode, "td");
    tableElementArray = getElementsArray( tdElement.parentNode.parentNode, "tr");
    row = 0;
	col = 0;

    for ( var i in tableElementArray) {
        // в этой ли строке находится искомый элемент?
        if ( tableElementArray[i] == tdElement.parentNode) {
            break;
        } else {
            row ++;
        }
    }
    
	for ( var i in trElementArray) {
	   // в этом ли столбце находится искомый элемент
        if ( trElementArray[i] == tdElement) {
            break;
        } else {
            col ++;
        }
	}

	return { "x": col, "y": row}
}

// переключатель видимости элемента ( если мягкий, то через visibility, иначе через display)
function showElement( element, soft) {
    soft = soft || false;
    if ( element.style.display == "none" && !soft || element.style.visibility == "hidden" && soft) {
        if ( !soft) {
            element.style.display = "block";
        }
        element.style.visibility = "visible";
    } else {
        if ( !soft) {
            element.style.display = "none";
        }
        element.style.visibility = "hidden";
    }
}

// закрыть элемент в курсоре
function hideElementInCursor() {
	if ( g_current_visible) {
		g_current_visible.style.display = "none";
	}
}

// скрыть элемент в курсоре через некоторое время
function closeElementInCursor() {
	var timeOut = window.setTimeout( "hideElementInCursor()", 350);
}

// поместить абсолютный элемент в позицию курсора
function showElementInCursor( div, event) {
	hideElementInCursor();
	
 	if ( div && div.style.display == "none") {
		g_current_visible = div;
		div.style.display = "block";
	}
	var wwidth = (window.innerWidth)?window.innerWidth: ((document.all)?document.body.offsetWidth:null);
	if (!event) event=window.event;
	x = (event.clientX) ?  event.clientX : ((event.pageX) ? event.pageX : event.screenX);
	y = (event.clientY) ? (event.clientY + 15) : (event.pageY + 15);
	if ( document.documentElement.scrollTop == 0) {
		y += document.body.scrollTop;
	} else {
		y += document.documentElement.scrollTop;
	}
	
	if ( x + div.offsetWidth + 20 >= wwidth) {
		x -= div.offsetWidth;
	}
	div.style.top = y+"px";
	div.style.left = x+"px";
}

// отцентровать элемент по вертикали и горизонтали
function centreElement( element) {
    if ( !g_all_width) {
        g_all_width = (document.body.scrollWidth) ? document.body.scrollWidth : document.documentElement.scrollWidth;
    }
    if ( !g_all_height) {
        g_all_height = ( document.documentElement.offsetHeight < document.body.offsetHeight) ? document.documentElement.offsetHeight: document.body.offsetHeight;
    }
    if ( !g_all_scroll) {
       g_all_scroll = (document.body.scrollHeight) ? document.body.scrollHeight : document.documentElement.scrollHeight;
    }
    
    element.style.left = Math.ceil( g_all_width / 2 - element.offsetWidth / 2);
    element.style.top = Math.ceil( g_all_height / 2 - element.offsetHeight / 2);
}

// обрезаем начальные и конечные пробелы
function trim( string) {
	var regExp = /^(\s)*(.*)(\s)*$/;
	return string.match( regExp)[2];
}

// получаем значение кук  и помещаем их в глобальный массив $_COOKIE
$_COOKIE = new Object();
paar_array = document.cookie.split( ";");

for ( var i in paar_array ) {
	current_values = paar_array[i].split( "=");
	$_COOKIE[trim(current_values[0])] = current_values[1];
}

