
function extraLayers( oKaMap ) {
	this.kaMap = oKaMap;
	this.kaMap.extraLayers = this;
	this.aLayers = new Array(); // the extra layers
	this.layersBlocDef = new Array();
	
	this.resultLayer = null;
	
	this.getCustomLayers();
	
	
};

extraLayers.prototype.getCustomLayers = function(){
	call("/OPO/tools/extraLayers/prepareCustomLayers.php?map="+projectMapName+"&commune="+dataOPO['NAME'].toLowerCase(), this, this.getCustomLayerCallback);
}

extraLayers.prototype.getCustomLayerCallback = function(result){	
	try{
		eval(result); // receive var newLayers and newScales
	}
	catch(e){
		alert("eval failed");
		return;
	}
	
	// remove old layers
	for(var i = 0; i < this.aLayers.length; i++){
		this.kaMap.removeMapLayer(this.aLayers[i].name);
	}
	this.aLayers.splice(0, this.aLayers.length);
	
	// add new scales
	if(newScales){
		this.modifyMapScales(newScales);
	}
	
	if($d(newLayers) && Object.keys(newLayers).length > 0){
		// create and add the layers
		for(var i in newLayers){
			var newLayer = new customLayer(newLayers[i].layerProperties);
			this.kaMap.addMapLayer(newLayer);
			newLayer.inputs = newLayers[i].inputs;
			newLayer.legendImage = newLayers[i].legendImage;
			this.aLayers.push(newLayer);
		}
		
		if(this.aLayers.length > 0 ){
			this.createExtraLayersLegend();
			if(this.kaMap.getCurrentMap().getQueryableLayers().length > 0){
				this.createSearchBloc();
			}
		}
	}
	
	// declare extraLayers ready
	this.kaMap.triggerEvent(OPO_EXTRALAYERS_READY);
}



/********************* BLOC FOR NEW LAYERS *********************/

