
var map;
var kibanwms;
var rapidwms;
var tokyo5000wms;
var pnwms;
var mnwms;
var anwms;

var resource = {
  'tokyo5000' : function() {
	  return Rococo.lang == 'en' ?
		'Tokyo 5000' :
		'東京 5千分1';
	},
  'rapid' : function() {
      return Rococo.lang == 'en' ?
        'Rapid Survey Map' :
        '迅速測図';
    },
  'kiban' : function() {
      return Rococo.lang == 'en' ?
        'Fundamental Geospatial Data' :
        '基盤地図情報';
    },
  'pmname' : function() {
      return Rococo.lang == 'en' ?
        'Prefecture/Municipality Name' :
        '都道府県・市区町村名';
    },
  'pmnamelayers' : function() {
      return Rococo.lang == 'en' ?
        'PrefRoman,MncplRoman' :
        'PrefName,MncplName' ;
    },
  'aname' : function() {
      return Rococo.lang == 'en' ?
        'Section Name' :
        '字・町丁目名';
    },
  'pn' : function() {
      return Rococo.lang == 'en' ?
        'Place Name' :
        '地名';
    },
  't_tokyo5000' : function() {
	  return Rococo.lang == 'en' ?
		'Tokyo 5000 transparency' :
		'東京 5千分1 透明度';
	},
  't_rapid' : function() {
      return Rococo.lang == 'en' ?
        'Rapid Survey Map transparency' :
        '迅速測図 透明度';
    },
  't_kiban' : function() {
      return Rococo.lang == 'en' ?
        'Fundamental Geospatial Data transparency' :
        '基盤地図 透明度';
    },
  'full_transparent': function() {
      return Rococo.lang == 'en' ?
        'Invisible' :
        '透明';
    },
  'full_opaque': function() {
      return Rococo.lang == 'en' ?
        'Opaque' :
        '不透明';
    },
  'nudge' : function() {
      return Rococo.lang == 'en' ?
        'Nudging (Experimental)' :
        '揺らし (試験)';
    },
  'nudge_not_in_dragging_mode' : function() {
      return Rococo.lang == 'en' ?
        'Press Ctrl to nudge the map with dragging.' :
        'Ctrlキーを押すとドラッグで揺らせます';
    },
  'nudge_in_dragging_mode' : function() {
      return Rococo.lang == 'en' ?
        'Drag the map to nudge.' :
        'ドラッグすると揺らせます';
    },

  'habs' : function() {
      return Rococo.lang == 'en' ?
        'Historical Agro-Environment Browsing System' :
        '歴史的農業環境閲覧システム';
    },
  'hawms' : function() {
      return Rococo.lang == 'en' ?
        'Historical Agro-Environment Web Map Service' :
        '歴史的農業環境WMS配信サービス';
    },
  'pnwms' : function() {
      return Rococo.lang == 'en' ?
        'Place Name Web Map Service' :
        '地名WMS配信サービス';
    },
  'kibanwms' : function() {
      return Rococo.lang == 'en' ?
        'Fundamental Geospatial Data (Approval: GYOU-SHI 449 2008)' :
        '基盤地図情報(平20業使、第449号)';
    }
};


