Request.XML = new Class({
	Extends: Request,

	success: function(text, xml){
		//log("foo");
		if(Browser.Features.xpath) {
			//log("normal");
			xml.selectNodes = function(xpath){
				var nodes = [];	
				var result = this.evaluate(xpath, this, this.createNSResolver(xml.documentElement), XPathResult.ORDERED_NODE_ITERATOR_TYPE, null) ;
				if (result){
					var node = result.iterateNext() ;
					while(node){
						nodes.push(node);
						node = result.iterateNext();
					}
				} 
				return nodes;
			}	
			xml.selectSingleNode = function(xpath){
				var result = this.evaluate(xpath, this, this.createNSResolver(this.documentElement), 9, null);
				if (result && result.singleNodeValue) return result.singleNodeValue ;
				else return [] ;
			}
		// ie
		}else{
			//
			xml = this.createXML(xml.documentElement);
		}
		//
		
		xml.getElement("parent_type");
		
		//
		
		this.onSuccess(text,xml);
	},
	
	createXML : function(xml, parent) {

		if(!parent) {
			parent = new Element(xml.nodeName);
		}
	
		if(xml.childNodes.length) {
			for(var i = 0; i < xml.childNodes.length; i++) {
				if(xml.childNodes[i].nodeType == 1) { // Element type
					// NodeName
					var el = new Element(xml.childNodes[i].nodeName);
				
					// Attributes
					if(xml.childNodes[i].attributes.length) {
						for(var j = 0; j < xml.childNodes[i].attributes.length; j++) {
							var property = xml.childNodes[i].attributes[j].nodeName;
							var value    = xml.childNodes[i].attributes[j].nodeValue;
							el.setProperty(property, value);
						}
					}
	
					// Value
					if(xml.childNodes[i].firstChild){
						el.set({'text' : xml.childNodes[i].firstChild.nodeValue});
					}
	
					parent.adopt(el);
	
					var son = xml.childNodes[i];
					if(son.childNodes.length) {
						this.createXML(son, el);
					}
				}
			}
		}
		return parent;
	}


});


//var locations = new Hash();
var next_location_id = 10000;

var STATUS_SELECT_LOCATION = 1;

var PAGE_LIMIT = 30;

function request_sub(field_id, extra_id, kenn, node_id, f){
	if(kenn == -1){
		return;
	}
	
	// just a default
	if(!f){
		f = add_sub;
	}
	
	val = kenn.options[kenn.selectedIndex].value;
	
	$(field_id).value = val;
	
	request = new Request.XML({
		method: 'get',
		onSuccess: f,
		url: '/r_jax.php'
	}).send('action=sub_options&kenn='+val+'&node_id='+node_id+'&extra_id='+extra_id+'&field_id='+field_id);
}

function request_last_sub(field_id, extra_id, kenn, node_id){
	val = kenn.options[kenn.selectedIndex].value;
	$(field_id).set('value', val);
}

function request_sub_concat(field_id, extra_id, kenn, node_id){
	
	request_sub(field_id, extra_id, kenn, node_id, add_sub_concat);
	
}

function request_last_sub_concat(field_id, extra_id, kenn, node_id){
	
	serialize_locations(field_id);

}


function request_search(field_id, extra_id, kenn, node_id){

	
	
	$(field_id).value = '';
	
	if ($(kenn).get("id") == "bundeslaender") {
//		$("search-flag").fade(0);
	}
	
	$("search-result-area").fade(0);
	
//	$("searching-info").fade(1);
	$("searching-info").removeClass("invisible");
	
	val = kenn.options[kenn.selectedIndex].value;
	
	
	
	writeKennToCookie(val,node_id);

	

	request = new Request.XML({
		method: 'get',
		onSuccess: add_search,
		url: '/r_jax.php'
	}).send('action=search&kenn='+val+'&node_id='+node_id+'&extra_id='+extra_id+'&field_id='+field_id);
	
	
	
}

function request_last_search(field_id, extra_id, kenn, node_id){
	
	request_search(field_id, extra_id, kenn, node_id)
}


