// addAddressToMap() is called when the geocoder returns an
// answer.  It adds a marker to the map with an open info window
// showing the nicely formatted version of the address and the country code.
// http://maps.google.com/maps/geo?q=58200&output=json&sensor=true&key=abcdefg&gl=my
function addAddressToMap(response) { 
	//map.clearOverlays();
	if (!response || response.Status.code != 200) {
		//alert("Sorry, we were unable to geocode that address");
	} 
	else {
		place = response.Placemark[0];
		point = new GLatLng(place.Point.coordinates[1],place.Point.coordinates[0]);
		_oMap.setCenter(point);
		tempHiddenMarker = new GMarker(point,{icon: icodef});
		_oMap.addOverlay(tempHiddenMarker);
		tempHiddenMarker.openInfoWindowHtml(
			'<div class="infowindow">' +
			'<b>Address:</b> ' + place.address + '<br>' +
			'<b>Latitude:</b> ' + place.Point.coordinates[1] + "<br>" + 
			'<b>Longitude:</b> ' + place.Point.coordinates[0] + '<br>' +
			'</div>'
		);
	}
}

// Create Categories Tab
// return html script
function catTab(){ 
	var i = 1;
	var html = "";
	var regex = new RegExp("\\*");

	oTypeList.each(function(pair){ 
		if(pair.key == "categories"){  
			// Loop thru each main category
			pair.value.each(function(obj,index) {
				// obj.id;
				// obj.name;
				// obj.ops_select;
				// obj.menu_display;
				// obj.sub;
				if(obj.menu_display == 1){ 
					html += '<div id="CollapsiblePanel'+obj.id+'" class="CollapsiblePanel">';
					if(!!obj.icon){
						html += '<div id="CollapsiblePanelTab'+obj.id+'" class="CollapsiblePanelTab"><img src="'+obj.name.image+'" align="absmiddle" />'+obj.category+'</div>';
					}else{ 
						html += '<div id="CollapsiblePanelTab'+obj.id+'" class="CollapsiblePanelTab">'+obj.name+'</div>';
					}
					html += '<div class="CollapsiblePanelContent" id="CollapsiblePanelContent'+obj.id+'">';
				
					// read thru sub
					obj.sub.each(function(obj2,index2){
						//obj2.catid;
						//obj2.name;
						//obj2.icon;
						//obj2.opt_select;
						//obj2.menu_display;
						if(obj2.menu_display == 1){ 
							html += '<input type="checkbox" id="tp_'+obj2.catid+'" value="'+obj2.catid+'" onclick="_oSearchTypes.toggleCheckedType(this)"/>'+obj2.name+'<br />';
						}
					});
					html += '</div>';
					html += '</div>';	 
					i++;
				}
			});
		};
	});

	return html;
}

function catTabCollapse(){
	var i = 1;
	oTypeList.each(function(pair) { 
		if(pair.key == "categories"){ 
			// Loop thru each main category
			pair.value.each(function(obj,index) {
				// obj.id;
				// obj.name;
				// obj.ops_select;
				// obj.menu_display;
				// obj.sub;
				if(obj.menu_display == 1){
					eval(new Spry.Widget.CollapsiblePanel("CollapsiblePanel"+obj.id, {contentIsOpen:false}));
					i++;
				}
			});
		};
	});
}

function resizeMap(){
	_mapWidth=document.body.clientWidth-255;
	$('mdmap').style.width=_mapWidth+'px';
	$('mdmap').style.height=document.body.clientHeight-144+'px';
	//$('mdleft').style.height=document.body.clientHeight-145+'px';
	
	if(_oMap){
		_oMap.checkResize();
	};
};

// Use for oTypeList obj
// providing key and return value
// @param key
// @return value
function getValueFromKey(k){ 
	//var objA = {};
	var v = {};
	
	oTypeList.each(function(pair) { 
		if(pair.key == "categories"){
			// obj.id;
			// obj.name;
			// obj.ops_select;
			// obj.menu_display;
			// obj.sub;
			// Loop thru each main category
			pair.value.each(function(obj,index) {
				//obj2.catid;
				//obj2.name;
				//obj2.icon;
				//obj2.opt_select;
				//obj2.menu_display;
				// read thru sub
				obj.sub.each(function(obj2,index2){			
					if(obj2.catid.capitalize() == k.capitalize()){
						v.catid = obj2.catid;
						v.icon = obj2.icon;
						v.name = obj2.name;
						throw $break;
					}
				});
			});
		};
	});
	
	return v;
};

// Use for oTypeList obj
// get all types from oTypeList and return new obj
// @param none
// @return obj
function getTypeList(){
	var objA = [];
	var regex = new RegExp("\\*");
	
	oTypeList.each(function(pair) { 
		if(pair.key == "categories"){ 
			// obj.id;
			// obj.name;
			// obj.ops_select;
			// obj.menu_display;
			// obj.sub;
			// Loop thru each main category
			pair.value.each(function(obj,index){ 
				//obj2.catid;
				//obj2.name;
				//obj2.icon;
				//obj2.opt_select;
				//obj2.menu_display;
				//if(obj.opt_select == 1){
					obj.sub.each(function(obj2,index2){ 
						//if(!obj2.name.match(regex)){
						if(obj.menu_display == 1){
							objA.push(obj2.catid);
						}
					});
				//}
			});
		};
	});
	
					
	return objA;
};

function defaultText(f,e){
	var form = $(f.name);
	var ev = $F(e);
	if(ev == ""){ 
		e.value = _aMsg[e.name]; 
		$(e).className = "inputdisable";
	}
}

function enableFormElement(e){
	//inputenable inputdisable
	if($F(e) == _aMsg[e.name]){
		$(e).clear();
		$(e).className = "inputenable";
	}
}

function sampleSearch(txt,col,subm){ 
	if(col==1){
		//$('searchform')['str'].removeClassName('inputdisable');
		enableFormElement($('searchform').str);
		$('searchform').str.focus();
		$('searchform').str.value = txt;
	};
	
	if(subm == true){
		submitSearchLocation2($('searchform'));
	};
};

// @param : String => selected options value
// @return : Options html
function selectOpt(cid){ 
	var opts = '';
	var catid = (!!cid) ? cid : 0;
	oTypeList.each(function(pair) { 
		if(pair.key == "categories"){ 
			// obj.id;
			// obj.name;
			// obj.ops_select;
			// obj.menu_display;
			// obj.sub;
			// Loop thru each main category
			pair.value.each(function(obj,index) { 
				//if(obj.opt_select == 1){
					opts += '<optgroup label="'+obj.name+'" style="background: #EBEBEB;font-style: normal;">';
					// obj2.catid;
					// obj2.name;
					// obj2.icon;
					// obj2.opt_select;
					// obj2.menu_display;
					// read thru sub
					
					obj.sub.each(function(obj2,index2){
						if(obj2.opt_select == 1){
							if(obj2.catid == catid){opts += '<option value="'+obj2.catid+'" selected="selected">'+obj2.name+'</option>'}
							else{opts += '<option value="'+obj2.catid+'" style="background: #FFFFFF;">'+obj2.name+'</option>'};
						}
					});
					opts += '</optgroup>';	
				//}
			});
		};
	});

	return opts;
}

function gup(name,uri){
	var regexp1 = new RegExp("[\\[]");
	var regexp2 = new RegExp("[\\]]");
	
	name = name.replace(regexp1,"\\\[").replace(regexp2,"\\\]");
	var regexS = "[\\?&]"+name+"=([^&#]*)";
	var regex = new RegExp( regexS );
	var results = regex.exec(uri);
	if( results == null )
		return "";
	else
		return results[1];
}; 

// @Param : String
// @return : String:mapid/false;
function matchMapId(e){ 
	var regexp1 = new RegExp("^\\s*","g");
	var regexp2 = new RegExp("\\s*$","g");	
	var regexp3 = new RegExp("^[A-Za-z]{3}[0-9]{6}$","g");
	var a;
	a = e.replace(regexp1,"");
	a = a.replace(regexp2,"");
	//re = /^[A-Za-z]{3}[0-9]{6}$/i; 
	found = a.match(regexp3); 
	return found;
};


function checkNumber(n){ 
	var regexp1 = new RegExp("^\\d*$","i");
	var num = n;
	//re = /^\d*$/i; 
	if(num.match(regexp1)){
		return num;
	}else{
		alert("Please enter a valid number.");
		return null;	
	};
}


function loadingTypeBox(t){ 
	var loading = '<div id="cb_'+t+'"><img src="/img/loading.gif" align="top" hspace="3" border="0px"></div>';
	new Insertion.Top('typebox', loading);
}
	
function updateMarkerSerializeForm(obj){ 
	if(!!$('marker')){ 			
		var form = $('marker');
		var eles = form.getElements();

		if ( $( 'Textarea' ).style.display == 'none' ){
			var oEditor = FCKeditorAPI.GetInstance( 'DataFCKeditor' ) ;
			form["desc"].value = parse_html(oEditor.GetXHTML());
		}
		
		for(var i=0;i<eles.length;i++){
			if(eles[i].name){ 
				obj.data[eles[i].name] = HtmlEncode(eles[i].value);
			}
		}
	}
};	

