var MAX_ZOOM_LEVEL = 19, MIN_ZOOM_LEVEL = 2;
  
  var E_STYLE_7 = new EStyle('http://econym.org.uk/gmap/stem7.png', new GSize(24,24),  'ev-listing-baloon', new GPoint(-10,21));

  function EStyle(stemImage, stemSize, boxClass, boxOffset) {
    this.stemImage = stemImage;
    this.stemSize = stemSize;
    this.boxClass = boxClass;
    this.boxOffset = boxOffset;
    var agent = navigator.userAgent.toLowerCase();
    this.fudge = 2;  // assume Netscape if no match found
    if (Browser.Engine.trident)
      this.fudge = 2;
	else if (Browser.Engine.presto) 
      this.fudge = 2;
	else if (Browser.Engine.gecko || Browser.Engine.webkit) 
      this.fudge = 2;
  }

  function EWindow(map,estyle) {
    this.map = map;
    this.estyle=estyle;
    this.visible = false;
    this.ie = false;
    var agent = navigator.userAgent.toLowerCase();
    if ((agent.indexOf("msie") > -1) && (agent.indexOf("opera") < 1)){ this.ie = true;} else {this.ie = false;}
  } 
  
  EWindow.prototype = new GOverlay();

  EWindow.prototype.initialize = function(map) {
    var div1 = document.createElement("div");
    div1.style.position = "absolute";
    map.getPane(G_MAP_FLOAT_PANE).appendChild(div1);
    var div2 = document.createElement("div");
    div2.style.position = "absolute";
    div2.style.width = this.estyle.stemSize.width+"px";
    map.getPane(G_MAP_FLOAT_PANE).appendChild(div2);
    this.div1 = div1;
    this.div2 = div2;
  };

  EWindow.prototype.openOnMap = function(point, html, offset) {
    this.offset = offset || new GPoint(0,0);
    this.point = point;
    this.div1.innerHTML = '<div class="' + this.estyle.boxClass + '">' + html + '</div>';
    if (this.ie && this.estyle.stemImage.toLowerCase().indexOf(".png")>-1) {
      var loader = "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+this.estyle.stemImage+"', sizingMethod='scale');";
      this.div2.innerHTML = '<div style="height:' +this.estyle.stemSize.height+ 'px; width:'+this.estyle.stemSize.width+'px; ' +loader+ '" ></div>';
    } else {
      this.div2.innerHTML = '<img src="' + this.estyle.stemImage + '" width="' + this.estyle.stemSize.width +'" height="' + this.estyle.stemSize.height +'">';
    }
    var z = GOverlay.getZIndex(this.point.lat());
    this.div1.style.zIndex = z;
    this.div2.style.zIndex = z+1;
    this.visible = true;
    this.show();
    this.redraw(true);
  };
  
  EWindow.prototype.openOnMarker = function(marker,html) {
    var vx = marker.getIcon().iconAnchor.x - marker.getIcon().infoWindowAnchor.x;
    var vy = marker.getIcon().iconAnchor.y - marker.getIcon().infoWindowAnchor.y;
    this.openOnMap(marker.getPoint(), html, new GPoint(vx,vy));
  };
  

  EWindow.prototype.redraw = function(force) {
    if (!this.visible) {return;}
    var p = this.map.fromLatLngToDivPixel(this.point);
    this.div2.style.left   = (p.x + this.offset.x) + "px";
    this.div2.style.bottom = (-p.y + this.offset.y -this.estyle.fudge) + "px";
    this.div1.style.left   = (p.x + this.offset.x + this.estyle.boxOffset.x) + "px";
    this.div1.style.bottom = (-p.y + this.offset.y + this.estyle.boxOffset.y) + "px";
  };

  EWindow.prototype.remove = function() {
    this.div1.parentNode.removeChild(this.div1);
    this.div2.parentNode.removeChild(this.div2);
    this.visible = false;
  };

  EWindow.prototype.copy = function() {
    return new EWindow(this.map, this.estyle);
  };

  EWindow.prototype.show = function() {
    this.div1.style.display="";
    this.div2.style.display="";
    this.visible = true;
  };
  
  EWindow.prototype.hide = function() {
    this.div1.style.display="none";
    this.div2.style.display="none";
    this.visible = false;
	Avi.Label.current = null;
  };
  
  EWindow.prototype.isHidden = function() {
    return !this.visible;
  };
  
  EWindow.prototype.supportsHide = function() {
    return true;
  };

  EWindow.prototype.zindex = function(zin) {
    var z = GOverlay.getZIndex(this.point.lat());
    this.div1.style.zIndex = z+zin;
    this.div2.style.zIndex = z+1+zin;
  };




var Avi = {};
//------- Custom lebel -------------
var Avi_Marker_Label = new Class({
	Implements: GOverlay,
	label: new Hash(),
	mirror_link: null,
	initialize: function(map, options) {
		this.map_ = map;
		this.options = {
			offset: options.offset || new GSize(0,0),
			zIndex: options.zIndex || 1000,
			onHover: options.onHover || {display:'block'},
			onLeave: options.onLeave || {display:'none'}
		};
	    this.div_ = new Element('div', {
			style: 'position: absolute;display:none;z-index:' + this.options.zIndex
		});
		if(options.classname) {
			this.options.classname = options.classname;
			this.div_.addClass(options.classname);
		}
	},
	
	//--------------------------------------------------
	create: function(id, marker, html) {
		var label = {
			html: html,
			marker: marker,
			point: marker.getPoint(),
			el: this.div_.clone()
		};
		label.el.set('html', label.html).inject(this.map_.getPane(G_MAP_FLOAT_SHADOW_PANE));
		this.label.set(id, label);
		
		GEvent.addListener(marker, 'mouseover', function(){
			this.hover(id);
	    }.bind(this));
	    GEvent.addListener(marker, 'mouseout', function() {
        	this.leave(id);
        }.bind(this));
	},
	
	//--------------------------------------------------
	hover: function(id) {
		if(this.current == id) return false;
		
		var label = this.label.get(id);
		label.el.setStyles(this.options.onHover);
		this.redraw(label.el, label.point);
	},
	
	//--------------------------------------------------
	leave: function(id) {
		var label = this.label.get(id);
		if(label)
			label.el.setStyles(this.options.onLeave);
	},
	
	//--------------------------------------------------
	redraw: function(el, point) {
	    var p = this.map_.fromLatLngToDivPixel(point);
	    var h = (el.clientHeight).toInt();
	    el.setStyles({
			left: p.x - this.options.offset.width,
			top: p.y - this.options.offset.height - h
		});
	}
});

