//
// Copyright (c) Art. Lebedev Studio | http://www.artlebedev.ru/
// Author - Leechy | leechy@design.ru
//


/*****************************
**   Event listeners
******************************/

function addEvent(objElement, strEventType, ptrEventFunc, bCapture) {
	if (bCapture == null) bCapture = false;
	if (objElement.addEventListener) objElement.addEventListener(strEventType, ptrEventFunc, bCapture);
		else if (objElement.attachEvent) objElement.attachEvent('on' + strEventType, ptrEventFunc);
}

function removeEvent(objElement, strEventType, ptrEventFunc, bCapture) {
	if (bCapture == null) bCapture = false;
	if (objElement.removeEventListener) objElement.removeEventListener(strEventType, ptrEventFunc, bCapture);
		else if (objElement.detachEvent) objElement.detachEvent('on' + strEventType, ptrEventFunc);
}


/*****************************
**   Common class methods
******************************/

function switchClass( objNode, strCurrClass, strNewClass ) {
	if ( matchClass( objNode, strNewClass ) ) replaceClass( objNode, strCurrClass, strNewClass );
		else replaceClass( objNode, strNewClass, strCurrClass );
}

function removeClass(oNode, sCurrClass) {
	if (matchClass(oNode, sCurrClass)) replaceClass(oNode, '', sCurrClass);
}

function addClass(oNode, sNewClass) {
	if (!matchClass(oNode, sNewClass)) replaceClass(oNode, sNewClass, '');
}

function addRemoveClass(oNode, sClass, bAction) {
	if (bAction && !matchClass(oNode, sClass)) replaceClass(oNode, sClass, '');
	else if (!bAction && matchClass(oNode, sClass)) replaceClass(oNode, '', sClass);
}

function replaceClass( objNode, strNewClass, strCurrClass ) {
	var strOldClass = strNewClass;
	if ( strCurrClass && strCurrClass.length ){
		strCurrClass = strCurrClass.replace( /\s+(\S)/g, '|$1' );
		if ( strOldClass.length ) strOldClass += '|';
		strOldClass += strCurrClass;
	}
	objNode.className = objNode.className.replace( new RegExp('(^|\\s+)(' + strOldClass + ')($|\\s+)', 'g'), '$1' );
	objNode.className += ( (objNode.className.length)? ' ' : '' ) + strNewClass;
}

function matchClass( objNode, strCurrClass ) {
	return ( objNode && objNode.className.length && objNode.className.match( new RegExp('(^|\\s+)(' + strCurrClass + ')($|\\s+)') ) );
}


/*****************************
**   Common cookie methods
******************************/

// Functions from Netscape's JavaScript Guide
// http://developer.netscape.com/docs/manuals/js/client/jsguide/

function setCookie(name, value, expire, path) {
	document.cookie = name + '=' + escape(value)
		+ ((expire == null)? '' : ('; expires=' + expire.toGMTString()))
		+ ((path == null)? '' : ('; path=' + path));
}

function getCookie(Name) {
	var search = Name + '='
	if (document.cookie.length > 0) { // if there are any cookies
		offset = document.cookie.indexOf(search) 
		if (offset != -1) { // if cookie exists 
			offset += search.length 
			// set index of beginning of value
			end = document.cookie.indexOf(';', offset) 
			// set index of end of cookie value
			if (end == -1) 
				end = document.cookie.length
			return unescape(document.cookie.substring(offset, end))
		}
	}
	return '';
}


/*****************************
**   Some other methods
******************************/

function getTextValue( objNode ) {
	var strValue = new String();
	if ( objNode.childNodes.length ) {
		for ( var i = 0; i < objNode.childNodes.length; i++ ) {
			if ( objNode.childNodes[i].nodeType == 1 ) strValue += getTextValue( objNode.childNodes[i] );
			if ( objNode.childNodes[i].nodeType == 3 ) strValue += objNode.childNodes[i].nodeValue;
		}
	}
	return strValue;
}

