function Twitter(mapObject)
{
	this.mapObject = mapObject;
	this.infoWindow = null;
	this.init.apply(this, arguments);
	this.m = [];
}

Twitter.prototype =
{
	init : function()
	{

	} ,

	cal_length : function(x1, y1, x2, y2)
	{
        _x1 = x1 * Math.PI / 180.0;
        _y1 = y1 * Math.PI / 180.0;
        _x2 = x2 * Math.PI / 180.0;
        _y2 = y2 * Math.PI / 180.0;

        _A = 6378137; // 地球の赤道半径(6378137m)
        _x = _A * (_x2 - _x1) * Math.cos(_y1);
        _y = _A * (_y2 - _y1);

        L = Math.sqrt(_x * _x + _y * _y); // メートル単位の距離
        //c = Math.atan(_y / _x) *180.0/ Math.PI;	// 方角　東：0(0度)，北：1/2π(90度)，西：π(180度)，南：3/2π(270度)

		var km = L / 1000

		if(km < 1) {
			km = 1;
		}
		return km;
	} ,

	addMarker : function(poi)
	{
		var self = this;

		var shadowImage = new google.maps.MarkerImage("./img/kage.png");
		shadowImage.size = new google.maps.Size(79, 34);
		shadowImage.origin = new google.maps.Point(0, 0);
		shadowImage.anchor = new google.maps.Point(16, 34);

        var latlng = new google.maps.LatLng(poi.lat, poi.lng);
        //マーカーを作成
        var marker = new google.maps.Marker({
            map: this.mapObject,
            position: latlng
            ,icon : new google.maps.MarkerImage("./img/twitter.gif")
            ,shadow : shadowImage
        });

        marker.title = poi.id;

        google.maps.event.addListener(marker, "click", function(){

            if (self.infoWindow)
                self.infoWindow.close();
            self.infoWindow = new google.maps.InfoWindow({
                content: self.makeShowHtml(poi)
            });
            self.infoWindow.open(self.mapObject, marker);
        });

        //マーカーのインスタンスを配列に記憶
        self.m[self.m.length] = marker;
	} ,

	makeShowHtml : function(poi)
	{
		var html = [];

		var d = poi.created_at.split(' ');
		// 投稿日時変換 "Tue, 10 Aug 2010 04:49:56 +0000" -> "Aug 10, 2010 13:49:56"
		var date = new Date(d[2] + ' ' + d[1] + ', ' + d[3] + " " + d[4]);
		date.setHours(date.getHours() + 9); // UTC -> JST (+9時間)
		var mon  = date.getMonth() + 1;     // 月取得
		var day  = date.getDate();          // 日取得
		var year = date.getFullYear();
		var hours = date.getHours();
		var minutes = date.getMinutes();
		var secs = date.getSeconds();

		var text = poi.text.replace(/(https?:\/\/[-a-z0-9._~:\/?#@!$&amp;amp;amp;\'()*+,;=%]+)/ig,'<a href="$1" target="_blank">$1</a>').replace(/@+([_A-Za-z0-9-]+)/ig,'<a href="http://twitter.com/$1" target="_blank">@$1</a>').replace(/#+([_A-Za-z0-9-]+)/ig,'<a href="http://search.twitter.com/search?q=$1" target="_blank">#$1</a>');

        html[html.length] = '<div id="twitter_marker_container">'
        html[html.length] = '<div id="description">';
        html[html.length] = '<img src="' + poi.profile_image_url + '">';
        html[html.length] = '<p class="content" style="text-align: left">' + text + '</p>';
        html[html.length] = '<strong class="line"><a href="http://twitter.com/' + poi.from_user + '" target="_blank" style="text-decoration: underline">' + poi.from_user + '</a></strong>';
        html[html.length] = '<p id="modified' + poi.id + '" style="text-align: right;margin:0;padding:0;">更新日時 : ' + year + '/' + mon + '/' + day + ' ' + hours + ':' + minutes + ':' + secs + '</p>';
        html[html.length] = '<input type="hidden" value="' + poi.id + '" id="id_val" />';
        html[html.length] = '<p style="text-align: right;font-size: 10px;margin:0;padding:0;">位置情報付きのツイートを表示しています</p>';
        html[html.length] = '</div>';
        html[html.length] = '</div>';

        return html.join('');
	} ,

	setToMap : function()
	{
		var self = this;

		var mapObject = this.mapObject;

		var bounds = mapObject.getBounds();
		var center = mapObject.getCenter();
		var northEast = bounds.getNorthEast();
		var southWest = bounds.getSouthWest();
		var lat = center.lat();
		var lng = center.lng();

		//2点間の距離
		var kMeter = this.cal_length(lat, lng, northEast.lat(), northEast.lng());

		new $.ajax({
		    "type": "get",
		    "url": "http://search.twitter.com/search.json",
		    "data": {
		        'rpp': 200,
		        'geocode': lat + ',' + lng + ',' + kMeter + 'km'
		    },
		    dataType: 'jsonp',
		    "async": true,
		    "cache": false,
		    "success": function(jsonData)
		    {

				for ( var i = self.m.length - 1; i > -1; i-- )
				{
					if ( self.m[i] != null )
					{
						google.maps.event.clearInstanceListeners(self.m[i]);
						self.m[i].setMap(null);
						self.m[i] = null;
						delete self.m[i];
					}
				}
				self.m = [];

				var bounds = mapObject.getBounds();
				var center = mapObject.getCenter();
				var f
				 = bounds.getNorthEast();
				var southWest = bounds.getSouthWest();
				var lat = center.lat();
				var lng = center.lng();

		        var pois = jsonData.results;
		        var loc = "";
		        var locs = [];
		        var _cnt = 0;
				var _loc_count = 0;
				for ( var i = 0, len = pois.length; i < len; i++ )
				{
		            var poi = pois[i];
		            var loc = (poi.location).replace("UT: ", "").replace("iPhone: ", "");
		            locs = loc.split(",");
		            _cnt = locs.length;
		            if (_cnt >= 2) {
						if ( isNaN(locs[locs.length - 2]) != true && isNaN(locs.length - 1) != true )
						{
							if ( locs[locs.length - 2] <= northEast.lat() && locs[locs.length - 2] >= southWest.lat()
							  && locs[locs.length - 1] <= northEast.lng() && locs[locs.length - 1] >= southWest.lng() )
							{
				                poi.lat = locs[0];
				                poi.lng = locs[1];
				                self.addMarker(poi);
				                _loc_count++;
							}
						}
		            }
		            else {
		            }
				}
				$('#twitter-count').text(_loc_count);
		    },
		    "error": function(){
		        alert("error");
		    }
		});

	}

};