function add_sub_concat(txt, xml, ignore_sub){
	add_sub(txt, xml, ignore_sub);
	
	
	
	field_id = xml.getElement('fieldid');
	
	
	
	field_id = field_id.get('text');
	
	
	
	serialize_locations(field_id);
}

function add_sub(txt, xml, ignore_sub){

	regbez = $('regbez');
	kreis = $('kreis');
	ort = $('ortgem');
	ortbez = $('ortbez');
	orttl = $('orttlgem');
	
	//
	
	parent_type = xml.getElement("parent_type").get('text');
	sub_type = xml.getElement("type").get('text');
	extra_id = xml.getElement("extraid").get('text');
	par_kenn = xml.getElement("par_kenn").get('text');
	empty_text = xml.getElement("empty_text").get('text');

	if(parent_type == 'land' && $('search-flag') != null){
		flag_src = xml.getElement("flag_src");
		$('search-flag').set("src", flag_src.get('text'));
	}
	
	//
	
	hide = new Array();
	
	
	switch (parent_type){
		case 'land': 

			hide.include($('regbez'+extra_id));
			hide.include($('lab-regbez'+extra_id));
			
		case 'regbez':
			
			hide.include($('kreis'+extra_id));
			hide.include($('lab-kreis'+extra_id));
			
		case 'kreis':
			
			hide.include($('ortgem'+extra_id));
			hide.include($('lab-ortgem'+extra_id));
			
		case 'ortgem':

			hide.include($('ortbez'+extra_id));
			hide.include($('lab-ortbez'+extra_id));			
			
		case 'ortbez':

			hide.include($('orttlgem'+extra_id));
			hide.include($('lab-orttlgem'+extra_id));
			
	}
	
	////
	
	if (sub_type != 'none' && !ignore_sub) {
		
		////
		
		sub_type += extra_id;
		
		//
		//
		
		$(sub_type).getElements('option').each(function(el){el.dispose();});
		
		//
		
		o = new Element("option", {text : empty_text, value : par_kenn});
	
		o.inject($(sub_type));
		
		xml.getElements('element').each(function(el){
			//
			o = new Element("option", {text : el.get('text'), value : el.getProperty('kenn')});
			o.inject($(sub_type));

//			$(sub_type).add(new Option(el.get('text'), el.getProperty('kenn')), null);
		})
		
		//
		
		$(sub_type).removeClass('no-options');
		$('lab-' + sub_type).removeClass('no-options');
		
		//
		
		hide.erase($(sub_type));
		hide.erase($('lab-' + sub_type));
	}
	
	//
	
	hide.each(function(item){
		item.getElements("option").each(function(o){
			o.selected = false;
		});
//		item.fade(0);
		item.addClass('no-options')
	});
}

