
//==============================================================
// Map ------------------------------------------------
//------------> Map.NewMap()
//------------> Map.Initial (MapID)
//------------> Map.getMapContainerInnerHTML (MapID)
//------------> Map.onmousedown (elem, e)
//------------> Map.onmousemove (elem, e)
//------------> Map.onmouseup (elem, e)


//============> Map.Scale ()
//------------> Map.Scale.CheckBarPixel(MapID)
//------------> Map.Scale.ScaleFromBarPixel(MapID)
//------------> Map.Scale.BarPixelFromScale(MapID)


//============> Map.getMap ()
//------------> Map.getMap.By_MapScale_MapBound (MapID, Lang, MapBackGround, ImageWidth, ImageHeight, MapBoundX1, MapBoundY1, MapBoundX2, MapBoundY2)
//------------> Map.getMap.By_MapScale_MapCenter(MapID,Lang,MapBackGround,ImageWidth,ImageHeight, MapScale, MapCenterX, MapCenterY )

//------------> Map.getMap.successCallback (xmlhttp,MapID)
//------------> Map.getMap.errorCallback=function(Nc,Oc)
//------------> Map.getMap.MapImageIsLoaded ()
//------------> Map.getMap.MapImageTransitions (MapID,ImgSec,ImgMain,StartOpacity, opacity)


//var aTI_activeInfo;
//var aTravelData;





function MapObject( ){
    this.Id = "";
    this.Type = "MapFrame";   
    this.Title="Map of Cyprus" ;
    this.MapLang = "";
    this.MapActivePOI = 1;

    this.Holder = "";
    this.ActiveTools = "Arrow";

    this.ImagePos = {x:0, y:0};
    this.ImageSize = {w:0, h:0};
    this.ImageCenter = new MapPoint(0,0);
    this.ImageRect = new MapRect(0,0,this.ImageSize.w ,this.ImageSize.h)

    this.MapBackGround = "Vector";  
    this.MapSize = new MapSize(0,0);
    this.MapCenter = new MapPoint(0,0);
    this.MapRect = new MapRect(0,0,0,0); 
    this.MapScale = 9000000;
    
    this.PreBackGround=1 ;  
    this.PreSize = new MapSize(0,0);
    this.PreCenter = new MapPoint(0,0);
    this.PreRect = new MapRect(0,0,0,0);
    this.PreScale = 9000000;

    this.MapScaleMin = 9000000;
    this.MapScaleMax = 1000;
    this.MapScaleList = "9,000,000;5,000,000;1,000,000;500,000;250,000;100,000;50,000;25,000;5,000;2,500;1,000"
    this.MapScaleArray = this.MapScaleList.split(";");
    this.MapScaleBarPx = 0;
    
    
    this.LocImageSize = {w:0, h:0};
    this.LocImageRect=new MapRect(0,0,this.LocImageSize.w ,this.LocImageSize.h)
    this.LocationRect = new MapRect(0,0,0,0); 
    this.LocScale = 9000000;

    this.NavMapImageSize = { w: 0, h: 0 };
    this.NavMapImageRect = new MapRect(0, 0, this.NavMapImageSize.w, this.NavMapImageSize.h)
    this.NavMapRect = new MapRect(0, 0, 0, 0);
    this.NavMapScaleList = "50000000;25000000;10000000;5000000;2500000;1000000;750000;500000;250000"
    this.NavMapScaleArray = this.NavMapScaleList.split(";");
    this.NavMapScaleIndex = 0;
    this.NavMapScale = 9000000;

    this.MagnifyingZoom = 2;
    this.MagnifyingMaxZoom = 5;
    this.MagnifyingSize= new MapSize(207,130); 
    
    this.VisibleTOI="" ;
    
    
    
    this.serverUrl="service.ashx";
    
    
    this.ProgressList = new Array();
    this.busyReq = false;
    this.cache = null;


    this.MapImageSRC = "";

    this.FrameHolderList = "";
    this.FrameHolderArray = new Array();
    this.FrameHolder = new Object();
    
    this.FrameHolder.Title = new FrameHolderOptions("Title")
    this.FrameHolder.Location = new FrameHolderOptions("Location")
    this.FrameHolder.North = new FrameHolderOptions("North")
    this.FrameHolder.Scale = new FrameHolderOptions("Scale")
    this.FrameHolder.Logo = new FrameHolderOptions("Logo")
    this.FrameHolder.GeoinfoLogo = new FrameHolderOptions("GeoinfoLogo")

    this.ToolsHolderList = "";
    this.ToolsHolderArray = new Array();
    this.ToolsHolder = new Object();
    this.ToolsHolder.MapBackGround = new ToolsHolderOptions("MapBackGround")
    this.ToolsHolder.NavUpTools = new ToolsHolderOptions("NavUpTools")
    this.ToolsHolder.NavDowTools = new ToolsHolderOptions("NavDowTools")
    this.ToolsHolder.AllTools = new ToolsHolderOptions("AllTools")
    this.ToolsHolder.ScalebarH = new ToolsHolderOptions("ScalebarH")
    //this.ToolsHolder = new ToolsHolderOptions("Tools")

    this.ScaleBar = new MapScaleBarOptions("ScaleBar")
    this.Navigator = new MapNavigatorOptions("Navigator")
}


function MapNavigatorOptions(_name) {
    this.name = _name;
    this.style = 0;
    this.status = "float";
    this.visible = false;
    this.shadow = "1";
    this.border = 1;

}
function MapScaleBarOptions(_name) {
    this.name = _name;
    this.style = 0;
    this.status = "float";
    this.visible = false;
    this.shadow = "1";
    this.border = 1;

}
function ToolsHolderOptions(_name){ 
    this.HolderType="ToolsHolder";
    this.name=_name;
    this.style = 0;               // 0= move & resize & Shadow, 1 = move 
    this.status = "float";      // none , float , fixed 
    this.visible = false;
    
    this.align = "Horizontal";      //"Vertical", "Horizontal"
    this.ToolsPos = { x: 0, y: 0 }; 
    this.Padding = 2;               // px
    this.ToolsList = "Seperator;ZoomIn"
    this.ToolsArray = new Array();

    this.shadowcolor = "1";   // 0=white, 1= black
    this.shadow = "4";        // 0= none, 1 = Shadow min, 2 = Shadow max, 3 = Glow min, 4 = Glow max,
    this.border = 1;          // px
    this.bordercolor = "#3982c6";   // "#ff9900" / "#3982c6" / "#ffffff"
    this.backgroundcolor = "white"  // "Orage"   / "Blue"    / "white"  / "transparent"
    this.backgroundOpacity=80;

    this.topBar = true;
    this.move = true;
    this.resize_Constrain=true;
    this.resize_L = true;
    this.resize_R = true;
    this.resize_U = true;
    this.resize_B = true;
    this.DefSize = new DefSizeOptions()
    this.CurSize = new CurSizeOptions()
    //this.ToolsList = "Seperator;ZoomIn;ZoomOut;Pan;ReCenter;PreView;Seperator;Magnifying;Seperator;Vector;HillShadow;Satelite;Seperator;OverView;NormalView;CloseView;Seperator;"

}

function FrameHolderOptions(_name){ 
    this.HolderType="FrameHolder";
    this.name=_name;
    this.style=0;           // 0 = sizeble, 0 = fix size
    this.status = "float";
    this.visible = false;

    this.shadow = "1";        // 0= none, 1 =dowleft , 2 allSite
    this.shadowcolor = "1";   // 0=white, 1= black
    this.border = 1;         // px
    this.bordercolor = "#3982c6";   // "#ff9900" / "#3982c6" / "#ffffff"
    this.backgroundcolor = "white";  // "Orage"   / "Blue"    / "white"  / "transparent"
    this.backgroundOpacity=70;
    
    this.topBar=false;
    this.move=false;
    this.resize_Constrain=true;
    this.resize_L=true;
    this.resize_R=true;
    this.resize_U=true;
    this.resize_B=true;
    this.DefSize = new DefSizeOptions()
    this.CurSize = new CurSizeOptions()
}

function DefSizeOptions() {
    this.Ref;
    this.Ang="ABS";     // ABS, UL,UR, DL, DR
    this.x = 0;
    this.y = 0;
    this.size = "auto"; // auto, fix
    this.w = 0;
    this.h = 0;
}
function CurSizeOptions() {
    this.x = 0;
    this.y = 0;
    this.w = 0;
    this.h = 0;
} 



function Map(){}


//--------------------------------------------------------------
// Map.NewMap -------------------------------------------------
Map.NewMap = function(MapHolder,MapType) {
    var NewMapID = Map.MapObj.length
    Map.MapObj[NewMapID] = new MapObject();
    Map.MapObj[NewMapID].Id = NewMapID
    Map.MapObj[NewMapID].Holder = MapHolder
    Map.MapObj[NewMapID].Type = MapType
    return NewMapID;
}   
//--------------------------------------------------------------

