window._v = function(){};
if(!window.util) window.util = new Object();
util.doFind = function (args){
	if(args.length == 1){
		if(typeof(args[0]) == "string") return document.getElementById(args[0]);
		else return args[0];
	}
	var elem = args[0];
	if(elem == null) return null;
	if(elem.domNode && elem.tagName == null) elem = elem.domNode;
	pattern = args[1];
	if(typeof(pattern == "number") && pattern <0){//go down for number of levels
		for(var i=0; i>pattern; i--)
			elem = elem.parentNode;
		return elem;
	}

	var srch = util.matcher(pattern);
	if(srch.direction == "child"){//child
		return util.findChild(elem,srch, -1);
	}else if(srch.direction == "parent"){//any parent
		return util.findParent(elem,srch);
	}else if(srch.direction.indexOf("+")==0){//any next sibling
		do{
			elem = elem.nextSibling;
		}while (elem && (!srch.match(elem)))
		return elem;
	}else if(srch.direction.indexOf("-")==0){//any previous sibling
		do{
			elem = elem.previousSibling;
		}while (elem && (!srch.match(elem)))
		return elem;
	}else{
		alert("unknown search direction '"+srch.direction+"', please use one of following:\n'child' - any child\n'parent' - any parent\n'+' - any next sibling\n'-' - any previous sibling");
	}
	return null;
};

util.matcher = function(str) {
	var srch = new Object();
	var idx = str.indexOf(":");
	if(idx == -1) srch.direction = 'child';
	else srch.direction = str.substr(0,idx);
	str = str.substring(idx+1);
	var idx1 = str.indexOf(".");//tag
	var idx2 = str.indexOf("=");//attribute ==
	var idx3 = str.indexOf("~");//attribute regexp
	if(idx2 >= 0 && idx1>idx2) idx1 =-1;//if tag delimiter is actualy an attribute value ('.' is after '=')
	if(idx3 >= 0 && idx1>idx3) idx1 =-1;
	if(idx1 !=-1 && idx2 != -1){//tag with attribute
		srch.tag  = str.substring(0,idx1);
		srch.attr = str.substring(idx1+1,idx2);
		srch.val = str.substring(idx2+1);
		srch.match = function(elem){
			return elem.tagName == this.tag && elem.getAttribute && elem.getAttribute(this.attr) == this.val;
		};
	}else if(idx1 !=-1 && idx3 != -1){//tag with attribute (regexp for value)
		srch.tag  = str.substring(0,idx1);
		srch.attr = str.substring(idx1+1,idx3);
		srch.val = new RegExp(str.substring(idx3+1));
		srch.match = function(elem){
			return elem.tagName == this.tag && elem.getAttribute && this.val.test(elem.getAttribute(this.attr));
		};
	}else if(idx2 != -1){//just attribute
		srch.attr = str.substring(0,idx2);
		srch.val  = str.substring(idx2+1);
		srch.match = function(elem){
			return elem.getAttribute && elem.getAttribute(this.attr) == this.val;
		};
	}else if(idx3 != -1){//just attribute (regexp for value)
		srch.attr = str.substring(0,idx3);
		srch.val = new RegExp(str.substring(idx3+1));
		srch.match = function(elem){
			return elem.getAttribute && this.val.test(elem.getAttribute(this.attr));
		};
	}else{//just tag
		srch.tag = str;
		srch.match = function(elem){
			return elem.tagName == this.tag;
		};
	}
	return srch;
};

util.numRegex = /^-?[0-9]+\.?[0-9]*$/;
util.num = function(str){
	if(!util.numRegex.test(str)) return 0;
	return eval(str);
};
util.element = function(event) {
	return event.target || event.srcElement;
};

util.click = function(){
	elem = util.doFind(arguments);
	if(elem){
		if(elem.click) elem.click();
		else if(elem.tagName == "A"){
			window.open(elem.href, elem.target);
		}
	}
};

util.isMy = function(event,elem){
	return util.element(event) == elem;
};

util.find = function(elem){
	return util.doFind(arguments);
};

util.toggle = function(elem){
	elem = util.doFind(arguments);
	if(elem) elem.style.display = (elem.style.display == "none") ? "":"none";
};

