﻿//----------------------------------------------------------
// Copyright (C) ESRI. All rights reserved.
//----------------------------------------------------------
Type.registerNamespace('ESRI.ADF.Layers');ESRI.ADF.Layers.LayerCollection = function() {
ESRI.ADF.Layers.LayerCollection.initializeBase(this);this._resources = [];this._levels = null;this._pendingResourceCount=0;this._resourceChangedHandler = Function.createDelegate(this, this._resourceChanged);};ESRI.ADF.Layers.LayerCollection.prototype = {
dispose : function() {
for(var idx=0;idx<this._resources.length;idx++) {
this._resources[idx].dispose();}
Array.clear(this._resources);ESRI.ADF.Layers.LayerCollection.callBaseMethod(this, 'dispose');},
add : function(layer) {
Array.add(this._resources, layer);if(!layer.get_isInitialized())
{
layer.add_initialized(Function.createDelegate(this,this._onResourceInitialized));this._pendingResourceCount++;}
else if(this._pendingResourceCount===0) {
this._calculateLevelScheme();}
var handler = this.get_events().getHandler('layerAdded');if (handler) { handler(this, layer);}
layer.add_propertyChanged(this._resourceChangedHandler);},
insert : function(layer,index) {
Array.insert(this._resources,index,layer);if(!layer.get_isInitialized())
{
layer.add_initialized(Function.createDelegate(this,this._onResourceInitialized));this._pendingResourceCount++;}
else if(this._pendingResourceCount===0) {
this._calculateLevelScheme();}
var handler = this.get_events().getHandler('layerAdded');if (handler) { handler(this, layer);}
layer.add_propertyChanged(this._resourceChangedHandler);},
remove : function(layer) {
Array.remove(this._resources, layer);if(!layer.get_isInitialized())
{
layer.remove_initialized(this._onResourceInitialized);this._pendingResourceCount--;}
else { this._calculateLevelScheme();}
var handler = this.get_events().getHandler('layerRemoved');if (handler) { handler(this, layer);}
layer.remove_propertyChanged(this._resourceChangedHandler);},
indexOf : function(layer) {
return Array.indexOf(this._resources,layer);},
get_layer : function(index) {
return this._resources[index];},
get_layerCount : function() {
return this._resources.length;},
_onResourceInitialized : function(s,e) {
this._pendingResourceCount--;if(this._pendingResourceCount===0) {
this._calculateLevelScheme();var handler = this.get_events().getHandler('layersInitialized');if (handler) { handler(this, Sys.EventArgs.Empty);}
}
},
get_hasPendingLayers : function() {
return (this._pendingResourceCount>0);},
get_extent : function() {
if(this._resources.length===0) { return null;}
var extent = this._resources[0].get_extent();for(var idx=1;idx<this._resources.length;idx++) {
if(this._resources[idx].get_isInitialized()) {
extent = extent.join(this._resources[idx].get_extent());}
}
return extent;},
__hasTiledResources : function() {
Sys.Debug.trace('__hasTiledResources is obsolete. Use __hasLevels');for(var idx=0;idx<this._resources.length;idx++) {
if(ESRI.ADF.Layers.TileLayer.isInstanceOfType(this._resources[idx])) {
return true;} 
}
return false;},
__hasLevels : function() {
for(var idx=0;idx<this._resources.length;idx++) {
if(ESRI.ADF.Layers.TileLayer.isInstanceOfType(this._resources[idx])) {
return true;}
else if(this._resources[idx]._levels) {
return true;}
}
return false;},
getLevelByNearestPixelsize : function(pixelsize) {
if(!this._levels) { return null;}
var level = 0;for(var idx=1;idx<this._levels.length;idx++)
{
if(Math.abs(this._levels[idx]-pixelsize)<Math.abs(this._levels[level]-pixelsize)) {
level = idx;}
}
return level;},
get_levelResolution : function(level) {
if(this._levels) { return this._levels[level];}
else { return null;}
},
_calculateLevelScheme : function() {
if(this.get_layerCount()===0) { this._levels = null;return;} 
if(!this.__hasLevels()) { 
this._levels = null;}
else {
this._levels = [];for(var idx=0;idx<this._resources.length;idx++) {
if(ESRI.ADF.Layers.TileLayer.isInstanceOfType(this._resources[idx])) {
var levels = this._resources[idx].get_levels();for(var j=0;j<levels.length;j++) {
if(!Array.contains(this._levels,levels[j].get_resX())) {
Array.add(this._levels,levels[j].get_resX());}
}
}
else if(this._resources[idx].get_levels()) {
var levels = this._resources[idx].get_levels();for(var j=0;j<levels.length;j++) {
if(!Array.contains(this._levels,levels[j])) {
Array.add(this._levels,levels[j]);}
}
}
}
this._levels.sort(function(a,b){return (a<b?-1:1);});for(var k=this._levels.length-1;k>0;k--) {
if(this._resolutionsAreSame(this._levels[k],this._levels[k-1])) {
Array.remove(this._levels,this._levels[k]);}
}
this._levels.reverse();}
},
_resourceChanged : function(sender, args) {
var handler = this.get_events().getHandler('layerChanged');if (handler) { handler(this, {"resource": sender, "eventArgs": args});}
},
_resolutionsAreSame : function(r1,r2) {
if(r1===r2) { return true;}
return (Math.abs(256.0/r1*r2-256.0)<0.5);},
get_levels : function() {
return this._levels;},
add_layersInitialized : function(handler) {
this.get_events().addHandler('layersInitialized', handler);},
remove_layersInitialized : function(handler) { this.get_events().removeHandler('layersInitialized', handler);},
add_layerAdded : function(handler) {
this.get_events().addHandler('layerAdded', handler);},
remove_layerAdded : function(handler) { this.get_events().removeHandler('layerAdded', handler);},
add_layerRemoved : function(handler) {
this.get_events().addHandler('layerRemoved', handler);},
remove_layerRemoved : function(handler) { this.get_events().removeHandler('layerRemoved', handler);},
add_layerChanged : function(handler) {
this.get_events().addHandler('layerChanged', handler);},
remove_layerChanged : function(handler) { this.get_events().removeHandler('layerChanged', handler);}
};ESRI.ADF.Layers.LayerCollection.registerClass('ESRI.ADF.Layers.LayerCollection', Sys.Component);ESRI.ADF.Layers.Layer = function(id, extent, sref) {
if(id) { this.set_id(id);}
ESRI.ADF.Layers.Layer.initializeBase(this);this._extent = extent;this._spatialReference = sref;this._opacity = 1;this._visible = true;this._functionalities = [];};ESRI.ADF.Layers.Layer.prototype = {
initialize : function() {
ESRI.ADF.Layers.Layer.callBaseMethod(this, 'initialize');if(!this._name) { this._name = this.get_id();}
var handler = this.get_events().getHandler('initialized');if (handler) { handler(this, Sys.EventArgs.Empty);}
},
get_extent : function() {
return this._extent;},
set_extent : function(extent) {
if(extent && !ESRI.ADF.Geometries.Envelope.isInstanceOfType(extent)) { throw Error.argumentType('extent',Object.getType(extent),ESRI.ADF.Geometries.Envelope);}
if(this._extent !== extent && (!extent || !this._extent ||
extent.get_xmin()!==this._extent.get_xmin() || extent.get_ymin()!==this._extent.get_ymin() ||
extent.get_xmax()!==this._extent.get_xmax() || extent.get_ymax()!==this._extent.get_ymax())) {
this._extent=extent;this.raisePropertyChanged('extent');}
},
get_imageFormat : function() {
return this._imageFormat;},
set_imageFormat : function(value) {
this._imageFormat = value;},
get_name : function() {
return this._name;},
set_name : function(value) {
this._name = value;},
get_spatialReference : function() {
return this._spatialReference;},
set_spatialReference : function(value) {
this._spatialReference = value;},
get_opacity : function() {
return this._opacity;},
set_opacity : function(value) {
if(this._opacity !== value) {
this._opacity = value;this.raisePropertyChanged('opacity');}
},
get_visible : function() {
return this._visible;},
set_visible : function(value) {
if(this._visible !== value) {
this._visible = value;this.raisePropertyChanged('visible');}
},
add_initialized : function(handler) {
this.get_events().addHandler('initialized', handler);},
remove_initialized : function(handler) { this.get_events().removeHandler('initialized', handler);}
};ESRI.ADF.Layers.Layer.registerClass('ESRI.ADF.Layers.Layer', Sys.Component);ESRI.ADF.Layers.LevelInfo = function(tileHeight,tileWidth,rows,columns,resX,resY,minrow,mincol) {
this._tileHeight = tileHeight;this._tileWidth = tileWidth;this._rows = rows;this._columns = columns;this._minRow = (minrow?minrow:0);this._minCol = (mincol?mincol:0);this._resX = resX;this._resY = (resY?resY:resX);};ESRI.ADF.Layers.LevelInfo.prototype = {
get_tileHeight : function() {
return this._tileHeight;},
set_tileHeight : function(value) { this._tileHeight = value;},
get_tileWidth : function() {
return this._tileWidth;},
set_tileWidth : function(value) { this._tileWidth = value;},
get_rows : function() {
return this._rows;},
set_rows : function(value) { this._rows = value;},
get_columns : function() {
return this._columns;},
set_columns : function(value) { this._columns = value;},
get_minRow : function() {
return this._minRow;},
set_minRow : function(value) { this._minRow = value;},
get_minCol : function() {
return this._minCol;},
set_minCol : function(value) { this._minCol = value;},
get_resX : function() {
return this._resX;},
set_resX : function(value) { this._resX = value;},
get_resY : function() {
return this._resY;},
set_resY : function(value) { this._resY = value;}
};ESRI.ADF.Layers.LevelInfo.registerClass('ESRI.ADF.Layers.LevelInfo');ESRI.ADF.Layers.TileLayer = function(id, extent, levels, sref) {
ESRI.ADF.Layers.TileLayer.initializeBase(this, [id, extent, sref]);this._levels = (levels?levels:[]);};ESRI.ADF.Layers.TileLayer.prototype = {
getTileUrl : function(column,row,level,handler) {
throw(new Error.notImplemented('getTileUrl'));},
getLevelExtent : function(level) {
var dx = 0;var dy = 0;if(this._tileOrigin) {
dx = this._tileOrigin.get_x();dy = this._tileOrigin.get_y();}
else 
{
dx = this._extent.get_xmin();dy = this._extent.get_ymax();}
var levelinfo = this._levels[level];var tilewidth = levelinfo.get_tileWidth()*levelinfo.get_resX();var tileheight = levelinfo.get_tileHeight()*levelinfo.get_resY();dx += levelinfo.get_minCol()*tileheight;dy -= levelinfo.get_minRow()*tilewidth;return new ESRI.ADF.Geometries.Envelope( 
dx , dy - (levelinfo.get_rows())*tileheight,
dx + (levelinfo.get_columns())*tilewidth, dy,
this._spatialReference);},
getTileExtent : function(column,row,level) {
var dx = 0;var dy = 0;if(this._tileOrigin) {
dx = this._tileOrigin.get_x();dy = this._tileOrigin.get_y();}
else 
{
dx = this._extent.get_xmin();dy = this._extent.get_ymax();}
var lvl = this._levels[level];return new ESRI.ADF.Geometries.Envelope(
new ESRI.ADF.Geometries.Point(
(column)*lvl._tileWidth*lvl.get_resX()+dx,
dy - (row+1)*lvl._tileHeight*lvl.get_resY()),
new ESRI.ADF.Geometries.Point(
(column+1)*lvl._tileHeight*lvl.get_resX()+dx,
dy - (row)*lvl._tileWidth*lvl.get_resY()),
this._spatialReference);},
getTileSpanWithin : function(envelope, level) {
envelope = envelope.intersection(this.getLevelExtent(level));if(envelope) {
var dx = 0;var dy = 0;if(this._tileOrigin) {
dx = this._tileOrigin.get_x();dy = this._tileOrigin.get_y();}
else 
{
dx = this._extent.get_xmin();dy = this._extent.get_ymax();}
var lvl = this._levels[level];var res = lvl.get_resX();var colStart = Math.floor((envelope.get_xmin()-dx+lvl._resX*0.5) / (res * lvl._tileWidth));var rowStart = Math.floor((dy-envelope.get_ymax()+lvl._resY*0.5) / (res * lvl._tileHeight)) ;var colEnd = Math.floor((envelope.get_xmax()-dx-lvl._resX*0.5) / (res * lvl._tileWidth));var rowEnd = Math.floor((dy-envelope.get_ymin()+lvl._resY*0.5) / (res * lvl._tileHeight));if(rowEnd>=lvl.get_rows()+lvl.get_minRow()) { rowEnd = lvl.get_rows()+lvl.get_minRow()-1;}
if(colEnd>=lvl.get_columns()+lvl.get_minCol()) { colEnd = lvl.get_columns()+lvl.get_minCol()-1;}
return [ colStart, rowStart, colEnd, rowEnd ];}
else { return [ 0, 0, -1, -1 ];}
},
getLevelByNearestPixelsize : function(pixelsizeX) {
var level = 0;for(var idx=1;idx<this._levels.length;idx++)
{
if(Math.abs(this._levels[idx].get_resX()-pixelsizeX)<Math.abs(this._levels[level].get_resX()-pixelsizeX)) {
level = idx;}
}
return level;},
getLevelInfo : function(level) {
return this._levels[level];},
get_minimumResolution : function() {
return this._levels[0].get_resX();},
set_minimumResolution : function() {
throw new Error.invalidOperation('Cannot set minimum resolution on a tiled resource');},
get_maximumResolution : function() {
return this._levels[this._levels.length-1].get_resX();},
set_maximumResolution : function() {
throw new Error.invalidOperation('Cannot set maximum resolution on a tiled resource');},
get_tileOrigin : function() {
return this._tileOrigin;},
set_tileOrigin : function(value) { this._tileOrigin = value;},
get_levels : function() {
return this._levels;},
set_levels : function(value) { this._levels = value;} 
};ESRI.ADF.Layers.TileLayer.registerClass('ESRI.ADF.Layers.TileLayer',ESRI.ADF.Layers.Layer);ESRI.ADF.Layers.DynamicLayer = function(id, extent, sref) {
ESRI.ADF.Layers.DynamicLayer.initializeBase(this, [id, extent, sref]);this._extent = extent;this._spatialReference = null;this._useTiling = false;this._tilesize = null;this._minimumResolution = 0;this._maximumResolution = Number.MAX_VALUE;this._levels = null;};ESRI.ADF.Layers.DynamicLayer.prototype = {
getUrl : function(minx,miny,maxx,maxy,width,height,handler) {
throw(new Error.notImplemented('getUrl'));},
get_minimumResolution : function() {
return this._minimumResolution;},
set_minimumResolution : function(value) {
this._minimumResolution = value;},
get_maximumResolution : function() {
return this._maximumResolution;},
set_maximumResolution : function(value) {
this._maximumResolution = value;},
get_useTiling : function() {
return this._useTiling;},
set_useTiling : function(value) {
this._useTiling = value;},
get_tilesize : function() {
return this._tilesize;},
set_tilesize : function(value) {
this._tilesize = value;},
get_levels : function() {
return this._levels;}, 
set_levels : function(value) {
this._levels = value;}
};ESRI.ADF.Layers.DynamicLayer.registerClass('ESRI.ADF.Layers.DynamicLayer',ESRI.ADF.Layers.Layer);ESRI.ADF.Layers.AdfTileHandler = function() {
ESRI.ADF.Layers.AdfTileHandler.initializeBase(this);this._onCompleteHandler = Function.createDelegate(this,this._onComplete);this._timeout = 90000;};ESRI.ADF.Layers.AdfTileHandler.prototype = {
getTileUrl : function(c,r,level,handler) {
if (c>=0 && r>=0) { 
if(ESRI.ADF.System.checkSessionExpired && ESRI.ADF.System.checkSessionExpired()) { return;}
var argument = '&Row=' +r + '&Column=' + c + '&Level=' + level + '&t='+(new Date()).getTime();var wRequest = new Sys.Net.WebRequest();wRequest.add_completed(this._onCompleteHandler);wRequest.set_url(this._tileHandlerUrl+argument);wRequest.set_userContext(handler);wRequest.set_timeout(this._timeout);wRequest.invoke();}
},
_onComplete : function(executor,eventArgs) {
var handler = executor.get_webRequest().get_userContext();var url = executor.get_webRequest().get_url();if(executor.get_responseAvailable()) {
if(ESRI.ADF.System.resetSessionLapse) { ESRI.ADF.System.resetSessionLapse();}
var result = executor.get_responseData();var obj = null;try { obj = Sys.Serialization.JavaScriptSerializer.deserialize(result);}
catch(ex) {
this._raiseError('Invalid JSON response: ' + result, url, null);handler('');return;}
if(obj.code && obj.code!==200) {
this._raiseError('DrawTile returned error: ' + obj.errorMessage, url, obj.code);handler('');}
else if(!obj.url && obj.url!=='') {
this._raiseError('Invalid response', url, executor.get_statusCode());handler('');}
else if(obj.url==='') {
this._raiseError('Returned empty URL', url, executor.get_statusCode());handler('');}
else { handler(obj.url);}
}
else if(executor.get_timedOut()) {
this._raiseError('Response timed out', url, null);handler('');}
else if(executor.get_aborted()) {
this._raiseError('Request was aborted', url, null);handler('');}
else {
this._raiseError('Empty response', url, executor.get_statusCode());handler('');}
},
_raiseError : function(message, url, statusCode) {
Sys.Debug.trace('MapHandler error\nmessage:'+message+'\n url:'+url+'\nresource:'+this.get_id()+'\nstatus code:'+statusCode);var handler = this.get_events().getHandler('requestError');if (handler) { handler(this, {"errorMessage": message, "url":url, "statusCode":statusCode});}
},
add_requestError : function(handler) {
this.get_events().addHandler('requestError', handler);},
remove_requestError : function(handler) { this.get_events().removeHandler('requestError', handler);},
get_tileHandlerUrl : function() {
return this._tileHandlerUrl;},
set_tileHandlerUrl : function(value) {
this._tileHandlerUrl = value;},
get_timeout : function() {
return this._timeout;},
set_timeout : function(value) { this._timeout = value;}
};ESRI.ADF.Layers.AdfTileHandler.registerClass('ESRI.ADF.Layers.AdfTileHandler',ESRI.ADF.Layers.TileLayer);ESRI.ADF.Layers.AdfMapHandler = function() {
ESRI.ADF.Layers.AdfMapHandler.initializeBase(this);this._onCompleteHandler = Function.createDelegate(this,this._onComplete);this._timeout = 90000;};ESRI.ADF.Layers.AdfMapHandler.prototype = {
getUrl : function(minx,miny,maxx,maxy,width,height,handler) {
if(ESRI.ADF.System.checkSessionExpired && ESRI.ADF.System.checkSessionExpired()) { return;}
var argument = '&Extent=' + minx + ',' + miny + ',' + maxx + ',' + maxy + '&Width=' + width + '&Height=' + height + '&t='+(new Date()).getTime();var wRequest = new Sys.Net.WebRequest();wRequest.add_completed(this._onCompleteHandler);wRequest.set_url(this._mapHandlerUrl+argument);wRequest.set_userContext(handler);wRequest.set_timeout(this._timeout);wRequest.invoke();},
_onComplete : function(executor,eventArgs) {
var handler = executor.get_webRequest().get_userContext();var url = executor.get_webRequest().get_url();if(executor.get_responseAvailable()) {
if(ESRI.ADF.System.resetSessionLapse) { ESRI.ADF.System.resetSessionLapse();}
var result = executor.get_responseData();var obj = null;try { obj = Sys.Serialization.JavaScriptSerializer.deserialize(result);}
catch(ex) {
this._raiseError('Invalid JSON response: ' + result, url, null);handler('');return;}
if(obj.code && obj.code!==200) {
this._raiseError('DrawImage returned error: ' + obj.errorMessage, url, obj.code);handler('');}
else if(!obj.url && obj.url!=='') {
this._raiseError('Invalid response', url, executor.get_statusCode());handler('');}
else if(obj.url==='') {
this._raiseError('Returned empty URL', url, executor.get_statusCode());handler('');}
else {
if(obj.imageExtent) {
handler(obj.url, new ESRI.ADF.Geometries.Envelope(obj.imageExtent[0],obj.imageExtent[1],obj.imageExtent[2],obj.imageExtent[3]));}
else { handler(obj.url);}
}
}
else if(executor.get_timedOut()) {
this._raiseError('Response timed out', url, null);handler('');}
else if(executor.get_aborted()) {
this._raiseError('Request was aborted', url, null);handler('');}
else {
this._raiseError('Empty response', url, executor.get_statusCode() );handler('');}
},
_raiseError : function(message, url, statusCode) {
Sys.Debug.trace('MapHandler error\nmessage:'+message+'\n url:'+url+'\nresource:'+this.get_id()+'\nstatus code:'+statusCode);var handler = this.get_events().getHandler('requestError');if (handler) { handler(this, {"errorMessage": message, "url":url, "statusCode":statusCode});}
},
add_requestError : function(handler) {
this.get_events().addHandler('requestError', handler);},
remove_requestError : function(handler) { this.get_events().removeHandler('requestError', handler);},
get_mapHandlerUrl : function() {
return this._mapHandlerUrl;},
set_mapHandlerUrl : function(value) { this._mapHandlerUrl = value;},
get_timeout : function() {
return this._timeout;},
set_timeout : function(value) { this._timeout = value;}
};ESRI.ADF.Layers.AdfMapHandler.registerClass('ESRI.ADF.Layers.AdfMapHandler',ESRI.ADF.Layers.DynamicLayer);ESRI.ADF.Layers.AdfMapPageHandler = function() {
ESRI.ADF.Layers.AdfMapPageHandler.initializeBase(this);this._requestIdCounter=0;this._handlers = {};};ESRI.ADF.Layers.AdfMapPageHandler.prototype = {
getUrl : function(minx,miny,maxx,maxy,width,height,handler) {
if(ESRI.ADF.System.checkSessionExpired && ESRI.ADF.System.checkSessionExpired()) { return;}
var id = this._requestIdCounter++;var argument = 'EventArg=GetImage&resource='+this.get_id()+'&ID='+id+'&Extent=' + minx + ',' + miny + ',' + maxx + ',' + maxy + '&Width=' + width + '&Height=' + height + '&t='+(new Date()).getTime();this._handlers['Request_'+id] = handler;this._map.doCallback(argument,this);},
processCallbackResult : function(action,params) {
if(action === 'GetImage') {
var obj = params[0];var id = obj.id;var handler = this._handlers['Request_'+id];if(handler) {
if(obj.error) { this._raiseError('GetImage returned error: ' + obj.error);handler('');}
if(obj.imageExtent) { handler(obj.url, new ESRI.ADF.Geometries.Envelope(obj.imageExtent[0],obj.imageExtent[1],obj.imageExtent[2],obj.imageExtent[3]));}
else { handler(obj.url);}
}
return true;}
return false;},
_raiseError : function(message) {
Sys.Debug.trace('MapPageHandler error: ' + message);var handler = this.get_events().getHandler('requestError');if (handler) { handler(this, {"errorMessage": message });}
},
add_requestError : function(handler) {
this.get_events().addHandler('requestError', handler);},
remove_requestError : function(handler) { this.get_events().removeHandler('requestError', handler);},
get_map : function() {
return this._map;},
set_map : function(value) { this._map = value;}
};ESRI.ADF.Layers.AdfMapPageHandler.registerClass('ESRI.ADF.Layers.AdfMapPageHandler',ESRI.ADF.Layers.DynamicLayer);ESRI.ADF.Layers.AdfTileDirectAccess = function() {
this._tileUrlGeneratorFunction = null;this._serverUrl = null;ESRI.ADF.Layers.AdfTileDirectAccess.initializeBase(this);};ESRI.ADF.Layers.AdfTileDirectAccess.prototype = {
getTileUrl : function(c,r,level,handler) {
handler(this._tileUrlGeneratorFunction(level, c, r, this._serverUrl));},
get_tileUrlGeneratorFunction : function() {
return this._tileUrlGeneratorFunction;},
set_tileUrlGeneratorFunction : function(value) {
this._tileUrlGeneratorFunction = value;},
get_serverUrl : function() {
return this._serverUrl;},
set_serverUrl : function(value) {
this._serverUrl = value;}
};ESRI.ADF.Layers.AdfTileDirectAccess.registerClass('ESRI.ADF.Layers.AdfTileDirectAccess',ESRI.ADF.Layers.TileLayer);if (typeof(Sys) !== "undefined") { Sys.Application.notifyScriptLoaded();}

if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();