function getAncestorByClassName( oCurrentElement, sClassName, sTagName ) {
	var eCurrent = oCurrentElement.parentNode;
	while ( eCurrent.parentNode ) {
		if ( matchClass( eCurrent, sClassName ) && ( !sTagName || eCurrent.tagName.toLowerCase() == sTagName.toLowerCase() ) ) return eCurrent;
		eCurrent = eCurrent.parentNode;
	}
}

function getAncestorByTagName( oCurrentElement, sTagName ) {
	var eCurrent = oCurrentElement.parentNode;
	while ( eCurrent.parentNode ) {
		if ( eCurrent.tagName.toLowerCase() == sTagName.toLowerCase() ) return eCurrent;
		eCurrent = eCurrent.parentNode;
	}
}

function getNextSiblingByTagName( eCurrentElement, sTagName ) {
	var eCurrent = eCurrentElement.nextSibling;
	while ( eCurrent ) {
		if ( eCurrent.nodeType == 1 && eCurrent.tagName.toLowerCase() == sTagName.toLowerCase() ) return eCurrent;
		eCurrent = eCurrent.nextSibling;
	}
	return null;
}

function getPrevSiblingByTagName( eCurrentElement, sTagName ) {
	var eCurrent = eCurrentElement.previousSibling;
	while ( eCurrent ) {
		if ( eCurrent.nodeType == 1 && eCurrent.tagName.toLowerCase() == sTagName.toLowerCase() ) return eCurrent;
		eCurrent = eCurrent.previousSibling;
	}
	return null;
}

function getNextSiblingByClassName( eCurrentElement, sClassName, sTagName ) {
	var eCurrent = eCurrentElement.nextSibling;
	while ( eCurrent ) {
		if (
			eCurrent.nodeType == 1
			&& matchClass( eCurrent, sClassName )
			&& (
				!sTagName
				|| eCurrent.tagName.toLowerCase() == sTagName.toLowerCase()
			)
		) return eCurrent;
		eCurrent = eCurrent.nextSibling;
	}
	return null;
}

function getPrevSiblingByClassName( eCurrentElement, sClassName, sTagName ) {
	var eCurrent = eCurrentElement.previousSibling;
	while ( eCurrent ) {
		if (
			eCurrent.nodeType == 1
			&& matchClass( eCurrent, sClassName )
			&& (
				!sTagName
				|| eCurrent.tagName.toLowerCase() == sTagName.toLowerCase()
			)
		) return eCurrent;
		eCurrent = eCurrent.previousSibling;
	}
	return null;
}

function getPageY( oElement ) {
	var iPosY = oElement.offsetTop;
	while ( oElement.offsetParent != null ) {
		oElement = oElement.offsetParent;
		iPosY += oElement.offsetTop;
		if (oElement.tagName == 'BODY') break;
	}
	return iPosY;
}

function getPageX( oElement ) {
	var iPosX = oElement.offsetLeft;
	while ( oElement.offsetParent != null ) {
		oElement = oElement.offsetParent;
		iPosX += oElement.offsetLeft;
		if (oElement.tagName == 'BODY') break;
	}
	return iPosX;
}

function mailLink( sName, sDomain, sLinkText ) {
	document.writeln('<a href="mailto:' + sName + '@' + sDomain + '">' + sLinkText + '</a>');
}

function defaultOption(oOptions, vOptionValue, vDefault) {
	if (oOptions && oOptions[vOptionValue] != null) return oOptions[vOptionValue];
	else return vDefault;
}


/* debug function */
function dalert( sMessage ) {
//	printfire(sMessage);
	var oDalertDiv = document.getElementById('dalert');
	if ( oDalertDiv ) oDalertDiv.innerHTML = sMessage;
}

function printfire() {
	if (document.createEvent) {
		printfire.args = arguments;
		var ev = document.createEvent("Events");
		ev.initEvent("printfire", false, true);
		dispatchEvent(ev);
	}
}



/*  */
function toggleParentBranch(eLink) {
	var eBranch = getAncestorByClassName(eLink, 'branch', 'div');
	if (eBranch && !matchClass(eBranch, 'branch-found')) {
		var eContainer = getNextSiblingByClassName( eBranch, 'container', 'div' );
		if (eContainer) {
			switchClass(eContainer, 'container-closed', 'container-opened');
		}
		switchClass(eBranch, 'closed', 'opened');
	}
}