//--------------------------------------------------------------
// Map.NewMap -------------------------------------------------
Map.ReadMapOptions = function(MapID) {

var Moptions = Map.MapObj[MapID];


    Moptions.ActiveTools = "Arrow";


    Moptions.FrameHolder.Title.style = 0;
    Moptions.FrameHolder.Title.status = "float";
    Moptions.FrameHolder.Title.shadowcolor = "1";
    Moptions.FrameHolder.Title.shadow = "3";
    Moptions.FrameHolder.Title.border = 1;
    Moptions.FrameHolder.Title.bordercolor = "#ff9900";
    Moptions.FrameHolder.Title.backgroundcolor = "white";  // transparent
    Moptions.FrameHolder.Title.backgroundOpacity = 80;

    Moptions.FrameHolder.Title.TopBar = false;
    Moptions.FrameHolder.Title.move = true;
    Moptions.FrameHolder.Title.resize_Constrain = false;
    Moptions.FrameHolder.Title.resize_L = true;
    Moptions.FrameHolder.Title.resize_R = true;
    Moptions.FrameHolder.Title.resize_U = true;
    Moptions.FrameHolder.Title.resize_B = true;
    Moptions.FrameHolder.Title.DefSize.Ang = "UM";
    Moptions.FrameHolder.Title.DefSize.x = 0;
    Moptions.FrameHolder.Title.DefSize.y = 0;
    Moptions.FrameHolder.Title.DefSize.size = "auto";
    Moptions.FrameHolder.Title.DefSize.w = 300;
    Moptions.FrameHolder.Title.DefSize.h = 46;


    Moptions.FrameHolder.North.style = 0;
    Moptions.FrameHolder.North.status = "float";
    Moptions.FrameHolder.North.shadowcolor = "0";
    Moptions.FrameHolder.North.shadow = "0";
    Moptions.FrameHolder.North.border = 0;
    Moptions.FrameHolder.North.bordercolor = "#3982c6";
    Moptions.FrameHolder.North.backgroundcolor = "transparent";
    Moptions.FrameHolder.North.backgroundOpacity = 90;

    Moptions.FrameHolder.North.TopBar = false;
    Moptions.FrameHolder.North.move = true;
    Moptions.FrameHolder.North.resize_Constrain = true;
    Moptions.FrameHolder.North.resize_L = true;
    Moptions.FrameHolder.North.resize_R = true;
    Moptions.FrameHolder.North.resize_U = true;
    Moptions.FrameHolder.North.resize_B = true;
    Moptions.FrameHolder.North.DefSize.Ang = "DM";
    Moptions.FrameHolder.North.DefSize.x = 0;
    Moptions.FrameHolder.North.DefSize.y = 60;
    Moptions.FrameHolder.North.DefSize.size = "auto";
    Moptions.FrameHolder.North.DefSize.w = 150;
    Moptions.FrameHolder.North.DefSize.h = 150;


    Moptions.FrameHolder.Location.style = 0;
    Moptions.FrameHolder.Location.status = "float";
    Moptions.FrameHolder.Location.shadowcolor = "1";
    Moptions.FrameHolder.Location.shadow = "3";
    Moptions.FrameHolder.Location.border = 1;
    Moptions.FrameHolder.Location.bordercolor = "#ff9900";
    Moptions.FrameHolder.Location.backgroundcolor = "transparent";  // transparent
    Moptions.FrameHolder.Location.backgroundOpacity = 100;

    Moptions.FrameHolder.Location.TopBar = false;
    Moptions.FrameHolder.Location.move = true;
    Moptions.FrameHolder.Location.resize_Constrain = false;
    Moptions.FrameHolder.Location.resize_L = true;
    Moptions.FrameHolder.Location.resize_R = true;
    Moptions.FrameHolder.Location.resize_U = true;
    Moptions.FrameHolder.Location.resize_B = true;
    
    Moptions.FrameHolder.Location.DefSize.Ang = "UL";
    Moptions.FrameHolder.Location.DefSize.x = 0;
    Moptions.FrameHolder.Location.DefSize.y = 0;
    Moptions.FrameHolder.Location.DefSize.size = "auto";
    Moptions.FrameHolder.Location.DefSize.w = 150;
    Moptions.FrameHolder.Location.DefSize.h = 150;


    Moptions.FrameHolder.Scale.style = 0;
    Moptions.FrameHolder.Scale.status = "float";
    Moptions.FrameHolder.Scale.shadowcolor = "1";
    Moptions.FrameHolder.Scale.shadow = "0";
    Moptions.FrameHolder.Scale.border = 0;
    Moptions.FrameHolder.Scale.bordercolor = "#ff9900";
    Moptions.FrameHolder.Scale.backgroundcolor = "transparent";  // transparent  white
    Moptions.FrameHolder.Scale.backgroundOpacity = 60;

    Moptions.FrameHolder.Scale.TopBar = false;
    Moptions.FrameHolder.Scale.move = true;
    Moptions.FrameHolder.Scale.resize_Constrain = true;
    Moptions.FrameHolder.Scale.resize_L = false;
    Moptions.FrameHolder.Scale.resize_R = false;
    Moptions.FrameHolder.Scale.resize_U = false;
    Moptions.FrameHolder.Scale.resize_B = false;
    
    Moptions.FrameHolder.Scale.DefSize.Ang = "DM";
    Moptions.FrameHolder.Scale.DefSize.x = 0;
    Moptions.FrameHolder.Scale.DefSize.y = 0;
    Moptions.FrameHolder.Scale.DefSize.size = "fix";
    Moptions.FrameHolder.Scale.DefSize.w = 248;
    Moptions.FrameHolder.Scale.DefSize.h = 52;

    Moptions.FrameHolder.Logo.style = 1;
    Moptions.FrameHolder.Logo.status = "float";
    Moptions.FrameHolder.Logo.shadow = "3";
    Moptions.FrameHolder.Logo.border = 1;
    Moptions.FrameHolder.Logo.bordercolor = "white";
    Moptions.FrameHolder.Logo.backgroundcolor = "white";  // transparent
    Moptions.FrameHolder.Logo.backgroundOpacity = 20;

    Moptions.FrameHolder.Logo.TopBar = false;
    Moptions.FrameHolder.Logo.move = false;
    Moptions.FrameHolder.Logo.resize_Constrain = true;
    Moptions.FrameHolder.Logo.resize_L = false;
    Moptions.FrameHolder.Logo.resize_R = false;
    Moptions.FrameHolder.Logo.resize_U = false;
    Moptions.FrameHolder.Logo.resize_B = false;
    
    Moptions.FrameHolder.Logo.DefSize.Ang = "DR";
    Moptions.FrameHolder.Logo.DefSize.x = 0;
    Moptions.FrameHolder.Logo.DefSize.y = 0;
    Moptions.FrameHolder.Logo.DefSize.size = "fix";
    Moptions.FrameHolder.Logo.DefSize.w = 115;
    Moptions.FrameHolder.Logo.DefSize.h = 28;
    
    Moptions.FrameHolder.GeoinfoLogo.style = 1;
    Moptions.FrameHolder.GeoinfoLogo.status = "float";
    Moptions.FrameHolder.GeoinfoLogo.shadow = "3";
    Moptions.FrameHolder.GeoinfoLogo.border = 1;
    Moptions.FrameHolder.GeoinfoLogo.bordercolor = "white";
    Moptions.FrameHolder.GeoinfoLogo.backgroundcolor = "white";  // transparent
    Moptions.FrameHolder.GeoinfoLogo.backgroundOpacity = 20;

    Moptions.FrameHolder.GeoinfoLogo.TopBar = false;
    Moptions.FrameHolder.GeoinfoLogo.move = false;
    Moptions.FrameHolder.GeoinfoLogo.resize_Constrain = true;
    Moptions.FrameHolder.GeoinfoLogo.resize_L = false;
    Moptions.FrameHolder.GeoinfoLogo.resize_R = false;
    Moptions.FrameHolder.GeoinfoLogo.resize_U = false;
    Moptions.FrameHolder.GeoinfoLogo.resize_B = false;
    
    Moptions.FrameHolder.GeoinfoLogo.DefSize.Ang = "DL";
    Moptions.FrameHolder.GeoinfoLogo.DefSize.x = 0;
    Moptions.FrameHolder.GeoinfoLogo.DefSize.y = 0;
    Moptions.FrameHolder.GeoinfoLogo.DefSize.size = "fix";
    Moptions.FrameHolder.GeoinfoLogo.DefSize.w = 84;
    Moptions.FrameHolder.GeoinfoLogo.DefSize.h = 24;
    

    //Moptions.ToolsHolder.MapBackGround.name = _name;
    Moptions.ToolsHolder.MapBackGround.style = 1;
    Moptions.ToolsHolder.MapBackGround.move = false;
    Moptions.ToolsHolder.MapBackGround.status = "fix";
    Moptions.ToolsHolder.MapBackGround.visible = false;
    Moptions.ToolsHolder.MapBackGround.align = "Horizontal";
    Moptions.ToolsHolder.MapBackGround.ToolsPos = { x: 0, y: 0 };
    Moptions.ToolsHolder.MapBackGround.Padding = 2;
    Moptions.ToolsHolder.MapBackGround.ToolsList = "Seperator;Vector;HillShadow;Satelite;Seperator"
    Moptions.ToolsHolder.MapBackGround.ToolsArray = Moptions.ToolsHolder.MapBackGround.ToolsList.split(";");

    Moptions.ToolsHolder.MapBackGround.shadowcolor = "1";   // 0=white, 1= black
    Moptions.ToolsHolder.MapBackGround.shadow = "2";        // 0= none, 1 = Shadow min, 2 = Shadow max, 3 = Glow min, 4 = Glow max,
    Moptions.ToolsHolder.MapBackGround.border = 0;          // px
    Moptions.ToolsHolder.MapBackGround.bordercolor = "#ffffff";   // "#ff9900" / "#3982c6" / "#ffffff"
    Moptions.ToolsHolder.MapBackGround.backgroundcolor = "white"  // "Orage"   / "Blue"    / "white"  / "transparent"
    Moptions.ToolsHolder.MapBackGround.backgroundOpacity = 30;

    Moptions.ToolsHolder.MapBackGround.DefSize.Ang = "UR";
    Moptions.ToolsHolder.MapBackGround.DefSize.x = 0;
    Moptions.ToolsHolder.MapBackGround.DefSize.y = 0;
    Moptions.ToolsHolder.MapBackGround.DefSize.size = "auto";


    //Moptions.ToolsHolder.AllTools.name = _name;
    Moptions.ToolsHolder.AllTools.style = 1;
    Moptions.ToolsHolder.AllTools.status = "float";
    Moptions.ToolsHolder.AllTools.visible = false;
    Moptions.ToolsHolder.AllTools.align = "Horizontal";
    Moptions.ToolsHolder.AllTools.ToolsPos = { x: 0, y: 0 };
    Moptions.ToolsHolder.AllTools.Padding = 2;
    Moptions.ToolsHolder.AllTools.ToolsList = "Seperator;ZoomInSl;ZoomOutSl;Seperator;ZoomIn;ZoomOut;Pan;ReCenter;PreView;Seperator;Seperator;Vector;HillShadow;Satelite;Seperator;OverView;NormalView;CloseView;Seperator"

  //  Moptions.ToolsHolder.AllTools.ToolsList = "Seperator;ZoomInSl;ZoomOutSl;Seperator;ZoomIn;ZoomOut;Pan;ReCenter;PreView;Seperator;Seperator;Vector;HillShadow;Satelite;Seperator;OverView;NormalView;CloseView;Seperator;ScaleCounter";

    Moptions.ToolsHolder.AllTools.ToolsArray = Moptions.ToolsHolder.AllTools.ToolsList.split(";");

    Moptions.ToolsHolder.AllTools.shadowcolor = "1";   // 0=white, 1= black
    Moptions.ToolsHolder.AllTools.shadow = "2";        // 0= none, 1 = Shadow min, 2 = Shadow max, 3 = Glow min, 4 = Glow max,
    Moptions.ToolsHolder.AllTools.border = 1;          // px
    Moptions.ToolsHolder.AllTools.bordercolor = "#3982c6";   // "#ff9900" / "#3982c6" / "#ffffff"
    Moptions.ToolsHolder.AllTools.backgroundcolor = "white"  // "Orage"   / "Blue"    / "white"  / "transparent"
    Moptions.ToolsHolder.AllTools.backgroundOpacity = 70;

    Moptions.ToolsHolder.AllTools.DefSize.Ang = "UL";
    Moptions.ToolsHolder.AllTools.DefSize.x = 0;
    Moptions.ToolsHolder.AllTools.DefSize.y = 0;
    Moptions.ToolsHolder.AllTools.DefSize.size = "auto";




    Moptions.ToolsHolder.NavUpTools.style = 1;
    Moptions.ToolsHolder.NavUpTools.move = false;
    Moptions.ToolsHolder.NavUpTools.status = "fix";
    Moptions.ToolsHolder.NavUpTools.visible = false;
    Moptions.ToolsHolder.NavUpTools.align = "Horizontal";
    Moptions.ToolsHolder.NavUpTools.ToolsPos = { x: 0, y: 0 };
    Moptions.ToolsHolder.NavUpTools.Padding = 2;
    Moptions.ToolsHolder.NavUpTools.ToolsList = "Seperator;Vector;HillShadow;Satelite;Seperator;ScaleCounter;Seperator";
    Moptions.ToolsHolder.NavUpTools.ToolsArray = Moptions.ToolsHolder.NavUpTools.ToolsList.split(";");
    
    Moptions.ToolsHolder.NavUpTools.shadowcolor = "1";   // 0=white, 1= black
    Moptions.ToolsHolder.NavUpTools.shadow = "2";        // 0= none, 1 = Shadow min, 2 = Shadow max, 3 = Glow min, 4 = Glow max,
    Moptions.ToolsHolder.NavUpTools.border = 0;          // px
    Moptions.ToolsHolder.NavUpTools.bordercolor = "#ffffff";   // "#ff9900" / "#3982c6" / "#ffffff"
    Moptions.ToolsHolder.NavUpTools.backgroundcolor = "Blue"  // "Orage"   / "Blue"    / "white"  / "transparent"
    Moptions.ToolsHolder.NavUpTools.backgroundOpacity = 30;
    
    Moptions.ToolsHolder.NavUpTools.DefSize.Ang = "UR";
    Moptions.ToolsHolder.NavUpTools.DefSize.x = 0;
    Moptions.ToolsHolder.NavUpTools.DefSize.y = 0;
    Moptions.ToolsHolder.NavUpTools.DefSize.size = "auto";


    Moptions.ToolsHolder.NavDowTools.ToolsList = "ZoomIn;ZoomOut;ReCenter;PreView;Seperator;Pan;Magnifying;Seperator;OverView;NormalView;CloseView";
    // "Seperator;ZoomIn;ZoomOut;ReCenter;PreView;Seperator;Pan;Magnifying;Seperator;OverView;NormalView;CloseView;ScaleCounter"
    Moptions.ToolsHolder.NavDowTools.ToolsArray = Moptions.ToolsHolder.NavDowTools.ToolsList.split(";");

    Moptions.ToolsHolder.NavDowTools.DefSize.Ang = "UR";
    Moptions.ToolsHolder.NavDowTools.DefSize.x = 0;
    Moptions.ToolsHolder.NavDowTools.DefSize.y = 0;
    Moptions.ToolsHolder.NavDowTools.DefSize.size = "auto";



    //Moptions.ToolsHolder.ScalebarH.name = _name;
    Moptions.ToolsHolder.ScalebarH.style = 1;
    Moptions.ToolsHolder.ScalebarH.move = true;
    Moptions.ToolsHolder.ScalebarH.status = "float";
    Moptions.ToolsHolder.ScalebarH.visible = false;
    Moptions.ToolsHolder.ScalebarH.align = "Vertical";
    Moptions.ToolsHolder.ScalebarH.ToolsPos = { x: 0, y: 0 };
    Moptions.ToolsHolder.ScalebarH.Padding = 0;
    Moptions.ToolsHolder.ScalebarH.ToolsList = "JoyStickBg;JoyStick;Space(0,3);ZoomInSlbar;ScaleBar;ScaleBarInticator;ZoomOutSlbar"
    Moptions.ToolsHolder.ScalebarH.ToolsArray = Moptions.ToolsHolder.ScalebarH.ToolsList.split(";");

    Moptions.ToolsHolder.ScalebarH.shadowcolor = "0";   // 0=white, 1= black
    Moptions.ToolsHolder.ScalebarH.shadow = "2";        // 0= none, 1 = Shadow min, 2 = Shadow max, 3 = Glow min, 4 = Glow max,
    Moptions.ToolsHolder.ScalebarH.border = 0;          // px
    Moptions.ToolsHolder.ScalebarH.bordercolor = "#ffffff";   // "#ff9900" / "#3982c6" / "#ffffff"
    Moptions.ToolsHolder.ScalebarH.backgroundcolor = "Blue"  // "Orage"   / "Blue"    / "white"  / "transparent"
    Moptions.ToolsHolder.ScalebarH.backgroundOpacity = 30;

    Moptions.ToolsHolder.ScalebarH.topBar = true;
    
    Moptions.ToolsHolder.ScalebarH.resize_Constrain = true;
    Moptions.ToolsHolder.ScalebarH.resize_L = false;
    Moptions.ToolsHolder.ScalebarH.resize_R = false;
    Moptions.ToolsHolder.ScalebarH.resize_U = false;
    Moptions.ToolsHolder.ScalebarH.resize_B = false;
    Moptions.ToolsHolder.ScalebarH.DefSize.Ang = "UR";
    Moptions.ToolsHolder.ScalebarH.DefSize.x = 0;
    Moptions.ToolsHolder.ScalebarH.DefSize.y = 28;
    Moptions.ToolsHolder.ScalebarH.DefSize.size = "auto"   //"custom";
    Moptions.ToolsHolder.ScalebarH.DefSize.w = 40;
    Moptions.ToolsHolder.ScalebarH.DefSize.h = 250;

  //  return NewMapID;
} 