util.focus = function(elem){
	elem = util.doFind(arguments);
	if(elem)
		setTimeout(function(){elem.focus()},10);
};

util.make = function(){
	var offset = 0, parent = null;
	if(arguments.length == 0) arguments=new Array("SPAN");
	if(typeof(arguments[0]) != "string"){
		offset = 1;
		parent = arguments[0];
	}
	var e = document.createElement(arguments[offset]);
	var i=offset+1;
	for(; i<arguments.length-1; i+=2){//go through argument pairs and set them to the crated object
		if(typeof(arguments[i]) != "string") {break;}//from now on we have html elements, not attributes
		var atr_name = arguments[i].toLowerCase();
		var atr_val  = arguments[i+1];
		if(atr_name == "class"){
			e.className = atr_val;
		}else if(atr_name == "style"){
			var arr = atr_val.split(";");
			for(var j=0; j<arr.length;j++){
				var def = arr[j].split(":");
				if(def == '') continue;
				var idx = def[0].indexOf("-");
				while(idx != -1){
					def[0] = def[0].substring(0,idx)+def[0].substring(idx+1,idx+2).toUpperCase()+def[0].substring(idx+2);
					idx = def[0].indexOf("-");
				}
				try{
					e.style[def[0]] = def[1];
				}catch(e){if(false)alert('style property:'+def[0]+', error:'+e.message);}
			}
		}
		e.setAttribute(atr_name,atr_val,0);//0 means set the arg in all case(letter case) variants
	}
	for(; i<arguments.length; i+=1){//go through argument pairs
		var last = arguments[i];
		if(typeof(last) == "string"){
			e.appendChild(document.createTextNode(last));
		}else
			e.appendChild(last);		
	}
	if(parent != null) parent.appendChild(e);
	return e;
}

util.make_text = function(text){
	return document.createTextNode(text);
}

util.findParent = function(elem ,srch){
	if(typeof(srch) == "string") srch = util.matcher(srch);
	var par = elem.parentNode;
	while(par != null){
		if(srch.match(par)) return par;
		par = par.parentNode;
	}
	return null;
};

util.findChild = function(elem ,srch, level){
	if(typeof(srch) == "string") srch = util.matcher(srch);
	var ch = elem.firstChild;
	while(ch != null){
		if(srch.match(ch)) return ch;
		else if(level != 1){
			var ret = util.findChild(ch ,srch, level-1);
			if(ret != null) return ret;
		}
		ch = ch.nextSibling;
	}
}

util.fillSelectByContent = function(code, form, arr, nameColumn, idColumn){
		var it=form.elements;
		for(var i=0; i<it.length;i++){
			if(it[i].tagName == "SELECT" && it[i].getAttribute("content") == code){
				util.fillSelect(it[i], arr, nameColumn, idColumn);
			}
		}
}
util.fillSelect = function(select, arr, nameColumn, idColumn){
	if(idColumn == null) idColumn=1;
	if(nameColumn == null) nameColumn=0;
	var tmp = select.value;
	var opt = select.options;
	opt.length = 0;
	for(var i = 0; i < arr.length ; i++){
		opt[opt.length] = new Option(arr[i][nameColumn],arr[i][idColumn]);
		if(arr[i][idColumn] == tmp) select.value = tmp;//select the old value
	}
};

util.formToObj = function(form){
	var it=form.elements;
	var params=new Object();
	for(var i=0; i<it.length;i++){
		var inp=it[i]; var idx = inp.name.indexOf("[]");
		var value=inp.value;
		if(inp.type=="checkbox" || inp.type=="radio"){
			if(!inp.checked) value = inp.getAttribute("unchecked");
		}
		if(idx != -1){
			var name= inp.name.substring(0,idx);
			if(params[name]==null) params[name]=new Array();
			if(value != null) params[name][params[name].length] = value;
		}else{
			params[inp.name] = value;
		}
	}
	return params;
}

//applies object to form and optionaly clears inputs without corresponding values in passed obj
util.objToForm = function(obj,form, clearIfUnavailable){
	var it=form.elements;
	for(var i=0; i<it.length;i++){
		var name=it[i].name,inp=it[i],value;
		value = obj[name];
		if(inp.type=="checkbox" || inp.type=="radio"){
			inp.checked = inp.value == value;
			continue;
		}
		if(typeof(obj[name]) == "undefined") {
			if(clearIfUnavailable) value = "";
			else continue;
		}
		it[i].value=value;
	}
}

