OpenLayers.Util.OSM = {};
OpenLayers.Util.OSM.MISSING_TILE_URL = "/include/openstreetmap/t.png";
OpenLayers.Util.onImageLoadError = function() {this.src = OpenLayers.Util.OSM.MISSING_TILE_URL;};

OpenLayers.Layer.OSM = OpenLayers.Class(OpenLayers.Layer.TMS, {
    initialize: function(name, url, options) {
        options = OpenLayers.Util.extend({
            attribution: map_source,
            maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
            maxResolution: 156543.0339,
            units: "m",
            projection: "EPSG:900913",
            transitionEffect: "resize"
        }, options);
        var newArguments = [name, url, options];
        OpenLayers.Layer.TMS.prototype.initialize.apply(this, newArguments);
    },

    getURL: function (bounds) {
        var res = this.map.getResolution();
        var x = Math.round((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
        var y = Math.round((this.maxExtent.top - bounds.top) / (res * this.tileSize.h));
        var z = this.map.getZoom();
        var limit = Math.pow(2, z);

        if (y < 0 || y >= limit)
        {
            return OpenLayers.Util.OSM.MISSING_TILE_URL;
        }
        else
        {
            x = ((x % limit) + limit) % limit;
            return this.url + z + "/" + x + "/" + y + ".png";
        }
    },

    CLASS_NAME: "OpenLayers.Layer.OSM"
});

OpenLayers.Layer.OSM.Mapnik = OpenLayers.Class(OpenLayers.Layer.OSM, {
    initialize: function(name, options) {
        var url = "/include/openstreetmap/tiles/";
        var newArguments = [name, url, options];
        OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments);
    },

    CLASS_NAME: "OpenLayers.Layer.OSM.Mapnik"
});