//--------------------------------------------------------------
// Map.Initial -------------------------------------------------
Map.Initial = function(MapID) {
    var Mcode = Map.getMcodeFromMapID(MapID);
    var Moptions = Map.MapObj[MapID]
    

    //---------------------------------------
    document.getElementById(Moptions.Holder).innerHTML = Map.getMapContainerInnerHTML(MapID);
    //---------------------------------------
    var Elem = document.getElementById(Mcode + "^MapImage_Main")
    Moptions.ImagePos = Map.getElem.Position(Elem);
    Moptions.ImageSize = Map.getElem.Size(Elem)
    Moptions.ImageCenter.x = parseInt(Moptions.ImageSize.w / 2);
    Moptions.ImageCenter.y = parseInt(Moptions.ImageSize.h / 2);
    Moptions.ImageRect = new MapRect(0, 0, Moptions.ImageSize.w, Moptions.ImageSize.h)

    //---------------------------------------
    Progress.create(MapID);
    POIactive.create(MapID);


    //---------------------------------------
    Moptions.FrameHolderList = "";
    if (Moptions.FrameHolder.Title.status != "none") { Holder.create(MapID, "Title"); };
    //if (Moptions.FrameHolder.Location.status != "none") { MapF_Location.create(MapID); };
    if (Moptions.FrameHolder.Location.status != "none") {Holder.create(MapID, "Location");};
    
    if (Moptions.FrameHolder.North.status != "none") {Holder.create(MapID, "North");};
    if (Moptions.FrameHolder.Scale.status != "none") {Holder.create(MapID, "Scale");};
    if (Moptions.FrameHolder.Logo.status != "none") {Holder.create(MapID, "Logo");};
    if (Moptions.FrameHolder.GeoinfoLogo.status != "none") {Holder.create(MapID, "GeoinfoLogo");};
    //Moptions.FrameHolderArray = Moptions.FrameHolderList.split(";");
    //--------------------------------------- 
    Moptions.ToolsHolderList = "";
    if (Moptions.ToolsHolder.MapBackGround.status != "none") {
        Holder.create(MapID, "MapBackGround");
    };    
    if (Moptions.ToolsHolder.NavUpTools.status != "none") {
        Holder.create(MapID, "NavUpTools");
    };

    if (Moptions.ToolsHolder.NavDowTools.status != "none") {
        Holder.create(MapID, "NavDowTools");
    };
    if (Moptions.ToolsHolder.AllTools.status != "none") {
        Holder.create(MapID, "AllTools");
    };
    if (Moptions.ToolsHolder.ScalebarH.status != "none") {
        Holder.create(MapID, "ScalebarH");
    };

    Moptions.ToolsHolderArray = Moptions.ToolsHolderList.split(";");
    //--------------------------------------- 

    Tools.BackGround.SetImage(MapID, Moptions.PreBackGround, Moptions.MapBackGround)
    Tools.SetActiveTools(MapID, "Arrow");
}; 