// Sidebar :: Create all marker item into sidebar
// return HTML
function sideItemHtml(obj) {
	var html = "";
		html += "<div id='"+obj.element+"' class='mdleft_inner_item'>";	
		html += "<table width='210px' border='0' cellspacing='0' cellpadding='0'><tr>";  
		html += "<td width='20' align='left' valign='top'><img src='"+eval(obj.data.icon).image+"' onclick='mClick("+obj.element+",\"click\")' ondblclick='mClick("+obj.element+",\"dblclick\")' width='18' height='20' border='0' /></td>";
		html += "<td align='left' valign='top'>";
		
		//if(obj.data.name) 	html += "<span onclick='mClick("+obj.element+",\"click\")' ondblclick='mClick("+obj.element+",\"dblclick\")' class='linkspan'>"+obj.data.name+"</span>";
		if(obj.data.name) 	html += "<span onclick='mClick("+obj.element+",\"dblclick\")' class='linkspan'>"+obj.data.name+"</span>";
		if(obj.data.address1 || obj.data.address2 || obj.data.address3){
									html += '<br />';
			if(obj.data.address1) 	html += obj.data.address1.truncate(50)+" ";
			if(obj.data.address2) 	html += obj.data.address2.truncate(50)+" ";
			if(obj.data.address3) 	html += obj.data.address3.truncate(50)+" ";
			if(obj.data.country) 	html += obj.data.country.truncate(50);
		}else{
			if(obj.data.address || obj.data.country){
									 html += '<br />';
				if(obj.data.address) html += obj.data.address+" ";
				if(obj.data.country) html += obj.data.country+" ";
			}
			if(obj.data.desc) html += '<br />'+obj.data.desc.unescapeHTML().stripScripts().stripTags().truncate(80,'...');
		}
		
		html += "</td>";
		html += "</tr></table>";
		html += "</div>";
	
	return html;
}   

function mClick(obj,c) { 
    GEvent.trigger(obj.marker,c);
}

function HtmlDecode(s) { 
	var str = ""+s;
	var regexp1 = new RegExp("&gt;","g");
	var regexp2 = new RegExp("&quot;","g");
	var regexp3 = new RegExp("&lt;","g");
	var regexp4 = new RegExp("&amp;","g");
	
	if (!str) return '';
	str = str.replace(regexp1,'>');
	str = str.replace(regexp2,'"');
	str = str.replace(regexp3,'<');
	str = str.replace(regexp4,'&');
	
	return str;

}

function HtmlEncode(s) {
	var str = ""+s;
	var regexp1 = new RegExp("[<>&\\\"]","g");
	var str2 = str.replace(regexp1, 
		function (c, b) {  
			switch (c) {
				case '&':
					return '&amp;';
					break;
				case '"':
					return '&quot;';
					break;
				case '<':
					return '&lt;';
					break;
				case '>':
					return '&gt;';
					break;
			}
	});
	return str2;
}
// @@5
// updateMarkerData(objectList, data)	
function updateMarkerData(obj,newobj){ 
	var d = newobj;
	for (var prop in newobj){ 
		obj.data[prop] = newobj[prop].strip();
	}
};
		
function updateMarkerSerializeForm(obj){ 
	if(!!$('marker')){ 			
		var form = $('marker');
		var eles = form.getElements();

		if ( $( 'Textarea' ).style.display == 'none' ){
			var oEditor = FCKeditorAPI.GetInstance( 'DataFCKeditor' ) ;
			form["desc"].value = parse_html(oEditor.GetXHTML());
		}
		
		for(var i=0;i<eles.length;i++){
			if(eles[i].name){ 
				obj.data[eles[i].name] = HtmlEncode(eles[i].value);
			}
		}
	}
};	

// Trigger to edit mode (1)
function editMarker2(obj) {
	var o = eval(obj); //
	o.data.edit = true;

	_oMap.removeOverlay(o.marker); 
	createMarker(o,"user");
	o.marker.setImage(icotemp.image);
	
	GEvent.trigger(o.marker,"click");
}



// Remove All markers obj and data from temporary array list
function removeAllMarkers(list){ 
 	for(var i=0;i<list.length;i++) { 
		_oMap.removeOverlay(list[i].marker);
	}
	list = [];
}

// Remove single object marker from marker
function removeMarker(obj,noconfirm){ 
	if(noconfirm == true){
		_oMap.removeOverlay(obj.marker);
		obj = {};
 	}else{
 		var del = confirm ("Are you sure you want to delete this placemark?");
	 	if(del){ 
		 	_oMap.removeOverlay(obj.marker);
		 	obj = {};
	 	}
 	}
};

// to show panel and reset panel
// @param : panel,show/hide
// @return none
function resetPanel(p){
	switch (p) {
		// reset result panel while searching
		case 'mdrs_inner':
			_oLefttab.hide(_oLefttab.menu[0]);
			_oLefttab.hide(_oLefttab.menu[1]);
			_oLefttab.show(_oLefttab.menu[2]);
			_oLefttab.hide(_oLefttab.menu[3]);
			
			$('mdrs_inner_default').hide();
			$("mdrs_inner_container").show();
			$("mdrs_inner_total").hide();
			$("mdrs_inner").show();
		 	$("mdrs_inner").update();
		 	$("mdrs_inner_rt").show();
		 	$("mdrs_inner_rt").update();
			break;
		case 'mdrs_inner_user':
			_oLefttab.hide(_oLefttab.menu[0]);
			_oLefttab.show(_oLefttab.menu[1]);
			_oLefttab.hide(_oLefttab.menu[2]);
			_oLefttab.hide(_oLefttab.menu[3]);

			$('mdrs_inner_user_default').hide();
			$("mdrs_inner_user_container").show();
			$("mdrs_inner_user_total").hide();
			$("mdrs_inner_user").show();
		 	$("mdrs_inner_user").update();
		 	$("mdrs_inner_user_rt").show();
		 	$("mdrs_inner_user_rt").update();		 	
			break;
		case 'mdrs_inner_tab4':
			_oLefttab.hide(_oLefttab.menu[0]);
			_oLefttab.hide(_oLefttab.menu[1]);
			_oLefttab.hide(_oLefttab.menu[2]);
			_oLefttab.show(_oLefttab.menu[3]);

			$("mdrs_inner_tab4_container").show();
			$("mdrs_inner_tab4_total").hide();
			$("mdrs_inner_tab4").show();
		 	$("mdrs_inner_tab4").update();
		 	$("mdrs_inner_tab4_rt").show();
		 	$("mdrs_inner_tab4_rt").update();		 	
			break;
		default:
			return;
	}	
}

// Loading layer into panel
// @param : String => panel
// @return : none
function addPanelLoadingImg(p){
	var panel = p;		
	var div = loader();
	$(panel).update(div);
};

function addInfoWinLoadingImg(){ 
	var div = loader();
	$('infowindow').appendChild(div);
};

function loader(){
	var div = new Element('div', { 'id':'loadingdiv' ,'class': 'loadingdiv' });
	var img = new Element('img', { 'id':'loadingimg' ,'src': '/img/loading.gif' });
	div.update(img);
	return div;
};

// @@6

// @param : error array, options
// @return error msg;
function genErrorMsg(err,opts){
	var msg = _aErrormsg[err]; 
	if(!!opts){
		if(!!opts.str) msg = msg.gsub(/{schstr}/, opts.str );
		if(!!opts.loc) msg = msg.gsub(/{schloc}/, opts.loc );
	}
	return msg;
}

function searchSuggestion(){ 
	//f=t&q=39&neast=9.990491,119.750977&swest=-1.01069,97.229004
	resetPanel("mdrs_inner_tab4");						

	var url = "suggest.php";
	var pars = 'start=&panel=mdrs_inner_tab4';

	new Ajax.Request(
		url, {
			method:"get", 
			parameters: pars,
			onComplete: respondLocSearch,
			onLoading: addPanelLoadingImg("mdrs_inner_tab4"),
			onFailure: function(){ alert('Error... please try again.')}
		}
	);	
	
}

////////////////////////////////////////////////////////////
// ### SEARCH LOCATION ###
////////////////////////////////////////////////////////////

function submitSearchLocation2(){ 
	//var param = location.search.toQueryParams().ref; 
	var form = $('searchform');
	var str = $F(form['str']);
	var submit = $F(form['_submitsearchform']);
	var zoom = _oMap.getZoom();
	var neast = _oMap.getBounds().getNorthEast().toUrlValue();
	var swest = _oMap.getBounds().getSouthWest().toUrlValue();

	form['zoom'].value = zoom;
	form['neast'].value = neast;
	form['swest'].value = swest; 
	form['maptype'].value = _oMap.getCurrentMapType().getName();
	
	if(!!$F(form['str']) && $F(form['str']) != _aMsg['str']){ 
		return true;
	}else{  
		resetPanel("mdrs_inner");
		removeAllMarkers(_aMarkerSch);
		$("mdrs_inner_container").hide();
		$('mdrs_inner_default').show();
		return false;	
	}
	return false;	
}

// Use for submit or edit marker
// Callback AJAX to reload the JSON file	
function submitSearchLocation2A(uri){ 
	resetPanel("mdrs_inner");						
	var smid = matchMapId(uri.toQueryParams().str);	

	if(!smid){ 
		var url = "search.php";
		var pars = 'f=n'+uri; 

		new Ajax.Request(
			url, {
				method:"get", 
				parameters: pars,
				onComplete: respondLocSearch,
				onLoading: addPanelLoadingImg("mdrs_inner"),
				onFailure: function(){ alert('Error... please try again.')}
			}
		);
	}else{ 
		var url = "search.php";
		var pars = 'f=i&q='+smid+'&panel=mdrs_inner';

		new Ajax.Request(
			url, {
				method:"get", 
				parameters: pars,
				onComplete: respondLocSearch,
				onLoading: addPanelLoadingImg("mdrs_inner"),
				onFailure: function(){ alert('Error... please try again.')}
			}
		);	
	}
};