function add_search(txt, xml){
	
	xml.getElement("parent_type");
	
	tmp = xml.getElement('location_path');
	
	location_path = $(tmp).get('text');
	$('search-path').set('text',location_path);
	
	
	
	result_table = $('search-results');
	if(result_table == null){
		tab = new Element('table', {'cellpadding': '0', 'cellspacing': '0', 'class': 'plain_table'});
		tbd = new Element('tbody', {'id' : 'search-results'});
		tab.inject($('search-result-area'),'bottom');
		tbd.inject(tab, 'top');
	}
	
	$('search-results').getChildren().each(function(el){el.dispose();});
	
	results = xml.getElement('results');
	
	lis = results.getElements('tr');
	
	target = $('search-results');
	
	status_x = xml.getElement('status');
	status_x = status_x.get('text');
	
	par_kenn = xml.getElement('par_kenn');
	par_kenn = par_kenn.get('text');
	
	if(status_x == STATUS_SELECT_LOCATION){
		$('search-feedback').innerHTML = xml.getElement('error_select_location').get('text');
	}else if (lis.length == 0){
		$('search-feedback').innerHTML = xml.getElement('error_no_results').get('text');
	}else if(lis.length > PAGE_LIMIT && par_kenn.length != 43){
		$('search-feedback').innerHTML = xml.getElement('error_too_many_results').get('text');
	}else{
		lis.each(function(el){
	
			if(el.get('class_x') == 'devider'){
				
				//devider
				tr = new Element('tr');
				tr.inject(target);
				td = new Element('td');
				td.inject(tr);
				td.set('colspan','4');
				td.addClass("first");
				td.addClass("last");
				hr = new Element('hr');
				hr.addClass('devider');
				hr.inject(td);
				
			}else{
				
				// "normal" row
				tr = new Element('tr');
				tr.addClass(el.get("class_x"));
				tr.inject(target);
				td1 = new Element('td', {'class' : 'first'});
				td1.inject(tr);
				xmlA = el.getElement('a');
				a = new Element('a', {
					'href' : xmlA.get('href'),
					'alt' : xmlA.get('alt'),
					'title' : xmlA.get('title')
				});	
				a.set('text',xmlA.get('text'));
				a.inject(td1);
				
				td2 = new Element('td');
				td2.inject(tr);
				xmlImg = el.getElement('img_b');
				
				if (xmlImg) {
					img = new Element('img', {
						'src': xmlImg.get('src'),
						'alt': xmlImg.get('alt')
					})
					img.inject(td2);
				}else {
				
					xmlImg = el.getElement('img_p');
					if (xmlImg) {
						img = new Element('img', {
							'src': xmlImg.get('src'),
							'alt': xmlImg.get('alt')
						})
						img.inject(td2);
					}
				}
		
				//there is no td3
				
				td4 = new Element('td');
				td4.inject(tr);
				xmlImg = el.getElement('img');
				if (xmlImg) {
					img = new Element('img', {
						'src': xmlImg.get('src'),
						'alt': xmlImg.get('alt')
					})
					img.inject(td4);
				}
				
				
				td5 = new Element('td', {'class' : 'last'});
				td5.inject(tr);
				td5val = el.getElement('tdl').get('text');
				td5.set('text',td5val);
			}
	
		});
		$('search-feedback').innerHTML = "";
	}
	
	
	add_sub(txt, xml, lis.length == 0 && status_x != STATUS_SELECT_LOCATION);
	
	$("search-flag").fade(1);
	$("searching-info").addClass('invisible');
	$("search-result-area").fade(1);
	
}

function addlocation(container, field_id, extra_id){

	next_location_id++;
	div = new Element('div',{'id' : 'location_'+next_location_id});
	div.inject(container,'bottom');
	div.addClass('location');
	
	div.set('load', { async : false});
	div.load('/r_jax.php?action=r_geo_selector&extra_id='+extra_id+next_location_id+'&field_id='+field_id+'&nextloc_id='+next_location_id);

	serialize_locations(field_id);
	
}

function serialize_locations(field_id){

	

	first = true;
	serialized = '';
	
	locations = $$('.loc');
	
//	alert(locations);
	
	
	
	for(i=0;i<locations.length;i++){

		loc = locations[i];

		orttlgem = loc.getElement('.orttlgem');
		tmp = getSelectedLocations(orttlgem);
		if(tmp!=""){serialized+=tmp;continue;}
	
		ortbez = loc.getElement('.ortbez');
		tmp = getSelectedLocations(ortbez);
		if(tmp!=""){serialized+=tmp;continue;}
		
		ortgem = loc.getElement('.ortgem');
		tmp = getSelectedLocations(ortgem);
		if(tmp!=""){serialized+=tmp;continue;}

		kreis = loc.getElement('.kreis');
		tmp = getSelectedLocations(kreis);
		if(tmp!=""){serialized+=tmp;continue;}

		regbez = loc.getElement('.regbez');
		tmp = getSelectedLocations(regbez);
		if(tmp!=""){serialized+=tmp;continue;}

		land = loc.getElement('.land');
		tmp = getSelectedLocations(land);
		if(tmp!=""){serialized+=tmp;}

	};
		
	if(serialized.charAt(0) == ";"){
		serialized = serialized.substr(1);
	}
		
	$(field_id).set('value',serialized);
	
	
	
}

function getSelectedLocations(selector){
	tmp = '';
	if(selector.hasClass("no-options")){
		return tmp;
	}
	selector.getElements("option").each(function(option){
		if(option.selected){
			tmp+=";["+option.value+"]";
		}
	});
	return tmp;
}


