/* v 1.1

	1.1 - Ajax Object - sima html ajaxolására, ugyanaz mint a Json Object
*/

function Request () {	
	this.url = null;
	this.successMethod = null;
	this.errorMethod = null;
	this.obj = null;
	this.setRequestData = function () {}; 

	this.method = 'POST';
	this.async = true;
	
	this.initXmlHTTP = function() {
		this.obj = false;
		// branch for native XMLHttpRequest object
		if(window.XMLHttpRequest) {
			try {
				this.obj = new XMLHttpRequest();
			} catch(e) {
				this.obj = false;
			}
		// branch for IE/Windows ActiveX version
		} else if(window.ActiveXObject) {
			try {
				this.obj = new ActiveXObject("Msxml2.XMLHTTP");
			} catch(e) {
				try {
					this.obj = new ActiveXObject("Microsoft.XMLHTTP");
				} catch(e) {
					this.obj = false;
				}
			}
		}
	};
	this.generateFunction = function(objName,method) {
		return function () {eval(objName+"."+method+"()");};
	};

	
	this.defaultErrorMethod = function (xmlhttpResp) {alert("ERROR("+xmlhttpResp.status+"):"+xmlhttpResp.responseText);};
	this.httpReturn = function (){			
		if ((typeof(this.request.obj)=='undefined')){		
			return true;
		}
		if (this.request.obj.readyState != 4) {
			return true;
		}
		if (this.request.obj.status != 200) {
			if (typeof(this.errorMethod)=='undefined')	{					
				this.defaultFailed(this.request.obj);
			} else {
				this.errorMethod(this.request.obj,this._params);
			}
		} else {
			var obj=this.request.obj;
			delete this.request.obj;
			this.successMethod(obj,this._params);				
		}
		return false;
	};
	this.arrayToRequest = function (params){
		var tmpstr="";
		var first=true;
		if (params=="")
		{
			return tmpstr;
		}	
		
		for (var i = 0; i<params.keys.length ; i++)
		{
			if (!first)	{
				tmpstr+="&";
			} else {
				first=false;
			}
			tmpstr+=params.keys[i]+"=";
			tmpstr+=params.values[i];
//			tmpstr+=escape(params.values[i]);
		}

		return tmpstr;
	};

	this.initXmlHTTP();
}

function XmlHTTP (objName) {
	this.request_data = null;
	this._params = null;

	this.xmlhttp=new Array();

	this.objName = objName;
	
	/*Inherit utils*/
	this.inheritFrom  = utils;
	this.inheritFrom();

	this.addRequest = function (){

		if (arguments.length>=1)
		{
			this.xmlhttp[arguments[0]] = new Request();
		} else {
			return;
		}

		if (arguments.length>=2)
		{
			this.xmlhttp[arguments[0]].url = arguments[1];
			
		}

		if (arguments.length>=3)
		{
			this.xmlhttp[arguments[0]].successMethod = arguments[2];
		}

		if (arguments.length>=4)
		{
			this.xmlhttp[arguments[0]].errorMethod = arguments[3];
		} else {
			this.xmlhttp[arguments[0]].errorMethod = this.defaultErrorMethod;
		}
	};

	this.getRequest = function (name){
		if (typeof this.xmlhttp[name] == 'undefined') { console.log('nincs '+name+' http object'); }
		return this.xmlhttp[name];
	};

	this.defaultErrorMethod = function (xmlhttpResp) {alert("ERROR("+xmlhttpResp.status+"):"+xmlhttpResp.responseText);};
	
	this.initRequestData = function (){
		this.request_data = {keys:[],values:[]};
	};

	this.setRequestFromIds = function (){

		for (var i=0;i<arguments.length ;i++ )
		{
			if (this.he(arguments[i]))
			{
				this.addFieldToRequestArray(this.ge(arguments[i]));
			}
		}
	};

	this.addFieldToRequestArray = function (formObj) {	
		if (formObj.tagName.toLowerCase()=='select')
		{			
			if (formObj.getAttribute("multiple") )
			{	
				for (var i=0;i<formObj.options.length ;i++ )
				{					
					if (formObj.options[i].selected)
					{
						this.request_data.keys.push(formObj.name+"[]");
						this.request_data.values.push(formObj.options[i].value);
					}
				}
				return false;				
			} else {				
				tmp=formObj.options[formObj.selectedIndex].value;
			}
		}
		if (formObj.tagName.toLowerCase()=='input' || formObj.tagName.toLowerCase()=='textarea')
		{
			tmp=formObj.value;	
		}			
			
		this.request_data.keys.push(formObj.name);
		this.request_data.values.push(tmp);		
	};

	this.generateFunction = function(objName,method) {
		return function () {eval(objName+"."+method+"()");};
	};

	this.httpReturn = function (){			
		for (var name in this.xmlhttp) {			
			if ((typeof(this.xmlhttp[name].obj)=='undefined')){		
				continue;
			}
			if (this.xmlhttp[name].obj.readyState != 4) {
				continue;
			}
			if (this.xmlhttp[name].obj.status != 200) {
				if (typeof(this.xmlhttp[name].errorMethod)=='undefined')	{					
					this.defaultFailed(xmlhttp[name].obj);
				} else {					
					this.xmlhttp[name].errorMethod(this.xmlhttp[name].obj,this.xmlhttp[name]._params);
				}
			} else {
				var obj=this.xmlhttp[name].obj;
				delete this.xmlhttp[name].obj;
				this.xmlhttp[name].successMethod(obj,this.xmlhttp[name]._params);				
			}

		}
		return false;
	};

	this.sendRequest = function (name,params) {		
		//if (this.xmlhttp[name].obj)
		//{
			if (typeof(params) == "undefined") {
				var params = this.request_data;
			}
			this.xmlhttp[name].initXmlHTTP();
			this.xmlhttp[name].obj.onreadystatechange = this.generateFunction(this.objName,"httpReturn");	
			this.xmlhttp[name].obj.open(this.xmlhttp[name].method, this.xmlhttp[name].url, this.xmlhttp[name].async);				
			this.xmlhttp[name].obj.setRequestHeader('Content-Type','application/x-www-form-urlencoded;');	
			this.xmlhttp[name].setRequestData();
			//this.xmlhttp[name].obj._params = this.xmlhttp[name]._params;
			this.xmlhttp[name].obj.send(this.arrayToRequest(params));
			this.initRequestData();
		//}
	};

	this.arrayToRequest = function (params){
		var tmpstr="";
		var first=true;
		if (params=="")
		{
			return tmpstr;
		}	
		
		for (var i = 0; i<params.keys.length ; i++)
		{
			if (!first)	{
				tmpstr+="&";
			} else {
				first=false;
			}
			tmpstr+=params.keys[i]+"=";
			tmpstr+=params.values[i];
//			tmpstr+=escape(params.values[i]);
		}

		return tmpstr;
	};

	this.initRequestData();
}

xmlhttp = new XmlHTTP('xmlhttp');

