/*
 * map.js - Base class for building Google Map API APPs
 * 2006 KAYAC Corporation.
 */

if (! Photon ) var Photon = {};
Photon.Map = {};
Photon.Map.Base = Class.create();
Photon.Map.Base.prototype = {
  initialize : function(lat, lng, zoom) {
    this.lat     = parseFloat(lat);
    this.lng     = parseFloat(lng);
    this.zoom    = parseInt(zoom);
    this.markers = [];
    if (arguments.length != 0) {
      this.renderMap();
      this.addEvents();
    }
  },
  renderMap: function() {
    var gmap = new GMap2($("gmap"));
    //gmap.addControl(new GLargeMapControl());
    //gmap.addControl(new GMapTypeControl());
    gmap.setCenter(new GLatLng(this.lat, this.lng), this.zoom);
    this.gmap = gmap;
  },
  getCenter : function() {
    var point = this.gmap.getCenter();
    return $H({lat: point.lat(), lng: point.lng(), zoom: this.zoom});
  },
  setCenter : function(lat, lng, zoom) {
    this.lat  = parseFloat(lat);
    this.lng  = parseFloat(lng);
    if (!!zoom) {
      this.zoom = parseInt(zoom);
    }
    this.gmap.setCenter(new GLatLng(this.lat, this.lng), this.zoom);
  },
  addPin : function(marker) {
    this.gmap.addOverlay(marker.createIcon());
    this.markers.push(marker);
    return this.markers.length;
  },
  removePin : function(pin_id) {
    pin_id = pin_id - 1;
    var pin = this.markers[pin_id];
    this.markers = this.markers.delete_at(pin_id);
    this.gmap.removeOverlay(pin.gmarker);
  },
  getPin : function(pin_id) {
    pin_id = pin_id - 1;
    return this.markers[pin_id];
  },
  addSmallControll : function() {
    this.gmap.addControl(new GSmallMapControl());
  },
  addLargeControll : function() {
    this.gmap.addControl(new GLargeMapControl());
  },
  addEvents : function() {
    GEvent.addListener(this.gmap, 'click', function(overlay, point) {
      this.clickEvent(overlay, point);
    }.bind(this));
    GEvent.addListener(this.gmap, 'move', function() {
      this.moveEvent();
    }.bind(this));
    GEvent.addListener(this.gmap, 'moveend', function() {
      this.lat = this.gmap.getCenter().lat();
      this.lng = this.gmap.getCenter().lng();
      this.moveendEvent();
    }.bind(this));
    GEvent.addListener(this.gmap, 'zoomend', function(old_zoom, new_zoom) {
      this.zoom = new_zoom;
      this.zoomEvent(old_zoom, new_zoom);
    }.bind(this));
  },
  // Events
  clickEvent : function(overlay, point) {
    // redefine here
  },
  moveEvent : function() {
    // redefine here
  },
 moveendEvent : function() {
    // redefine here
  },
  zoomEvent : function(old_zoom, new_zoom) {
    // redefine here
  },
  setOversea : function() {
    this.gmap.setCenter(new GLatLng('48.875357', '2.29507'), 4);
  },
  setJapan : function() {
    this.gmap.setCenter(new GLatLng('35.681361', '139.766082'), 4);
  }
}

Photon.Map.Assign = Class.create();
Photon.Map.Assign.prototype = Object.extend(new Photon.Map.Base, {
  initialize : function() {
    Photon.Map.Base.prototype.initialize.apply(this, arguments);
    this.pin_id = undefined;
  },
  clickEvent : function(overlay, point) {
    var lat = point.lat();
    var lng = point.lng();
    //if (this.pin_id) {
    //  this.getPin(this.pin_id).setPoint(lat, lng);
    //} else {
    //  this.pin_id = this.addPin(new Photon.Map.Marker(lat, lng));
    //}
    assign_pin(lat, lng);
  },
  clearPin : function() {
    this.gmap.removeOverlay(this.pin.gmarker);
    this.pin = undefined;
    clear_pin();
  }
});

