/*****************************
**   Misc functions
******************************/
function $(id){
	return document.getElementById(id);    
}
	
/*****************************
**   Event listeners
******************************/

function checkEvent(oEvt){
	oEvt=(oEvt) ? oEvt : ( (window.event) ? window.event : null );
	if(oEvt && oEvt.srcElement && !window.opera)
		oEvt.target=oEvt.srcElement;
	return oEvt;
}

function addEvent(objElement, strEventType, ptrEventFunc) {
	if (objElement.addEventListener)
		objElement.addEventListener(strEventType, ptrEventFunc, false);
	else if (objElement.attachEvent)
		objElement.attachEvent('on' + strEventType, ptrEventFunc);
}

function removeEvent(objElement, strEventType, ptrEventFunc) {
	if (objElement.removeEventListener) objElement.removeEventListener(strEventType, ptrEventFunc, false);
		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( objNode, strCurrClass ) {
	replaceClass( objNode, '', strCurrClass );
}

function addClass( objNode, strNewClass ) {
	replaceClass( objNode, strNewClass, '' );
}

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+)') ) );
}

function getAncestorByClassName( oCurrentElement, sClassName, sTagName ) {
	var oCurrent = oCurrentElement.parentNode;
	while ( oCurrent.parentNode ) {
		if ( matchClass( oCurrent, sClassName ) && ( !sTagName || oCurrent.tagName.toLowerCase() == sTagName.toLowerCase() ) ) return oCurrent;
		oCurrent = oCurrent.parentNode;
	}
}

function getElementsByClassName(objParentNode, strNodeName, strClassName){
	var nodes = objParentNode.getElementsByTagName(strNodeName);
	if(!strClassName){
		return nodes;    
	}
	var nodesWithClassName = [];
	for(var i=0; i<nodes.length; i++){
		if(matchClass( nodes[i], strClassName )){
			nodesWithClassName.push(nodes[i]);
		}    
	}
	return nodesWithClassName;
}

function getElementsByClassNameFirstLevel(objParentNode, strNodeName, strClassName){
	var nodes = objParentNode.getElementsByTagName(strNodeName);

	if(!strClassName){
		nodesFirstLevel = [];
		for(var i=0; i<nodes.length; i++){
			if(nodes[i].parentNode.parentNode == objParentNode){
				nodesFirstLevel.push(nodes[i]);
			}    
		}
		return nodesFirstLevel;    
	}
	var nodesWithClassNameFirstLevel = [];
	for(var i=0; i<nodes.length; i++){
		if(matchClass(nodes[i], strClassName) && nodes[i].parentNode.parentNode == objParentNode){
			nodesWithClassNameFirstLevel.push(nodes[i]);
		}    
	}
	return nodesWithClassNameFirstLevel;
}

/*****************************
**   Some other methods
******************************/

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 getMousePosition(e) {
	if (e.pageX || e.pageY){
		var posX = e.pageX;
		var posY = e.pageY;
	}else if (e.clientX || e.clientY)     {
		var posX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
		var posY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
	}
	return {x:posX, y:posY}    
}

/*
*
*/

function window_open() {
	
	var url = arguments[0];
	
	var args = Array();
	
	args['called'] = null;
	args['event'] = null;
	args['name'] = '';
	args['modal'] = false;
	args['width'] = 800;
	args['height'] = 600;
	args['left'] = 30;
	args['top'] = 30;
	args['scrollbars'] = 1;
	args['location'] = 0;
	args['menubar'] = 0;
	args['resizable'] = 0;
	args['status'] = 0;
	args['titlebar'] = 0;
	args['toolbar'] = 0;
	
	for (var i = 1; i < arguments.length; i += 2) {
		args[arguments[i]] = arguments[i+1];
	}
	
	if (args['width'] != null) {
		args['width'] = parseInt(args['width']);
	}
	
	if (args['height'] != null) {
		args['height'] = parseInt(args['height']);
	}
	
	if (args['left'] != null) {
		if (args['left'] == 'left') {
			args['left'] = 0;
		}
		else if (args['left'] == 'right') {
			args['left'] = window.screen.width - args['width'];
		}
		else if (args['left'] == 'center') {
			args['left'] = parseInt((window.screen.width - args['width']) / 2);
		}
		else {
			args['left'] = parseInt(args['left']);
		}
	}
	
	if (args['top'] != null) {
		if (args['top'] == 'top') {
			args['top'] = 0;
		}
		else if (args['top'] == 'bottom') {
			args['top'] = window.screen.height - args['height'];
		}
		else if (args['top'] == 'center') {
			args['top'] = parseInt((window.screen.height - args['height']) / 2);
		}
		else {
			args['top'] = parseInt(args['top']);
		}
	}
	
	var params = Array();
	
	for (var i in args) {
		params.push(i + '=' + args[i]);
	}
	
	var win = window.open(url, args['name'], params.join(','));
	
	win.focus();
	
	window.calledObj = args['called'];
	
}