util.focusForm = function(form){
	var it=form.elements;
	var first = null;
	for(var i=0; i<it.length;i++){
		if(it[i].type != "hidden"&&  (first == null || it[i].getAttribute && it[i].getAttribute("first") != null)){
			first = it[i];
		}
	}
	if(first){
		setTimeout(function(){
			first.focus();
			if(typeof(first.select) == "function") first.select();
		},10);
	}
	
}


function submitForm(evt){
	var elem = Event.element(evt);
	var form = $(elem,"parent:FORM");
	if(form){
		if(form.onsubmit && form.onsubmit()) form.submit();
	} else alert("Element must be inside form");
	return false;
}

util.blink = function(node, className){
	if(className == null) className = "blink";
	Element.addClassName(node, className);
	window.setTimeout(function(){
		Element.removeClassName(node, className);
	},1000);
};

util.calcPos = function(e1,e2,vAlign,hAlign,offsetTop,offsetLeft){
	if(offsetTop==null) offsetTop=0;
	if(offsetLeft==null) offsetLeft=0;
	vAlign = vAlign || 'IN_TOP';
	hAlign = hAlign || 'IN_LEFT';
	function getOffset(str){
		var idx = str.indexOf("-");
		if(idx != -1) return util.num(str.substring(idx));
		var idx = str.indexOf("+");
		if(idx != -1) return util.num(str.substring(idx+1));
		return 0;
	}
	
	vAlign = vAlign.toUpperCase();
	hAlign = hAlign.toUpperCase();
	var hOffset = getOffset(hAlign);
	var vOffset = getOffset(vAlign);
	
	var pos =  util.pos(e1);
	var top = pos.y + offsetTop  + vOffset;
	var left= pos.x + offsetLeft + hOffset;
	if(vAlign.indexOf("TOP") != -1){//TOP
		if(vAlign.indexOf("IN") == -1) top -= e2.offsetHeight;//top-inside
	}else{//BOTTOM
		top += e1.offsetHeight;
		if(vAlign.indexOf("IN") != -1) top -= e2.offsetHeight;//bottom-inside		
	}
	if(hAlign.indexOf("LEFT") != -1){//LEFT
		if(hAlign.indexOf("IN") == -1) left -= e2.offsetWidth;//left-inside
	}else{//RIGHT
		left += e1.offsetWidth;
		console.log(left);
		if(hAlign.indexOf("IN") != -1) left -= e2.offsetWidth;//right-inside		
		console.log(e2.offsetWidth,e2.offsetHeight,left,e2);
	}
	return {top:top,left:left};
}
util.moveCalcPos = function(e1,e2,vAlign,hAlign,offsetTop,offsetLeft){
	e2.style.position='absolute';
	e2.style.top = '-400px';
	e2.style.display = 'block';	
	var pos = util.calcPos(e1,e2,vAlign,hAlign,offsetTop,offsetLeft);
	if(pos.left<0) pos.left=0;
	if(pos.top<0) pos.top=0;
	e2.style.top = pos.top+'px';
	e2.style.left = pos.left+'px';
}

util.visibleValue = function(elem){
	if(elem.tagName == "SELECT"){
		for(opt in elem.options){
			if(opt.selected) return opt.text;
		}
	}else{
		return elem.value;
	}
}