Photon.Map.Marker = Class.create();
Photon.Map.Marker.prototype = {
  initialize : function(lat, lng, html, options) {
    var icon  = new GIcon();
    this.point = new GLatLng(parseFloat(lat), parseFloat(lng));
    this.html  = html || undefined;
    // Default Icon Image
    icon.image            = "http://photon.st/img/map/pin.png";
    icon.shadow           = "http://photon.st/img/map/shadow.png";
    icon.iconSize         = new GSize(29, 35);
    icon.shadowSize       = new GSize(45, 35);
    icon.iconAnchor       = new GPoint(15, 35);
    icon.infoWindowAnchor = new GPoint(15, 1);
    this.icon  = icon;
    this.icon  = (options) ? ( (options.icon) ? options.icon : icon ) : icon;
  },
  createIcon : function( options ) {
    this.gmarker = new GMarker(this.point, this.icon);
    GEvent.addListener(this.gmarker, "click", function() {
      //this.gmarker.openInfoWindowHtml(this.html);
      if (window._clickPinEvent) {
         _clickPinEvent(this.html);
      }
    }.bind(this));
    return this.gmarker;
  },
  setPoint : function(lat, lng) {
    var point = new GLatLng(parseFloat(lat), parseFloat(lng));
    this.gmarker.setPoint(point);
  },
  getPoint : function() {
    var point = this.gmarker.getPoint();
    return $H({lat: point.lat(), lng: point.lng()});
  }
};


/* extention of prototype.js */
Object.extend(Array.prototype, {
  delete_at : function(at) {
    var results = [];
    this.each(function(value, index) {
      if (at != index)
        results.push(value);
    });
    return results;
  }
});

//Event.observe( window, 'unload', function(){ GUnload(); }, false); // dont know why but causes err on ie when enabled

function overlayGMap_show(){
	var el = $('grayoverlay');
	if( el ){
		el.style.display          ='block';
		$('mapboxo').style.display='block';
		return;
	}
	var aSSize = bp_common.getScrollSize();
	var elOverlay = document.createElement('div');
	elOverlay.id='grayoverlay';
	document.body.appendChild(elOverlay);
	elOverlay.style.position='absolute';
	elOverlay.style.top     ="0px";
	elOverlay.style.left    ="0px";
	elOverlay.style.zIndex  =1000;
	elOverlay.innerHTML = "<img id='black50' src='/img/common/black50.png' width='100%' height='"+parseInt(aSSize[1])+"px' />";
	if( (navigator.userAgent.indexOf('MSIE') != -1) && (!window.opera) ){
	    $('black50').src = "/img/common/dummy.gif";
	    $('black50').runtimeStyle.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="/img/common/black50.png", sizingMethod="scale")';
	}

	el = document.createElement('div');
	el.id='mapboxo';
	el.style.position ='absolute';
	el.style.top      ="0px";
	el.style.left     ="0px";
	el.style.zIndex   =1001;
	document.body.appendChild(el);
	var elMapo = document.createElement('div');
	elMapo.id = 'mapo';
	el.appendChild(elMapo);
	var elClose = document.createElement('div');
	elClose.innerHTML = '<div id="imageDataContainero" class="clearfix"><div id="imageDatao"><div id="bottomNavo"><a id="bottomNavCloseo" href="javascript:void(0);"><img src="img/lightbox/closelabel.gif"/></a></div></div></div>';
	el.appendChild(elClose);

	var elMapmargino = document.createElement('div');
	elMapmargino.id = 'mapmargino';
	elMapo.appendChild(elMapmargino);
	el = document.createElement('div');
	el.id = 'gmapo';
	elMapmargino.appendChild(el);
	setTimeout( overlayGMap_render, 0 );
}

