/**************************************************************

	Script		: IPGmap
	Version		: 1.1
	Authors		: Vincent & Tim Kramer
	Desc		: Google map and ajax search for Iproperty
	Licence		: Exclusive

**************************************************************/

var IpAjaxSearch = new Class({
							  
	getOptions: function(){
		return {
			ipbaseurl: '',
            showHoa: false,
            showReo: false,
            showWf: false,
            sliderLength: 300,
            priceHigh: 100000,
            priceLow: 50000,
            sqftHigh: 8000,
            sqftLow: 1000,
            bedsHigh: 5,
            bedsLow: 1,
            bathsHigh: 5,
            bathsLow: 1,
            itemId: 99999,
            latitude: '',
            longitude: '',
            zoom: 13,
            maptype: G_PHYSICAL_MAP,
            showPreview: 1,
            currencySymbol: '',
            currencyPos: '',
            currencyFormat: '',
            noLimit: 0
		};
	},

	initialize: function(options){
		this.setOptions(this.getOptions(), options);       

        var houseIcon = new google.maps.Icon();
        houseIcon.image = this.options.ipbaseurl+"/components/com_iproperty/assets/images/map/icon56.png";
        houseIcon.shadow = this.options.ipbaseurl+"/components/com_iproperty/assets/images/map/icon56s.png";
        houseIcon.iconSize = new google.maps.Size(32,32);
        houseIcon.shadowSize = new google.maps.Size(59,32);
        houseIcon.iconAnchor = new google.maps.Point(9, 34);
        houseIcon.infoWindowAnchor = new google.maps.Point(9, 2);
        houseIcon.infoShadowAnchor = new google.maps.Point(18, 25);
        houseIcon.transparent = "http://www.google.com/intl/en_ALL/mapfiles/markerTransparent.png";
        houseIcon.printImage = "coldmarkerie.gif";
        houseIcon.mozPrintImage = "coldmarkerff.gif";
        
        // set ajax search vars
        var priceMin = this.options.priceLow;
        var priceMax = this.options.priceHigh;
        var sqftMin = this.options.sqftLow;
        var sqftMax = this.options.sqftHigh;
        var bedsMin = this.options.bedsLow;
        var bedsMax = this.options.bedsHigh;
        var bathsMin = this.options.bathsLow;
        var bathsMax = this.options.bathsHigh;

        //create search sliders
        price_slider("minmax_slider0","slider_minmax_minKnobA0","slider_minmax_maxKnobA0","slider_minmax_min0","slider_minmax_max0",priceMin,priceMax,langText['price'],this.options);
        sqft_slider("minmax_slider1","slider_minmax_minKnobA1","slider_minmax_maxKnobA1","slider_minmax_min1","slider_minmax_max1",this.options.sqftLow,this.options.sqftHigh,langText['sqft'],this.options);
        beds_slider("minmax_slider2","slider_minmax_minKnobA2","slider_minmax_maxKnobA2","slider_minmax_min2","slider_minmax_max2",this.options.bedsLow,this.options.bedsHigh,langText['beds'],this.options);
        baths_slider("minmax_slider3","slider_minmax_minKnobA3","slider_minmax_maxKnobA3","slider_minmax_min3","slider_minmax_max3",this.options.bathsLow,this.options.bathsHigh,langText['baths'],this.options);

        // create the map
        var map = new google.maps.Map2($("advmap_canvas"));
        map.setUIToDefault();
        map.setMapType(eval(this.options.maptype));        
        
        //set center of map
        if( this.options.latitude && this.options.longitude ){
            map.setCenter(new google.maps.LatLng(this.options.latitude,this.options.longitude), 13);
        }else{            
            map.setCenter(new google.maps.LatLng(this.options.latitude,this.options.longitude), this.options.zoom);
        }
        
        // TODO: get currency sign and seperator from settings and plug into this script
		function formatCurrency(num) {
			cSymbol = this.options.currencySymbol;
            cPosition = this.options.currencyPos;
            cFormat = this.options.currencyFormat;
            cSeparator = (cFormat == 1) ? ',' : '.';

            num = num.toString().replace(/\$|\,/g,'');
			if(isNaN(num))
				num = "0";
				//sign = (num == (num = Math.abs(num)));
				num = Math.floor(num*100+0.50000000001);
				//cents = num%100;
				num = Math.floor(num/100).toString();
			//if(cents<10)
				//cents = "0" + cents;
			for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++){
				num = num.substring(0,num.length-(4*i+3))+cSeparator+num.substring(num.length-(4*i+3));
            }
			//return (((sign)?'':'-') + '$' + num);
            if(cPosition == 1){
                return num+' '+cSymbol;
            }else{
                return cSymbol+num;
            }
		} 
		
		function addCommas(nStr){
			nStr += '';
			x = nStr.split('.');
			x1 = x[0];
			x2 = x.length > 1 ? '.' + x[1] : '';
			var rgx = /(\d+)(\d{3})/;
			while (rgx.test(x1)) {
				x1 = x1.replace(rgx, '$1' + ',' + '$2');
			}
			return x1 + x2;
		}		       
        

        ajaxSearch = function(){
            $('loading_div').style.display="block";
            var noLimit     = this.options.noLimit;
            var price_low  	= (noLimit) ? ((priceMin == this.options.priceLow) ? '' : priceMin) : priceMin,
            price_high 		= (noLimit) ? ((priceMax == this.options.priceHigh) ? '' : priceMax) : priceMax,
            sqft_low   		= sqftMin,
            sqft_high  		= sqftMax,
            beds_low   		= bedsMin,
            beds_high  		= bedsMax,
            baths_low  		= bathsMin,
            baths_high 		= bathsMax,
            ptype           = new Array();

            //set pagination variables
            this.options.limit      = document.slider_search.limit.value;
            this.options.limitstart = (document.slider_search.limitstart.value) ? document.slider_search.limitstart.value : 0;            

            if(document.slider_search.search_string.value != langText['inputText']){
                var search_string = document.slider_search.search_string.value;
            }else{
                search_string = "";
            }

            //var city = escape(document.slider_search.city.value);
            var city    = document.slider_search.city.value;
            var stype   = document.slider_search.stype.value;

            if(this.options.showHoa == 1){
                var hoa 	   = document.slider_search.hoa.checked;
                if (hoa) { hoa = 1 } else { hoa = 0 };
                var hoa_query = '&hoa='+hoa;
            }else{
                hoa_query = '';
            }

            if(this.options.showReo == 1){
                var reo 	   = document.slider_search.reo.checked;
                if (reo) { reo = 1 } else { reo = 0 };
                var reo_query = '&reo='+reo;
            }else{
                reo_query = '';
            }

            if(this.options.showWf){
                var waterfront = document.slider_search.waterfront.checked;
                if (waterfront) { waterfront = 1 } else { waterfront = 0 };
                var wf_query = '&waterfront='+waterfront;
            }else{
                wf_query = '';
            }

            //loop through available categories
            ptype = document.getElementsByName("ptype[]");
            var checked = "";
            for(i=0;i<ptype.length;i++){
                if(ptype[i].checked){
                    checked+=ptype[i].value+",";
                }
            }
            var strLen = checked.length;
            checked = checked.slice(0,strLen-1);
            //alert(checked);


            var myurl = this.options.ipbaseurl+"index.php?option=com_iproperty&view=advsearch&task=ajaxSearch&ptype="+checked+"&price_high="+price_high+"&price_low="+price_low+"&sqft_high="+sqft_high+"&sqft_low="+sqft_low+"&beds_high="+beds_high+"&beds_low="+beds_low+"&baths_high="+baths_high+"&baths_low="+baths_low+"&search="+search_string+"&city="+city+"&stype="+stype+wf_query+hoa_query+reo_query+"&limit="+this.options.limit+"&limitstart="+this.options.limitstart+"&format=raw";
            //alert(myurl);
            var a = new Ajax(myurl,{
                method: 'get',
                onComplete: function( response ){
                    $('loading_div').style.display="none";
                    readMap( response );
                }
            });
            a.request();
        }

        //create SQFT sliders
        function sqft_slider(bg,minthumb,maxthumb,minvalue,maxvalue,startmin,startmax,aSliderName,options) {
            this.options = options;
            var range = this.options.sliderLength;
            if ((startmax - startmin) < this.options.sliderLength) {
                var tickSize = (this.options.sliderLength / (startmax - startmin));
            }else{
                tickSize = 1;
            }
            var initVals = [ 0,this.options.sliderLength ], // Values assigned during instantiation
            //Event = YAHOO.util.Event,
            Dom = YAHOO.util.Dom,
            dual_slider,
            scaleFactor = ((startmax - startmin) / this.options.sliderLength); // Custom scale factor for converting the pixel offset into a real value
            dual_slider = YAHOO.widget.Slider.getHorizDualSlider(
            bg,minthumb,maxthumb,
            range, tickSize, initVals);

            /*
             *TODO: recall set values
             *use this method to recall saved searches
             *and previous searches when implemented
             *where 8000 would be the recalled min value
             *
             *dual_slider.setMinValue(Math.round((8000-startmin) / scaleFactor));
             *
             */
            
            dual_slider.subscribe("change", function(instance) {
                var a_minvalue = Dom.get(minvalue);
                var a_maxvalue = Dom.get(maxvalue);
                a_minvalue.innerHTML =  addCommas(Math.round((dual_slider.minVal * scaleFactor) + startmin));
                a_maxvalue.innerHTML =  addCommas(Math.round((dual_slider.maxVal * scaleFactor) + startmin));
				sqftMin = (dual_slider.minVal * scaleFactor) + startmin;
				sqftMax = (dual_slider.maxVal * scaleFactor) + startmin;
            });

            dual_slider.subscribe("slideEnd", function(){ limitReset();ajaxSearch(); });
            return dual_slider;
        }

        //create BEDS sliders
        function beds_slider(bg,minthumb,maxthumb,minvalue,maxvalue,startmin,startmax,aSliderName,options) {
            this.options = options;
            var range = this.options.sliderLength;
            if ((startmax - startmin) < this.options.sliderLength) {
                var tickSize = (this.options.sliderLength / (startmax - startmin));
            }else{
                tickSize = 1;
            }
            var initVals = [ 0,this.options.sliderLength ], // Values assigned during instantiation
            //Event = YAHOO.util.Event,
            Dom = YAHOO.util.Dom,
            dual_slider,
            scaleFactor = ((startmax - startmin) / this.options.sliderLength); // Custom scale factor for converting the pixel offset into a real value
            dual_slider = YAHOO.widget.Slider.getHorizDualSlider(
            bg,minthumb,maxthumb,
            range, tickSize, initVals);
            dual_slider.subscribe("change", function(instance) {
                var a_minvalue = Dom.get(minvalue);
                var a_maxvalue = Dom.get(maxvalue);
                a_minvalue.innerHTML = Math.round((dual_slider.minVal * scaleFactor) + startmin);
                a_maxvalue.innerHTML = Math.round((dual_slider.maxVal * scaleFactor) + startmin);
				bedsMin = (dual_slider.minVal * scaleFactor) + startmin;
				bedsMax = (dual_slider.maxVal * scaleFactor) + startmin;
            });

            dual_slider.subscribe("slideEnd", function(){ limitReset();ajaxSearch(); });
            return dual_slider;
        }        

        //create BATHS sliders
        function baths_slider(bg,minthumb,maxthumb,minvalue,maxvalue,startmin,startmax,aSliderName,options) {
            this.options = options;
            var range = this.options.sliderLength;
            if ((startmax - startmin) < this.options.sliderLength) {
                var tickSize = (this.options.sliderLength / (startmax - startmin));
            }else{
                tickSize = 1;
            }
            var initVals = [ 0,this.options.sliderLength ], // Values assigned during instantiation
            //Event = YAHOO.util.Event,
            Dom = YAHOO.util.Dom,
            dual_slider,
            scaleFactor = ((startmax - startmin) / this.options.sliderLength); // Custom scale factor for converting the pixel offset into a real value
            dual_slider = YAHOO.widget.Slider.getHorizDualSlider(
            bg,minthumb,maxthumb,
            range, tickSize, initVals);
            dual_slider.subscribe("change", function(instance) {
                var a_minvalue = Dom.get(minvalue);
                var a_maxvalue = Dom.get(maxvalue);
                a_minvalue.innerHTML = Math.round((dual_slider.minVal * scaleFactor) + startmin);
                a_maxvalue.innerHTML = Math.round((dual_slider.maxVal * scaleFactor) + startmin);
				bathsMin = (dual_slider.minVal * scaleFactor) + startmin;
				bathsMax = (dual_slider.maxVal * scaleFactor) + startmin;
            });

            dual_slider.subscribe("slideEnd", function(){ limitReset();ajaxSearch(); });
            return dual_slider;
        }
        
        //create PRICE sliders
        function price_slider(bg,minthumb,maxthumb,minvalue,maxvalue,startmin,startmax,aSliderName,options) {
            this.options = options;
            var range = this.options.sliderLength;
            var noLimit = this.options.noLimit;
            if ((startmax - startmin) < this.options.sliderLength) {
                var tickSize = (this.options.sliderLength / (startmax - startmin));
            }else{
                tickSize = 1;
            }
            var initVals = [ 0,this.options.sliderLength ], // Values assigned during instantiation
            //Event = YAHOO.util.Event,
            Dom = YAHOO.util.Dom,
            dual_slider,
            scaleFactor = ((startmax - startmin) / this.options.sliderLength); // Custom scale factor for converting the pixel offset into a real value
            dual_slider = YAHOO.widget.Slider.getHorizDualSlider(
            bg,minthumb,maxthumb,
            range, tickSize, initVals);
            dual_slider.subscribe("change", function(instance) {
                var a_minvalue = Dom.get(minvalue);
                var a_maxvalue = Dom.get(maxvalue);
                priceMin = (dual_slider.minVal * scaleFactor) + startmin;
                priceMax = (dual_slider.maxVal * scaleFactor) + startmin;
                if ( priceMin == startmin ) {
					if(noLimit == 1){
                        a_minvalue.innerHTML = langText['nolimit'];
                    }else{
                        a_minvalue.innerHTML = formatCurrency(startmin);
                    }
				} else {
                	a_minvalue.innerHTML = formatCurrency((dual_slider.minVal * scaleFactor) + startmin);
				}
				if ( priceMax == startmax ) {
                	if(noLimit == 1){
                        a_maxvalue.innerHTML = langText['nolimit'];
                    }else{
                        a_maxvalue.innerHTML = formatCurrency(startmax);
                    }
				} else {
                	a_maxvalue.innerHTML = formatCurrency((dual_slider.maxVal * scaleFactor) + startmin);
				}
            });

            dual_slider.subscribe("slideEnd", function(){ limitReset();ajaxSearch(); });
            return dual_slider;
        }        

        //populate property table with listing rows returned
        function listProperties(input) {
            var totalcount = input[0].totalcount;
            document.getElementById("advmap_counter").innerHTML = totalcount;
            var prevLimit  = (parseInt(this.options.limitstart) - parseInt(this.options.limit));
            var nextLimit  = (parseInt(this.options.limitstart) + parseInt(this.options.limit));

            //if next limit is larger than total, hide next button and set maxcount to total
            if(nextLimit >= totalcount){
                var end = true;
                nextLimit = totalcount;
            }

            //if previous limit is less than 0, hide previous button and set min limit to 0
            if(prevLimit < 0){
                var beginning = true;
                prevLimit = 0;
            }

            var phtml = '<table class="ip_pagination"><tr><td class="ip_pagecount">'+langText['tprop']+': '+this.options.limitstart+'-'+nextLimit+' '+langText['of']+' '+totalcount+'</td>';
            phtml += '<td class="ip_pagenav">';
            //check pagination and create previous link if available
            if(!beginning){
                phtml += '<input type="button" class="ipbutton" onclick="ajaxPage('+prevLimit+')" value="'+langText['previous']+'" />';
            }
            //check pagination and create next link if available
            if(!end){
                phtml += '<input type="button" class="ipbutton" onclick="ajaxPage('+nextLimit+')" value="'+langText['next']+'" />';
            }
            phtml += '</td></tr></table>';
            phtml += '<table id="prop_table">';
            phtml += '<thead>';
            phtml += '<th axis="currency">'+langText['price']+'</th>';
            phtml += '<th axis="string">'+langText['pid']+'</th>';
            phtml += '<th axis="string">'+langText['street']+'</th>';
            phtml += '<th axis="number">'+langText['beds']+'</th>';
            phtml += '<th axis="number">'+langText['baths']+'</th>';
            phtml += '<th axis="number">'+langText['sqft']+'</th>';
            phtml += '<td class="noaxis">'+langText['preview']+'</td>';
            phtml += '</thead>';
            phtml += '<tbody>';

            if(totalcount > 0){
                for (var i = 0; i < input.length; i++) {
                    var marker = createMarker(input[i]);
                    var url = input[i].proplink;
                    phtml += '<tr id="'+i+'">';
                    phtml += '<td>'+input[i].formattedprice+'</td>';
                    phtml += '<td>'+input[i].mls_id+'</td>';
                    phtml += '<td>';
                    if(this.options.showPreview == 1 && marker){
                        phtml += '<a href="'+url+'" onmouseover="javascript:myclick('+input[i].id+');">'+input[i].street_address.clean()+', '+input[i].city.clean()+'</a>';
                    }else{
                        phtml += '<a href="'+url+'">'+input[i].street_address.clean()+', '+input[i].city.clean()+'</a>';
                    }
                    phtml += '</td>';
                    phtml += '<td>'+input[i].beds+'</td>';
                    phtml += '<td>'+input[i].baths+'</td>';
                    phtml += '<td>'+input[i].sqft+'</td>';
                    phtml += '<td>';
                        if(marker){
                            phtml += '<a href="javascript:myclick('+input[i].id+');">'+langText['preview']+'</a>';
                        }else{
                            phtml += '--';
                        }
                    phtml += '</td></tr>';
                }
            }else{
                phtml += '<tr><td colspan="7" align="center">'+langText['noRecords']+'</td></tr>';
            }
            phtml += '</tbody>';
            phtml += '</table>';
            phtml += '<table class="ip_pagination"><tr><td class="ip_pagecount">'+langText['tprop']+': '+this.options.limitstart+'-'+nextLimit+' '+langText['of']+' '+totalcount+'</td>';
            phtml += '<td class="ip_pagenav">';
                //check pagination and create previous link if available
                if(!beginning){
                    phtml += '<input type="button" class="ipbutton" onclick="ajaxPage('+prevLimit+')" value="'+langText['previous']+'" />';
                }
                //check pagination and create next link if available
                if(!end){
                    phtml += '<input type="button" class="ipbutton" onclick="ajaxPage('+nextLimit+')" value="'+langText['next']+'" />';
                }
            phtml += '</td></tr></table>';

            $("property_list").setHTML(phtml);
            new sortableTable('prop_table', {overCls: 'over', sortBy: 'DESC'});
        }

        //format gmap bubble window
        function formatWindow (input) {
            var url = input.proplink;
            var link_add =  input.street_address.clean()+', '+input.city.clean();
            var html = '<div class="bubble">';
            html += '<h4><a href="'+url+'">'+link_add+'</a></h4>';
            html += '<p><b>'+langText['pid']+':</b> '+input.mls_id+'<br />';
            html += '<b>'+langText['price']+':</b> '+input.formattedprice+'</p>';
            if(input.thumb != null){
                html += '<div class="bubble_image"><a href="'+url+'">'+input.thumb+'</a></div>';
                html += '<div class="bubble_desc">';
                if(input.short_description){
                    html += input.short_description.slice(0,205)+'...';
                }
                html += '<a href="'+url+'">('+langText['more']+')</a>';
                html += '</div>';
            }else{
                html += '<div class="bubble_desc">';
                if(input.short_description){
                    html += input.short_description.slice(0,205)+'...';
                }
                html += '<a href="'+url+'">('+langText['more']+')</a>';
                html += '</div>';
            }
            html += '</div>';
            return html;
        }

        // create the marker and set up the event window
        function createMarker(input) {
            if(input.lat_pos && input.long_pos){
                var coord = new google.maps.LatLng(input.lat_pos,input.long_pos);
                var marker = new google.maps.Marker(coord,houseIcon);
                var html = formatWindow(input);
                bounds.extend(coord);
                google.maps.Event.addListener(marker, "click", function() {
                    this.openInfoWindowHtml(html);
                });

                //create map marker based on property id
                gmarkers[input.id] = marker;
                htmls[input.id] = html;
                map.addOverlay(marker);
                return marker;
            }else{
                //no lat & long, return no marker
                return false;
            }
        }

        myclick = function(i) {
            gmarkers[i].openInfoWindowHtml(htmls[i]);
        }

        // read the data, create markers
        function readMap(data) {
            bounds = new google.maps.LatLngBounds();
            // hide the info window, otherwise it still stays open where the removed marker used to be
            map.getInfoWindow().hide();
            map.clearOverlays();

            // empty the arrays
            gmarkers = [];
            htmls = [];

            //json evaluate returned data
            jsonData = Json.evaluate(data);

            //TODO: if no maps found, display advmap_nofound div with no search criteria met
            if (jsonData.length <= 0) {
                document.getElementById('advmap_nofound').style.display = 'block';
            }else{
                document.getElementById('advmap_nofound').style.display = 'none';
            }

            //create sortable table list
            listProperties(jsonData);
            map.setZoom(map.getBoundsZoomLevel(bounds));
            map.setCenter(bounds.getCenter());
        }

        //prevent form submission by enter key
        function stopRKey(evt) {
           var evt = (evt) ? evt : ((event) ? event : null);
           var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
           if ((evt.keyCode == 13) && (node.type=="text")) {return false;}
        }        
        
        ajaxSearch();
        document.onkeypress = stopRKey;
    }
});
IpAjaxSearch.implement(new Events);
IpAjaxSearch.implement(new Options);

/*************************************************************/