var Avi_Search = new Class({
	init:{},
	search_history: [],
	markers: new Hash(),
	icons: new Hash(),
	color_hex: new Hash(),
	listings_data: {},
	markers_lat_lng: {}, // untuk mendeteksi latlong yang sama, agar tidak numpuk
	markers_plus: {},
	win_info:{},
	widget: false,
	number_marker:0,
	counters: {},
	default_listing: null,
	init: false,
	options: {
		max_number_marker: 150, 
		st_price_val:[0,'100K','200K','400K','700K','1M','2M','3M','4M','5M',0],
		st_br_val:[0,1,2,3,4,5,6,7,8,9,10,0],
		st_size_val:[0,250,500,1000,1250,1500,1750,2000,2250,2500,2750,3000,3500,4000,5000,0],
		marker_color:['green','purple','yellow','blue','white','red','black','orange','gray','brown'],
		marker_color_hex:['#65e265','#e54fe5','#fcfc64','#5858ff','#ffffff','#ff3f4f','#000000','#f2c30c','#c1c1c1','#cca065'],
		icon: {
		    house: ['House / Landed building', 'http://maps.google.com/mapfiles/kml/pal3/icon56.png', 'http://maps.google.com/mapfiles/kml/pal3/icon56s.png'],
		    airport: ['Airport', 'http://maps.google.com/mapfiles/kml/pal2/icon56.png', 'http://maps.google.com/mapfiles/kml/pal2/icon56s.png'],
		    bank: ['Bank', 'http://maps.google.com/mapfiles/kml/pal2/icon58.png', 'http://maps.google.com/mapfiles/kml/pal2/icon58s.png'],
		    church: ['Church / Mosque', 'http://maps.google.com/mapfiles/kml/pal2/icon11.png', 'http://maps.google.com/mapfiles/kml/pal2/icon11s.png'],
		    gas_station: ['Gas Station', 'http://maps.google.com/mapfiles/kml/pal2/icon29.png', 'http://maps.google.com/mapfiles/kml/pal2/icon29s.png'],
		    golf_cource: ['Golf Course', 'http://maps.google.com/mapfiles/kml/pal2/icon13.png', 'http://maps.google.com/mapfiles/kml/pal2/icon13s.png'],
		    hospital: ['Hospital', 'http://maps.google.com/mapfiles/kml/pal3/icon46.png', 'http://maps.google.com/mapfiles/kml/pal3/icon46s.png'],
		    market: ['Market', 'http://maps.google.com/mapfiles/kml/pal3/icon26.png', 'http://maps.google.com/mapfiles/kml/pal3/icon26s.png'],
		    hotel: ['Hotel / Apartment', 'http://maps.google.com/mapfiles/kml/pal3/icon21.png', 'http://maps.google.com/mapfiles/kml/pal3/icon21s.png'],
		    recreation: ['Recreation Facilities', 'http://maps.google.com/mapfiles/kml/pal2/icon12.png', 'http://maps.google.com/mapfiles/kml/pal2/icon12s.png'],
		    sport: ['Sport Center', 'http://maps.google.com/mapfiles/kml/pal2/icon57.png', 'http://maps.google.com/mapfiles/kml/pal2/icon57s.png'],
		    school: ['School / University', 'http://maps.google.com/mapfiles/kml/pal2/icon10.png', 'http://maps.google.com/mapfiles/kml/pal2/icon10s.png'],
		    transportation: ['Public Transportation', 'http://maps.google.com/mapfiles/kml/pal4/icon15.png', 'http://maps.google.com/mapfiles/kml/pal4/icon15s.png'],
		    pushpin: ['Site Influence', 'http://maps.google.com/mapfiles/kml/pal5/icon14.png', 'http://maps.google.com/mapfiles/kml/pal5/icon14s.png']
		}
	},
	
	//------------------------------------------------------
	initialize: function() {
		this.default_listing = default_listing;
		
		this.url = site_url + 'search/';
		this.elements = {};
		this.elements.show_all_toggler = $('search-show-all-toggler');
		this.elements.form = $('search-form');
		this.elements.si = this.elements.form.getElements('.closable');
		this.elements.location = $('at');
		this.elements.city = $('city');
		this.elements.province = $('province');
		this.elements.zip = $('zip');
		this.elements.form_reset = $('si-reset');
		this.elements.clear_cookie = $('reset_search');
//		this.elements.use_map = $('use-map');
		this.elements.total_records = $('search-total-record');
		this.elements.result_summary = $('search-result-summary');
		this.defaults = {};
		this.defaults.city = this.elements.city.value;
		this.defaults.province = this.elements.province.value;
		this.defaults.zip = this.elements.zip.value;
		if($type($('save-profile-btn'))=='element'){
			$('save-profile-btn').addEvent('click',function(){this.changeProfile();}.bind(this));
		}
		this.elements.city.addEvent('keyup', function(){
			this.construct_location();
		}.bind(this));
		this.elements.province.addEvent('keyup', function(){
			this.construct_location();
		}.bind(this));
		this.elements.zip.addEvent('keyup', function(){
			this.construct_location();
		}.bind(this));
		if(this.elements.form_reset) {
			this.elements.form_reset.addEvent('click', function(e){
				e.stop();
				this.elements.form.reset();
				this.elements.location.value = default_location;
				this.search();
			}.bind(this));
		}
		
		if($type(this.elements.clear_cookie) == 'element'){
			this.elements.clear_cookie.addEvent('click', function(){
				this.reset_search();
			}.bind(this));
		}
		
		//show_all checkboxes
		this.elements.show_featured_listing = $('show-featured-listing');
		this.elements.show_new = $('show-new');
		if(!window.location.hash){
			var search_hash = Cookie.read('search_hash');
			window.location.hash = search_hash;
			if(this.default_listing == 'new_listing'){
				this.elements.show_new.setProperty('checked','checked');
				var search_terms = this._build_search_term();
				if(window.location.hash == '') window.location.hash = '#' + encodeURIComponent(search_terms.str);
				else  window.location.hash = window.location.hash + encodeURIComponent(search_terms.str);
			} else if(this.default_listing == 'feature_listing'){
				this.elements.show_featured_listing.setProperty('checked','checked');
				var search_terms = this._build_search_term();
				if(window.location.hash == '') window.location.hash = '#' + encodeURIComponent(search_terms.str);
				else  window.location.hash = window.location.hash + encodeURIComponent(search_terms.str);
			}
			
			
		} 
		
		// tab view switcher 
		this.elements.tab_map = $('tab_map');
		this.elements.tab_list = $('tab_list');
		this.elements.tab_search = $('tab_search');
		this.elements.map_wrapper = $('search-result-map');
		this.elements.list_wrapper = $('search-result-list');
		this.elements.search_wrapper = $('interactive-search');
		
		$this = this;
		$$(this.elements.tab_map, this.elements.tab_list, this.elements.tab_search).addEvent('click', function(e){
			e.stop();
			if(this.hasClass('selected')) return;

			$this.elements.tab_map.removeClass('selected');
			/*$this.elements.tab_search.removeClass('selected');*/
			$this.elements.tab_list.removeClass('selected');
			$this.elements.map_wrapper.addClass('hidden');
			$this.elements.list_wrapper.addClass('hidden');
			$this.elements.search_wrapper.addClass('hidden');			
			
			this.addClass('selected');
			var n = this.id.replace('tab_','');
			$this.elements[n + '_wrapper'].removeClass('hidden');
			
			if(n=='map' && Avi.Map) {
				var c = Avi.Map.getCenter();
				Avi.Map.checkResize();
				Avi.Map.setCenter(c);
			}
		});
		
		// initialize marker
		this.baseIcon = new GIcon();
	    this.baseIcon.iconSize = new GSize(12, 20);
	    this.baseIcon.shadowSize = new GSize(22, 20);
	    this.baseIcon.iconAnchor = new GPoint(6, 20);
	    this.baseIcon.infoWindowAnchor = new GPoint(5, 5); 
		
	    this.construct_location();
		if(this.elements.location.value=='') {
//			this.elements.location.value = geoip_city() +', '+ geoip_region_name();
			this.elements.location.value = default_location;
		}
		this.elements.location.value = this.elements.location.value.replace(',','');
		this.elements.location.addEvent('keypress',function(evt){
			if(evt.key==',') {
				return false;
			}
		});
		
		this.options.st_ba_val = this.options.st_br_val; // copy value
		var d = new Date(), last_10years = d.getFullYear() - 10;
		this.options.st_yb_val = [0, last_10years - 10, last_10years - 5, last_10years, last_10years + 1, last_10years + 2, last_10years + 3, last_10years + 4, last_10years + 5, last_10years + 6, last_10years + 7, last_10years + 8, last_10years + 9, d.getFullYear(), 0];
		
		this.elements.form = $('search-form');
		this.elements.form.addEvents({
			submit: function(e){
				e.stop();
				this.search();
				return false;
			}.bind(this)
		});
		$('do-search').addEvent('click', function(e){
			e.stop();
			this.search();
		}.bind(this));
		/*$('search-tool').addEvent('click', this.search_tool.bind(this));*/
		$('mail-alert').addEvent('click', this.mail_alert.bind(this));
		$('rss-search').addEvent('click', function(e){
			e.stop();
			var last_search = this.search_history.getLast();
			var hash = last_search.get('str'); 
			document.location = site_url + 'search/rss/' + encodeURIComponent(hash);
		}.bind(this));
		
		var hash = window.location.hash;
		if(hash) {
			hash = hash.substring(1);
			hash = this._parse_hash(hash,true);
			this.search();
		}
		
		$$('#at', '#keyword', 'mls').addEvent('keydown', function(evt){
			if (evt.key == 'enter') {
				evt.stop();
				this.search();
			}
		}.bind(this));
		
		this.si_clossed = 0;
		var _slider_id;
		this.hidden_checkboxes = new Hash();
		$each(this.elements.si, function(el){
			
			if(el.hasClass('clossed')){
				this.si_clossed++;
			}
			var legend = el.getElement('.legend');
			var slider = el.getLast();
			
			if(slider.hasClass('slider-container')) {
				_slider_id = slider.get('id');
			} else {
				_slider_id = false;
			}
			
			legend.addEvent('click', function(slider_id){
				if (el.hasClass('clossed')) {
					this.si_clossed--;
					el.removeClass('clossed');
					
					if(slider_id) {
						this._slider_init(slider_id);
					}
				}
				else {
					this.si_clossed++;
					el.addClass('clossed');
				}
				
				if(this.si_clossed == 0) {
					this.elements.show_all_toggler.set('html','hide all').removeClass('clossed');
				} else {
					this.elements.show_all_toggler.set('html','show all').addClass('clossed');
				}
			}.bind(this, _slider_id));
			
			var w = el.getElement('p[class=modal-wrapper]');
			if($type(w)=='element'){
				var sp = w.getElements('span[class^=modal-item-left]');
				if(sp.length > 75){
					this._init_filter(w,sp);
				}
			}
		}, this);
		
		this.elements.order_by = $('search-order');
		if($type(this.elements.order_by)=='element'){
			this.elements.order_by.addEvent('change', function(){
				this.search(this.elements.order_by.value);
			}.bind(this));
		}
		
		this.elements.show_all_toggler.addEvent('click', function(e){
			e.stop();
			if(this.elements.show_all_toggler.hasClass('clossed')) {
				this.si_clossed = 0;
				this.elements.show_all_toggler.removeClass('clossed').set('html','hide all');
				$each(this.elements.si, function(el){
					if (el.hasClass('clossed')) {
						el.removeClass('clossed');
					}
				}, this);
				
				// activate slider
				//this._slider_init('st_br');
				//this._slider_init('st_ba');
				//this._slider_init('st_size');
				//this._slider_init('st_yb');
				
			} else {
				this.si_clossed = this.elements.si.length;
				this.elements.show_all_toggler.addClass('clossed').set('html','show all');
				$each(this.elements.si, function(el){
					if (!el.hasClass('clossed')) {
						el.addClass('clossed');
					}
				}, this);
			}
		}.bind(this));
		
		//this._slider_init('st_price');
		
		/*// choose at least 1 checkbox
		var cb_group = $$('#listing-type-resale', '#listing-type-new', '#listing-type-foreclosure');
		for(var i=0,j=cb_group.length;i<j;i++) {
			cb_group[i].addEvent('click', this._checkbox_init.bind(this,[cb_group[i],cb_group]));
		}*/
		
		if(widget==true) this.widget = true;
		
	},
	
	construct_location: function(){
		var location = '';
		if(this.elements.city != ''){
			location += this.elements.city.value;
		}
		if(this.elements.province != ''){
			if(location != '') 
				location += ' ';
			location += this.elements.province.value;
		}
		if(this.elements.zip != ''){
			if(location != '')
				location += ' ';
			location += this.elements.zip.value;
		}
		this.elements.location.value = location.trim();
	},
	
	reset_search: function(){
		Cookie.dispose('search_hash');
		window.location.hash = '';
		window.location.reload();
	},

	//------------------------------------------------------
	remove_polygon: function(){
		if(Avi.Polygon) {
			Avi.Map.removeOverlay(Avi.Polygon);
			Avi.Polygon = false;
		}
		
		if(Avi.Map_Polygon) {
			Avi.Map_Polygon.draw_start();
		} else { 
			Avi.Polygon_Data = null;
		}
		$('sicustomareaw').setStyle('display','none').empty();
		$('siatw').setStyle('display','block');
		
		Avi.Search.elements.location.value = '';
		
		// remove selected area
		new Request.JSON({
			url: site_url + 'search/polygon_delete',
			onComplete: Avi.Search._search_by_bound.bind(Avi.Search)
		}).post({});
	},

	//------------------------------------------------------
	_init_filter: function(parent,el){
		var parent_id = parent.get('id'),
			cb = [],
			letter = [];
		
		letter.include('All');
		$each(el,function(e){
			var l = e.getElement('label');
			if($type(l) == 'element'){
				l = l.innerHTML;
				letter.include(l.charAt(0));
				cb.include(e);
			}
			//e.dispose();		
			e.setStyle('display', 'none');
		},this);
		
		var letter_wrapper = parent.getElement('span[class=heading]').getElement('span[class=letter-filter]');
		letter.each(function(l){
			new Element('a',{
				html: l,
				style: 'color:#000000;pointer:cursor;'
			}).addEvent('click',function(){
				this._show_checkboxes(parent_id, l);
			}.bind(this)).inject(letter_wrapper,'bottom');
			letter_wrapper.appendText(' ');
		},this);
		this.hidden_checkboxes.set(parent_id,cb);
		this._show_checkboxes(parent_id,'A');
	},
	
	_show_checkboxes: function(wrapper_id,letter){
		var i = 1;
//		$(wrapper_id).getElements('span[class=modal-item-left]').dispose();
		$(wrapper_id).getElements('span[class=modal-item-left]').setStyle('display', 'none');
		$(wrapper_id).getElements('span[class=modal-item-left-large]').dispose();
		$(wrapper_id).getElements('br').dispose();
		this.hidden_checkboxes.get(wrapper_id).each(function(e){
			if(letter != 'All'){
				if(e.getElement('label').innerHTML.charAt(0)==letter){
					/*e.inject($(wrapper_id),'bottom');
					if(e.hasClass('modal-item-left') == true){
						if((i%4)==0){
							new Element('br',{style:'clear:both;'}).inject($(wrapper_id));
						}
					} else {
						if((i%3)==0){
							new Element('br',{style:'clear:both;'}).inject($(wrapper_id));
						}
					}*/
					e.setStyle('display', 'block');
					i++;
				}
			} else {
				/*e.inject($(wrapper_id),'bottom');
				if(e.hasClass('modal-item-left') == true){
					if((i%4)==0){
						new Element('br',{style:'clear:both;'}).inject($(wrapper_id));
					}
				} else {
					if((i%3)==0){
						new Element('br',{style:'clear:both;'}).inject($(wrapper_id));
					}
				}*/
				e.setStyle('display', 'block');
				i++;
			}
		});
	},
	
	apply_checkbox: function(e){
		var p1 = e.getParent().getParent();
		var p2 = p1.getParent();
		//p1.fade('out');
		this.si_clossed++;
		p2.addClass('clossed');
	},
	//------------------------------------------------------
	_parse_hash: function(hash,direct) {
		var terms = {keyword:''}, temp,
			field = ['cookies', 'at', 'city', 'province', 'zip', 'subarea', 'price', 'bathroom', 'bedroom', 'builton', 'size', 'type', 'listing-type', 'mls', 'show', 'type', 'page', 'sort-by', 'broker-id'];
		if(!direct){
			hash = hash.replace(/\+/g,' ');
		}
		hash = decodeURIComponent(hash);
		var m1 = hash.match(/([a-z\-]*):"([^"]*)"/gi); // cari dulu yang ada kutipnya
		if(m1!=null) {
			m1.each(function(m){
				if(m.test(/"$/)) {
					temp = m.split(':');
					if(field.indexOf(temp[0]) > -1) {
						temp[1] = temp[1].replace(/"/g,'').clean();
						terms[temp[0]] = temp[1];
					}
					hash = hash.replace(m, '');
				}
			});
		}
		var m2 = hash.match(/([a-z\-]*):([^\s]*)/gi); // cari yang tidak ada kutip
		if(m2!=null) {
			m2.each(function(m){
				temp = m.split(':');
				if(field.indexOf(temp[0]) > -1) {
					terms[temp[0]] = temp[1].clean();
				}
				hash = hash.replace(m, '');
			});
		}
		terms.keyword = hash.toString().clean();		
		// fill to form
		$each(terms, function(val, key){
			if(key == 'cookies' && val == 'clear'){
				this.reset_search();
			}
			var el = $(key);
			if (!el) {
				if (key == 'size' || key == 'price') {
					$('st_' + key + '_input').set('value', val);
					if(key == 'price'){
						if(val.clean() != '') {
							if(val.contains('+')) {
								val = val.replace('+', '');
								if(!isNaN(val)) val *= 1; // convert into numeric
								min = val;
								max = 'Any';
							} else if(val.contains('-')) {
								val = val.split('-');
								if(!isNaN(val[0])) val[0] *= 1; // convert into numeric
								if(!isNaN(val[1])) val[1] *= 1; // convert into numeric
								
								if(val[1] == '') {
									min = 'Any';
									max = val;
								} else {
									// min
									min = val[0];
									// max
									max = val[1];
								}
							}
							$('price_min').set('value',min);
							$('price_max').set('value',max);
						}
						
					}
				} else if(key == 'broker-id'){
					$('broker_id').set('value', val);
				} else if (key == 'bathroom') {
					$('st_ba_input').set('value', val);
				} else if (key == 'bedroom') {
					$('st_br_input').set('value', val);
				} else if (key == 'builton') {
					$('st_yb_input').set('value', val);
				} else if(key=='listing-type' || key=='show') {
					var cb = this.elements.form.getElements('input[name^='+ key +']'); // get checkbox
					val = val.split('|');
					cb.each(function(c){
						c.checked = val.indexOf(c.value) > -1;
					});
				} else if(key == 'subarea'){
					var cb = this.elements.form.getElements('input[name^='+ key +']'); // get checkbox
					if(val.contains('|')==true){
						val = val.split('|');
						cb.each(function(c){
							if(val.contains(c.value) == true){
								c.checked = true;
							} else {
								c.checked = false;
							}
						});
					} else {
						cb.each(function(c){
							if(c.value.test(val, 'i')){
								c.checked = true;
							} else {
								c.checked = false;
							}
						});
					}
				} else if(key == 'type'){
					var cb = this.elements.form.getElements('input[name^='+ key +']'); // get checkbox
					if(val.contains('|')==true){
						val = val.split('|');
						cb.each(function(c){
							if(val.contains(c.value)){
								c.checked = true;
							} else {
								c.checked = false;
							}
						});
					} else {
						cb.each(function(c){							
							if(val.contains(c.value)){
								c.checked = true;
							} else {
								c.checked = false;
							}
						});
					}
				}
			} else if(key=='type') {
				var options = el.getChildren();
				for(var i=0, j=options.length; i<j; i++) {
					if (options[i].value == val) {
						options[i].selected = true;
						break;
					}
				}
			} else {
				el.set('value', val);
			}
		}, this);
		
		return terms;
	},
	
	
	//------------------------------------------------------
	set_busy: function(is_busy) {
		var img_width = 130, img_height = 60;
		if(!this.busy_el) {
			this.busy_el = new Element('img', {
				src:'http://v3.estatevue.com/public/admin/images/loading.gif',
				width:img_width,
				height:img_height,
				styles: {
					position:'absolute',
					display:'none',
					zIndex:1000000
				}
			}).inject($(document.body));
		}
		if(is_busy==true) {
			var pos, l, t;
			if(this.elements.tab_map.hasClass('selected')) {
				pos = $('search-result-map').getCoordinates();
				l = pos.left + ((pos.width - img_width)/2).toInt();
				t = pos.top + ((pos.height - img_height)/2).toInt();
			} else {
				pos = $('search-result-list').getCoordinates();
				l = pos.left + ((pos.width - img_width)/2).toInt();
				t = pos.top + 100;
			}
			this.busy_el.setStyles({
				top: t,
				left: l,
				display:''
			});
		
			$(document.body).setStyle('cursor','progress');
		}
		else {
			this.busy_el.setStyle('display','none');
			$(document.body).setStyle('cursor','default');
		}
	},
	
	_get_province : function(idx_feed){
		if(idx_feed == 'Tarasoft' || idx_feed == 'Tarasoft Realty Executive' || idx_feed == 'Tarasoft Remax' || 
			 idx_feed == 'Soreb' || idx_feed == 'Kamloops' || idx_feed == 'Tarasoft Vernon' || idx_feed == 'Fraser Valley REB4'){
			return 'BC';
		} else if(idx_feed == 'Calgary Real Estate Board'){
			return 'Alberta';
		} else if(idx_feed == 'Remax Professional Winnepeg' || idx_feed == 'Royale LePage Prime Winnepeg'){
			return 'Manitoba';
		} else {
			return 'BC';
		}
	},
	
	//------------------------------------------------------
	search: function(sort_by) {
		
		//if(this.elements.location.value.clean()=='' || $('st_price_input').value.clean()=='') {
		if(this.elements.location.value.clean()=='') {
			alert('You must enter a location');
			this.elements.location.focus();
			return false;
		}
		var search_terms = this._build_search_term();
		window.location.hash = '#' + encodeURIComponent(search_terms.str);
		document.title = 'Search Listing ' + search_terms.str;
		if(sort_by){
			search_terms.json.set('sort-by',sort_by);
			window.location.hash += ' sort-by:'+sort_by;
			document.title += ' sort-by:'+sort_by;
		}
		//}
		
		this.set_busy(true); // show loading
		
		if(this.init == true){
			search_terms.json.set('init','true');
		}
		var search = new Hash(search_terms);
		//if(!this.search_request) {
			this.search_request = new Request.JSON({
				url: this.url + 'ajax_search', 
				onComplete: function(respons) {
					this.set_busy(false);
					if(!respons) return false;
					
					search.set('data', respons);
					/*search_terms.json.ne = respons.ne;
					search_terms.json.sw = respons.sw;
					this.search_history.push(search); // store in search history
					*/
					// clean marker from previous search
					this.number_marker = 0;
					this.markers.each(function(m){
						m.hide();
					});				
					this.init = false;
					search_terms.json.set('init','false');
					// summary
					var summary_html = 'Least expensive: <strong>$'+respons.summary.min+'</strong> &nbsp;  &nbsp; |  &nbsp;  &nbsp; Most expensive: <strong>$'+respons.summary.max+'</strong>  &nbsp;  &nbsp; |  &nbsp;  &nbsp; Average price: <strong>$'+respons.summary.avg+'</strong>  &nbsp;  &nbsp; |  &nbsp;  &nbsp; New listings today: <strong>'+respons.summary.today+'</strong>';
					this.elements.result_summary.set('html', summary_html);
					this._search_callback(respons, false);
					
					/* IM
					if($('tab_map').hasClass('selected'))
						this._search_by_bound();
					*/
					this.set_cookie();
				}.bind(this)
			});
		//}
		
		this.search_history.push(search); // store in search history
		this.search_request.post(search_terms.json);
	},
	
	//------------------------------------------------------
	_move_bounds: function () {
		if(this.number_marker > this.options.max_number_marker && Avi.Map.getZoom() < 13) {
			return false;
		}
		
		if(this.bound_status != 'delay') {
			if($('tab_map').hasClass('selected') == false) return false;
			
			this.bound_status = 'delay';
			this._search_by_bound.delay(2500, this); // in milisec
		}
	},
	
	//------------------------------------------------------
	_search_by_bound: function() {
		
		var bounds = Avi.Map.getBounds(),
			southWest = bounds.getSouthWest(),
			northEast = bounds.getNorthEast(),
			lbs = Avi.Map.getZoom() + ' ' + southWest.lat() + ' ' + southWest.lng();		
		if(lbs == this.last_bound_search) return false;
		if(this.bound_status == 'loading' && this.bound_ajax) {
			this.set_busy(false);
			this.bound_ajax.cancel(); // stop previous loading
		}
		
		var search_terms = this.search_history.getLast();
		if(!search_terms) return false; 
			
		search_terms = search_terms.get('json');
		
		this.bound_status = 'loading';
		this.set_busy(true); // show loading
			
			
		search_terms = search_terms.getClean();
		search_terms.map_mode = true;
		
		search_terms.sw = southWest.lat() + ',' + southWest.lng();
		search_terms.ne = northEast.lat() + ',' + northEast.lng();
		
		if(!this.bound_ajax) {
			this.bound_ajax = new Request.JSON({
				url: this.url + 'ajax_search', 
				onComplete: function(respons) {
					this.bound_status = 'idle';
					this._search_callback(respons, true);
					this.set_busy(false); // hide loading
				}.bind(this)
			});
		} 
		//else {
			this.last_bound_search = lbs;
		//}
		this.bound_ajax.post(search_terms);
	},
	
	//------------------------------------------------------
	goto_page: function(page_num) {
		var last_search = this.search_history.getLast();
		var hash = last_search.get('str') + ' page:' + page_num; 
		var terms = last_search.get('json');
		terms.page = page_num;
		this.set_busy(true); // show loading
		window.location.hash = '#' + encodeURIComponent(hash);
		new Request.JSON({
			url: this.url + 'ajax_search', 
			onComplete: function(respons){
				this.set_busy(false); // show loading
				this._search_callback(respons);
				//set cookie
				this.set_cookie();
			}.bind(this)
		}).post(terms);
	},
	
	set_cookie: function(){
		var hash = window.location.hash.replace('#', '');
		var myCookie = Cookie.write('search_hash', hash);
	},
	
	//------------------------------------------------------
	_search_callback: function(respons, map_mode) {
		if (!respons) return false;
		if (respons.center_latlong && Avi.Map) {
			 var center = Avi.Map.getCenter();
			// alert(center.x+' '+center.y+'   '+respons.center_latlong[0]+' '+respons.center_latlong[1]);
			 if(center.x!=respons.center_latlong[0] && center.y!=respons.center_latlong[0]){
				
				 var bounds = new GLatLngBounds(new GLatLng(respons.south,respons.west), new GLatLng(respons.north,respons.east));
	              // Choose a zoom level that fits
				 var zoom = Avi.Map.getBoundsZoomLevel(bounds);

				 Avi.Map.setCenter(new GLatLng(respons.center_latlong[0], respons.center_latlong[1]), zoom);
			 }
		}
		
		this.mirror_link =respons.mirror_link;
		/* IM
		if (map_mode != true) {
		*/
			if (!this.elements.list_view) {
				var c = $('search-grid-view');
				c.set('html', ''); // cleanup inner html
				this.elements.list_view = new Element('ul').inject(c);
			}
			
			$each(this.markers, function(marker){ 
				marker.hide();
			}, this);
			
			if (respons.total > 0) {
				var li_result = {};
				this.elements.list_view.empty();
				if( Browser.Engine.trident == true || Browser.Engine.webkit == true ){
					var tmp = new Array();
					$each(respons.data, function(row, key){
						tmp.include( key.toString() );
					});
					
					
					var sort_number = function( a, b ) {
						return b - a;
					};
					
					var newtmp = tmp.sort( sort_number );
					var tmp = new Array();
					respons.data = new Hash( respons.data );
					newtmp.each( function( i ) {	
						tmp.include( respons.data.get( i ) );
					});
					respons.data = tmp;
				}
				$each(respons.data, function(row){
					
					if(!this.listings_data[row.id]) {
						this.listings_data[row.id] = row;
					}
					
					// build map marker
					this._build_marker(row);
					
					var li = new Element('li', {
						'class': 'si'
					});
					var idx = '';
					if(row.idx==true){ 
						if(this.widget==true)
							idx = 'idx_widget_'+bg_color+'/';
						else
							idx = 'idx/';
						img_link = this.mirror_link+"rets/photo/" + row.alias + "/160-1.jpg";
					} else {
						if(this.widget==true)
							idx = 'feat_widget_'+bg_color+'/';
						img_link = site_url+'listings/photo/' + row.alias + "/160-1.jpg";
					}
					
					var target = '';
					if(row.hide_addr == true || row.hide_addr == 'true')
						var menu = '<a onclick="Avi.Search.openPreview(\''+idx+row.alias+'\',this);" title="Show property information quick sheet.">preview</a> | <a href="'+site_url+'search/detail/'+ idx + row.alias +'.html" title="view details & more photos" '+target+'>details</a>';
					else
						var menu = '<a onclick="Avi.Search.goto_map('+row.id+', ['+row.lat+','+row.lng+'])" title="view listing on map">map</a> | <a onclick="Avi.Search.openPreview(\''+idx+row.alias+'\',this);" title="Show property information quick sheet.">preview</a> | <a href="'+site_url+'search/detail/'+ idx + row.alias +'.html" title="view details & more photos" '+target+'>details</a>';
					var div = new Element('div').adopt(new Element('img', {
						src: 'http://v2.estatevue.com/public/images/blank.gif',
						//style: "background-image:url('"+this.mirror_link+"rets/photo/" + row.alias + "/160-1.jpg')"
						style: "background-image:url('"+img_link+"')"
					}), new Element('span', {
						html: menu,
						'class': 'search-toolbar'
					}), new Element('em',{
						html: 'MLS# &reg;:'+row.mls					
					}), new Element('strong', {
						html: row.address,
						style:'display:block;width:150px;'						
					}), new Element('em', {
						html: row.type ? row.type : 'unspecified'
					}), new Element('em', {
						html: 'br: ' + row.br + ' &nbsp; | &nbsp; ba: ' + row.ba
					}), new Element('em',{
						html: 'brokerage: ' + row.brokerage,
						style: 'display:block;height:auto;'
					}), new Element('span', {
						html: row.price
					})).inject(li);
					
					if(row.idx==false){
						var icon_feat = new Element('div',{'class':'featured-listing-icon','title':'Featured Listing'}).inject(div);
					}
					//add watermark
					if(row.status=='Sold'){
						var wm = new Element('img', {
							src: public_url+'images/sold-watermark.png',
							style: 'width:56px;height:56px;position:absolute;z-index:5;top:0;left:0;'
						}).inject(div);
					}//add watermark
					if(row.type=='Rental'){
						var wm = new Element('img', {
							src: public_url+'images/rental-watermark.png',
							style: 'width:56px;height:56px;position:absolute;z-index:5;top:0;left:0;'
						}).inject(div);
					}
					
					li.inject(this.elements.list_view);
					li_result[row.id] = li;
				}, this);
			}
			else {
				this.elements.list_view.dispose;
				this.elements.list_view = false;
				$('search-grid-view').set('html', 'No record found.');
			}
			
			if(respons['sort-by']) {
				var opt = this.elements.order_by.getChildren();
				opt.each(function(o){
					o.selected = o.value == respons['sort-by'];
				},this);
			}	
			
			
			this.elements.total_records.set('html', respons.total == 0 ? 'No Record Found' : respons.total + ' Listings Found');
			
			var paging_html = this._paging(respons.page, respons.per_page, respons.total);
			$('search-paging').set('html', paging_html);
			$('search-paging-footer').set('html', paging_html);
		/* IM
		} else {
			if (respons.total > 0) {
				$each(respons.data, function(row, id) {// build map marker
//					if(Avi.Polygon) {
//						var inside_polygon = Avi.Polygon.containsLatLng(new GLatLng(row.lat, row.lng));
//						if(inside_polygon == false) {
//							respons.total--;
//							return false;
//						}
//					}
					this._build_marker(row);
				}, this);
			}
		}
		*/
		if (respons.total == 1) {
			$each(respons.data, function(row){
				var center = Avi.Map.getCenter();
				if(center.lat()!=row.lat && center.lng()!=row.lng)
					Avi.Map.setCenter(new GLatLng(row.lat, row.lng), Avi.Map.getZoom());
			});
		}
	}, 
	
	openPreview: function(prop_alias,trigger){
		if (!this.jbModal) {
			this.jbModal = new JB_Modal();
		}
	
			var html = '<iframe src="'+site_url+'/search/compact/'+prop_alias+'.html" style="border:0px none;" width="725" height="430" id="ev_property_preview" frameBorder="0" allowtransparency="true"></iframe>';
			
			this.preview_modal = this.jbModal.build({
				title: '',
				html: html,
				width: 735,
				height: 485,
				ok_fn: this.mail_alert_send.bind(this),
				cancel_fn: null,
				ok_label: 'Subscribe',
				cancel_label: 'close'
			},trigger);
			this.preview_modal.show();
		
		
		
	},
	
	change_window: function(id,mode) {
		
		if(mode=='next') this.counters[id]++;
		else this.counters[id]--;
		
		var i = 0;
		var new_data = null;
		var new_key = null;
		this.markers_plus[id].each(function(data,key){
			if(i==this.counters[id]){
				new_data = data;
				new_key = key;
			}
			i++;
		},this);
		if(new_data!=null){
			var content = new_data.content;
			if(this.counters[id] != 0){
				content += '<div style="text-align:right;width:100%;"><a onclick="Avi.Search.change_window(\''+id+'\',\'prev\');">prev</a>';
				if(this.counters[id] < this.markers_plus[id].getLength()-1){
					content += '&nbsp;&nbsp;<a onclick="Avi.Search.change_window(\''+id+'\',\'next\');">next</a></div>';
				}
			}
			
			var win_id = this.markers_lat_lng[id];
			this.win_info[win_id].contents[0] = content;
			this._open_tab(new_data.marker, 0, win_id);
		} else {
			return false;
		}
	},
	//------------------------------------------------------
	_build_marker: function(data) {		
		var marker = this.markers.get(data.id);
		this.number_marker++; // increase number marker
		if(marker) { // sudah dibuat sebelumnya
			if(marker.isHidden()) {
				marker.show();
			}
			return marker;
		}
		
		
		if(this.markers_lat_lng[data.lat +','+ data.lng]) {
			marker = this.markers.get(this.markers_lat_lng[data.lat +','+ data.lng]);
		
			if(this.markers_plus[data.lat +','+ data.lng].has(data.id)==false){
				
				//----- Build window info ----------------------
				var titles = [], contents = [];
		    	titles[0] = data.address;
		    	contents[0] = '<table border="0" width="100%"><tr>';
		    	
		    	if(data.idx == false){
		    		if(this.widget==true)
		    			var link = site_url + 'search/detail/feat_widget_'+bg_color+'/'+ data.alias +'.html';
		    		else
		    			var link = site_url + 'search/detail/'+ data.alias +'.html';
			    	var img = site_url + 'listings/photo/'+ data.alias +'/100-1.jpg';
		    	}
		    	else {
		    		if(this.widget == true)
		    			var link = site_url + 'search/detail/idx_widget_'+bg_color+'/'+ data.alias +'.html';
		    		else
		    			var link = site_url + 'search/detail/idx/'+ data.alias +'.html';
			    	var img = this.mirror_link+'rets/photo/'+ data.alias +'/100-1.jpg';
		    	}
		    	
		    	/*if(this.widget){
		    		var target = 'target="_blank"';
		    	} else {*/
		    		var target = '';
		    	//}
		    	
				contents[0] += '<td width="90"><a href="'+ link +'" '+target+'><img src="' + img + '" width="75" height="75"/></a><br/>&raquo; <a href="'+ link +'" '+target+'>more info</a></td>';
	//	    	contents[0] += '<td><p>MLS&reg; #: <strong>'+data.mls+'</strong></p><p>'+data.br+' br  /  '+data.ba+' ba  /  '+data.lot+'</p><p>Realtor: '+data.realtor+'</p><p>Brokerage: '+data.brokerage+'</p><p>'+data.type+'</p><p>'+data.ownership+'</p><p class="price">Price: <span>'+data.price+'</span></p></td>';
		    	contents[0] += '<td><p>MLS&reg; #: <strong>'+data.mls+'</strong></p><p>'+data.br+' br  /  '+data.ba+' ba  /  '+data.lot+'</p><p>Realtor: '+data.realtor+'</p><p>Brokerage: '+data.brokerage+'</p><p>'+data.type+'</p><p class="price">Price: <span>'+data.price+'</span></p></td>';
		    	contents[0] += '</tr></table>';
		    	var address = '<strong>'+data.address;
		    	if(data.unit)
		    		address += ' #' + data.unit;
		    	if(data.status == 'Sold')
	    			address += ' (Sold)';
		    	address += '</strong><br/>';
		    	contents[0] = address + contents[0];
		    		
		    	
		    	var old_id = this.markers_lat_lng[data.lat +','+ data.lng];
		    	if(this.markers_plus[data.lat +','+ data.lng].getLength() == 1){
		    		var old_content = this.win_info[old_id].contents[0];
		    		var address = '<strong>' + data.address;
		    		if(this.markers_plus[data.lat +','+ data.lng].get(old_id).unit)
		    			address += ' #'+this.markers_plus[data.lat +','+ data.lng].get(old_id).unit;
		    		if(this.markers_plus[data.lat +','+ data.lng].get(old_id).status == 'Sold')
		    			address += ' (Sold)';
		    		address += '</strong><br/>';
		    		old_content = address + old_content;
		    		old_content += '<div style="text-align:right;width:100%;">';
		    		old_content += '<a onclick="Avi.Search.change_window(\''+data.lat +','+ data.lng+'\',\'next\');">next</div></a>';
		    		this.win_info[old_id].contents[0] = old_content;		    		
		    		this.win_info[old_id].titles[0] = data.address;		    		
		    	
		    		//change marker icon
		    		var icon_img = this.markers_plus[data.lat +','+ data.lng].get(old_id).icon_link;
					var hexcol = this.color_hex.get(data.type);
					
					if(/chart.apis/.test(icon_img)==true){
						//my listing
						var new_icon_img = 'http://chart.apis.google.com/chart?chst=d_map_xpin_icon&chld=pin_star|home|'+hexcol+'|000000';
						var icon = new GIcon(this.baseIcon, new_icon_img, null, 'http://labs.google.com/ridefinder/images/mm_20_shadow.png');
						icon.iconSize = new GSize(15, 24);
					} else {
						//default listing
						var new_icon_img = 'http://chart.apis.google.com/chart?chst=d_map_pin_icon&chld=home|'+hexcol;
						var icon = new GIcon(this.baseIcon, new_icon_img, null, 'http://labs.google.com/ridefinder/images/mm_20_shadow.png');
						icon.iconSize = new GSize(15, 24);
					}
					
					var newmarker = new GMarker(marker.getLatLng(), {
						'icon': icon
					});
					Avi.Map.removeOverlay(marker);
					Avi.Map.addOverlay(newmarker);
					marker = newmarker;
					
					this.markers_plus[data.lat +','+ data.lng].set(old_id,{'content':old_content,'marker':marker});
					// cache marker
					this.markers.set(data.id, marker);
					
					GEvent.addListener(marker, 'click', function(){
						this._open_tab(marker, 0, old_id);
				    }.bind(this));
				    GEvent.addListener(marker, 'ClickTab', function(tab) {
			        	this._open_tab(marker, tab, old_id);
			        }.bind(this));
		    	}
				
				//change pins
				//alert(marker.getIcon().image);
				
				
		    	this.markers_plus[data.lat +','+ data.lng].set(data.id,{'content':contents[0],'marker':marker});
				var label = Avi.Label.label.get(old_id);
		    	var new_html = '<strong>'+data.address+'</strong>('+this.markers_plus[data.lat +','+ data.lng].getLength()+' listings)';
		    	Avi.Label.create(old_id, marker, new_html);
				
			}
			return marker;
		} 		
		
		var point = new GLatLng(data.lat, data.lng);		
		if(!this.icons.get(data.type)) {
			var i = this.icons.getLength() % this.options.marker_color.length; // kenapa di MOD? 
			var hexcol = this.options.marker_color_hex[i].replace('#','');	
			if(data.is_my==true){				
				//var icon_img_star = 'http://chart.apis.google.com/chart?chst=d_map_xpin_icon&chld=pin_star|home|'+hexcol+'|000000';
				var icon_img_star = 'http://chart.apis.google.com/chart?cht=d&chdp=mapsapi&chl=pin_star%27i\\%27[%27-2%27f\\hv%27a\\]h\\]o\\'+hexcol+'%27fC\\000000%27tC\\000000%27eC\\Lauto%27f\\&ext=.png';
				var icon_star = new GIcon(this.baseIcon, icon_img_star, null, 'http://labs.google.com/ridefinder/images/mm_20_shadow.png');
				icon_star.iconSize = new GSize(15, 24);
			}
			
			var icon_img = 'http://labs.google.com/ridefinder/images/mm_20_'+ this.options.marker_color[i] +'.png';
			var icon = new GIcon(this.baseIcon, icon_img, null, 'http://labs.google.com/ridefinder/images/mm_20_shadow.png');
				
			this.icons.set(data.type, icon);
			this.color_hex.set(data.type,hexcol);
			var legend_wrapper = $('avi-map-legend');
			var legend_target = legend_wrapper;
			if(this.icons.getLength()==3) {
				new Element('a',{
					html:'----- more legend -----',
					events: {
						mouseenter: function(){
							legend_wrapper.addClass('avi-map-legend-hover');
						}
					}
				}).inject($('avi-map-legend'));
				
				legend_target = new Element('div',{
					id:'avi-map-legend-more',
					style:'display:none'
				}).inject(legend_wrapper);
			}
			if(this.icons.getLength()>2) {
				legend_target = $('avi-map-legend-more');
			}
			var bg_icon = 'http://labs.google.com/ridefinder/images/mm_20_'+ this.options.marker_color[i] +'.png';
			new Element('span',{
				html:data.type,
				style:'background-image:url('+ bg_icon +')'
			}).inject(legend_target);
		} else {
			if(data.is_my==true){	
				var hexcol = this.color_hex.get(data.type);
				var icon_img_star = 'http://chart.apis.google.com/chart?cht=d&chdp=mapsapi&chl=pin_star%27i\\%27[%27-2%27f\\hv%27a\\]h\\]o\\'+hexcol+'%27fC\\000000%27tC\\000000%27eC\\Lauto%27f\\&ext=.png';
				var icon_star = new GIcon(this.baseIcon, icon_img_star, null, 'http://labs.google.com/ridefinder/images/mm_20_shadow.png');
				icon_star.iconSize = new GSize(15, 24);
			}
			var icon = this.icons.get(data.type);
		}
		
		//----- Build window info ----------------------
		var titles = [], contents = [];
    	titles[0] = data.address;
    	if(data.status=='Sold')
    		titles[0] += ' (Sold)';
    	contents[0] = '<table border="0" width="100%"><tr>';
    	
    	if(data.idx == false){
    		if(this.widget==true)
    			var link = site_url + 'search/detail/feat_widget_'+bg_color+'/'+ data.alias +'.html';
    		else
    			var link = site_url + 'search/detail/'+ data.alias +'.html';
	    	var img = site_url + 'listings/photo/'+ data.alias +'/100-1.jpg';
    	}
    	else {
    		if(this.widget == true)
    			var link = site_url + 'search/detail/idx_widget_'+bg_color+'/'+ data.alias +'.html';
    		else
    			var link = site_url + 'search/detail/idx/'+ data.alias +'.html';
	    	var img = this.mirror_link+'rets/photo/'+ data.alias +'/100-1.jpg';
    	}
    	
    	/*if(this.widget){
    		var target = 'target="_blank"';
    	} else {*/
    		var target = '';
    	//}
    	
		contents[0] += '<td width="90"><a href="'+ link +'" '+target+'><img src="' + img + '" width="75" height="75"/></a><br/>&raquo; <a href="'+ link +'" '+target+'>more info</a></td>';
    	contents[0] += '<td><p>MLS&reg; #: <strong>'+data.mls+'</strong></p><p>'+data.br+' br  /  '+data.ba+' ba  /  '+data.lot+'</p><p>Realtor: '+data.realtor+'</p><p>Brokerage: '+data.brokerage+'</p><p>'+data.type+'</p><p class="price">Price: <span>'+data.price+'</span></p></td>';
    	contents[0] += '</tr></table>';
    	
		this.win_info[data.id] = {
			'titles': titles,
			'contents': contents
		};
		var icon_link;
		if(!icon_star) { 
			marker = new GMarker(point, {
				'icon': icon
			});
			icon_link = icon_img;
		} else {
			marker = new GMarker(point, {
				'icon': icon_star
			});
			icon_link = icon_img_star;
			
		}
		
		this.markers_plus[data.lat +','+ data.lng] = new Hash();
		this.markers_plus[data.lat +','+ data.lng].set(data.id,{'content':contents[0],'marker':marker,'icon_link':icon_link,'unit':data.unit,'mls':data.mls,'status':data.status});
		this.counters[data.lat +','+ data.lng] = 0;
		
		Avi.Map.addOverlay(marker);
		Avi.Label.create(data.id, marker, '<strong>MLS&reg; #: '+data.mls+'</strong>$'+data.price+' | ba: '+data.ba +' | br: '+data.br);
		// cache marker
		this.markers.set(data.id, marker);
		
		this.markers_lat_lng[data.lat +','+ data.lng] = data.id;
	    GEvent.addListener(marker, 'click', function(){
			this._open_tab(marker, 0, data.id);
	    }.bind(this));
	    GEvent.addListener(marker, 'ClickTab', function(tab) {
        	this._open_tab(marker, tab, data.id);
        }.bind(this));
		
		return marker;
	},
	
	//------------------------------------------------------
	goto_map: function(id, lat_lng){
		var data = this.listings_data[id];
		if(!data) return;
		
		if(!lat_lng) {
			return false;
		} else {
			var marker = this.markers.get(id);
			if(!marker) {
				marker = this._build_marker(data);
			}
			var zoom = Avi.Map.getZoom();
			if (zoom < 16) zoom = 16;
				
			Avi.Map.setCenter(new GLatLng(data.lat, data.lng), zoom);
			this._open_tab(marker, 0, id);
		}
		
		// switch tab
		if (!this.elements.tab_map.hasClass('selected')) {
			//this.elements.tab_search.removeClass('selected');
			this.elements.tab_list.removeClass('selected');
			this.elements.tab_map.addClass('selected');

			this.elements.search_wrapper.addClass('hidden');
			this.elements.list_wrapper.addClass('hidden');
			this.elements.map_wrapper.removeClass('hidden');
		}
	},
	
	//------------------------------------------------------
	_paging: function(current_page, per_page, total_page) {
		// build paging
		var num_page = Math.ceil(total_page / per_page);
		var html_page = '';
		//alert('num: '+num_page+', cur: '+current_page+', per: '+per_page+', total: '+total_page);
		if(num_page > 10) {
			if(current_page==0) {
				html_page += '<span>&laquo; first</span> | ';
			} else {
				html_page += '<a onclick="Avi.Search.goto_page(0)">&laquo; first</a> | ';
			}
		}
		
		if(current_page==0) {
			html_page += '<span>&laquo; prev</span> | ';
		} else {
			html_page += '<a onclick="Avi.Search.goto_page(' + (current_page - 1) + ')">&laquo;  prev</a> | ';
		}
		
		var start=0, end=num_page;
		if(num_page>18) {
			start = current_page - 5;
			if (start < 0) start = 0;
			
			end = start + 8;
			if(end > num_page) end = num_page;					
		}
		
		if(start > 5) {
			for (i=0; i < 3; i++) {
				html_page += '<a onclick="Avi.Search.goto_page(' + i + ')">' + (i + 1) + '</a> | ';
			}
			html_page += '<span> ... </span> | ';
		}
		
		for (i=start; i < end; i++) {
			if (i == current_page) {
				html_page += '<span class="current-page">&nbsp;&nbsp;' + (i + 1) + '&nbsp;&nbsp;</span> | ';
			} else {
				html_page += '<a onclick="Avi.Search.goto_page(' + i + ')">' + (i + 1) + '</a> | ';
			}
		}
		
		if(end < num_page-5) {
			html_page += '<span> ... </span> | ';
			for (i=num_page-3; i < num_page; i++) {
				html_page += '<a onclick="Avi.Search.goto_page(' + i + ')">' + (i + 1) + '</a> | ';
			}
		}
		if(current_page==num_page-1) {
			html_page += '<span> next &raquo;</span>';
		} else {
			html_page += '<a onclick="Avi.Search.goto_page(' + (current_page + 1) + ')"> next &raquo;</a>';
		}
		if(num_page > 10) {
			if(current_page==num_page-1) {
				html_page += '| <span> last &raquo;</span>';
			} else {
				html_page += ' | <a onclick="Avi.Search.goto_page(' + (num_page - 1) + ')"> last &raquo;</a>';
			}
		}
		
		return html_page;
	},
	/*
	//------------------------------------------------------
	close_preview: function() {
		this.elements.overlay.setStyle('display','none');
		this.elements.details_modal.setStyle('display','none');
	},
	
	//------------------------------------------------------
	open_preview: function(id) {
		if (!this.elements.details_modal) {
			this.elements.details_modal = new Element('div', {'id': 'avi-search-detail-modal'}).inject(document.body);
		}
		var data = this.listings_data[id];
		if(data.detail_loaded != true) {
			this.loader_show(true);
			new Request.JSON({
				url: this.url + '/_ajax_get_detail', 
				onComplete: function(respons){
					this.loader_show(false);
					if(respons.success != true) {
						this.elements.overlay.setStyle('display','none');
						return;
					}
					
					this.listings_data[id] = respons.data;
					this.listings_data[id].detail_loaded = true;
					this.open_preview(id); // memamanggil dirinya sendiri
				}.bind(this)
			}).post({id:id});
		}
		
		this.elements.details_modal.set('html','<a onclick="Avi.Search.close_preview()">close</a>');
		
		
		
		// tampilkan data ke format data
		this.elements.overlay.setStyle('display','block');
		this.elements.details_modal.setStyle('display','block');
	},
	
	//------------------------------------------------------
	loader_show: function(show) {
		if(!this.elements.overlay) {
			this.elements.overlay = new Element('div', {
				id: 'avi-search-overlay',
				styles: {
					opacity:0.5,
				}
			}).inject(document.body);
			this.elements.loading_indicator = new Element('div', {
				id: 'avi-search-loader'
			}).inject(document.body);
		}
		
		if(show==true) {
			this.elements.overlay.setStyle('display','block');
			this.elements.loading_indicator.setStyle('display','block');
		} else {
			this.elements.overlay.setStyle('display','none');
			this.elements.loading_indicator.setStyle('display','none');
		}
	},
	*/
	
	//------------------------------------------------------
	_build_search_term: function() {
		var form_el = this.elements.form.getElements('input, select, textarea', true), form_data = new Hash();
		form_el.each(function(el){
			
			if (!el.name || el.disabled || el.type == 'submit' || el.type == 'reset' || el.type == 'file') return;
			var value = (el.tagName.toLowerCase() == 'select') ? Element.getSelected(el).map(function(opt){
				return opt.value;
			}) : ((el.type == 'radio' || el.type == 'checkbox') && !el.checked) ? null : el.value;
			$splat(value).each(function(val){
				if (typeof val != 'undefined' && val != '' && val != 'null' && val != null) {
					var name_ = el.name;
					if(el.type == 'checkbox' && el.name.contains('[]')) {
						name_ = el.name.replace('[]','');
						var arr = form_data.get(name_);
						if(arr) {
							arr.push(val);
							val = arr;
						} else {
							val = [val];
						}	
					}
					form_data.set(name_, val);
				}
			}.bind(this));
		}.bind(this));
		
		
		var at = form_data.get('at');
		if(at){
			if(!at.contains('custom')) {
				/*var province = this._get_province(idx_feed);
				if(!at.contains(province) && province!='' && province!='undefined' && province!='null'){
					at += ' '+province+' Canada';
				}*/
				form_data.set('at', at);
			}
		}
		
		
		str = '';
		if(form_data.get('keyword')) {
			str = form_data.get('keyword') + ' ';
		}
		
		// handle price
		if(form_data.has('price_min') == true)
			var minprice = form_data.get('price_min').replace(/^\s*|\s*$/g,'');
		if(form_data.has('price_max') == true)
			var maxprice = form_data.get('price_max').replace(/^\s*|\s*$/g,'');
		
		if(/Any/.test(minprice) == false && /Any/.test(maxprice) == false){
			form_data.set('price',minprice+'-'+maxprice);
		} else if(/Any/.test(minprice) == false && /Any/.test(maxprice) == true){
			form_data.set('price', minprice+'+');
		} else if(/Any/.test(minprice) == true && /Any/.test(maxprice) == false){
			form_data.set('price',maxprice+'-');
		}
		form_data.erase('price_min');
		form_data.erase('price_max');
		
		
		form_data.each(function(val, key){
			if(key == 'keyword') return; // skip keyword karena sudah ditambahkan diatas
			
			if ($type(val) == 'array') {
				val = val.join('|');
			} else {
				val = val.replace(':','%3A');
			}
			
			if (val.contains(' ')) { // tambahkan kutip jika term mengandung spasi
				val = '"' + val + '"';
			}
			str += key +':'+ val +' ';
		}, this);
		
		return {'str': str, json: form_data};
	},
	
	//------------------------------------------------------
	_checkbox_init: function(clicked, group) {
		if(clicked.checked == true) return true;
		for (var i=0, j=group.length; i<j; i++) {
			if(group[i].checked) {
				return true;
			}
		}
		clicked.checked = true;
		return true;
	},
	
	//------------------------------------------------------
	_open_tab: function(marker, tab_number, marker_name) {
		Avi.Label.current = marker_name;
		Avi.Label.leave(marker_name);
		
		if(!this.win_info[marker_name]) return false;
		
		var contents=this.win_info[marker_name].contents, titles=this.win_info[marker_name].titles;
		if (titles.length > 1) {
			var html= '<div class="title"><ul>';
			for (var i=0; i<titles.length; i++) {
				if (i==tab_number) {
					html+='<li class="active" onclick="GEvent.trigger(Listing.marker[\''+marker_name+'\'],\'ClickTab\','+i+')">' + titles[i] + '</li>';
				} else {
					html+='<li onclick="GEvent.trigger(Listing.marker[\''+marker_name+'\'],\'ClickTab\','+i+')">' + titles[i] + '</li>';
				}
			}
			html += '</ul></div><div class="content">' + contents[tab_number] + '</div>';
		} else {
			html = '<div class="title"><span>'+titles[0]+'</span></div><div class="content">'+contents[0]+'</div>';
		}
		html = '<div class="info-window-wrapper">'+html+'</div>';
		this.ew.openOnMarker(marker,html);
	},
	
	//------------------------------------------------------
	_slider_init: function(slider_id) {
		if(this.init[slider_id] == true) return false;
		
		var label_value = this.options[slider_id +'_val'];
		var slider_el = $(slider_id), el = slider_el.getChildren(), label_el = $(slider_id +'_label'), input_el = $(slider_id +'_input');
		
		// parse slider value
		var val = input_el.get('value'), min = 0, max = label_value.length - 1, x;
		if(val.clean() != '') {
			if(val.contains('+')) {
				val = val.replace('+', '');
				if(!isNaN(val)) val *= 1; // convert into numeric
				x = label_value.indexOf(val);
				if(x != -1) min = x;
			} else if(val.contains('-')) {
				val = val.split('-');
				if(!isNaN(val[0])) val[0] *= 1; // convert into numeric
				if(!isNaN(val[1])) val[1] *= 1; // convert into numeric
				
				if(val[1] == '') {
					x = label_value.indexOf(val[0]);
					if(x != -1) max = x;
				} else {
					// min
					x = label_value.indexOf(val[0]);
					if(x != -1) min = x;
					// max
					x = label_value.indexOf(val[1]);
					if(x != -1) max = x;
				}
			}
		}
		
		new Slider(slider_el, el[1], el[0], {
			start: 0,
			end: label_value.length - 1,
			offset:0,
			knobheight: 21,
			knobwidth: 15,
			onChange: function(pos){
				var _min='', _max='', label='';
				if($type(pos)=='object'){
					_min = label_value[pos.minpos];
					_max = label_value[pos.maxpos];
					if(_min == _max && _min == 0) {
						html = 'any';
						input_el.set('value', '');
					} else {
						if(pos.minpos == 0) {
							html = 'max ' + _max;
							input_el.set('value', _max + '-');
						} else if(pos.maxpos == label_value.length-1) {
							html = 'min ' + _min;
							input_el.set('value', _min + '+');
						} else {
							html = _min + ' to ' + _max;
							input_el.set('value', _min + '-' + _max);
						}
					}
				} else {
					if(html == 0) {
						html = 'any';
						input_el.set('value', '');
					} else {
						html = label_value[pos];
						input_el.set('value', label_value[pos]);
					}
				}
				label_el.set('html', html);
			}.bind(this)
		}, el[2]).setMin(min).setMax(max);
		
		this.init[slider_id] = true;
	},
	
	
	//------------------------------------------------------
	captcha_refresh: function() {
		var img = $('captcha-img');
		if(!img) return;
		var rand = Math.round(Math.random() * 100000);
		img.src = this.url + 'captcha/rand-' + rand + '.jpg';
		$('s-captcha').value = '';
	},
	
	//------------------------------------------------------
	mail_alert: function(evt) {
		var last_search = this.search_history.getLast();
		if (!last_search) {
			alert('please search something');
			return;
		}
		if($type(evt) != 'string') evt.stop();
		if (!this.Modal) {
			this.Modal = new Avi_Modal();
		}
		if (!this.modal_mail_alert) {
			var html = '';
			html += '<font color="red" id="error-msg"></font>'; 
			html += '<p>Enter your name and email address below to be notified when new listings appear that match your search criteria.<br/></p>';
			html += '<form onsubmit="return false;">';
			html += '<p><label>Your Name: </label><span><input id="s-name" type="text" size="28"/></span><br clear="both"/></p>';
			html += '<p><label>Your Email: </label><span><input id="s-email" type="text" size="28"/></span><br clear="both"/></p>';
			html += '<hr/>';
			html += '<p><strong>Type the words in the image:</strong></p>';
			html += '<p><span><img title="Are you human? type this code" src="http://v2.estatevue.com/public/images/blank.gif" width="150" height="50" id="captcha-img" align="left" style="margin-right:15px"/><input id="s-captcha" type="text" maxlength="5" size="17" autocomplete="off"/><br/><a onclick="Avi.Search.captcha_refresh()">try other image</a></span><br clear="both"/></p>';
			html += '</form>';
			
			this.modal_mail_alert = this.Modal.build({
				title: 'House Tracker',
				html: html,
				width: 320,
				height: 350,
				ok_fn: this.mail_alert_send.bind(this),
				cancel_fn: null,
				ok_label: 'Subscribe',
				cancel_label: 'close'
			});
		}
		
		this.modal_mail_alert.show();
		if($type(evt) == 'string'){
			$('error-msg').set('html',evt);
		}
		this.captcha_refresh();
	},
	
	//------------------------------------------------------
	mail_alert_send: function() {
		var param = {
			name: $('s-name').value.clean(),
			email: $('s-email').value.clean(),
			captcha: $('s-captcha').value.clean()
		};
		
		if(!param.name || !param.email || !param.captcha)
			return false;
		
		var last_search = this.search_history.getLast();
		if (!last_search) {
			alert('please search something');
			return;
		}
		param.terms = last_search.get('json').getClean();
		this.set_busy(true);
		new Request.JSON({
			url: this.url.replace('search','alert') + 'subscribe', 
			onComplete: function(respons) {
				this.set_busy(false);
				if (respons.success == true) {
					var html = 'Congratulations! You have subscribed to our house tracker.';
					if(respons.is_active!=true) html += ' An activation email has been sent to verify your account.  Please check your email.';
					this.Modal.build({
						title: 'House Tracker',
						html: html,
						width: 320,
						height: 150,
						ok_label:null,
						cancel_label: 'close'
					}).show();
				}
				else {
					this.mail_alert(respons.msg);
				}
			}.bind(this),
			onFailure: function() {
				this.set_busy(false);
				alert('Subscription failed. Please try again later.');
			}.bind(this)
		}).post(param);
		return true;
	},
	
	changeProfile : function(){
		this.set_busy(true);
		var last_search = this.search_history.getLast();
		if (!last_search) {
			alert('Please refine your search profile.');
			return;
		}
		param = {'terms':last_search.get('json').getClean(),'id':alert_id};
		new Request.JSON({
			url: this.url.replace('search','alert') + 'changeProfile', 
			onComplete: function(respons) {
				this.set_busy(false);
				this.Modal = new Avi_Modal();
				if (respons.success == true) {
					var html = 'Congratulations, your search profile has been changed successfully.';
					this.Modal.build({
						title: 'House Tracker',
						html: html,
						width: 320,
						height: 150,
						ok_label:null,
						cancel_label: 'close'
					}).show();
				} else {
					var html = 'Your search profile cannot be saved at the moment. Please try again later.';
					this.Modal.build({
						title: 'House Tracker',
						html: html,
						width: 320,
						height: 150,
						ok_label:null,
						cancel_label: 'close'
					}).show();
				}
			}.bind(this),
			onFailure: function() {
				this.set_busy(false);
				alert('Your search profile cannot be saved at the moment. Please try again later.');
			}.bind(this)
		}).post(param);
		return true;
	},
	
	//------------------------------------------------------
	search_tool: function(evt) {
		evt.stop();
		if (!this.Modal) {
			this.Modal = new Avi_Modal();
		}
		if (!this.modal_search_tool) {
			var html = '<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vivamus est. Phasellus sed purus. Sed gravida, odio nec congue tempus, nulla odio iaculis velit, vitae porta sapien nisl eget nunc.</p>';
			html += '<p align="center"><img usemap="#img-map1" src="http://v3.estatevue.com/public/images/search-tools.jpg" width="300" height="69" alt="search on browser and windows7" />';
			html += '<p>need more information? click <a href="http://www.estatevue.com/real-estate-websites/" title="open Estate Vue blog in new window" target="_blank">here</a>.</p>';
			html += '<map name="img-map1" id="img-map1"><area shape="rect" coords="1,0,162,74" href="#" title="add EstateVue search to your favorite browser" onclick="window.external.AddSearchProvider(\''+this.url+'provider/get_search.xml\')" /><area shape="rect" coords="185,0,299,69" title="download Estatevue search for Windows Explorer" href="'+this.url+'provider/windows.osdx" /></map>';
			
			this.modal_search_tool = this.Modal.build({
				title: 'EstateVue Search Tool',
				html: html,
				width: 320,
				height: 300,
				ok_label: false,
				cancel_label:false
			});
		}
		this.modal_search_tool.show();
	}
});


//-------- custom zoom level -----------------
function Avi_Map_Zoom_Control() { }
Avi_Map_Zoom_Control.prototype = new GControl();
Avi_Map_Zoom_Control.prototype.initialize = function(map) {
	
	this.map = map;
	var container = new Element('div',{
		'class': 'avi-zoom'
	});
	
	var knob_area = new Element('div', {
		'class': 'avi-zoom-knob-area'
	}).inject(container);
	
	var gutter= new Element('img', {
		src: 'http://v2.estatevue.com/public/images/blank.gif',
		'class': 'avi-zoom-gutter'
	}).inject(knob_area);
	
	var knob = new Element('img', {
		src: 'http://v2.estatevue.com/public/images/blank.gif',
		'class': 'avi-zoom-knob',
		title:'drag to zoom map'
	}).inject(knob_area);
	
	var zoom_in = new Element('img', {
		src: 'http://v2.estatevue.com/public/images/blank.gif',
		'class': 'avi-zoom-in',
		title:'zoom in',
		events: {
			click: function() {
				var z = MAX_ZOOM_LEVEL - this.map.getZoom() - 1;
				if(z < 0) return;
				this.slider.set(z);
			}.bind(this)
		}
	}).inject(container, 'top');
	
	var zoom_out = new Element('img', {
		src: 'http://v2.estatevue.com/public/images/blank.gif',
		'class': 'avi-zoom-out',
		title:'zoom out',
		events: {
			click: function() {
				var z = MAX_ZOOM_LEVEL - this.map.getZoom() + 1;
				if(z > MAX_ZOOM_LEVEL - MIN_ZOOM_LEVEL + 1) return;
				this.slider.set(z);
			}.bind(this)
		}
	}).inject(container);
	
	container.inject(map.getContainer());

	this.slider = new Slider(knob_area, knob, {
		snap:true,
		steps: MAX_ZOOM_LEVEL - MIN_ZOOM_LEVEL + 1,
		initialStep: this.map.getZoom() - MAX_ZOOM_LEVEL,
		mode:'vertical',
		onChange: function(pos){
			this.map.setZoom(MAX_ZOOM_LEVEL - pos);
		}.bind(this)
	});

	// Listen for other things changing the zoom level and move the slider
	GEvent.addListener(map, 'zoomend', function(a,zoom){this.slider.set(MAX_ZOOM_LEVEL - zoom);}.bind(this));

	return container;
};
Avi_Map_Zoom_Control.prototype.getDefaultPosition = function() {
	return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(7, 7));
};