//--------------------------------------------------------------
// Map.HandleOnResize -------------------------------------------------
Map.HandleOnResize = function(MapID) {
   // for (var i = 0; i < Map.MapObj.length; i++) {
        var Mcode = Map.getMcodeFromMapID(MapID);
        var Moptions = Map.MapObj[MapID]

        //---------------------------------------
        var Elem = document.getElementById(Mcode + "^MapImage_Main")
        Moptions.ImagePos = Map.getElem.Position(Elem);
        Moptions.ImageSize = Map.getElem.Size(Elem)
        Moptions.ImageCenter.x = parseInt(Moptions.ImageSize.w / 2);
        Moptions.ImageCenter.y = parseInt(Moptions.ImageSize.h / 2);
        Moptions.ImageRect = new MapRect(0, 0, Moptions.ImageSize.w, Moptions.ImageSize.h)
            //---------------------------------------
//    var Elem = document.getElementById(Mcode + "^MapImage_Sec")
//    Elem.style.left = Moptions.ImagePos.x  + "px";
//    Elem.style.top = Moptions.ImagePos.y  + "px";
//    Elem.style.width = Moptions.ImageSize.w  + "px";
//    Elem.style.height = Moptions.ImageSize.h  + "px";
        //---------------------------------------
        if (Tools.JoyStick.visible) {
            Tools.JoyStick.Pos = Map.getElem.Position(Mcode + "^" + Tools.JoyStick.Ocode + "^" + "JoyStickBg");
        }
        if (Tools.ScaleBar.visible) {
            Tools.ScaleBar.Pos = Map.getElem.Position(Mcode + "^" + Tools.ScaleBar.Ocode + "^" + "ScaleBar");
        }
        if (NavMap.visible) {
            NavMap.Pos = Map.getElem.Position(Mcode + "^" + "Navigator" + "^" + "NavMap");
        }
        //---------------------------------------
        Progress.RefreshPosition(MapID);
        //---------------------------------------
    //}
}



//==============================================================
// Map.Scale --------------------------------------------------
Map.Scale = function() { }

//--------------------------------------------------------------
//Map.Scale.CheckScale ----------------------------------------
Map.Scale.CheckScale = function(MapID, Scale) {
var Moptions = Map.MapObj[MapID]
//----------------------------------
    if (Scale.f <= Moptions.MapScaleMax) { Scale.f = Moptions.MapScaleMax }
    if (Scale.f >= Moptions.MapScaleMin) { Scale.f = Moptions.MapScaleMin }
    Scale.i = Math.round(Scale.f / 100) * 100;
    return Scale;
}
//--------------------------------------------------------------
//Map.Scale.CheckBarPix ----------------------------------------
Map.Scale.CheckBarPixel = function(BarPx) {
    if (BarPx <= 0) { BarPx = 0 }
    if (BarPx >= 100) { BarPx = 100 }
    return BarPx;
}
//--------------------------------------------------------------
//Map.Scale.ScaleFromBarPixel ----------------------------------------
Map.Scale.ScaleFromBarPixel = function(MapID,BarPx) {
    var Moptions = Map.MapObj[MapID]
    //----------------------------------
    BarPx = Map.Scale.CheckBarPixel(BarPx);
    var Scale_Min = Moptions.MapScaleMin;
    var Scale_Max = Moptions.MapScaleMax;
    //----------------------------------
    var tmpMapScale = { i: 0, f: 0 };
    tmpMapScale.f = Math.log(Scale_Min) + (100 - BarPx) * (Math.log(Scale_Max) - Math.log(Scale_Min)) / 100;
    tmpMapScale.f = Math.exp(tmpMapScale.f);
    tmpMapScale.i = Math.round(tmpMapScale.f / 100) * 100;
    return tmpMapScale;
}
//--------------------------------------------------------------
//Map.Scale.BarPixelFromScale ------------------------------------
Map.Scale.BarPixelFromScale = function(MapID, tmpScale) {
    var Moptions = Map.MapObj[MapID];
    var Scale_Min = Moptions.MapScaleMin;
    var Scale_Max = Moptions.MapScaleMax;
    //----------------------------------
    var tmpBarPx = 0;
    tmpBarPx = 100 - ((Math.log(tmpScale) - Math.log(Scale_Min)) * 100 / (Math.log(Scale_Max) - Math.log(Scale_Min)));
    tmpBarPx = Math.round(tmpBarPx);
    tmpBarPx = Map.Scale.CheckBarPixel(tmpBarPx);
    return tmpBarPx;
}
//--------------------------------------------------------------
//Map.Scale.ScaleFromMapViewRect ----------------------------------------
Map.Scale.ScaleFromMapViewRect = function(MapViewRec, ImageViewRec) {
    var tmpMapScale = { i: 0, f: 0 };
    var ScreenDPI = GetScreenDPI();
    //  screen.logicalXDPI
    var pLw = ImageViewRec.x2 - ImageViewRec.x1
    var pLh = ImageViewRec.y2 - ImageViewRec.y1
    var mLw = MapViewRec.x2 - MapViewRec.x1
    var mLh = MapViewRec.y2 - MapViewRec.y1

    var pLwMetra = (pLw * 2.4 / ScreenDPI) / 100
    var pLhMetra = (pLh * 2.4 / ScreenDPI) / 100

    var Sw = mLw / pLwMetra
    var Sh = mLh / pLhMetra


    tmpMapScale.f = Math.max(Sw, Sh)
    tmpMapScale.i = Math.round(tmpMapScale.f / 100) * 100;
    return tmpMapScale;
}