function utils () {
	this._valid = new Array();
	this.resetValid = function() {
		this._valid = new Array();
	}

	this.valid = function (action,text) {
		if (!action)	{
			this._valid.push(text);
		}
	}
	this.isValid = function () {
		return this._valid.length==0;
	}
	this.exec = function (array,command) {
		for (var i=0; i < array.length; i++) {
				command(array[i]);
		}
	};
	this.ge = function (name) { 
		if (typeof debug!='undefined' && debug>2) {
			console.log(1,name);
		}
		if (typeof name == 'object') {
			return name;
		}
		return document.getElementById(name);
	};
	this.he = function (name) {
		return (this.ge(name)!==null);
	};
	this.hideObj = function (obj) {
		if (obj==null) {
			console.log('nem tudtam eltüntetni');
			console.trace();
			return false;
		}		
		obj.style.display="none";
	};
	this.hide = function (name) {
		if (this.ge(name)==null) {
			console.log('nem tudtam eltüntetni a '+name+' -et!');
			console.trace();
			return false;
		}
		this.hideObj(this.ge(name));
	};
	this.showObj = function (obj) {
		if (obj==null) {
			console.log('nem tudtam megjeleníteni');
			return false;
		}
		obj.style.display="";
	};
	this.show = function (name) {
		if (this.ge(name)==null) {
			console.log('nem tudtam megjeleníteni a '+name+' -et!');
			console.trace();
			return false;
		}
		this.showObj(this.ge(name));
	};
	this.isHideObj = function (obj) {
		if (typeof obj == 'undefined')	{
			return;
		}
		if (obj.style.display == 'none') {
			return true;
		}
		return false;
	};
	this.selectFromValue = function (obj,value) {for (var i=0;i<obj.options.length ;i++ ){if (value==obj.options[i].value){obj.options[i].selected=true;}}};
	this.getElementByAttribute = function (topObject,tag,attributes,values) {
		
		//tag.. kell lennie tegnak
		var elements = topObject.getElementsByTagName(tag);
		

		var found = false;
		for (var i=0; i < elements.length ; i++)
		{
			if (elements[i].nodeType==1)		
			{
				for (var j=0;j < attributes.length ; j++ )
				{
					if (elements[i].getAttribute(attributes[j])!=values[j])
					{
						found = false;
						break;
					} else {
						found = true;
					}
				}				

				if (found) {
					return elements[i];
				}
			}
		}
	};

	this.getElementsByAttribute = function (topObject,tag,attributes,values) {
		
		//tag.. kell lennie tegnak
		var elements = topObject.getElementsByTagName(tag);
		var retElements = new Array();

		var found = false;
		for (var i=0; i < elements.length ; i++)
		{
			if (elements[i].nodeType==1)		
			{
				for (var j=0;j < attributes.length ; j++ )
				{
					if (elements[i].getAttribute(attributes[j])!=values[j])
					{
						found = false;
						break;
					} else {
						found = true;
					}
				}				

				if (found) {
					retElements.push(elements[i]);
				}
			}
		}
		return retElements;
	};
/*
	this.setRequestArray = function (formObj,paramObj) {	
		return true;
		console.log('ehh');
		if (formObj.tagName.toLowerCase()=='select')
		{			
			if (formObj.getAttribute("multiple") )
			{	
				console.log(formObj.options.length);
				for (var i=0;i<formObj.options.length ;i++ )
				{					
					if (formObj.options[i].selected)
					{
						paramObj.keys.push(formObj.name+"[]");
						paramObj.values.push(formObj.options[i].value);
					}
				}
				return false;				
			} else {				
				tmp=formObj.options[formObj.selectedIndex].value;
			}
		}
		if (formObj.tagName.toLowerCase()=='input' || formObj.tagName.toLowerCase()=='textarea')
		{
			tmp=formObj.value;	
		}			
			
		paramObj.keys.push(formObj.name);
		paramObj.values.push(tmp);		
	}
*/
	this.removeClass = function (element, className) {
		element.className = element.className.replace( new RegExp( '\\b' + className + '\\b', 'g' ), '' );
	};
	this.addClass = function (element, className ) {
	    if( !element.className.match( '/\\b' + className + '\\b/' ) )
		    element.className += ' ' + className;
		};
	this.hasClass = function( element, className ) {
		return element.className.match( '\\b' + className + '\\b' );
	};
	this.deleteClasses = function (obj,_class,value) {
		var dels = this.getElementsByAttribute(obj,'*',[_class],[value]);
		for (var i = 0 ; i < dels.length ; i++) {
			this.destroy(dels[i]);
		}
	};
	this.getElementByClassName = function (obj,tagName,value) {
		var elems=obj.getElementsByTagName(tagName);
		for (var i=0;i<elems.length;i++) { 
			if (elems[i].className==value) {
				return elems[i];
			}
		}
	};
	this.getElementByClassName1 = function (obj,tagName,value) {
		var elems=document.getElementsByTagName(tagName);
		var valami = new Array();
		var j=0;
		for (var i=0;i<elems.length;i++) {
			if (elems[i].getAttribute('class')==value) {
				valami[j] = elems[i];
				j++;
			}
		}
		return valami;
	};
	this.getElementArrayByClassName = function (obj,tagName,value) {
		var elems=obj.getElementsByTagName(tagName);
		var valami = new Array();
		var j=0;
		for (var i=0;i<elems.length;i++) {
			if (elems[i].className==value) {
				valami[j] = elems[i];
				j++;
			}
		}
		return valami;
	};
	this.getElementsArrayByClassName = this.getElementArrayByClassName;

	this.getElementByClassNameSmart = function (obj,tagName,value) {
		var elems=obj.getElementsByTagName(tagName);
		for (var i=0;i<elems.length;i++) { 
			if (elems[i].className.indexOf(value) != -1) {
				return elems[i];
			}
		}
	};
	this.getElementsByClassNameSmart = function (className, tag, elm){
		var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
		var tag = tag || "*";
		var elm = elm || document;
		var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
		var returnElements = [];
		var current;
		var length = elements.length;
		for(var i=0; i<length; i++){
			current = elements[i];
			if(testClass.test(current.className)){
				returnElements.push(current);
			}
		}
		return returnElements;
	};
	this.isObj = function (obj) {
		if (typeof obj=='undefined') {
			return false;
		} else {
			return true;
		}
	};
	this.addEvent = function (obj, evType, fn) {
		  if (obj.addEventListener) {
			obj.addEventListener(evType, fn, true);
			return true;
		  } else if (obj.attachEvent) {
			var r = obj.attachEvent("on"+evType, fn);
			return r;
		  } else {
			return false;
		  }
	};
	
	this.addEvent2 = function (objAttrib,handler,addFunction){
	   if ((!document.all)&&(document.getElementById)){
	       objAttrib.setAttribute(handler,addFunction);
	   }
	   //workaround for IE 5.x
	   if ((document.all)&&(document.getElementById)){
	       objAttrib[handler]=new Function(addFunction);
	   }
	   return objAttrib;
	};
	
	this.evalJson = function (json) {
		try	{
			eval("var ret = "+json+";");
		} catch (err) {
			if (err.name=='SyntaxError') {
				return false;
			}
		}
		return ret;
	};
	this.setError = function (msg,text) {
		// majd ha működik
		if (typeof Strip != 'undefined') {
			Strip.set('Error',msg,text);
		} else {
			if (typeof text == 'undefined')	{
				alert(msg);
			} else {
				alert(msg+' '+text);
			}
		}
		//alert(msg);
	};
	this.setMsg = this.setError;
	this.fillSelectJson = function (obj,json,value,text,attr){
		var depth = false;
		var _class = false;
		if (typeof attr == 'undefined') { attr = {'selected':""}; }
		if (typeof attr.text == 'undefined') { attr.text = false; attr.value = 0;}

		if (obj.getAttribute('_depth') == "true") {
			depth = true;
		}
		if (obj.getAttribute('_class') == "true") {
			_class = true;
		}
		var tx;
		//ha display=none akkor show
		//if (obj.style.display=='none') {
		//	obj.style.display='';
		//}

		this.emptyOption(obj);
		if (typeof json == 'undefined') {
			return false;
		}
		if (attr.text) {
			Utils.addOption(obj,attr.text,attr.value);
			obj.options[0].setAttribute('class','dirOption');
		}
		for (var i=0;i<json.length ;i++ ) {
			if (depth) { 
				tx=get_(json[i].de)+json[i][text];
			} else {
				tx=json[i][text];
			}
			if (attr.hidden) {
				if (json[i].hidden) {
					continue;
				}
			}
			Utils.addOption(obj,tx,json[i][value]);
			//Utils.addOption(obj,json[i][text],json[i][value]);
			var id=obj.options.length-1;
			if (json[i][value]==attr.selected) {
				obj.options[id].selected=true;
			}
			if (_class) {
				if (json[i].di == true) {
					obj.options[id].setAttribute('class','dirOption');
				}
			}
			for (var j in json[i]) {
				if (j!=value || j!=text) {
					obj.options[id].setAttribute(j,json[i][j]);
					//obj.options[id].value='read-only';
				}
			}
		}
	};

	this.emptyOption = function (obj){
		for (var i=obj.options.length;i>=0 ;i-- )
		{
			obj.remove(i);
		}
	};
	this.addOption = function (destObj,text,value,className){	
		_option=document.createElement("OPTION");	
		_option.value=value;
		//_option.className=className;
		_option.appendChild(document.createTextNode(text));

		destObj.appendChild(_option);
	};
	this.removeOption = function (destObj,value) {
		for (var i = 0 ; i < destObj.options.length ; i++ )	{
			if (destObj.options[i].value == value) {
				destObj.remove(i);
			}
		}
	};
	this.removeOptionWithout = function (obj,values,key) {
		for (var i = 0;i< obj.options.length ;i++ ) {
			var option = obj.options[i];
			var del = true;
			for (var j = 0; j < values.length ; j++) {
				if (option.value == eval("values[j]."+key)) {
					del = false;
				}
			}
			if (del) {
				obj.remove(i);
			}
		}
	};


	this.click = function (ev) {
		  ev || (ev = window.event);

		  // mely objektum váltotta ki az eseményt?
		  var source;
		  if (typeof ev.target != 'undefined') {
			source = ev.target;
		  } else if (typeof ev.srcElement != 'undefined') {
			source = ev.srcElement;
		  } else { return(true); }
		  return source;
	};
	this.keyEvent = function (e) {
			var keynum;
			var keychar;
			if(window.event) // IE
			{
			keynum = e.keyCode;
			}
			else if(e.which) // Netscape/Firefox/Opera
			{
			keynum = e.which;
			}
			keychar = String.fromCharCode(keynum);
		return {keyChar:keychar,keyNum:keynum};
	};
	this.generateFunctionEvent = function(objName,method) {
		return function (e) {
			var keynum;
			var keychar;
			if(window.event) // IE
			{
			keynum = e.keyCode;
			}
			else if(e.which) // Netscape/Firefox/Opera
			{
			keynum = e.which;
			}
			keychar = String.fromCharCode(keynum);
			eval(objName+"."+method+"(keychar,keynum)");
		};
	};


	this.setAttributes = function (obj,attributes,values){
		for (var i=0; i < attributes.length;i++ ) {
			if (attributes[i] == 'class'){
				obj.className = values[i];
			} else {
			    obj.setAttribute(attributes[i],values[i]);
				if (this.is_ie) {
					if (attributes[i] == 'style'){
						var value = values[i];
						var vs = value.split(';');
						var split;
						for (var j in vs) {
							if (vs[j] == '' || /(margin|display|color|align)/i.test(vs[j])) {
								continue;
							}
							split = vs[j].split(':');
							//alert("obj.style."+split[0]+' = \''+split[1]+'\';');
							eval("obj.style."+split[0]+' = \''+split[1]+'\';');
						}
					}
				}
			}
		}
	};

	this.setRequestArray = function (formObj,paramObj) {		
		var tmp;
		
		if (formObj.tagName.toLowerCase()=='select')
		{			
			if (formObj.getAttribute("multiple") ) {
				for (var i=0;i<formObj.options.length ;i++ )
				{					
					if (formObj.options[i].selected)
					{
						paramObj.keys.push(formObj.name+"[]");
						paramObj.values.push(formObj.options[i].value);
					}
				}
				return false;				
			} else {		
				if (formObj.options.length == 0) {
					return true;
				} else {
					if (formObj.selectedIndex != -1) {
						tmp=formObj.options[formObj.selectedIndex].value;
					} else {
						return true;
					}
				}
			}
		}
		if (formObj.tagName.toLowerCase()=='input' || formObj.tagName.toLowerCase()=='textarea')
		{
			if (formObj.tagName.toLowerCase()=='input' && formObj.getAttribute('type')=='checkbox') {
				if (formObj.checked) {
					tmp=formObj.value;
				} else {
					// ha nincs bepipálva, akkor nem is küldjük át, mint ahogy a böngésző is csinálná
					return true;
				}
			} else {
				tmp=formObj.value;
			}
		}			
		if (formObj.name=='') {
			paramObj.keys.push(formObj.id);
		} else {
			paramObj.keys.push(formObj.name);
		}
		paramObj.values.push(tmp);		
	};
	this.addElement = function (parent,tag,attributes,values,id) {
		if (!parent) {
			console.trace();
		}
	    var el = document.createElement(tag);
		if (typeof attributes != 'undefined' && typeof values != 'undefined') {
			Utils.setAttributes(el,attributes,values);
		}
		if (typeof id != 'undefined') {
			el.id = id;
		}
		
		parent.appendChild(el);
		return el;
	};
	this.addText = function (obj,text) {
		if (typeof text == 'undefined') {
			return;
		}
		obj.appendChild(document.createTextNode(text));
	};
	this.setText = function (obj,text) {
		if (typeof obj == 'undefined')	{ this.setError('setText error'); console.trace(); return; }
		obj.innerHTML = '';
		if (typeof text == 'undefined') {
			return;
		}
		obj.appendChild(document.createTextNode(text));
	};
	this.isFunction = function (func) {
		if (typeof func == 'function') {
			return true;
		} else {
			return false;
		}
	};
	this.addField = function (div, field, value) {
		var el = null;
		text = new Array();
		text_value = new Array();

		var i = 0;
		
		for (var k in field.attr)
		{			
			text[i] = k;
			text_value[i] = eval("field.attr."+text[i]);
			i++;
		}

		var el = Utils.addElement(div,field.tagName,text,text_value);
		
		this.setValue(el,value);

		//div.appendChild(document.createElement('br'));
		return el;
	};

	this.deleteObj = function (object,obj) {
		object.removeChild(obj)	;
	}
	this.addJs = function(filename) {
		this.addElement(document.getElementsByTagName("HEAD")[0],"SCRIPT",['src'],[filename]);
	}
	this.addBr = function (obj) {
		obj.appendChild(document.createElement('br'));
	};
	/*
	this.setValue = function (el,text) {
		console.log(el,text);
		if (typeof el == 'undefined') {
			if (typeof console != 'undefined') {
				console.trace();
			}
			return false;
		}
		if (typeof text == 'undefined') {
			return true;
		}
			console.log(2);
		if(el.tagName.toLowerCase() == "input") {
			el.value = text;
		} else if (el.tagName.toLowerCase() == "select") {
			console.log(1);
			console.log(text);
			for (var i = 0 ; i < el.options.length ; i++) {
				console.log(el.options[i].value);
				if (el.options[i].value == text) {
					el.options[i].selected = true;
				}
			}
		} else {
			Utils.addText(el, text);
		}
		//el.innerHTML = text;
	}
*/
	/// detect Opera browser
	this.is_opera = /opera/i.test(navigator.userAgent);

	/// detect a special case of "web browser"
	this.is_ie = ( /msie/i.test(navigator.userAgent) && !this.is_opera );
	/// detect IE5.0/Win
	this.is_ie5 = ( this.is_ie && /msie 5\.0/i.test(navigator.userAgent) );

	/// detect IE7.0/Win
	this.is_ie7 = ( this.is_ie && /msie 7\.0/i.test(navigator.userAgent) );

	/// detect IE for Macintosh
	this.is_mac_ie = ( /msie.*mac/i.test(navigator.userAgent) && !this.is_opera );

	/// detect KHTML-based browsers
	this.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);

	/// detect Konqueror
	this.is_konqueror = /Konqueror/i.test(navigator.userAgent);

	/// detect Gecko
	this.is_gecko = /Gecko/i.test(navigator.userAgent);
  
	this.getTargetElement = function (ev) {
		  ev || (ev = window.event);

		  // mely objektum váltotta ki az eseményt?
		  var source;
		  if (typeof ev.target != 'undefined') {
			source = ev.target;
		  } else if (typeof ev.srcElement != 'undefined') {
			source = ev.srcElement;
		  } else { return(true); }
		  return source;
	};

	this.getParentNode = function (el,tag,key,value) {
		if (!el) { return null;	}
		el = el.parentNode;
		if (!tag) {
			return el;
		}
		tag = tag.toLowerCase();
		if (el.nodeType == 1) {
			if (el.tagName.toLowerCase() == tag && el.getAttribute(key) == value) {
				return el;
			}
		}
		return this.getParentNode(el, tag,key,value);
	};
	this.getFirstChild = function(el, tag, alternateTag) {
	  if (!el) {
		return null;
	  }
		el = el.firstChild;
	  if (!el) {
		return null;
	  }
		if (!tag) {
			return el;
		}
		tag = tag.toLowerCase();
		if (el.nodeType == 1) {
			if (el.tagName.toLowerCase() == tag) {
				return el;
			} else if (alternateTag) {
				alternateTag = alternateTag.toLowerCase();
				if (el.tagName.toLowerCase() == alternateTag) {
					return el;
				}
			}
		}
		return this.getNextSibling(el, tag, alternateTag);
	};

	this.getNextSibling = function(el, tag, alternateTag) {
		el = el.nextSibling;
		if (!tag) {
			return el;
		}
		tag = tag.toLowerCase();
		if (alternateTag) alternateTag = alternateTag.toLowerCase();
		while (el) {
			if (el.nodeType == 1 && (el.tagName.toLowerCase() == tag ||
			 (alternateTag && el.tagName.toLowerCase() == alternateTag))) {
				return el;
			}
			el = el.nextSibling;
		}
		return el;
	};
	this.destroy = function(el) {
		if (el && el.parentNode)
			el.parentNode.removeChild(el);
	};

	this.setValue = function (_el,value) {
		el = (typeof _el == 'string') ? document.getElementById(_el) : _el;
		if (typeof el == 'undefined' || el == null) {
			if (typeof console != 'undefined') {
				console.trace();
			}
			return false;
		}
		if (typeof value == 'undefined') {
			//return true;
			value = '';
		}
		if(el.tagName.toLowerCase() == "input"){			
			if (el.type == 'checkbox'){
				el.checked = (value) ? 'checked' : '';
			} else {
				el.value = value;
			}
		} else if (el.tagName.toLowerCase() == "img"){
			console.log(el);
		} else if (el.tagName.toLowerCase() == "select"){
			// végig megyünk az összes option-on és ahol value==value beállítjuk selected-re
			for (var i = 0;i < el.options.length ; i++ ) {
			//	console.log(el.options[i].value,value);
				if (el.options[i].value == value) {
					el.options[i].selected = 'selected';
				}
			}
		} else {
			Utils.addText(el, value);
		}
		//el.innerHTML = text;
	};
	this.getValue = function (_el) {
		el = (typeof _el == 'string') ? document.getElementById(_el) : _el;
		if (typeof el == 'undefined' || el == null) {
			if (typeof console != 'undefined') {
				console.trace();
			}
			return;
		}
		if (typeof value == 'undefined') {
			//return true;
			value = '';
		}
		if(el.tagName.toLowerCase() == "input"){			
			if (el.type == 'checkbox'){
				return (el.checked == true ? true : false);
			} else {
				return el.value;
			}
		} else if (el.tagName.toLowerCase() == "img"){
			console.log(el);
		} else if (el.tagName.toLowerCase() == "select"){
			/*
			// végig megyünk az összes option-on és ahol value==value beállítjuk selected-re
			for (var i = 0;i < el.options.length ; i++ ) {
			//	console.log(el.options[i].value,value);
				if (el.options[i].value == value) {
					el.options[i].selected = 'selected';
				}
			}
			*/
			return;
		}
		//el.innerHTML = text;
	};
	this.searchId = function (el,name) {
		while(el = el.parentNode) {
			if(el.hasAttribute(name)) {
				return el.getAttribute(name);
			}
		}
		return false;
	};
	this.average = function (array) {
		var sum = 0;
		for (var i = 0; i < array.length ; i++) {
			sum += parseFloat(array[i]);
		}
		return sum/array.length;
	};
	this.round = function (num,point) {
		return Math.round(num*Math.pow(10,point))/Math.pow(10,point);
	};
	this.filter = function (id) {
		if (Utils.ge(id).checked) {
			return true;
		} 
		return false;
	};
	this.removeArray = function (obj,key) {
		var newArray = new Array();
		for (var i = 0; i < obj.length ; i++) {
			if (obj[i] != key) {
				newArray.push(obj[i]);
			}
		}
		return newArray;
	};
	this.removeArray2 = function (obj,key) {
		var newArray = new Array();
		for (var i = 0 ; i < obj.length; i++) {
			if (i != key) {
				newArray.push(obj[i]);
			}
		}
		return newArray;
	};
	this.getSelected = function (obj,key) {
		var newArray = new Array();
		for (var i = 0 ; i < obj.length; i++) {
			if (i == key) {
				newArray.push(obj[i]);
			}
		}
	//	console.log(newArray);
		return newArray;
	};
	this.money = function (num,sep) {
		num = num.toString().replace(/\$|\,/g,'');
		if (isNaN(num)) {
			num = "0";
		}
		sign = (num == (num = Math.abs(num)));
		num = Math.floor(num).toString();
		if (typeof sep == 'undefined') {
			sep = ',';
		}
		for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++) {
			num = num.substring(0,num.length-(4*i+3))+sep+ num.substring(num.length-(4*i+3));
		}
		return (((sign)?'':'-') +  num);
	};
	this.setCookie = function(name, value, expires, path, domain, secure) {
	    document.cookie= name + "=" + escape(value) +
        ((expires) ? "; expires=" + expires.toGMTString() : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");
	};
 
	this.getCookie = function(name) {
		var dc = document.cookie;
		var prefix = name + "=";
		var begin = dc.indexOf("; " + prefix);
		if (begin == -1) {
			begin = dc.indexOf(prefix);
			if (begin != 0) return null;
		} else {
			begin += 2;
		}
		var end = document.cookie.indexOf(";", begin);
		if (end == -1) {
			end = dc.length;
		}
		return unescape(dc.substring(begin + prefix.length, end));
	};
	this.SmartButtonClick = function (obj) {
		var href = '';
		if (obj.getAttribute('_href') != null) {
			href += obj.getAttribute('_href');
		}
		if (obj.getAttribute('_id') != null) {
			href += obj.getAttribute('_id');
		}

		if (href.length != 0) {
			window.location = href;
		}
	};
	this.fieldsetChange = function () {
		// ha a fieldset-en kattintani szeretnénk és a tartalma eltünjön/megjelenjen
		var els = Utils.getElementsByClassNameSmart('fieldsetChange','fieldset');
		for (var i in els) {
			var el = els[i];
			var div = document.createElement('div');
			var legend = false;
			for ( var i = 0 ; i < el.childNodes.length ; i++) {
				if (el.childNodes[i].nodeType == 1 && el.childNodes[i].tagName == 'LEGEND')	{
					legend = el.childNodes[i];
				} else {
					div.appendChild(el.childNodes[i].cloneNode(true));
				}
			}
			if (!legend) {
				legend = document.createElement('legend'); legend.appendChild(document.createTextNode('Legend'));
			}
			el.innerHTML = '';
			el.appendChild(legend);
			el.appendChild(div);

			legend.className += (Utils.hasClass(el,'_hide')) ? ' _hide' : ' _show';
			var parent = legend.parentNode
			if (Utils.hasClass(el,'_hide'))	{
				Utils.hide(el.getElementsByTagName('div')[0]);
				/*for (var i = 0 ; i < parent.childNodes.length; i++) {
					var el = parent.childNodes[i];
					if (el.nodeType == 1 && el.tagName != 'LEGEND') {
						Utils.hide(el);
					}
				}*/	
			}
		
			legend.style.cursor = 'pointer';
			Utils.addEvent(legend,'click',
				function (e) { 
					var obj = Utils.click(e); 
					var hided = false;
					if (Utils.hasClass(obj,'_hide')){
						hided = true;
						obj.className = obj.className.replace(/_hide/,'_show');
					} else {
						obj.className = obj.className.replace(/_show/,'_hide');
					}
					var parent = obj.parentNode;
					if (hided) {
						Utils.show(parent.getElementsByTagName('div')[0]);
					} else {
						Utils.hide(parent.getElementsByTagName('div')[0]);
					}
					/*
					for (var i = 0 ; i < parent.childNodes.length; i++) {
						var el = parent.childNodes[i];
						if (el.nodeType == 1 && el.tagName != 'LEGEND') {
							if (hided) {
								Utils.show(el);
							} else {
								Utils.hide(el);
							}
						}
					}
					*/
				})
		}	

		/*
		// nem volt jo, mert csak a nodyType1-eket tunteni
		for (var i in els) {
			var el = els[i];
			var legend = el.getElementsByTagName('legend')[0];
			legend.className += (Utils.hasClass(el,'_hide')) ? ' _hide' : ' _show';
			var parent = legend.parentNode
			if (Utils.hasClass(el,'_hide'))	{
				for (var i = 0 ; i < parent.childNodes.length; i++) {
					var el = parent.childNodes[i];
					if (el.nodeType == 1 && el.tagName != 'LEGEND') {
						Utils.hide(el);
					}
				}	
			}
		
			legend.style.cursor = 'pointer';
			Utils.addEvent(legend,'click',
				function (e) { 
					var obj = Utils.click(e); 
					var hided = false;
					if (Utils.hasClass(obj,'_hide')){
						hided = true;
						obj.className = obj.className.replace(/_hide/,'_show');
					} else {
						obj.className = obj.className.replace(/_show/,'_hide');
					}
					var parent = obj.parentNode;
					for (var i = 0 ; i < parent.childNodes.length; i++) {
						var el = parent.childNodes[i];
						if (el.nodeType == 1 && el.tagName != 'LEGEND') {
							if (hided) {
								Utils.show(el);
							} else {
								Utils.hide(el);
							}
						}
					}			
				})
		}	
		*/

	};
}