// Use for searching MapId from URL location parameter
// Callback AJAX to reload the JSON file
function midSearch(){
	resetPanel("mdrs_inner");
	var panel = "mdrs_inner";
	var url = "search.php";
	var uripars = location.href.toQueryParams();
	var pars2 = $H(uripars).toQueryString();
	var regexp1 = new RegExp("id=(\\w{3}\\d{6})");
	pars2 = pars2.sub(regexp1,'q=#{1}');

	var pars = 'f=i&'+pars2+'&panel='+panel; 

	new Ajax.Request(
		url, {
			method:"get", 
			parameters: pars,
			onComplete: respondLocSearch,
			onLoading: addPanelLoadingImg(panel),
			onFailure: function(){ alert('Error... please try again.')}
		}
	);
};

// ### respondLocSearch ###
// use for location and MapId search
// AJAX respond
function respondLocSearch(originalRequest){ 
	$('loadingdiv').remove();  
	removeAllMarkers(_aMarkerSch);  
	_bounds = new GLatLngBounds(); 
	var json = originalRequest.responseText.evalJSON();  

	// Search Data		
	var sd = json.searchdata; 
	var open = sd.open || false;
	var string = sd.string || "";
	var location = sd.location || ""; 
	var southwest = sd.southwest || "";
	var northeast = sd.northeast || ""; 
	var start = Number(sd.start) || 0;
	var limit = Number(sd.limit) || 10;
	var total = Number(sd.total) || 0;
	var z = Number(sd.z) || 0;
	var panel = sd.panel || "";	
	var element = sd.element || "";
	var error = sd.error || "";

	if(!error && (!!json.placemarks || !!json.gGeo)){
		// Placemarks gGeo
		if(!!json.gGeo){ 
			var gStatus = json.gGeo.Status.code; 
			var gAccuracy = json.gGeo.Placemark[0].AddressDetails.Accuracy;

			if(gStatus == 200){	
				_aMarkerSch[10] = new MdMarker("_aMarkerSch[10]");
				_aMarkerSch[10].data.mapid = '';
				_aMarkerSch[10].data.name = json.gGeo.Placemark[0].address;
				_aMarkerSch[10].data.country = "";
				_aMarkerSch[10].data.icon = 'icogeo';
				_aMarkerSch[10].data.lat = json.gGeo.Placemark[0].Point.coordinates[1];
				_aMarkerSch[10].data.lng = json.gGeo.Placemark[0].Point.coordinates[0];
				createMarkerSch(_aMarkerSch[10]); 
				_bounds.extend(_aMarkerSch[10].getGPoint());
				
				var sideHtml2 = sideItemHtml(_aMarkerSch[10]);
				var gGeoHtml = "<FIELDSET style='background-color:#CCEEDD;border:0px solid #3399CC;margin:0px;padding:0px;'><LEGEND style='font-size:10px;color:#3399CC;'>Full Address Result</LEGEND>"+sideHtml2+"</FIELDSET>";
				new Insertion.Bottom(panel, gGeoHtml);	
			}
		}

		// Placemarks Data
		var markers = json.placemarks;
		if(!!markers){
			markers.each(function(value,key){ 
				_aMarkerSch[key] = new MdMarker("_aMarkerSch["+key+"]");
				updateMarkerData(_aMarkerSch[key],value); 
				createMarkerSch(_aMarkerSch[key]);
				_bounds.extend(_aMarkerSch[key].getGPoint()); 
				
				var sideHtml = sideItemHtml(_aMarkerSch[key]);
				new Insertion.Bottom(panel, sideHtml);			
			});
		}
		
		if(z){ 
			_oMap.setZoom(z);
		}else{ 
			var zlevel = (_oMap.getBoundsZoomLevel(_bounds)>_zoom) ? _zoom : _oMap.getBoundsZoomLevel(_bounds);
			_oMap.setZoom(zlevel);
		};
		
		if(open){ setTimeout("mClick("+_aMarkerSch[0].element+",\"click\")",500); }

		_oMap.setCenter(_bounds.getCenter());
		
		var end = start+limit;
		var begin = (total>0) ? start+1 : 0;
		if(end>total) end=total;
		if(total>0){ 
			$(panel+"_total").show(); $(panel+"_total").update("Results " + begin + " - " + end +" of about " + total +".");
		}		
		new ResultThread(panel,panel+'_rt',start,total,string,location,northeast,southwest);
	}else{	
		$(panel).update(genErrorMsg(error,{'str':string,'loc':location}));
	}
}		
////////////////////////////////////////////////////////////
// ### SEARCH LOCATION ###
// ### END ###
////////////////////////////////////////////////////////////

// Search from result thread
// @param : String => url, uri
// AJAX request
function threadSearch(url,uri,p){ 
	var panel = p;
 	var uri = uri.strip();  
	if(uri){
		resetPanel(panel); 
	 	var url = url;
		var pars = uri;		
		if(_sGrp) pars += "&grp="+_sGrp;
		if(url == "mdpm2.php"){
			url = "mdpm2.php";
			new Ajax.Request(
				url, {
					method:"post", 
					parameters: pars,
					onComplete: respondLoadMarkerU,
				    onLoading : addPanelLoadingImg(panel),
					onFailure: function(){ alert('Error... please try again.')}
				}
			);
		}else{
			
			new Ajax.Request(
				url, {
					method:"get", 
					parameters: pars,
					onComplete: respondLocSearch,
					onLoading: addPanelLoadingImg(panel),
					onFailure: function(){ alert('Error... please try again.')}
				}
			);	
		}
	
	}else{
	 	return;
	}
};

////////////////////////////////////////////////////////////
// ### USER ADS FUNCTION ###
////////////////////////////////////////////////////////////
	
// Use for searching MapId from URL location parameter
// Callback AJAX to reload the JSON file
function midSearchAd(midurl,clickurl,clickpars){ 
	var url = "search.php";
	var uripars = midurl;
	var pars2 = $H(uripars).toQueryString();
	var mid = midurl.substr((midurl.length-9),9);

	var pars = 'f=i&q='+mid; 	
	new Ajax.Request(
		url, {
			method:"get", 
			parameters: pars,
			onComplete: respondAdSearchByMid,
			onFailure: function(){ alert('Error... please try again.')}
		}
	);
	
	new Ajax.Request(
		clickurl, {
			method:"get", 
			parameters: clickpars,
			onFailure: function(){alert('Error... please try again.')}
		}
	);

};

// ### respondLocSearch ###
// use for location and MapId search
// AJAX respond
function respondAdSearchByMid(originalRequest){ 
	var json = originalRequest.responseText.evalJSON();  

	// Search Data		
	var sd = json.searchdata; 
	var open = sd.open || false;
	var string = sd.string || "";
	var location = sd.location || ""; 
	var southwest = sd.southwest || "";
	var northeast = sd.northeast || ""; 
	var start = Number(sd.start) || 0;
	var limit = Number(sd.limit) || 10;
	var total = Number(sd.total) || 0;
	var z = Number(sd.z) || 0;
	var panel = sd.panel || "";	
	var element = sd.element || "";
	var error = sd.error || "";

	if(!error && (!!json.placemarks || !!json.gGeo)){
		removeAllMarkers(_aMarkerAd);  
		_bounds = new GLatLngBounds(); 
		// Placemarks Data
		var markers = json.placemarks;
		if(!!markers){
			markers.each(function(value,key){ 
				_aMarkerAd[key] = new MdMarker("_aMarkerAd["+key+"]");
				updateMarkerData(_aMarkerAd[key],value); 
				createMarkerSch(_aMarkerAd[key]);
				_bounds.extend(_aMarkerAd[key].getGPoint()); 			
			});
		}

		if(z){ 
			_oMap.setZoom(z);
		}else{ 
			var zlevel = (_oMap.getBoundsZoomLevel(_bounds)>_zoom) ? _zoom : _oMap.getBoundsZoomLevel(_bounds);
			_oMap.setZoom(zlevel);
		};
		
		if(open){ setTimeout("mClick("+_aMarkerAd[0].element+",\"click\")",500); }

		_oMap.setCenter(_bounds.getCenter());
	}else{	
		alert("No matched MapdooID.");
	}
}		

function loadMarkerLocal(){ 
	var str = '<iframe src ="/media/tabads/index.php" height="500px" width="225px" frameborder="0" scrolling="no"></iframe>'; 
	document.getElementById("mdrs_inner_local").innerHTML = str;
}

function loadMarkersByMid(mids){ 
	var url = "/mdlocal.php"; 
	var pars ='mids='+mids;

 	new Ajax.Request(
		url, {
			method:"post", 
			parameters: pars,
			onComplete: respondLoadMarkersByMid,
			onFailure: function(){alert('Error... please try again.')}
		}
	);
}

//Parse returned AJAX 
function respondLoadMarkersByMid(originalRequest){ 
	removeAllMarkers(_aMarkerLoc);
	_bounds = new GLatLngBounds();	
	var json = originalRequest.responseText.evalJSON();	
	
	// Search Data		
	var sd = json.searchdata;
	var string = sd.string || "";
	var location = sd.location || "";
	var southwest = sd.southwest || "";
	var northeast = sd.northeast || ""; 
	var start = Number(sd.start) || 0;
	var limit = Number(sd.limit) || 10;
	var total = Number(sd.total) || 0;
	var panel = sd.panel || "";	
	var error = sd.error || "";
	
	if(!error){ 
		// Placemarks Data
		var markers = json.placemarks;

		markers.each(function(value,key){
			_aMarkerLoc[value.mapid] = new MdMarker("_aMarkerLoc[\""+value.mapid+"\"]");
			updateMarkerData(_aMarkerLoc[value.mapid],value); 
			createMarkerSch(_aMarkerLoc[value.mapid]);
			
			_bounds.extend(_aMarkerLoc[value.mapid].getGPoint());
		});
		
		var zlevel = (_oMap.getBoundsZoomLevel(_bounds)>14) ? 14 : _oMap.getBoundsZoomLevel(_bounds);
		_oMap.setZoom(zlevel);
		_oMap.setCenter(_bounds.getCenter());
	}else{
		$(panel).update(genErrorMsg(error,{'str':string,'loc':location}));
	}
}	