//-------- custom map type -----------------
function Avi_Map_Type() { }
Avi_Map_Type.prototype = new GControl();
Avi_Map_Type.prototype.initialize = function(map){
	this.map = map;
	var container = new Element('div', {
		'class':'avi-map-type'
	});
	var ul = new Element('ul').inject(container);
	var t_map = new Element('li', {
		'id':'map',
		'class':'selected',
		events: {
			click: function(){
				if (t_map.hasClass('selected')) 
					return true;
				t_map.addClass('selected');
				selected.removeClass('selected');
				selected = t_map;
				
				map.setMapType(G_NORMAL_MAP);
				
				return true;
			}
		}
	}).inject(ul);
	var t_satellite = new Element('li', {
		id:'satellite',
		events: {
			click: function(){
				if (t_satellite.hasClass('selected')) 
					return true;
				t_satellite.addClass('selected');
				selected.removeClass('selected');
				selected = t_satellite;
				
				map.setMapType(G_SATELLITE_MAP);
				
				return true;
			}
		}
	}).inject(ul);
	var t_hybrid = new Element('li', {
		id:'hybrid',
		events: {
			click: function(){
				if (t_hybrid.hasClass('selected')) 
					return true;
				t_hybrid.addClass('selected');
				selected.removeClass('selected');
				selected = t_hybrid;
				
				map.setMapType(G_HYBRID_MAP);
				
				return true;
			}
		}
	}).inject(ul);
	var selected = t_map;
	container.inject(map.getContainer());
	
	return container;
};
Avi_Map_Type.prototype.getDefaultPosition = function() {
	return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(7, 7));
};