//show menu manualy
//be aware that menu domNode will be placed to document.body to behave properly
//this can break your code if unaware of te fact
util.light_menu_show = function(elem,menu,vAlign,hAlign,offsetTop,offsetLeft, setup){
	if(elem._menu_initialized){
		menu.doShow(elem);
		return;
	}
	util.light_menu(elem,menu,vAlign,hAlign,offsetTop,offsetLeft, setup);
	menu.doShow(elem);
};
//create menu that pops-up on click
util.light_menu_click = function(elem,menu,vAlign,hAlign,offsetTop,offsetLeft){
	util.light_menu(elem,menu,vAlign,hAlign,offsetTop,offsetLeft);
	elem.onclick = function(){this.menu.doShow(this);}
	elem.onmouseover = null;
	menu.doShow(elem);
};
//create menu that pops-up on mouse over
util.light_menu = function(elem,menu,vAlign,hAlign,offsetTop,offsetLeft, listeners, setup){
	elem.menu = menu;
	elem.listeners = listeners;
	menu.menu_pos = {vAlign:vAlign, hAlign:hAlign, offsetTop:offsetTop, offsetLeft:offsetLeft};
	menu.style.position = "absolute";
	if(!menu._menu_initialized){
		elem.menu.onmouseover = function(){this.doShow();} 
		elem.menu.doShow=function(elem){
			if(this.timer) clearTimeout(this.timer);
			this.timer = null;
			if(elem == null || (this.showing && elem == this.elem)) return;//when we are just staying visible
			if(elem == null) elem = this.elem;
			else this.elem = elem;
			util.moveCalcPos(this.elem,this,this.menu_pos.vAlign,this.menu_pos.hAlign,this.menu_pos.offsetTop,this.menu_pos.offsetLeft);
			util.fadeInFromZero(this);
			this.showing=true;
		}
		elem.menu.onmouseout = elem.menu.hideLater=function(){
			if(this.timer == null)
				this.timer = setTimeout(util.bind(this, function(){
					util.fadeOut(this);
					this.timer = null;
					this.showing=false;
				}),300);
		}
		elem.menu.doHide = function(){
			this.style.display = "none";
		}
		menu.elem = elem;//so menu can align to it in onmouseover
		menu._menu_initialized = true;
	}

	if(setup){
		elem.onmouseover=function(){
			if(this.listeners && this.liseners.onmouseover) this.liseners.onmouseover();
			this.menu.doShow(this);
		}
	}

	elem.onmouseout=function(){
		this.menu.hideLater();
	}

	elem._menu_initialized = true;
	return menu;
}


//usage
//<input type=checkbox> <span onclick="return doCheck(this)" class="hand"> sth...</span>
function doCheck(elem){
	var c = $(elem,'-:INPUT');
	if (c.getAttribute("type") != null){
		c.checked = !c.checked;
		c.focus();
	}
	return false;
}

function doCheckF(elem){
	var c = $(elem,'-:INPUT');
	if (c.tagName == "INPUT" && c.getAttribute("type") != null){
		c.focus();
	}
	return false;
}

function co_loadFormFocus(){
	if (document.forms == null) return;
	for(var i=0; i<document.forms.length; i++){
		var fi = Form.getElements(document.forms[i]);
		if (fi.type=="hidden") continue;
		for(var j=0; j<fi.length; j++){
			var elem = fi[j];
			Event.observe(elem,"focus",focus);
			Event.observe(elem,"blur", blur);
		}
	}

	function focus(evt){
		var elem = Event.element(evt);
		Element.addClassName(elem,"focused");
	}

	function blur(evt){
		var elem = Event.element(evt);
		Element.removeClassName(elem,"focused");
	}
}

function CheckForm(){

	if (!CheckForm.prototype.loaded){
		CheckForm.prototype.loaded = true;
		CheckForm.prototype.init = init;
		CheckForm.prototype.check = check;
	}
	
	function init(){
		if (document.forms == null) return;
		for(var i=0; i<document.forms.length; i++){
			if (document.forms[i].onsubmit == null){
				document.forms[i].onsubmit = check;
			}
		}
	}

	function check(evt,form){
	if(form == null) form = this;
	try{
		var fi = form.elements;
		for(var j=0; j<fi.length; j++){
			var elem = fi[j];
			if (elem.type=="hidden" || elem.type=="submit"|| elem.type=="image") continue;
			if(elem.value == "" || elem.value == null){
				if (elem.getAttribute("empty") != "ok"){
					if(elem.getAttribute("empty"))
						alert(elem.getAttribute("empty"));
					else
						alert(CheckForm.prototype.form_message.must_fill);
					elem.focus();
					return false;
				}
			}else{
				var regex = elem.getAttribute("regex");
				if(regex != null && regex != ""){
					var format = elem.getAttribute("format");
					var example = elem.getAttribute("example");
					var template = CheckForm.prototype.format[regex];
					if(template != null) {
						regex = template.regex;
						if(format == null) format = template.format;
						if(example == null) example = template.example;
					}
					var reg = new RegExp(regex);
					if (!reg.test(elem.value)){
						var message = CheckForm.prototype.form_message.wrong_format[0];
						if (format != null && format != "") message += CheckForm.prototype.form_message.wrong_format[1] +"    "+ format+"\n";
						if (example != null && example != "") message += CheckForm.prototype.form_message.wrong_format[2] +"    "+ example;
						elem.select();
						alert(message);
						elem.focus();
						if(typeof(elem.select) == "function") elem.select();
						return false;
					}
				}
			}
			var func = elem.getAttribute("validator");
			if(func != null && func != "" && window[func] != null && typeof(window[func])=="function"){
				var message = window[func](evt, elem);
				if(message == null) return true;
				alert(message);
				elem.focus();
				if(typeof(elem.select) == "function") elem.select();
				return false;
			}
		}
		return true;
	}catch (e){alert(e);return false;}
	}
}
var Event = {element:function(evt){ return evt.target || evt.srcElement;}};
var checkForm = new CheckForm();