function addClassToParents(aNodes, sClassName, sParentClasses, eParent) {
	for (var i = 0; i < aNodes.length; i++) {
		var eThisParent = aNodes[i][0].parentNode;
		while (eThisParent && eThisParent != eParent) {
			if (matchClass(eThisParent, 'branch') ) {
				addClass(eThisParent, 'branch-found');
				var eBranchLabel = getNextSiblingByClassName( eThisParent, 'container' );
				if (eBranchLabel) addClass(eBranchLabel, 'container-found');
			}
			if (matchClass(eThisParent, 'container') ) {
				addClass(eThisParent, 'container-found');
				var eBranchLabel = getPrevSiblingByClassName( eThisParent, 'branch' );
				if (eBranchLabel) addClass(eBranchLabel, 'branch-found');
			}
			eThisParent = eThisParent.parentNode;
		}
	}
}


function removeClassFromParents(aNodes, sClassName, sParentClasses, eParent) {
	for (var i = 0; i < aNodes.length; i++) {
		var eThisParent = aNodes[i][0].parentNode;
		while (eThisParent && eThisParent != eParent) {
			if (matchClass(eThisParent, 'branch') ) {
				removeClass(eThisParent, 'branch-found');
				var eBranchLabel = getNextSiblingByClassName( eThisParent, 'container' );
				if (eBranchLabel) removeClass(eBranchLabel, 'container-found');
			}
			if (matchClass(eThisParent, 'container') ) {
				removeClass(eThisParent, 'container-found');
				var eBranchLabel = getPrevSiblingByClassName( eThisParent, 'branch' );
				if (eBranchLabel) removeClass(eBranchLabel, 'branch-found');
			}
			eThisParent = eThisParent.parentNode;
		}
	}
}

function FAYTResults(FAYTObject) {
	var eFAYTResults = document.getElementById('fayt-results');
	if (!eFAYTResults) return;
	if (!FAYTObject.sLastText || FAYTObject.sLastText.length < FAYTObject.iMinTextLength) {
		/* ничего не искали */
		eFAYTResults.className = '';
	} else if (FAYTObject.aOccurrences.length) {
		/* ничего не найдено */
		eFAYTResults.className = 'filtered';
	} else {
		/* фильтр применен */
		eFAYTResults.className = 'no-results';
	}
}


function showFrame(sAddress, sImageName, eCurrentCell) {
	if (document.images && document.images[sImageName]) {
		document.images[sImageName].src = sAddress;
		if (eCurrentCell) {
			for (var i = 0; (eCell = eCurrentCell.parentNode.getElementsByTagName('td')[i]); i++) {
				if (eCell.className == 'selected' && eCell != eCurrentCell) eCell.className = '';
				if (eCell.className != 'selected' && eCell == eCurrentCell) eCell.className = 'selected';
			}
		}
		return false;
	} else return true;
}



/* arrayprototype.js
 * by Peter Belesis. v1.0 000516
 * Copyright (c) 2000 Peter Belesis. All Rights Reserved.
 * Originally published and documented at http://www.dhtmlab.com/
 * License to use is granted if and only if this entire copyright notice
 * is included.
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
*/

if(Array.prototype.splice && typeof([0].splice(0))=="number")Array.prototype.splice = null;
if(!Array.prototype.splice) {
	function array_splice(ind,cnt){
		if(arguments.length == 0) return ind;
		if(typeof ind != "number") ind = 0;
		if(ind < 0) ind = Math.max(0,this.length + ind);
		if(ind > this.length) {
		if(arguments.length > 2) ind = this.length;
			else return [];
		}
		if(arguments.length < 2) cnt = this.length-ind;
		cnt = (typeof cnt == "number") ? Math.max(0,cnt) : 0;
		removeArray = this.slice(ind,ind+cnt);
		endArray = this.slice(ind+cnt);
		this.length = ind;
		for(var i=2;i<arguments.length;i++){
			this[this.length] = arguments[i];
		}
		for(var i=0;i<endArray.length;i++){
			this[this.length] = endArray[i];
		}
		return removeArray;
	}
	Array.prototype.splice = array_splice;
}
