function gps(){
	var ajax;
	var loaded = new Function();
	var requested = new Function();
	var beforeLoad = new Function();
	
	this.getChilds = function(selectElement, path, eventPath, postVars, tBody, templateID, fRef){
		if(selectElement.nodeType == 1){
			var selectedID = new Number(selectElement.id.substr(5));
		}
		else if(typeof(selectElement) == typeof(0)){
			var selectedID = 0;
		}
		
		if(!eventPath){
			eventPath = path;
		}
		
		var rows;
		var i;
		for(i=0;i<tBody.childNodes.length;i++){
			var elem = tBody.childNodes[i];
			if(elem.nodeName.toLowerCase() == "tr"){
				var fieldID = new Number(elem.id.substr(10));
				if(elem.id.substr(0,10) == "cont_type_" && selectedID-fieldID==0){
					break;
				}
			}
		}
		var elems = new Array();
		for(i=i+1;i<tBody.childNodes.length;i++){
			if(tBody.childNodes[i].nodeName.toLowerCase() == "tr"){
				elems[elems.length] = tBody.childNodes[i];
			}
		}
		for(i=0;i<elems.length;i++){
			tBody.removeChild(elems[i]);
		}
		
		if(typeof(selectElement) == typeof(0)){
			var id = selectElement;
		}
		else if(getSelectValue(selectElement)){
			var id = getSelectValue(selectElement);	
		}
		else{
			return false;
		}
		
		var query = "id="+id+"&";
		if(postVars){
			if(typeof(postVars) == typeof("")){
				query = postVars;
			}
			else{
				for(name in postVars){
					query += name + '=' + escape(postVars[name]) + '&';
				}
				query = query.substring(0, query.length-1);
			}
		}
		
		var ajax = new xAjax(path);
		ajax.startCheck();
		ajax.addFunction(requested, selectElement, tBody, templateID);
		ajax.addRequest(query, gpsChildsResponse, fRef, eventPath, postVars, tBody, templateID);
		ajax.addFunction(this.onLoad, selectElement, tBody, templateID);
		ajax.addFunction(loaded, selectElement, tBody, templateID);
		ajax.addFunction(function(){ajax.stopCheck()});
		//return true;
	}
	
	this.getAll = function(userID, path, eventPath, postVars, tBody, templateID){
		ajax = new xAjax(path);
		ajax.startCheck();
		
		if(!eventPath){
			eventPath = path;
		}
		
		var query = "id="+userID+"&";
		if(postVars){
			if(typeof(postVars) == typeof("")){
				query = postVars;
			}
			else{
				for(name in postVars){
					query += name + '=' + escape(postVars[name]) + '&';
				}
				query = query.substring(0, query.length-1);
			}
		}
		
		ajax.addFunction(requested, userID, tBody, templateID);
		ajax.addRequest(query, gpsResponse, this.getChilds, eventPath, postVars, tBody, templateID);
		ajax.addFunction(this.onLoad, userID, tBody, templateID);
		ajax.addFunction(loaded, userID, tBody, templateID);
		ajax.addFunction(function(){ajax.stopCheck()});
	}
	
	var gpsResponse = function(responseXML, getChilds, path, postVars, tBody, templateID){
		var childs = new Array();
		for(var i=0;i<tBody.childNodes.length;i++){
			if(tBody.childNodes[i].id != templateID){
				childs[childs.length] = tBody.childNodes[i];
			}
		}
		for(i=0;i<childs.length;i++){
			tBody.removeChild(childs[i]);
		}
		gpsChildsResponse(responseXML, getChilds, path, postVars, tBody, templateID);
	}
	
	var gpsChildsResponse = function(responseXML, getChilds, path, postVars, tBody, templateID){
		beforeLoad();
		
		for(var i=0;i<tBody.childNodes.length;i++){
			if(tBody.childNodes[i].id == templateID){
				var tmpl = tBody.childNodes[i];
				break;
			}
		}
		if(!tmpl){
			return false;
		}
		stripChilds(tmpl, ['td']);
		hideElement(tmpl);
		var xml = responseXML.documentElement.childNodes;
		for(var i=0;i<xml.length;i++){
			var row = tmpl.cloneNode(false);
			showElement(row);
			row.setAttribute("id", "cont_"+xml[i].attributes.getNamedItem("id").value);
			var leftTD = tmpl.firstChild.cloneNode(false);
			showElement(leftTD);
			insertNodeText(leftTD, xml[i].attributes.getNamedItem("name").value);
			row.appendChild(leftTD);
			var rightTD = tmpl.lastChild.cloneNode(false);		
			showElement(rightTD);
			
			if(!xml[i].hasChildNodes()){
				var field = $E('INPUT');
				field.setAttribute("id", xml[i].attributes.getNamedItem("id").value);
				field.setAttribute("name", xml[i].attributes.getNamedItem("id").value);
				field.setAttribute("type", "text");
				field.setAttribute("value", xml[i].attributes.getNamedItem("value").value);
				field.className = xml[i].attributes.getNamedItem("class").value;
			}
			else{
				var field = $E('SELECT');
				field.setAttribute("id", xml[i].attributes.getNamedItem("id").value);
				field.setAttribute("name", xml[i].attributes.getNamedItem("id").value);
				field.className = xml[i].attributes.getNamedItem("class").value;
				
				var attach = function(DOMEvent){
					if(is_ie){
						var srcElement = window.event.srcElement;
					}
					else{
						var srcElement = DOMEvent.target;
					}
					getChilds(srcElement, path, null, postVars, tBody, templateID, getChilds);
				}
				if(field.attachEvent){
					field.attachEvent("onchange", attach);
				}
				else{
					field.onchange = attach;
				}
				var nodes = xml[i].childNodes;
				for(var j=0; j<nodes.length; j++){
					var optionElement = $E('OPTION');
					insertNodeText(optionElement, nodes[j].firstChild.data);
					optionElement.setAttribute("value", nodes[j].attributes.getNamedItem("value").value);
					if(nodes[j].attributes.getNamedItem("value").value == xml[i].attributes.getNamedItem("value").value){
						optionElement.setAttribute("selected", "selected");
					}
					field.appendChild(optionElement);
				}
			}
			
			rightTD.appendChild(field);
			row.appendChild(rightTD);
			tBody.appendChild(row);
		}
	}
	
	this.onLoad = function(){}
	this.onRequest = function(){}
	
	this.setLoadEvent = function(fRef){
		loaded = fRef;
	}
	
	this.setRequestEvent = function(fRef){
		requested = fRef;
	}
	
	this.setBeforeLoadEvent = function(fRef){
		beforeLoad = fRef;
	}
}