//declaration and initialization, configuration (updated 20080826)
var map, objMyKMLs, objMyTopFeatures, objBusRoutes, objKMLTileReq, objSrcMarker, markers,
    intBStopZoom=3,
    intTotalZoom=6,
    intCenterX=103.84866240234375,
    intCenterY=1.3586332275390624,
    intXPlus=0.0163,//0.012,
    intYPlus=0.00848,//0.0045,
    intImgReloadAttemp=3,
    strTopMostLayerName="topmost",
    strBusRoutesURL="busroutes/",//http://10.70.4.149:8008
    strBusStopsURL="busstops/busstops-kml-",
    strMrtURL="mrt.kml",
    strPnrURL="PnR.kml",
    strTaxiURL="taxi.kml",
    strImgURL='',
    strMapServerURL="/tilecache/",//production
    //strMapServerURL="/cgi-bin/tilecache.cgi?",//development
    arrTileBounds = new Array(103.60237668500001, 1.233206, 104.1028941, 1.47733325),    
    //arrOriBounds= new Array(103.60237668500001, 1.233206, 104.1028941, 1.47733325),
    //arrResolution= new Array(0.00097757307617185596, 0.00048878653808592798, 0.00024439326904296399,6.1098317260740997e-005,1.5274579315185249e-005,3.8186448287963123e-006);
    arrOriBounds= new Array(-180, -90, 180, 90),
    arrResolution= new Array(0.0006866455078125, 0.000171661376953125, 4.291534423828125e-005, 2.1457672119140625e-005, 1.0728836059570313e-005, 5.3644180297851563e-006);        

