/* ************************************************************************

   Copyright:

   License:

   Authors:

************************************************************************ */

/**
 * Your application
 */

var GUserGroup = "all";

var GFrame, GPortWidget;

var GPortX = 300, GPortY = 32;
var GPortWidth = 0, GPortHeight = 0;
var GCellWidth = 400, GCellHeight = 400;
var GBufferZone = 0;
var GMapCells = new Array();
var GArrX = new Array();
var GArrY = new Array();
var GCellOnX = 0, GCellOnY = 0;
var GAbsOffsetX = 0, GAbsOffsetY = 0;
var GAbsX = 0, GAbsY = 0;
var GOldPosX=0, GOldPosY=0;
var GOldAbsX = 0, GOldAbsY = 0;
var GisDrag = 0;
var GisMapInit = false;

var GLabelArr = new Array;
var GLabelCache = new Array;

//GMapData.markers[GCurrMarkers]
var GCurrMarkers = MapData.NULL_MARKERS;

var GStartX = 0, GStartY = 0;

var GMapFlag = 1;

var GOldPosX = 0;
var GOldPosY = 0;

var GDebugPort;

var GCellX=0, GCellY=0;

//левый верхний угол - долгота - 39.028433, широта - 51.824567
//правый нижний угол - долгота 39.418183, широта - 51.508683

var GMapLot1 = 39.028433, GMapLat1 = 51.824567, GMapLot2 = 39.418183, GMapLat2 = 51.508683;

var DIR_WEST   = 1;
var DIR_EAST   = 2;
var DIR_NORTH  = 4;
var DIR_SOUTH  = 8;

var MAP_IDLE              = 0;
var MAP_MOVE              = 1;
var MAP_SCALE             = 2;
var MAP_SET_LABEL         = 3;
var MAP_REFRESH_CACHE     = 4;

var GMapAction = MAP_MOVE;
var GCurrMarkerType = 0;

var LABEL_BORN = 1;
var LABEL_LIVE = 2;

var MT_NULL = "null";
var MT_GLOBAL = "global";
var MT_USER = "user";

var GCurrMT = MT_USER;
var GCurrMC = "*";

var map_uniqid = "?map_uniqid=";
var map_xpos = "&xpos=";
var map_ypos = "&ypos=";
var map_scale = "&scale=";
var map_flag = "&flag=";

var map_scale_name = "scale";
var map_scale_ext = ".gif";


// Global widgets.
var GScaleNum;
var GScaleLin;
var GEmbedMap;
var GLabelPopup;
var GLabelPopupAtom;
var GPopupNewLabel;
var GLabelList;
var GFindList;
var GMode;

var GFilter = 1;

var loaded_cell = [];

var preloader_cell = null;

/*
function setMapCell(cell, uniqid, xpos, ypos, scale, flag) {
         cell._img.setSource("");
         if(xpos < 0 || xpos > scale-1 || ypos < 0 || ypos > scale-1) return;
         cell._img.setSource(map_cell_loading);
         if(MapData.isLoading == false) return;
         var map_full_url = MapData.map_server + uniqid + "/frm_" + xpos + "_" + (scale-ypos-1) + "_" + scale + "_" + flag + ".png";
         cell._img.setSource(map_full_url);
         //GDebugPort.debug("Cell URL: " + map_full_url);
         loaded_cell[map_full_url] = true;
}
*/

function setMapCell(cell, uniqid, xpos, ypos, scale, flag) {
         cell._img.setSource("");
         if(xpos < 0 || xpos > scale-1 || ypos < 0 || ypos > scale-1) return;
         cell._img.setSource(map_cell_loading);
         if(MapData.isLoading == false) return;
         var map_full_url = MapData.map_server + uniqid + "/frm_" + xpos + "_" + (scale-ypos-1) + "_" + scale + "_" + flag + ".png";
//         GDebugPort.debug("RANDOMIZE PARAMETR: " + loaded_cell[map_full_url]);
         if(loaded_cell[map_full_url] >= 0) { map_full_url += "?" + loaded_cell[map_full_url]; }
         if(loaded_cell[map_full_url] == undefined) loaded_cell[map_full_url] = -1;
         cell._img.setSource(map_full_url);
//         GDebugPort.debug("Cell URL: " + map_full_url);
}

/*
function preloadingMapCell(cell, uniqid, xpos, ypos, scale, flag) {
         if(xpos < 0 || xpos > scale-1 || ypos < 0 || ypos > scale-1) return;
         if(MapData.isLoading == false) return;
         var map_full_url = MapData.map_server + uniqid + "/frm_" + xpos + "_" + (scale-ypos-1) + "_" + scale + "_" + flag + ".png";
         if(loaded_cell[map_full_url] == true) return;
         preloader_cell.setSource(map_full_url);
         //GDebugPort.debug("Preloading URL: " + map_full_url);
         loaded_cell[map_full_url] = true;
}
*/

function preloadingMapCell(cell, uniqid, xpos, ypos, scale, flag) {
         if(xpos < 0 || xpos > scale-1 || ypos < 0 || ypos > scale-1) return;
         if(MapData.isLoading == false) return;
         var map_full_url = MapData.map_server + uniqid + "/frm_" + xpos + "_" + (scale-ypos-1) + "_" + scale + "_" + flag + ".png";
         if(loaded_cell[map_full_url] != undefined) return;
         preloader_cell.setSource(map_full_url);
//         GDebugPort.debug("Preloading URL: " + map_full_url);
         loaded_cell[map_full_url] = -1;
}

/*function setMapCellRefresh(cell, uniqid, xpos, ypos, scale, flag, rnd) {
         cell._img.setSource("");
         if(xpos < 0 || xpos > scale-1 || ypos < 0 || ypos > scale-1) return;
         cell._img.setSource(map_cell_loading);
         if(MapData.isLoading == false) return;
         var map_full_url = MapData.map_server + uniqid + "/frm_" + xpos + "_" + (scale-ypos-1) + "_" + scale + "_" + flag + ".png";
         cell._img.setSource(map_full_url);
         //GDebugPort.debug("Cell URL: " + map_full_url);
}*/

function setMapCellRefresh(cell, uniqid, xpos, ypos, scale, flag, rnd) {
         cell._img.setSource("");
         if(xpos < 0 || xpos > scale-1 || ypos < 0 || ypos > scale-1) return;
         cell._img.setSource(map_cell_loading);
         if(MapData.isLoading == false) return;
         rnd *= 1000000;
         rnd = Math.round(rnd);
         map_full_url = MapData.map_server + uniqid + "/frm_" + xpos + "_" + (scale-ypos-1) + "_" + scale + "_" + flag + ".png";
         loaded_cell[map_full_url] = rnd;
         map_full_url += "?" + rnd;
         cell._img.setSource(map_full_url);
         //GDebugPort.debug("Cell URL: " + map_full_url);
}

function setMapScaleLin(scaleWidget, scale) {

         var k = Math.cos(Math.abs((MapData.map_south + MapData.map_north)/2)*Math.PI/180);
         var scale_num = Math.round(((Math.abs(MapData.map_east - MapData.map_west)*111120)/(scale*GCellWidth))*40*k);
         
         if(scale_num > 1000) {
             scale_num /= 1000;
             scale_num = Math.round(scale_num);
             GScaleNum.setLabel("<b>" + scale_num + " " + Label_Kilometers + "</b>");
         }
         else
             GScaleNum.setLabel("<b>" + scale_num + " " + Label_Meters + "</b>");

         GDebugPort.debug("Scale: " + scale_num);
}

function RemoveLabelByElement(label) {

         // Call SOAP method "mtdDeleteLabel".

         var curr_id, id = label._id;
         GLabelArr.splice(id, 1);
         label.setVisibility(false);
         for(var i=0; i<GMapCells.length; i++) {
                 for(j=0; j<GMapCells[i]._freeLabels.length; j++) {
                          var label = GMapCells[i]._freeLabels[j];
                          if(label.getVisibility() == true) {
                                    curr_id = label._id;
                                    if(id<=curr_id) label._id = curr_id-1;
                          }
                 }
         }
}

function RemoveLabelByIndex(id) {
         MapData.markers[GCurrMarkers].splice(id, 1);
         for(var i=0; i<GMapCells.length; i++) {
                 for(j=0; j<GMapCells[i]._freeLabels.length; j++) {
                          var label = GMapCells[i]._freeLabels[j];
                          if(label._id == id) {
                                    label.setBorder(qx.renderer.border.BorderPresets.getInstance().none);
                                    label.setVisibility(false);
                          }
                          if(label.getVisibility() == true) {
                                    curr_id = label._id;
                                    if(id<=curr_id) label._id = curr_id-1;
                          }
                 }
         }
}

//GLabelArr[this._id].elmtComments.text.replace(/\n/g, "<br>")

function StringWrap(str, wrap_len) {
         //str = str.toString();
         //var part = parseInt(str.length/wrap_len);
         //for(var i=1; i<part; i++)
         //       str.splice(i*wrap_len+i-1, 0, "<br>");
         //return str;
}