//---- custom map legend ----------
function Avi_Map_Legend() { }
Avi_Map_Legend.prototype = new GControl();
Avi_Map_Legend.prototype.getDefaultPosition = function() {
	return new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(7, 23));
};
Avi_Map_Legend.prototype.initialize = function(map){
	this.map = map;	
	
	var container = new Element('div', {
		'class':'avi-map-legend',
		'id':'avi-map-legend',
		html:'<h4>Map Legend</h4>',
		styles:{opacity:.6}
	});
	container.addEvents({
		'mouseenter':function(){
			this.setStyle('opacity',1);
		},
		'mouseleave':function(){
			this.setStyle('opacity',.8).removeClass('avi-map-legend-hover');
		}
	});
	container.inject(map.getContainer());
	new Element('span',{
		html:'My Listing',
		style:'background-image:url('+public_url+'images/my_listing.png)'
	}).inject(container);
	new Element('span',{
		html:'Multiple Listings',
		style:'background-image:url('+public_url+'images/multiple_listing.png)'
	}).inject(container);
	return container;
};


window.addEvent((Browser.Engine.trident ? 'load' : 'domready'), function() {
		if(widget==true){
			if($type($('si_last'))=='element')
				$('si_last').setStyle('height','24px');
		}
		
		if (!GBrowserIsCompatible()) {
			alert('Your browser is NOT compatible to view our map, please use other web browser.');
			return false;
		}
		
		var pos = {
			lat: default_lat_val,
			lng: default_lng_val
		};
		
		
		Avi.Search = new Avi_Search();
		var search_tab = $('tab_search');
		if(search_tab) {
			search_tab.addEvent('click', function(){
				if(Avi.Map_Polygon) {
					Avi.Map_Polygon.fix_position(); 
				} else {
					if($type(Avi.Polygon_Data) != 'object') 
						Avi.Polygon_Data = {name:'',points:[]};
					
					Avi.Map_Polygon = new Avi_gMap_Polygon('map-canvas', Avi.Polygon_Data, pos);
				}
			});
		}
		
		Avi.Map = new GMap2(Avi.Search.elements.map_wrapper,{enableZoomLevelLimits:true});
		Avi.Map.setCenter(new GLatLng(pos.lat, pos.lng), 15);
		Avi.Map.enableDoubleClickZoom();
		Avi.Label = new Avi_Marker_Label(Avi.Map, {classname:'avi-label',offset: {width:59,height:18}});
		
		if(Avi.Polygon_Data) {
			var ps = [];
			Avi.Polygon_Data.points.each(function(latlng){
				latlng = latlng.split(' ');
				ps.push(new GLatLng(latlng[0], latlng[1]));
			});
	
			// add polygon to search map
			Avi.Polygon = new GPolygon(ps, '#008000', 2, 0.7, '#008000', 0.2);
			
			var pbound = Avi.Polygon.getBounds(), center = pbound.getCenter();
			
			Avi.Map.addOverlay(Avi.Polygon);
			Avi.Map.setZoom(Avi.Map.getBoundsZoomLevel(pbound) + 1);
			Avi.Map.setCenter(pbound.getCenter());
			
			//
			var customarea_a = $('sicustomareaw').getElement('a');
			if(customarea_a) {
				customarea_a.addEvent('click', Avi.Search.remove_polygon);
			}
			
		}
		
		pos = {};
		
		//-------- Restricting the range of Zoom Levels -----------------
		var mt = Avi.Map.getMapTypes(); // Get the list of map types
		// Overwrite the getMinimumResolution() and getMaximumResolution() methods
		for (var i=0; i<mt.length; i++) {
			mt[i].getMinimumResolution = function() {return MIN_ZOOM_LEVEL;}
			mt[i].getMaximumResolution = function() {return MAX_ZOOM_LEVEL;}
		}
		
		
		//---- assign custom controll to map --------
		Avi.Map.addControl(new Avi_Map_Type());
		Avi.Map.addControl(new Avi_Map_Zoom_Control());
		Avi.Map.addControl(new Avi_Map_Legend());
		
		Avi.Search.ew = new EWindow(Avi.Map, E_STYLE_7);
		Avi.Map.addOverlay(Avi.Search.ew);
		GEvent.addListener(Avi.Map, 'click', function(overlay, point){
			if (!overlay) {
				Avi.Search.ew.hide();
			}
		});
		// Add a move listener to restrict the bounds range
		/* # IM
		GEvent.addListener(Avi.Map, 'move', function() {
			Avi.Search._move_bounds();
		});
		*/
		
		// check queue
		if(Avi.Search.marker_queue) {
			if(Avi.Search.marker_queue.length > 0) {
				for(var i=0, j=Avi.Search.marker_queue.length; i<j; i++) {
					Avi.Map.addOverlay(Avi.Search.marker_queue[i]);
				}
			}
		}
		
		if(default_view == 'list'){
			$('search-result-list').removeClass('hidden');
			$('search-result-map').addClass('hidden');
		}
		
		window.addEvent('unload', function(){GUnload();});
		var hash = window.location.hash;
		if(!hash) {
			Avi.Search.search();
		}
		if(default_view == 'list'){
			$('tab_map').removeClass('selected');
			$('tab_list').addClass('selected');
		}
		
		
		new Avi_Search2();
	});