/* @@Isaac: 20081117 commented to fix double loading map tiles issue. 
for(var i = 0; i<intTotalZoom; i++){
  eval ("var mapZoomLevel" + i + ";");
} 
*/       
//end of declaration and initialization, configuration
function init(strMapGuideIP,strkmlpath,strPage, strMapImgURL, ballonInd){

    //redefine URL to add in Magnolia path
    strBusRoutesURL = strkmlpath + strBusRoutesURL;
    strBusStopsURL  = strkmlpath + strBusStopsURL;
    strMrtURL       = strkmlpath + strMrtURL;
    strPnrURL       = strkmlpath + strPnrURL;
    strTaxiURL      = strkmlpath + strTaxiURL;
    strImgURL       = strMapImgURL;
		strPageURL      = strkmlpath + strPage + ".kml";
		
		if (ballonInd == null)
			ballonInd = true ;
		    
    //avoid pink tiles
    OpenLayers.IMAGE_RELOAD_ATTEMPTS = intImgReloadAttemp;
    OpenLayers.Util.alphaHack = function() { return false; }
    // define custom map zoom event listeners to change base map
    function mapZoomEvent(event) {
        /* @@Isaac: 20081117 commented to fix double loading map tiles issue.
        var i;
        for(i = 0; i<intTotalZoom; i++){
            if(map.getZoom() == i){
                eval("map.setBaseLayer(mapZoomLevel" + i + ");");
                break;
                }
        }*/
        if(map.getZoom()>= intBStopZoom){
            if(objMyKMLs.getLayer(strTopMostLayerName)){
                objMyKMLs.enableLayer(strTopMostLayerName);
                objMyKMLs.setTopMostLayer(objMyKMLs.getLayer(strTopMostLayerName));
            }
            if (strPage != ""){
                if(objMyKMLs.containsLayerKey(strPageURL)){
                    objMyKMLs.disableLayer(strPageURL);
                }
            }
        }
        else{
            if(objMyKMLs.getLayer(strTopMostLayerName))
                objMyKMLs.disableLayer(strTopMostLayerName);
            if (strPage != ""){
                if(objMyKMLs.containsLayerKey(strPageURL)){
                    objMyKMLs.enableLayer(strPageURL);
                    objMyKMLs.setTopMostLayer(objMyKMLs.getLayer(strPageURL));
                }
            }
        }
    /* @@Isaac: 20081117 commented to fix double loading map tiles issue.
        if(i==intTotalZoom+1)
            eval("map.setBaseLayer(mapZoomLevel" + i-intTotalZoom-1 + ");");
    */          
        objMyKMLs.setTopMostLayer(markers);
    }
    
    // define custom map "move end" event listener to load bus stops
    function mapMoveEvent(event) {
        if(map.getZoom()>=intBStopZoom){
            var currBounds = (map.getExtent()).toArray();
            var busStopsKML = objKMLTileReq.findKMLTiles(currBounds);
            
            for(var i = 0; i<busStopsKML.length; i++){
                if(!objMyTopFeatures.containsFeatureKey(busStopsKML[i])){
                    objMyTopFeatures.addFeature(busStopsKML[i],busStopsKML[i],true);
                    objMyTopFeatures.enableFeature(busStopsKML[i]);
                } else if(objMyTopFeatures.containsFeatureCacheKey(busStopsKML[i]) 
                    && !objMyTopFeatures.containsFeatureActKey(busStopsKML[i])){
                    objMyTopFeatures.enableFeature(busStopsKML[i]);
                    //document.getElementById("footerValue").innerHTML = document.getElementById("footerValue").innerHTML + "<br/>getting from cache " +busStopsKML[i];
                }
            }
            //performance tuning: remove unseen busstops
            objMyTopFeatures.retainFeatures(busStopsKML);
            //objMyKMLs.getCtrl("topmost").clickFeature((objMyTopFeatures.getFeature("kml/busstops/busstops-kml-899.kml"))[1]);
        }
    }

    maxExt = new OpenLayers.Bounds(arrOriBounds[0],arrOriBounds[1],arrOriBounds[2],arrOriBounds[3]); 
    map_opts = {
    'controls' : new Array(
        //new OpenLayers.Control.KeyboardDefaults(),
        new OpenLayers.Control.Navigation(),
        new OpenLayers.Control.PanZoomBar()
    ),
    'maxExtent' : maxExt,
    'resolutions': [ arrResolution[0],arrResolution[1],arrResolution[2],arrResolution[3],arrResolution[4],arrResolution[5] ],
    'maxResolution': arrResolution[0],
    'numZoomLevels': intTotalZoom,
    'eventListeners': {
                "zoomend": mapZoomEvent,
                "moveend": mapMoveEvent}
    };

    map = new OpenLayers.Map( $('map'),map_opts);    

    // @@Isaac: 20081117 added to fix double loading map tiles issue.
    // @@Isaac: 20090311 converted into tilecache layer for faster loading time
    /*
    SGBaseMap1 = new OpenLayers.Layer.WMS('SGBaseMap1',["http://" + strMapGuideIP + strMapServerURL],
        {layers:'mapZoomLevel5'},{'buffer':0,'displayInLayerSwitcher':false,
        'attribution': '<a href=\"http://www.sla.gov.sg/\"><img border=\"0\" src=\"/img/SLA_logo.gif\" /></a>'});
    */
    SGBaseMap1 = new OpenLayers.Layer.TileCache("SGBaseMap1",["http://" + strMapGuideIP + strMapServerURL],
            "mapZoomLevel5",{'format':'image/gif','buffer':0,'displayInLayerSwitcher':false,
            'attribution': '<a href=\"http://www.sla.gov.sg/\"><img border=\"0\" src=\"/img/SLA_logo.gif\" /></a>',
            'resolutions': arrResolution});
    map.addLayer(SGBaseMap1);
    
    /* @@Isaac: 20081117 commented to fix double loading map tiles issue.
    for(var i = 0; i<intTotalZoom; i++){
      var tempName = "mapZoomLevel" + i;
      selected_layers = tempName;
      //,'http://10.70.4.149:8008/cgi-bin/tilecache.cgi?'
      eval(tempName + " = new OpenLayers.Layer.WMS('" + tempName 
            + "',['" + "http://" + strMapGuideIP + strMapServerURL + "'],{layers:'" + selected_layers 
            + "'},{'buffer':0,'displayInLayerSwitcher':false,"
            + "'attribution': '<a href=\"http://www.sla.gov.sg/\"><img border=\"0\" src=\"/img/SLA_logo.gif\" /></a>'"
            + "});");            
      eval("map.addLayer(" + tempName + ");"); 
    }
    */
    
    
var resoOverview = new Array([0.00274658203125]);
/*
var strMapServerURL1="/cgi-bin/tilecache.cgi?";
var overviewMap1  = new OpenLayers.Layer.WMS('overviewMap',["http://10.70.0.236:8008/" + strMapServerURL1],
        {layers:'mapZoomLevel99'},{'format':'image/gif','resolutions': resoOverview});

*/

//Define overview map
var overviewmap = new OpenLayers.Layer.Image(
                'overview map',
                'http://'+strMapGuideIP+'/publish/scripts/map/img/overview.gif',
                new OpenLayers.Bounds(103.57469084472,1.2295438720704,104.06907561034,1.4767362548829),
                new OpenLayers.Size(180, 90),
                {numZoomLevels: 1}
            );
		
		var options = {
			layers: [overviewmap],
			mapOptions: {
      	restrictedExtent: new OpenLayers.Bounds(103.57469084472,1.2295438720704,104.06907561034,1.4767362548829)
      }

			};
		var overviewmap = new OpenLayers.Control.OverviewMap(options);
		map.addControl(overviewmap);
        overviewmap.maximizeControl();
//End of define foe overview map


    //map.addControl(new OpenLayers.Control.PanZoomBar());            
    map.addControl(new OpenLayers.Control.ScaleLine());            
    map.addControl(new OpenLayers.Control.MousePosition());
    //map.addControl(new OpenLayers.Control.LayerSwitcher());
    map.addControl(new OpenLayers.Control.Attribution());
    //map.addControl(new OpenLayers.Control.KeyboardDefaults());
    //map.addControl(new OpenLayers.Control.OverviewMap());
    //map.addControl(new OpenLayers.Control.MouseToolbar());

    //objects initialization
    objBusRoutes  = new BusRoutes(strBusRoutesURL);
    objMyKMLs     = new objKMLs();
    objKMLTileReq = new objKMLTiles(arrTileBounds,intXPlus,intYPlus,strBusStopsURL);
    objSrcMarker  = new SearchMarker();
    //create an empty layer in objMyKMLs to serve as topmost layer, 
    //"topmost" will need to set to topmost layer after every new layer[s] added
    //OpenLayers.Feature.Vector.style['default'].cursor = 'pointer';
    objMyTopFeatures =  new objFeatures(objMyKMLs.createTopMostLayer(strTopMostLayerName));
    objMyKMLs.disableLayer(strTopMostLayerName);//disable top most layer as initially is zoom level 0;
    objMyTopFeatures.srcMarker=objSrcMarker;
    //end of objects initialization
    
    //add markers layer after top most layer is created, so that markers will always on top.
    markers = new OpenLayers.Layer.Markers( "Markers", {'calculateInRange': function() { return true; }});
    map.addLayer(markers);
    
    if (strPage != ""){
        if(!objMyKMLs.containsLayerKey(strPageURL)){
            objMyKMLs.addLayer(strPageURL,strPageURL,false,ballonInd);
            objMyKMLs.enableLayer(strPageURL);
        }
    }
    
    // @@Isaac: 20081117 modded to fix double loading map tiles issue.
    map.setBaseLayer(SGBaseMap1);
    
    map.moveTo(new OpenLayers.LonLat(intCenterX,intCenterY),0);
}