Utils = new utils();

function Json (objectName,_params) {
	this.objectName = objectName;
	this.smartSuccessMethod = function (json) {};
	this._send = function () { return true; };
	this.params_ = {"keys":[],"values":[]};
	this.url = null;
	this.prefix = null;
	this.smartAjax = null;
	
	this.sendable = function () {
		if (this.request.obj.readyState != 0){
			return false;
		} else {
			return true;
		}
	};
	this.send = function (obj) {
		// id paramétert új keretrendszerbe nem eszi meg, nem jön rá válasz, pedig igen, vagy mégsem, jóaz, csak rossz a firefoxom

		// ha az előző nem fejezte be a futását, akkor újat indítunk
		if (this.request.obj.readyState != 0){
			//this.request.obj.abort();
			this.init();
		}
		if (this.smartAjax) {
			this.addParam('smartAction',this.objectName);
		}
		if (this._send(obj) === false) {
			return false;
		}
		// ha van box, akkor meghívjuk a loading függvényét
		if (typeof this.box != 'undefined')	{
			var object = eval(this.box);
			object.loading();
		}
		this.request.obj.open(this.request.method, this.url, this.request.async);				
		this.request.obj.onreadystatechange = this.request.generateFunction(this.objectName,"httpReturn");
		this.request.obj.setRequestHeader('Content-Type','application/x-www-form-urlencoded;');	
		this.request.obj.send(this.request.arrayToRequest(this.params_));
		this.params_ = {"keys":[],"values":[]};
		return true;
	};
	this.defaultSuccessMethod = function (xmlhttpResp,_params) {
		var params_ = _params;
		var objectName = _params.objectName;
		var object = params_.object;
		if (json=Utils.evalJson(xmlhttpResp.responseText)) {
			if (json.status != 0) {
				// majd egyszer megkéne csinálni, hogy ne csak a 0. elemet írja ki.
				//Utils.setError('Hiba: '+json.errors[0] + ' Status: '+json.status+' | '+params.objectName+'.returnRequest(()) ', xmlhttpResp.responseText);
				
				Utils.setError('Hiba: '+json.errors[0]);
				return false;
			}
			// a beálított függvény meghívása
			object.successMethod(object.object,json,_params);
		} else {
		    Utils.setError('Hiba Json '+object.objectName+'.returnRequest('+xmlhttpResp._params.type+'()): ', xmlhttpResp.responseText);
		}
	};
	this.httpReturn = function (){			
		if (this.request.obj.readyState != 4) {
			return true;
		}
		if (this.request.obj.status != 200) {
			if (typeof(this.errorMethod)=='undefined')	{					
				this.defaultFailed(this.request.obj);
			} else {					
				this.errorMethod(this.request.obj,this._params);
			}
		} else {
			//var obj=this.request.obj;
			//delete this.request.obj;
			var oldObj = this.request.obj;
			var oldBox = this.box;
			this.init();
			if (typeof this.smartSuccessMethod != 'undefined') {
				if (json=Utils.evalJson(oldObj.responseText)) {
					// itt kéne olyan, hogy ha status nem 0 (tehát hiba van) megnézni hogy van e error függvény
					// ha box, akkor a box-ot hajtjuk végre
					if (typeof oldBox != 'undefined')	{
						var object = eval(oldBox);
						object.loaded();
						object.data = json.data;
						object.draw();
					} else {
						this.smartSuccessMethod(json);
					}
					//if (json.status == 0) {
					//	this.smartSuccessMethod(json);
					//} else {
					//	alert('hiba:'+json.status);
					//}
				} else {
					alert('Ismeretlen hiba: nem json jött válaszként:');
				}
			} else {
				this.successMethod(oldObj);	
			}
		}
		this.init2();
		return false;
	};
	this.addParam = function (keys,values) {
		// id paramétert új keretrendszerbe nem eszi meg, nem jön rá válasz, pedig igen, vagy mégsem (csak firefoxal volt problem)
		if (typeof values == 'object') {
			for (var i=0;i<values.length ;i++ ) {
				this.params_.values.push(values[i]);
			}
		} else if (typeof values == 'string' || typeof values == 'number') {
			this.params_.values.push(values);
		} else {
			// ha véletlenül undefined jön át akkor is küldjünk valamit
			this.params_.values.push('');
		}
		// ha a values object, akkor az az eset áll fent pl: dates[] -> [2006],[2007],[2008]
		if (typeof keys == 'object') {
			for (var i=0;i<keys.length ;i++ ) {
				//this.params_.keys.push(keys[i]);
				this.addKey(keys[i]);
			}
		} else if (typeof keys == 'string' || typeof keys == 'number') {
			// tehát ha a values object, akkor ezt is megismételjük annyiszor
			if (typeof values == 'object') {
				for (var i=0;i<values.length ;i++ ) {
					//this.params_.keys.push(keys);
					this.addKey(keys);
				}
			} else {
				//this.params_.keys.push(keys);
				this.addKey(keys);
			}
		}

};
	this.addKey = function (key) {
		if (this.prefix == null) {
			this.params_.keys.push(key);
		} else {
			// kell prefix
			this.params_.keys.push(this.prefix+'['+key+']');
		}
	};
	this.clear = function () {
		this.params_ = {"keys":[],"values":[]};
	}
	for (var i in _params) {
		eval('this.' + i + ' = _params[\'' + i + '\'];');
	}
	this.init = function () {
		this.request = new Request();
		this.request.url = this.url;
		delete this.box;
	};
	this.init2 = function () {
	};
	this.init();
}

