RMapControl = function () {
    var _lMapContainer;
    var _lMarkerMngr;
    var _lMapDirections;
    var cityLat, cityLng;
    var StartMarkerObject ;
    var _storeLatRoute, _storeLngRoute;
    var distance;    
	var SHOP_ICON, START_ICON, STORE_ICON;
    this.init = function (mapcontainer, cityLat, cityLon, zoom) { // the latitude cooridnate is always written first, followed by the longitude, as it is custom in cartography.
        this.cityLat = cityLat;
        this.cityLng = cityLon;
        mapcontainer = new GMap2(document.getElementById("map_canvas"));
        mapcontainer.setCenter(this.createGLatLong(cityLat, cityLon), zoom);
        _lMapContainer = mapcontainer;
 _lMarkerMngr = new MarkerManager(mapcontainer,{trackMarkers:true});         
           
         mapcontainer.setUIToDefault();
    };  
	
	 this.initDirections = function(divId){  
    try{      
         var routeContainer; 
         var rDiv = document.createElement('div');
             
          if(divId == 'route'){
          routeContainer = document.getElementById('route');             
         _lMapDirections = new GDirections(_lMapContainer, routeContainer);   
         }else{
           _lMapDirections = new GDirections(_lMapContainer);   
         }         
			 GEvent.addListener(_lMapDirections, "addoverlay", function()  
				 {  
					var nMarkers = _lMapDirections.getNumGeocodes() ; 
					for(var i=0; i< nMarkers;i++)  
					 {  
					 var marker = _lMapDirections.getMarker(i);  
					 if (marker !== null )  
					 { 
					  if(i === 0){
					  	var _latLng = marker.getLatLng();					 
					  	moveStartMarker(_latLng.lat(),_latLng.lng());
					  }
					    marker.hide();						   				 
					 }  
					 }
					 var dist_mtrs = _lMapDirections.getDistance().meters ;
					 if(dist_mtrs){
					  if(eval(dist_mtrs) >= 1000){
					   distance = eval(dist_mtrs)/1000 +" km(s)";					   
					  }else{
					   distance = dist_mtrs +" meters";
					   
					  }
					 }
					 if( routeContainer ){					 
					  routeContainer.style.display = 'block';
					  //showDirectionsPanel(routeContainer);
					  	}			 					 				
				 });  
				 }catch(e){
				 alert(e);
				 }
    
    };
	 this.setMarkerIconPath = function(path){
     
     SHOP_ICON = path+'MAP/images/shop.png';
     START_ICON = path+'MAP/images/startmarker.png';
     STORE_ICON= path+'MAP/images/shop.png';
    };
    this.setDefault = function () {
        _lMapContainer.setUIToDefault();
    };
    this.clearMarkers = function() {
       _lMapContainer.clearOverlays();
    	_lMarkerMngr.clearMarkers();    
    };
    this.getLatLngByLocation = function(name){ 
        var obj = {};  
        var gcoder = this.getGClientCoder();
           gcoder.getLatLng(name, function(GLatLng){
           if(!GLatLng){
           alert("No latitude and longitude available for : "+name)
           }else{           
           obj.lat = GLatLng.lat();
           obj.lng = GLatLng.lng();     		          
           }
           });    
     return obj;
    };
    function createGLatLong(lat,lon){
     return new GLatLng(lat, lon)
    }
    this.createGLatLong = createGLatLong; /*function (lat, lon) {
        return new GLatLng(lat, lon)
    };*/
    this.getGClientCoder = function(){
    return new GClientGeocoder();
    }
    this.createGMarker = function (point) {
        var rIcon = new GIcon(G_DEFAULT_ICON);
			rIcon.image = SHOP_ICON;
		 rIcon.iconSize = new GSize(37,44);
		 rIcon.dragCrossAnchor = new GPoint(-10,0);	
		 var marker = new GMarker(point, {
			icon: rIcon
        });

   /*  GEvent.addListener(marker, "click", function() {
          var GMLatLng =  this.getLatLng();
          marker.openInfoWindowHtml("Marker Latitude: "+GMLatLng.lat()+'<br>Longitude: '+GMLatLng.lng());
        });
*/
			return marker;
    };
    this.createStartMarker = function() {
         var rIcon = new GIcon(G_DEFAULT_ICON);
		 rIcon.image = START_ICON;
		 rIcon.iconSize = new GSize(37,44);	
		 rIcon.dragCrossAnchor = new GPoint(-5,10);	
		 var marker = new GMarker(this.createGLatLong(this.cityLat, this.cityLng), {
			icon: rIcon,
            draggable: true            
        });
        StartMarkerObject =  marker.getLatLng();         
        GEvent.addListener(marker,'dragend',function(){        
        StartMarkerObject =  this.getLatLng();   
        if(_storeLatRoute){
        _lMapDirections.load("from: " + StartMarkerObject.lat()+" "+StartMarkerObject.lng() + " to: " + _storeLatRoute+" "+_storeLngRoute);
        }
        });
     /*  GEvent.addListener(marker,'drag',function(){ 
         marker.setImage("images/MarkerMove.gif");      // to enble mouse follower icon
       });*/
                
    return marker;       
    };
    this.showPopup = function(lat, lng ){
    var marker =  _lMarkerMngr.getMarker(lat,lng,6);
       GEvent.trigger(marker,'click');
    
    };
    this.setRouteSourceLatLng = function(lat,lng) {
    _storeLatRoute = lat;
    _storeLngRoute = lng;   
    
    }
    this.getStoreNewLatLng = function(){
     var obj = {};    
     obj.lat = StartMarkerObject.lat();
     obj.lng = StartMarkerObject.lng();
     return obj;
    };
    function moveStartMarker(lat,lng){      
       var marker =  _lMarkerMngr.getMarker(StartMarkerObject.lat(),StartMarkerObject.lng(),6);
        marker.setLatLng(new GLatLng(lat,lng));          
        StartMarkerObject = marker.getLatLng();            
       _lMarkerMngr.refresh();                
        //GEvent.trigger(marker,'dragend');
   
    }
    this.fireStartMarkerDragEnd = function(){      
      var marker =  _lMarkerMngr.getMarker(StartMarkerObject.lat(),StartMarkerObject.lng(),6);
    	GEvent.trigger(marker,'dragend');
    }
    this.moveStartMarker = moveStartMarker; /*function(lat,lng){   
       var marker =  _lMarkerMngr.getMarker(StartMarkerObject.lat(),StartMarkerObject.lng(),6);
        marker.setLatLng(this.createGLatLong(lat,lng));
          
        StartMarkerObject = marker.getLatLng();    
       _lMarkerMngr.refresh();
       GEvent.trigger(marker,'dragend');
    }*/
 
    this.createDragableGMarker = function (point) {
		 var rIcon = new GIcon(G_DEFAULT_ICON);
		 rIcon.image = SHOP_ICON;
		 rIcon.iconSize = new GSize(37,44);	
		 var marker = new GMarker(point, {
			icon: rIcon,
            draggable: true            
        });
         GEvent.addListener(marker, "dragend", function() {
          var GMLatLng =  this.getLatLng();
          StartMarkerObject = marker.getLatLng();          
          //marker.openInfoWindowHtml("<div>Marker Latitude: "+GMLatLng.lat()+'<br>Longitude: '+GMLatLng.lng()+'</div>');		  
        });
          StartMarkerObject = marker.getLatLng();          
          return marker;
    };

    this.locateSingleMarker = function (AO) {        
        if (AO) {
        console.info(AO.lat+'_'+ AO.lng);
            var point = this.createGLatLong(AO.lat, AO.lng);
            _lMarkerMngr.addMarker(this.createDragableGMarker(point),6);            
            _lMarkerMngr.refresh();
        }
    };

    this.locateMultipleMarkers = function (AO) {
         this.clearMarkers();
        if (!AO) {
            alert("No stores available");
        } else {
            var point;
            if(AO.length > 0){            
            for (var i = 0; i < AO.length; i++) {
                var addHtml = AO[i].address;
                point = this.createGLatLong(AO[i].lat, AO[i].lng);
                var marker = this.createGMarker(point);
                    marker.bindInfoWindowHtml(addHtml);                 
                _lMarkerMngr.addMarker(marker,6);
                 marker = null;              
            }           
           	
         _lMarkerMngr.addMarker(this.createStartMarker(),6);                     
          _lMapContainer.setCenter(this.createGLatLong(AO[0].lat, AO[0].lng),12);
          _storeLatRoute = AO[0].lat;
          _storeLngRoute = AO[0].lng;
		  _lMarkerMngr.refresh();
		}
        }

    };
    
    this.getRoute = function(storeLat, storeLng){ 
         _storeLatRoute = storeLat;
         _storeLngRoute = storeLng;
         _lMapDirections.load("from: " + StartMarkerObject.lat()+" "+StartMarkerObject.lng() + " to: " + storeLat+" "+storeLng);         
        // _lMapContainer.setZoom(8);
        
         
    };
    this.getRouteDistance = function(){
    return distance;
    }
    
    this.getURLParameters = function (url) {  // add parameter
		  var query_string = {};
		  //var query = window.location.search.substring(1);// send parameters dynamically 
		  
		  var query = url.substring(1);
		  
		  var vars = query.split("&");
		  for (var i=0;i<vars.length;i++) {
		    var pair = vars[i].split("=");
		
		    if (typeof query_string[pair[0]] === "undefined") {
		      query_string[pair[0]] = pair[1];
		
		    } else if (typeof query_string[pair[0]] === "string") {
		      var arr = [ query_string[pair[0]], pair[1] ];
		      query_string[pair[0]] = arr;
		
		    } else {
		      query_string[pair[0]].push(pair[1]);
		    }
		  } 
		    return query_string;
		};
		
	 this.parseStoreDetailsXMLResponse = function (responseXML, O){		 // used when  storeproductdetails method is invoked.
		  var docRoot = responseXML.getElementsByTagName("row");  
		 
		  if(docRoot.length > 0)
            { 
            for(var paraslen = 0; paraslen < docRoot.length; paraslen++)
                    {                           
                        var lng =         docRoot[paraslen].childNodes[0].firstChild.data;
                        var lat =         docRoot[paraslen].childNodes[1].firstChild.data;
                        var storename =   docRoot[paraslen].childNodes[2].firstChild.data;
                        var city = 		  docRoot[paraslen].childNodes[3].firstChild.data
                        var address =     docRoot[paraslen].childNodes[4].firstChild.data
                        var siteurl =     docRoot[paraslen].childNodes[5].firstChild.data
                        var area =        docRoot[paraslen].childNodes[6].firstChild.data
                        var state =       docRoot[paraslen].childNodes[7].firstChild.data
                        var country =     docRoot[paraslen].childNodes[8].firstChild.data
                         O.createStoreObject(lat, lng, storename, city, address,siteurl,area,state,country);		 				 
					}            
            }		
		 return O;
		};  
		/************************ view storeon map ************************************************/
		this.locateStore = function(AO){				  
		        var point = this.createGLatLong(AO.lat, AO.lng);       		        
                var marker = this.createGMarker(point);  // constructing store marker 
                 marker.bindInfoWindowHtml(AO.address);                 
                _storeLatRoute = AO.lat;
         		_storeLngRoute = AO.lng;
                StartMarkerObject =  this.createGLatLong(this.cityLat,this.cityLng);
                _lMarkerMngr.addMarker(marker,6);
                _lMarkerMngr.addMarker(this.createStartMarker(),6);   
                _lMarkerMngr.refresh();
		};	

this.getStoresByCity = function(SA, cityName) {
		 var  storeArray = new Array();
		if(!SA){
		 alert("There are no stores available to filter");
		}else{
		 for(var i = 0; i< SA.length; i++){		 
		  if(SA[i].city.toLowerCase() == cityName.toLowerCase()){
		    storeArray[storeArray.length++] = SA[i];
		   }
		  }//for
		  return storeArray;
		}// else
		return storeArray; 
		};	
		
		/**************************************** end ********************************************/    
		/**************************** martjack city dropdown *********************************
		this.fillCityCombo = function(dropdownId, arrCityNames){			
		    var drpCity = document.getElementById(dropdownId);
		    if(drpCity)
		    {
		        while (drpCity.options.length > 0) 
		        {
		            drpCity.options[0] = null;
		        }
		        var optn = null;   
		        for(var clen=0;clen < arrCityNames.length;clen++)
		        {
		            optn = document.createElement("OPTION");
		            optn.text = arrCityNames[clen];
		         
		            drpCity.options.add(optn);
		        }
		        optn = null;                  
		    }  
		    drpCity = null;
		
		}
		******************************************************************************************/  
};


