﻿Type.registerNamespace('DDTI.Web.Map.Viewer');

var _rectangleAnchorClientX = null;
var _rectangleAnchorClientY = null;
var _rectangleAnchorOffsetX = null;
var _rectangleAnchorOffsetY = null;

var _mapLeft = null;
var _mapTop = null;
var _mapPanOffsetX = null;
var _mapPanOffsetY = null;

var _isInit = false;

var measurePointCount = 0;
var measurementCoordinates = new Array(100);
for (i=0; i < 100; i++) { measurementCoordinates[i] = new Array(2) };


DDTI.Web.Map.Viewer.DTViewerComponent = function(element) { 
    DDTI.Web.Map.Viewer.DTViewerComponent.initializeBase(this, [element]);
}

DDTI.Web.Map.Viewer.DTViewerComponent.prototype = {
    initialize : function() {
        DDTI.Web.Map.Viewer.DTViewerComponent.callBaseMethod(this, 'initialize');

        DDTI.Web.Map.Toolbox.DTToolboxComponent.prototype.set_activeTool(DDTI.Web.Map.Toolbox.DTToolTypes.ZoomIn);
        $addHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'load', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onLoad);
        $addHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'click', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onClick);
        $addHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'dblclick', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onDblClick);
        $addHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'mousedown', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onMouseDown);
        $addHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'mouseup', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onMouseUp);
        
        _mapLeft = parseInt($get('ctl00_ContentPlaceHolder1_MainMap').style.left);
        _mapTop = parseInt($get('ctl00_ContentPlaceHolder1_MainMap').style.top);        
    },

    dispose : function() {
        $clearHandlers(this.get_element());
        DDTI.Web.Map.Viewer.DTViewerComponent.callBaseMethod(this, 'dispose');
    },
    
    get_width : function() {
        var w = parseInt($get('ctl00_ContentPlaceHolder1_MainMap').style.width);
        return w;
    },
    
    set_width : function(value) {
        var w = parseInt($get('ctl00_ContentPlaceHolder1_MainMap').style.width);
        if (w !== value) {
            $get('ctl00_ContentPlaceHolder1_MainMap').style.width = value + 'px';
        }
    },
    
    get_height : function() {
        var h = parseInt($get('ctl00_ContentPlaceHolder1_MainMap').style.height);
        return h;
    },
    
    set_height : function(value) {
        var h = parseInt($get('ctl00_ContentPlaceHolder1_MainMap').style.height);
        if (h !== value) {
            $get('ctl00_ContentPlaceHolder1_MainMap').style.height = value + 'px';
        }
    },

    get_imageUrl : function() {
        return $get('ctl00_ContentPlaceHolder1_MainMap').src;
    },
    
    set_imageUrl : function(value) {
        $get('MapLoadingPanel').style.visibility = 'visible';
                
        try { $removeHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'click', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onClick); } catch(err) { }
        try { $removeHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'dblclick', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onDblClick); } catch(err) { }
        try { $removeHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'mousedown', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onMouseDown); } catch(err) { }
        try { $removeHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'mouseup', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onMouseUp); } catch(err) { }

        $get('ctl00_ContentPlaceHolder1_MainMap').src = value;
    },
        
    _onLoad : function() {
        $get('MapLoadingPanel').style.visibility = 'hidden';
        
        try { $removeHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'click', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onClick); } catch(err) { }
        $addHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'click', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onClick);
        
        try { $removeHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'dblclick', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onDblClick); } catch(err) { }
        $addHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'dblclick', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onDblClick);
        
        try { $removeHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'mousedown', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onMouseDown); } catch(err) { }
        $addHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'mousedown', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onMouseDown);
        
        try { $removeHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'mouseup', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onMouseUp); } catch(err) { }
        $addHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'mouseup', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onMouseUp);
        
        switch(DDTI.Web.Map.Toolbox.DTToolboxComponent.prototype.get_activeTool()) {
            case DDTI.Web.Map.Toolbox.DTToolTypes.Pan:
	            this.style.clip = 'rect(0px,' + parseInt(this.style.width) + 2 + 'px,' + parseInt(this.style.height) + 2 + 'px,0px)';
                this.style.top = _mapTop + 'px';
                this.style.left = _mapLeft + 'px';
                this.style.visibility = 'visible';
                break;

            case DDTI.Web.Map.Toolbox.DTToolTypes.Buffer:
            case DDTI.Web.Map.Toolbox.DTToolTypes.SelectByPoint:
            case DDTI.Web.Map.Toolbox.DTToolTypes.SelectByLine:
            case DDTI.Web.Map.Toolbox.DTToolTypes.SelectByRectangle:
            case DDTI.Web.Map.Toolbox.DTToolTypes.ClearSelection:
                DDTI.Web.Map.Selection.DTSelectionComponent.prototype.get_selection();
                break;
        }
        if (_isInit) {
            DDTI.Web.Map.Selection.DTSelectionComponent.prototype.get_selection();
            $get('ctl00_ContentPlaceHolder1_MainLegend_ctl00_ctl00_ctl01').style.backgroundColor = '#CED7DE';
            $get('ctl00_ContentPlaceHolder1_MainLegend_ctl00_ctl00_ctl01').style.border = '1px solid #6B8694';
            _isInit = false;
        }
    },
    
    _onClick : function(evt) {
        switch(DDTI.Web.Map.Toolbox.DTToolboxComponent.prototype.get_activeTool()) {
            case DDTI.Web.Map.Toolbox.DTToolTypes.MeasureDistance:
            case DDTI.Web.Map.Toolbox.DTToolTypes.MeasureArea:
            case DDTI.Web.Map.Toolbox.DTToolTypes.SelectByLine:
                measurementCoordinates[measurePointCount] = [evt.clientX - _mapLeft, evt.clientY + document.documentElement.scrollTop - _mapTop];
                var e = document.createElement('img');
                e.id = 'map_flag' + measurePointCount;
                e.className = 'flag';
                e.src = 'http://images.ddti.net/auditor2007/map_pin.gif';
                e.style.visibility = 'visible';
                e.style.position = 'absolute';
                e.style.zIndex = 10;
                e.style.top = evt.clientY + document.documentElement.scrollTop - 20 + 'px';
                e.style.left = evt.clientX - 10 + 'px';
                
                document.body.appendChild(e);
                measurePointCount++;
                break;
        }
    },
    
    _onDblClick : function(evt) {
        var w = DDTI.Web.Map.Viewer.DTViewerComponent.prototype.get_width();
        var h = DDTI.Web.Map.Viewer.DTViewerComponent.prototype.get_height();

        switch(DDTI.Web.Map.Toolbox.DTToolboxComponent.prototype.get_activeTool()) {
            case DDTI.Web.Map.Toolbox.DTToolTypes.MeasureDistance:
                var p = '';
                for (i = 0; i < measurePointCount; i++) {
                    var e = $get('map_flag' + i);
                    p += measurementCoordinates[i][0].toString() + ',' + measurementCoordinates[i][1].toString() + ';';
                    document.body.removeChild(e);
                }
                measurePointCount = 0;
                DDTI.Web.Map.Viewer.DTViewerComponent.prototype.set_imageUrl('Default.mapx?Todo=MeasureDistance&Path=' + p + '&Width=' + w + '&Height=' + h + '&Random=' + Math.floor(Math.random()*1000000));
                break;
                
            case DDTI.Web.Map.Toolbox.DTToolTypes.MeasureArea:
                var p = '';
                for (i = 0; i < measurePointCount; i++) {
                    var e = $get('map_flag' + i);
                    p += measurementCoordinates[i][0].toString() + ',' + measurementCoordinates[i][1].toString() + ';';
                    document.body.removeChild(e);
                }
                measurePointCount = 0;
                DDTI.Web.Map.Viewer.DTViewerComponent.prototype.set_imageUrl('Default.mapx?Todo=MeasureArea&Path=' + p + '&Width=' + w + '&Height=' + h + '&Random=' + Math.floor(Math.random()*1000000));
                break;
                
            case DDTI.Web.Map.Toolbox.DTToolTypes.SelectByLine:
                var p = '';
                for (i = 0; i < measurePointCount; i++) {
                    var e = $get('map_flag' + i);
                    p += measurementCoordinates[i][0].toString() + ',' + measurementCoordinates[i][1].toString() + ';';
                    document.body.removeChild(e);
                }
                measurePointCount = 0;
                DDTI.Web.Map.Viewer.DTViewerComponent.prototype.set_imageUrl('Default.mapx?Todo=SelectByLine&Path=' + p + '&Width=' + w + '&Height=' + h + '&Random=' + Math.floor(Math.random()*1000000));
                break;
        }
    },
    
    _onMouseDown : function(evt) {
        evt.preventDefault();
        switch(DDTI.Web.Map.Toolbox.DTToolboxComponent.prototype.get_activeTool()) {
        
            case DDTI.Web.Map.Toolbox.DTToolTypes.Pan:
                try { $removeHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'mousemove', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onMouseMove); } catch(err) { }
                $addHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'mousemove', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onMouseMove);
                _mapPanOffsetX = _mapLeft - evt.clientX;
                _mapPanOffsetY = _mapTop - evt.clientY;
                break;
                
            case DDTI.Web.Map.Toolbox.DTToolTypes.ZoomIn:
            case DDTI.Web.Map.Toolbox.DTToolTypes.SelectByRectangle:                
                try { $removeHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'mousemove', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onMouseMove); } catch(err) { }
                $addHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'mousemove', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onMouseMove);

                _rectangleAnchorClientX = evt.clientX;
                _rectangleAnchorClientY = evt.clientY + document.documentElement.scrollTop;
                _rectangleAnchorOffsetX = evt.offsetX;
                _rectangleAnchorOffsetY = evt.offsetY;
                
                var et = document.createElement('div');
                var er = document.createElement('div');
                var eb = document.createElement('div');
                var el = document.createElement('div');

                et.id = 'et';
                et.style.left = _rectangleAnchorClientX + 'px';
                et.style.top = _rectangleAnchorClientY + 'px';
                et.style.width = '0px';
                et.style.height = '0px';
                et.style.borderTop = '1px solid black'
                et.style.position = 'absolute';
                et.style.zIndex = 10;
                document.body.appendChild(et);

                er.id = 'er';
                er.style.left = _rectangleAnchorClientX + 'px';
                er.style.top = _rectangleAnchorClientY + 'px';
                er.style.width = '0px';
                er.style.height = '0px';
                er.style.borderRight = '1px solid black'
                er.style.position = 'absolute';
                er.style.zIndex = 10;
                document.body.appendChild(er);

                eb.id = 'eb';
                eb.style.left = _rectangleAnchorClientX + 'px';
                eb.style.top = _rectangleAnchorClientY + 'px';
                eb.style.width = '0px';
                eb.style.height = '0px';
                eb.style.borderBottom = '1px solid black'
                eb.style.position = 'absolute';
                eb.style.zIndex = 10;
                document.body.appendChild(eb);

                el.id = 'el';
                el.style.left = _rectangleAnchorClientX + 'px';
                el.style.top = _rectangleAnchorClientY + 'px';
                el.style.width = '0px';
                el.style.height = '0px';
                el.style.borderLeft = '1px solid black'
                el.style.position = 'absolute';
                el.style.zIndex = 10;
                document.body.appendChild(el);
                break;
        }
    },
    
    _onMouseUp : function(evt) {
        var w = DDTI.Web.Map.Viewer.DTViewerComponent.prototype.get_width();
        var h = DDTI.Web.Map.Viewer.DTViewerComponent.prototype.get_height();

        switch(DDTI.Web.Map.Toolbox.DTToolboxComponent.prototype.get_activeTool()) {
            case DDTI.Web.Map.Toolbox.DTToolTypes.Pan:
                try { $removeHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'mousemove', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onMouseMove); } catch(err) { }
                
                var x1 = -1 * _mapPanOffsetX;
                var y1 = -1 * _mapPanOffsetY;
	            var x2 = evt.clientX - _mapLeft;
	            var y2 = evt.clientY - _mapTop;
	            
	            $get('ctl00_ContentPlaceHolder1_MainMap').style.visibility = 'hidden';
                DDTI.Web.Map.Viewer.DTViewerComponent.prototype.set_imageUrl('Default.mapx?Todo=Pan&x1=' + x1 + '&y1=' + y1 + '&x2=' + x2 + '&y2=' + y2 + '&Width=' + w + '&Height=' + h + '&Random=' + Math.floor(Math.random()*1000000));
                break;
                
            case DDTI.Web.Map.Toolbox.DTToolTypes.ZoomIn:
            case DDTI.Web.Map.Toolbox.DTToolTypes.SelectByRectangle:
                try { $removeHandler ($get('ctl00_ContentPlaceHolder1_MainMap'), 'mousemove', DDTI.Web.Map.Viewer.DTViewerComponent.prototype._onMouseMove); } catch(err) { }
                
                document.body.removeChild($get('et'));
                document.body.removeChild($get('er'));
                document.body.removeChild($get('eb'));
                document.body.removeChild($get('el'));

                var dx = evt.clientX - _rectangleAnchorClientX;
                var dy = evt.clientY + document.documentElement.scrollTop - _rectangleAnchorClientY;
                
                var xMin, yMin, xMax, yMax;
                if (dx < 0) {
                    xMin = evt.clientX - parseInt(this.style.left);
                    xMax = _rectangleAnchorOffsetX;
                }
                else {
                    xMin = _rectangleAnchorOffsetX;
                    xMax = evt.clientX - parseInt(this.style.left);
                }
                if (dy < 0) {
                    yMin = evt.clientY + document.documentElement.scrollTop - parseInt(this.style.top);
                    yMax = _rectangleAnchorOffsetY;
                }
                else {
                    yMin = _rectangleAnchorOffsetY;
                    yMax = evt.clientY + document.documentElement.scrollTop - parseInt(this.style.top);
                }
                switch(DDTI.Web.Map.Toolbox.DTToolboxComponent.prototype.get_activeTool()) {
                    case DDTI.Web.Map.Toolbox.DTToolTypes.ZoomIn:
                        DDTI.Web.Map.Viewer.DTViewerComponent.prototype.set_imageUrl('Default.mapx?Todo=ZoomIn&xMin=' + xMin + '&yMin=' + yMin + '&xMax=' + xMax + '&yMax=' + yMax + '&Width=' + w + '&Height=' + h + '&Random=' + Math.floor(Math.random()*1000000));
                        break;
                    
                    case DDTI.Web.Map.Toolbox.DTToolTypes.SelectByRectangle:
                        DDTI.Web.Map.Viewer.DTViewerComponent.prototype.set_imageUrl('Default.mapx?Todo=SelectByRectangle&xMin=' + xMin + '&yMin=' + yMin + '&xMax=' + xMax + '&yMax=' + yMax + '&Width=' + w + '&Height=' + h + '&Random=' + Math.floor(Math.random()*1000000));
                        break;
                }
                break;
                
            case DDTI.Web.Map.Toolbox.DTToolTypes.ZoomOut:
                var x = evt.offsetX;
                var y = evt.offsetY;
                DDTI.Web.Map.Viewer.DTViewerComponent.prototype.set_imageUrl('Default.mapx?Todo=ZoomOut&x=' + x + '&y=' + y + '&Width=' + w + '&Height=' + h + '&Random=' + Math.floor(Math.random()*1000000));
                break;
                
            case DDTI.Web.Map.Toolbox.DTToolTypes.SelectByPoint:
                var x = evt.offsetX;
                var y = evt.offsetY;
                switch (evt.shiftKey) {
                    case true:
                        DDTI.Web.Map.Viewer.DTViewerComponent.prototype.set_imageUrl('Default.mapx?Todo=SelectByPoint&x=' + x + '&y=' + y + '&Width=' + w + '&Height=' + h + '&ClearSelectionFirst=False&Random=' + Math.floor(Math.random()*1000000));                
                        break;
                    case false:
                        DDTI.Web.Map.Viewer.DTViewerComponent.prototype.set_imageUrl('Default.mapx?Todo=SelectByPoint&x=' + x + '&y=' + y + '&Width=' + w + '&Height=' + h + '&ClearSelectionFirst=True&Random=' + Math.floor(Math.random()*1000000));                
                        break;
                }
                break;
        }
    },
    
    _onMouseMove : function(evt) {
        switch(DDTI.Web.Map.Toolbox.DTToolboxComponent.prototype.get_activeTool()) {
        
            case DDTI.Web.Map.Toolbox.DTToolTypes.Pan:
                var dx = evt.clientX + _mapPanOffsetX;
                var dy = evt.clientY + _mapPanOffsetY;
        		
        		this.style.left = dx + 'px';
        		this.style.top = dy + 'px';

		        var x1, y1, x2, y2;
		        x1 = 0;
		        if(dx < _mapLeft) {
			        x1 = _mapLeft - dx;					
		        }
		        y1 = 0;
		        if(dy < _mapTop) {
			        y1 = _mapTop - dy;
		        }
		        x2 = parseInt(this.style.width) + 2;
		        if (dx > _mapLeft) {
			        x2 = _mapLeft + x2 - dx;
		        }
		        y2 = parseInt(this.style.height) + 2;
		        if (parseInt(this.style.top) > _mapTop) {
			        y2 = _mapTop + y2 - dy;
		        }
		        this.style.clip = 'rect(' + y1 + 'px,' + x2 +'px,' + y2 +'px,' + x1 + 'px)';
                break;
                
            case DDTI.Web.Map.Toolbox.DTToolTypes.ZoomIn:
            case DDTI.Web.Map.Toolbox.DTToolTypes.SelectByRectangle:
                var et = $get('et');
                var er = $get('er');
                var eb = $get('eb');
                var el = $get('el');
                
                var dx = evt.clientX - _rectangleAnchorClientX;
                var dy = evt.clientY + document.documentElement.scrollTop - _rectangleAnchorClientY;
                
                if (dx < 0) {
                    et.style.width = -1 * dx + 'px';
                    et.style.left = evt.clientX - 2 + 'px';
                    eb.style.width = -1 * dx + 'px';
                    eb.style.left = evt.clientX - 2 + 'px';
                    er.style.left = evt.clientX - 2 + 'px';
                    el.style.left = _rectangleAnchorClientX - 2 + 'px';
                }
                else {
                    et.style.width = dx + 'px';
                    et.style.left = _rectangleAnchorClientX - 2 + 'px';
                    eb.style.width = dx + 'px';
                    eb.style.left = _rectangleAnchorClientX - 2 + 'px';
                    el.style.left = evt.clientX - 2 + 'px';
                    er.style.left = _rectangleAnchorClientX - 2 + 'px';
                }
                if (dy < 0) {
                    er.style.height = -1 * dy + 'px';
                    er.style.top = evt.clientY + document.documentElement.scrollTop - 2 + 'px';
                    el.style.height = -1 * dy + 'px';
                    el.style.top = evt.clientY + document.documentElement.scrollTop - 2 + 'px';
                    eb.style.top = evt.clientY + document.documentElement.scrollTop - 2 + 'px';
                    et.style.top = _rectangleAnchorClientY - 2 + 'px';
                }
                else {
                    er.style.height = dy + 'px';
                    er.style.top = _rectangleAnchorClientY - 2 + 'px';
                    el.style.height = dy + 'px';
                    el.style.top = _rectangleAnchorClientY - 2 + 'px';
                    et.style.top = evt.clientY + document.documentElement.scrollTop - 2 + 'px';
                    eb.style.top = _rectangleAnchorClientY - 2 + 'px';
                }
                break;
        }
        return false;
    },
        
    initMap : function() {
        _isInit = true;
        this.set_width(document.body.offsetWidth - 304);
        this.set_imageUrl('Default.mapx?InitializeSearch=True&Todo=Resize&Width=' + this.get_width() + '&Height=' + this.get_height() + '&Random=' + Math.floor(Math.random()*1000000));
    },
        
    resizeMap : function() {
        this.set_width(document.body.offsetWidth - 304);
        this.set_imageUrl('Default.mapx?InitializeSearch=True&Todo=Resize&Width=' + this.get_width() + '&Height=' + this.get_height() + '&Random=' + Math.floor(Math.random()*1000000));
    },
    
    loadMap : function(queryString) {
        _isInit = true;
        this.set_width(document.body.offsetWidth - 304);
        var w = this.get_width();
        var h = this.get_height();
        this.set_imageUrl('Default.mapx?InitializeSearch=True&' + queryString + '&Width=' + w + '&Height=' + h + '&Random=' + Math.floor(Math.random()*1000000));
    },
        
    zoomTo : function(layer, column, searchString) {
        this.set_imageUrl('Default.mapx?Todo=Find&Layer=' + layer + '&Column=' + column + '&SearchString=' + searchString + '&Width=' + this.get_width() + '&Height=' + this.get_height() + '&Random=' + Math.floor(Math.random()*1000000));
    }
}

DDTI.Web.Map.Viewer.DTViewerComponent.registerClass('DDTI.Web.Map.Viewer.DTViewerComponent', Sys.UI.Control);

if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();