CheckForm.prototype.form_message = {
	"must_fill": "Morate popuniti obavezna polja",
	"wrong_format": ["Vrijednost je krivo upisana!\n",
			"Traženi format je:\n",
			"Primjer pravilnog upisa je:\n"
		]
};

CheckForm.prototype.format = new Array();
CheckForm.prototype.format["num"] = {
	"regex": "^\\d+$",
	"format":"#",
	"example":"123"
};
CheckForm.prototype.format["float"] = { 
	"regex": "^((\\d+)|(\\d+\\.\\d+))$",
	"format":"#.#",
	"example":"11.45"
}
CheckForm.prototype.format["float_like"] = { 
	"regex": "^[0-9.,]+$",
	"format":"#.#\n    #,#",
	"example":"11.45\n    200,05\n    31"
}
CheckForm.prototype.format["hr_date"] = { 
	"regex": "^(0?[1-9]|[12][0-9]|3[01])\\.(0?[1-9]|1[0-2])\\.[0-9]{4}[ ]*$",
	"format":"dd.mm.yyyy",
	"example":"1.1.2005"
};
CheckForm.prototype.format["hr_date_time"] = { 
	"regex": "^(0?[1-9]|[12][0-9]|3[01])\\.(0?[1-9]|1[0-2])\\.[0-9]{4} ([01]?[0-9]|2[0-3]):(0?[0-9]|[1-5][0-9])$",
	"format":"dd.mm.yyyy hh:mm",
	"example":"1.1.2005 11:33"
};
CheckForm.prototype.format["time_min"] = { 
	"regex": "^([01]?[0-9]|2[0-3]):(0?[0-9]|[1-5][0-9])*$",
	"format":"hh:mm",
	"example":"9:33"
};

CheckForm.prototype.format["mb"] = { 
	"regex": "^[0-9]{7}|[0-9]{8}|[0-9]{13}$",
	"format":"7,8 ili 13 znamenaka",
	"example":"12345678"
};