function Ajax(objectName,_params) {
	this.objectName = objectName;
	this.successMethod = function () {};
	this.defaultFailed = function () {};
	this._send = function () { return true; };
	this.params_ = {"keys":[],"values":[]};
	this.url = null;
	this.sendable = function () {
		if (this.request.obj.readyState != 0){
			return false;
		} else {
			return true;
		}
	};

	this.send = function (obj) {
		if (!this.sendable()){
			//this.request.obj.abort();
			this.init();
		}

		if (this._send(obj) === false) {
			return false;
		}

		this.request.obj.open(this.request.method, this.url, this.request.async);				
		this.request.obj.onreadystatechange = this.request.generateFunction(this.objectName,"httpReturn");
		this.request.obj.setRequestHeader('Content-Type','application/x-www-form-urlencoded;');	
		this.request.obj.send(this.request.arrayToRequest(this.params_));
		this.params_ = {"keys":[],"values":[]};
		return true;

	};

	this.httpReturn = function (){			
		if (this.request.obj.readyState != 4) {
			return true;
		}
		if (this.request.obj.status != 200) {
			if (typeof(this.errorMethod)=='undefined')	{					
				this.defaultFailed(this.request.obj);
			} else {					
				this.errorMethod(this.request.obj,this._params);
			}
		} else {
			this.successMethod(this.request.obj);	
			this.init();
		}
		return false;
	};

	this.addParam = function (keys,values) {
		// id paramétert új keretrendszerbe nem eszi meg, nem jön rá válasz, pedig igen, vagy mégsem
		if (typeof values == 'object') {
			for (var i=0;i<values.length ;i++ ) {
				this.params_.values.push(values[i]);
			}
		} else if (typeof values == 'string' || typeof values == 'number') {
			this.params_.values.push(values);
		}
		// ha a values object, akkor az az eset áll fent pl: dates[] -> [2006],[2007],[2008]
		if (typeof keys == 'object') {
			for (var i=0;i<keys.length ;i++ ) {
				//this.params_.keys.push(keys[i]);
				this.addKey(keys[i]);
			}
		} else if (typeof keys == 'string' || typeof keys == 'number') {
			// tehát ha a values object, akkor ezt is megismételjük annyiszor
			if (typeof values == 'object') {
				for (var i=0;i<values.length ;i++ ) {
					//this.params_.keys.push(keys);
					this.addKey(keys);
				}
			} else {
				//this.params_.keys.push(keys);
				this.addKey(keys);
			}
		}

	};
	this.addKey = function (key) {
		if (this.prefix == null) {
			this.params_.keys.push(key);
		} else {
			// kell prefix
			this.params_.keys.push(this.prefix+'['+key+']');
		}
	};

	this.init = function () {
		this.request = new Request();
		this.request.url = this.url;
	};
	this.init();


}
//var Ajax = new Ajax();