function init() {
// ************************************************************************************

OpenLayers.Control.Keyboard = OpenLayers.Class(OpenLayers.Control, {
  autoActivate: true,
  slideFactor: 75,
  draw: function() {
    this.handler = new OpenLayers.Handler.Keyboard( this, {
      "keydown": this.onKeyDown,
      "keyup": this.onKeyUp
    });
  },
  onKeyDown: function(evt){},
  onKeyUp: function(evt){}
});

OpenLayers.Control.DragPan.prototype.draw = function() {
    if(this.enableKinetic) {
      var config = {interval: this.kineticInterval};
      if(typeof this.enableKinetic === "object") {
        config = OpenLayers.Util.extend(config, this.enableKinetic);
      }
      this.kinetic = new OpenLayers.Kinetic(config);
    }
    this.handler = new OpenLayers.Handler.Drag(this, {
        "move": this.exPanMap,
        "done": this.exPanMapDone,
        "down": this.exPanMapStart
      }, {
        interval: this.interval,
        documentDrag: this.documentDrag
      }
    );
  };
OpenLayers.Control.DragPan.prototype.exPanMap = function(xy) {
      var ret = false;
      if( this.localPanMapDone != null ) {
        ret = this.localPanMap(xy);
      }
      if( ret == false ) {
        this.panMap(xy);
      }
    };
OpenLayers.Control.DragPan.prototype.exPanMapDone = function(xy) {
      var ret = false;
      if( this.localPanMapDone != null ) {
        ret = this.localPanMapDone(xy);
      }
      if( ret == false ) {
        this.panMapDone(xy);
      }
    };
OpenLayers.Control.DragPan.prototype.exPanMapStart = function() {
      var ret = false;
      if( this.localPanMapStart != null ) {
        ret = this.localPanMapStart();
      }
      if( ret == false ) {
        this.panMapStart();
      }
    };

OpenLayers.Control.DragPan.prototype.localPanMap = panMap;
OpenLayers.Control.DragPan.prototype.localPanMapDone = panMapDone;
OpenLayers.Control.DragPan.prototype.localPanMapStart = panMapStart;

// ************************************************************************************

  var controlKeyboard = new OpenLayers.Control.Keyboard();
  controlKeyboard.onKeyDown = function(evt) {
    if( evt == null ) {
      return;
    }
    if( evt.keyCode != 17 ) {
      return;
    }
    switchNudge(true);
  };

  controlKeyboard.onKeyUp = function(evt) {
    if( evt == null ) {
      return;
    }
    if( evt.keyCode != 17 ) {
      return;
    }
    switchNudge(false);
  };


  var controlNavigation = new OpenLayers.Control.Navigation();

  var options = {
      projection: new OpenLayers.Projection("EPSG:900913"),
      maxResolution:156543.0339,
      maxExtent: new OpenLayers.Bounds(-20037508.3427892,-20037508.3427892,20037508.3427892,20037508.3427892),
	  units: "m",
      controls: [
          new OpenLayers.Control.PanZoomBar(),
          new OpenLayers.Control.LayerSwitcher(),
          new OpenLayers.Control.Permalink(),
          new OpenLayers.Control.Attribution({displayClass: 'prmtcd'}),
	  controlKeyboard,
          controlNavigation
        ],
      numZoomLevels: 18,
      displayProjection: new OpenLayers.Projection("EPSG:4326")
    }
  map = new OpenLayers.Map('map',options);
  map.div.style.backgroundColor = 'rgb(255,255,255)';




  tokyo5000wms = new OpenLayers.Layer.TMS(
      resource.tokyo5000(),
      "http://www.finds.jp/ws/tms/",
      {
        layername: "Tokyo5000-900913",
        type: "png",
        attribution: '<a target="_blank" href="../wsdocs/hawms/index.html.ja">'+resource.hawms()+'</a>',
        isBaseLayer: true
      }
    );

  rapidwms = new OpenLayers.Layer.TMS(
      resource.rapid(),
      "http://www.finds.jp/ws/tms/",
      {
        layername: "Kanto_Rapid-900913",
        type: "png",
        attribution: '<a target="_blank" href="../wsdocs/hawms/index.html.ja">'+resource.hawms()+'</a>',
        isBaseLayer: true
      }
    );

  kibanwms = new OpenLayers.Layer.WMS.Untiled(
	  resource.kiban(),
	  "http://www.finds.jp/ws/kiban25000wms.cgi?",
	  {
	    layers: "JpSmplBdr,PrefSmplBdr,AdmAreaBdr,Cntr10,Cntr100,Cntr100w,RailCL,BldA,WL,RdEdg",
	    styles: "medium,medium,thick,medium,thick,medium,medium,thin,medium,medium",
	    format: "image/png",
	    transparent: true
	  },
	  {
	    ratio: 1,
	    attribution: '<a target="_blank" href="http://www.finds.jp/wsdocs/kibanwms/index.html">'+resource.kibanwms()+'</a>',
	    isBaseLayer: false
	  }
	);

  pnwms = new OpenLayers.Layer.TMS(
      resource.pn(),
      "http://www.finds.jp/ws/tmc/",
      {
        layername: "pntms-900913",
        type: "png",
        attribution: '<a target="_blank" href="../wsdocs/hawms/index.html.ja">'+resource.pnwms()+'</a>',
        isBaseLayer: false
      }
    );

/*
  mnwms = new OpenLayers.Layer.WMS.Untiled(
	  resource.pmname(),
	  "http://www.finds.jp/ws/pnwms.cgi?",
	  {
	    layers: resource.pmnamelayers(),
	    styles: "largeborder,mediumborder",
	    format: "image/png"
	  },
	  {
	    ratio: 1,
	    isBaseLayer: false
	  }
	);

  anwms = new OpenLayers.Layer.WMS.Untiled(
	  resource.aname(),
	  "http://www.finds.jp/ws/pnwms.cgi?",
	  {
	    layers: "AzaName",
	    styles: "smallborder",
	    format: "image/png"
	  },
	  {
	    ratio: 1,
	    isBaseLayer: false
	  }
	);
*/

  map.addLayers([rapidwms,tokyo5000wms,kibanwms,pnwms]);

  if( !map.getCenter() ) {
    var lonlat = new OpenLayers.LonLat(139.7704, 35.68721);
    lonlat.transform(map.displayProjection,map.getProjectionObject());
    map.setCenter(lonlat, 15);
  }

  // ----
  // opacity form
  // ----
  var opacitywrap = document.getElementById('opacitywrap');
  var opacityform = document.createElement('form');
  opacityform.action='javascript:void(0)';

  var rapidopacitypara = document.createElement('p');
  rapidopacitypara.appendChild(document.createTextNode(resource.t_rapid()+' '));
  var rapidopacityselect = document.createElement('select');
  rapidopacitypara.appendChild(rapidopacityselect);
  opacityform.appendChild(rapidopacitypara);

  var kibanopacitypara = document.createElement('p');
  kibanopacitypara.appendChild(document.createTextNode(resource.t_kiban()+' '));
  var kibanopacityselect = document.createElement('select');
  kibanopacitypara.appendChild(kibanopacityselect);
  opacityform.appendChild(kibanopacitypara);

  opacitywrap.appendChild(opacityform);

  var opacitylist = [
	  {text:resource.full_transparent(),value:0},
	  {text:'25%',value:25},
	  {text:'50%',value:50},
	  {text:'75%',value:75},
	  {text:resource.full_opaque(),value:100}
	];

  Rococo.tk.em.recreateElement(rapidopacityselect,null,'rapidopacity',
	{
      name: 'rapidopacity',
	  list: opacitylist,
	  value: 100
	});
  rapidopacityselect.addEventHandler('change',setRapidOpacity);

  Rococo.tk.em.recreateElement(kibanopacityselect,null,'kibanopacity',
	{
      name: 'kibanopacity',
	  list: opacitylist,
	  value: 100
	});
  kibanopacityselect.addEventHandler('change',setKibanOpacity);
  setRapidOpacity();
  setKibanOpacity();

  // ----
  // nudge form
  // ----
  var nudgewrap = document.getElementById('nudgewrap');
  var nudgetitle = document.createElement('p');
  nudgetitle.style.margin = '0.25em 0 0 0';
  nudgetitle.appendChild(document.createTextNode(resource.nudge()));
  nudgewrap.appendChild(nudgetitle);

  var nudgeform = document.createElement('form');
  nudgeform.action = 'javascript:void(0)';
  nudgewrap.appendChild(nudgeform);

  var e_nudge_x = document.createElement('div');
  e_nudge_x.style.padding = '0 0 2px 0';
  e_nudge_x.appendChild(document.createTextNode('X: '));
  nudgeform.appendChild(e_nudge_x);

  var e_nudge_xm = document.createElement('a');
  e_nudge_xm.href = 'javascript:nudgerel("x",-1)';
  mklikebutton(e_nudge_xm);
  e_nudge_xm.appendChild(document.createTextNode('<'));

  var e_nudge_xv = document.createElement('input');
  e_nudge_xv.type = 'text';
  e_nudge_xv.id = 'nudgex';
  e_nudge_xv.value = '0';
  e_nudge_xv.size = '2';

  var e_nudge_xp = document.createElement('a');
  e_nudge_xp.href = 'javascript:nudgerel("x",1)';
  mklikebutton(e_nudge_xp);
  e_nudge_xp.appendChild(document.createTextNode('>'));

  var e_nudge_xc = document.createElement('a');
  e_nudge_xc.href = 'javascript:nudgeabs("x",0)';
  mklikebutton(e_nudge_xc);
  e_nudge_xc.appendChild(document.createTextNode('C'));

  e_nudge_x.appendChild(e_nudge_xm);
  e_nudge_x.appendChild(e_nudge_xv);
  e_nudge_x.appendChild(e_nudge_xp);
  e_nudge_x.appendChild(e_nudge_xc);

  var e_nudge_y = document.createElement('div');
  e_nudge_y.appendChild(document.createTextNode('Y: '));
  e_nudge_y.style.padding = '2px 0 0 0';
  nudgeform.appendChild(e_nudge_y);

  var e_nudge_ym = document.createElement('a');
  e_nudge_ym.appendChild(document.createTextNode('<'));
  mklikebutton(e_nudge_ym);
  e_nudge_ym.href = 'javascript:nudgerel("y",-1)';

  var e_nudge_yv = document.createElement('input');
  e_nudge_yv.type = 'text';
  e_nudge_yv.id = 'nudgey';
  e_nudge_yv.value = '0';
  e_nudge_yv.size = '2';

  var e_nudge_yp = document.createElement('a');
  e_nudge_yp.href = 'javascript:nudgerel("y",1)';
  mklikebutton(e_nudge_yp);
  e_nudge_yp.appendChild(document.createTextNode('>'));

  var e_nudge_yc = document.createElement('a');
  e_nudge_yc.href = 'javascript:nudgeabs("y",0)';
  mklikebutton(e_nudge_yc);
  e_nudge_yc.appendChild(document.createTextNode('C'));

  e_nudge_y.appendChild(e_nudge_ym);
  e_nudge_y.appendChild(e_nudge_yv);
  e_nudge_y.appendChild(e_nudge_yp);
  e_nudge_y.appendChild(e_nudge_yc);

  e_nudge_message = document.createElement('p');
  e_nudge_message.id = 'nudgemessage';
  e_nudge_message.style.margin = '0.125em 0 0.125em 0';
  nudgewrap.appendChild(e_nudge_message);

  switchNudge(false);
}