function tabadsClick(midurl,clickurl,clickpars){ 
	var mid = midurl;
	mClick(_aMarkerLoc[mid],"dblclick");
	new Ajax.Request(
		clickurl, {
			method:"get", 
			parameters: clickpars,
			onFailure: function(){alert('Error... please try again.')}
		}
	);
}

////////////////////////////////////////////////////////////
// ### USER PLACEMARK FUNCTION ###
////////////////////////////////////////////////////////////

// @@7

// Add new marker and store in temp marker list 			
function addMarker() { 
 	var id = _aMarkerN.length;
 	_aMarkerN[id] = new MdMarker("_aMarkerN["+id+"]");
	_aMarkerN[id].data.lat = _oMap.getBounds().getSouthWest().lat()+((_oMap.getCenter().lat()-_oMap.getBounds().getSouthWest().lat()) * 0.2);	
	_aMarkerN[id].data.lng = _oMap.getCenter().lng();
	_aMarkerN[id].data.edit = true;
	_aMarkerN[id].data.icon = icotemp;
	
	createMarker(_aMarkerN[id]); 	
	setTimeout("mClick("+_aMarkerN[id].element+",\"click\")",200);
};

// Load marker for the user after login
function loadMarkerU(){  
	var panel = "mdrs_inner_user";
 	var url = "mdpm2.php"; 
	var pars ='panel='+panel;
	if(_ustart) pars += "&start="+_ustart;
	if(_sGrp) pars += "&grp="+_sGrp;
	resetPanel(panel);

	new Ajax.Request(
		url, {
			method:"post", 
			parameters: pars,
			onComplete: respondLoadMarkerU,
		    onLoading : addPanelLoadingImg(panel),
			onFailure: function(){alert('Error... please try again.')}
		}
	);
}

function unloadMarkerU(){ 
	resetPanel("mdrs_inner_user");
	$('mdrs_user_unload').hide();
	$('mdrs_user_load').show();	
	$('mdrs_inner_user_container').hide();
	$('mdrs_inner_user_default').show();
	removeAllMarkers(_aMarkerU);
}

//Parse returned AJAX 
function respondLoadMarkerU(originalRequest){
	$('loadingdiv').remove();
	removeAllMarkers(_aMarkerU);
	
	_bounds = new GLatLngBounds();	
	var json = originalRequest.responseText.evalJSON();	
	
	// Search Data		
	var sd = json.searchdata;
	var string = sd.string || "";
	var location = sd.location || "";
	var southwest = sd.southwest || "";
	var northeast = sd.northeast || ""; 
	var start = Number(sd.start) || 0;
	var limit = Number(sd.limit) || 10;
	var total = Number(sd.total) || 0;
	var panel = sd.panel || "";	
	var error = sd.error || "";
	
	_ustart = Number(start);
	
	if(!error){
		if(total < 1){
				resetPanel(panel);
				removeAllMarkers(_aMarkerU); 
				$('mdrs_user_load').hide();
				$('mdrs_user_unload').show();	
				$(panel).update(genErrorMsg("noplc"));
				return;
		};
		
		$('mdrs_user_load').hide();
		$('mdrs_user_unload').show();
		
		// Placemarks Data
		var markers = json.placemarks;
		
		markers.each(function(value,key){ 
			_aMarkerU[key] = new MdMarker("_aMarkerU["+key+"]");
			updateMarkerData(_aMarkerU[key],value); 
			createMarker(_aMarkerU[key],"user");
			
			_bounds.extend(_aMarkerU[key].getGPoint());
			
			var sideHtml = sideItemHtml(_aMarkerU[key]);
			new Insertion.Bottom(panel, sideHtml);
		});
		
		var zlevel = (_oMap.getBoundsZoomLevel(_bounds)>14) ? 14 : _oMap.getBoundsZoomLevel(_bounds);
		_oMap.setZoom(zlevel);
		_oMap.setCenter(_bounds.getCenter());
		
		var end = eval(start+limit); 
		var begin = (total>0) ? start+1 : 0;
		if(end>total) end=total;
		if(total>0){
			$(panel+"_total").show(); $(panel+"_total").update("Results " + begin + " - " + end +" of about " + total +".");
		}
		new ResultThread(panel,panel+'_rt',start,total,string,location,northeast,southwest);
	}else{
		$(panel).update(genErrorMsg(error,{'str':string,'loc':location}));
	}
}		

// User remove marker has been collected
function removeMarkerU(e){  
	var regexp1 = new RegExp(".*?\\[(.*?)\\]");
	var obj = eval(e);
	var panel = "mdrs_inner_user";
  	var up = "d"; 
 	var mapid = obj.data.mapid;	
 	var key = obj.element.gsub(regexp1, '#{1}');
 	var start = _ustart;
	var del = confirm ("Are you sure you want to delete this placemark?");
	
	//var param = location.search.toQueryParams().ref; 
	//param = encodeURIComponent(param);
	
	if(del){ 
	 	var url 	= "mdpm2.php"; 
		var pars 	= "mapid="+mapid;
			pars 	+= "&up="+up;
			pars 	+= "&key="+key;
			pars 	+= "&panel="+panel;
			pars 	+= "&start="+start;		
		if(_sGrp) pars += "&grp="+_sGrp;
		new Ajax.Request(
			url, {
				method:"post", 
				parameters: pars,
				onComplete: responsedRemoveUserMarker,
				onLoading : addInfoWinLoadingImg,
				onFailure: function(){ alert('Error... please try again.')}
			}
		);	
	}else{
		exit;	
	};
};

//Parse returned AJAX 
function responsedRemoveUserMarker(originalRequest){ 
	$('loadingdiv').remove();	
	
	//_bounds = new GLatLngBounds();
	var json = originalRequest.responseText.evalJSON();	
	var sd = json.searchdata;					
	var string = sd.string || "";
	var location = sd.location || "";
	var southwest = sd.southwest || "";
	var northeast = sd.northeast || ""; 
	var start = Number(sd.start) || 0; 
	var limit = Number(sd.limit) || 10;
	var total = Number(sd.total) || 0; 
	var panel = sd.panel || "";
	var error = sd.error || "";
	var n = Number(sd.key) || -1;
	
	if(!error){	
		if(total < 1){
			resetPanel(panel);
			removeAllMarkers(_aMarkerU); 
			$('mdrs_user_load').hide();
			$('mdrs_user_unload').show();	
			$(panel).update(genErrorMsg("noplc"));
			return;
		};
		if(start != _ustart){ _ustart = start; loadMarkerU(); return;}
	
		var markers = json.placemarks;
		markers.each(function(value,key){ 
			if((key >= n)){ 
				if(key == (markers.size()-1)){ 
					removeMarker(_aMarkerU[key],true); 
				
					_aMarkerU[key] = new MdMarker("_aMarkerU["+key+"]"); 
					updateMarkerData(_aMarkerU[key],value); 
					createMarker(_aMarkerU[key],"user");
					_aMarkerU[key].data.edit = false;
					
					var prev = $(_aMarkerU[key].element).previous();
					$(_aMarkerU[key].element).remove();
					
					var sideHtml = sideItemHtml(_aMarkerU[key]);
					if(!!prev){
						new Insertion.After(prev, sideHtml);
					}else{
						new Insertion.Top('mdrs_inner_user', sideHtml);
					}
				}
				else{ 
					removeMarker(_aMarkerU[key],true);
				
					_aMarkerU[key] = new MdMarker("_aMarkerU["+key+"]"); 
					_aMarkerU[key].data = _aMarkerU[key+1].data; 
					createMarker(_aMarkerU[key],"user");		
						
					if(_aMarkerU[key].data.edit) _aMarkerU[key].marker.setImage(icotemp.image);
					
					var prev = $(_aMarkerU[key].element).previous();
					$(_aMarkerU[key].element).remove();
					
					var sideHtml = sideItemHtml(_aMarkerU[key]);
					if(!!prev){
						new Insertion.After(prev, sideHtml);
					}else{
						new Insertion.Top('mdrs_inner_user', sideHtml);
					}
				}
			}
		});
		
		// Remove marker that result lesser than array
		// last marker also
		if(limit > markers.size()){  
			var key = markers.size();
			removeMarker(_aMarkerU[key],true); 
			$(_aMarkerU[key].element).remove();
		}
		
		var end = eval(start+limit); 
		var begin = (total>0) ? start+1 : 0;
		if(end>total) end=total;
		if(total>0){
			$(panel+"_total").show(); $(panel+"_total").update("Results " + begin + " - " + end +" of about " + total +".");
		}
		new ResultThread(panel,panel+'_rt',start,total,string,location,northeast,southwest);
	}else{
		alert(genErrorMsg(error));	
	}
	
};