function ShowInformator(marker) {
/*      var str = "<b>" + marker.elmtName.text + "</b><br>" +
              marker.elmtComments.text.replace(/\n/g, "<br>");

      GLabelPopupAtom.setCursor("default");
      GLabelPopupAtom.__marker = marker;
      if(marker.elmtPreview != undefined)
              if(marker.elmtPreview != 0) {
                       GLabelPopupAtom.setIcon(map_resource_map + "ajax-loader2.gif");
                       GLabelPopupAtom.setShow("both");
                       GLabelPopupAtom.setCursor("pointer");
                       //GLabelPopupAtom.setIconWidth(96); GLabelPopupAtom.setIconHeight(96);
                       GLabelPopupAtom.setIcon(Gallery.imagePath(marker.elmtPid, marker.elmtPreview, true));
              }
              else {
                       GLabelPopupAtom.setIcon("");
                       GLabelPopupAtom.setShow("label");
              }
      else {
              GLabelPopupAtom.setIcon("");
              GLabelPopupAtom.setShow("label");
      }
      
      GLabelPopupAtom.setLabel(str); */
      
      GLabelPopup.__embed_inf.setCursor("default");
      GLabelPopup.__embed_inf.__marker = marker;

      var name = marker.elmtName.text + "";
      var content = marker.elmtComments.text + "";
      var image_src = '';
      var image_full = '';

      if(marker.elmtPreview != undefined)
              if(marker.elmtPreview != 0) {
                      image_src = Gallery.imagePath(marker.elmtPid, marker.elmtPreview, true);
                      image_full = image_src.replace(/preview\//gi, '');
              }
              else {
              }
      else {
      }

      var width, height;
      var lt = 48, sh = 7, fw = 7, fh = 8;
      var name_len = name.length;
      var content_len = content.length;

      if(name_len > content_len) width = name_len * (fw + 1);
      else if(content_len < lt) width = content_len * fw;
      else width = lt * fw;

      var total_str = Math.ceil(content_len / lt);

      if(total_str < 12) height = 0;
      else height = total_str * (fh + sh) * 0.5;

      if(image_src != '' && total_str == 1) width += 96;

      if(width < 100) width = 100;
      if(width > 300) width = 300;
      if(height > 300) height = 300;

      content = content.replace(/\n/g, "<br />") + "";
      var html = '<div style="width: ' + width + '; padding: 8px; border: 1px solid #808080; background-color: #ffffff; z-index: 100;'
		+ 'font-family: \u0027Segoe UI\u0027,Corbel,Calibri,Tahoma,\u0027Lucida Sans Unicode\u0027,sans-serif;'
		+ 'font-size: 11px; font-weight: normal; font-style: normal;">'
                + '<div style="width: 100%; padding: 4px; background-color: #eeeeee;  margin-bottom: 6px;"><b>' + name + '</b></div>'
		+ '<div style="padding: 4px; width: 100%; ' + ((height == 0) ? '' : ('height:' + height + '; ')) + 'overflow: auto">'
		+ (image_src == '' ? '' : '<img align="left" style="cursor: pointer" src="' + image_src + '" onclick="javascript:OpenExternWindow(\u0027' + image_full + '\u0027)"/>')
		+ content + '</div></div>';
      GLabelPopup.__embed_inf.setHtml(html);

      GLabelPopup.setTop(marker.mY + GPortY + GAbsY + 8); //e.getPageY() + 3);
      GLabelPopup.setLeft(marker.mX + GPortX + GAbsX + 8); //e.getPageX() + 3);
      GLabelPopup.show();
      GLabelPopup.bringToFront();
}

function CreateLabel(cell) {
         var label = new qx.ui.basic.Atom(null, map_resource_map + "nullMarker.png");
         label.setVisibility(false);
         //label.setResizeToInner(true);
         label.setBorder(qx.renderer.border.BorderPresets.getInstance().none);
         label.setWidth(16);
         label.setHeight(16);
         label.setZIndex(100);
         //label.setCursor("pointer");
         label.addEventListener("mouseover", function(e) {
                    if(GMapAction == MAP_SET_LABEL) return;

                    //var posX = this.getUserData("XPOS");
                    //var posY = this.getUserData("YPOS");

                    var marker = MapData.markers[GCurrMarkers][this._id];
                    ShowInformator(marker);

         });
         //GPortWidget.add(label);
         cell.add(label);
         cell._freeLabels.push(label);
         return label;
}

function FindFreeLabel(cell) {
         for(var i=0; i<cell._freeLabels.length; i++) {
                 if(cell._freeLabels[i].getVisibility() == false)
                         return cell._freeLabels[i];
         }
         return -1;
}

function GetCellByPos(pX, pY) {
         for(var i=0; i<GMapCells.length; i++) {
                  if(GMapCells[i].getUserData("XPOS") == pX && GMapCells[i].getUserData("YPOS") == pY) {
                           return GMapCells[i];
                  }
         }
}

function GetCellPos(cX, cY) {
         var mX = cX - GPortX - GAbsX;
         var mY = cY - GPortY - GAbsY;
         return { pX : parseInt(mX/GCellWidth), pY : parseInt(mY/GCellHeight) };
}

function EnableBorder(enabled) {
         var border;
         if(enabled == true)
                 border = new qx.renderer.border.Border(2, "solid", "#808080")
         else
                 border = qx.renderer.border.BorderPresets.getInstance().none;

         for(var i=0; i<GMapCells.length; i++) {
                 GMapCells[i]._img.setBorder(border);
         }
}

function GenerateCache(cX, cY) {
         var pos = GetCellPos(cX, cY);
         var cell = GetCellByPos(pos.pX, pos.pY);
         cell._img.setVisibility(false);
         RefreshCacheMap(pos.pX, (MapData.curr_scale-pos.pY-1), MapData.curr_scale, true, function(ret) {
                cell._rnd = Math.random();
                setMapCellRefresh(cell, MapData.map_guid, pos.pX, pos.pY, MapData.curr_scale, GMapFlag, cell._rnd);
                cell._img.setVisibility(true);
         });
}

function UserSetLabel(uid, cX, cY) {

         var cell, label, i;

         var mX = cX - GPortX - GAbsX;
         var mY = cY - GPortY - GAbsY;

         var pX = parseInt(mX/GCellWidth);
         var pY = parseInt(mY/GCellHeight);

         cell = GetCellByPos(pX, pY);
         label = FindFreeLabel(cell);
         if(label == -1) label = CreateLabel(cell);

         var offsetX = mX-pX*GCellWidth;
         var offsetY = mY-pY*GCellHeight;

         label.setIcon(map_resource_map + "nullMarker.png");
         label.setLocation(offsetX-8, offsetY-8);
         label.setUserData("XPOS", pX);
         label.setUserData("YPOS", pY);
         label.setVisibility(true);
         
         var geo = MapData.Px2Geo(mX, mY);

         GPopupNewLabel._caption.setLabel(geo.str);
         GPopupNewLabel._name_field.setValue(Popup_NewLabel_NamePrompt);
         GPopupNewLabel._comment_field.setValue(Popup_NewLabel_CommentPrompt);
         
         // Transport to event ->
         GPopupNewLabel._mX = mX;
         GPopupNewLabel._mY = mY;
         GPopupNewLabel._pX = pX;
         GPopupNewLabel._pY = pY;
         GPopupNewLabel._lon = geo.lon;
         GPopupNewLabel._lat = geo.lat;
         GPopupNewLabel._cell = cell;
         GPopupNewLabel._label = label;
         GPopupNewLabel._result = 0;
         // <-

         GPopupNewLabel.setLeft(cX + 10);
         GPopupNewLabel.setTop(cY + 10);
         GPopupNewLabel.show();
         GPopupNewLabel.bringToFront();
}

function RefreshMap() {
         for(var i=0; i<GMapCells.length; i++) {
                 var xpos = GMapCells[i].getUserData("XPOS");
                 var ypos = GMapCells[i].getUserData("YPOS");
                 setMapCellRefresh(GMapCells[i], MapData.map_guid, xpos, ypos, MapData.curr_scale, GMapFlag, Math.random());
         }
}

function RedrawLabels() {
         if(GCurrMarkers == MapData.FAVORITE_MARKERS && Favorites.marker_list.__change_sel == true) {
                 Favorites.marker_data.length = 0;
         }

         for(i=0; i<GMapCells.length; i++) {
                  SetLabelOnCell(GMapCells[i]);
         }
         
         if(GCurrMarkers == MapData.FAVORITE_MARKERS && Favorites.marker_list.__change_sel == true) {
                Favorites.marker_list.__change_sel = false;
                Favorites.marker_list.update();
         }
}

function SetLabelOnCell(cell) {

         var lX, lY, pX, pY, offsetX, offsetY;
         var posX = cell.getUserData("XPOS");
         var posY = cell.getUserData("YPOS");

         for(var i=0; i<cell._freeLabels.length; i++)
                 cell._freeLabels[i].setVisibility(false);
                 
	 var oneLabel, labels=0;
         var rCW = 1/GCellWidth, rCH = 1/GCellHeight;
         for(var i=0; i<MapData.markers[GCurrMarkers].length; i++) {

                 if(MapData.markers[GCurrMarkers].filter == "!*")
                           continue;

                 if(MapData.markers[GCurrMarkers].filter != "*") {
                     if(MapData.markers[GCurrMarkers][i].__global == true) {
                            if(MapData.markers[GCurrMarkers].filter.indexOf("|G" + MapData.markers[GCurrMarkers][i].elmtGroup + "|") == -1)
                                 continue;
                     } else {
                            if(MapData.markers[GCurrMarkers].filter.indexOf("|" + MapData.markers[GCurrMarkers][i].elmtUid + ":" + MapData.markers[GCurrMarkers][i].elmtGroup + "|") == -1)
                                 continue;
                     }
                 }

                 if(GCurrMarkers == MapData.FAVORITE_MARKERS && Favorites.marker_list.__change_sel == true) {
                        if(MapData.markers[GCurrMarkers].gid_list == MapData.markers[GCurrMarkers][i].elmtUid + ":" + MapData.markers[GCurrMarkers][i].elmtGroup)
                              if(Favorites.marker_data.indexOf(MapData.markers[GCurrMarkers][i]) == -1)
                                     Favorites.marker_data.push(MapData.markers[GCurrMarkers][i]);

                        if(MapData.markers[GCurrMarkers].gid_list == "G" + MapData.markers[GCurrMarkers][i].elmtGroup)
                              if(Favorites.marker_data.indexOf(MapData.markers[GCurrMarkers][i]) == -1)
                                     Favorites.marker_data.push(MapData.markers[GCurrMarkers][i]);
                 }

                 lX = MapData.markers[GCurrMarkers][i].mX;
                 lY = MapData.markers[GCurrMarkers][i].mY;
                 pX = Math.floor(lX*rCW); ///GCellWidth);
                 pY = Math.floor(lY*rCH); ///GCellHeight);

                 if(posX != pX) continue;
                 if(posY != pY) continue;

                 offsetX = lX-pX*GCellWidth;
                 offsetY = lY-pY*GCellHeight;
                 
                 if(GCellWidth - offsetX < 8) offsetX = GCellWidth - 8;
                 if(GCellHeight - offsetY < 8) offsetY = GCellHeight - 8;
                 if(offsetX < 8) offsetX = 8;
                 if(offsetY < 8) offsetY = 8;

                 if(labels < cell._freeLabels.length)
                       oneLabel = cell._freeLabels[labels];
                 else
                       oneLabel = CreateLabel(cell);

                 oneLabel.setLeft(offsetX-8);
                 oneLabel.setTop(offsetY-8);

                 oneLabel._id = i;
                 oneLabel.setIcon(MapData.markers[GCurrMarkers][i].icon.icon);
                 oneLabel.setUserData("XPOS", pX);
                 oneLabel.setUserData("YPOS", pY);
                 oneLabel.setVisibility(true);
                 labels++;
         }
}

var RESET_NONE = 0;
var RESET_FINDER = 1;
var RESET_GROUP = 2;
var RESET_MARKERS = 4;
var RESET_GALLERY = 8;
var RESET_NULL = 16;
var RESET_ALL = 127;

function ResetWidgets(flag) {
     // Clear widgets.
     // Reset finder.
     //find_field.setValue("");
     
     if(flag & RESET_FINDER) {
           MapData.markers[MapData.FINDER_MARKERS].length = 0; // Clear data.

           GFindList._data.length = 0;
           GFindList.update();
     }
     if(flag & RESET_GROUP) {
           // Reset favorites.
           Favorites.clearGroup();
           Favorites.marker_data.length = 0;
           Favorites.marker_list.update();
     }
     if(flag & RESET_MARKERS) {
           // Reset MyMarkers.
           
           MyMarkers.resetTypeComboBox();

           if(Switcher.currentSector <= 10) {

                  var type_items = [        { text : Combobox_GetMarker_All, value : "all"},
                                            { text : Combobox_GetMarker_Global , value : "global" }
                                   ];

                  for(var i=0; i<type_items.length; i++) {
                           var item = new qx.ui.form.ListItem(type_items[i].text);
                           item.setValue(type_items[i].value);
                           MyMarkers.type_combo.add(item);
                  }

                  var item = new qx.ui.form.ListItem(Combobox_GetMarker_GroupsSep);
                  item.setValue("separator");
                  item.setEnabled(false);
                  MyMarkers.type_combo.add(item);
                  FillComboBoxGroup(MyMarkers.type_combo);
           }

           MyMarkers.clearMyMarkers();
     }
     if(flag & RESET_NULL) {
           // Reset null markers.
           GLabelList._data.length = 0;
           GLabelList.update();
     }
     if(flag & RESET_GALLERY) {
           // Reset gallery.
           Gallery.tab.disconnect();
           Gallery.gallery_list.removeAll();
     }
}

qx.OO.defineClass("Application", qx.component.AbstractApplication, function() {
  qx.component.AbstractApplication.call(this);
});

qx.Proto.main = function(e)
{
       GDebugPort = this;
       
       System.checkPlace();
       System.pathMaker(System.localRun);
       
       System.linkParser(document.URL);
       System.windowOpener = window.opener;

       SheduleCycle(); // Run sheduler.
       
       // Create empty sectors.
       Switcher.createSector(Switcher.ADMIN_SECTOR);       // Admin sector.
       Switcher.createSector(Switcher.GUEST_SECTOR);       // Guest sector.
       Switcher.createSector(Switcher.USER_SECTOR);        // User sector.

       window.onresize = function() {
             if(GisMapInit == true) {
                     var elm = GFrame.getElement();
                     
                     //if(parseInt(elm.clientWidth) == GPortWidth && parseInt(elm.clientHeight) == GPortHeight)
                     //         return;

                     GPortWidth = parseInt(document.body.offsetWidth-GPortX);
                     GPortHeight = parseInt(document.body.offsetHeight-GPortY);
//                     alert(GPortWidth + "  " + GPortHeight);
                     var tmpX = GAbsX, tmpY = GAbsY;
                     CreateCells(GPortWidget);
                     GAbsX = tmpX; GAbsY = tmpY;
                     SetMapPosition(-GAbsX, -GAbsY, 1);
//                     RedrawLabels();
             }
       }

       Splash.end();

       BuildWorkspace();

       if(System.clientState.auth == "on") {
             if(GAuthDialog == null)
                    GAuthDialog = InitAccountDialog();
             GAuthDialog.open();
       }

       if(System.clientState.mapid != null) {
             var map_data = findMapById(System.clientState.mapid);
             if(map_data != null) {
                  GFrame.addEventListener("appear", function() {
                          setMap(map_data);
                  });
             } else {
                  var map = window.open(map_nav_url, "navmap", "width=520, height=425, menubar=no, scrollbars=no, resizable=yes");
             }
       } else {
             // Open nav window.
             var map = window.open(map_nav_url, "navmap", "width=520, height=425, menubar=no, scrollbars=no, resizable=yes");
       }
};

function mapInit() {

         var elm = GFrame.getElement();
         GPortWidth = parseInt(elm.clientWidth);
         GPortHeight = parseInt(elm.clientHeight);

         //GAbsX = -parseInt((GCellWidth*GMapScale)/2-GPortWidth/2);
         //GAbsY = -parseInt((GCellHeight*GMapScale)/2-GPortHeight/2);

         CreateCells(GPortWidget);

         GScaleNum = new qx.ui.basic.Atom("");
         with(GScaleNum) {
                    //setBorder(qx.renderer.border.BorderPresets.getInstance().none);
                    setRight(132);
                    setBottom(15);
                    setZIndex(1000);
         }
         GPortWidget.add(GScaleNum);

         /*GMode = new qx.ui.basic.Atom("");
         with(GMode) {
                    //setBorder(qx.renderer.border.BorderPresets.getInstance().none);
                    setRight(10);
                    setTop(15);
                    setZIndex(1000);
         }
         GPortWidget.add(GMode);*/

         GScaleLin = new qx.ui.basic.Image(map_scale_url);
         with(GScaleLin) {
                    setResizeToInner(true);
                    setBorder(qx.renderer.border.BorderPresets.getInstance().none);
                    setRight(5);
                    setBottom(5);
                    setWidth(164);
                    setHeight(16);
                    setZIndex(1000);
         }
         GPortWidget.add(GScaleLin);
         
         if(System.windowOpener != null && System.clientState.fromEditor == true) {
                 GEmbedMap = new qx.ui.form.Button(Button_Embed_Map);
                 with(GEmbedMap) {
                    setRight(25);
                    setTop(25);
                    setWidth(150);
                    setHeight(32);
                    setZIndex(1000);
                    addEventListener("execute", function() {
                          if(System.windowOpener != null && System.clientState.fromEditor == true) {
                                  if(System.windowOpener.Editor.isEdit == true) {
                                          var link = buildLink();
                                          GDebugPort.debug("Embed map: " + link);
                                          var id = System.windowOpener.Editor.currentId;
                                          System.windowOpener.Editor.insertMap(id, link);
                                  }
                          }
                    });
                 }
                 GFrame.add(GEmbedMap);
         }

         setMapScaleLin(GScaleLin, MapData.curr_scale);

         GisMapInit = true;
}

function chooseMap(mp) {
         GDebugPort.debug(mp.x + "  " + mp.y);

         var west = 19.638066, east = 180;
         var south = 36.512083, north = 87.380983;
         var map_width = 800, map_height = 600;

         var lon = west + (mp.x / map_width) * (east-west);
         var lat = north + (mp.y / map_height) * (south-north);

         GDebugPort.debug(lon + " " + lat);
         
         GDebugPort.debug("Total maps: " + GAllMaps.__indices.length);
         
         var map = null;
         for(var i=0; i<GAllMaps.__indices.length; i++) {
                 map = GAllMaps[GAllMaps.__indices[i] + ""];

                 if(map.elmtId == 25) continue;

                 GDebugPort.debug(map.elmtName.text);

                 if(map.elmtWest < lon && lon < map.elmtEast && map.elmtSouth < lat && lat < map.elmtNorth) {
                                 GDebugPort.debug("Find: " + map.elmtName.text);
                                 
                                 setMap(map);
                                 break;
                 }
         }
}

function buildLink() {
         if(MapData.isLoaded == false) return;
         var cX = - GAbsX + GPortWidth/2;
         var cY = - GAbsY + GPortHeight/2;
         var ret = MapData.Px2Geo(cX, cY);
         var link = "http://www.okarta.ru/map_link.html";
         link += "?mapid=" + MapData.map_id;
         link += "&lat=" + (ret.lat + "").substring(0, 6);
         link += "&lon=" + (ret.lon + "").substring(0, 6);
         link += "&scale=" + MapData.curr_scale;
         if(MapData.markers[GCurrMarkers].filter != '*' && MapData.markers[GCurrMarkers].filter != '!*') {
                  if(MapData.markers[GCurrMarkers].filter.indexOf('G') != -1) { // If global groups.
                           var gid = MapData.markers[GCurrMarkers].filter.replace(/\|G/gi, ",");
                           gid = gid.substring(1, gid.length-1);
                           link += "&gid=" + gid;
                  } else {
                  }
         }
         if(GCurrMarkers == MapData.USER_MARKERS)
                  if(GAuthInfo != undefined)
                        link += "&uid=" + GAuthInfo.elmtUid;
         link += "&mrkover";
         return link;
}

function findMapById(id) {
         var map;
         for(var i=0; i<GAllMaps.__indices.length; i++) {
                 map = GAllMaps[GAllMaps.__indices[i] + ""];
                 if(map.elmtId == id) return map;
         }
         return null;
}

function setMap(map_data) {

         if(GisMapInit == false)
                mapInit();

         MapData.initMap(map_data, function(groups) {

                  ResetWidgets(RESET_ALL);

/*                if(Switcher.currentSector == Switcher.ADMIN_SECTOR) {
                             field_name.setValue("");
                             field_comment.setValue("");
                  }
*/
                  if(Favorites.current_fav == "global") {
                                for(var i=0; i<groups.length; i++) {
                                        if(MapData.checkGroupOnGlobal(groups[i]) == false) continue;
                                        if(groups[i].elmtName + "" != "") {
                                               Favorites.addGroup2List(groups[i]);
                                        }
                                }
                  }

                  var user_groups = Profile.getFav(MapData.map_guid);
                  for(var i=0; i<user_groups.length; i++) {
                                   var name = "unknown";
                                   var uidgid = (user_groups[i] + "").split(':');
                                   var uid = uidgid[0];
                                   var gid = uidgid[1];
                                   GDebugPort.debug("Favorites add: " + uid + " : " + gid);

                                   var user_info = GetUserInfo(uid, GAuthInfo.elmtAccuid);
                                   if(user_info.elmtResult == 0) {
                                            name = user_info.elmtAname;
                                            GDebugPort.debug("User name: " + user_info.elmtAname);
                                   }
                                   Favorites.addUserGroup(name, uid, gid);
                  }

         });

         MapData.curr_scale = 5;
         MapData.curr_scale_id = MapData.scales.indexOf(MapData.curr_scale);

         setMapScaleLin(GScaleLin, MapData.curr_scale);

         GAbsX = - (GCellWidth*MapData.curr_scale/2) + GPortWidth/2;
         GAbsY = - (GCellHeight*MapData.curr_scale/2) + GPortHeight/2;
         GOldPosX = GAbsX, GOldPosY = GAbsY;
         GOldAbsX = GAbsX, GOldAbsY = GAbsY;

         SetMapPosition(-GAbsX, -GAbsY, 1);
}

function BuildWorkspace()
{
         var d = qx.ui.core.ClientDocument.getInstance();

         var dockLayout = new qx.ui.layout.DockLayout;
         dockLayout.setLocation(0, 0);
         dockLayout.setDimension("100%", "100%");
         dockLayout.setBackgroundColor("white");

         d.add(dockLayout);
         
         preloader_cell = new qx.ui.basic.Image(map_resource_map + "ajax-loader2.gif");
         preloader_cell.setVisibility(false);
         d.add(preloader_cell);

/*
Toolbar
*/

      var tb = new qx.ui.toolbar.ToolBar;
      with(tb)
      {
          setHeight(GPortY);
          setHorizontalChildrenAlign("left");
      };

      var btns1 = [
        { id : "set", type : "button", toolTip : Tooltip_UserMarker_New, icon : "icon/22/actions/edit-add", text : "" },
        //{ id : "move", type : "button", toolTip : Toolbar_Basic_Move, icon : map_resource_map + "system-search", text : "" },
        { id : "zoomin", type : "button", toolTip : Toolbar_Basic_ZoomIn, icon : map_resource_map + "zoom-in", text : "" },
        { id : "zoomout", type : "button", toolTip : Toolbar_Basic_ZoomOut, icon : map_resource_map + "zoom-out", text : "" },
        { id : "link", type : "button", toolTip : Tooltip_UserMarker_Link, icon : "icon/22/apps/graphics-snapshot", text : "" }
      ];

      var btns2 = [
        { id : "open_map", type : "button", toolTip : Toolbar_Main_ChooseMap, icon : "icon/22/places/www", text : "" },
        { id : "auth", type : "button", toolTip : Toolbar_Main_Auth, icon : "icon/22/status/dialog-password", text : "" },
        { id : "userinfo", type : "separator" },
        { id : "userinfo", type : "button", toolTip : Toolbar_Main_UserInfo, icon : "icon/22/places/user-home", text : "" }
//        { id : "userblog", type : "button", toolTip : Toolbar_Main_UserBlog, icon : "icon/22/places/user-home", text : "" }
      ];

      var btns3 = [
        //{ id : "delete", type : "button", toolTip : Tooltip_UserMarker_Delete, icon : "icon/22/actions/edit-delete", text : "" },
		//{ type : "separator" },
       // { id : "edit", type : "button", toolTip : Tooltip_UserMarker_Edit, icon : "icon/22/actions/edit", text : "" },
      ];

      var btns4 = [
        //{ id : "traffic", type : "button", toolTip : "", icon : "icon/22/actions/edit-find", text : "" }
      ];

      var btns5 = [
        { id : "cache_refresh", type: "check", toolTip : "Cache refresh", icon : "icon/22/actions/view-refresh", text : "" }
      ];

      var btns6 = [
        { id : "map_refresh", type: "button", toolTip : Toolbar_Action_Refresh, icon : "icon/22/actions/view-refresh", text : "" }
      ];

      var c1 = new qx.client.Command();
      c1.addEventListener("execute", function(e) {
                switch(e.getData().__id) {
                     case "register":
                     var register = window.open(map_base + "register.php", "register", "width=800,height=500, menubar=no, scrollbars=yes, resizable=yes");
                     break;
                     case "help":
                     var help = window.open(map_static + "www/help.html", "help", "width=800, height=500, menubar=no, scrollbars=yes, resizable=yes");
                     break;
                     case "about":
                     var about = window.open(map_static + "www/about.html", "about", "width=800, height=500, menubar=no, scrollbars=yes, resizable=yes");
                     break;
                     case "mail":
                     //"mailto:map-support@okarta.ru?subject=''"
                     break;
                }
      });

      var menu = new qx.ui.menu.Menu;

      var register = new qx.ui.menu.Button(Toolbar_Help_Register, null, c1);
      register.__id = "register";

      var sep1 = new qx.ui.menu.Separator();

      var help = new qx.ui.menu.Button(Toolbar_Help_Help, null, c1);
      help.__id = "help";
      var about = new qx.ui.menu.Button(Toolbar_Help_About, null, c1);
      about.__id = "about";

      var mail = new qx.ui.menu.Button(Toolbar_Help_Mail, null, c1);
      mail.__id = "mail";

      menu.add(register, sep1, help, about, mail);
      d.add(menu);

      var btns7 = [
        { id : "help", type: "menu", menu : menu, toolTip : "", icon : "icon/22/actions/help-about", text : "" }
      ];

      var bars = [ btns2, btns1, btns6, btns5, "hs", btns7 ];

      function changeLayout(e) {
        this.setShow(e.getData());
      };

      function changeSize(e) {
        var v = e.getData();
        var o = v == 22 ? 32 : 22;

        this.setIcon(this.getIcon().replace(o, v));
      };

      function buttonExecute() {
               this.debug("Executed: " + this._id);

               switch(this._id) {
                    case "move":
                    GMapAction = MAP_MOVE;
                    SetMapCursor("default");
                    break;

                    case "mapme":
                    break;

                    case "auth":
                    if(GAuthDialog == null)
                                   GAuthDialog = InitAccountDialog();
                    GAuthDialog.open();
                    break;

                    case "zoomin":
                    if(MapData.isLoaded == false) return;
                    MapData.curr_scale_id++;
                    if(MapData.curr_scale_id>MapData.scales.length-1) { MapData.curr_scale_id = MapData.scales.length-1; }
                    SetMapScale(GAbsX, GAbsY, MapData.scales[MapData.curr_scale_id]);
                    break;

                    case "zoomout":
                    if(MapData.isLoaded == false) return;
                    MapData.curr_scale_id--;
                    if(MapData.curr_scale_id<0) { MapData.curr_scale_id=0; }
                    SetMapScale(GAbsX, GAbsY, MapData.scales[MapData.curr_scale_id]);
                    break;

                    case "userinfo":
                    if(GUserDialog == null)
                                   GUserDialog = InitUserDialog();
                    GUserInfo = GetUserInfo(GAuthInfo.elmtUid, GAuthInfo.elmtAccuid);
                    if(GUserInfo != undefined) {
                             if(GUserInfo.elmtResult == 0) {
                                     WidgetSeter(GUserDialog._data_widgets, GUserInfo);
                                     GUserDialog.open();
                             } else
                                 alert("ERROR: mtdGetUserInfo | elmtResult = " + GUserInfo.elmtResult);
                    } else alert("ERROR: mtdGetUserInfo not response");
                    break;

		    case "userblog":
                    var blog = window.open(map_blog_url + "?" + GAuthInfo.elmtUserLogin, "blog", "");
		    break;

		    case "delete":
                    if(MapData.isLoaded == false) return;
		    MyMarkers.delMarker();
		    break;

                    case "edit":
                    if(MapData.isLoaded == false) return;
		    MyMarkers.editMarker();
		    break;

		    case "set":
                    if(MapData.isLoaded == false) return;
		    MyMarkers.setMarker();
		    break;

		    case "link":
                    var link = buildLink();
                    GDebugPort.debug("Link: " + link);

                    var w1 = new qx.client.NativeWindow(link);
                    w1.setShowStatusbar(false);
                    w1.setWidth(640);
                    w1.setHeight(480);
                    w1.setShowLocation(true);
                    w1.open();

		    break;

		    case "cache_refresh":
		    EnableBorder(this.getChecked());
		    if(this.getChecked() == true) {
		           GMapAction = MAP_REFRESH_CACHE;
		           //SetMapCursor("pointer");
                    }
                    else {
                           GMapAction = MAP_MOVE;
		           //SetMapCursor("default");
                    }
		    break;

		    case "map_refresh":
                    if(MapData.isLoaded == false) return;
                    RefreshMap();
		    break;

		    case "open_map":
                    if(GisMapInit == false)
                          mapInit();
                    var map = window.open(map_nav_url, "navmap", "width=520, height=425, menubar=no, scrollbars=no, resizable=yes");
		    map.opener = window;
		    break;

		    case "traffic":

		    var soap_data = [];
                    soap_data["elmtMapUid"] = MapData.map_guid;
                    soap_data["elmtType"] = "traffic";
                    soap_data["elmtGroup"] = "0";
                    soap_data["elmtFlags"] = "*";
                    soap_data["elmtName"] = "*";
                    soap_data["elmtDesc"] = "*";

                    GetRoute(soap_data, true, function(arr) {
                              CanvasRenderer.clearBuffer();
                              Scene.clear();
                              Scene.prevScale = MapData.curr_scale;
                              Scene.scaleK = 1.0;
                              for(var i=0; i<arr.length; i++) {
                                      var path = new Path;
                                      path.points = arr[i].coords;
                                      path.color = arr[i].color;
                                      Scene.paths.push(path);
                              }
                              CanvasRenderer.render();
                    });

		    break;
               }
      };

      var useParts = true;

      for (var j=0; j<bars.length; j++)
      {
          var btns = bars[j];

          if(btns == "hs") {
              tb.add(new qx.ui.basic.HorizontalSpacer);
              continue;
          }

          if (useParts) {
             var tbp = new qx.ui.toolbar.Part;
             if(j == 3)
                  Switcher.addWidget2Sector(Switcher.ADMIN_SECTOR, tbp);
          }

        for (var i=0; i<btns.length; i++)
        {
          var btn = btns[i];

          switch(btn.type)
          {
            case "separator":
              var o = new qx.ui.toolbar.Separator;

              if(btn.id == "userinfo") {
                       Switcher.addWidget2Sector(Switcher.ADMIN_SECTOR, o);
                       Switcher.addWidget2Sector(Switcher.USER_SECTOR, o);
              }
              break;

            case "button":
             var o = new qx.ui.toolbar.Button(null, btn.icon + ".png");
              //o.setIconPosition(btn.icon_pos);
             o._id = btn.id;

             if(btn.toolTip != "")
                      o.setToolTip(new qx.ui.popup.ToolTip(btn.toolTip));

              // beautiful decoupling: toolbar buttons don't know about radio boxes
             d.addEventListener("changeLayout", changeLayout, o);
             d.addEventListener("changeSize", changeSize, o);
             o.addEventListener("execute", buttonExecute);

             if(btn.id == "userinfo" || btn.id == "userblog" || btn.id == "set") {
                       Switcher.addWidget2Sector(Switcher.ADMIN_SECTOR, o);
                       Switcher.addWidget2Sector(Switcher.USER_SECTOR, o);
             }
             break;

             case "check":
             var o = new qx.ui.toolbar.CheckBox(null, btn.icon + ".png", false);
              //o.setIconPosition(btn.icon_pos);
             o._id = btn.id;

             if(btn.toolTip != "")
                      o.setToolTip(new qx.ui.popup.ToolTip(btn.toolTip));

             d.addEventListener("changeLayout", changeLayout, o);
             d.addEventListener("changeSize", changeSize, o);
             o.addEventListener("execute", buttonExecute);
             break;

             case "menu":
             var o = new qx.ui.toolbar.MenuButton(null, btn.menu, btn.icon + ".png");
             break;

          };

          if (useParts)
          {
            tbp.add(o);
          }
          else
          {
            tb.add(o);
          };
        };

        if (useParts) {
          tb.add(tbp);
        };
      };

      dockLayout.addTop(tb);

/*
  InfoBar
*/

    var tf1 = new qx.ui.pageview.tabview.TabView;
    //tf1.set({ left: 2, top: 12, right: 2, bottom: 2 });
    tf1.setBorder(qx.renderer.border.BorderPresets.getInstance().none);

    tf1.setWidth(GPortX);
    //tf1.setHeight("100%");

    var t1_1 = new qx.ui.pageview.tabview.Button(Tab_UserPanel_Find);
    var t1_2 = new qx.ui.pageview.tabview.Button(Tab_UserPanel_Favorites);
    var t1_3 = new qx.ui.pageview.tabview.Button(Tab_UserPanel_MyLabels);
    var t1_4 = new qx.ui.pageview.tabview.Button(Tab_UserPanel_NullMarkers);
    var t1_5 = new qx.ui.pageview.tabview.Button(Tab_UserPanel_Gallery);

    t1_1.setChecked(true);

    tf1.getBar().add(t1_1, t1_2, t1_3, t1_5, t1_4);

    var p1_1 = new qx.ui.pageview.tabview.Page(t1_1);
    var p1_2 = new qx.ui.pageview.tabview.Page(t1_2);
    var p1_3 = new qx.ui.pageview.tabview.Page(t1_3);
    var p1_4 = new qx.ui.pageview.tabview.Page(t1_4);
    var p1_5 = new qx.ui.pageview.tabview.Page(t1_5);
    
    Switcher.addWidget2Sector(Switcher.ADMIN_SECTOR, t1_4);

    tf1.getPane().add(p1_1, p1_2, p1_3, p1_5, p1_4);

	t1_1.addEventListener("click", function() {
		if(GisMapInit == false) return;
		if(GCurrMarkers != MapData.FINDER_MARKERS) {
			GCurrMarkers = MapData.FINDER_MARKERS;
			ScaleLabels();
			RedrawLabels();

                        if(checkOnSelected(find_list) == true) {
                            var item = find_list.getPane().getSelectedItem();
                            if(Gallery.fill(item) == true) {
                                  Gallery.tab.connect();
                            } else {
                                  Gallery.tab.disconnect();
                            }
                        } else
                             Gallery.tab.disconnect();

                        Gallery.visibilityBtns(false);
		}
	});

	t1_2.addEventListener("click", function() {
		if(GisMapInit == false) return;
		if(GCurrMarkers != MapData.FAVORITE_MARKERS) {
			GCurrMarkers = MapData.FAVORITE_MARKERS;
			ScaleLabels();
			RedrawLabels();

                        if(checkOnSelected(Favorites.marker_list) == true) {
                            var item = Favorites.marker_list.getPane().getSelectedItem();
                            if(Gallery.fill(item) == true) {
                                  Gallery.tab.connect();
                            } else {
                                  Gallery.tab.disconnect();
                            }
                        } else
                             Gallery.tab.disconnect();

                        Gallery.visibilityBtns(false);
		}
	});

	t1_3.addEventListener("click", function() {
		if(GisMapInit == false) return;
		if(GCurrMarkers != MapData.USER_MARKERS) {
			GCurrMarkers = MapData.USER_MARKERS;
			ScaleLabels();
			RedrawLabels();

			Gallery.tab.connect();
                        if(checkOnSelected(MyMarkers.marker_list) == true) {
                            var item = MyMarkers.marker_list.getPane().getSelectedItem();
                            Gallery.fill(item);
                            Gallery.visibilityBtns(true);
                        }
		}
	});

	t1_4.addEventListener("click", function() {
		if(GisMapInit == false) return;
		if(GCurrMarkers != MapData.NULL_MARKERS) {
			GCurrMarkers = MapData.NULL_MARKERS;
			ScaleLabels();
			RedrawLabels();
                        Gallery.tab.disconnect();
                        Gallery.visibilityBtns(false);
		}
	});

	t1_5.addEventListener("click", function() {
		if(GisMapInit == false) return;
//		if(GCurrMarkers == MapData.USER_MARKERS) {
//                        Gallery.visibilityBtns(true);
//		}
	});

	t1_5.disconnect();

    dockLayout.addLeft(tf1);

    //GPortX = 250; GPortY = 32;

    var find_field = new qx.ui.form.TextField;
    with(find_field) {
            setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0")); //Presets.getInstance().solid);
            setLocation(2, 30);
            setWidth(150);
            setHeight(20);
            addEventListener("focusin", function(e) {
                    //if(this.getValue() == "Find...")
                    //          this.setValue("");
            });
            addEventListener("keypress", function(e) {
                        //if(this.getValue() == "Find...")
                        //          this.setValue("");
                    
                     /*if(e.getKeyCode() == 13) {
                        if(this.getValue() == "")
                              return;

                        if(GFindInit == false) p1_1.add(find_list);
                        GFindInit = true;

                        var arr = GetNullMarker('*' + this.getValue() + '*', "*");

                        find_list._data.length = 0;
                        for(var i=0; i<arr.length; i++) {
                            find_list._data.push(arr[i]);
                        }
                        find_list.update();
                    }*/
            });

    }
    
    var find_check = new qx.ui.form.CheckBox(Checkbox_Find_All, "find_check", "find_check", true);
    with(find_check)
    {
           setLocation(160, 55);
           setHeight(20);
           setPadding(2, 2);
    }
    
    var finder_max_btn = 0;

    var GFindInit = false;
    var find_btn = new qx.ui.form.Button(Button_Find_Find, map_resource_map + "find.png");
    with(find_btn) {
             setHorizontalChildrenAlign("center");
             setLocation(2, 56);
             setPadding(2, 2);
             setWidth(150);
             setHeight(20);
             setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0"));
             addEventListener("execute", function() {

                     if(find_field.getValue() == "" || finder_max_btn == 0)
                              return;

                     find_btn.setEnabled(false);

                     if(GFindInit == false) {
                            p1_1.add(find_jump_scale, find_list, fav_btn);

                            //if(Switcher.currentSector == Switcher.GUEST_SECTOR) {
                            //     Switcher.addWidget2Sector(Switcher.ADMIN_SECTOR, fav_btn);
                            //     Switcher.addWidget2Sector(Switcher.USER_SECTOR, fav_btn);
                            //}
                     }
                     GFindInit = true;

                     find_list._data.length = 0;

                     var count = 0;
                     
                     if(find_check_settlement.__checked == true) {

                          var soap_data = [];
                          soap_data["elmtSettlement"] = find_field.getValue();

                          GetSettlement(soap_data, true, function(arr) {
                                    for(var i=0; i<arr.length; i++) {
                                           arr[i].elmtType = GAllMaps[arr[i].elmtMapUid + ""].elmtComments;

/*                                           if(MapData.map_guid == arr[i].elmtMapUid)
                                                  arr[i].icon.icon = map_marker_url + "lightviolet.png";
                                           else
                                                  arr[i].icon.icon = map_marker_url + "lightgreen.png";
*/
                                           find_list._data.push(arr[i]);
                                    }

                                    find_list.update();
                                    find_btn.setEnabled(true);
                          });

                          return;
                     }

                     if(find_check_object.__checked == true) {
                          GetNullMarker('*' + find_field.getValue() + '*', "*", true, function(arr) { // Find in null markers.
                                   for(var i=0; i<arr.length; i++) {

                                           find_list._data.push(arr[i]);
                                   }
                                   find_list.update();

                                   count++;
                                   if(count == finder_max_btn)
                                       find_btn.setEnabled(true);
                          });
                     }

                     function FindMarkers(soap_data) {
                              GetMarker(soap_data, true, function(arr) { // Find in user markers.
                                        for(var i=0; i<arr.length; i++) {
                                                arr[i] = SetIconGroup(arr[i]);
                                                arr[i] = SetTextGroup(arr[i]);
                                                find_list._data.push(arr[i]);
                                        }
                                        find_list.update();

                                        count++;
                                        if(count == finder_max_btn)
                                                 find_btn.setEnabled(true);
                              });
                     }

                     if(find_check_user.__checked == true) {
                          var soap_data = [];
                          soap_data["elmtLogin"] = "*" + find_field.getValue() + "*";
                          soap_data["elmtUid"] = "*";
                          soap_data["elmtAname"] = "*";
                          soap_data["elmtMyWords"] = "*";
                          soap_data["elmtInterests"] = "*";

                          GetAllUserInfo(soap_data, true, function(arr) {
                                 if(arr.length == 0) {
                                      count++;
                                      if(count == finder_max_btn)
                                            find_btn.setEnabled(true);
                                      return;
                                 }
                                 soap_data = [];
                                 soap_data["elmtUid"] = arr[0].elmtUid;
                                 soap_data["elmtGroup"] = "*";
                                 soap_data["elmtName"] = "*";
                                 soap_data["elmtComments"] = "*";
                                 soap_data["elmtPicsComments"] = "*";
                                 soap_data["elmtLogicFlag"] = "strong";
                                 FindMarkers(soap_data);
                           });
                     }

                     if(find_check_marker.__checked == true) {
                          var soap_data = [];
                          soap_data["elmtUid"] = "*";
                          soap_data["elmtGroup"] = "*";
                          soap_data["elmtName"] = "*" + find_field.getValue() + "*";

                          if(find_check.getChecked() == true) {
                                 soap_data["elmtLogicFlag"] = "";
                                 soap_data["elmtComments"] = '*' + find_field.getValue() + '*';
                                 soap_data["elmtPicsComments"] = '*' + find_field.getValue() + '*';
                          } else {
                                 soap_data["elmtLogicFlag"] = "strong";
                                 soap_data["elmtComments"] = "*";
                                 soap_data["elmtPicsComments"] = "*";
                          }
                                 
                          FindMarkers(soap_data);
                     }
             });
    }
    
    var fav_btn = new qx.ui.form.Button("", "icon/16/actions/favorite-add.png");
    with(fav_btn) {
             setHorizontalChildrenAlign("center");
             setRight(2);
             setTop(102);
             setPadding(2, 2);
             setWidth(20);
             setHeight(20);
             setToolTip(new qx.ui.popup.ToolTip(Tooltip_Find_Add2Fav));
             addEventListener("execute", function() {

                    var item = find_list.getPane().getSelectedItem();

                    // TODO: Check group on global & null (if global & null then break).
                    if(item.__null == true) return;
                    if(item.__global == true) return;

                    var name = "null"; //find_field.getValue();
                    var uid = item.elmtUid;
                    var gid = item.elmtGroup;

                    // Check on group with current uid:gid.
                    if(MapData.findGroupByUidGid(uid, gid) != false) return;
                 
/*                    var user_info = GetUserInfo(uid);
                    if(user_info.elmtResult == 0) {
                            name = user_info.elmtAname;
                            GDebugPort.debug("User name: " + name);
                    }
*/

                    var soap_data = [];
		      soap_data["elmtUid"] = uid;
                    soap_data["elmtLogin"] = "*";
                    soap_data["elmtAname"] = "*";
                    soap_data["elmtMyWords"] = "*";
                    soap_data["elmtInterests"] = "*";

                    GetAllUserInfo(soap_data, true, function(arr) {
                    		name = arr[0].elmtAname;
                    		GDebugPort.debug("User name: " + name);
                    
				GDebugPort.debug("Favorites add: " + uid + " : " + gid);
                    
                    		Favorites.addUserGroup(name, uid, gid);

                    		if(Switcher.currentSector != Switcher.GUEST_SECTOR) {
                          		// Call SOAP method setUserProfile.
                          		Profile.addFav(MapData.map_guid, uid, gid);
                          		GUserProfile.elmtFavorite = Profile.fav_str;
                          		GDebugPort.debug(GUserProfile.elmtFavorite);

                          		GUserProfile.elmtAccuid = GAuthInfo.elmtAccuid;
                          		SetUserProfile(GUserProfile);
                    		}
                    });
             });
    }

    var find_check_object = new qx.ui.basic.Atom(null, "icon/16/places/www.png");
    with(find_check_object)
    {
           setHorizontalChildrenAlign("center");
           setLocation(160, 30);
           setPadding(2, 2);
           setWidth(20);
           setHeight(20);
           setToolTip(new qx.ui.popup.ToolTip(Tooltip_Find_Object));
           //setIcon("icon/16/places/www.png");
           //setShow("label");
           setBorder(qx.renderer.border.BorderPresets.getInstance().inset);
    }
    
    finder_max_btn++;
    find_check_object.__checked = true;
    find_check_object.addEventListener("click", function(e) {
       this.__checked = !this.__checked;
       if(this.__checked == true) {
           finder_max_btn++;
           this.setBorder(qx.renderer.border.BorderPresets.getInstance().inset);
       } else {
           finder_max_btn--;
           this.setBorder(qx.renderer.border.BorderPresets.getInstance().outset);
       }
    });

    var find_check_marker = new qx.ui.basic.Atom(null, "icon/16/places/services.png");
    with(find_check_marker)
    {
           setHorizontalChildrenAlign("center");
           setLocation(186, 30);
           setPadding(2, 2);
           setWidth(20);
           setHeight(20);
           setToolTip(new qx.ui.popup.ToolTip(Tooltip_Find_Marker));
           setBorder(qx.renderer.border.BorderPresets.getInstance().inset);
    }

    finder_max_btn++;
    find_check_marker.__checked = true;
    find_check_marker.addEventListener("click", function(e) {
       this.__checked = !this.__checked;
       if(this.__checked == true) {
           finder_max_btn++;
           this.setBorder(qx.renderer.border.BorderPresets.getInstance().inset);
       } else {
           finder_max_btn--;
           this.setBorder(qx.renderer.border.BorderPresets.getInstance().outset);
       }
    });

    var find_check_user = new qx.ui.basic.Atom(null, "icon/16/apps/system-users.png");
    with(find_check_user)
    {
           setHorizontalChildrenAlign("center");
           setLocation(212, 30);
           setPadding(2, 2);
           setWidth(20);
           setHeight(20);
           setToolTip(new qx.ui.popup.ToolTip(Tooltip_Find_User));
           setBorder(qx.renderer.border.BorderPresets.getInstance().outset);
    }

    find_check_user.__checked = false;
    find_check_user.addEventListener("click", function(e) {
       this.__checked = !this.__checked;
       if(this.__checked == true) {
           finder_max_btn++;
           this.setBorder(qx.renderer.border.BorderPresets.getInstance().inset);
       } else {
           finder_max_btn--;
           this.setBorder(qx.renderer.border.BorderPresets.getInstance().outset);
       }
    });

    var find_check_settlement = new qx.ui.basic.Atom(null, "icon/16/places/user-home.png");
    with(find_check_settlement)
    {
           setHorizontalChildrenAlign("center");
           setLocation(238, 30);
           setPadding(2, 2);
           setWidth(20);
           setHeight(20);
           setToolTip(new qx.ui.popup.ToolTip(Tooltip_Find_Settlement));
           setBorder(qx.renderer.border.BorderPresets.getInstance().outset);
    }

    find_check_settlement.__checked = false;
    find_check_settlement.addEventListener("click", function(e) {
       this.__checked = !this.__checked;
       if(this.__checked == true) {
           finder_max_btn++;
           this.setBorder(qx.renderer.border.BorderPresets.getInstance().inset);
           find_check_object.setEnabled(false);
           find_check_marker.setEnabled(false);
           find_check_user.setEnabled(false);
       } else {
           finder_max_btn--;
           this.setBorder(qx.renderer.border.BorderPresets.getInstance().outset);
           find_check_object.setEnabled(true);
           find_check_marker.setEnabled(true);
           find_check_user.setEnabled(true);
       }
    });

    var find_jump_scale = new qx.ui.form.CheckBox(Checkbox_Find_JumpScale, "find_jump_scale", "find_jump_scale", true);
    with(find_jump_scale)
    {
           setLocation(2, 102);
           setHeight(20);
           setPadding(0, 4);
    }

    var ld2 = [];

    var lc2 =
    {
        icon            : { label : "", width: 24, type : "iconHtml" },
        elmtName        : { label : ListView_MyLabels_Name, width : 80, type : "text", sortable : true, sortProp : "text" },
        elmtComments    : { label : ListView_MyLabels_Comment, width : 100, type : "text", sortable : true, sortProp : "text" },
        elmtType        : { label : ListView_MyLabels_Group, width : 100, type : "text", sortable : true, sortProp : "text" }
    };

    var find_list = new qx.ui.listview.ListView(ld2, lc2);

    GFindList = find_list;

    find_list.setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0")); //qx.renderer.border.BorderPresets.getInstance().shadow);
    find_list.setBackgroundColor("white");
    find_list.setLocation(0, 124);
    find_list.setRight(0);
    find_list.setBottom(10);
    //find_list.setOverflow("auto");

    find_list._data = ld2;

    find_list.getPane().getManager().addEventListener("changeSelection", function(e) {
           var item = e.getData()[0];
           //var id = GLabelArr.indexOf(item);

           MapData.markers[MapData.FINDER_MARKERS].length = 0;
           MapData.markers[MapData.FINDER_MARKERS].push(item);
           GCurrMarkers = MapData.FINDER_MARKERS;

           if(Gallery.fill(item) == true) {
                 Gallery.tab.connect();
           } else {
                 Gallery.tab.disconnect();
           }

           // Calculate marker`s new position for current scale.
           ScaleLabels();
           RedrawLabels();
    });

    find_list.getPane().getManager().handleDblClick = function(item, e) {

           if(item.elmtMapUid != undefined) {
                 if(item.elmtMapUid != MapData.map_guid) {
                       ResetWidgets(RESET_MARKERS|RESET_GROUP|RESET_NULL|RESET_GALLERY);
                       setMap(GAllMaps[item.elmtMapUid + ""]);
                       var pxc = MapData.Geo2Px(item.lon, item.lat);
                       item.mX = pxc.aX; item.mY = pxc.aY;
                 }
           }

           if(find_jump_scale.getChecked() == true) {

                   var marker_scale = item.elmtFlags;
                   var map_scale = MapData.curr_scale;

                   switch(marker_scale) {
                   case "s5":
                   map_scale = 5;
                   break;
                   case "s10":
                   map_scale = 10;
                   break;
                   case "s20":
                   map_scale = 20;
                   break;
                   case "s50":
                   map_scale = 50;
                   break;
                   case "s100":
                   map_scale = 100;
                   break;
                   }

                   MapData.curr_scale = map_scale;
                   MapData.curr_scale_id = MapData.scales.indexOf(MapData.curr_scale);

                   setMapScaleLin(GScaleLin, MapData.curr_scale);
                   ScaleLabels();
           }

           var ret = MapData.Geo2Px(item.lon, item.lat);
           GAbsX = -ret.aX+GPortWidth/2; GAbsY = -ret.aY+GPortHeight/2;
           SetMapPosition(-GAbsX, -GAbsY, 1);
           ShowInformator(item);
    }
    
      /***********   SOAP!!! *************/
      MapData.classes = GetAllMarkerClass("*");
      /***********   SOAP!!! *************/

    
      var combo_map = new qx.ui.form.ComboBox;
      combo_map.set({ top: 2, left: 2, width: 150 });
      combo_map.setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0"));

      /***********   SOAP!!! *************/ 
      var map_items = GetMapInfo(""); // Call SOAP method.
      /***********   SOAP!!! *************/
      
      for(var i=0; i<map_items.length; i++) {
            GAllMaps.__indices.push(map_items[i].elmtUniqid + "");
            GAllMaps[map_items[i].elmtUniqid + ""] = map_items[i];
            var item = new qx.ui.form.ListItem(map_items[i].elmtName.text);
            item.setValue(map_items[i].elmtUniqid);
            combo_map.add(item);
      }
      combo_map.setSelected(combo_map.getList().getFirstChild());
      
      Switcher.addWidget2Sector(Switcher.ADMIN_SECTOR, combo_map);

    var initBtn = new qx.ui.toolbar.Button(Atom_UserPanel_InitMap); //new qx.ui.basic.Atom(Atom_UserPanel_InitMap);
    with(initBtn) {
             setHorizontalChildrenAlign("center");
             setLocation(160, 2);
             setPadding(4, 4);
             setWidth(100);
             setHeight(20);
             setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0"));
             addEventListener("execute", function() {

                    var map_data = GAllMaps[combo_map.getSelected().getValue() + ""];
                    //if(MapData.map_guid == map_data.elmtUniqid) return;
                    
                    setMap(map_data);
                    
             });
    };
    
    Switcher.addWidget2Sector(Switcher.ADMIN_SECTOR, initBtn);

    p1_1.add(combo_map, initBtn, find_field, find_btn, find_check, find_check_object, find_check_marker, find_check_user, find_check_settlement); //, find_list);

	// **************************** FAVORITES TAB **********************************
	Favorites.init(p1_2);

	// **************************** USER TAB ****************************************
	MyMarkers.init(p1_3);

	// **************************** GALLERY TAB ****************************************

	Gallery.tab = t1_5;
	Gallery.init(p1_5);

	// ******************************************************************************
	// ADMIN MODE NULL MARKERS --->>>

    var label_lt = new qx.ui.basic.Label("Type:");
    with (label_lt)
    {
         setTop(10);
	 setLeft(2);
    }

    var combo_lt = new qx.ui.form.ComboBox;
    combo_lt.set({ top: 5, left: 70, width: 100 });
    combo_lt.setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0"));

    var lt_items = [ "null", "global", "user" ];

    for(var i=0; i<lt_items.length; i++) {
            var item = new qx.ui.form.ListItem(lt_items[i]);
            item.setValue(lt_items[i]);
            combo_lt.add(item);
    }
    combo_lt.setSelected(combo_lt.getList().getFirstChild());

    var label_lc = new qx.ui.basic.Label("Category:");
    with (label_lc)
    {
         setTop(30);
	 setLeft(2);
    }

    var combo_lc = new qx.ui.form.ComboBox;
    combo_lc.set({ top: 30, left: 70, width: 100 });
    combo_lc.setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0"));

    var lc_items = [ "all", "street", "area", "building", "park", "goverment" ];

    for(var i=0; i<lc_items.length; i++) {
            var item = new qx.ui.form.ListItem(lc_items[i]);
            item.setValue(lc_items[i]);
            combo_lc.add(item);
    }
    combo_lc.setSelected(combo_lc.getList().getFirstChild());

    var getnullmarkBtn = new qx.ui.toolbar.Button("Get<br>markers"); //new qx.ui.basic.Atom("Null markers");
    with(getnullmarkBtn) {
             setHorizontalChildrenAlign("center");
             setLocation(180, 3);
             setPadding(4, 4);
             setWidth(90);
             setHeight(50);
             setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0"));
             addEventListener("execute", function() {
                    getnullmarkBtn.setEnabled(false);
		    GetAllNullMarker("*", true, function(arr) { //"street");
                          MapData.markers[MapData.NULL_MARKERS].length = 0;
                          GLabelList._data.length = 0;
                          for(var i=0; i<arr.length; i++) {
                                  MapData.markers[MapData.NULL_MARKERS].push(arr[i]);
                                  GLabelList._data.push(arr[i]);
                          }
                          GLabelList.update();
                          // Redraw markers.
                          if(GCurrMarkers == MapData.NULL_MARKERS)
                               RedrawLabels();
                          getnullmarkBtn.setEnabled(true);
                    });
             });
    };
//    Switcher.addWidget2Sector(Switcher.ADMIN_SECTOR, getnullmarkBtn);
    
    var label_name = new qx.ui.basic.Atom("Name:");
    with(label_name)
    {
        setTop(65);
	setLeft(2);
    }
    var field_name = new qx.ui.form.TextField();
    with(field_name)
    {
        setTop(65);
        setLeft(70);
        setWidth(200);
	setBorder(qx.renderer.border.BorderPresets.getInstance().shadow);
    }
    
    var label_comment = new qx.ui.basic.Atom("Comments:");
    with(label_comment)
    {
        setTop(85);
	setLeft(2);
    }
    var field_comment = new qx.ui.form.TextArea();
    with(field_comment)
    {
        setTop(85);
        setLeft(70);
        setWidth(200);
        setHeight(50);
	setBorder(qx.renderer.border.BorderPresets.getInstance().shadow);
    }
    
    var label_type = new qx.ui.basic.Label("Category:");
    with (label_type)
    {
         	setTop(145);
	 		setLeft(2);
    }

    var combo_type = new qx.ui.form.ComboBox;
    combo_type.set({ top: 143, left: 70, width: 200 });
    combo_type.setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0"));

    var label_items = [ "street", "area", "building", "park", "goverment" ];

    for(var i=0; i<label_items.length; i++) {
            var item = new qx.ui.form.ListItem(label_items[i]);
            item.setValue(label_items[i]);
            combo_type.add(item);
    }
    combo_type.setSelected(combo_type.getList().getFirstChild());

    var applylabelBtn = new qx.ui.toolbar.Button("Apply", null); //new qx.ui.basic.Atom(Atom_UserPanel_RemoveLabel);
    with(applylabelBtn) {
             setHorizontalChildrenAlign("center");
             setLocation(70, 170);
             setTop(170);
             setPadding(4, 4);
             setWidth(100);
             setHeight(28);
             setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0"));
             addEventListener("execute", function() {
                       var item = GLabelList.getPane().getManager().getSelectedItem();
                       item.elmtName.text = field_name.getValue();
                       item.elmtComments.text = field_comment.getValue();
                       item.elmtType.text = combo_type.getSelected().getValue();
                       //alert(combo_type.getSelected());
                       //alert(combo_type.getSelected().value);
                       GLabelList.updateContent();
                       SetNullMarker(item.elmtMid, item.elmtName.text, item.lat, item.lon, item.elmtComments.text, item.elmtType.text);
             });
    }

    p1_4.add(label_lc, combo_lc, label_lt,
               combo_lt, label_name,
               field_name, label_comment, field_comment,
               label_type, combo_type, applylabelBtn);

    var setlabelBtn = new qx.ui.toolbar.Button(null, "icon/22/actions/edit-add.png"); //new qx.ui.basic.Atom(Atom_UserPanel_RemoveLabel);
    with(setlabelBtn) {
             //setLocation(2, 170);
             setRight(2);
             setTop(170);
             setPadding(4, 4);
             setWidth(28);
             setHeight(28);
             setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0"));
             setToolTip(new qx.ui.popup.ToolTip(Tooltip_NullMarker_New));
             addEventListener("execute", function() {
					if(GCurrMarkers != MapData.NULL_MARKERS) {
						GCurrMarkers = MapData.NULL_MARKERS;
						RedrawLabels();
					}

                    GMapAction = MAP_SET_LABEL;
                    SetMapCursor("crosshair");
             });
    }

    var editlabelBtn = new qx.ui.toolbar.Button(null, "icon/22/actions/edit.png"); //new qx.ui.basic.Atom(Atom_UserPanel_RemoveLabel);
    with(editlabelBtn) {
             //setLocation(2, 170);
             setRight(32);
             setTop(170);
             setPadding(4, 4);
             setWidth(28);
             setHeight(28);
             setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0"));
             setToolTip(new qx.ui.popup.ToolTip(Tooltip_NullMarker_Edit));
             addEventListener("execute", function() {

             });
    }

    var removeBtn = new qx.ui.toolbar.Button(null, "icon/22/actions/edit-delete.png"); //new qx.ui.basic.Atom(Atom_UserPanel_RemoveLabel);
    with(removeBtn) {
             setLocation(2, 170);
             setPadding(4, 4);
             setWidth(28);
             setHeight(28);
             setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0"));
             setToolTip(new qx.ui.popup.ToolTip(Tooltip_NullMarker_Delete));
             addEventListener("execute", function() {

                    var item = GLabelList.getPane().getSelectedItem();
                    var lid = GLabelList._data.indexOf(item);
                    if(lid==-1) return;
                    GLabelList._data.splice(lid, 1);
                    GLabelList.update();

                    var lid = MapData.markers[MapData.NULL_MARKERS].indexOf(item);

                    DelNullMarker(MapData.markers[MapData.NULL_MARKERS][lid].elmtMid);

		    if(GCurrMarkers == MapData.NULL_MARKERS)
                    	RemoveLabelByIndex(lid);

                    if(Switcher.currentSector == Switcher.ADMIN_SECTOR) {
                            field_name.setValue("");
                            field_comment.setValue("");
                    }
             });
    };
    
    p1_4.add(getnullmarkBtn, setlabelBtn, editlabelBtn, removeBtn);

    var ld = [];

    var lc =
    {
        icon            : { label : "", width: 24, type : "iconHtml" },
        elmtName        : { label : ListView_MyLabels_Name, width : 80, type : "text", sortable : true, sortProp : "text" },
        elmtComments    : { label : ListView_MyLabels_Comment, width : 100, type : "text", sortable : true, sortProp : "text" },
        elmtType        : { label : ListView_MyLabels_Group, width : 100, type : "text", sortable : true, sortProp : "text" }
    };

    GLabelList = new qx.ui.listview.ListView(ld, lc);
    
    GLabelList.setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0")); //qx.renderer.border.BorderPresets.getInstance().shadow);
    GLabelList.setBackgroundColor("white");
    GLabelList.setLocation(2, 200);
    GLabelList.setRight(2);
    GLabelList.setBottom(10);
    //GLabelList.setOverflow("auto");

    GLabelList._data = ld;

    p1_4.add(GLabelList);

 	GLabelList.getPane().getManager().addEventListener("changeSelection", function(e) {

           var item = e.getData()[0];
           var id = MapData.markers[MapData.NULL_MARKERS].indexOf(item);

           if(Switcher.currentSector == Switcher.ADMIN_SECTOR) {
                 field_name.setValue(MapData.markers[MapData.NULL_MARKERS][id].elmtName.text);
                 field_comment.setValue(MapData.markers[MapData.NULL_MARKERS][id].elmtComments.text);

           }

           for(var i=0; i<GMapCells.length; i++) {
                 for(j=0; j<GMapCells[i]._freeLabels.length; j++) {
                          var label = GMapCells[i]._freeLabels[j];
                          label.setBorder(qx.renderer.border.BorderPresets.getInstance().none);
                          if(label.getVisibility() == true && label._id == id) {
                                label.setBorder(qx.renderer.border.BorderPresets.getInstance().black);
                          }
                 }
           }
    });

    GLabelList.getPane().getManager().handleDblClick = function(item, e) {
           var mX = MapData.markers[MapData.NULL_MARKERS][MapData.markers[MapData.NULL_MARKERS].indexOf(item)].mX;
           var mY = MapData.markers[MapData.NULL_MARKERS][MapData.markers[MapData.NULL_MARKERS].indexOf(item)].mY;
           GAbsX = -mX+GPortWidth/2; GAbsY = -mY+GPortHeight/2;
           SetMapPosition(-GAbsX, -GAbsY, 1);
           //GAbsX=-mX; GAbsY=-mY;
    }
	
    // ADMIN MODE <<<---

    var frame = new qx.ui.layout.CanvasLayout;
//    frame.setLocation(GPortX, GPortY);
//    frame.setWidth("100%");
//    frame.setHeight("100%");
    frame.setBackgroundColor("threedface");
    frame.setBorder(qx.renderer.border.BorderPresets.getInstance().thinOutset);
    frame.setPadding(0);

    // the splitpane itself
    var splitpane = new qx.ui.splitpane.HorizontalSplitPane("0%", "100%");
    splitpane.setShowKnob(false);
    splitpane.setEdge(0);
    splitpane.setSplitterSize(0);
    //splitpane.setMinWidth(200);

    var rightWidget = splitpane.getRightArea();

    GFrame = frame;
    GPortWidget = rightWidget;

//    frame.addEventListener("create", function() {
//          if(GisMapInit == false)
//                mapInit();
//    });

    with(GPortWidget) {
             addEventListener("mousedown", handleMouseDown);
             addEventListener("mousemove", handleMouseMove);
             addEventListener("mouseup", handleMouseUp);
             addEventListener("mousewheel", handleMouseWheel);
    }
    
    frame.add(splitpane);
    dockLayout.add(frame);

    /*
      Preview popup.
    */
    GLabelPopup = new qx.ui.popup.Popup;

/*    GLabelPopupAtom = new qx.ui.basic.Atom("");
    with(GLabelPopupAtom) {
             setBackgroundColor(new qx.renderer.color.Color("#FFFFFF"));
             setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0")); //qx.renderer.border.BorderPresets.getInstance().thinOutset);
             setPadding(10, 12);
             setVisibility(true);
             setSpacing(20);
             addEventListener("click", function() {
                    if(this.__marker.elmtPreview == undefined) return;
                    if(this.__marker.elmtPreview == 0) return;
                    var w1 = new qx.client.NativeWindow(Gallery.imagePath(this.__marker.elmtPid, this.__marker.elmtPreview, false));
                    w1.setShowStatusbar(false);
                    w1.setShowLocation(true);
                    w1.setWidth(640);
                    w1.setHeight(480);
                    w1.open();
             });
    }
    GLabelPopup.add(GLabelPopupAtom);
*/
    var embed_inf = new qx.ui.embed.HtmlEmbed();
    with(embed_inf) {
//             setBackgroundColor(new qx.renderer.color.Color("#FFFFFF"));
//             setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0")); //qx.renderer.border.BorderPresets.getInstance().thinOutset);
//             setPadding(10, 12);
             setVisibility(true);
             addEventListener("click", function() {
                    if(this.__marker.elmtPreview == undefined) return;
                    if(this.__marker.elmtPreview == 0) return;
                    var w1 = new qx.client.NativeWindow(Gallery.imagePath(this.__marker.elmtPid, this.__marker.elmtPreview, false));
                    w1.setShowStatusbar(false);
                    w1.setShowLocation(true);
                    w1.setWidth(640);
                    w1.setHeight(480);
                    w1.open();
             });
    }
    GLabelPopup.add(embed_inf);
    GLabelPopup.__embed_inf = embed_inf;

    /*
      New label popup.
    */
    GPopupNewLabel = new qx.ui.popup.Popup;
    var popupCanvas = new qx.ui.layout.CanvasLayout;
    with(popupCanvas) {
            setBackgroundColor(new qx.renderer.color.Color("#FEF7D0"));
            setBorder(qx.renderer.border.BorderPresets.getInstance().none);
            setWidth(250);
            setHeight(182);
    }
    GPopupNewLabel._caption = new qx.ui.basic.Atom(""); //Popup_NewLabel_Caption);
    with(GPopupNewLabel._caption) {
            setTop(2);
            setLeft(2);
            setWidth(244);
            setBackgroundColor(new qx.renderer.color.Color("#FAF2CB"));
            setPadding(4, 0);
    }
    
    GPopupNewLabel._name_field = new qx.ui.form.TextField;
    with(GPopupNewLabel._name_field) {
            setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0")); //Presets.getInstance().solid);
            setTop(30);
            setWidth(240);
            setLeft(5);
            addEventListener("focusin", function() {
                    if(this.getValue() == Popup_NewLabel_NamePrompt)
                              this.setValue("");
            });
    }

    /*GPopupNewLabel._name_field.addEventListener("focusout", function() {
             //alert((new String(this.getValue())).length);
             if(this.getValue().length == 0)
                     this.setValue(GLabelNamePrompt);
    });*/

    GPopupNewLabel._comment_field = new qx.ui.form.TextArea;
    with(GPopupNewLabel._comment_field) {
             setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0"));
             setTop(50);
             setWidth(240);
             setLeft(5);
             setHeight(100);
             addEventListener("focusin", function() {
                     if(this.getValue() == Popup_NewLabel_CommentPrompt)
                                        this.setValue("");
             });
    }

    GPopupNewLabel._mapme_button = new qx.ui.basic.Atom(Popup_NewLabel_Mapme);
    with(GPopupNewLabel._mapme_button) {
             setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0"));
             setPadding(4, 2);
             setTop(154);
             setLeft(5);
             setWidth(240);
             setCursor("pointer");
    }
    GPopupNewLabel._cancel_button = new qx.ui.basic.Atom(null, map_resource_map + "close.gif");
    with(GPopupNewLabel._cancel_button) {
             setBorder(new qx.renderer.border.Border(1, "solid", "#B0B0B0"));
             setTop(4);
             setLeft(228);
             setWidth(16);
             setHeight(15);
             setCursor("pointer");
    }

    popupCanvas.add(GPopupNewLabel._caption,
                        GPopupNewLabel._name_field,
                        GPopupNewLabel._comment_field,
                        GPopupNewLabel._mapme_button,
                        GPopupNewLabel._cancel_button);
    GPopupNewLabel.add(popupCanvas);
    
    d.add(GLabelPopup, GPopupNewLabel);
    
    GPopupNewLabel.addEventListener("disappear", function() {
            GMapAction = MAP_MOVE;
            if(this._result == 0) this._label.setVisibility(false);
    });
    
    GPopupNewLabel._mapme_button.addEventListener("click", function() {
            //this.setBorder(qx.renderer.border.BorderPresets.getInstance().thinInset);
            var name = GPopupNewLabel._name_field.getValue();
            var comment = GPopupNewLabel._comment_field.getValue();
            var label = GPopupNewLabel._label;
            var mX = GPopupNewLabel._mX;
            var mY = GPopupNewLabel._mY;
            
            var lon = GPopupNewLabel._lon;
            var lat = GPopupNewLabel._lat;
            
            label._id = MapData.markers[GCurrMarkers].length;
            label.setUserData("XPOS", GPopupNewLabel._pX);
            label.setUserData("YPOS", GPopupNewLabel._pY);
            
            // CHECK ON SUB ACTION!!!!!!
			
			var ret;
			var markerIcon = "";
			var markerType = "";
			var soap_data = [];
			
			switch(GCurrMarkers) {
				
				case MapData.NULL_MARKERS:	
				markerIcon = map_resource_map + "nullMarker.png";
				markerType = "street";
				ret = SetNullMarker("", name, lat, lon, comment, markerType);	// DO NOT FORGET UNCOMMENT THIS!!!!!
				break;

				case MapData.USER_MARKERS:
				markerIcon = map_resource_map + "nullMarker.png";
				markerType = "-1";

				soap_data["elmtMid"] = "";
                                soap_data["elmtName"] = name;
                                soap_data["elmtLatitude"] = lat;
                                soap_data["elmtLongitude"] = lon;
                                soap_data["elmtComments"] = comment;
                                soap_data["elmtGroup"] = markerType;
                                soap_data["elmtPreview"] = "";
                                soap_data["elmtPicsNum"] = "";
                                soap_data["elmtFlags"] = ":s" + MapData.curr_scale;
                                soap_data["elmtPicsComments"] = "";

                                ret = SetMarker(soap_data);

				//ret = [];
				//ret.elmtResult = 0;
				//ret.elmtMid = Math.round(Math.random()*10000);

				break;

			}

           label.setIcon(markerIcon);

////////// DO NOT FORGET UNCOMMENT THIS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            if(ret != undefined) {
                   if(ret.elmtResult == 0) {
                        var label = {
                             icon : { icon : markerIcon, iconWidth : 16, iconHeight : 16 }, //{ icon : map_marker_url + "lightviolet.png", iconWidth : 16, iconHeight : 16 },
                             elmtName : {  text : name },
                             elmtComments : { text : comment },
                             elmtType : { text : Label_Group_Replacer["all"] },
                             elmtGroup : markerType,
                             elmtFlags : ":s" + MapData.curr_scale,
                             mX : mX,
                             mY : mY,
                             lon : lon,
                             lat : lat,
                             elmtMid : ret.elmtMid, // DO NOT FORGET UNCOMMENT THIS!!!!!
                             sysType : 1
                        };

						switch(GCurrMarkers) {
							case MapData.NULL_MARKERS:		
                         	                        GLabelList._data.push(label);
                         	                        GLabelList.update();
							break;

							case MapData.USER_MARKERS:
                                                        label.elmtPreview = "";
                                                        label.elmtPicsNum = "";
							label.elmtPicsComments = "";
							label.elmtPid = ret.elmtPid;
							MyMarkers.addMarker2List(label);
							break;
						}

						MapData.markers[GCurrMarkers].push(label);

                        GPopupNewLabel._result = 1;
                   } else alert(Marker_Error); //alert("ERROR: mtdSetMarker | elmtResult = " + ret.elmtResult);
            } else alert("ERROR: mtdSetMarker not response");

            GPopupNewLabel.hide();
    });

    GPopupNewLabel._cancel_button.addEventListener("click", function() {
            GPopupNewLabel._result = 0;
            GPopupNewLabel.hide();
    });

    function handleMouseWheel(e)
    {
             if(e.getWheelDelta()>=1) MapData.curr_scale_id++;
             if(e.getWheelDelta()<=-1) MapData.curr_scale_id--;
             
             if(MapData.curr_scale_id<0) { MapData.curr_scale_id=0; }
             if(MapData.curr_scale_id>MapData.scales.length-1) { MapData.curr_scale_id=MapData.scales.length-1; }

             SetMapScale(GAbsX, GAbsY, MapData.scales[MapData.curr_scale_id]);
    }

    function handleMouseDown(e)
    {
      if(e.isRightButtonPressed() || e.isMiddleButtonPressed()) {
           GMapAction = MAP_MOVE;
           return;
      }

      switch(GMapAction) {

           case MAP_MOVE:
           this.setCapture(true);
           SetMapCursor("move");
           GAbsOffsetX = e.getPageX() - GAbsX;
           GAbsOffsetY = e.getPageY() - GAbsY;
           break;

           case MAP_REFRESH_CACHE:
//           cell.setVisibility(false);
           GenerateCache(e.getPageX(), e.getPageY());
//           cell.setVisibility(true);
           break;

           case MAP_SET_LABEL:
           SetMapCursor("crosshair");
           break;
           
           default:
           break;
      }
    }

    function handleMouseMove(e)
    {

           if(MapData.isLoaded == true && this.getCapture() == false)
                        statusBar.setLabel(Atom_StatusBar_GeoCoord +
                                   MapData.Px2Geo(e.getPageX()-GPortX-GAbsX, e.getPageY()-GPortY-GAbsY).str);

          switch(GMapAction) {
           case MAP_MOVE:
           if (this.getCapture())
           {
              GAbsX = e.getPageX() - GAbsOffsetX;
              GAbsY = e.getPageY() - GAbsOffsetY;
              SetMapPosition(-GAbsX, -GAbsY, 0);
              //statusBar.setLabel("GAbsX: " + GAbsX + "  GAbsY: " + GAbsY);
           }
           break;

           case MAP_SET_LABEL:
           break;
           
           default:
           break;
      }
    }

    function handleMouseUp(e)
    {
        switch(GMapAction) {
             case MAP_MOVE:
             this.setCapture(false);
             break;
        
             case MAP_SET_LABEL:
             UserSetLabel(Math.random()*10000, e.getPageX(), e.getPageY());
             break;
             
             default:
             break;
        }

        //GMapAction = MAP_IDLE;
        SetMapCursor("default");
    }
    
/*
Status Bar
*/

    var statusBar = new qx.ui.basic.Atom(":-)");
    statusBar.setWidth(null);
    statusBar.setHeight(24);
    statusBar.setBorder(qx.renderer.border.BorderPresets.getInstance().thinOutset);
    statusBar.setHorizontalChildrenAlign("left");
    statusBar.setPadding(2, 4);
    statusBar.setBackgroundColor("threedface");
    dockLayout.addBottom(statusBar);
}