function AutoComplete(){
	if (!AutoComplete.prototype.loaded){
		AutoComplete.prototype.loaded = true;
		AutoComplete.prototype.init = init;
		AutoComplete.prototype.delay = 300;
	}

	function init(elem){
		elem.onfocus=focused;
		elem.onblur=blured;
		elem.onkeyup=keyUp;
		elem.onkeypress=keyDown;
		elem.counter = 0;
		elem.min_chars = elem.getAttribute("min_chars") || 0;
		elem.oldVal = elem.value;
		elem.div = document.createElement("DIV");
		var div = elem.div;
		div.input = elem;
		div.setAttribute("type","AutoCompleteW",0);
		div.style.display = "none";
		div.className = "AutoComplete";
		div.style.position = "absolute";
		div.style.top = "0px";
		div.style.left = "0px";
		document.body.appendChild(div);
		div.onmousedown = itemClick;
		elem.onfocus();
	}

	function focused(){
		this.hasFocus = true;
		this.select();
		callLoad(this, true);
	}

	function blured(){
		this.hasFocus = false;
		this.div.style.display = "none";
	}

	function keyDown(evt){
		if(evt == null) evt = window.event;
		if(evt.keyCode == 13) {
			applySelection(this.div);
			//this.focus();//TODO focus next element in form
			Event.stop(evt);
			return false;
		}
	}
	function keyUp(evt){
		var div = this.div;
		if(evt == null) evt = window.event;
			var sel;
		if(evt.keyCode == Event.KEY_UP || evt.keyCode == Event.KEY_DOWN) {
			var sel;
			if(evt.keyCode == Event.KEY_UP){
				if(div.selected) sel = div.selected.previousSibling;
				while(sel && sel.tagName != "DIV") sel = sel.previousSibling;
				if(sel == null) {
					sel = div.lastChild;
					while(sel && sel.tagName != "DIV") sel = sel.previousSibling;
				}
			}else if(evt.keyCode == Event.KEY_DOWN) {
				if(div.selected) sel = div.selected.nextSibling;
				while(sel && sel.tagName != "DIV") sel = sel.nextSibling;
				if(sel == null) {
					sel = div.firstChild;
					while(sel && sel.tagName != "DIV") sel = sel.nextSibling;
				}
			}
			if(sel != null){
				selectElem(div, sel);
			}

		}
		callLoad(this);
	}

	function selectElem(div, sel){
		if(sel.getAttribute("item_id") == null && sel.getAttribute("item_text") == null) sel = sel.parentNode;
	//	if(sel.getAttribute("item_id") == null){alert("can not select item without id");return;}
		if(div.selected)
			Element.removeClassName(div.selected,"selected");

		if(sel != null){
			Element.addClassName(sel,"selected");
		}
		div.selected = sel;
	}

	function callLoad(elem, force){
		var val = elem.value;
		if(val == elem.oldVal  && !force) return;
		elem.oldVal = val;
		if(val.length<elem.min_chars){
			elem.div.style.display="none";
			return;
		}
		elem.counter++;
		var chk = elem.counter;
		setTimeout(function(){
				if(chk != elem.counter) return;//old call needs to be discarded
				loadResults(elem);
			}
			,AutoComplete.prototype.delay)
	}
	function loadResults(elem){
		var url = elem.getAttribute("ac_script");
		var pars = elem.getAttribute("ac_pars");
		var more_pars = elem.getAttribute("more_pars");
		if(more_pars && more_pars != ""){
			more_pars = eval(more_pars);
		}

		pars = pars.replace("$q",elem.value);
		if(more_pars && more_pars != "") pars = more_pars+"&"+pars;
		util.ajax(url, {method: "GET", parameters: pars},util.bind(elem,showResults));
	}

	function showResults(req){
		var div = this.div;
		div.innerHTML = req || "";
		var pos = util.pos(this);
		div.style.left = pos.x+"px";
		div.style.top = (pos.y + this.offsetHeight)+"px";
		if(this.hasFocus) div.style.display = "block";
		var first = $(div, "child:DIV");
		if(first){
			div.empty = false;
			selectElem(div, first);
			var form = $(div.input, "parent:FORM");
			var id_field = div.input.getAttribute("id_field");
			if(id_field) id_field = form[id_field];
//			alert(id_field.value  +"=="+ div.selected.getAttribute("item_id"));
			if(id_field){
				if(id_field.value  == div.selected.getAttribute("item_id")){div.style.display="none";}
			}else{
				if(div.input.value  == div.selected.getAttribute("item_text")){div.style.display="none";}				
			}
		}else{
			div.empty = true;
		}
	}
	
	function itemClick(evt){
		if(evt == null) evt = window.event;
		var elemClicked = Event.element(evt);
		var div = this;
		selectElem(div, elemClicked);
		applySelection(div);
		div.input.blur();
	}

	function applySelection(div){
		var form = $(div.input, "parent:FORM");
		if(div.input.getAttribute("id_field")){
				var id_field = form[div.input.getAttribute("id_field")];
				if(id_field) id_field.value  = div.selected.getAttribute("item_id");
	            var text = div.selected.getAttribute("item_text");
                if(text == null) text = div.selected.innerHTML;
                div.input.value  = text;

			if(div.empty && id_field){
				id_field.value  = "";
			}
		}else{
			if((!div.empty || div.input.getAttribute("id_field")) && div.selected){
				var text = div.selected.getAttribute("item_text");
				if(text == null) text = div.selected.innerHTML;
				div.input.value  = text;
				//div.input.blur();
			}
		}
		var afterselect = div.input.getAttribute("after_select");
		if (afterselect && window[afterselect]) window[afterselect](div); 
	}
}
var autoComplete = new AutoComplete();


