function checkPositiveInt(val){
	//var result = val.match(/^-?\d+$/);
	var result = val.match(/^\d+$/);
	return (result != null && result != 0);
}

function createRequestObject() {
    var ro;
    var browser = navigator.appName;
    if(browser == "Microsoft Internet Explorer"){
        ro = new ActiveXObject("Microsoft.XMLHTTP");
    }else{
        ro = new XMLHttpRequest();
        //if (ro.overrideMimeType) {
          //ro.overrideMimeType('text/xml');
          //ro.overrideMimeType('text/plain');
        //}
    }
    return ro;
}

function handleResponse(myhttp) {
	if(myhttp.readyState == 4){
		var response = myhttp.responseText;
		var update = new Array();

		if(response.indexOf("?xml") == 1 ) { // not use the less-than bracket to avoid PHP problem

			// parse the XML
			var xmlresponse  = myhttp.responseXML.documentElement;

			if ( xmlresponse.getElementsByTagName('searchresult') ) {				
				var param = xmlresponse.getElementsByTagName('param');

				var request=param[0].getAttribute("request");
				var imgid=param[0].getAttribute("imgid");
				var dispimg=param[0].getAttribute("dispimg");
				var zoom=param[0].getAttribute("zoom");
				var resultname=param[0].getAttribute("resultname");
				var resultname_en=param[0].getAttribute("resultname_en");
        var bookmark=parseInt(param[0].getAttribute("bookmark"));
        var hasmore=param[0].getAttribute("hasmore");

				var pois = xmlresponse.getElementsByTagName('searchobject');
				var n_pois=0;
				if (pois)
					n_pois = pois.length;

				if (request == "getpois") {
				//alert(n_pois);
					poi_saved[zoom][imgid] = new Array();
					poi_num[zoom][imgid] = n_pois;

					for (var i = 0 ; i < n_pois; i++) {
						var item = pois[i];
						var id=item.getAttribute("id");
						var name=item.getAttribute("name");
						var lat=item.getAttribute("lat");
						var mylong=item.getAttribute("long");
						var type=item.getAttribute("type");
						var status=item.getAttribute("status");
						var showlevel=item.getAttribute("showlevel");
						var name_en=item.getAttribute("name_en");
						var contributor=item.getAttribute("contributor");
						var imagefile=item.getAttribute("imagefile");
						var iconlabel=item.getAttribute("iconlabel");
						var iconlabel_en=item.getAttribute("iconlabel_en");
						//alert(id+","+name+","+lat+","+mylong+","+zoom+", "+dispimg+", "+ showlevel + ", " +i);

						// save to poi array
						poi_saved[zoom][imgid][i] = new Array();

						var usename = name;

						if (mylang == "en") {
							usename = name_en;

							if (name_en == "") {
								usename = "(Thai) " + name;
							}
						}

            var useiconlabel = iconlabel;
						if (mylang == "en") {
							useiconlabel = iconlabel_en;
            }

						poi_saved[zoom][imgid][i][0] = id;
						poi_saved[zoom][imgid][i][1] = usename;
						poi_saved[zoom][imgid][i][2] = lat;
						poi_saved[zoom][imgid][i][3] = mylong;
						poi_saved[zoom][imgid][i][4] = status;
						poi_saved[zoom][imgid][i][5] = contributor;
						poi_saved[zoom][imgid][i][6] = imagefile;
						poi_saved[zoom][imgid][i][7] = useiconlabel;

						//drawPOI(id,name,lat,mylong,status,zoom,dispimg,i);
						//window.status = name;
					}

					drawPOIFromArray(zoom,imgid,dispimg);

					// hide the unused image
					//alert(n_pois+", "+max_pois_per_image);
					var oldnum = poi_images_num[dispimg];
					if (n_pois < oldnum ) {
						for (var i = n_pois ; i < oldnum ; i++) {
							//poi_images[dispimg][i].style.visibility = "hidden";

							mymap.removeChild(poi_images[dispimg][i]);

							// remove and recreate seems to be faster!
							//poi_images_label[dispimg][i].style.visibility = "hidden";
							//poi_images_label[dispimg][i].style.width = "0px";
							//poi_images_label[dispimg][i].innerHTML = "";

							mymap.removeChild(poi_images_label[dispimg][i]);
						}
					}
					poi_images_num[dispimg] = n_pois;
				} else if ( request == "searchresultsxml") {

					//alert(n_pois);
					search_results_poi = new Array();
					//alert(search_results_poi.length);

					var searchresultshtml = "<table>";
					var flipflop = 0;

                    if (n_pois > 0) {
                        // google mode
                        if (currentmode == "gmap") {
                          gmap.clearMarkers();
                        }

                        for (var i = 0 ; i < n_pois; i++) {
                            var item = pois[i];
                            var id=item.getAttribute("id");
                            var name=item.getAttribute("name");
                            var lat=item.getAttribute("lat");
                            var mylong=item.getAttribute("long");
                            var type=item.getAttribute("objecttype");
                            var showlevel=item.getAttribute("showlevel");
                            var name_en=item.getAttribute("name_en");
                            var countlabel = bookmark + 1 + i;    
                            //alert(id+","+name+","+lat+","+mylong+","+ showlevel + ", " +i);

                            // save to poi array
                            search_results_poi[i] = new Array();

 														var usename = name;
														if (mylang == "en") {
															if (name_en != "") 
																usename = name_en;
															else 
																usename = "(Thai) " + name;
														}

 	                          search_results_poi[i][0] = id;
                            search_results_poi[i][1] = usename;
                            search_results_poi[i][2] = lat;
                            search_results_poi[i][3] = mylong;
                            search_results_poi[i][4] = type;
                            search_results_poi[i][5] = showlevel;

                            // google mode
                            if (currentmode == "gmap") {
                              gmap.addMarker(lat,mylong,usename);
                            }

                            if ( flipflop == 0 ) {
                            		if ( type == "road" ) {
                                	searchresultshtml += "<tr bgcolor=#ffd9d9>";

																} else if ( type == "khet" ) {
                                	searchresultshtml += "<tr bgcolor=#dbffdb>";

																} else if ( type == "tag" ) {
                                	searchresultshtml += "<tr bgcolor=#ffddb5>";

																} else if ( type == "geom" ) {
                                	searchresultshtml += "<tr bgcolor=#ffffff>";

																} else if ( type == "map" ) {
                                	searchresultshtml += "<tr bgcolor=#ffffff>";

																} else {
                                	searchresultshtml += "<tr bgcolor=#feffd1>";
																}
                                flipflop=1;
                            } else {
                            		if ( type == "road" ) {
                                	searchresultshtml += "<tr bgcolor=#ffbcbc>";

																} else if ( type == "khet" ) {
                                	searchresultshtml += "<tr bgcolor=#c0ffc0>";

																} else if ( type == "tag" ) {
                                	searchresultshtml += "<tr bgcolor=#ffefdc>";

																} else if ( type == "geom" ) {
                                	searchresultshtml += "<tr bgcolor=#ffffff>";

																} else if ( type == "map" ) {
                                	searchresultshtml += "<tr bgcolor=#ffffff>";


																} else {
                                	searchresultshtml += "<tr bgcolor=white>";
																}
                                flipflop=0;
                            }

                            //var countlabel = i+1;
                            searchresultshtml += "<td valign=top>" + countlabel + ". </td>";

														searchresultshtml += '<td width=500 valign=top> ';

														var zoom = Math.log(resolution)/Math.log(2);

														if (type == "poi") {
															searchresultshtml += '<span id="search_result_' + i + '" title="Click to hi-light this location" style="cursor:pointer;text-decoration: underline" onclick="markPOI('
																+ id + ",'" + usename + "'," + lat +',' + mylong + ", " + zoom + " , '');if (currentmode == 'gmap') { gmap.showMarkerPopup(" + i + ");}\">" + usename + "</span>";

															searchresultshtml += '<span id="search_result_zoom_' + i + '" title="Click to hight and ZOOM to this location" style="cursor:pointer;text-decoration: underline" onclick="mmmap.setZoom(' + showlevel + ');markPOI('
																+ id + ",'" + usename + "'," + lat +',' + mylong + "," + showlevel + ", '');if (currentmode == 'gmap') { gmap.showMarkerPopup(" + i + ");}\"> (+)</span>";

														} else if (type == "road") {
															searchresultshtml += '<span id="search_result_' + i + '" style="cursor:pointer;text-decoration: underline" onclick="showRoad(\'' + name + '\')">' + usename + "</span>";

														} else if (type == "khet") {
                              //searchresultshtml += '<span style="cursor:pointer;text-decoration: underline" onclick="showKhet(\'' + name + '\')">' + usename + "</span>";

                              if (lat && mylong) {
                                searchresultshtml += '<span id="search_result_' + i + '" title="Click to hi-light this location" style="cursor:pointer;text-decoration: underline" onclick="markPOI('
                                  + "-1" + ",'" + usename + "'," + lat +',' + mylong + ", " + zoom + " , '');if (currentmode == 'gmap') { gmap.showMarkerPopup(" + i + ");}\">" + usename + "</span>";

                                searchresultshtml += '<span id="search_result_zoom_' + i + '" title="Click to hi-light and ZOOM to this location" style="cursor:pointer;text-decoration: underline" onclick="markPOI('
                                  + "-1" + ",'" + usename + "'," + lat +',' + mylong + "," + showlevel + ", '');if (currentmode == 'gmap') { gmap.showMarkerPopup(" + i + ");}\"> (+)</span>";
                              } else {
                                // probably only KWANG here
                                searchresultshtml += '<span id="search_result_' + i + '" style="cursor:pointer;text-decoration: underline" onclick="showKhet(\'' + name + '\')">' + usename + "</span>";
                              }

														} else if (type == "tag") {
                              var tagname = name.replace(/^tag: /, "");
															searchresultshtml += '<span id="search_result_' + i + '" style="cursor:pointer;text-decoration: underline" onclick="showTag(\'' + tagname + '\')">' + name + "</span>";

														} else if (type == "geom") {
                              var name_padded = id;
                              while (name_padded.length < 8) name_padded = "0" + name_padded;
															searchresultshtml += '<span id="search_result_' + i + '" style="cursor:pointer;text-decoration: underline" onclick="mmmap.showObject(\'G' + name_padded + '\', \'LONGDO\')">' + name + "</span>";

														} else if (type == "map") {
                              var name_padded = id;
                              while (name_padded.length < 8) name_padded = "0" + name_padded;
															searchresultshtml += '<span id="search_result_' + i + '" style="cursor:pointer;text-decoration: underline" onclick="mmmap.showObject(\'M' + name_padded + '\', \'LONGDO\')">' + name + "</span>";

														}

														searchresultshtml += "</td></tr>";
                        }
                        
                        // pager
													searchresultshtml += "<tr><td colspan=2></td></tr>";																		
			                    searchresultshtml += "<tr>";
			                    searchresultshtml += "<td align=left>";
		
			                    //calculate bookmarks
													/*
			                    var prevBook;
			                    if ((n_pois-1) < 20) {
				                  	prevBook = countlabel - (20 + (n_pois-1));
			                    } else {
				                    prevBook = countlabel - 40;
			                    }
													*/

			                    var prevBook = bookmark - 20;
			                    if (prevBook < 0) {
				                    prevBook = 0;
			                  	} else {
			                      //searchresultshtml += '<input type="button" value="<" name="prev" onclick="setBookmark(' + prevBook + '); doSearch(\'\'); ">';
			                      searchresultshtml += '<span onclick="setBookmark(' + prevBook + '); doPreviousSearch(\'\'); "  title="Click to see previous search results" style="cursor:pointer;text-decoration: none; font-weight: bold; color: blue"><<&nbsp;prev</span>';
			                  	}
			                    searchresultshtml += "</td>";					                                       		                    
													searchresultshtml += "<td align=right>";																	
													//if (n_pois > 20) {
													if (hasmore == "true") {
														var nextbookmark = bookmark + n_pois;
				                  	//searchresultshtml += '<input type="button" value=">" name="next" onclick="setBookmark('+ countlabel + '); doSearch(\'\'); ">';			                 		
				                  	searchresultshtml += '<span onclick="setBookmark('+ nextbookmark + '); doPreviousSearch(\'\'); " title="Click to see more search results" style="cursor:pointer;text-decoration: none; font-weight: bold; color: blue">next&nbsp;>></span> ';
			                  	}
				                  searchresultshtml += "</td>";			                   
				                  
			                    searchresultshtml += "</tr>";
                    } else {
                      // no result
                        searchresultshtml += "<tr><td><b>Sorry, no result found.</b></td></tr>";
                    }

                    searchresultshtml += "</table>";
                    showDiv("searchresult", searchresultshtml);
                    if (showingmark != -1 && showingmark) 
                        setAllSearchResultsPOIVisible(true);

                    if (n_pois == 1) {
                      document.getElementById('search_result_0').onclick();
                    }

								} else if ( request == "showpoi") {
									if (n_pois > 0) {
										var item = pois[0];
										var id=item.getAttribute("id");
										var name=item.getAttribute("name");
										var lat=item.getAttribute("lat");
										var mylong=item.getAttribute("long");
										var type=item.getAttribute("type");
										var status=item.getAttribute("status");
										var showlevel=item.getAttribute("showlevel");
										var name_en=item.getAttribute("name_en");
										var dozoom=item.getAttribute("dozoom");

										var usename = name;
										if (mylang == "en") {
											if (name_en != "") 
												usename = name_en;
											else 
												usename = "(Thai) " + name;
										}

                    markPOIandZoom(id,usename,lat,mylong,showlevel,"",dozoom);
                    /*
										markPOI(id,usename,lat,mylong,showlevel,"");
                    if (dozoom == "1") {
                      mmmap.setZoom(showlevel);
                    }
                    */
									}
								} else if ( request == "showroad" || request == "showtraffic" ) {
									if (n_pois > 0) {
										current_roads = new Array();

										var road_count = 0;
										var old_road_id = -1;

										var current_roads_points= new Array();

										var firstlat = -1;
										var firstlong = -1;

										for (var i = 0 ; i < n_pois; i++) {

											var item = pois[i];
											var road_id=item.getAttribute("id");
											var lat=item.getAttribute("lat");
											var mylong=item.getAttribute("long");
											var type=item.getAttribute("roadtype");
											var point_order=item.getAttribute("point_order");
											var ring=item.getAttribute("ring");
											var status=item.getAttribute("status");

											//alert(lat+","+mylong+","+ point_order + ", " +i);
                      lat = parseInt(lat) / 12345;
                      mylong = parseInt(mylong) / 12345;

											if (i == 0) {
												firstlat = lat;
												firstlong = mylong;
											}

											if (i != 0 && road_id != old_road_id) {
												current_roads[road_count] = current_roads_points;
												road_count++;
												current_roads_points= new Array();
											}

											current_roads_points[point_order] = new Object();

											current_roads_points[point_order].road_id = road_id;
											current_roads_points[point_order].lat = lat;
											current_roads_points[point_order].mylong = mylong;
											current_roads_points[point_order].roadtype = type;
											current_roads_points[point_order].ring = ring;
											current_roads_points[point_order].status = status;

											// last loop
											if (i == n_pois -1 ) {
												current_roads[road_count] = current_roads_points;
											}

											old_road_id = road_id;

										}
										showCurrentRoads(true);
										// also show popup in case of road
										if (request == "showroad") {

											var usename = resultname;
											var usedescription = "ตามเส้นสีน้ำเงิน";

											if (mylang == "en") {
												usename = resultname_en;
												usedescription = "See the blue line";
											}

											var zoom = Math.log(resolution)/Math.log(2);
											markPOI(-1,usename,firstlat,firstlong,zoom,usedescription);
										}
									}
                }
            }
        } else if(response.indexOf('|') != -1) {
            update = response.split('|');
            var elementname = removeNL(update[0]);
            showDiv(elementname, removeNL(update[1]));
            // SUPER HACK
            /*if (elementname == "locationdetails_contents") {
              //adj_locationdetails_contents();
            }*/
        }
        myhttp = null; // garbage collection
    }
}

function removeNL(s) {
    /*
     ** Remove NewLine, CarriageReturn and Tab characters from a String
     **   s  string to be processed
     ** returns new string
     */
    r = "";
    for (i=0; i < s.length; i++) {
		if (s.charAt(i) != '\n' &&
        s.charAt(i) != '\r' &&
        s.charAt(i) != '\t') {
      r += s.charAt(i);
    }
  }
  return r;
}

function showDiv(divname, contents) {
	//alert("updating "+ divname+" with:\n"+contents);
	if (window.document.getElementById(divname) != null) {
		window.document.getElementById(divname).innerHTML = contents;
	}
}