function List () {
	this.objectName = 'List';
	this.button_value = ['first','prev','next','last'];
	this.button_text = ['<<Első','<<Elöző','Következő>>','Utolsó>>'];
	//this.offset = 0;
	this.params = {"keys":[],"values":[]};
	this.url = null;
	this.container_id = null;
	this.container = null;
	this.el = {};
	this.item = null;
	this.item_fields_text = [];
	this.item_fields_id = [];
	this._change = true;
	this.loading = null;
	this.rs_id = '';
	this.params_id = [];
	this.successMethod = function (xmlhttpResp,_params) {
		if (this.loading != null) {
			Utils.hide(this.loading);
		}
		if (json=Utils.evalJson(xmlhttpResp.responseText)) {
			if (json.status != 0) {
				Utils.setError('Hiba: '+json.errors[0]+xmlhttpResp.responseText);
			} else {
				List.setData(json.data);
			}
		}
		//var html = xmlhttpResp.responseText;
		//Utils.ge(this.container).innerHTML = html;
	};
	this.httpReturn = function (){			
		if (this.request.obj.readyState != 4) {
			return true;
		}
		if (this.request.obj.status != 200) {
			if (typeof(this.errorMethod)=='undefined')	{					
				this.defaultFailed(this.request.obj);
			} else {					
				this.errorMethod(this.request.obj,this._params);
			}
		} else {
			//var obj=this.request.obj;
			//delete this.request.obj;
			this.successMethod(this.request.obj,this._params);				
		}
		return false;
	};
	this.change = function () {
		var els = this.el.change.getElementsByTagName('input');
		for (var i=0 ; i < els.length ; i++) {
			els[i].disabled = this._change;
		}
		var els = this.el.change.getElementsByTagName('select');
		for (var i=0 ; i < els.length ; i++) {
			els[i].disabled = this._change;
		}
		this._change = !this._change;
	};
	this.init = function () {
		this.container = Utils.ge(this.container_id);
		// disabled
		this.el.change = Utils.ge('filters_change');
		this.change();

		this.thead = Utils.ge('list_thead').getElementsByTagName('thead')[0];
		this.item = Utils.ge('list_item').getElementsByTagName('tr')[0];
		// addText
		var tags = this.item.getElementsByTagName('*');
		for (var i=0 ; i < tags.length ; i++) {
			if (tags[i].getAttribute('_action') != null && tags[i].getAttribute('_action') == 'setText') {
				this.item_fields_text.push(tags[i].className);
			}
		}
		// addId
		for (var i=0 ; i < tags.length ; i++) {
			if (tags[i].getAttribute('_action') != null && tags[i].getAttribute('_action') == 'setId') {
				this.item_fields_id.push(tags[i].className);
				
			}
		}
		//setMultipleParams
		for (var i=0 ; i < tags.length ; i++) {
			if (tags[i].getAttribute('_action') != null && tags[i].getAttribute('_action') == 'setMultipleParams') {
				this.item_fields_id.push(tags[i].className);
				
			}
		}
		
		// loading
		if (Utils.he('loading')) {
			this.loading = Utils.ge('loading');
		}
		this.request = new Request();
		this.request.url = this.url;
	};
	this.setData = function (data) {
		Utils.destroy(this.el.table);
		Utils.destroy(this.el.pager);
		this.el.pager = Utils.addElement(this.container,'div',['class','style'],['pager','text-align:center;']);
		this.setPager(data.pager);
		this.el.table = Utils.addElement(this.container,'table',['class'],['list']);
		this.el.table.appendChild(this.thead.cloneNode(true));
		this.el.table_tbody = Utils.addElement(this.el.table,'tbody');
		for (var i in data.data) {
			this.addRow(data.data[i]);
		}
	};
	this.setPager = function (pager) {
		this.el.title = Utils.addElement(this.el.pager,'div',['style'],['font-weight:bold;']);
		Utils.addText(this.el.title,pager.allNum + 'db találat');
		this.el.first = Utils.addElement(this.el.pager,'div');
		// first prev next last 
		for (var i = 0; i < this.button_value.length ; i++) {
			if (pager[this.button_value[i]].status) {
				// link-nek kell lennie
				Utils.addText(Utils.addElement(Utils.addElement(this.el.first,'span',['style'],['margin:0px 10px;']),'a',['href'],['javascript:List.send('+pager[this.button_value[i]].link+')']),this.button_text[i]);
			} else {
				Utils.addText(Utils.addElement(this.el.first,'span',['style'],['margin:0px 10px;']),this.button_text[i]);
			}
			if (this.button_value[i] == 'prev') {
				Utils.addElement(this.el.first,'span',['style'],['margin:0px 15px']);
			}
		}
		//Utils.addText(this.el.first,pager.allNum);
		// a számok
		this.el.pages = Utils.addElement(this.el.pager,'div');
		for (var i in pager.pages) {
			var page = pager.pages[i];
			if (page.status) {
				// link-nek kell lennie
				Utils.addText(Utils.addElement(Utils.addElement(this.el.pages,'span',['style'],['margin:0px 3px']),'a',['href'],['javascript:List.send('+page.link+')']),page.num);
			} else {
				Utils.addText(Utils.addElement(this.el.pages,'span',['style'],['margin:0px 3px']),page.num);
			}
		
		}
	};
	this.addRow = function(data) { var field;
		var item = this.item.cloneNode(true);
		this.el.table_tbody.appendChild(item);
		for (var i in this.item_fields_text) {
			field = this.item_fields_text[i];
			Utils.addText(Utils.getElementByClassName(item,'*',field),data[field]);
		}
		for (var i = 0 ; i < this.item_fields_id.length ; i++) {
			field = this.item_fields_id[i];
			Utils.getElementByClassName(item,'*',field).setAttribute('_id',data[this.rs_id]);
		
		}
		for (var i = 0 ; i < this.item_fields_id.length ; i++) {
			field = this.item_fields_id[i];
			if(data[this.type] == true){
				//type = 1;
			}else{
				//type = 2;
			}
			Utils.getElementByClassName(item,'*',field).setAttribute('_type',data[this.type]);
		}
		if(Utils.ge('tr_id') != undefined){
			for (var i = 0 ; i < this.item_fields_id.length ; i++) {
				field = this.item_fields_id[i];
		
				Utils.getElementByClassName(item,'*',field).setAttribute('_tr_id',Utils.ge('tr_id').value);
			
			}
		}
	};
	this.send = function (offset) {
		// végig menni a meghatározott mezőkön... (ha disabled akkor ne adjuk hozzá)
		//this.addParam('limit',Utils.ge('filter').value);
		Utils.setRequestArray(Utils.ge('limit'),this.params);
//		this.addParam('filter[role]',role);
		
		if (Utils.isFunction(this._send)) {
			this._send();
		}
		if(Utils.ge('tr_id') != undefined){
			this.addParam('tr_id',Utils.ge('tr_id').value);
		}
		if (Utils.ge('filter').checked == true) {
			this.addParam('filter['+Utils.ge('filter_name').value+']',Utils.ge('filter_text').value);
		}

		
		if (offset != false) { // tehát ha nem false jött, akkor küldünk offset-et is
			this.params.keys.push('offset');
			this.params.values.push(offset);
		}
		if (this.loading != null) {
			Utils.show(this.loading);
		}
		this.request.obj.open(this.request.method, this.request.url, this.request.async);				
		this.request.obj.onreadystatechange = this.request.generateFunction(this.objectName,"httpReturn");
		this.request.obj.setRequestHeader('Content-Type','application/x-www-form-urlencoded;');	
		this.request.obj.send(this.request.arrayToRequest(this.params));
		//console.log(this.params);
		this.params = {"keys":[],"values":[]};
	};
/*
	for (var i in _params) {
		eval('this.' + i + ' = _params[\'' + i + '\'];');
	}	
*/
	this.addFilters = function (object) {
		var filters = object.filters;
		for (var i = 0; i < filters.length ; i++) {
			var filter = filters[i];
			var el = Utils.addElement(Utils.ge(this.filter_id),filter.tagName);
			this.filters.push(el);
			el.setAttribute('name','filters['+i+']');
			if (filter.tagName == 'select')	{
				for ( var j = 0;j < filter.texts.length ; j++) {
					Utils.addOption(el,filter.texts[j],j);
				}
			}
		}
	};
	this.addParam = function (keys,values) {
		if (typeof values == 'object') {
			for (var i=0;i<values.length ;i++ ) {
				this.params.values.push(values[i]);
			}
		} else if (typeof values == 'string' || typeof values == 'number') {
			this.params.values.push(values);
		}
		// ha a values object, akkor az az eset áll fent pl: dates[] -> [2006],[2007],[2008]
		if (typeof keys == 'object') {
			for (var i=0;i<keys.length ;i++ ) {
				//this.params.keys.push(keys[i]);
				this.addKey(keys[i]);
			}
		} else if (typeof keys == 'string' || typeof keys == 'number') {
			// tehát ha a values object, akkor ezt is megismételjük annyiszor
			if (typeof values == 'object') {
				for (var i=0;i<values.length ;i++ ) {
					//this.params.keys.push(keys);
					this.addKey(keys);
				}
			} else {
				//this.params.keys.push(keys);
				this.addKey(keys);
			}
		}

	};
	this.addKey = function (key) {
		if (this.prefix == null) {
			this.params.keys.push(key);
		} else {
			// kell prefix
			this.params.keys.push(this.prefix+'['+key+']');
		}
	}
	function setAttribs(element, attribs){  
	    //Végiglépkedünk az attribs objektum elemein  
		for (var i in attribs){  
			if (typeof attribs[i] == "object"){  
				//Az elem szintén objektum, meghívjuk erre is a függvényt  
				setAttribs(element, attribs[i]);  
			}else {  
				//Az elem adott tulajdonságának megváltoztatása.  
			try{ element[i] = attribs[i]; } catch(err){}  
			}  
		}  
	};
}
var List = new List();