var Avi_Modal = new Class({
	modals:[],
	elements: {},
	options: {
		title:null,
		html:'',
		width:300,
		height:300,
		ok_fn: null,
		cancel_fn: null,
		ok_label: 'OK',
		cancel_label:'Cancel'
	},
	
	initialize: function(opts) {
		this.options = $merge(this.options, opts);
		this.elements.modal = new Element('div', {
			'class': 'avi-modal',
			styles:{
				position:'fixed',
				display:'none'
			}
		}).inject(document.body);
	},
	
	//----------------------------
	build: function(options) {
		options = $merge(this.options, options);
		var wrapper = new Element('form',{
			'class':'avi-modal-wrapper',
			styles: {
				width: options.width
			}
		});
		
		if(options.title) {
			new Element('h3',{'class':'avi-modal-title',html:options.title}).inject(wrapper);
		}
		new Element('div',{
			'class':'avi-modal-content',
			html:options.html,
			styles:{
				height:options.height - 70
			}
		}).inject(wrapper);
		var footer = new Element('div',{'class':'avi-modal-footer'}).inject(wrapper);
		if(!this.ok_label && !options.cancel_label) {
			new Element('button',{
				text:'close',
				events:{
					click:this.hide.bind(this)
				}
			}).inject(footer);
		} else {
			if (options.ok_label) {
				new Element('button', {
					text: options.ok_label,
					events: {
						click: function(){
							var close = true;
							if ($type(options.ok_fn)=='function') 
								close = options.ok_fn.run();
							if(close !== false)
								this.hide();
							return false;
						}.bind(this)
					}
				}).inject(footer);
			}
			if (options.cancel_label) {
				new Element('button', {
					text: options.cancel_label,
					events: {
						click: function(){
							if ($type(options.cancel_fn)=='function') {
								options.cancel_fn.run();
							}
							this.hide();
						}.bind(this)
					}
				}).inject(footer);
			}
		}
			
		var i = this.modals.length;
		var modal = {
			el: wrapper,
			options: options,
			show: function(num) {
				this.show(num);
			}.bind(this, i),
			hide: function() {
				this.hide();
			}.bind(this)
		};
		this.modals.push(modal);
		
		return modal;
	},
	
	//----------------------------
	show: function(num) {
		var m = this.modals[num];
		if(!m) return false;
		this.elements.modal.set('html','');
		m.el.inject(this.elements.modal);	
		
		this.elements.modal.setStyles({
			display:'',
			top: ((window.getHeight() - m.options.height)/2).toInt(),
			left: ((window.getWidth() - m.options.width)/2).toInt()
		});
		return true;
	},
	//----------------------------
	hide: function() {
		this.elements.modal.setStyle('display','none');
		return false;
	},
	//----------------------------
	fade: function(num) {
	},
	//----------------------------
	unfade: function(num) {
	}
	
});