var mousepos;
var gmapo;
function overlayGMap_render(){
	overlayGMap_update();
	gmapo = new GMap2($('gmapo'));
	gmapo.setCenter( new GLatLng(35,135),8 );
	gmapo.addControl( new GLargeMapControl() );
	gmapo.addControl( new GScaleControl() );
	gmapo.addControl( new GMapTypeControl() );
	gmapo.addControl( new GOverviewMapControl() );
	gmapo.enableContinuousZoom();
	new GKeyboardHandler(gmapo);
	bp_common.addListener("DisplayArea","change",overlayGMap_update,false);
	if( navigator.userAgent.match( "MSIE" ) ){
		$("gmapo").attachEvent( "onmousewheel" , overlayGMap_mouseWheelZoom );
	}else if( navigator.userAgent.match( "Gecko" ) ){
		$("gmapo").addEventListener( "DOMMouseScroll" , overlayGMap_mouseWheelZoom , false );
	}else if( navigator.userAgent.match( "Safari" ) ){
		$("gmapo").onmousewheel = overlayGMap_mouseWheelZoom;
	}
	GEvent.addListener( gmapo, "mousemove", function(p){
		mousepos = p;
	});
	_gmap.markers.each( function(m){
		var gm = m.gmarker;
		var p = gm.getPoint();
		var marker = new GMarker( p, {icon: m.icon});
		GEvent.addListener( marker, "click", function(){
			_clickPinEvent( m.html );
		});
		gmapo.addOverlay( marker );
	});
	if( _gmap.markers.length==0 ){
	}else if( _gmap.markers.length==1 ){
		gmapo.setCenter( _gmap.markers[0].gmarker.getPoint(), 14 );
	}else{
		var gb;
		for( i=0; i<_gmap.markers.length; i++ ){
			var marker = _gmap.markers[i].gmarker;
			if( i==0 ){
				gb = new GLatLngBounds( marker.getPoint(), marker.getPoint() );
			}
			var p = marker.getPoint();
			gb.extend( p );
		}
		var c = gb.getCenter();
		var z = gmapo.getBoundsZoomLevel( gb );
		gmapo.setCenter( c, z );
	}
	setTimeout( function(){
		Event.observe( $('bottomNavCloseo'),'click', overlayGMap_hide, false );
	}, 0);
}

function overlayGMap_update(){
	var gmapsize = [900,300];
	var closebtnheight = 50;
	var tbmargin = 20;
	var padding  = 10;
	var aWSize = bp_common.getWindowSize();
	var aSSize = bp_common.getScrollSize();
	var aSPos  = bp_common.getScrollPosition();
	gmapsize[1] = (aWSize[1]-tbmargin*2-closebtnheight>gmapsize[1]) ? aWSize[1]-tbmargin*2-closebtnheight : gmapsize[1];
	var offset = [];
	offset[0] = parseInt(( aWSize[0] - gmapsize[0] ) /2);
	offset[1] = parseInt(( aWSize[1] - gmapsize[1] - closebtnheight ) /2);

	var elOverlay = $('grayoverlay');
	elOverlay.style.width   ="100%";
	elOverlay.style.height  =parseInt(aSSize[1])+"px";
	elOverlay.style.top     ="0px";
	elOverlay.style.left    ="0px";

	var el = $('mapboxo');
	el.style.top      =parseInt(aSPos[1]+offset[1])+'px';
	el.style.left     =parseInt(aSPos[0]+offset[0])+'px';
	el.style.width    =(gmapsize[0]+padding*2)+'px';

	el = $('mapmargino');
	el.style.height   =(gmapsize[1]+padding*2)+'px';

	el = $('gmapo');
	el.style.top      = padding+'px';
	el.style.left     = padding+'px';
	el.style.width    = gmapsize[0]+'px';
	el.style.height   = gmapsize[1]+'px';
}

function overlayGMap_hide(){
	$('mapboxo').style.display    ='none';
	$('grayoverlay').style.display='none';
}