function insertBlock(node) {
	
	var clone = node.parentNode.cloneNode(1);
	
	var elems = clone.getElementsByTagName('*');
	
	for (var j = 0; j < elems.length; j += 1) {
		
		switch (elems[j].type) {
			
			case 'file':
			case 'text':
				elems[j].value = arguments[j+1] ? arguments[j+1] : '';
				break;
				
			case 'checkbox':
				elems[j].checked = arguments[j+1] ? arguments[j+1] : false;
				break;
				
			case 'radio':
				elems[j].checked = arguments[j+1] ? arguments[j+1] : false;
				break;
				
			case 'select-one':
				elems[j].selectedIndex = arguments[j+1] ? arguments[j+1] : null;
				break;
				
		}
		
	}
	
	node.parentNode.parentNode.insertBefore(clone, node.parentNode.nextSibling)
	
}

function removeBlock(node) {
	
	if (node.parentNode == null) {
		return;    
	}
	
	node = node.parentNode;
	
	if (node.nextSibling == null && node.previousSibling == null) {
		return;
	}
	
	/*if (node.nextSibling && node.previousSibling == null && node.childNodes.length != node.nextSibling.childNodes.length) {
		return;
	}
	
	if (node.previousSibling && node.nextSibling == null && node.childNodes.length != node.previousSibling.childNodes.length) {
		return;
	}*/
	
	if (node.parentNode == null) {
		return;
	}
	
	node.parentNode.removeChild(node)
	
}

function mupperBlock(node) {
	
	if (node.parentNode == null) {
		return;    
	}
	
	node = node.parentNode;
	
	var snode = node.previousSibling;
	
	if (snode == null || snode.childNodes.length != node.childNodes.length) {
		return;
	}
	
	var pnode = node.parentNode;
	
	pnode.removeChild(node);
	
	pnode.insertBefore(node, snode);
	
}

function mlowerBlock(node) {
	
	if (node.parentNode == null) {
		return;    
	}
	
	node = node.parentNode;
	
	var nnode = node.nextSibling;
	
	if (nnode == null || nnode.childNodes.length != node.childNodes.length) {
		return;
	}
	
	var pnode = node.parentNode;
	
	pnode.removeChild(node);
	
	if (nnode.nextSibling == null) {
		pnode.appendChild(node);
	}
	else {
		pnode.insertBefore(node, nnode.nextSibling);
	}
	
}

function setFileName(node) {
	
	var arr = node.value.split(/\\/);
	
	if (arr == null) {
		return;
	}
	
	var value = arr[arr.length - 1];
	
	var inputs = node.parentNode.parentNode.getElementsByTagName('INPUT');
	
	for (var i = 0; i < inputs.length; i += 1) {
		if (inputs[i].type == 'text') {
			inputs[i].value = value;
		}
	}
	
}

function disableInput(node) {
	
	var disabled = node.checked;
	
	node = node.parentNode;
	
	next = node.nextSibling;
	
	while (next != null) {
		
		var elems = next.getElementsByTagName('*');
		
		for (var j = 0; j < elems.length; j += 1) {
			elems[j].disabled = disabled;
		}
		
		next = next.nextSibling;
		
	}
	
}

var spotnode = null;

function changeSpot(node) {
	
	if (spotnode == node) {
		spotnode = null;
	}
	else {
		spotnode = node;
	}
	
}

function putSpot(node, evnt, name) {
	
	//if (wid == 'spot') {
	//    wid = 'name';
	//}
	//else {
	//    wid = 'spot';
	//}
	
	if (node == null) {
		return true;    
	}
	
	//var w = document.getElementById(name + '__' + wid);
	
	if (spotnode == null) {
		return false;    
	}
	
	var e = evnt ? evnt : window.event;
	
	var x = e.x ? e.x : e.layerX;
	var y = e.y ? e.y : e.layerY;
	
	spotnode.style.left = x + 'px';
	spotnode.style.top = y + 'px';
	spotnode.style.visibility = 'visible';
	
	document.getElementById(spotnode.id + '__x').value = x;
	document.getElementById(spotnode.id + '__y').value = y;
	
	spotnode = null;
	
	return true;
	
}

function moveSpot(node, evnt, name) {
	
	//if (wid == null) {
	//    return false;    
	//}
	
	//var w = document.getElementById(name + '__' + wid);
	
	if (spotnode == null) {
		return false;    
	}
	
	var e = evnt ? evnt : window.event;
	
	var x = e.x ? e.x : e.layerX;
	var y = e.y ? e.y : e.layerY;
	
	spotnode.style.left = x + 'px';
	spotnode.style.top = y + 'px';
	spotnode.style.visibility = 'visible';
	
	document.getElementById(spotnode.id + '__x').value = x;
	document.getElementById(spotnode.id + '__y').value = y;
	
	return true;
	
}