var JB_Modal = new Class({
	modals:[],
	elements: {},
	trigger: null,
	options: {
		title:null,
		html:'',
		width:775,
		height:500,
		ok_fn: null,
		cancel_fn: null,
		ok_label: 'OK',
		cancel_label:'Cancel'
	},
	
	initialize: function(opts) {
		this.options = $merge(this.options, opts);
		this.elements.modal = new Element('div', {
			'class': 'jb-modal',
			styles:{
				position:'fixed',
				display:'none'
			}
		}).inject(document.body);
	},
	
	//----------------------------
	build: function(options,trigger) {
		options = $merge(this.options, options);
		this.trigger = $(trigger).getParent().getParent();
		var wrapper = new Element('form',{
			'class':'jb-modal-wrapper',
			'id':'jb-modal-wrapper',
			styles: {
				width: options.width
			}
		});
		
		
		var header = new Element('h3',{'class':'jb-modal-title'}).inject(wrapper);
		new Element('img',{
			src: public_url + 'images/closelabel.gif',
			style: 'cursor:pointer',
			events: {
				click : this.hide.bind(this)
			}
		}).inject(header);
		
		new Element('div',{
			'class':'jb-modal-content',
			'id':'jb-modal-content',
			html:options.html,
			styles:{
				height:options.height - 70
			}
		}).inject(wrapper);
			
		var i = this.modals.length;
		var modal = {
			el: wrapper,
			options: options,
			show: function(num) {
				this.show(num);
			}.bind(this, i),
			hide: function() {
				this.hide();
			}.bind(this)
		};
		this.modals.push(modal);
		
		return modal;
	},
	
	//----------------------------
	show: function(num) {
		var y = this.trigger.offsetTop;
		var m = this.modals[num];
		if(!m) return false;
		this.elements.modal.set('html','');
		m.el.inject(this.elements.modal);	
		var top_pos = ((window.getHeight() - m.options.height)/2).toInt();
		if(widget){
			if(y < (m.options.height/2))
				top_pos = 25;
		}
		this.elements.modal.setStyles({
			display:'',
			top: top_pos,
			left: ((window.getWidth() - m.options.width)/2).toInt()
		});
		return true;
	},
	//----------------------------
	hide: function() {
		this.elements.modal.setStyle('display','none');
		return false;
	},
	//----------------------------
	fade: function(num) {
	},
	//----------------------------
	unfade: function(num) {
	}
	
});