//@@8
// Use for edit saved marker
// Callback AJAX to reload
function submitEditMarkerU(obj){  
	updateMarkerSerializeForm(obj);
	
	var repexp1 = new RegExp(".*?\\[(.*?)\\]");
	var o = {};
	o.rid = Math.random();
	o.start = _ustart;
	o.key = obj.element.gsub(repexp1, '#{1}');
	o.up = "u";
	
	for(var prop in obj.data){	
		if(obj.data[prop]!= ""){
			o[prop]=HtmlDecode(obj.data[prop]);
		}
	};
	
	//var param = location.search.toQueryParams().ref; 
	//param = encodeURIComponent(param);
	
	var qstr = Hash.toQueryString(o);
	//qstr += "&ref="+param;
	
	if(!!obj.data.name){ 
	 	var url = "mdpm2.php";
		var pars = qstr;	
		if(_sGrp) pars += "&grp="+_sGrp;

		new Ajax.Request(
			url, {
				method:"post", 
				parameters: pars,
				onComplete: responsedEditMarkerU,
				onLoading : addInfoWinLoadingImg,
				onFailure: function(){ alert('Error... please try again.')}
			}
		);	
	}else{
	 	alert('Please fill in the name.');
	};	
};

// Use for edit and remove user marker function
// if edited _aMarkerU, get data from respond AJAX
// else clone data from _aMarkerU data for not edited marker
//`Parse returned AJAX 
function responsedEditMarkerU(originalRequest){ 
	$('loadingdiv').remove();	

	var json = originalRequest.responseText.evalJSON();	
	var sd = json.searchdata;
	var start = Number(sd.start) || 0;
	var limit = Number(sd.limit) || 10;
	var total = Number(sd.total) || 0;
	var panel = sd.panel || "";
	var error = sd.error || "";
	var n = Number(sd.key) || 0;

	if(!error){	
		var markers = json.placemarks;
		
		markers.each(function(value,key){
			if(key == n){
				removeMarker(_aMarkerU[key],true);
				_aMarkerU[key] = new MdMarker("_aMarkerU["+key+"]");
				updateMarkerData(_aMarkerU[key],value); 
				createMarker(_aMarkerU[key],"user");
				_aMarkerU[key].data.edit = false;
				
				GEvent.trigger(_aMarkerU[key].marker,"click");
				
				var prev = $(_aMarkerU[key].element).previous();
				$(_aMarkerU[key].element).remove();
				
				var sideHtml = sideItemHtml(_aMarkerU[key]);
				if(!!prev){
					new Insertion.After(prev, sideHtml);
				}else{
					new Insertion.Top('mdrs_inner_user', sideHtml);
				}
			}
		});
	}else{
		// Used alert to avoid removing new placemark data
		alert(genErrorMsg(error));
	}
};

// Add and submit a new marker
function submitMarkerN(obj){  
	updateMarkerSerializeForm(obj);
	_ustart = 0;
	
	var regexp1 = new RegExp(".*?\\[(.*?)\\]");
	var o = {};
	o.rid = Math.random();
	o.start = _ustart;
	o.key = obj.element.gsub(regexp1, '#{1}');
	o.up = "i";

	for(var prop in obj.data){
		if(obj.data[prop]!= ""){
			o[prop]=HtmlDecode(obj.data[prop]);
		}
	};
	//var param = location.search.toQueryParams().ref; 
	//param = encodeURIComponent(param);
	
	var qstr = Hash.toQueryString(o);
	//qstr += "&ref="+param;
	
	if(!!obj.data.name){ 	
		//$('str').focus();	
	 	var url = "mdpm2.php";
		var pars = qstr;
		if(_sGrp) pars += "&grp="+_sGrp;

		new Ajax.Request(
			url, {	
				method:"post", 
				parameters: pars,
				onComplete: respondSubmitMarkerN,
				onLoading : addInfoWinLoadingImg,
				onFailure: function(){ alert('Error... please try again.')}
			}
		);	
	}else{
	 	alert('Please fill in the name.');
	};	
};

// affected request submitMarkerN()
//Parse returned AJAX 
function respondSubmitMarkerN(originalRequest){ 
	$('loadingdiv').remove();		
	
	var json = originalRequest.responseText.evalJSON();	
	var sd = json.searchdata;
	var start = Number(sd.start) || 0;
	var limit = Number(sd.limit) || 10;
	var total = Number(sd.total) || 0;
	var panel = sd.panel || "";
	var error = sd.error || "";
	var n = Number(sd.key) || 0;
	
	if(!error){	
		removeMarker(_aMarkerN[n],true);
		resetPanel(panel);
		removeAllMarkers(_aMarkerU);
	
		var markers = json.placemarks;	
		markers.each(function(value,key){
			_aMarkerU[key] = new MdMarker("_aMarkerU["+key+"]");
			updateMarkerData(_aMarkerU[key],value); 
			createMarker(_aMarkerU[key],"user");
			
			var sideHtml = sideItemHtml(_aMarkerU[key]);
			new Insertion.Bottom('mdrs_inner_user', sideHtml);
		});
		
		var end = eval(Number(start)+Number(limit)); 
		var begin = (total>0) ? eval(Number(start)+1) : 0;
		if(end>total) end=total;
		if(total>0){
			$(panel+"_total").show(); $(panel+"_total").update("Results " + begin + " - " + end +" of about " + total +".");
		}
		new ResultThread(panel,panel+'_rt',start,total);
			
		setTimeout("mClick("+_aMarkerU[0].element+",\"click\")",200);
	}else{
		// Used alert to avoid removing new placemark data
		alert(genErrorMsg(error));
	}
};
////////////////////////////////////////////////////////////
// ### USER PLACEMARK FUNCTION ###
// ### END ###
////////////////////////////////////////////////////////////

// @@9

////////////////////////////////////////////////////////////
// ### CREATE MARKER FUNCTION ###
////////////////////////////////////////////////////////////
	
//to create the search marker and set up the event window into list
function createMarkerSch(obj) { 
	var name = obj.data.name || "";
	var point = obj.getGPoint(); 
	var icon = eval(obj.data.icon);
	var drag = obj.data.edit;
	var c;
	
	obj.marker = new GMarker(point,{title: name,icon: icon,draggable: drag, zIndexProcess:setMarkerZIndex});	
	_oMap.addOverlay(obj.marker);
	
	GEvent.addListener(obj.marker, "click", function(overlay, point) { 
		c = '@';
		if(_bAbleSwapZIndex && _markerover != obj.element){  
			_oMap.removeOverlay(obj.marker);
			createMarkerSch(obj);
			_markerover = obj.element;	
		}
		obj.marker.openInfoWindowHtml(obj.html3(),{maxWidth:_infoWinWidthMax});	
	});
	
	GEvent.addListener(obj.marker,'dblclick',function(overlay, point){  
		if(!c){
			if(_bAbleSwapZIndex && _markerover != obj.element){  
				_oMap.removeOverlay(obj.marker);
				createMarkerSch(obj);
				_markerover = obj.element;	
			}
			obj.marker.openInfoWindowHtml(obj.html3(),{maxWidth:_infoWinWidthMax});
		}
		if(_oMap.getZoom()<_zoom){_oMap.setCenter(point,_zoom)};
	});
	
	GEvent.addListener(obj.marker,'mouseover',function(){
		if(_bAbleSwapZIndex && _markerover != obj.element){ 
			_oMap.removeOverlay(obj.marker);
			createMarkerSch(obj);
			_markerover = obj.element;	
		}
	});
	
	GEvent.addListener(obj.marker, "infowindowbeforeclose", function() { 
		_bAbleSwapZIndex = true;
	});
};


//to create the temporary marker and set up the event window into list
function createMarker(obj,newmarker) { 
	var o = obj;
	var name = o.data.name || "";
	var point = o.getGPoint(); 
	var icon = eval(o.data.icon);
	var drag = o.data.edit; 				
	var c;
	
	o.marker = new GMarker(point,{title: name,icon: icon,draggable: drag, zIndexProcess: setMarkerZIndex}); 
	_oMap.addOverlay(o.marker);
	
	if(newmarker == "user"){ // create user markers
		GEvent.addListener(o.marker, "click", function(overlay, point) { 
			if(_bAbleSwapZIndex && _markerover != o.element && _oInfoWindow.isHidden()){ 
				_oMap.removeOverlay(o.marker);
				createMarker(o,"user");
				_markerover = o.element;	
			}		
			o.marker.openInfoWindowHtml(o.getHtml(),{maxWidth:_infoWinWidthMax});
			if(o.data.edit){setTimeout("toggleMarker()",200);};
		});
		
		GEvent.addListener(obj.marker,'dblclick',function(overlay, point){
			if(!c){
				if(_bAbleSwapZIndex && _markerover != o.element && _oInfoWindow.isHidden()){ 
					_oMap.removeOverlay(o.marker);
					createMarker(o,"user");
					_markerover = o.element;	
				}		
				o.marker.openInfoWindowHtml(o.getHtml(),{maxWidth:_infoWinWidthMax});
				if(o.data.edit){setTimeout("toggleMarker()",200);};
			}
			if(_oMap.getZoom()<_zoom){_oMap.setCenter(point,_zoom)};
		});
	
		GEvent.addListener(o.marker,'mouseover',function(){ 
			if(_bAbleSwapZIndex && _markerover != o.element && _oInfoWindow.isHidden()){ 
				_oMap.removeOverlay(o.marker);
				createMarker(o,"user");
				_markerover = o.element;	
			}
		});		
	}else{	// create new marker
		GEvent.addListener(o.marker, "click", function(overlay, point) { 
			o.marker.openInfoWindowHtml(o.html1(),{maxWidth:_infoWinWidthMax});
			//$('str').blur();
			setTimeout("toggleMarker()",200);
		});
		
		GEvent.addListener(o.marker,'mouseover',function(){ 
			if(_bAbleSwapZIndex && _markerover != o.element && _oInfoWindow.isHidden()){ 
				_oMap.removeOverlay(o.marker);
				createMarker(o);
				_markerover = o.element;	
			}
		});	
	}
	
	GEvent.addListener(o.marker, "dragstart", function() {	
		_bAbleSwapZIndex = false;
		o.marker.closeInfoWindow();
	});

	GEvent.addListener(o.marker, "dragend", function() { 
		_bAbleSwapZIndex = true;
		o.data.lat = o.marker.getPoint().lat();
		o.data.lng = o.marker.getPoint().lng();
		setTimeout("mClick("+o.element+",\"click\")",500);
	});

	GEvent.addListener(o.marker, "infowindowbeforeclose", function() { 
		_bAbleSwapZIndex = true;
		if(!!o.data.edit){ 
			updateMarkerSerializeForm(o);
			$('str').focus();$('str').blur();
		}; 
		editoropen = false;	
		
	});
};