function overlayGMap_mouseWheelZoom(event){
	var delta;
	if( navigator.userAgent.match( "MSIE" ) ){
		delta = event.wheelDelta; event.returnValue = false; }
	else if( navigator.userAgent.match( "Gecko" ) ){
		delta = event.detail * -1; event.preventDefault(); }
	else if( navigator.userAgent.match( "Safari" ) ){
		delta = event.wheelDelta; event.returnValue = false; }
	var zoom = gmapo.getZoom();
	delta = ( delta < 0 ) ? -1 : 1;
	zoom = ( zoom+delta < 0 ) ? 0 :
				( (zoom+delta >= 19) ? 19 : (zoom+delta) );
	gmapo.setCenter( mousepos, zoom );
}

var bp_server = ".";
var bp_common_server = bp_server;
var bp_common = function(){
	// locals
	var VERSION = 20070323;
	var eleCancel = null;
	var eleCancelImg = bp_common_server+"img/btn_off_b.gif";
	var eleCancelSize = [192,41];
	var aWindowSize = [];
	var aScrollSize = [];
	var aScrollPosition = [];
	var aWindowSizeLast = [];
	var aScrollSizeLast = [];
	var aScrollPositionLast = [];
	var effectCancelAppear = null;
	var effectCancelDisapear = null;
	// return null if not found
	// whole page size, including hidden area by scroll bars
	var calcScrollSize = function(){
		//return [document.documentElement.scrollWidth,document.documentElement.scrollHeight];
		return [document.body.scrollWidth,document.body.scrollHeight];
	};
	// visible area size, without hidden area by scroll bars
	var calcWindowSize = function(){
		//var width =  ((window.khtml||window.opera) ? window.innerWidth	: (document.documentElement.clientWidth ||document.body.clientWidth));
		//var height = ((window.khtml||window.opera) ? window.innerHeight : (document.documentElement.clientHeight||document.body.clientHeight));
		//var windowWidth, windowHeight;
		var width = (window.innerWidth) ? window.innerWidth :
						(document.documentElement && document.documentElement.clientWidth) ? document.documentElement.clientWidth : document.body.clientWidth;
		var height= (window.innerHeight) ? window.innerHeight :
						(document.documentElement && document.documentElement.clientHeight) ? document.documentElement.clientHeight : document.body.clientHeight;
		return [width,height];
	};
	var calcScrollPosition = function(){
		var arr = [];
		arr[0] = document.body.scrollLeft || document.documentElement.scrollLeft;
		arr[1] = document.body.scrollTop || document.documentElement.scrollTop;
		return arr;
	};
	var checkDisplay = function(t){
		aWindowSizeLast = aWindowSize;
		aScrollSizeLast = aScrollSize;
		aScrollPositionLast = aScrollPosition;
		aWindowSize = calcWindowSize();
		aScrollSize = calcScrollSize();
		aScrollPosition = calcScrollPosition();
		if( t!="FIRST" &&
			 ( aWindowSize[0]			!=aWindowSizeLast[0]
			|| aWindowSize[1]			!=aWindowSizeLast[1]
			|| aScrollSize[0]			!=aScrollSizeLast[0]
			|| aScrollSize[1]			!=aScrollSizeLast[1]
			|| aScrollPosition[0]	!=aScrollPositionLast[0]
			|| aScrollPosition[1]	!=aScrollPositionLast[1] ) ){
			fireEvents("DisplayArea","change");
		}
	};
	var fireEvents = function(element, name){
		if( !listeners[element] ){ return; }
		if( !listeners[element][name] ){ return; }
		var len=listeners[element][name].length;
		for( var i=0; i<len; i++ ){
			if( !listeners[element][name][i] ){ continue; }
			listeners[element][name][i]();
		}
	};
	var listeners = {};

	//var cache={};

	// constructor funcs

	// globals
	return {
		gEleCancel : null,
		load : function(){
			checkDisplay("FIRST");
			bp_Interval.set(checkDisplay.bpc_bind(this),30);
		},
		getWindowSize : function(){
			if( !aWindowSize || aWindowSize.length==0 ){ checkDisplay(); }
			return aWindowSize;
		},
		getScrollSize : function(){
			if( !aScrollSize || aScrollSize.length==0 ){ checkDisplay(); }
			var ret=[];
			ret[0] = (aWindowSize[0]>aScrollSize[0]) ? aWindowSize[0] : aScrollSize[0];
			ret[1] = (aWindowSize[1]>aScrollSize[1]) ? aWindowSize[1] : aScrollSize[1];
			return ret;
		},
		getScrollPosition : function(){
			if( !aScrollPosition || aScrollPosition.length==0 ){ checkDisplay(); }
			return aScrollPosition;
		},
		// usage: bp_common.addListener( window, 'load', bp_common.load, false );
		addListener: function(element, name, observer, useCapture){
			if( !element ){ return; }
			if( element=="DisplayArea" && name=="change" ){
				if( !listeners[element] ){
					listeners[element] = new Object();
				}
				if( !listeners[element][name] ){
					listeners[element][name] = new Array();
				}
				listeners[element][name].push(observer);
				return;
			}
			if (element.addEventListener) {
				element.addEventListener(name, observer, useCapture);
			} else if (element.attachEvent) {
				element.attachEvent('on' + name, observer);
			}
		},
		removeListener: function( element, name, observer, useCapture ){
			if( element=="DisplayArea" && name=="change" ){
				if( !listeners[element] ){ return; }
				if( !listeners[element][name] ){ return; }
				var len = listeners[element][name].length;
				for( var i=0; i<len; i++ ){
					if( listeners[element][name][i]==observer ){
						listeners[element][name][i]=null;
					}
				}
			}
			if (element.removeEventListener) {
				element.removeEventListener(name, observer, useCapture);
			} else if (element.detachEvent) {
				element.detachEvent('on' + name, observer);
			}
		}
	}
}();