function SetMapScale(mX, mY, scale) {
    if(MapData.curr_scale==scale) return;
          GLabelPopup.hide();
          setMapScaleLin(GScaleLin, scale);
             
          GDebugPort.debug("Old left top X = " + mX + "   Old left top Y = " + mY);

          mX -= GPortWidth/2;
          mY -= GPortHeight/2;

          GDebugPort.debug("Old center X = " + mX + "   Old center Y = " + mY);

          var kX = mX/(MapData.curr_scale*GCellWidth);
          var kY = mY/(MapData.curr_scale*GCellHeight);
          GAbsX = parseInt(scale*kX*GCellWidth);
          GAbsY = parseInt(scale*kY*GCellHeight);
             
          GDebugPort.debug("New center X = " + GAbsX + "   New center Y = " + GAbsY);

          GAbsX += GPortWidth/2;
          GAbsY += GPortHeight/2;

          GDebugPort.debug("New left top X = " + GAbsX + "   New left top Y = " + GAbsY);

          MapData.curr_scale = scale;

          ScaleLabels();

          SetMapPosition(-GAbsX, -GAbsY, 1);
}

function ScaleLabels() {
        if(GCurrMarkers != MapData.FINDER_MARKERS)
              if(MapData.markers[GCurrMarkers].scale == MapData.curr_scale) return;
                    MapData.markers[GCurrMarkers].scale = MapData.curr_scale;

	for(var i=0; i<MapData.markers[GCurrMarkers].length; i++) {
                // SCALE ALL MARKERS!!!!
                var ret = MapData.Geo2Px(MapData.markers[GCurrMarkers][i].lon, MapData.markers[GCurrMarkers][i].lat);
                MapData.markers[GCurrMarkers][i].mX = ret.aX;
                MapData.markers[GCurrMarkers][i].mY = ret.aY;
	}
}