function ajaxSubmit(evt, form, callback, handleAs){
	if(handleAs == null) handleAs = "text";
	var url = form.attributes.action.value;
	var pars = util.formToQuery(form);
	var idx=url.indexOf('?');
	var method = form.getAttribute("method");
	if(method == null) method="POST";
	if(idx != -1 && method.toLowerCase() != "post"){
		pars = url.substring(idx+1)+'&'+pars;
		url = url.substring(0,idx);
	}

	util.ajax(url, {method: "GET", parameters: pars},callback);
}

function ajaxCall(url,callback,func,method){
	if(method == null) method = "GET";
	if(func) callback = util.bind(callback,func);
	var idx = url.indexOf("?"),pars="";
	util.ajax(url, {method: "GET", parameters: pars},callback);
}

function hideFormDiv(evt){
	var elem = Event.element(evt);
	var formW = $(elem, "paernt:DIV.type=formDiv");
	formW.style.display = "none";
}

function activateForm(form){
	if(form.tagName != "FORM") form = $(form,'FORM');
	util.focusForm(form);
}

window.$ = util.find;


if(window.EGroup == null) window.EGroup = new Object();

EGroup.edit = function(elem, id){
	var group = $(elem,'parent:type=EGroup');
	var url = group.getAttribute("edit");
	var pars = group.getAttribute("parentColum")+"="+document.editForm.id.value;
	var idx=url.indexOf('?');
	if(idx != -1){
		pars = url.substring(idx+1)+'&'+pars;
		url = url.substring(0,idx);
	}
	if(id) pars += "&mode=edit&"+group.getAttribute("idColumn")+"="+id;
	else pars	+= "&mode=makeNew";
	util.ajax(url, {method: "GET", parameters: pars},util.bind(group,EGroup.afterLoadForm));
};

EGroup.afterLoadForm = function (req){
	if(checkErr(req)) return;
	var div = $(this,"area=form");
	window.currentFragment = div;
	EGroup.htmlAndScript(req, div);
	util.moveCalcPos(this,div);
	activateForm(div);
};

EGroup.htmlAndScript = function (req, div){
	var html = req;
	var idx = html.indexOf("<script>");
	if(idx != -1){
		var idx2 = html.indexOf("</script>");
		div.innerHTML = html;
		window.eval(html.substring(idx+8,idx2));
		html = html.substring(idx2+9);
	}else
		div.innerHTML = html;
	
	return html
}

EGroup.list = function (req){
	if(checkErr(req)) return;
	var group = $(this,'parent:type=EGroup');
	EGroup.htmlAndScript(req,$(group,"area=list"));
	$(group,"area=form").style.display = "none";
}

function loadLink(url){
	var idx=url.indexOf("?");
	var pars = "";
	if(idx != -1){
		pars = url.substring(idx+1);
		url = url.substring(0,idx);
	}

	util.ajax(url, {method: "GET", parameters: pars},function(data){
				EGroup.htmlAndScript(data,$('content_area'));
			});
}

//firebug lite
if (!("console" in window) || !("firebug" in console))
{
    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
    "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];

    window.console = {};
    for (var i = 0; i < names.length; ++i)
        window.console[names[i]] = function() {}
}


// ANIM

util.effect = {};

util.fadeIn = function(elem,onEnd){
	return util.anim(elem,{effect:'opacity',start:0,end:100,duration:500,onEnd:onEnd});
}

util.fadeOut = function(elem,onEnd){
	return util.anim(elem,{effect:'opacity',start:100,end:0,duration:500,onEnd:onEnd});
}

util.fadeOutAndHide = function(elem){
	util.fadeOut(elem,function(elem,anim){elem.style.display = 'none';});
}