Array.prototype.bpc_each = function(iterator){
	var results = new Array();
	for (var i = 0; i < this.length; i++){
		results.push( iterator(this[i],i) );
	}
	return results;
}
Array.prototype.bpc_filter = function(iterator){
	var results = new Array();
	this.bpc_each( function(v){
		if( iterator(v) ){
			results.push(v);
		}
	});
	return results;
}
Function.prototype.bpc_bind = function(object) {
	var __method = this;
	var __object = object;
	var __arguments = arguments;
	for( var index = 0; index < __arguments.length-1; ++index )
		__arguments[index] = __arguments[index+1];
	__arguments.length = __arguments.length-1;
	return function(){ __method.apply(__object, __arguments); }
}


var bp_Interval_interval = 10;
var bp_Interval_timer = null;
var bp_Interval_tid = 0;
var bp_Interval_procs = 0;
var bp_Interval_proc = {};
var bp_Interval_countInit = {};
var bp_Interval_count = {};
var bp_Interval_loop = function(){
	for( var i in bp_Interval_proc ){
		bp_Interval_count[i]--;
		if( bp_Interval_count[i]==0 ){
			bp_Interval_count[i] = bp_Interval_countInit[i];
			bp_Interval_proc[i]();
		}
	}
}
var bp_Interval = function(){
	return{
		// t:[ms]
		set : function( func, t ){
			bp_Interval_tid++;
			bp_Interval_procs++;
			if(typeof func == 'string'){ func = new Function(func); }
			bp_Interval_proc[bp_Interval_tid] = func;
			bp_Interval_countInit[bp_Interval_tid] = parseInt(t/10);
			bp_Interval_count[bp_Interval_tid] = bp_Interval_countInit[bp_Interval_tid];
			if( !bp_Interval_timer ){
				bp_Interval_timer = setInterval(bp_Interval_loop,10);
			}
			return bp_Interval_tid;
		},
		del : function( timerid ){
			if( bp_Interval_proc[timerid] ){
				bp_Interval_proc[timerid]=undefined;
				bp_Interval_countInit[timerid]=undefined;
				bp_Interval_count[timerid]=undefined;
				bp_Interval_procs--;
			}
			if( bp_Interval_procs==0 ){
				clearInterval(bp_Interval_timer);
				bp_Interval_timer=null;
			}
		}
	}
}();

bp_common.addListener( window, 'load', bp_common.load, false );
