function getParent(thiz, conds) {
	if (!thiz) return null;
	var sconds = '';
	for (con in conds) {
		if (typeof conds[con] != 'function') {
			sconds += "!p." + con + ".equalsIgnoreCase('" + conds[con] + "') && ";
		}
	}
	//sconds = sconds.substring(0, sconds.length - 4);
	
	var evals = '';
	evals += "var p = thiz;\n";
	evals += "while (p.id != null && p.tagName != 'body' && " + sconds + "p.parentNode!=null) {\n";
	evals += " p = p.parentNode;\n";
	evals += "}\n";
	eval(evals);
	
	return (!p) ? null : p;
}

function form$(obj) {
	return getParent(obj, {tagName: 'form'});
}

/**************************************************************/
/**
 * $('myid',');
 */

function $() {
	$.cache = {};
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		var typeofelement = (typeof element);
		
		if (typeofelement == 'object') return element;
		if (typeofelement == 'string') {
			/* $.cache[element] == null || typeof $.cache[element] == 'undefined' */
			if (!$.cache[element]) {
				var found = document.getElementById(element);
				if (found) $.cache[element] = found;
			}
			element = $.cache[element];
			
			/**
			 * Fix additional JSF components id
			 * [formId:]elemId
			 */
			
			if (!element) {
				var forms = document.getElementsByTagName('form');
				for (var index=0; index < forms.length; index++) {
					/* JSFForm:Element */
					var id = forms[index].id + ':' + arguments[i];
					var result = document.getElementById(id);
					if (result) {
						$.cache[id] = result;
						return result;
					}
				}
			}
		}
		if (arguments.length == 1) {
			return element; // Like object
		}
		
		elements.push(element);
	}
	return elements;
}

function create$(tag, atts , par) {
	par  = (!par) ? document.body: par;
	var elem = document.createElement(tag);
	if (!atts || atts.length < 1) {
		// do nothin
	}	else {
		for (var att in atts) {
			elem.setAttribute(att, atts[att]);
		}
	}
	if (par) par.appendChild(elem);
	return elem;
} 

/**
 * FADING PURPOSE
 */

var effect = {};

effect.Fade = function() {
	var _startOpacity = 0;
	var _endOpacity = 100;
	var _millisec = 200;
	var _timer = 0;
	var _timeout;
		  _fadeTarget = null;
	
	/* public Fade(Object object) */
	if (arguments.length == 1 && typeof arguments[0] == 'object') {
		_fadeTarget = arguments[0];
	}
	
	this.stop = function() {
		window.clearTimeout(_timeout);
	};
	
	this.setRange = function(from, to) {
		_startOpacity = from;
		_endOpacity = to;
		return this;
	};
	
	this.apply = function(fadeTarget) {
		_fadeTarget = fadeTarget;
		return this;		
	};
	
	this.play = function() {
		var speed = Math.round(_millisec / 100);
		
		/* Refresh before new event occurs */
		if (_timer == _endOpacity) _timer = 0;
		
		_fadeTarget.style.opacity = (_startOpacity / 100);
		_fadeTarget.style.MozOpacity = (_startOpacity / 100);
		_fadeTarget.style.KhtmlOpacity = (_startOpacity / 100);
		_fadeTarget.style.filter = "alpha(opacity='" + _startOpacity + "')";

		if(_startOpacity > _endOpacity) {
			for(var i = _startOpacity; i >= _endOpacity; i-=2) {
				var jscode = "";
				jscode += "_fadeTarget.style.opacity = (" + i + " / 100);";
				jscode += "_fadeTarget.style.MozOpacity = (" + i + " / 100);";
				jscode += "_fadeTarget.style.KhtmlOpacity = (" + i + " / 100);";
				jscode += "_fadeTarget.style.filter = \"alpha(opacity='\" + " + i + " + \"')\";";
				_timeout = window.setTimeout(jscode, (_timer * speed));
				_timer++;
			}
		} else if(_startOpacity < _endOpacity) {
			for(var i = _startOpacity; i <= _endOpacity; i++) {
				var jscode = "";
				jscode += "_fadeTarget.style.opacity = (" + i/100 + ");";
				jscode += "_fadeTarget.style.MozOpacity = (" + i/100 + ");";
				jscode += "_fadeTarget.style.KhtmlOpacity = (" + i/100 + ");";
				jscode += "_fadeTarget.style.filter = \"alpha(opacity='\" + " + i + " + \"')\";";
				
				_timeout = window.setTimeout(jscode, (_timer * speed));
				_timer++;
			}
		}
	};
};

effect.Fade.apply = function(fadeTarget) { return new this(fadeTarget); };