util.animProp = function (opts){
	return (opts.effectName ? opts.effectName:"def");
}

util.effect.opacity = function(elem, opacity, opts){
	elem = elem.style;
	elem.zoom = '1';//IE-hack
    elem.opacity = (opacity / 100);
    elem.MozOpacity = (opacity / 100);
    elem.KhtmlOpacity = (opacity / 100);
    elem.filter = "alpha(opacity=" + opacity + ")"; 
}

util.effect.width  = function(elem, val, opts){elem.style.width  = Math.round(val)+'px';};
util.effect.height = function(elem, val, opts){elem.style.height = Math.round(val)+'px';};
util.effect.top    = function(elem, val, opts){elem.style.top    = Math.round(val)+'px';};
util.effect.left   = function(elem, val, opts){elem.style.left   = Math.round(val)+'px';};


util.anim = function(elem, opts){
	if(elem._ANIM_ == null) elem._ANIM_={};//we use this to toggle sam animation, and to be able to stop animations if needed
	if(typeof(opts.effect) == 'string'){
		if(typeof(util.effect[opts.effect]) != "function") {console.log("Unknown effect: util.effect."+effect); return;}
		opts.effectName = opts.effect;
		opts.effect = util.effect[opts.effect];
	}
	var prop = util.animProp(opts);
	var old = elem._ANIM_[prop];
	if(old != null){
		if(opts.toggle) {
			old.toggle();
			return;
		}
		old.stop();
	}
	elem._ANIM_[prop] = new AnimEffect(elem, opts);
	elem._ANIM_[prop].start();
}
util.anim.rate = {def: 10};

util.animStop = function(elem){
	if(elem._ANIM_ == null) return;
	for(prop in elem._ANIM_){
		if(elem._ANIM_[prop] && elem._ANIM_[prop].stop) elem._ANIM_[prop].stop();
	}
}

function  AnimEffect(elem, opts){
	this.elem = elem;
	this.opts = opts;
	this.current = 0;
	this.opts.rate = util.anim.rate.def;

//	this.elem[util.animProp(this.opts)] = this; for later use
}

AnimEffect.prototype.stop = function(){
	if(this.timer) clearTimeout(this.timer);
	this.timer = null;
	if(!this.opts.toggle){
		delete this.elem._ANIM_[util.animProp(this.opts)];
		if(typeof(this.opts.onEnd) == 'function') this.opts.onEnd(this.elem,this);
		this.elem = null;
	}
}

AnimEffect.prototype.start = function(){
	this.time = new Date().getTime();
	this.next();
}

AnimEffect.prototype.toggle = function(){
	var tmp = this.opts.start;
	this.opts.start = this.opts.end;
	this.opts.end = tmp;
	this.time = new Date().getTime() - this.opts.duration + this.current;
	if(!this.timer) this.next();
}

AnimEffect.prototype.next = function(){
	var self = this; this.timer = setTimeout(function(){self.runNext();},self.rate);
}
AnimEffect.prototype.runNext = function(){
	var self = this; var opts = this.opts;
	this.current = new Date().getTime() - this.time;
	var value = opts.end;
	if(this.current < opts.duration){
		value = this.current / opts.duration;//normalized value (0..1)
		value = value * (opts.end - opts.start) + opts.start;
	}else{
		this.current = opts.duration;
	}
//	console.log(this, this.duration, this.current, "value:", value);
	this.opts.effect(this.elem,value,this);
	if(this.current < opts.duration) this.next();
	else this.stop();
}


/*
//COMPAT functions standalone

util.fadeIn =
	util.fadeInFromZero = function(node,time){ node.style.display = ""; }
util.fadeOut = function(node,time){ node.style.display = "none"; }

Object.extend = function(dest, src) {
  for (prop in src) {
    dest[prop] = prc[prop];
  }
  return dest;
}

window.Event = {
  element: function(){return evt.srcElement || evt.target;},
  KEY_BACKSPACE: 8,
  KEY_TAB:       9,
  KEY_RETURN:   13,
  KEY_ESC:      27,
  KEY_LEFT:     37,
  KEY_UP:       38,
  KEY_RIGHT:    39,
  KEY_DOWN:     40,
  KEY_DELETE:   46,
};

*/