function setMarkerZIndex(marker,b) { 
	_nMCount++;
	return GOverlay.getZIndex(_oMap.getBounds().getSouthWest().lat()) + _nMCount;
	//return GOverlay.getZIndex(marker.getPoint().lat()) + _nMCount*10000;
}

////////////////////////////////////////////////////////////
// ### CREATE MARKER FUNCTION ###
// ### END ###
////////////////////////////////////////////////////////////

//10

//////////////////////////////////////////////////
// ### Marker Class ###
//////////////////////////////////////////////////
var MdMarker = Class.create();

MdMarker.prototype = {
	initialize: function(ele) {
		this.element  = ele;
		//this.id  = id;
		this.marker = "";
		this.openinfowindow = false;
		this.data = {
			//"point" : '',
		 	"lat" : '4.499762',
			"lng" : '108.500977',
			"mapid" : '',
			"name" : '',
			"desc" : '',
			"address" : '',
			"address1" : '',
			"address2" : '',
			"address3" : '',
			"country" : 'Malaysia',
			"catid"	: '',
			"type" :  '',
			"icon" :  'icodef',
			"time_edit" :  '',
			"creator" :  '',
			"edit" : false
		};
	}  
};


MdMarker.prototype.getGPoint = function(){ 
	var point = new GLatLng(this.data.lat,this.data.lng);
	return point;
};

MdMarker.prototype.getHtml = function(){ 
	if(!this.data.edit){
		return this.html3(true);
	}
	else{ return this.html2() };
};

//@11

// mapinfo window for add marker
MdMarker.prototype.html1 = function(){ 
		var html ='<div id="infowindow" style="width:500px;">'
		+'<form action="javascript:submitMarkerN('+this.element+');" method="post" id="marker" name="maker">'
		+'<input type="hidden" name="lat" value="'+this.data.lat+'" />'
		+'<input type="hidden" name="lng" value="'+this.data.lng+'" />'
		+'<input type="hidden" name="panel" value="mdrs_inner_user" />'
		+'<table width="100%" border="0" cellspacing="0" cellpadding="8" border="0"><tr><td width="200" align="left" valign="top">'
		+'Name: <input type="text" id="infowindow_name" name="name" value="'+this.data.name+'" size="30" maxlength="40" /><br />'
		+'Address: <em><small>(optional)</small></em><input type="text" name="address1" value="'+this.data.address1+'" size="30" maxlength="50" />'
		+'<input type="text" name="address2" value="'+this.data.address2+'" size="30" maxlength="50" />'
		+'<input type="text" name="address3" value="'+this.data.address3+'" size="30" maxlength="50" />'
		+'<br />Country: <em><small>(optional)</small></em><br /><input type="text" id="country_input" name="country" value="'+this.data.country+'" onkeyup="ajax_showOptions(this,\'getCountriesByLetters\',event);" /><input type="hidden" id="country_input_hidden">'
		+'<br />Type: <em><small>(optional)</small></em> <br /><select name="catid" id="catid" />'
		+ selectOpt(this.data.catid)
		+'</select><br /><i><small>*Not shown on categories panel</small></i>'
		+'</td><td width="300" align="left" valign="top">'
		+'<div id="Textarea"><table border="0" width="100%"><tr><td>Description: </td><td width="60px" align="right"><span onclick="toggleMarker();" class="linkspan">Rich text</span></td></tr></table><textarea id="DataTextarea" name="desc" cols="40" rows="6" style="width:260px;height:185px">'+this.data.desc+'</textarea></div>'
		+'<div id="FCKeditor" style="display: none"><table border="0" width="100%"><tr><td>Description: </td><td width="60px" align="right"><span onclick="toggleMarker()"; class="linkspan" id="BtnSwitchTextarea">Edit HTML</a></td></tr></table><textarea id="DataFCKeditor" cols="40" rows="6"></textarea></div>'
		+'</td></tr></table>'
		+'<center><input type="submit" id="_submit" name="_submit" value="Save" /></center></form>'
		+'<div style="margin-top:8px;margin-bottom:5px;border-top:1px solid #666666;"><div style="position:absolute;width:auto;clear:both;"><span onclick="removeMarker('+this.element+');" class="linkspan">Delete</span> this new place?</div> <div style="position:absolute;right:0px;clear:both;color: #339944;font-weight:bold;">Adding New Place</div></div>'
		+'</div>';
		return html;
};

// @@12

// mapinfo window for edit marker
MdMarker.prototype.html2 = function(){ 
	var html = '<div id="infowindow" style="width:500px">'
				+'<form action="javascript:submitEditMarkerU('+this.element+');" method="post" id="marker" name="maker">'
				+'<input type="hidden" name="mapid" value="'+this.data.mapid+'" />'
				+'<input type="hidden" name="lat" value="'+this.data.lat+'" />'
				+'<input type="hidden" name="lng" value="'+this.data.lng+'" />'
				+'<input type="hidden" name="panel" value="mdrs_inner_user" />'
				+'<table width="100%" border="0" cellspacing="0" cellpadding="8" border="0"><tr><td width="200" align="left" valign="top">'
				+'Name: <input type="text" id="infowindow_name" name="name" value="'+this.data.name+'" size="30" maxlength="40" /><br />'
				+'Address: <em><small>(optional)</small></em><input type="text" name="address1" value="'+this.data.address1+'" size="30" maxlength="50" />'
				+'<input type="text" name="address2" value="'+this.data.address2+'" size="30" maxlength="50" />'
				+'<input type="text" name="address3" value="'+this.data.address3+'" size="30" maxlength="50" />'
				+'<br />Country: <em><small>(optional)</small></em><br /><input type="text" id="country_input" name="country" value="'+this.data.country+'" onkeyup="ajax_showOptions(this,\'getCountriesByLetters\',event);" /><input type="hidden" id="country_input_hidden">'
				+'<br />Type: <em><small>(optional)</small></em> <br /><select name="catid" id="catid" />'
				+ selectOpt(this.data.catid)
				+'</select><br /><i><small>*Not shown on categories panel</small></i>'
				+'</td><td width="300" align="left" valign="top">'
				+'<div id="Textarea"><table border="0" width="100%"><tr><td>Description: </td><td width="60px" align="right"><span onclick="toggleMarker();" class="linkspan">Rich text</span></td></tr></table><textarea id="DataTextarea" name="desc" cols="40" rows="6" style="width:260px;height:185px">'+this.data.desc+'</textarea></div>'
				+'<div id="FCKeditor" style="display: none"><table border="0" width="100%"><tr><td>Description: </td><td width="60px" align="right"><span onclick="toggleMarker()"; class="linkspan" id="BtnSwitchTextarea">Edit HTML</a></td></tr></table><textarea id="DataFCKeditor" cols="40" rows="6"></textarea></div>'
				+'</td></tr></table>'
				+'<center><input type="submit" name="_submit" id="_submit" value="Submit" /></center></form>'
				+'</div>';
	return html;
};

// @@13

// mapinfo window for initial data
MdMarker.prototype.html3 = function(ed){ 
		var edit = !ed ? false : ed;	
		var data = this.data;
 		var html = '<div id="infowindow">';
		if(data.mapid || data.type){
							html += '<div style="overflow:auto;border-bottom:1px solid #666666; height:15px">';
			if(data.mapid) 	html += '<small style="color:#0066CC;">MapdooID : '+data.mapid+'</small>';
			if(data.type) 	html += '<small style="position:absolute;right:15px;"><i>type : '+data.type+'</i></small>';
							html += '</div>';
			if(data.mapid) 	html += '<div style="min-width:320px">';
											html += '<small style="color: #339944;"><i>Link : <a href="http://mapdoo.com/?id='+data.mapid+'" target="_self"><b style="color: #339944;">http://mapdoo.com/?id='+data.mapid+'</b></a></i></small>';
											html += '<small style="position:absolute;right:15px;"><a href="http://mapdoo.com/contactus.php?ra='+data.mapid+'" target="_self">Report Abuse</a></small>';
											html += '</div>';
			
		}
							html += '<div style="overflow:auto;padding-top:8px;">';
		if(data.name) 		html += '<b>'+data.name+'</b>';
		if(data.address) 	html += '<br />'+data.address;
		if(data.address1) 	html += '<br />'+data.address1;
		if(data.address2) 	html += '<br />'+data.address2;
		if(data.address3) 	html += '<br />'+data.address3;
		if(data.country) 	html += '<br />'+data.country;
		if(data.address || data.address1 || data.address2 || data.address3 || data.country){html += '<br />'};
		if(data.desc) 		html += '<br />'+HtmlDecode(data.desc).stripScripts();
							html +=  '</div>';
							
		if(data.creator || data.time_edit){
							html += '<div style="overflow:auto;padding-top:8px;">';
			if(data.creator)	html += '<i><small>Created by: <b style="color: #339944;">'+data.creator+'</b>. </small></i>';
			if(data.time_edit) 	html += '<i><small>Last updated: <b style="color: #339944;">'+data.time_edit+'</b>. </small></i>';
							html +=  '</div>';
		}
		
		if(edit == true){html += '<div style="margin-top:5px;border-top:1px solid #666666;"><span onclick="editMarker2('+this.element+')" class="linkspan">Edit</span> | <span onclick="removeMarkerU('+this.element+')" class="linkspan">Delete</span></div>'; }
		else{html += '<div id="windowads"><iframe src ="/media/winads/index.php" width="100%" height="18px" frameborder=0 scrolling="no"></iframe></div>';}
			html += '</div>';
		return html;
};
//////////////////////////////////////////////////
// ### Marker Class ###
// ### END ###
//////////////////////////////////////////////////