effect.Smooth = function() {
	var _from = 0;
	var _millisec = 100;
	var _property = '';
	var _timer = 0;
	var _to = 100;
	var _timeout;
			_object = null;

	/* public Smooth(Object object) */
	if (arguments.length == 1 && typeof arguments[0] == 'object') {
		_object = arguments[0];
	}
	
	this.stop = function() {
		window.clearTimeout(_timeout);
	};
	
	this.setRange = function(from, to) {
		_from = from;
		_to = to;
		return this;
	};
	
	this.apply = function(object) {
		_object = object;
		return this;
	};
	
	this.setProperty = function(property) {
		_property = property;
		return this;
	};
	
	this.play = function() {
		var speed = Math.round(_millisec / 100);
		/* Refresh before new event occurs */

		if(_from > _to) {
			eval("_object." + _property + " = '" + _to + "px';");
			for(var i = _from; i >= _to; i -= 2) {
				//_timeout = window.setTimeout("_object." + _property + " = '" + i + "px';", (_timer * speed));
				_timer++;
			}
		} else if(_from < _to) {
			for(var j = _from; j <= _to; j += 1) {
				_timeout = window.setTimeout("_object." + _property + " = '" + j + "px';", (_timer * speed));
				_timer++;
			}
		}
	};
	
};

effect.Smooth.apply = function(object) { return new this(object); };
effect.Fade.getInstance = function() { return new this(); };


/*
function toggle(thisid, ids) {
	var arrIds = ids.split(',');
	
	var _thisid = $(thisid);
	_thisid.style.display = 'block';
	
	effect.Fade.getInstance().applyTo(_thisid);

	for(var e in arrIds) {
		var eid = arrIds[e].trim();
		if (thisid != eid) {
			$(eid).style.display = 'none';
		}
	}
	
}
*/

function Queue(initLength) {
	/**
	 * OUT 
	 * 	^
	 *  |
	 *  |
	 * [x]
	 * [x]
	 * [x]
	 * [x]
	 *  ^
	 *  |
	 *  |
	 * IN
	 */
	
	var elems = new Array(initLength);
	
	/* last in */
	this.push = function(object) {
		elems.push(object);
		return object;
	};
	
	/* first out */
	this.pop = function() {
		return elems.shift();
	};
	
	this.getSize = function() {
		return elems.length;
	};
}
/*
setTimeout.Synchornized = function(fnc, millisec) {
	setTimeout.Synchornized.waits = new Queue();
	
	while(setTimeout.Synchornized.waits.getSize() > 0) {
		var current = setTimeout.Synchornized.waits.pop();
		setTimeout(current[0], current[1]);
	}	
	
};
*/

function showElement(id) {
	var elem = $(id);
	var elemClass = elem.className;
	var sameElems = document.getElementsByClassName(elemClass);
	/* Show target element */
	elem.style.display = 'block';
	effect.Fade.apply(elem).play();
	
	/* Hide all others (same className) elements */
	if (elemClass != null && elemClass != '') {
		for (var each = 0; each < sameElems.length; each ++) {
			var e = sameElems[each];
			if (!elem.id.equalsIgnoreCase(e.id)) {
				e.style.display = 'none';
			}
		}
	}
}

function toggleCheckboxAllNone(reg) {
	var elems = document.getElementsByTagName('input');
	for (var runner = 0; runner < elems.length; runner ++) {
		var elem = elems[runner];
		if (elem != null & elem.type != null && elem.type.equalsIgnoreCase('checkbox') && elem.id.indexOf(reg) > 0) {
			elem.checked = $('chkRemovePhaseAllNone').checked;
		}
	}
}


function getOffsetX(node) {
    var result = node.offsetLeft;
    for (var parent = node; parent = parent.offsetParent; parent != null) {
        result += parent.offsetLeft;
    }
    return result;
}

function getOffsetY(node) {
    var result = node.offsetTop;
    for (var parent = node; parent = parent.offsetParent; parent != null) {
        result += parent.offsetTop;
    }
    return result;
}

function formatNumber(s) {
	if (s.length < 2)
	 s = "0" + s;
	return s;
}

function formatDate(d) {
	var arr = d.split("\/");
	for (var i = 0; i < arr.length; i++) {
		arr[i] = formatNumber(arr[i]);
	}
	return arr.join("\/");
}

function toEngDate(d) {
	var arr = d.split("\/");
	var res = new Array();
	res[0] = arr[1];
	res[1] = arr[0];
	res[2] = arr[2];
	return res.join("\/");
}

/*

function getOffsetX(o) {
  var left = 0;
  while (o != null && o.tagName != "body") {
    left += o.offsetLeft;
    o = o.parentNode;
  }
	window.alert(left);
  return left;
}

function getOffsetY(o) {
	var top = 0;
	while (o != null && o.tagName != "body") {
    top += o.offsetTop;
		o = o.parentNode;
  }
	window.alert(top);
	return top;
}*/