extraLayers.prototype.createSearchBloc = function(){
	var t = this;
	
	// insert option in main Select
	var opt = document.createElement("option");
	$("searchChooser").appendChild(opt);
	opt.value = "extraLayersDiv";
	opt.innerHTML = "Couches suppl.";
	
	var extraLayersDiv = document.createElement("div");
	extraLayersDiv.id = "extraLayersDiv";
	extraLayersDiv.className = "searchBloc";
	$(extraLayersDiv).hide();
	
	// create the select with the different layers
	var sel = document.createElement("select");
	extraLayersDiv.appendChild(sel);
	sel.id = "extraLayersDiv_selectLayer";
	Event.observe($(sel), "change", function(){
						var newVal = $F($(sel));
						
						for(var i = 0; i < t.aLayers.length; i++){
							if($(t.aLayers[i].searchDiv))
								$(t.aLayers[i].searchDiv).hide();
						}
						if(newVal != -1)
							$(t.kaMap.getCurrentMap().getLayer(newVal).searchDiv).show();
	});
	
	var opt1 = document.createElement("option");
	sel.appendChild(opt1);
	opt1.value = -1;
	opt1.innerHTML = "Veuillez choisir";
	
	for(var i = 0; i < this.aLayers.length; i++){
		if(this.aLayers[i].isQueryable() && this.aLayers[i].inputs != null){
			// create an option for layer
			var opt = document.createElement("option");
			sel.appendChild(opt);
			opt.value = this.aLayers[i].name;
			opt.innerHTML = this.aLayers[i].name;
			
			// main div for search
			this.aLayers[i].searchDiv = document.createElement("div");
			extraLayersDiv.appendChild(this.aLayers[i].searchDiv);
			$(this.aLayers[i].searchDiv).hide();
			this.aLayers[i].searchDiv.id = "extraLayersDiv_" + (this.aLayers[i].name).replace(/\s/, "");
			
			//create div for geo search
			var geoSearchDiv = document.createElement("div");
			this.aLayers[i].searchDiv.appendChild(geoSearchDiv);
			geoSearchDiv.className = "geoSearchDiv";
			
			var table = this.kaMap.utils.createTable(null, 1, 2);
			geoSearchDiv.appendChild(table[0]);
			var content = table[1];
			
			var b = document.createElement("b");
			content[0][0].appendChild(b);
			var txt = document.createTextNode("Recherche géographique :");
			b.appendChild(txt);
			
			var img = document.createElement("img");
			content[0][1].appendChild(img);
			img.activated = false;
			img.style.cursor = "pointer";
			img.src = "/OPO/images/icon_query_normal";
			img.tool = new queryByPointTool(this.kaMap, this.aLayers[i], {name : this.aLayers[i].name + "_queryByPoint", image : img, imagesSource : ["/OPO/images/icon_query_normal", "/OPO/images/icon_query_clicked"]});
			img.toolInfos = {name : this.aLayers[i].name + "_queryByPoint", image : img, imagesSource : ["/OPO/images/icon_query_normal", "/OPO/images/icon_query_clicked"]};
			Event.observe($(img), "click", this.kaMap.interact.toggleTool.bind(this.kaMap.interact, img.toolInfos));
			
			
			// create all the inputs bloc for layer
			var paramSearchDiv = this.getHTMLInputsForLayer(this.aLayers[i]);
			this.aLayers[i].searchDiv.appendChild(paramSearchDiv);
			paramSearchDiv.className = "paramSearchDiv";
			
			// title
			var b = document.createElement("b");
			paramSearchDiv.insertBefore(b, paramSearchDiv.childNodes[0]);
			var txt = document.createTextNode("Recherche par critères");
			b.appendChild(txt);
			
			/*
			// horizontal rule to separate search fields with layer chooser
			var rule = document.createElement("hr");
			this.aLayers[i].divInputs.insertBefore(rule, this.aLayers[i].divInputs.childNodes[0]);
			rule.style.width = "75%";
			rule.style.marginTop = "10px";
			*/
			
			extraLayersDiv.appendChild(this.aLayers[i].searchDiv);
		}
	}
	// insert the bloc before the poi search bloc
	this.kaMap.utils.insertAfter($("tabLeft"), extraLayersDiv, $("poiSearchDiv"));
}