function resizeMapDiv(){
    var mapDiv = document.getElementById("map");
    //alert(mapDiv.style["height"]);
    if(mapDiv.style["height"] == "285px" || mapDiv.style["height"] == ""){
        mapDiv.style["height"] = "395px";
        document.getElementById("mapResizeLink").innerHTML = "Normal View";
    }
    else{
        mapDiv.style["height"] = "285px";
        document.getElementById("mapResizeLink").innerHTML = "Expand Map";
    }
}

function BusRoutes(strKMLURL){
    this.strKMLURL = strKMLURL;
    this.kmlLayer = new Array();
    
    this.showBusRoutes = function (intZoom, strCom, strSvcNo, intDir){
        strSvcNo = strSvcNo.replace('#','%23');    
        //if(this.kmlLayer != null && this.kmlLayer !=)
        var strURL = new Array();
        if(intDir != null || intDir != ""){
            for(var i=0;i<intDir;i++)
                strURL[i] = strKMLURL + strCom + "-" + strSvcNo + "-" + (i+1) + ".kml";
        } else {
            intDir = "1";
            strURL[0] = strKMLURL + strCom + "-" + strSvcNo + "-" + intDir + ".kml";
        }
        
        for(var i=0;i<this.kmlLayer.length;i++){
            if(this.kmlLayer[i] != null){
                //this.kmlLayer[i].destroy();
                this.kmlLayer[i].setVisibility(false);
                this.kmlLayer[i] = null;
            }
        }
        for(var i=0;i<strURL.length;i++){
            //objMyKMLs.removeLayer(strCom+strSvcNo+i);
            objMyKMLs.addLayer(strCom+strSvcNo+i, strURL[i], false, false);            
            this.kmlLayer[i] = objMyKMLs.enableLayer(strCom+strSvcNo+i);
        }

        map.moveTo(new OpenLayers.LonLat(intCenterX,intCenterY),intZoom);
    }
}

function SearchMarker(){
    //markers' icon setting
    var size = new OpenLayers.Size(18,18);
    var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
    this.icon = new OpenLayers.Icon('http://' + strImgURL + '/img/landmark.gif',size,offset);
    
    this.showOnMap = function (intZoom,lon,lat){
        if(this.marker != null){
            markers.removeMarker(this.marker);
            //this.marker.destroy();
        }
        if(map.getZoom()==intZoom){
            //if(getInternetExplorerVersion()==-1)
                map.moveTo(new OpenLayers.LonLat(lon,lat),0);
        }
        map.moveTo(new OpenLayers.LonLat(lon,lat),intZoom);
        this.marker = new OpenLayers.Marker(new OpenLayers.LonLat(lon,lat),this.icon);
        
        /* todo: auto-click marker feature.
        if(map.getZoom()>=intBStopZoom){
            var currBounds = (map.getExtent()).toArray();
            var busStopsKML = objKMLTileReq.findKMLTiles(currBounds);
        }*/
        
        //marker.setOpacity(1);
        //marker.events.register('mousedown', marker, function(evt) { alert(this.icon.url); OpenLayers.Event.stop(evt); });
        markers.addMarker(this.marker);
        objMyKMLs.setTopMostLayer(markers);
    }    
}

//move private function from KMLobject into public function which needed by SearchMarker object.
function getInternetExplorerVersion()
    // Returns the version of Internet Explorer or a -1
    // (indicating the use of another browser).
    {
      var rv = -1; // Return value assumes failure.
      if (navigator.appName == 'Microsoft Internet Explorer')
      {
        var ua = navigator.userAgent;
        var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
        if (re.exec(ua) != null)
          rv = parseFloat( RegExp.$1 );
      }
      return rv;
    }