function transposeMatrix(mat, dx, dy) {
             var tmp = new Array;
             var count = 0;
             for(var i=0; i<dx; i++)
                     for(var j=0; j<dy; j++)
                             tmp[count++] = mat[i+j*dx];
             delete mat;
             return tmp;
}
    
function Flag2String(fl) {
             var str = "";
             if(fl & DIR_WEST) str+="WEST | ";
             if(fl & DIR_EAST) str+="EAST | ";
             if(fl & DIR_NORTH) str+="NORTH | ";
             if(fl & DIR_SOUTH) str+="SOUTH | ";
             return str;
}

function SetMapPosition(mX, mY, refresh) { // In pixels.
             var posX, posY, nposX, nposY, cellX, cellY, cid, flag=0, tmp;

             posX = parseInt(mX/GCellWidth);
             posY = parseInt(mY/GCellHeight);
             cellX = posX*GCellWidth-mX;
             cellY = posY*GCellHeight-mY;

             GCellX = cellX; GCellY = cellY;

             if(GOldPosX < posX) flag |= DIR_WEST;
             if(GOldPosX > posX) flag |= DIR_EAST;
             if(GOldPosY < posY) flag |= DIR_NORTH;
             if(GOldPosY > posY) flag |= DIR_SOUTH;

             if(flag>0 && refresh==0) {
                        if(flag & DIR_WEST) {
                                 nposX = GMapCells[GCellOnX-1].getUserData("XPOS") + 1; cid=0;
                                 for(var i=0; i<GCellOnY; i++) {
                                         GMapCells[cid].setUserData("XPOS", nposX);
                                         SetLabelOnCell(GMapCells[cid]);
                                         //GMapCells[cid].setLabel(nposX + ", " + GMapCells[cid].getUserData("YPOS"));
                                         setMapCell(GMapCells[cid], MapData.map_guid, nposX, GMapCells[cid].getUserData("YPOS"), MapData.curr_scale, GMapFlag);
                                         tmp = GMapCells[cid];
                                         GMapCells.splice(cid, 1);
                                         GMapCells.splice(cid+GCellOnX-1, 0, tmp);
                                         cid += GCellOnX;
                                 }
                        }
                        if(flag & DIR_EAST) {
                                 nposX = GMapCells[0].getUserData("XPOS") - 1;
                                 for(var i=0; i<GCellOnY; i++) {
                                         cid = i*GCellOnX+GCellOnX-1;
                                         GMapCells[cid].setUserData("XPOS", nposX);
                                         SetLabelOnCell(GMapCells[cid]);
                                         //GMapCells[cid].setLabel(nposX + ", " + GMapCells[cid].getUserData("YPOS"));
                                         setMapCell(GMapCells[cid], MapData.map_guid, nposX, GMapCells[cid].getUserData("YPOS"), MapData.curr_scale, GMapFlag);
                                         tmp = GMapCells[cid];
                                         GMapCells.splice(cid, 1);
                                         GMapCells.splice(i*GCellOnX, 0, tmp);
                                 }
                        }
                        if(flag & DIR_NORTH) {
                                 GMapCells = transposeMatrix(GMapCells, GCellOnX, GCellOnY);
                                 nposY = GMapCells[GCellOnY-1].getUserData("YPOS") + 1; cid=0;
                                 for(var i=0; i<GCellOnX; i++) {
                                         GMapCells[cid].setUserData("YPOS", nposY);
                                         SetLabelOnCell(GMapCells[cid]);
                                         //GMapCells[cid].setLabel(GMapCells[cid].getUserData("XPOS") + ", " + nposY);
                                         setMapCell(GMapCells[cid], MapData.map_guid, GMapCells[cid].getUserData("XPOS"), nposY, MapData.curr_scale, GMapFlag);
                                         tmp = GMapCells[cid];
                                         GMapCells.splice(cid, 1);
                                         GMapCells.splice(cid+GCellOnY-1, 0, tmp);
                                         cid += GCellOnY;
                                 }
                                 GMapCells = transposeMatrix(GMapCells, GCellOnY, GCellOnX);
                        }
                        if(flag & DIR_SOUTH) {
                                 GMapCells = transposeMatrix(GMapCells, GCellOnX, GCellOnY);
                                 nposY = GMapCells[0].getUserData("YPOS") - 1;
                                 for(var i=0; i<GCellOnX; i++) {
                                         cid = i*GCellOnY+GCellOnY-1;
                                         GMapCells[cid].setUserData("YPOS", nposY);
                                         SetLabelOnCell(GMapCells[cid]);
                                         //GMapCells[cid].setLabel(GMapCells[cid].getUserData("XPOS") + ", " + nposY);
                                         setMapCell(GMapCells[cid], MapData.map_guid, GMapCells[cid].getUserData("XPOS"), nposY, MapData.curr_scale, GMapFlag);
                                         tmp = GMapCells[cid];
                                         GMapCells.splice(cid, 1);
                                         GMapCells.splice(i*GCellOnY, 0, tmp);
                                 }
                                 GMapCells = transposeMatrix(GMapCells, GCellOnY, GCellOnX);
                        }
                        
                        var xp1 = GMapCells[0].getUserData("XPOS");
                        var yp1 = GMapCells[0].getUserData("YPOS");
                        
                        var xp2 = GMapCells[GMapCells.length-1].getUserData("XPOS");
                        var yp2 = GMapCells[GMapCells.length-1].getUserData("YPOS");

                        for(var i=xp1-1; i<xp2+1; i++) {
                                preloadingMapCell(null, MapData.map_guid, i, yp1-1, MapData.curr_scale, GMapFlag);
                                preloadingMapCell(null, MapData.map_guid, i, yp1+1, MapData.curr_scale, GMapFlag);
                        }
                        for(var i=yp1; i<yp2; i++) {
                                preloadingMapCell(null, MapData.map_guid, xp1-1, i, MapData.curr_scale, GMapFlag);
                                preloadingMapCell(null, MapData.map_guid, xp2+1, i, MapData.curr_scale, GMapFlag);
                        }
             }
             var cX, cY=cellY, pX, pY=posY, labels;
             
             if(refresh==0) {
                           for(var j=0; j<GCellOnY; j++) {
                                   cX = cellX;
                                   for(var i=0; i<GCellOnX; i++) {
                                           cid = j*GCellOnX+i;
                                           GMapCells[cid].setLeft(cX);
                                           GMapCells[cid].setTop(cY);
                                           cX+=GCellWidth;
                                   }
                                   cY+=GCellHeight;
                           }
             } else {
                           GOldAbsX = mX; GOldAbsY = mY;
                           for(var j=0; j<GCellOnY; j++) {
                                   cX = cellX; pX = posX;
                                   for(var i=0; i<GCellOnX; i++) {
                                           cid = j*GCellOnX+i;
                                           GMapCells[cid].setLeft(cX);
                                           GMapCells[cid].setTop(cY);
                                           GMapCells[cid].setUserData("XPOS", pX);
                                           GMapCells[cid].setUserData("YPOS", pY);
                                           setMapCell(GMapCells[cid], MapData.map_guid, pX, pY, MapData.curr_scale, GMapFlag);
                                           //SetLabelOnCell(GMapCells[cid]);
                                           cX+=GCellWidth; pX++;
                                   }
                                   cY+=GCellHeight; pY++;
                           }
                           
                           var xp1 = GMapCells[0].getUserData("XPOS");
                           var yp1 = GMapCells[0].getUserData("YPOS");

                           var xp2 = GMapCells[GMapCells.length-1].getUserData("XPOS");
                           var yp2 = GMapCells[GMapCells.length-1].getUserData("YPOS");

                           for(var i=xp1-1; i<xp2+1; i++) {
                                preloadingMapCell(null, MapData.map_guid, i, yp1-1, MapData.curr_scale, GMapFlag);
                                preloadingMapCell(null, MapData.map_guid, i, yp1+1, MapData.curr_scale, GMapFlag);
                           }
                           for(var i=yp1; i<yp2; i++) {
                                preloadingMapCell(null, MapData.map_guid, xp1-1, i, MapData.curr_scale, GMapFlag);
                                preloadingMapCell(null, MapData.map_guid, xp2+1, i, MapData.curr_scale, GMapFlag);
                           }

                           RedrawLabels();
             }

             //statusBar.setLabel("STAT: " + Flag2String(flag));
             GOldPosX = posX; GOldPosY = posY;
             GOldAbsX = mX; GOldAbsY = mY;
}