// create the domObj according to layer inputs configuration
extraLayers.prototype.getHTMLInputsForLayer = function(oLayer){
	var t = this;
	var divInputs = document.createElement("div");
	//divInputs.className = "layerInputsBloc";
	oLayer.DOMinputs = new Array();
	for(var i = 0; i < oLayer.inputs.length; i++){
		var elem = null;
		switch(oLayer.inputs[i].type.toUpperCase()){
			case "TEXTFIELD" : 	elem = createTextField(oLayer, oLayer.inputs[i]);		
								break;
			case "SELECT" :		elem = createSelect(oLayer, oLayer.inputs[i]);
								break;
			case "RADIO" : 		elem = createRadio(oLayer, oLayer.inputs[i]);
								break;
			case "CHECKBOX" : 	elem = createCheckBox(oLayer, oLayer.inputs[i]);
								break;
			case "TEXTNODE" : 	elem = createTextNode(oLayer, oLayer.inputs[i]);
								break;
			default : 			alert("type of input unknown (found : " + oLayer.inputs[i].type + ")");
		}
		if(elem != null){
			//elem.style.margin = "7px 0px 2px 8px";
			divInputs.appendChild(elem);
		}
	}
	
	var but = this.kaMap.utils.createButton();
	divInputs.appendChild(but);
	but.value = "Recherche";
	but.className = "OPObut";
	but.style.margin = "7px 0px 0px 0px";
	//but.id = "extraLayers_search";
	but.oLayer = oLayer;
	but.onclick = function(e){t.searchMyExtraLayer(e)}
	
	return divInputs;

	
	function createTextField(oLayer, inputs){
		var container = document.createElement("div");
		container.appendChild(document.createTextNode(inputs.label));
		container.className = "critere";
		
		var input = document.createElement("input");
		container.appendChild(input);
		input.type = "text";
		input.name = inputs.name;
		input.queryOperator = inputs.queryOperator;
		
		oLayer.DOMinputs.push({type : "textfield", obj : input});
		
		return container;
	}
	
	function createSelect(oLayer, inputs){
		var container = document.createElement("div");
		container.appendChild(document.createTextNode(inputs.label));
		container.className = "critere";
		
		var sel = document.createElement("select");
		container.appendChild(sel);
		sel.name = inputs.name;
		sel.style.margin = "auto";
		sel.queryOperator = inputs.queryOperator;
		
		for(var i = 0; i < inputs.options.length; i++){
			var opt = document.createElement("option");
			sel.appendChild(opt);
			opt.value = inputs.options[i].value;
			opt.innerHTML = inputs.options[i].label;
		}
		
		oLayer.DOMinputs.push({type : "select", obj : sel});
		
		return container;
	}
	
	function createRadio(oLayer, inputs){
		var container = document.createElement("div");
		container.className = "critere";
		
		var labelObj = document.createElement("label");
		container.appendChild(labelObj);
		
		try{
			var rad = document.createElement("<input type='radio'>");
		}
		catch(e){
			var rad = document.createElement("input");
			rad.type = "radio";
		}
		labelObj.appendChild(rad);
		rad.name = inputs.name;
		rad.queryOperator = inputs.queryOperator;
		rad.queryValue = inputs.queryValue;
		
		var labTitle = document.createTextNode(inputs.label);
		labelObj.appendChild(labTitle);
		
		oLayer.DOMinputs.push({type : "radio", obj : rad});
		return container;
	}
	
	function createCheckBox(oLayer, inputs){
		var container = document.createElement("div");
		container.className = "critere";
		
		var labelObj = document.createElement("label");
		container.appendChild(labelObj);
		
		try{
			var check = document.createElement("<input type='checkbox'>");
		}
		catch(e){
			var check = document.createElement("input");
			check.type = "checkbox";
		}
		labelObj.appendChild(check);
		check.name = inputs.name;
		check.checked = check.defaultChecked = inputs.defaultChecked;
		check.queryOperator = inputs.queryOperator;
		check.queryValue = inputs.queryValue;
		
		var labTitle = document.createTextNode(inputs.label);
		labelObj.appendChild(labTitle);
		
		oLayer.DOMinputs.push({type : "checkbox", obj : check});
		
		return container;
	}
	
	function createTextNode(oLayer, inputs){
		var container = document.createElement("div");
		container.className = "critere";
		
		var text = document.createTextNode(inputs.label);
		container.appendChild(text);
		
		return container;
	}
}

extraLayers.prototype.searchMyExtraLayer = function(e){
    var layerName = $F("extraLayersDiv_selectLayer");
    if(layerName.toString() == "-1")
    	return;
    var oLayer = this.kaMap.getCurrentMap().getLayer(layerName);
    var params = "";
    if($d(oLayer.DOMinputs)){
	    for(var i = 0; i < oLayer.DOMinputs.length; i++){
	    	var curObj = oLayer.DOMinputs[i].obj;
	    		
	    	switch(oLayer.DOMinputs[i].type){
	    		case "textfield" : 	if(!(/^\s*$/g).test(curObj.value))
		    							params += ((params=="")?"":"|||") + curObj.name + "#" + curObj.queryOperator + "#" + curObj.value;
	    							break;
	    							
	    		case "select" : 	var selected = curObj.options[curObj.selectedIndex].value;
	    							if(selected != -1)
		    							params += ((params=="")?"":"|||") + curObj.name + "#" + curObj.queryOperator + "#" + selected;	
	    							break;
	    							
	    		case "radio" : 		if(curObj.checked)
	    								params += ((params=="")?"":"|||") + curObj.name + "#" + curObj.queryOperator + "#" + curObj.queryValue;
	    							break;
	    							
	    		case "checkbox" : 	if(curObj.checked)
	    								params += ((params=="")?"":"|||") + curObj.name + "#" + curObj.queryOperator + "#" + curObj.queryValue;
	    							break;
	    		default : alert("not recognized : " + oLayer.DOMinputs[i].type);
	    	}
    	}
	}
	if(params != ""){
		var url = "/OPO/proxy.php?page=/OPO/searchByString2.php&commune="+dataOPO['NAME'].toLowerCase()+"&layer="+oLayer.name+"&params=" + escape(params);
		if(this.resultLayer != null && $d(this.resultLayer.sessionId))
			url += "&sessionid=" + this.resultLayer.sessionId;
		this.kaMap.interact.lastSearchDiv = $("extraLayersDiv_" + (oLayer.name).replace(/\s/, ""));
		this.kaMap.interact.bDisplayLabels = true;
		$("searchDiv_sablier").show();
		call(url, this, this.queryCallback);
	}
}


