/**************************************************************

	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 {
			baseurl: '',
            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,
            folder: '/media/com_iproperty/pictures/',
            latitude: '',
            longitude: '',
            zoom: 13,
            maptype: G_PHYSICAL_MAP,
            showPreview: 1
		};
	},

	initialize: function(options){
		this.setOptions(this.getOptions(), options);       

        var houseIcon = new google.maps.Icon();
        houseIcon.image = this.options.baseurl+"/components/com_iproperty/assets/images/map/icon56.png";
        houseIcon.shadow = this.options.baseurl+"/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";

        //create search sliders
        iprop_slider("minmax_slider0","slider_minmax_minKnobA0","slider_minmax_maxKnobA0","slider_minmax_min0","slider_minmax_max0",this.options.priceLow,this.options.priceHigh,langText['price'],this.options);
        iprop_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);
        iprop_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);
        iprop_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));

        myclick = function(i) {
            gmarkers[i].openInfoWindowHtml(htmls[i]);
        }
        
        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);
        }

        function listClick(i) {
            GEvent.trigger(gmarkers[i], "click");
        }

        ajaxSearch = function(){
            $('loading_div').style.display="block";
            var price_low  = $('slider_minmax_min0').innerHTML,
            price_high = $('slider_minmax_max0').innerHTML,
            sqft_low   = $('slider_minmax_min1').innerHTML,
            sqft_high  = $('slider_minmax_max1').innerHTML,
            beds_low   = $('slider_minmax_min2').innerHTML,
            beds_high  = $('slider_minmax_max2').innerHTML,
            baths_low  = $('slider_minmax_min3').innerHTML,
            baths_high = $('slider_minmax_max3').innerHTML,
            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 = escape(document.slider_search.search_string.value);
            }else{
                search_string = "";
            }

            var city = escape(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 = "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";
            var a = new Ajax(myurl,{
                method: 'get',
                onComplete: function( response ){
                    $('loading_div').style.display="none";
                    readMap( response );
                }
            });
            a.request();
        }

        //create dual sided sliders
        function iprop_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);
            });

            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 url = 'index.php?option=com_iproperty&view=property&Itemid='+this.options.itemId+'&id='+input[i].id;
                    phtml += '<tr id="'+i+'"><td>'+input[i].formattedprice+'</td>';
                    phtml += '<td>'+input[i].mls_id+'</td>';
                    if(this.options.showPreview == 1){
                        phtml += '<td><a href="'+url+'" onmouseover="javascript:myclick('+i+');">'+input[i].street_address.clean()+', '+input[i].city.clean()+'</a></td>';
                    }else{
                        phtml += '<td><a href="'+url+'">'+input[i].street_address.clean()+', '+input[i].city.clean()+'</a></td>';
                    }
                    phtml += '<td>'+input[i].beds+'</td>';
                    phtml += '<td>'+input[i].baths+'</td>';
                    phtml += '<td>'+input[i].formattedsqft+'</td>';
                    phtml += '<td><a href="javascript:myclick('+i+');">'+langText['preview']+'</a></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'});

        }

        //format gmap bubble window
        function formatWindow (input) {
            if(input){
                var path = this.options.folder;
                var url = 'index.php?option=com_iproperty&view=property&id='+input.id+'&Itemid='+this.options.itemId+'';
                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+'"><img src="'+path+input.thumb+'" alt="'+input.street_address+'" /></a></div>';
                    html += '<div class="bubble_desc">'+input.short_description.slice(0,205)+'. . .<a href="'+url+'">('+langText['more']+')</a></div>';
                }else{
                    html += '<div class="bubble_desc">'+input.short_description.slice(0,205)+'. . .<a href="'+url+'">('+langText['more']+')</a></div>';
                }

                html += '</div>';
                return html;
            }
        }

        // create the marker and set up the event window
        function createMarker(input) {
            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);
            });

            gmarkers[ii] = marker;
            htmls[ii] = html;
            ii++;
            return marker;
        }

        // 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 = [];
            ii = 0;
            jsonData = Json.evaluate(data);

            if (jsonData.length <= 0) {
                //alert("No properties found.");
                document.getElementById('advmap_nofound').style.display = 'block';
                //return false;
            }else{
                document.getElementById('advmap_nofound').style.display = 'none';
            }

            listProperties(jsonData);
            for (var i = 0; i < jsonData.length; i++) {
                if (jsonData[i].lat_pos != 0 && jsonData[i].long_pos != 0) {
                    // create the marker
                    var marker = createMarker(jsonData[i]);
                    map.addOverlay(marker);
                }
            }
            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);

/*************************************************************/