function SetMapCursor(cursor) {
    //GPortWidget.setCursor(cursor);
    for(var i=0; i<GCellOnX*GCellOnY; i++)
		GMapCells[i].setCursor(cursor);
}

function CreateCells(widget) {

        if(GMapCells.length > 0) {
              for(var i=0; i<GMapCells.length; i++) {
                      widget.remove(GMapCells[i]);
              }
              GMapCells.length = 0;
         }

         preloader_cell.setSource(map_cell_loading);
         
         GCellOnX = Math.ceil((GPortWidth+2*GBufferZone)/GCellWidth) + 1;
         GCellOnY = Math.ceil((GPortHeight+2*GBufferZone)/GCellHeight) + 1;

         GStartX = parseInt(GAbsX/GCellWidth);
         GStartY = parseInt(GAbsY/GCellHeight);

         var cellId=0;
         for(var j=0; j<GCellOnY; j++)
                 for(var i=0; i<GCellOnX; i++) {
                        var oneCell = new qx.ui.layout.CanvasLayout;
                        oneCell.setUserData("ID", cellId);
                        oneCell.setUserData("XPOS", GStartX+i);
                        oneCell.setUserData("YPOS", GStartY+j);

                        oneCell.setLocation(i*GCellWidth-GAbsX, j*GCellHeight-GAbsY);
                        oneCell.setWidth(GCellWidth);
                        oneCell.setHeight(GCellHeight);
                        oneCell.setZIndex(0);

                        oneCell._rnd = Math.random();
                        
                        oneCell._img = new qx.ui.basic.Image(null);
                        with(oneCell._img) {
                               setWidth(GCellWidth);
                               setHeight(GCellHeight);
                               setResizeToInner(true);
                               //setBorder(qx.renderer.border.BorderPresets.getInstance().thinOutset);
                               setZIndex(10);
                        }

                        oneCell.add(oneCell._img);

                        //setMapCell(oneCell, MapData.map_guid, GStartX+i, GStartY+j, MapData.curr_scale, GMapFlag);

                        oneCell._freeLabels = new Array;
                        // Precreate free labels.
                        for(var k=0; k<5; k++)
                                   CreateLabel(oneCell);

                        //SetLabelOnCell(oneCell);

                        //oneCell.setCursor("default");
                        GMapCells.push(oneCell);
                        widget.add(oneCell);
                        cellId++;
                 }


}