//--------------------------------------------------------------
//Map.Scale.getNavMapScale ----------------------------------
Map.Scale.getNavMapScale = function(Scale) {
    var ActiveScale = Scale;
    if (Scale >= 5000000) { ActiveScale = 0 }
    if (Scale < 5000000 && Scale >= 1000000) { ActiveScale = 1 };
    if (Scale < 1000000 && Scale >= 500000) { ActiveScale = 2 }
    if (Scale < 500000 && Scale >= 100000) { ActiveScale = 3 }
    if (Scale < 100000 && Scale >= 50000) { ActiveScale = 4 }
    if (Scale < 50000 && Scale >= 25000) { ActiveScale = 5 }
    if (Scale < 25000 && Scale >= 10000) { ActiveScale = 6 }
    if (Scale < 10000 && Scale >= 5000) { ActiveScale = 7 }
    if (Scale < 5000) { ActiveScale = 8 }
    return ActiveScale;

}
//--------------------------------------------------------------
//Map.Scale.getNavMapScale ----------------------------------
Map.Scale.getNavMapScaleIndex = function(MapID, Scale) {
    var Moptions = Map.MapObj[MapID];
    var ScaleIndex = 0;
    Scale = Math.round(Scale)
    for (var i = 0; i < Moptions.NavMapScaleArray.length; i++) {
        if (Scale == Moptions.NavMapScaleArray[i]) {
            ScaleIndex = i;
            return ScaleIndex;
        }
    }
    return ScaleIndex;
}
//==============================================================





//==============================================================
// Map.getMap --------------------------------------------------  
Map.getMap=function(){}  
//--------------------------------------------------------------
//Map.getMap.By_MapScale_MapBound -----------------------------
Map.getMap.By_MapScale_MapBound = function(MapID, Lang, MapBackGround, ImageWidth, ImageHeight, MapBoundX1, MapBoundY1, MapBoundX2, MapBoundY2) { 
    var Mcode = Map.getMcodeFromMapID(MapID);
    var Moptions = Map.MapObj[MapID];
    //----------------------------------
    var request = "";
    request += "&Reguest=MapByBound";
    request += "&Reg_MapCode=" + Mcode;
    request += "&Reg_MapLang=" + Lang;
    request += "&Reg_MapBackground=" + MapBackGround;
    request += "&Reg_ImageWidth=" + ImageWidth;
    request += "&Reg_ImageHeight=" + ImageHeight;
    request += "&Reg_x1=" + MapBoundX1;
    request += "&Reg_y1=" + MapBoundY1;
    request += "&Reg_x2=" + MapBoundX2;
    request += "&Reg_y2=" + MapBoundY2;
    //----------------------------------
    Req.makeRequest(Moptions.Id, Moptions.serverUrl, Moptions.busyReq, "Request", Map.getMap.successCallback, Map.getMap.errorCallback, request);

}
//--------------------------------------------------------------
//Map.getMap.By_MapScale_ImageCenter ---------------------------
Map.getMap.By_MapScale_ImageCenter = function(MapID, Lang, MapBackGround, ImageWidth, ImageHeight, MapScale, ImageCenterX, ImageCenterY) {
    var Moptions = Map.MapObj[MapID]; 
    //----------------------------------
    var ImageCenter = new MapPoint(ImageCenterX, ImageCenterY);
    var MapCenter = ImageCenter.transform(Moptions.ImageRect, Moptions.MapRect);
    //----------------------------------
    Map.getMap.By_MapScale_MapCenter(MapID, Lang, MapBackGround, ImageWidth, ImageHeight, MapScale, MapCenter.x, MapCenter.y)
}
//--------------------------------------------------------------
//Map.getMap.By_MapScale_MapCenter -----------------------------
Map.getMap.By_MapScale_MapCenter=function(MapID,Lang,MapBackGround,ImageWidth,ImageHeight, MapScale, MapCenterX, MapCenterY ){
    var Mcode = Map.getMcodeFromMapID(MapID);
    var Moptions = Map.MapObj[MapID]; 

    var request = "";
    request += "&Reguest=MapByScale" ; 
    request += "&Reg_MapCode=" + Mcode;
    request += "&Reg_MapLang=" + Lang;
    request += "&Reg_MapBackground=" + MapBackGround;
    request += "&Reg_ImageWidth=" + ImageWidth;
    request += "&Reg_ImageHeight=" + ImageHeight;    
    request += "&Reg_MapScale=" + MapScale;
    request += "&Reg_MapCenterX=" + MapCenterX; 
    request += "&Reg_MapCenterY=" + MapCenterY;    
    //----------------------------------
    Req.makeRequest(Moptions.Id, Moptions.serverUrl, Moptions.busyReq, "Request", Map.getMap.successCallback, Map.getMap.errorCallback, request);
};
//--------------------------------------------------------------
//Map.getMap.successCallback -----------------------------------
Map.getMap.successCallback = function(xmlhttp, MapID) {
    var response = xmlhttp.responseText;
    if (response == null || response == "") { return };
    //----------------------------------
    if (Slide_Interval != -1) { clearInterval(Slide_Interval); }
    Progress.clear(MapID);
    Progress.show(MapID, "Loading")
    //----------------------------------
    var Moptions = Map.MapObj[MapID]
    //var Mcode = Map.getMcodeFromMapID(MapID);
    var jsonR = JSON.parse(response);

    Moptions.MapImageSRC = jsonR.Resp_MapImageUrl;
    Map.MapImage.src = Map.MapObj[MapID].MapImageSRC;
    //----------------------------------
    Progress.show(MapID, "Reading")
    Moptions.MapLang = jsonR.Resp_MapLang;

    Moptions.PreBackGround = Moptions.MapBackGround;
    Moptions.PreRect = Moptions.MapRect;
    Moptions.PreSize = Moptions.MapSize;
    Moptions.PreCenter = Moptions.MapCenter;

    Moptions.PreScale = Moptions.MapScale;


    Moptions.MapBackGround = jsonR.Resp_MapBackGround;
    //ImagePos	{...}	Object
    //Map.MapObj[MapID].ImageSize = new MapSize(jsonR.Resp_ImageSize.Width,jsonR.Resp_ImageSize.Height);
    Moptions.MapRect = new MapRect(jsonR.Resp_MapBounds.x1, jsonR.Resp_MapBounds.y1, jsonR.Resp_MapBounds.x2, jsonR.Resp_MapBounds.y2);
    Moptions.MapCenter = new MapPoint(Moptions.MapRect.x(), Moptions.MapRect.y());
    Moptions.MapSize = new MapSize(Moptions.MapRect.w(), Moptions.MapRect.h());
    Moptions.MapScale = jsonR.Resp_MapScale;
    //--------------------------------------------------------------
    ServerReguest_TOI(Moptions.serverUrl, Moptions.MapScale, Moptions.MapRect.x1, Moptions.MapRect.y1, Moptions.MapRect.x2, Moptions.MapRect.y2)
    //--------------------------------------------------------------
    Moptions.MapScaleBarPx = Map.Scale.BarPixelFromScale(MapID, jsonR.Resp_MapScale);
    Moptions.MapScaleBarPx = Map.Scale.CheckBarPixel(Moptions.MapScaleBarPx);
    Scale_BarPx = Tools.ScaleBar.Inticator.Set(MapID, Moptions.MapScaleBarPx);
    Tools.ScaleCounter.refresh(MapID, Moptions.MapScale);
    //--------------------------------------------------------------
//    if (Moptions.Navigator.visible) {
//       // Qview_ActiveScale = GetQView_ActiveScale(Scale.i)
//      //  Qview_Refresh("Refresh");
//    }
    //--------------------------------------------------------------    

    Progress.hide(MapID)
}
//--------------------------------------------------------------
//Map.getMap.errorCallback ----------------------------------
Map.getMap.errorCallback=function(Nc,Oc){
       // TOC.display(Req.getErrorHtml(Nc));
};
//--------------------------------------------------------------
//Map.getMap.MapImageIsLoaded ----------------------------------
Map.getMap.MapImageIsLoaded = function() {
    var Mcode = Map.MapImage.src.split("?")[1].split("^")[0];
    var MapID = Map.getMapIDFromCode(Mcode);
    var Moptions = Map.MapObj[MapID];
    //----------------------------------
    //var MapObj = Map.MapObj[MapID];
    // var innerHTML="<div id='"+ Mcode +"^MapImage_Main' class='MapImageMain' style='width:"+Map.MapImage.width+"px; height:"+Map.MapImage.height+"px;'></div>" ;
    //  document.getElementById(Mcode +"^MapImage_Main").innerHTML=""
    document.getElementById(Mcode + "^MapImage_Main").style.backgroundImage = "url(" + Map.MapImage.src + ")";
    //setFilter_Opacity(Mcode +"^MapImage_Main",0);
    clearInterval(Slide_Interval);
    Map.getMap.MapImageTransitions(MapID, Mcode + "^MapImage_Sec", Mcode + "^MapImage_Main", 10, 10)
    Progress.hide(MapID)
    //--------------------------------------------------------------
    if (Moptions.FrameHolder.Scale.visible) { MapF_Scale.refresh(MapID); };
    if (Moptions.FrameHolder.Location.visible) { MapF_Location.getMap.By_MapReference(MapID, null); };
    if (NavMap.visible) {
        if (NavMap.getMap.CheckForUpdateRequire(MapID)) {
            NavMap.getMap.By_MapReference(MapID, null);
        } else {
            var Ocode = "Navigator";
            NavMap.DrawMapRec(MapID, Ocode, Moptions.MapRect);
        }
    };

    //--------------------------------------------------------------
    //    if (aTravelData) {
    //        if (aTravelData.Solution) {
    //            Progress.show(MapID, "Rendering")
    //            var cont = document.getElementById(Mcode + "^Map^" + "MapImage_TOI");
    //            var IRect = Map.MapObj[MapID].ImageRect;
    //            var MRect = Map.MapObj[MapID].MapRect;
    //            TravelObj.MapCar.Draw(MapID, aTravelData, cont, "Map");
    //            TravelObj.MapWayPoint.Draw(MapID, aTravelData, cont, MRect, IRect, "Map");
    //            TravelObj.MapRoadPoint.Draw(MapID, aTravelData, cont, MRect, IRect, "Map");
    //            TravelObj.MapTravel.LineWith = 2
    //            TravelObj.MapTravel.LineColor = "#00FF00"
    //            TravelObj.MapTravel.Draw(MapID, aTravelData, cont, MRect, IRect, "Map");
    //            //this.MapTravel = function(TData,_Container ,_rectMeter,_rectPix,_LineWith, _LineColor, UseFor){
    //            Progress.hide(MapID)
    //        }
    //    }
    //--------------------------------------------------------------
    if (window.TravelData) {
        if (TravelData.Solution) {
            Progress.show(MapID, "Rendering")
            var cont = document.getElementById(Mcode + "^Map^" + "MapImage_TOI");
            var IRect = Map.MapObj[MapID].ImageRect;
            var MRect = Map.MapObj[MapID].MapRect;
            TravelObj.MapCar.Draw(MapID, TravelData, cont, "Map");
            TravelObj.MapWayPoint.Draw(MapID, TravelData, cont, MRect, IRect, "Map");
            TravelObj.MapRoadPoint.Draw(MapID, TravelData, cont, MRect, IRect, "Map");
            TravelObj.MapTravel.LineWith = 2
            TravelObj.MapTravel.LineColor = "#00FF00"
            TravelObj.MapTravel.Draw(MapID, TravelData, cont, MRect, IRect, "Map");
            //this.MapTravel = function(TData,_Container ,_rectMeter,_rectPix,_LineWith, _LineColor, UseFor){
            Progress.hide(MapID)
        }
    }
    //TI_active_Info_Draw();
    POIactive.refresh(MapID);
}
//--------------------------------------------------------------
//Map.getMap.MapImageTransitions ------------------------------- 
Map.getMap.MapImageTransitions=function(MapID,ImgSec,ImgMain,StartOpacity, opacity){
var Mcode = Map.getMcodeFromMapID(MapID);
var Mdata = Map.MapObj[MapID];

var elemImgSec = document.getElementById(ImgSec)
var elemImgMain = document.getElementById(ImgMain)
//function MapImage_TransitionsEfect(ImgSec,ImgMain,StartOpacity, opacity) {
    if (opacity== StartOpacity){
       // setFilter_Opacity(ImgSec,100);
        elemImgSec.style.visibility = "visible";
       // setFilter_Opacity(ImgMain,StartOpacity);
        elemImgMain.style.visibility = "visible";
    }
    if (opacity == 100) {
        elemImgSec.style.visibility = "hidden";
        elemImgSec.src = Mdata.MapImageSRC; // MapImage.src;
        setFilter_Opacity(ImgSec,100);
             //Restore Position & Size
        // document.getElementById("M000^MapImage_Sec").style.position = "absolute";
      //  var elem = document.getElementById(Mcode + "^" + Ocode + "^" + "MapF_Container")

        elemImgSec.style.left = 0 + "px";
        elemImgSec.style.top = 0 + "px";
        elemImgSec.style.width = Mdata.ImageSize.w + "px";
        elemImgSec.style.height = Mdata.ImageSize.h + "px";
        setFilter_Opacity(ImgMain, 100);
        Map.SetMapInNormalMode(MapID);
    }else{
        opacity += 10;
        var tmpOpacity=opacity-StartOpacity
       // setFilter_Opacity(ImgSec,100-tmpOpacity);
        setFilter_Opacity(ImgMain,StartOpacity+tmpOpacity);
        window.setTimeout("Map.getMap.MapImageTransitions("+MapID+",'" +ImgSec+"','"+ ImgMain +"'," +StartOpacity+ "," +opacity+")", 50);

    }
}
