/**
 * Check all checkbox 
 * 
 * @param STRING theform FORM element id
 * @param STRING cb_name checkbox element name
 * @return void
 **/
function checkAll(wrapper, cb_name, check) {
	var wrapper = $type(wrapper)=='element' ? wrapper : $(wrapper);
	if (!wrapper) return false;
	var cb = wrapper.getElements('input[name^='+cb_name+']');
	if (!cb) return false;
	var val = [];
	cb.each(function(el){
		el.checked = check;
	});
	return true;
}




var Avi_gMap_Polygon = new Class({
	Implements: Options,
	options: {
		zoom : 12,
		lat:-6.211544, 
		lng: 106.845172,
		mapTypeControl : true,
		zoomControl : true
	},
	MAP: null,
	POLY: null,
	shapeCounter: 0,
	color: '#008000',
	polygon: {name:'',points:[]},
	redo_points: [],
	hints: ['Click the map to begin drawing a shape', 'Click another point to define the shape','Add more points, or click the 1st point to complete',' Drag any point to adjust its location, or click Search'],
	
	
	initialize: function(map_id, polygon, options) {
		this.setOptions(options);
		this.tooltip = new Avi_Map_Tooltip();
		
		var map_container = document.getElementById(map_id);
		map_container.addEvents({
			mouseenter: function(){
				if(this.tooltip_hidden == false) 
				this.tooltip.show();
			}.bind(this),
			mouseleave: function(){
				this.tooltip.hide();
			}.bind(this),
			mousemove: function(e){
				if(this.tooltip_hidden == false) 
				this.tooltip.reposition(e);
			}.bind(this),
			click: this.tooltip_update.bind(this)
		});
		this.tooltip_update();
		
		
        this.MAP = new GMap2(map_container, {enableZoomLevelLimits:true, draggableCursor:'default',draggingCursor:'pointer'});
        this.MAP.setCenter(Avi.Map.getCenter(),Avi.Map.getZoom());
        this.MAP.disableScrollWheelZoom();
        this.MAP.disableDoubleClickZoom();
        this.MAP.enablePinchToZoom();
        this.MAP.setZoom(this.options.zoom);
        this.MAP.addControl(new Avi_Map_Type());
        this.MAP.addControl(new Avi_Map_Zoom_Control());
        

        // limit minimal zoom
        var mt = this.MAP.getMapTypes();
        for (var i=0; i<mt.length; i++) {
        	mt[i].getMinimumResolution = function() {return MIN_ZOOM_LEVEL;};
			mt[i].getMaximumResolution = function() {return MAX_ZOOM_LEVEL;};
        }	
		

		if(polygon.points.length > 0) {
			this.polygon = polygon;
			var ps = [];
			this.polygon.points.each(function(latlng){
				latlng = latlng.split(' ');
				ps.push(new GLatLng(latlng[0], latlng[1]));
			});
			
			
			// add polygon to interactive search map
			this.POLY = new GPolygon(ps, this.color, 2, 0.7, this.color, 0.2);
			this.MAP.addOverlay(this.POLY);
			this.draw_end();
		}
		else {
			this.draw_start();
		}
	},
	
	
	tooltip_update: function(){
		var str = '';
        if(this.POLY) {
			var i = this.POLY.getVertexCount();
			if(i == 0) str = this.hints[0];
			else if(i < 4) str = this.hints[1];
			else if(i >= 4) str = this.hints[2];
		} else {
			str = this.hints[0];
		} 
		this.tooltip.set(str);
	},
	
	
	fix_position: function(){
		var c = this.MAP.getCenter();
		this.MAP.checkResize();
		this.MAP.setCenter(c);
	},
	
	
	set_center: function(lat,lng) {
		if(this.MAP) {
			this.MAP.setCenter(new GLatLng(lat, lng));
		}
	},

	
	draw_start: function(){
		this.clear_polygon();
		this.POLY = new GPolygon(this.polygon.points, this.color, 2, 0.7, this.color, 0.2);
		
		this.MAP.addOverlay(this.POLY);
		this.POLY.enableDrawing({maxVertices:15});

//		GEvent.addListener(this.POLY, "lineupdated", function() {
//		}.bind(this));
		GEvent.addListener(this.POLY, "endline", this.draw_end.bind(this));
	},
	
	
	draw_end: function(){
		this.tooltip.hide();
		this.tooltip_hidden = true;
		
		this.POLY.enableEditing({onEvent: "mouseover"});
		this.POLY.disableEditing({onEvent: "mouseout"});
		GEvent.addListener(this.POLY, "click", function(latlng, index) {				
			if (typeof index == "number") {
				this.POLY.deleteVertex(index);
				if(this.POLY.getVertexCount() < 3){
					this.draw_start();
				}
			}
		}.bind(this));
		
		//this.save();
	},
	
	
	clear_polygon: function(){
		this.MAP.clearOverlays();
		
		this.polygon.name = '';
		this.polygon.points = [];
		this.tooltip_hidden = false;
		this.tooltip.set(this.hints[0]);
	},
	
	
	_get_vertex: function(){
		var points = [], i = 0, vc = this.POLY.getVertexCount();
		for(i;i<vc;i++) {
			var ll = this.POLY.getVertex(i);
			points.push(ll.lat() +' '+ ll.lng());
		}
		return points;
	},
	
	
	save: function() {
		this.polygon.points = this._get_vertex();
		var n = this.polygon.points.length, m = n - 1; // last pointer
		if(n < 3) return false;
		if(!this.polygon.name) {
			if(!this.polygon.name) {
				this.polygon.name = 'area' + (++this.shapeCounter);
			}
		}
		
		// validate is polygon closed
		if(this.polygon.points[0] != this.polygon.points[m]) {
			this.polygon.points[n] = this.polygon.points[0];
		}
		
		// bound
		var pb = this.POLY.getBounds(),
			swb = pb.getSouthWest(),
			neb = pb.getNorthEast();
		
		this.polygon.bound = {
			sw: swb.lat() +' '+ swb.lng(), 
			ne: neb.lat() +' '+ neb.lng()
		};
		
		return this.polygon;
	},
	
	
	undo: function() {
		var vc = this.POLY.getVertexCount() - 1;
		if(vc < 0) return false;

		var ll = this.POLY.getVertex(vc);
		this.redo_points.push(ll);
		this.POLY.deleteVertex(vc);
//		this.POLY.enableDrawing();
	},
	
	redo: function() {
		var pointer = this.redo_points.length - 1,
			vc = this.POLY.getVertexCount();
		
		if(pointer < 0) return false;
		
		this.POLY.insertVertex(pointer, this.redo_points[pointer]);
		this.POLY.enableDrawing({});
		this.redo_points[pointer] = null;
		this.redo_points = this.redo_points.clean();
	}
});