extraLayers.prototype.queryCallback = function(query){
	$("searchDiv_sablier").hide();
	try{
		eval(query); // newLayer, data and sessionId
	}
	catch(e){
		console.log("eval failed");
		console.log(query);
	}
	
	// remove old layers
	if($d(this.resultLayer) && this.resultLayer != null){
		this.kaMap.removeMapLayer(this.resultLayer.name);
	}
	
	if($d(newLayer) && newLayer != null){
		this.resultLayer = new resultLayer(newLayer.layerProperties);
		this.resultLayer.sessionId = sessionId;
		this.kaMap.addMapLayer(this.resultLayer);
		this.kaMap.setLayerOpacity(this.resultLayer.name, 50);
	}
	
	if($d(data) && data != null && data.length > 0){
		data.bDisplayLabels = true;
		this.kaMap.interact.displayData(data);
	}
	else
		this.kaMap.interact.displayNoResults();
	
	if($d(data) && data != null && data.length == 1){
		data.bDisplayLabels = true;
		new POIdetails(this.kaMap, data);
	}
}







/****************** LEGEND ***********************/

extraLayers.prototype.createExtraLayersLegend = function(){
	var t = this;
	
	// create the legend with its structure	
	this.domObj = document.createElement("div");
	this.kaMap.domObj.appendChild(this.domObj);
	this.domObj.style.position = "absolute";
	this.domObj.style.top = "40px";
	this.domObj.style.left = "-1000px"; // just put it away until we get its correct width
	this.domObj.style.zIndex = "6";
	
	this.toggler = document.createElement("img");
	this.domObj.appendChild(this.toggler);
	this.toggler.src = "/OPO/images/toolBar_toggler_left_open.png";
	this.toggler.style.cssFloat = "right";
	this.toggler.style.styleFloat = "right";
	this.toggler.style.cursor = "pointer";
	this.toggler.onclick = function(){if(t.visible)t.closeLegend(); else t.openLegend()}
	this.kaMap.utils.setOpacity(this.toggler, 90);
	
	this.container = document.createElement("div");
	this.domObj.appendChild(this.container);
	this.container.id = "extraLayersContainer";

	// now create a layer element for each new layer
	this.mainTable = document.createElement("table");
	this.mainTable.className = "mainTable";
	this.container.appendChild(this.mainTable);
	
	var tbody = document.createElement("tbody");
	this.mainTable.appendChild(tbody);
	
	for(var i = 0; i < this.aLayers.length; i++){
		var tr = document.createElement("tr");
		tbody.appendChild(tr);
		
		var td = document.createElement("td");
		tr.appendChild(td);
		
		td.appendChild(this.createLayerLegend(this.aLayers[i]));
	}
	
	// init drag and drop
	for(var i = 0; i < this.aLayers.length; i++){
		this.aLayers[i].mixer.initDrag();
	}
	
	// set styles and position after toggler is loaded
	if(this.toggler.complete == true)
		this.setStylesAndPositions();
	else
		this.toggler.onload = function(){t.setStylesAndPositions()};
}