function mklikebutton(e) {
  e.style.padding = '0.125em 0.25em 0.125em 0.5em';
  e.style.textDecoration = 'none';
  e.style.background = 'rgb(204,204,204)';
  e.style.margin = '0 0.5em 0 0.5em';

}

// -------- pan 横取り
function panMap(xy) {
  if( nudgeEnabled == false ) {
    return false;
  }
  if( nudgeLatest == null ) {
    nudgeLatest = {'x': xy.x , 'y': xy.y };
  }
  else {
    var dx = xy.x - nudgeLatest.x;
    var dy = xy.y - nudgeLatest.y;
    if( dx != 0 || dy != 0 ) {
      nudgerel('x', dx);
      nudgerel('y', dy);
    }
    nudgeLatest.x = xy.x;
    nudgeLatest.y = xy.y;
  }
}

function panMapDone(xy) {
  nudgeLatest = null;
  if( nudgeEnabled == false ) {
    return false;
  }
}

function panMapStart() {
  return false;
}
// -------- pan 横取り

// -------- nudge
var nudge = {x: 0, y:0};
var nudgeLatest = null;
var nudgeEnabled = false;

function switchNudge(enabled) {
  nudgeEnabled = enabled;
  var e = document.getElementById('nudgemessage');
  if( nudgeEnabled ) {
    e.innerHTML = resource.nudge_in_dragging_mode();
  }
  else {
    e.innerHTML = resource.nudge_not_in_dragging_mode();
    nudgeLatest = null;
  }
}