// @@14

//////////////////////////////////////////////////
// ### EDITOR ###
//////////////////////////////////////////////////

function toggleMarker(){ 	
	var oEditor ; 

	if ( typeof( FCKeditorAPI ) != 'undefined' )
		oEditor = FCKeditorAPI.GetInstance( 'DataFCKeditor' ) ;

	// Get the _Textarea and _FCKeditor DIVs.
	var eTextareaDiv	= $( 'Textarea' ) ;
	var eFCKeditorDiv	= $( 'FCKeditor' ) ; 

	// If the _Textarea DIV is visible, switch to FCKeditor.
	if ( eTextareaDiv.style.display != 'none' )	{  
		// If it is the first time, create the editor.
		if ( !oEditor || !editoropen){ 
			//$('_submit').disabled = true;
			createEditor();
			editoropen = true;
		}
		else{ 
			// Set the current text in the textarea to the editor.
			oEditor.SetData( $('DataTextarea').value ) ;
			//oEditor.isDirty();
		};
		
		// Switch the DIVs display.
		eTextareaDiv.style.display = 'none' ;
		eFCKeditorDiv.style.display = '' ;

		// This is a hack for Gecko 1.0.x ... it stops editing when the editor is hidden.
		if ( oEditor && !document.all ){
			if ( oEditor.EditMode == FCK_EDITMODE_WYSIWYG )
				oEditor.MakeEditable() ;
		}
	}
	else{ 
		// Set the textarea value to the editor value.
		$('DataTextarea').value = oEditor.GetXHTML() ;

		// Switch the DIVs display.
		eTextareaDiv.style.display = '' ;
		eFCKeditorDiv.style.display = 'none' ;
	}

};

function createEditor(){ 
	$('DataFCKeditor').value = $('DataTextarea').value ;  

	var sBasePath = "/js/editor/";

	// Create an instance of FCKeditor (using the target textarea as the name).
	var oFCKeditor = new FCKeditor( 'DataFCKeditor' ) ;
	oFCKeditor.BasePath = sBasePath ; 
	oFCKeditor.Width = '100%' ;
	oFCKeditor.Height = '190' ; 
	oFCKeditor.ReplaceTextarea();
};

// The FCKeditor_OnComplete function is a special function called everytime an
// editor instance is completely loaded and available for API interactions.
function FCKeditor_OnComplete( editorInstance ){  
	// Enable the switch button. It is disabled at startup, waiting the editor to be loaded.
	//$('_submit').disabled = false ; 
	//editorInstance.Events.AttachEvent( 'OnSelectionChange', UpdateToData ) ;
};


function UpdateToData( editorInstance ){
	// If the textarea isn't visible update the content from the editor.
	if ( $( 'Textarea' ).style.display == 'none' ){
		var oEditor = FCKeditorAPI.GetInstance( 'DataFCKeditor' ) ;
		$( 'DataTextarea' ).value = oEditor.GetXHTML() ; 
	}
};

//@@15

function parse_html(str){
    //removing everything before images in src
    var regexp1 = new RegExp("\\s(_fcksavedurl=\\\").*(\\\"){1}","g");
    var regexp2 = new RegExp("\\s(_fckxhtmljob=\").*(\\\"){1}","g");
    str = str.replace(regexp1,"");
    str = str.replace(regexp2,"");
    return str;
}
//////////////////////////////////////////////////
// ### EDITOR ###
// ### END ###
//////////////////////////////////////////////////

// @@16

//////////////////////////////////////////////////
// ### MdSearchTypes Class ###
// Obj : MdSearchTypes
//////////////////////////////////////////////////

var MdSearchTypes = Class.create();

MdSearchTypes.prototype = {
  initialize: function(map) { 
    this.init(map); 
  }
};

MdSearchTypes.prototype.init = function(map) {  
	this.map = map; 
	//this.updateMapBounds();
	this.urlTypes;
	this.urlLoc;
	this.types = [];
	this.atypes = [];  // new format in array list
	this.sTypes = '';
	this.toggleFlag = 0;
	this.toggleFlag2 = 0;
	this.searchStr = '';
	this.searchLoc = '';
};

MdSearchTypes.prototype.debug = function() { 
 	var testObj = this.types; 
	for(x in testObj) alert( x + "-" + testObj[ x ] );
};

// @@17

var nToggleAllTypes = 0;

MdSearchTypes.prototype.toggleAllTypes = function() { 
	if(this.types.length > 0){
		this.types.each(function(value,index){ 
			$('tp_'+value).checked = true;
			_oSearchTypes.toggleCheckedType($('tp_'+value));
		});
	}
};

MdSearchTypes.prototype.toggleCheckedType = function(e,bound) {  	
	var type = e.value;  
	var checked = e.checked; 
	
 	if(!type) return; 
 	if(checked){  
 		this.checkedType(type,bound);
	}else{  
		this.uncheckedType(type);
	} 		
};

MdSearchTypes.prototype.checkedType = function(t,bound){ 
		var type = t;
		var max = 6;
		var neast = _oMap.getBounds().getNorthEast().toUrlValue();
		var swest = _oMap.getBounds().getSouthWest().toUrlValue();

		this.types.push(type);
		this.types = this.types.uniq();

		if(this.types.length > max) {
			alert( 'You may only select '+max+' categories at a time.' );
			$('tp_'+type).checked = false;
			this.types = this.types.without(type);
			return;
		};
		
		if(this.types.length == 1){
			if(!$('cbremoveall')){ 
				$('typebox').show();
				var htmlshowall = '<div id="cbremoveall" style="background: url(/img/bg_red50.png) repeat;"><img src="/img/icons/18x20/icon_remove.png"/><img src="/img/icons/icon_checked.png" onclick="_oSearchTypes.uncheckedAllType()" class="imgchecked"/>Remove All</div>';
				new Insertion.Top('typebox', htmlshowall);
			}
		}
		
		if(!!$('cb_'+type)){
			$('cb_'+type).remove();	
			removeAllMarkers(_aMarkerT[type]);
		}
		
		//this.updateMapBounds();

		var url 	= "search.php"; 
		var pars 	= 'f=t'
					+ '&q=' + type
					+ '&neast=' + neast 
					+ '&swest=' + swest;
		if(bound) pars += '&z=8';	

		new Ajax.Request(
			url, {
				method:"get", 
				parameters: pars,
				onComplete: responsedCheckedType,
				onLoading : loadingTypeBox(type),
				onFailure: function(){ alert('Error... please try again.')}
			}
		);	
};

MdSearchTypes.prototype.uncheckedType = function(t) { 
	var type = t;
	
 	if(!type) return;
	this.types = this.types.without(type); 
	$('tp_'+type).checked = false;
	$('cb_'+type).remove();	
	removeAllMarkers(_aMarkerT[type]);
	
	if(this.types.length <= 0){
		$('cbremoveall').remove();
		$('typebox').hide();
	}
};

MdSearchTypes.prototype.uncheckedAllType = function() { 
	this.types.each(function(item,index) { 	
		var type = item;
		_oSearchTypes.uncheckedType(type);
  	});
  	this.types = [];
};

MdSearchTypes.prototype.uncheckedAllTypeOnload = function() { 
	var tlist = getTypeList();
	tlist.each(function(value,index){ 
			$('tp_'+value).checked = false;
	});

	this.types = [];
};

// @@18

//Parse returned XML 
function responsedCheckedType(originalRequest){  
	//$('imgloadmarkert').hide();
	var json = originalRequest.responseText.evalJSON(); 

	// Search Data		
	var sd = json.searchdata;
	var mid = sd.mid || ""; 
	var string = sd.string || "";
	var location = sd.location || "";
	var southwest = sd.southwest || "";
	var northeast = sd.northeast || ""; 
	var start = Number(sd.start) || 0;
	var limit = Number(sd.limit) || 10;
	var total = Number(sd.total) || 0;
	var z = Number(sd.z) || 0;
	var panel = sd.panel || "";	
	var element = sd.element || "";
	var error = sd.error || "";
	
	_bounds = new GLatLngBounds(); 
	
	if(!error){	
		//removeAllMarkers(_aMarkerT);
		_aMarkerT[string] = [];
		
		// Placemarks Data
		var markers = json.placemarks; 
		markers.each(function(value,key){
			_aMarkerT[string][key] = new MdMarker("_aMarkerT['"+string+"']["+key+"]");
			updateMarkerData(_aMarkerT[string][key],value); 
			createMarkerSch(_aMarkerT[string][key]);
			_bounds.extend(_aMarkerT[string][key].getGPoint()); 
		});

		var txt = getValueFromKey(string);
		var img = eval(txt.icon).image; 	 
		var html ='<img src="'+img+'" title="'+txt.name+'" /><img src="/img/icons/icon_checked.png" title="'+txt.name+'" onclick="_oSearchTypes.uncheckedType(\''+txt.catid+'\')" class="imgchecked"/>'+txt.name;
		$('cb_'+string).update(html);	
		
		
		if(z){ 
			var zlevel = (_oMap.getBoundsZoomLevel(_bounds)>14) ? 14 :  _oMap.getBoundsZoomLevel(_bounds);
			_oMap.setZoom(zlevel);
			_oMap.setCenter(_bounds.getCenter());
		};
		
	}else{
		$('cbremoveall').remove();
		$('typebox').hide();
		alert(genErrorMsg(error));
	}
};
//////////////////////////////////////////////////
// ### MdSearchTypes Class ###
// Obj : MdSearchTypes
// ### END ###
//////////////////////////////////////////////////