extraLayers.prototype.setStylesAndPositions = function(){
	if(typeof this.styleAndPositionIsSet != "undefined" && this.styleAndPositionIsSet)
		return;
	
	this.toggler.width = this.kaMap.getObjectWidth(this.toggler);
	this.toggler.height = this.kaMap.getObjectHeight(this.toggler);
	this.mainTable.width = this.kaMap.getObjectWidth(this.mainTable);
	
	var domObjWidth = parseInt(this.mainTable.width) + parseInt(this.toggler.width);
	
	this.container.style.marginRight = this.toggler.width + "px";
	this.container.style.width = this.mainTable.width + "px";
	this.domObj.style.width = domObjWidth + 1 + "px";
	this.domObj.style.left = -this.mainTable.width + "px";
	
	if(this.kaMap.getObjectHeight(this.container) < this.toggler.height)
		this.container.style.height = this.toggler.height + "px";
	else
		this.container.style.height = "auto";
	
	this.styleAndPositionIsSet = true;
}


extraLayers.prototype.createLayerLegend = function(oLayer){
	var t = this;
	var table = document.createElement("table");
	this.container.appendChild(table);
	table.className = "layerTable";
	
	var tbody = document.createElement("tbody");
	table.appendChild(tbody);
	
	var tr = document.createElement("tr");
	tbody.appendChild(tr);
	
	var td = document.createElement("td");
	tr.appendChild(td);
	
	try{
		var checkBox = document.createElement("<input type='checkbox'>");
	}
	catch(e){
		var checkBox = document.createElement("input");
		checkBox.type = "checkbox";
	}
	td.appendChild(checkBox);
	checkBox.checked = true;
	checkBox.defaultChecked = true;
	checkBox.oLayer = oLayer;
	checkBox.onclick = function(e){t.toggleLayerVisibility(e)};
	
	var td = document.createElement("td");
	tr.appendChild(td);
	
	var text = document.createTextNode(oLayer.name);
	td.appendChild(text);
	td.className = "label";
	
	var td = document.createElement("td");
	tr.appendChild(td);
	oLayer.mixer = new smallMixer(this.kaMap, oLayer);
	
	td.appendChild(oLayer.mixer.draw());
	
	if(oLayer.legendImage != null){
		var td = document.createElement("td");
		tr.appendChild(td);
		td.className = "infoLegend";
		var img = document.createElement("img");
		td.appendChild(img);
		img.src = "/OPO/images/icon_infoLegende.png";
		img.alt = img.title = "voir la légende";
		img.style.cursor = "pointer";
		img.popUpImgSrc = oLayer.legendImage;
		img.onclick = function(e){t.createPopUpLegend(e)};
	}
	
	return table;
}

extraLayers.prototype.createPopUpLegend = function(e){
	e = (e)?e:((event)?event:null);
	var src = this.kaMap.utils.getEventSrc(e);
	var x = e.pageX || (e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));
	var y = e.pageY || (e.clientY + (document.documentElement.scrollTop || document.body.scrollTop));
	var pop = new flyingPopUp(this.kaMap, "Legende", x+30, y);
	pop.domObj.style.width = "300px";
	pop.setContent("<img src='"+src.popUpImgSrc + "' width=300>");
	
}

extraLayers.prototype.openLegend = function(){
	var t = this;
	new Effect.Morph(this.domObj, {style : "left : 0px", afterFinish : function(){t.visible = true; t.toggler.src = "/OPO/images/toolBar_toggler_left_close.png"}});
}

extraLayers.prototype.closeLegend = function(){
	var t = this;
	var dist = this.kaMap.getObjectWidth(this.container);
	new Effect.Morph(this.domObj, {style : "left : "+ (-dist) +"px", afterFinish : function(){t.visible = false; t.toggler.src = "/OPO/images/toolBar_toggler_left_open.png"}});
}