Map.getMapIDFromCode =function (Mcode) {
    var MapID=null;
    var R_string= "";
    if(!Mcode){return MapID;}
    R_string= Mcode.split("M")[1]
    if(!R_string){return MapID;}
    R_string=R_string.split("^")[0]
//var R_string= Mcode.split("M")[1].split("^")[0] 
 
    MapID=parseInt(R_string);
    return MapID;
}
// delete after replace
Map.getMapCodeFromID =function (ID) {
    var R_string= "000" ;
    R_string= R_string +  String(ID);
    R_string= R_string.substr(R_string.length -3, 3);
    R_string="M"+R_string+"^";
    return R_string;
}
Map.getMcodeFromMapID = function(ID) {
    var R_string = "000";
    R_string = R_string + String(ID);
    R_string = R_string.substr(R_string.length - 3, 3);
    R_string = "M" + R_string ;
return R_string;
} 


Map.GetEventTrigger=function (e) {
    e = e || window.event;
    return e.target || e.srcElement;
}


Map.getCursorPosition=function (e) {
    e = e || window.event;
    var cursor = {x:0, y:0};
    if (e.pageX || e.pageY) {
        cursor.x = e.pageX;
        cursor.y = e.pageY;
    } 
    else {
        var de = document.documentElement;
        var b = document.body;
        cursor.x = e.clientX +(de.scrollLeft || b.scrollLeft) - (de.clientLeft || 0);
        cursor.y = e.clientY +(de.scrollTop || b.scrollTop) - (de.clientTop || 0);
    }
    return cursor;
}
Map.addCommas=function (nStr) {
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}





Map.getElem = function() { }
//-------------------------------------------------------------------------------------
Map.getElem.Position=function (InValue) {
    var Object;
    if (typeof(InValue)=="string"){
        Object=document.getElementById(InValue);
     }else{  
        Object= InValue;
    } 
	//var x = 0;
	//var y = 0;
	var position = { x: 0, y: 0 };
	if (!Object) { return position; }
	HandleOnWindow_Resize_IsActive = false;
	//-----------------------------------------
	if (Object.offsetParent) {
		while (Object.offsetParent) {
		    position.x += Object.offsetLeft;
		    position.y += Object.offsetTop;
			Object = Object.offsetParent;
		}
	} else {
	    position.x = Object.x || position.x;
	    position.y = Object.y || position.y;
    }
    //-----------------------------------------
    HandleOnWindow_Resize_IsActive = true;
    return position;
}
//-------------------------------------------------------------------------------------
Map.getElem.Position_Relative=function (InValue) {
    var Object;
    if (typeof(InValue)=="string"){
        Object=document.getElementById(InValue);
     }else{  
        Object= InValue;
    }
    var position = {x:0, y:0};
    if (!Object){return position;}
	
    position.x= Object.offsetLeft || position.x;
    position.y= Object.offsetTop || position.y;
/*	
	    if (isIE){	
            x= Object.offsetLeft || x;
		    y= Object.offsetTop || y;
		} else {
		  //   x = Object.x || x;
		   //  y = Object.y || y;
		    x= Object.offsetLeft|| x;
	        y= Object.offsetTop|| y;
		}
*/
return position;
}