// @@19

//////////////////////////////////////////////////
// ### ResultThread ###
// Result Thread Class
//////////////////////////////////////////////////
var ResultThread = Class.create();

ResultThread.prototype = {
	initialize : function(myvar,container,start,total,str,loc,neast,swest,opts) {
		this.myvar = myvar;
		this.container = container;
		this.rtstart = Number(start) || 0; 
		this.rttotal = Number(total) || 0; 
		this.rtopts = opts || {};	
		
		//set options var
		this.rtdebug = Boolean(this.rtopts.debug) || false;
		this.rtlimit = Number(this.rtopts.limit) || 10;
		this.rtthreadmax = Number(this.rtopts.threadmax) || 10;
		this.rtstr = str || '';
		this.rtloc = loc || '';
		this.rtne = neast;
		this.rtsw = swest;
		this.rtthreadcur = this.getThreadCur();
		this.rtthreadtotal = Number(Math.ceil(eval(this.rttotal/this.rtlimit)));
		this.rtfrom = eval(((this.rtthreadcur-1)*this.rtlimit)+1);
		this.rtto = eval((this.rtfrom-1)+this.rtlimit);	
			
		this.readThread();
	}
};

ResultThread.prototype.getOptsString = function(){ 
	var opts = this.rtopts;
	var str = "";
	if(!!opts){ 
		var arr = new Array();
		for(var prop in opts){
			str = prop + ":" + opts[prop];
			arr.push(str);
		}
		str = ",{" + arr.toString() + "}";
		if(!str || str == ",{}"){ str = ""; }
	}else{
		str = "";
	};
	return str;
};

ResultThread.prototype.getThreadCur = function(){
	return Number(Math.floor(eval(this.rtstart/this.rtlimit)+1));
};

ResultThread.prototype.updateThread = function(start){ 
	this.rtstart = start || 0;
	this.rtthreadcur = this.getThreadCur();
	this.readThread();
};

ResultThread.prototype.readThread = function(){
			
	$(this.container).innerHTML = "";
	
	if(this.rtdebug){
		$(this.container).innerHTML += "START :: " + this.rtstart + "<br>";
		$(this.container).innerHTML += "TOTAL :: " + this.rttotal + "<br>";
		$(this.container).innerHTML += "TOTAL THREAD :: " + this.rtthreadtotal + "<br>";
		$(this.container).innerHTML += "CURRENT :: " + this.rtthreadcur + "<br>";
		$(this.container).innerHTML += "MAX THREAD :: " + this.rtthreadmax + "<br>";
	};
	
	
	if(this.rtthreadtotal>1 && this.rtstart<=this.rttotal){
		var threadlist = [];
		for(var i=0;i<this.rtthreadtotal;i++){ 
			threadlist.push(i+1);
		};
		if(this.rtdebug) $(this.container).innerHTML += "THREAD LIST :: " + threadlist + "<br>";

		var slice = [];
		if(this.rtthreadtotal>this.rtthreadmax){ 
			if(this.rtdebug) $(this.container).innerHTML += this.rtthreadcur + " :: " + Math.ceil(this.rtthreadmax/2) + "<br>";
			if(this.rtthreadcur<=Math.ceil(this.rtthreadmax/2)){ 
				var s = 0;
				var e = this.rtthreadmax;
				slice = threadlist.slice(s,e);
			}else if((this.rtthreadtotal-this.rtthreadcur)<Math.floor(this.rtthreadmax/2)){ 
				var s = eval((threadlist.length)- this.rtthreadmax);
				var e = threadlist.length; 
				slice = threadlist.slice(s,e);
			}else{ 
				var s = eval(this.rtthreadcur-Math.ceil(this.rtthreadmax/2)); 
				var e = eval(s+this.rtthreadmax);
				slice = threadlist.slice(s,e);
			}

			if(this.rtdebug) $(this.container).innerHTML += this.rtthreadtotal-this.rtthreadcur + " :: " + Math.floor(this.rtthreadmax/2) + "<br>";
			if(this.rtdebug) $(this.container).innerHTML += "SLICE :: " + s + " :: " + e + "<br>";
			if(this.rtdebug) $(this.container).innerHTML += slice + "<br>";
			if(this.rtdebug) $(this.container).innerHTML += "FROM " + this.rtfrom + " :: TO " + this.rtto + "<br>";				
		}else{
			slice = threadlist;
			if(this.rtdebug) $(this.container).innerHTML += slice + "<br>";
		};
	}
	
	// Generate thread hyperlink
	var rtfile;
	if(this.container == 'mdrs_inner_rt'){rtfile = 'search.php'}
	else if(this.container == 'mdrs_inner_tab4_rt'){rtfile = 'suggest.php';}
	else{rtfile = 'mdpm2.php'};

	if(this.rtthreadcur > 1 && this.rtstart < this.rttotal)	{
		var prev = eval((this.rtthreadcur-2)*this.rtlimit);
		var uri = 'f=n'
				+ '&str=' + this.rtstr
				+ '&start=' + prev
				//+ '&zoom=10'
				+ "&neast="+this.rtne
				+ "&swest="+this.rtsw
				+ '&panel='+this.myvar
				+ '&_submitsearchform=Search';
						
		$(this.container).innerHTML += "<span onclick='threadSearch(\""+rtfile+"\",\"" + uri + "\",\""+this.myvar+"\");' class=\"linkspan\">&lt;</span> ";
	};
	
	if(!!slice){
    	for(var i=0;i<slice.length;i++){
    		var sta = eval((slice[i]-1)*this.rtlimit);
    		if(i<this.rtthreadtotal && this.rtstart<this.rttotal){
    			if(this.rtthreadcur == slice[i]){ 
    				$(this.container).innerHTML += slice[i] + " "; 
    			}else{ 
    			 		var uri = 'f=n'
						+ '&str=' + this.rtstr
						+ '&start=' + sta
						//+ '&zoom=10'
						+ "&neast="+this.rtne
						+ "&swest="+this.rtsw
						+ '&panel='+this.myvar
						+ '&_submitsearchform=Search'; 
    				$(this.container).innerHTML += "<span onclick='threadSearch(\""+rtfile+"\",\"" + uri + "\",\""+this.myvar+"\");' class=\"linkspan\">" + slice[i] + "</span> ";
    			}
    		}
    	}	
	};
	
	if(this.rtthreadcur < this.rtthreadtotal )	{
		var next = eval(this.rtthreadcur*this.rtlimit);
		var uri = 'f=n'
				+ '&str=' + this.rtstr
				+ '&start=' + next
				//+ '&zoom=10'
				+ "&neast="+this.rtne
				+ "&swest="+this.rtsw
				+ '&panel='+this.myvar
				+ '&_submitsearchform=Search';
		$(this.container).innerHTML += "<span onclick='threadSearch(\""+rtfile+"\",\"" + uri + "\",\""+this.myvar+"\");' class=\"linkspan\">&gt;</span> ";
	};		
};
//////////////////////////////////////////////////
// ### ResultThread ###
// ### END ###
//////////////////////////////////////////////////

//////////////////////////////////////////////////
// ### Tab ###
// Tab class to show and hide penal
/////////////////////////////////////////////////

var Fabtabs = Class.create();

Fabtabs.prototype = {
	initialize : function(element) {
		this.element = $(element);
		var options = Object.extend({}, arguments[1] || {});
		this.menu = $A(this.element.getElementsByTagName('a'));
		this.show(this.getInitialTab()); 
		this.menu.without(this.getInitialTab()).each(this.hide.bind(this));
		this.menu.each(this.setupTab.bind(this));
	},
	setupTab : function(elm) {
		Event.observe(elm,'click',this.activate.bindAsEventListener(this),false)
	},
	activate :  function(ev) { 
		var elm = Event.findElement(ev, "a");
		Event.stop(ev);
		this.show(elm);
		this.menu.without(elm).each(this.hide.bind(this));
		if(this.tabID(elm) == "tab3") loadMarkerLocal(); 
		if(this.tabID(elm) == "tab4") searchSuggestion();
	},
	hide : function(elm) {
		$(elm).removeClassName('active-tab');
		$(this.tabID(elm)).hide();
	},
	show : function(elm) {
		$(elm).addClassName('active-tab');
		$(this.tabID(elm)).show(); 
	},
	tabID : function(elm) {
		var regexp1 = new RegExp("#(\\w.+)");
		return elm.href.match(regexp1)[1];
	},
	getInitialTab : function() {
		var regexp1 = new RegExp("#(\\w.+)");
		if(document.location.href.match(regexp1)) {
			var loc = RegExp.$1;
			var elm = this.menu.find(function(value) { return value.href.match(regexp1)[1] == loc; }); 
			return elm || this.menu.first();
		} else {
			return this.menu.first();
		}
	}
};
//////////////////////////////////////////////////
// ### Tab ###
// ### END ###
/////////////////////////////////////////////////    