extraLayers.prototype.toggleLayerVisibility = function(e){
	e = (e)?e:((event)?event:null);
	var src = Event.element(e);
	var oLayer = src.oLayer;
	this.kaMap.setLayerVisibility(oLayer.name, src.checked);	
}

extraLayers.prototype.modifyMapScales = function(newScales){
	var oMap = this.kaMap.getCurrentMap();
	oMap.aScales = oMap.aScales.concat(newScales);
	oMap.aScales.sort(function(x,y){return parseFloat(y)-parseFloat(x)});
	for(var i = 0; i < oMap.aScales.length; i++){
		oMap.aScales[i] = oMap.aScales[i].toString();
	}
	this.kaMap.progZoomer.update();
}


/***********************************************************************************/
/***********************************************************************************/
/***********************************************************************************/


function queryByPointTool(oKaMap, oLayer, oInfosTool){
	kaTool.apply(this, [oKaMap]);
	this.layer = oLayer;
	this.name = oLayer.name + "_queryByPoint";
	this.bInfoTool = false;
	this.cursor = ["help"];
	
	for (var p in kaTool.prototype) {
        if (!queryByPointTool.prototype[p])
            queryByPointTool.prototype[p] = kaTool.prototype[p];
    }
    
    this.kaMap.interact.aTools.push(oInfosTool);
    
    //this is the HTML element that is visible
    this.domObj = document.createElement( 'div' );
    this.domObj.style.position = 'absolute';
    this.domObj.style.top = '0px';
    this.domObj.style.left = '0px';
    this.domObj.style.width = '1px';
    this.domObj.style.height = '1px';
    this.domObj.style.zIndex = 100;
    this.domObj.style.visibility = 'hidden';
    this.domObj.style.border = '1px solid blue';
    this.domObj.style.backgroundColor = 'white';
    this.domObj.style.opacity = 0.50;
    this.domObj.style.mozOpacity = 0.50;
    this.domObj.style.filter = 'Alpha(opacity=50)';
    this.kaMap.theInsideLayer.appendChild( this.domObj );

    this.startx = null;
    this.starty = null;
    this.endx = null;
    this.endy = null;
    this.bMouseDown = false;
}

queryByPointTool.prototype.onmousedown = function(e) {
    e = (e)?e:((event)?event:null);
    if (e.button==2) {
    	Event.stop(e);
        return false;
    }
    else {
        if (this.kaMap.isIE4)
        	document.onkeydown = kaTool_redirect_onkeypress;
        document.onkeypress = kaTool_redirect_onkeypress;
        
        this.bMouseDown = true;
        
        var x = e.pageX || (e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));
        var y = e.pageY || (e.clientY + (document.documentElement.scrollTop || document.body.scrollTop));
        var aPixPos = this.adjustPixPosition( x,y );
        
        this.startx = this.endx = -aPixPos[0];
        this.starty = this.endy = -aPixPos[1];
        
        this.drawQueryBox();
        
       	Event.stop(e);
        return false;
    }
}

queryByPointTool.prototype.onmousemove = function(e) {
    e = (e)?e:((event)?event:null);
    
    if (!this.bMouseDown)
        return false;
    
    var x = e.pageX || (e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));
    var y = e.pageY || (e.clientY + (document.documentElement.scrollTop || document.body.scrollTop));
	
    var aPixPos = this.adjustPixPosition( x, y );
    
    this.endx = -aPixPos[0];
    this.endy = -aPixPos[1];
    
    this.drawQueryBox();
    return false;
}

