var LogTwit = function(id){
	function UB(){
		var self = this;
		this.PastTime = 0;
		this.EnableFlag = 0;

		// Inner Size Data
		this.InnerSizeChangeLog = new Array();
		this.LastInnerSize = {};
		this.LastInnerSize.width = 0;
		this.LastInnerSize.height = 0;
		// Scroll Bar Data
		this.ScrollBarPositionChangeLog = new Array();
		this.LastScrollBarPosition = {};
		this.LastScrollBarPosition.top = 0;
		this.LastScrollBarPosition.left = 0;
		//	Mouse Position each 100msec
		this.LastMousePosition = {};
		this.LastMousePosition.x = 0;
		this.LastMousePosition.y = 0;
		//	Mouse Position every move
		this.MousePositionChangeLog = new Array();
		this.MousePosition = {};
		this.MousePosition.x = 0;
		this.MousePosition.y = 0;
		//	Mouse down
		this.MouseDownChangeLog = new Array();
		this.LastMouseDownTime;
		//	Mouse up
		this.MouseUpChangeLog = new Array();
		this.LastMouseUpTime;
		//	Mouse click
		this.MouseClickLog = new Array();
		this.LastMouseClickTime;

		
		this.Enable = function(){
			this.EnableFlag = 1;
		}
		this.Disable = function(){
			this.EnableFlag = 0;
		}

		// Get Inner Size
		this.GetInnerSize = function(PastTime,ErrorMargin){
			var data = {};
			// For Safari
			if(jQuery.browser.safari){
				data.w = window.innerWidth
				data.h = window.innerHeight;
			// IE & Firefox				
			}else if(jQuery.browser.msie || jQuery.browser.mozilla){
				if(document.compatMode == "CSS1Compat"){
					data.w = document.documentElement.clientWidth;
					data.h = document.documentElement.clientHeight;
				}else{
					data.w = document.body.clientWidth;
					data.h = document.body.clientHeight
				}	
			// Opera
			}else if(jQuery.browser.opera){
				if(document.compatMode == "CSS1Compat"){
					if(document.body.clientWidth){
						data.w = document.body.clientWidth;
						data.h = document.body.clientHeight
					}else{
						data.w = document.documentElement.clientWidth;
						data.h = document.documentElement.clientHeight;
					}
				}else{
					data.w = document.body.clientWidth;
					data.h = document.body.clientHeight
				}
			// Others 		
			}else{
				data.w = document.body.clientWidth;
				data.h = document.body.clientHeight
			}

		// if value was change
			if(Math.abs(this.LastInnerSize.width - data.w) > ErrorMargin ||
				Math.abs(this.LastInnerSize.height - data.h) > ErrorMargin ){
				data.t = PastTime;
				this.InnerSizeChangeLog.push(data);
				this.LastInnerSize.width = data.w;
				this.LastInnerSize.height = data.h;
			}
//			alert(data.width + " " + data.height)
		}
		
		// Get Window Scroll Value
		this.GetScrollbarPosition = function(PastTime,ErrorMargin){
			var data = {};
			if(document.documentElement.scrollLeft >= document.body.scrollLeft){
				data.l = document.documentElement.scrollLeft;
			}else{
				data.l= document.body.scrollLeft;
			}
			if(document.documentElement.scrollTop >= document.body.scrollTop){
				data.tp = document.documentElement.scrollTop;
			}else{
				data.tp = document.body.scrollTop;
			}
		
			// Write data
			if ((Math.abs(this.LastScrollBarPosition.top - data.tp) > ErrorMargin ||
				Math.abs(this.LastScrollBarPosition.left - data.l) > ErrorMargin) ||
				PastTime==0) {
				data.t = PastTime;
				this.ScrollBarPositionChangeLog.push(data);
				this.LastScrollBarPosition.top = data.tp;
				this.LastScrollBarPosition.left	= data.l;
			}
		}
		// Set Mouse Position
		this.SetMousePosition = function(e){
			this.MousePosition.x = e.pageX;
			this.MousePosition.y = e.pageY;
		}

		this.stop;
		this.sleft;
		this.smouseflag = 0;
		this.GetMouseFlag = 0
		// Get Mouse Position
		this.GetMousePosition = function(PastTime,ErrorMargin){
			if(this.GetMouseFlag == 1){
				return 0
			}else{
				this.GetMouseFlag = 1;
			}
			var data = {};
			var flag =0;
		// Get Mouse position.
			if(this.MousePosition.x && this.MousePosition.y){
				data.x = this.MousePosition.x;
				data.y = this.MousePosition.y;
				data.t = PastTime;
			}else{
				this.GetMouseFlag = 0;
				return 0;
			}
		// Calc diff
			var kyori = Math.sqrt(Math.pow(this.LastMousePosition.x - data.x, 2) + Math.pow(this.LastMousePosition.y - data.y,2));
		// Write data
			if(kyori > ErrorMargin){
				this.LastMousePosition.x = data.x;
				this.LastMousePosition.y = data.y;
				this.stop = this.LastScrollBarPosition.top;
				this.sleft = this.LastScrollBarPosition.left;
				this.MousePositionChangeLog.push(data);
		//	When scrolled
			}else if(this.smouseflag==0){
				this.smouseflag = 1;
				if(this.stop != this.LastScrollBarPosition.top){
					data.y = data.y + this.LastScrollBarPosition.top - this.stop;
					this.stop = this.LastScrollBarPosition.top;
					this.MousePosition.y = data.y;
					this.LastMousePosition.y = data.y;
					this.smouseflag = 2;
				}
				if(this.sleft != this.LastScrollBarPosition.left){
					data.x = data.x + this.LastScrollBarPosition.left - this.sleft;
					this.sleft = this.LastScrollBarPosition.left;
					this.MousePosition.x = data.x;
					this.LastMousePosition.x = data.x;
					this.smouseflag = 2;
				}
				if(this.smouseflag == 2){
					this.MousePositionChangeLog.push(data);
				}
				this.smouseflag = 0;
			}
			this.GetMouseFlag = 0;
		}
		// Get Mouse Click Position
		this.GetMouseClickPosition = function(PastTime,key){
			var data = {};
			data.x = this.MousePosition.x;
			data.y = this.MousePosition.y;
			data.k = key;
			data.t = PastTime;
			this.MouseClickLog.push(data);
		}

		this.GetMouseDown = function(PastTime,key){
			var data = {}
			data.t = PastTime;
			data.x = this.MousePosition.x;
			data.y = this.MousePosition.y;
			data.k = key
			this.MouseDownChangeLog.push(data);
		}
		this.GetMouseUp = function(PastTime,key){
			var data = {}
			data.t = PastTime;
			data.x = this.MousePosition.x;
			data.y = this.MousePosition.y;
			data.k = key
			this.MouseUpChangeLog.push(data);
		}
		this.TxD = function(time, url){
			//
			var mpdata = "&mp=";
			for(var i=0; i < this.MousePositionChangeLog.length; i++){
				mpdata += this.MousePositionChangeLog[i]["x"] + "," + this.MousePositionChangeLog[i]["y"] + "," + this.MousePositionChangeLog[i]["t"] + ","; 
			}
			
			var isdata = "&is=";
			for(var i=0; i < this.InnerSizeChangeLog.length; i++){
				isdata += this.InnerSizeChangeLog[i]["w"] + "," + this.InnerSizeChangeLog[i]["h"] + "," + this.InnerSizeChangeLog[i]["t"] + ","; 
			}
			
			var scdata = "&sc=";
			for(var i=0; i < this.ScrollBarPositionChangeLog.length; i++){
				scdata += this.ScrollBarPositionChangeLog[i]["l"] + "," + this.ScrollBarPositionChangeLog[i]["tp"] + "," + this.ScrollBarPositionChangeLog[i]["t"] + ","; 
			}
			
			var mcdata = "&mc=";
			for(var i=0; i < this.MouseClickLog.length; i++){
				mcdata += this.MouseClickLog[i]["x"] + "," + this.MouseClickLog[i]["y"] + "," + this.MouseClickLog[i]["k"] + "," + this.MouseClickLog[i]["t"] + ","; 
			}
			var mddata = "&md=";
			for(var i=0; i < this.MouseDownChangeLog.length; i++){
				mddata += this.MouseDownChangeLog[i]["x"] + "," + this.MouseDownChangeLog[i]["y"] + "," + this.MouseDownChangeLog[i]["k"] + "," + this.MouseDownChangeLog[i]["t"] + ","; 
			}
			
			var mudata = "&mu=";
			for(var i=0; i < this.MouseUpChangeLog.length; i++){
				mudata += this.MouseUpChangeLog[i]["x"] + "," + this.MouseUpChangeLog[i]["y"] + "," + this.MouseUpChangeLog[i]["k"] + "," + this.MouseUpChangeLog[i]["t"] + ","; 
			}
			jQuery.getJSON(url + "&docurl=" + encodeURIComponent(docurl) + "&ui=" + user_id + "&t=" + loadtime.getTime() + mpdata + isdata + scdata + mcdata + mddata + mudata);
		}
	}
	function UTIL(){
		var self = this;
		// GetUidFlag
		this.GetUidFlag = 0;
		//	スクリプト開始時間
		this.StartTime = new Date().getTime();
		//	経過時間（msec）
		this.PastTime = 0;
		//	UID取得サーバURL
 		this.getuidurl;
		//	このURLに対して，情報を送信する．
		this.DestinationUrl;
		//	このURLに対して，トラッキング用画像を要求する
		this.TrackImageUrl;
		//	セッションのユニークID
		this.uid = 0;
		// 画像挿入フラグ
		this.InsertTrackImageFlag = 0;
		this.SetGetUidUrl = function(url){
			this.getuidurl = url;
		}
		this.SetDestinationUrl = function(url){
			this.DestinationUrl = url;
		}
		this.GetDestinationUrl = function(){
			return this.DestinationUrl;
		}
		
		this.SetTrackImageUrl = function(url){
			this.TrackImageUrl = url;
		}
		this.GetUid = function(){
			return this.uid
		}		
		this.GetPastTime = function(){
			return this.PastTime;
		}
		//	Get Browser
		this.GetBrowser = function(){
			if(jQuery.browser.msie){
				return "msie";
			}else if(jQuery.browser.mozilla){
				return "mozilla";
			}else if(jQuery.browser.opera){
				return "opera";
			}else if(jQuery.browser.safari){
				return "safari";
			}else{
				return "unknown";
			}
		}
		this.StartTimer = function(){
			setInterval(
				function(){
					self.PastTime++;
					
				},
				100
			);			
		}
		// User IDを取得する
		this.GetUserId = function(){
			var ss1 = document.getElementsByTagName("script");
			
			for (var i = 0; i < ss1.length; i++) {
			  var s = ss1[i];
			  
			  if (s.src && s.src.match(/^http:\/\/logtwit\.com\/analyze\/.*$/)){
				  return s.src.replace(/^http:\/\/logtwit\.com\/analyze\//,'');
			  }
			}
		}
	}
//------------------------------------------------------------------------------------
//	LogTwit::Main
//------------------------------------------------------------------------------------
	var self = this;
	var loadtime = new Date();
	
	var docurl = encodeURI(document.URL);
	this.GetUidUrl = "http://logtwit.com/visitors/arrive/?jsoncallback=?";
	
	//alert(user_id);
	this.ub = new UB();		// Get Users' behavior
	this.util = new UTIL();	// util
	//this.ub.Enable();
	var user_id = this.util.GetUserId(); 

	jQuery.getJSON(this.GetUidUrl,{
			docurl: docurl,
			ui : user_id,
			t : loadtime.getTime(),		
			ref: document.referrer
		},
		function(data,status){
			console.log(data);
		}
	);
	
	// Start Timer
	this.util.StartTimer();
	//	Set Destination Url
	// 
	this.util.SetDestinationUrl("http://logtwit.com/visitors/leave/?jsoncallback=?")
	//	Get Browser Name
	this.Browser = this.util.GetBrowser();	
	// Get first inner Size
	this.ub.GetInnerSize(0,0);					// stay time, error margine
	// Get first Scroll bar Position
	this.ub.GetScrollbarPosition(0,0);			// stay time, error margine
	// Get first Scroll bar Position
	this.ub.GetMousePosition(0,0);				// stay time, error margine
	// Set Interval each 100msec
	setInterval(
		function(){
			// Get Inner size
			ErrorMargin = 10;
			self.ub.GetInnerSize(self.util.GetPastTime(),ErrorMargin);
			// Get Scroll Bar Position
			ErrorMargin = 10;
			self.ub.GetScrollbarPosition(self.util.GetPastTime(),ErrorMargin);
			// Get Mouse Position
			ErrorMargin = 50;
			self.ub.GetMousePosition(self.util.GetPastTime(),ErrorMargin);
		},
		
		1000
	);
	
	//-----------------------------------------------------------------------
	// Mouse MOve
	jQuery(document).mousemove( 
		function(evt){
			self.ub.SetMousePosition(evt);
		} 
	); 	
	
	// Leave WebPage
	if(window.addEventListener){
		window.addEventListener('beforeunload',
				function(){
			self.ub.TxD(self.util.GetPastTime(),self.util.GetDestinationUrl());
			},false);
	}else if (window.attachEvent){
		window.attachEvent('onbeforeunload',function(){
			self.ub.TxD(self.util.GetPastTime(),self.util.GetDestinationUrl());
		});  
	}

	
	// Mouse Click 
	jQuery(document).click( 
		function(e){
			self.ub.GetMouseClickPosition(self.util.GetPastTime(),e.which);
		}
	); 
	// Mouse Down
	jQuery(document).mousedown( 
		function(e){
			self.ub.GetMouseDown(self.util.GetPastTime(),e.which);
		}
	);
	// Mouse Up
	jQuery(document).mouseup(
		function(e){
			self.ub.GetMouseUp(self.util.GetPastTime(),e.which);
		}
	);

	
	
	
	

}

/*--------------------------------------------------------------
	Insert jQuery Code
 --------------------------------------------------------------*/	
	var head = document.getElementsByTagName("head")[0];
	var script = document.createElement('script');
	script.type = 'text/javascript';
	//script.src = "http://logtwit.com/js/jquery1.4.2.js";
	script.src = "http://logtwit.com/js/jquery1.4.2.js";
	script.id = 'com_logtwit_main';
	head.appendChild(script);

/*--------------------------------------------------------------
 	Wait Load jQuery
 --------------------------------------------------------------*/	
	var self = this;
	var timer = setInterval(
		function(){
			if(self.jQuery){
				
				clearInterval(timer);				
/*--------------------------------------------------------------
	Make Instance
--------------------------------------------------------------*/
				var com;
				if(!com) com = {};
				else if(typeof com != "object")
					throw new Error("com already exists and is not an object");
				
				if(!com.logtwit) com.logtwit = {};
				else if(typeof com.logtwit != "object")
					throw new Error("com.logtwit already exists and is not an object");
				
				if(!com.logtwit.main) com.logtwit.main = {};
				else if(typeof com.logtwit.main != "object")
					throw new Error("com.logtwit.main already exists and is not an object");
				
				com.logtwit.main = new LogTwit(253);
			}
		},
		10
	);	
	
	