function SmartList () {
	this.objectName = 'SmartList';
	this.button_value = ['first','prev','next','last'];
	this.button_text = ['<<Első','<<Elöző','Következő>>','Utolsó>>'];
	//this.offset = 0;
	this.params = {"keys":[],"values":[]};
	this.url = null;
	this.id = null;
	this.container = null;
	this.el = {};
	this.item = null;
	this.item_fields_text = [];
	this.item_fields_id = [];
	this._change = true;
	this.loading = null;
	this.rs_id = '';
	this.params_id = [];
	this.successMethod = function (xmlhttpResp,_params) {
		if (this.loading != null) {
			Utils.hide(this.loading);
		}
		if (json=Utils.evalJson(xmlhttpResp.responseText)) {
			if (json.status != 0) {
				Utils.setError('Hiba: '+json.errors[0]+xmlhttpResp.responseText);
			} else {
				SmartList.setData(json.data);
			}
		}
		//var html = xmlhttpResp.responseText;
		//Utils.ge(this.container).innerHTML = html;
	};
	this.httpReturn = function (){			
		if (this.request.obj.readyState != 4) {
			return true;
		}
		if (this.request.obj.status != 200) {
			if (typeof(this.errorMethod)=='undefined')	{					
				this.defaultFailed(this.request.obj);
			} else {					
				this.errorMethod(this.request.obj,this._params);
			}
		} else {
			//var obj=this.request.obj;
			//delete this.request.obj;
			this.successMethod(this.request.obj,this._params);				
		}
		return false;
	};
	this.init = function () {

		Utils.resetValid();
		Utils.valid(Utils.ge(this.id+'_container'),'Nincs meg a container');
		Utils.valid(Utils.ge(this.id+'_pager'),'Nincs meg a pager');
		Utils.valid(Utils.ge(this.id+'_table'),'Nincs meg a table');

		if (!Utils.isValid()) {
			console.log(Utils._valid);
			return false;
		}
		this.container = Utils.ge(this.id+'_container');
		this.el.pager = Utils.ge(this.id+'_pager');
		this.el.table = Utils.ge(this.id+'_pager');

		this.thead = this.container.getElementsByTagName('thead')[0];
		if (this.container.getElementsByTagName('tfoot').length == 0) {
			this.el.tfoot = this.container.getElementsByTagName('tfoot');
		}
		this.item = this.container.getElementsByTagName('tbody')[0].getElementsByTagName('tr')[0].cloneNode(true);
		this.el.table_tbody = this.container.getElementsByTagName('tbody')[0];

		//console.log(this.item);
		// addText
		var tags = this.item.getElementsByTagName('*');
		for (var i=0 ; i < tags.length ; i++) {
			if (tags[i].getAttribute('_action') != null && tags[i].getAttribute('_action') == 'setText') {
				this.item_fields_text.push(tags[i].className);
			}
		}
		// addId
		for (var i=0 ; i < tags.length ; i++) {
			if (tags[i].getAttribute('_action') != null && tags[i].getAttribute('_action') == 'setId') {
				this.item_fields_id.push(tags[i].className);
			}
		}
		// loading
		if (Utils.he('loading')) {
			this.loading = Utils.ge('loading');
		}
		this.request = new Request();
		this.request.url = this.url;
	};
	this.setData = function (data) {
		this.el.table_tbody.innerHTML = '';
		this.el.pager.innerHTML  = '';
		this.setPager(data.pager);
		for (var i in data.data) {
			this.addRow(data.data[i]);
		}
	};
	this.setPager = function (pager) {
		this.el.title = Utils.addElement(this.el.pager,'div');
		Utils.addText(this.el.title,pager.allNum + 'db találat');
		this.el.first = Utils.addElement(this.el.pager,'div');
		// first prev next last 
		for (var i = 0; i < this.button_value.length ; i++) {
			if (pager[this.button_value[i]].status) {
				// link-nek kell lennie
				Utils.addText(Utils.addElement(Utils.addElement(this.el.first,'span',['style'],['margin:0px 10px;']),'a',['href'],['javascript:SmartList.send('+pager[this.button_value[i]].link+')']),this.button_text[i]);
			} else {
				Utils.addText(Utils.addElement(this.el.first,'span',['style'],['margin:0px 10px;']),this.button_text[i]);
			}
			if (this.button_value[i] == 'prev') {
				Utils.addElement(this.el.first,'span',['style'],['margin:0px 15px']);
			}
		}
		//Utils.addText(this.el.first,pager.allNum);
		// a számok
		this.el.pages = Utils.addElement(this.el.pager,'div');
		for (var i in pager.pages) {
			var page = pager.pages[i];
			if (page.status) {
				// link-nek kell lennie
				Utils.addText(Utils.addElement(Utils.addElement(this.el.pages,'span',['style'],['margin:0px 3px']),'a',['href'],['javascript:SmartList.send('+page.link+')']),page.num);
			} else {
				Utils.addText(Utils.addElement(this.el.pages,'span',['style'],['margin:0px 3px']),page.num);
			}
		
		}
	};
	this.addRow = function(data) { var field;
		var item = this.item.cloneNode(true);
		this.el.table_tbody.appendChild(item);
		for (var i in this.item_fields_text) {
			field = this.item_fields_text[i];
			Utils.addText(Utils.getElementByClassName(item,'*',field),data[field]);
		}
		for (var i = 0 ; i < this.item_fields_id.length ; i++) {
			field = this.item_fields_id[i];
			Utils.getElementByClassName(item,'*',field).setAttribute('_id',data[this.rs_id]);
		}
	};
	this.send = function (offset) {
		// végig menni a meghatározott mezőkön... (ha disabled akkor ne adjuk hozzá)
		//this.addParam('limit',Utils.ge('filter').value);
		Utils.setRequestArray(Utils.ge('limit'),this.params);
		//this.addParam('filter[role]',role);
		//if (Utils.ge('filter').checked == true) {
		//	this.addParam('filter['+Utils.ge('filter_name').value+']',Utils.ge('filter_text').value);
		//}

/*		var el;
		for (var i in this.params_id) {
			el = Utils.ge(this.params_id[i]);
			if (el.disabled == false) {
				Utils.setRequestArray(el,this.params);
			}
		}*/
		if (this.smartAction) {
			this.addParam('smartAction',this.smartAction);
		}
		if (offset != false) { // tehát ha nem false jött, akkor küldünk offset-et is
			this.params.keys.push('offset');
			this.params.values.push(offset);
		}
		if (this.loading != null) {
			Utils.show(this.loading);
		}
		this.request.obj.open(this.request.method, this.request.url, this.request.async);				
		this.request.obj.onreadystatechange = this.request.generateFunction(this.objectName,"httpReturn");
		this.request.obj.setRequestHeader('Content-Type','application/x-www-form-urlencoded;');	
		this.request.obj.send(this.request.arrayToRequest(this.params));
		//console.log(this.params);
		this.params = {"keys":[],"values":[]};
	};
/*
	for (var i in _params) {
		eval('this.' + i + ' = _params[\'' + i + '\'];');
	}	
*/
	this.addFilters = function (object) {
		var filters = object.filters;
		for (var i = 0; i < filters.length ; i++) {
			var filter = filters[i];
			var el = Utils.addElement(Utils.ge(this.filter_id),filter.tagName);
			this.filters.push(el);
			el.setAttribute('name','filters['+i+']');
			if (filter.tagName == 'select')	{
				for ( var j = 0;j < filter.texts.length ; j++) {
					Utils.addOption(el,filter.texts[j],j);
				}
			}
		}
	};
	this.addParam = function (keys,values) {
		if (typeof values == 'object') {
			for (var i=0;i<values.length ;i++ ) {
				this.params.values.push(values[i]);
			}
		} else if (typeof values == 'string' || typeof values == 'number') {
			this.params.values.push(values);
		}
		// ha a values object, akkor az az eset áll fent pl: dates[] -> [2006],[2007],[2008]
		if (typeof keys == 'object') {
			for (var i=0;i<keys.length ;i++ ) {
				//this.params.keys.push(keys[i]);
				this.addKey(keys[i]);
			}
		} else if (typeof keys == 'string' || typeof keys == 'number') {
			// tehát ha a values object, akkor ezt is megismételjük annyiszor
			if (typeof values == 'object') {
				for (var i=0;i<values.length ;i++ ) {
					//this.params.keys.push(keys);
					this.addKey(keys);
				}
			} else {
				//this.params.keys.push(keys);
				this.addKey(keys);
			}
		}

	};
	this.addKey = function (key) {
		if (this.prefix == null) {
			this.params.keys.push(key);
		} else {
			// kell prefix
			this.params.keys.push(this.prefix+'['+key+']');
		}
	}
	function setAttribs(element, attribs){  
	    //Végiglépkedünk az attribs objektum elemein  
		for (var i in attribs){  
			if (typeof attribs[i] == "object"){  
				//Az elem szintén objektum, meghívjuk erre is a függvényt  
				setAttribs(element, attribs[i]);  
			}else {  
				//Az elem adott tulajdonságának megváltoztatása.  
			try{ element[i] = attribs[i]; } catch(err){}  
			}  
		}  
	};
}
var SmartList = new SmartList();