var Avi_Search2 = new Class({
	elements:{},
	
	initialize: function() {
		$('clear-polygon').addEvent('click', function(){Avi.Map_Polygon.draw_start();});
		$('do-search2').addEvent('click', this.submit.bind(this));
		this.elements.div = $('iskpt');
		this.check_all_id = 'istcball';
		
		if(!this.elements.div) return false;
		
		this.elements.checkall = this.elements.div.getElement('input[id='+ this.check_all_id +']');
		this.elements.checkboxes = this.elements.div.getElements('input[id!='+ this.check_all_id +']');
		this.elements.pmin = $('ispmini');
		this.elements.pmax = $('ispmaxi');
		this.elements.br = $('isbbri');
		this.elements.ba = $('isbbai');
		this.elements.kw = $('iskwi');
		
		this.num_cb = this.elements.checkboxes.length;
		if(this.num_cb > 0) {
			this.elements.checkboxes.addEvent('click', this.click.bind(this));
			this.elements.checkall.addEvent('click', this.toggle_check_all.bind(this));
		}
		
		this.elements.pmin.addEvent('keyup',this.price_update.bind(this, this.elements.pmin));
		this.elements.pmax.addEvent('keyup',this.price_update.bind(this, this.elements.pmax));
	},
	
	
	click: function() {
		var num_checked = this.elements.div.getElements('input[id!='+ this.check_all_id +']:checked').length;
		this.elements.checkall.checked = (this.num_cb == num_checked);
	},
	
	
	toggle_check_all: function() {
		this.elements.checkboxes.setProperty('checked', this.elements.checkall.checked ? 'checked'  : '');
	},
	
	
	submit: function() {
		var terms = {},
			polygon = Avi.Map_Polygon.save();
		
		if(polygon == false) {
			alert('Please click the map to draw your search area.');
			return false;
		}
		
		// PRICE
		var min = parseInt(this.elements.pmin.value.replace(/\,/g,'')),
			max = parseInt(this.elements.pmax.value.replace(/\,/g,''));
		
		if(isNaN(min)) min = 0;
		if(isNaN(max)) max = 5000000;
		
		if(min == 0 && max != 0){
			terms.price = [0, 5000000];
		} else if(min != 0 && max == 0){
			terms.price = [min, 5000000];
		} else if(min != 0 && max != 0){
			// validate price range
			this.price_range();
			min = this.elements.pmin.value.replace(/\,/g,'').toInt(),
			max = this.elements.pmax.value.replace(/\,/g,'').toInt();
			terms.price = [min, max];
		}
		// -- END PRICE
		
		// TYPE
		if(this.elements.checkall.checked) {
			terms.type = 'all';
		} else {
			var checked =  this.elements.div.getElements('input[id!='+ this.check_all_id +']:checked');
			if(checked.length > 0) {
				terms.type = [];
				checked.each(function(cb){
					terms.type.push(cb.value);
				}.bind(this));
			}
		}
		// -- END TYPE
		
		// BA & BR
		if(this.elements.br.value!='Any') terms.bedrooms = this.elements.br.value;
		if(this.elements.ba.value!='Any') terms.bathrooms = this.elements.ba.value;
		
		var kw = this.elements.kw.value.clean();
		if(kw) terms.keyword = kw;
		
		if(polygon.points != []) { // selected custom area 
			terms.at = polygon.name;
			terms.points = polygon.points;

			// save selected area
			new Request.JSON({
				url: site_url + 'search/polygon_save', 
				onComplete: function(result){
					this.toSearch(terms);
				}.bind(this)
			}).post(polygon);
		}
		else {
			this.toSearch(terms);
		}
	},
	
	
	price_update: function(el){
		var v = number_format (el.value.replace(/\,/g,''),0);
		el.value = v;
	},
	
	
	price_range: function(){
		var min = this.elements.pmin.value.replace(/\,/g,'').toInt(),
			max = this.elements.pmax.value.replace(/\,/g,'').toInt();
		
		if(min > max) { // switch value
			var mi = this.elements.pmin.value;
			
			this.elements.pmin.value = this.elements.pmax.value;
			this.elements.pmax.value = mi;
		}
	},
	
	
	price2option: function(price) {
		if(price > 5000000) {
			return '5M+';
		} else if(price >= 1000000) {
			return number_format(price/1000000, 2).replace('.00','') + 'M';
		} else { // price < 1000
			return number_format(price/1000, 2).replace('.00','') + 'K';
		}
	},
	
	
	option2price: function(val) {
		if (val == '5M+') val = 5000000;
		else {
			if(val.contains('M')) 
				val = val.replace('M','') * 1000000;
			else
				val = val.replace('K','') * 1000;
		}
		return parseInt(val);
	},
	
	
	toSearch: function(terms){
		$('search-form').reset();
		$('at').value = 'custom-'+terms.at;
		if(terms.keyword) 
			$('keyword').value = terms.keyword;
		
		if(terms.bedrooms) {
			var br = $('st_br_input').getElement('option[value='+terms.bedrooms+']');
			if(br) br.selected = true;
		}
		if(terms.bathrooms) {
			var ba = $('st_ba_input').getElement('option[value='+terms.bathrooms+']');
			if(ba) ba.selected = true;
		}
		
		
		// PROPERTY TYPE 
		if(terms.type) {
			var cb_parent = $('propertytype-modal');
			if(terms.type == 'all') {
				cb_parent.getElements('input[type=checkbox]').setProperty('checked','checked');
			} else {
				var cbs = cb_parent.getElements('input[type=checkbox]');
				cbs.each(function(cb){
					cb.checked = terms.type.indexOf(cb.value)>-1;
				});
			}
		}
		// -- END PROPERTY TYPE 
		
		
		
		// PRICE
		var pmin = $('price_min'), pmax = $('price_max'), i = 0,
			pmin_val = this.price2option(terms.price[0]), pmax_val = this.price2option(terms.price[1]),
			min_exist = pmin.getElement('option[value='+pmin_val+']'),
			max_exist = pmax.getElement('option[value='+pmax_val+']');
		
		if(min_exist) min_exist.selected = true;
		else {
			var opt = pmin.getElements('option'), ov = null;
			for(i=opt.length-1;i>=0;i--) {
				ov = this.option2price(opt[i].value);
				if(terms.price[0] >= ov) {
					var o = new Element('option',{
						text: pmin_val,
						value: pmin_val
					}).inject(opt[i], 'after');
					
					o.selected = true;
					break;
				}
			}
			
			if(i == -1) {
				var o = new Element('option',{
					text: pmin_val,
					value: pmin_val
				}).inject(pmin, 'top');
				
				o.selected = true;
			}
		}
		
		
		if(max_exist) max_exist.selected = true;
		else {
			var opt = pmax.getElements('option'), ov = null;
			for(i=opt.length-1;i>=0;i--) {
				ov = this.option2price(opt[i].value);
				if(terms.price[1] >= ov) {
					var o = new Element('option',{
						text: pmax_val,
						value: pmax_val
					}).inject(opt[i], 'after');
					
					o.selected = true;
					break;
				}
			}
			
			if(i == -1) {
				var o = new Element('option',{
					text: pmax_val,
					value: pmax_val
				}).inject(pmax, 'top');
				
				o.selected = true;
			}
		}
		// --- END PRICE

		
		
		// draw area in main map
		var points = [];
		terms.points.each(function(latlang){
			latlang = latlang.split(' ');
			points.push(new GLatLng(latlang[0], latlang[1]));
		});
		
		
		if(Avi.Polygon) {
			Avi.Map.removeOverlay(Avi.Polygon);
		}
		Avi.Polygon = new GPolygon(points, Avi.Map_Polygon.color, 2, 0.7, Avi.Map_Polygon.color, 0.2);
		
		var pbound = Avi.Polygon.getBounds(), center = pbound.getCenter();
		
		Avi.Map.addOverlay(Avi.Polygon);
		Avi.Map.setZoom(Avi.Map.getBoundsZoomLevel(pbound) + 1);
		Avi.Map.setCenter(pbound.getCenter());
		
		
		$('siatw').setStyle('display','none');
		new Element('a',{
			text: 'x',
			events: {
				click: Avi.Search.remove_polygon
			}
		}).inject($('sicustomareaw').setStyle('display','block').empty().set('html',' Custom '+terms.at+' (drawn area)'), 'top');
		

		// search
		Avi.Search.init = true;
		Avi.Search.search($('search-order').value);
		
		
		// switch to map tab
		$('tab_map').addClass('selected');
		$('search-result-map').removeClass('hidden');
		//$('tab_search').removeClass('selected');
		$('interactive-search').addClass('hidden');
		
		// fix map position
		var c = Avi.Map.getCenter();
		Avi.Map.checkResize();
		Avi.Map.setCenter(c);
	}
});



function number_format( number, decimals, dec_point, thousands_sep ) {
    var n = number, c = isNaN(decimals = Math.abs(decimals)) ? 2 : decimals,
    	d = dec_point == undefined ? "." : dec_point,
    	t = thousands_sep == undefined ? "," : thousands_sep, s = n < 0 ? "-" : "",
    	i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", j = (j = i.length) > 3 ? j % 3 : 0;
    
    return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
}

GPolygon.prototype.containsLatLng = function(latLng) {
	// Exclude points outside of bounds as there is no way they are in the poly
	var bounds = this.getBounds();
	
	if(bounds != null && !bounds.containsLatLng(latLng)) {
		return false;
	}
	
	// Raycast point in polygon method
	var numPoints = this.getVertexCount(),
		inPoly = false, i=0, j = numPoints-1;
	
	for(i; i < numPoints; i++) { 
		var vertex1 = this.getVertex(i),
			vertex2 = this.getVertex(j);
		
		if (vertex1.lng() < latLng.lng() && vertex2.lng() >= latLng.lng() || vertex2.lng() < latLng.lng() && vertex1.lng() >= latLng.lng())	 {
			if (vertex1.lat() + (latLng.lng() - vertex1.lng()) / (vertex2.lng() - vertex1.lng()) * (vertex2.lat() - vertex1.lat()) < latLng.lat()) {
				inPoly = !inPoly;
			}
		}
		
		j = i;
	}
	
	return inPoly;
};


var Avi_Map_Tooltip = new Class({	
	initialize: function() {
		this.offset = {x:20,y:-10};
		this.container = new Element('div', {
			styles: {
				display: 'none',
				position: 'absolute',
				background: '#000',
				fontSize:'11px',
				//border:'1px solid #FFFD8B',
				color: '#FFF',
				padding:'0 10px',
				lineHeight: '20px',
				whiteSpace: 'nowrap'
			}
		}).inject($(document.body));
	},
	
	set: function(str) {
		this.container.set('html', str);
	},
	
	show: function(){
		this.container.setStyle('display','block');
	},
	
	hide: function() {
		this.container.setStyle('display','none');
	},
	
	reposition: function(e) {
		this.container.setStyles({
			left: e.page.x + this.offset.x, 
			top: e.page.y + this.offset.y
		});
	}
});