RStoreMarker = function (lat, lon) {
    this.lat = lat;
    this.lon = lon;
};
/************************        store object **************************/
StoreDetails = function (){
var storeArray = new Array();
var cityArray = new Array();
var areasArray = new Array();
    //areasArray[0] = 'All';  
this.createStoreObject = function (lat,lng,sn,city,address,siteurl,area,state,country){
	var storeObj = {};
	storeObj.lat = lat;
	storeObj.lng = lng;
	storeObj.storeName = sn;
	storeObj.city = city;
	storeObj.address = address;
	storeObj.siteURL = siteurl;
	storeObj.area = area;
	storeObj.state = state;
	storeObj.country = country;
	this.push(storeObj);
	this.addCity(city);
	this.addArea(area);
};
this.push = function(O){
storeArray[storeArray.length++] = O; 
};
this.addCity = function(cityName){
 if(cityArray.length == 0){
   cityArray[cityArray.length++] = cityName;
 }else{
 var  exists = false;
  for(var i= 0 ; i< cityArray.length; i++){
   if(cityArray[i].toLowerCase() == cityName.toLowerCase()){
     exists = true;
     break;
   }
  } 
  if(!exists){
  cityArray[cityArray.length++] = cityName;
  }
  }// else
};
this.addArea = function(areaName) {

 if(areasArray.length == 0){
   areasArray[areasArray.length++] = areaName;
 }else{
 var  exists = false;
  for(var i= 0 ; i< areasArray.length; i++){
   if(areasArray[i].toLowerCase() == areaName.toLowerCase()){
     exists = true;
     break;
   }
  } 
  if(!exists){
  areasArray[areasArray.length++] = areaName;
  }
  }// else

}


this.getStoresList = function(){
return storeArray;
};
this.getCityList = function(){
return cityArray;
};
this.getAreaList = function(){
return areasArray;
};
};
/***********************************end *************************************/
          /*  var xmldoc = http_request.responseXML;
            var root = xmldoc.getElementsByTagName('data').item(0);            
            for (var iNode = 0; iNode < root.childNodes.length; iNode++) {
               var node = root.childNodes.item(iNode);
               for (i = 0; i < node.childNodes.length; i++) {
                  var sibl = node.childNodes.item(i);
                  var len = parseInt(sibl.childNodes.length / 2);
                  var arr = new Array(len);
                  var cnt = 0;
                  for (x = 0; x < sibl.childNodes.length; x++) {
                     var sibl2 = sibl.childNodes.item(x);
                     var sibl3;
                     if (sibl2.childNodes.length > 0) {
                        sibl3 = sibl2.childNodes.item(0);
                        arr[cnt] = sibl3.data;   
                        cnt++;
                     }
                  }

*/
/*
37.41654072214609           -122.11628433610379
37.442162156186086          -122.18061491371361
37.45486936065622		    -122.16211185168537
37.44034435697337			-122.19714351359946
37.43542667284403			-122.17505238787123
37.45948618541664			-122.1817840419552
37.42928456866565			-122.09025545248934
37.423671071845234			-122.12686905538582


17.22976121902467  78.20966682434077 hyderabad

17.383236	78.483067 koti-bustop
17.382253	78.484075-koti-OsmaniaMedicalColl
 
*/