var NOTICE = 1;
var NOERROR = 0;
function Errors() {
	//debug level
	this.fields = [];
	this.debug = 0;
	this._errors=new Array();
	this.validate = function (id,rule,msg) {
		//this.rules.push({id:id,rule:rule,msg:msg});
		if (!Utils.he(id)) {
			this._errors.push(msg);
			return true;
			Utils.setError('nincs ilyen id: ',id);
		}
		//console.log(rule);
		var value = Utils.ge(id).value;
		if (this.debug==NOTICE) {
			console.log(Utils.ge(id));
			console.log('value:"'+value+'"');
			console.log('eval:this.'+rule+'('+value+')');
		}
		// nem tudom miért, mind1... talán a NULL -t valamiért nem stringnek veszi
		if (value == 'NULL') {
			value = '';
		}
		if (!eval('this.'+rule+'(value)')) {
			if (this.debug==NOTICE) {
				console.log(msg);
			}
			this._errors.push(msg);
		}
	};
	

	this.hasError = function () {
		return this._errors.length;
	};
	this.getErrors = function () {
		var errors='';
		for (var i=0; i<this._errors.length;i++ ) {
			if (this.debug==NOTICE) {
				console.log('error'+i+': '+this._errors[i]);
			}
			errors+=this._errors[i]+"\n";
		}
		this._errors=new Array();
		return errors;
	};


	// Rules List //
	this.notEmpty = function (value) {
		if (this.debug==NOTICE) {
			console.log('notempty error value:'+value,value);
		}
		if (typeof value=='undefined') {
			return false
		}
		if (value=='') {
			return false;
		}
		return true;
	};
	this.date = function (sDate) {

	   var re =/^\d{4}\-\d{2}\-\d{2}$/
	   if (re.test(sDate)) {
			return true;
		}else {
			 return false;
		}
	};
	this.time = function (value) {

	   var re =/^\d{2}\:\d{2}$/
	   if (re.test(value)) {
			return true;
		}else {
			 return false;
		}
	};
	this.clearErrors = function () {
		//eltüntetni az esetleges hibákat
		var divs = Utils.getElementArrayByClassName(document,'div','private-form-errors');
		for (var i in divs) {
			Utils.destroy(divs[i]);
		}
	};
	this.setErrorsToElements = function (errors) {
		//"errors":{"ci[student]":["K\u00f6telez\u0151 megadni!","'' nem csak sz\u00e1mokat tartalmaz!"]}
		for (var i in errors) {
			var div = document.createElement('div');
			div.className = 'private-form-errors';
			//bekéne rakni az összes hibát
			eval('var error = errors[\''+i+'\']');
			for (var j in error) {
				div.innerHTML += error[j]+'<br>';
			}
			//div.innerHTML = eval('errors[\''+i+'\'][0]');
			Utils.ge(i).parentNode.insertBefore(div,Utils.ge(i).nextSibling);
		}
	};
}
Errors = new Errors();
Errors.debug = NOERROR;


Utils.addEvent(window,'load',function () { 
	if (typeof init_SearchUser != 'undefined' && Utils.isFunction(init_SearchUser))	{
		init_SearchUser();
	}
	if (typeof init != 'undefined' && Utils.isFunction(init))	{
		init();
	}
	if (typeof init1 != 'undefined' && Utils.isFunction(init1))	{
		init1();
	}
	if (typeof init2 != 'undefined' && Utils.isFunction(init2))	{
		init2();
	}
	if (typeof initdhtml != 'undefined' && Utils.isFunction(initdhtml))	{
		initdhtml();
	}

});
Common = {};
Common.alert = function (msg) {
	alert(msg);
}
Common.error = Common.alert;
Common.log = Common.alert;