Map.getElem.Size=function(InValue) {
    var Object
    if (typeof(InValue)=="string"){
        Object=document.getElementById(InValue);
     }else{  
        Object= InValue;
    } 
    var Size = {w:0, h:0};
    if (!Object) { return Size; }
    HandleOnWindow_Resize_IsActive = false;
    //-----------------------------------------
    if (isIE){	
        Size.h = Object.clientHeight;
		Size.w = Object.clientWidth;
	} else {	
	    Size.h = Object.clientHeight;
	    Size.w = Object.clientWidth;
	}
	//-----------------------------------------
	HandleOnWindow_Resize_IsActive = true;
return Size;	
}
Map.getElem.Centre=function(InValue) {
    var Object
    if (typeof(InValue)=="string"){
        Object=document.getElementById(InValue);
     }else{  
        Object= InValue;
    }
    var position = {x:0, y:0};
    if (!Object){return position;}
    position = Map.getElem.Position(Object)
    var Size = {w:0, h:0};
    Size=Map.getElem.Size(Object)
    position.x=position.x+Size.w/2
    position.y=position.y+Size.h/2
return position;
}

Map.getElem.Style = function(InValue, styleProp) {
    var Object;
    var s;
    if (typeof (InValue) == "string") {
        Object = document.getElementById(InValue);
    } else {
        Object = InValue;
    }
    if (Object.currentStyle)
        s = Object.currentStyle[styleProp];
    else if (window.getComputedStyle)
        s = document.defaultView.getComputedStyle(Object, null).getPropertyValue(styleProp);
    return s;
}














//==============================================================
// Map.Tools ===================================================
//Map.Tools=function(){}
//var MyTools;
//Map.Tools.ismousedown=false;
//Map.Tools.Image = new Array();
//Map.Tools.Image_over = new Array();
//Map.Tools.Image_active = new Array();



////--------------------------------------------------------------
//// Map.Tools.attachEvent  -------------------------------------------
//Map.Tools.attachEvent= function(ToolsElem){
//    if (ToolsElem.addEventListener){
//        ToolsElem.addEventListener("mouseover",Tools.onmouseEvent, false); 
//        ToolsElem.addEventListener("mouseout",Tools.onmouseEvent, false);
//        ToolsElem.addEventListener("mousedown", Tools.onmouseEvent, false);
//        ToolsElem.addEventListener("mouseup", Tools.onmouseEvent, false); 
//    } else if (ToolsElem.attachEvent){
//        ToolsElem.attachEvent("onmouseover",Tools.onmouseEvent);
//        ToolsElem.attachEvent("onmouseout", Tools.onmouseEvent);
//        ToolsElem.attachEvent("onmousedown", Tools.onmouseEvent);
//        ToolsElem.attachEvent("mouseup", Tools.onmouseEvent);
//    }
//}

   



//--------------------------------------------------------------
//Map.SetMapInUpdateMode  --------------------------------
Map.SetMapInUpdateMode = function(MapID) {
    var Mcode = Map.getMcodeFromMapID(MapID);
    var Ocode = "Map";
    document.getElementById(Mcode + "^MapImage_Main").style.visibility = "hidden";
    document.getElementById(Mcode + "^MapTravelLine").style.visibility = "hidden";
    //document.getElementById(Mcode+  "Map^" +"MapImage_TOI").style.visibility = "hidden";
    document.getElementById(Mcode + "^" + Ocode + "^" + "MapImage_TOI").style.display = "none";
    //document.getElementById(Mcode + "^" + Ocode + "^" + "POIactive").style.visibility = "hidden";
    POIactive.Hide(MapID);
    document.getElementById(Mcode + "^MapImage_Sec").style.visibility = "visible";

}
//--------------------------------------------------------------
// Map.SetMapInNormalMode  -------------------------------
Map.SetMapInNormalMode = function(MapID) {
    var Mcode = Map.getMcodeFromMapID(MapID);
    var Ocode = "Map";
    document.getElementById(Mcode + "^" + "MapImage_Main").style.visibility = "visible";
    document.getElementById(Mcode + "^" + "MapTravelLine").style.visibility = "visible";
    //document.getElementById(Mcode+ "Map^" +"MapImage_TOI").style.visibility = "visible";
    document.getElementById(Mcode + "^" + Ocode + "^" + "MapImage_TOI").style.display = "block";
    //document.getElementById(Mcode + "^" + Ocode + "^" + "POIactive").style.visibility = "visible";
    POIactive.Show(MapID);
    document.getElementById(Mcode + "^" + "MapImage_Sec").style.visibility = "hidden";
}


//--------------------------------------------------------------
//Map.PreviewPan_AzimSlide  -----------------------------------
Map.PreviewPan_AzimSlide = function(MapID) {
    var Moptions = Map.MapObj[MapID];
    CurSlideVal = CurSlideVal + Slide_Step;
    Slide_tmpPos = PointFromPointDistanceAzimouth(Moptions.ImageCenter.x, Moptions.ImageCenter.y, Slide_tmp, CurSlideVal);
    Tools.Pan.Preview(MapID, Slide_tmpPos, Moptions.ImageCenter);
    NavMap.PreviewPan(MapID,"Navigator", Slide_tmpPos, Moptions.ImageCenter);
    slide_Timer = setTimeout("Map.PreviewPan_AzimSlide(" + MapID + ")", 10);
}

//--------------------------------------------------------------
// Map.PreviewPanZoom_slide -----------------------------------
Map.PreviewPanZoom_slide = function(MapID, EndPosX, EndPosY, panVal, zoomVal) {
    var Moptions = Map.MapObj[MapID];
    var speed = (100 - CurSlideVal) * 0.16;
    CurSlideVal += speed;
    if (100 > CurSlideVal + speed + 1) {
        tmpCenterPos = PointOnLineByDistance(Moptions.ImageCenter.x, Moptions.ImageCenter.y, EndPosX, EndPosY, CurSlideVal * panVal / 100);
        var zVal = 1 + CurSlideVal * (zoomVal - 1) / 100
        Map.PreviewPanZoom(MapID, tmpCenterPos, zVal)
    } else {
        CurSlideVal = 100;
        tmpCenterPos = PointOnLineByDistance(Moptions.ImageCenter.x, Moptions.ImageCenter.y, EndPosX, EndPosY, CurSlideVal * panVal / 100);
        //var zVal =zoomVal
        Map.PreviewPanZoom(MapID, tmpCenterPos, zoomVal)
        clearInterval(Slide_Interval); return;
    }
}
//--------------------------------------------------------------
// Map.PreviewPanZoom -----------------------------------------
Map.PreviewPanZoom = function(MapID, NewCenterPos, zoomVal) {
    var Mcode = Map.getMcodeFromMapID(MapID);
    var Moptions = Map.MapObj[MapID]
    // Calculate absolute current coordinates of the image
    var currentPos = { x: 0, y: 0 };
    currentPos.x = Moptions.ImageCenter.x - NewCenterPos.x * zoomVal;
    currentPos.y = Moptions.ImageCenter.y - NewCenterPos.y * zoomVal;
    // Set the map image's style parameters to actually move the image
    var elem = document.getElementById(Mcode + "^MapImage_Sec");
    elem.style.width = (Moptions.ImageSize.w * zoomVal) + "px";
    elem.style.height = (Moptions.ImageSize.h * zoomVal) + "px";
    elem.style.left = currentPos.x + "px";
    elem.style.top = currentPos.y + "px";

    NavMap.PreviewPanZoom(MapID, "Navigator", NewCenterPos, zoomVal)
}
//--------------------------------------------------------------










