/* this code is public domain - alastair tse <http://www.liquidx.net/> */

map = null;

/* simple mochikit-esque implementation */

getElement = function(element) {
	return document.getElementById(element);
};

addLoadEvent = function(func) {
	if (window.onload) {
		var old_load_event = window.onload;
		window.onload = function() {
			old_load_event();
			func();
		};
	}
	else {
		window.onload = func;
	}
};

function windowSize() {
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement &&
      ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
  return {"width":myWidth, "height":myHeight};
}

function onresize(ev) {
	var size = windowSize();
	var mapElement = getElement('map');
	mapElement.style.height = size.height + "px"
	mapElement.style.width = size.width + "px";
	if (map)
		map.checkResize();
}

tileZoomToLatLng = function(tile, zoom) {
    var proj = G_SATELLITE_MAP.getProjection();
    var latlng = proj.fromPixelToLatLng(tile, zoom);
    return latlng;
};

newStreetMapType = function(opacity) {
    var streetCopyright = new GCopyrightCollection("street-directory.com.au");
    var streetTileLayer = new GTileLayer(streetCopyright, 5, 15);
    streetTileLayer.getOpacity = function() { return opacity; };
    streetTileLayer.isPng = function() { return false; };
        /* zoom levels:
           sd zoom
           6 = 150m
           5 = 300m
           4 = 2000m
           3 = 8000m
           2 = 19000m
           1 = 106000m
        */
    streetTileLayer.zoomLookup = {
        18: {sdzoom: 6, tileSizeY: 44, tileSizeX: 54 }, // ..
        17: {sdzoom: 6, tileSizeY: 87, tileSizeX: 108 }, // ..
        16: {sdzoom: 6, tileSizeY: 175, tileSizeX: 215 }, // 75
        15: {sdzoom: 6, tileSizeY: 350, tileSizeX: 430 }, // 150
        14: {sdzoom: 5, tileSizeY: 350, tileSizeX: 430 }, // 300
        13: {sdzoom: 4, tileSizeY: 105, tileSizeX: 129 }, // 600
        12: {sdzoom: 4, tileSizeY: 210, tileSizeX: 258 }, // 1200
        11: {sdzoom: 4, tileSizeY: 420, tileSizeX: 516 }, // 2400
        10: {sdzoom: 3, tileSizeY: 210, tileSizeX: 258 }, // 4800
        9: {sdzoom: 3, tileSizeY: 420, tileSizeX: 516}, // 9600
        8: {sdzoom: 2, tileSizeY: 354, tileSizeX: 435}, // 19200
        7: {sdzoom: 1, tileSizeY: 127, tileSizeX: 156}, // 38400
        6: {sdzoom: 1, tileSizeY: 254, tileSizeX: 312}, // 76800
        5: {sdzoom: 1, tileSizeY: 508, tileSizeX: 624}
    };
    streetTileLayer.getTileUrl = function(tile, zoom) {
        var base = "http://www.street-directory.com.au/sd_new/genmap.cgi?circle=&star=0&";
        
        var pixel = new GPoint(tile.x*256 + 128, tile.y*256 + 128);
        var center = tileZoomToLatLng(pixel, zoom);
        var level = this.zoomLookup[zoom].sdzoom;
        var tileSizeY = this.zoomLookup[zoom].tileSizeY;
        var tileSizeX = this.zoomLookup[zoom].tileSizeX;
        var url = base + "sizex=" + tileSizeX + "&sizey=" + tileSizeY + "&x=" + center.lng() + "&y=" + center.lat() + "&level=" + level;
        return url;
    };

    var streetMapOptions = {
        shortName: "Map",
        urlArg: "c",
        maxResolution: 18,
        minResolution: 5,
        textColor: "black",
        linkColor: "blue",
        tileSize: 256,
        errorMessage: "Out of range"
    };

    
    var streetMapType = null;
    
    if (opacity == 1.0) {
        streetMapType = new GMapType([streetTileLayer], 
                                      G_SATELLITE_MAP.getProjection(),
                                      "Street Map",
                                      streetMapOptions);
        streetMapType.getCopyright = function(bounds, zoom) {
            return "Street-Directory.com.au";
        };
    }
    else {
         streetMapType = new GMapType([G_SATELLITE_MAP.getTileLayers()[0],
                                        streetTileLayer], 
                                        G_SATELLITE_MAP.getProjection(),
                                        "Hybrid",
                                        streetMapOptions);

        streetMapType.getCopyright = function(bounds, zoom) {
            return "Street-Directory.com.au + Google Maps";
        };        
    }
    return streetMapType;
}

var mymap = null;

function main() {
	//window.onresize = onresize;
	//onresize();

    var aus = new GLatLng(-33.86956,151.208611);

    var G_STREETMAP_MAP = newStreetMapType(1.0);
    var G_STREETMAPHYBRID_MAP = newStreetMapType(0.5);
    
 
	mymap = new GMap2(getElement('map'));
    mymap.removeMapType(G_HYBRID_MAP);
    mymap.removeMapType(G_NORMAL_MAP);
	mymap.setCenter(aus, 15);
    mymap.addMapType(G_STREETMAP_MAP);
    mymap.addMapType(G_STREETMAPHYBRID_MAP);    
    mymap.addControl(new GMapTypeControl());
    mymap.addControl(new GLargeMapControl());
    mymap.setMapType(G_STREETMAPHYBRID_MAP);

    //mymap.setMapType(G_SATELLITE_MAP);

    /*

    var tiles = getElement('map').firstChild.firstChild.firstChild.childNodes;
    for (var i = 0; i < tiles.length; i++) {
        var img = tiles[i];
        img.style.border = "1px solid red";
        log("img: (" + img.style.top + ", " + img.style.left + ")");
    }

    var recursiveDump = function(node, path, level) {
        var props = keys(node);
        if (level > 3)
            return;
        for (var i = 0; i < props.length; i++) {
            var obj = node[props[i]];
            log(path + "." + props[i] + ": " + obj);
            if (typeof(obj) == 'object') {
                recursiveDump(obj, path + "." + props[i], level + 1);
            }
            else if (typeof(obj) == 'object' && (obj.length) {
                for (var j = 0; j < obj.length; j++) {
                    if (typeof(obj[j]) == 'object') {
                        recursiveDump(obj[j], path + "." + props[i] + "[" + j + "]", level + 1);
                    }
                }
            }
        }
    };
    */
    //recursiveDump(mymap, "", 0);
    
}

this.getmap = function() {
    return mymap;
}


addLoadEvent(main);