queryByPointTool.prototype.onmouseup = function(e){
    var start = this.kaMap.pixToGeo( -this.startx, -this.starty );
    
    var coords = [];
	
    coords = start.concat(this.kaMap.pixToGeo( -this.endx, -this.endy ));
    if(coords[2] < coords[0]) {
        //minx gt maxx than I invert values
        var minx = coords[2];
        var maxx = coords[0];
        coords[0] = minx;
        coords[2] = maxx;
    }
    if(coords[1] < coords[3]){
        //miny gt maggiore than I invert values
        var miny = coords[1];
        var maxy = coords[3];
        coords[3] = miny;
        coords[1] = maxy;
    }
    
    this.startx = this.endx = this.starty = this.endy = null;
    this.drawQueryBox();
	
	var params = 	"page=/OPO/searchByPosition2.php";
	params += 		"&commune="+dataOPO['NAME'].toLowerCase();
	params += 		"&qtype=byPoint";							// byPoint or byRect
	params += 		"&group=" + this.layer.name;
	params +=		"&a=" + Math.round(coords[0]*100)/100 + "," + Math.round(coords[1]*100)/100;
	params +=		"&b=" + Math.round(coords[2]*100)/100 + "," + Math.round(coords[1]*100)/100;
	params +=		"&c=" + Math.round(coords[2]*100)/100 + "," + Math.round(coords[3]*100)/100;
	params +=		"&d=" + Math.round(coords[0]*100)/100 + "," + Math.round(coords[3]*100)/100;
	if(this.kaMap.extraLayers.resultLayer != null && $d(this.kaMap.extraLayers.resultLayer.sessionId))
		params += "&sessionid=" + this.kaMap.extraLayers.resultLayer.sessionId;
	
	var url = "OPO/proxy.php?" + encodeURI(params);
	
	call(url, this, this.queryCallback);
}

queryByPointTool.prototype.onmouseout = function(e) {
    e = (e)?e:((event)?event:null);
    if (!e.target) e.target = e.srcElement;
    if (e.target.id == this.kaMap.domObj.id) {
        this.bMouseDown = false;
        this.startx = this.endx = this.starty = this.endy = null;
        this.drawQueryBox();
        return kaTool.prototype.onmouseout.apply(this, [e]);
    }
}

queryByPointTool.prototype.drawQueryBox = function() {
    if (this.startx == null || this.starty == null ||
        this.endx == null || this.endy == null ) {
        this.domObj.style.visibility = 'hidden';
        this.domObj.style.top = '0px';
        this.domObj.style.left = '0px';
        this.domObj.style.width = '1px';
        this.domObj.style.height = '1px';
        return;
    }
    
    this.domObj.style.visibility = 'visible';
    if (this.endx < this.startx) {
        this.domObj.style.left = (this.endx - this.kaMap.xOrigin) + 'px';
        this.domObj.style.width = (this.startx - this.endx) + "px";
    } else {
        this.domObj.style.left = (this.startx - this.kaMap.xOrigin) + 'px';
        this.domObj.style.width = (this.endx - this.startx) + "px";
    }

    if (this.endy < this.starty) {
        this.domObj.style.top = (this.endy - this.kaMap.yOrigin) + 'px';
        this.domObj.style.height = (this.starty - this.endy) + "px";
    } else {
        this.domObj.style.top = (this.starty - this.kaMap.yOrigin) + 'px';
        this.domObj.style.height = (this.endy - this.starty) + "px";
    }
};

queryByPointTool.prototype.queryCallback = function(query){
	try{
		eval(query); // newLayer, data and sessionId
	}
	catch(e){
		console.log("eval failed");
		console.log(query);
		return;
	}
	
	// remove old layers
	if(this.kaMap.extraLayers.resultLayer != null){
		this.kaMap.removeMapLayer(this.kaMap.extraLayers.resultLayer.name);
	}
	
	if(newLayer != null){
		this.kaMap.extraLayers.resultLayer = new resultLayer(newLayer.layerProperties);
		this.kaMap.extraLayers.resultLayer.sessionId = sessionId;
		this.kaMap.addMapLayer(this.kaMap.extraLayers.resultLayer);
		this.kaMap.setLayerOpacity(this.kaMap.extraLayers.resultLayer.name, 50);
	}
	
	if($d(data) && data != null && data.length > 0){
		data.bDisplayLabels = true;
		new POIdetails(this.kaMap, data);
	}
	else{
		new POIdetails(this.kaMap, {TO_SHOW_DETAIL : {"" : "Pas de donnée"}});
	}
}