Map.getMapContainerInnerHTML = function(MapID) {
var Mcode = Map.getMcodeFromMapID(MapID);
var Ocode = "Map";
var innerHTML = "<div id='" + Mcode + "^" + Ocode + "^" + "MapContainer' class='MapContainer' ";
    //innerHTML += "onselectstart='return false'";
    //innerHTML += "onselect ='return false'";
    innerHTML += "onmousedown='Map.onmousedown(this,event);'" 
    // innerHTML += "onmouseup='return FrameHolder.onmouseup(this);'"
    //   innerHTML += "onmouseup='return FrameHolder.onmouseup(event);'"
    //  innerHTML+="onmousemove='FrameHolder.onmousemove(event);'>"
    innerHTML += ">"

//    innerHTML += "<div id='" + Mcode + "^" + Ocode + "^" + "POIactive' class='POIactive'"
//    //innerHTML+="onmouseover='TOIItem_Info_Event(event,'over')'";
//    // onmouseout="TOIItem_Info_Event(event,'out')" 
//    innerHTML += "></div>";

    innerHTML += "<div id='" + Mcode + "^" + Ocode + "^" + "MapImage_TOI' class='MapImage_TOI'";
    //            innerHTML+="onselectstart='return false'";
    innerHTML += "onmousedown  ='return false'";
    //            innerHTML+="onmouseup='return false;'" 
    //            innerHTML+="onmousemove='return false;'"
    innerHTML += ">&nbsp;"
    innerHTML += "</div>";
    innerHTML += "<div id='" + Mcode + "^MapTravelLine' class='MapTravelLine'";
    //            innerHTML+="onselectstart='return false'";
    innerHTML += "onmousedown  ='return false'";
    //            innerHTML+="onmouseup='return false;'" 
    //            innerHTML+="onmousemove='return false;'"
    innerHTML += ">&nbsp;"
    innerHTML += "</div>";

    innerHTML += "<div id='" + Mcode + "^MapImage_ZoomRec' class='MapZoomRec' "
    innerHTML += ">&nbsp;</div>";
    
    innerHTML += "<div id='" + Mcode + "^MapImage_Main' class='MapImageMain' "

    innerHTML += ">&nbsp;</div>";
    innerHTML += "<img id='" + Mcode + "^MapImage_Sec' class='MapImageSec' alt='' title='' src='Images/MapImage_empty.gif' "
    innerHTML += "onmousedown  ='return false'";
    innerHTML += "/>"
    innerHTML += "</div>";
    return innerHTML;
}


//--------------------------------------------------------------
// Map.onmousedown ------------------------------------
Map.onmousedown = function(elem, e) {

document.title = "[onmousedown]" + elem.id	

//----------------------------------
if (!MapPage.SetMouseDown(elem, e)) { return false; }
e.cancelBubble = true;
//----------------------------------
var Mcode = MapPage.McodeMousedown;
var Ocode = MapPage.OcodeMousedown;
var Ecode = MapPage.EcodeMousedown;
var MapID = Map.getMapIDFromCode(Mcode);
var Moptions = Map.MapObj[MapID];
var DowPos = MapPage.DowPos;
//var DowPos = { x: 0, y: 0 }
//DowPos.x = MapPage.DowPos.x - Moptions.ImagePos.x
//DowPos.y = MapPage.DowPos.y - Moptions.ImagePos.y
//----------------------------------
    switch (Moptions.ActiveTools) {
    case "Arrow": 
        Tools.SetActiveTools(MapID,"Pan")
        Tools.Pan.Engage(MapID); 
        break;
    case "ZoomIn":	
        Tools.ZoomIn.Engage (MapID,DowPos)
        break;
    case "ZoomOut":	
        Tools.ZoomOut.Engage (MapID)
        break; 
    case "ReCenter":	
        Tools.ReCenter.Engage (MapID)
        break;                
    case "Pan": 
        Tools.Pan.Engage(MapID); 
        break;            
    default:
       break; 
    } 
return false;
}
//--------------------------------------------------------------
// Map.onmousemove ---------------------------------------------
Map.onmousemove = function(elem, e) {
//----------------------------------
var Mcode = MapPage.McodeMousedown;
//var Ocode = MapPage.OcodeMousedown;
//var Ecode = MapPage.EcodeMousedown;
var MapID = Map.getMapIDFromCode(Mcode);
var Moptions = Map.MapObj[MapID];
//----------------------------------
var DowPos = MapPage.DowPos;
var MovePos = MapPage.CurPos;
//var DowPos = { x: 0, y: 0 }
//DowPos.x = MapPage.DowPos.x - Moptions.ImagePos.x
//DowPos.y = MapPage.DowPos.y - Moptions.ImagePos.y
//var MovePos = { x: 0, y: 0 }
//MovePos.x = MapPage.CurPos.x - Moptions.ImagePos.x
//MovePos.y = MapPage.CurPos.y - Moptions.ImagePos.y


//----------------------------------
    switch (Moptions.ActiveTools) {
        case "ZoomIn":
            Tools.ZoomIn.Preview(MapID, DowPos, MovePos)
            NavMap.PreviewRec(MapID,"Navigator", DowPos, MovePos)
            break;
        case "Pan":
            Tools.Pan.Preview(MapID, DowPos, MovePos)
            NavMap.PreviewPan(MapID,"Navigator", DowPos, MovePos)
            break;
        case "Magnifying":         
            //CTO_Tools_Magnifying_dragIt(MapID,MovePos)
            Tools.Magnifying.Execute(MapID,MovePos)
            break;         
        default:
    } 
return false;
}
//--------------------------------------------------------------
// Map.onmouseup ---------------------------------------------
Map.onmouseup = function(elem, e) {
//----------------------------------
var Mcode = MapPage.McodeMousedown;
var Ocode = MapPage.OcodeMousedown;
var Ecode = MapPage.EcodeMousedown;
var MapID = Map.getMapIDFromCode(Mcode);
var Moptions = Map.MapObj[MapID];
//----------------------------------
var DowPos = MapPage.DowPos;
var UpPos = MapPage.CurPos;

//var DowPos = { x: 0, y: 0 }
//DowPos.x = MapPage.DowPos.x - Moptions.ImagePos.x
//DowPos.y = MapPage.DowPos.y - Moptions.ImagePos.y
//var UpPos = { x: 0, y: 0 }
//UpPos.x = MapPage.CurPos.x - Moptions.ImagePos.x
//UpPos.y = MapPage.CurPos.y - Moptions.ImagePos.y
//----------------------------------

switch (Moptions.ActiveTools) {
        case "ZoomIn": 
            if (Math.abs(DowPos.x-UpPos.x)<=4 && Math.abs(DowPos.y-UpPos.y)<=4){
                Tools.ZoomIn.ExecuteByPoint(MapID,DowPos,UpPos);
            } else {
            Tools.ZoomIn.ExecuteByRect(MapID, DowPos, UpPos);
            
            } 
            Tools.ZoomIn.Release (MapID);             
            break;
        case "ZoomOut": 
            Tools.ZoomOut.Execute(MapID,UpPos);
            Tools.ZoomOut.Release (MapID);
            break;
        case "ReCenter": 
            Tools.ReCenter.Execute(MapID,UpPos);
            Tools.ReCenter.Release (MapID);
            break;    
        case "Pan": 
            if (DowPos.x!=UpPos.x || DowPos.y!=UpPos.y){
                Tools.Pan.Execute(MapID,DowPos,UpPos);
                Tools.Pan.Release(MapID);
            } else {
                Tools.Pan.Release(MapID);
                Map.SetMapInNormalMode(MapID); 
            }     
            break;          
        case "Magnifying":         
            break;         
        default:
    } 
 //   Map.Tools.ismousedown=false;
}






//Map.setMinLeft=function(){
////	CM.minLeft=parseInt(document.getElementById("colleft").style.width);
//};

//Map.getCurrRightW=function(){
////	return GetWinWidth()-Map.getCurrLeftW()-Map.rightWAdj;
//};

//Map.getCurrLeftW=function(){
////	if(Map.currLeftW==0)
////		Map.currLeftW=parseInt(document.getElementById("colleft").style.width);
////	return Map.currLeftW;
//};
Map.DeActiveEvent;
Map.McodeMousedown;
Map.MapFMousedown;
Map.ElemMousedown;

Map.currpos= {x:0, y:0};

//Map.currLeftW=0;
//Map.minLeft;
//Map.minRight=300;
//Map.rightWAdj=21;



Map.MapObj= new Array();

Map.MapImage = new Image;
//Map.MapImage.onload =Map.getMap.MapImageIsLoaded; 
    var elem=Map.MapImage;
    if (elem.addEventListener){
        elem.addEventListener('load',Map.getMap.MapImageIsLoaded, false); 
    } else if (elem.attachEvent){
        elem.attachEvent('onload',Map.getMap.MapImageIsLoaded);
    }
    
//Map.LocationImage = new Image;      
// //Map.LocationImage.onload =Map.getLocationMap.MapImageIsLoaded; 
//     if (Map.LocationImage.addEventListener){
//        Map.LocationImage.addEventListener('load',MapF_Location.getMap.MapImageIsLoaded, false); 
//    } else if (Map.LocationImage.attachEvent){
//        Map.LocationImage.attachEvent('onload',MapF_Location.getMap.MapImageIsLoaded);
//}