function nudgerel(axis, diff) {
  if( axis != 'x' && axis != 'y' ) {
    return;
  }
  nudge[axis] += diff;
  nudge_map();
}

function nudgeabs(axis, v) {
  if( axis != 'x' && axis != 'y' ) {
    return;
  }
  nudge[axis] = 0;
  nudge_map();
}

function nudge_map() {
  document.getElementById('nudgex').value = nudge['x'];
  document.getElementById('nudgey').value = nudge['y'];

  rapidwms.div.style.left = nudge['x'] + 'px';
  rapidwms.div.style.top = nudge['y'] + 'px';
  tokyo5000wms.div.style.left = nudge['x'] + 'px';
  tokyo5000wms.div.style.top = nudge['y'] + 'px';
}
// -------- nudge

function setRapidOpacity() {
  var e = document.getElementById('rapidopacity');
  var val = e.getValue();
  if( val >= 0 && val <= 100 ) {
    rapidwms.setOpacity(val/100);
    tokyo5000wms.setOpacity(val/100);
  }
}

function setKibanOpacity() {
  var e = document.getElementById('kibanopacity');
  var val = e.getValue();
  if( val >= 0 && val <= 100 ) {
    var vis = val > 0;
    kibanwms.setOpacity(val/100);
    kibanwms.setVisibility(vis);
  }
}

Rococo.init.push(init);

// -------- Android
function init_android() {
  if( Rococo.and.isAndroid() ) {
    var div = map.div;
    div.style.position = 'absolute';
    div.style.left = "0";
    div.style.right = "0";
    div.style.top = "0";
    div.style.bottom = "90px";
    div.style.height = "auto";
    div.style.margin = "0";
    div.style.padding = "0";

    var opacitywrap = document.getElementById("opacitywrap");
    opacitywrap.style.position = 'absolute';
    opacitywrap.style.left = "0";
    opacitywrap.style.bottom = '0';
    opacitywrap.style.width = '100%';
    opacitywrap.style.background = '#ffffff';
    opacitywrap.style.fontSize = '18px';
    opacitywrap.style.zIndex = '0';

    map.updateSize();
    var e = map.layerContainerDiv;
    if( e != null && e.addEventListener != null ) {
      Rococo.ola.recreateElement(e);
    }


    Rococo.and.appendLocationButton(
	  opacitywrap,
	  function(position) {
		  if( position != null ) {
		    Rococo.ola.changeLocation(map, position.longitude, position.latitude);
		  }
		},
	  function(mess) {
		  alert(mess);
		}
	);
  }
}

Rococo.init.push(init_android);


