var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{
			string: navigator.userAgent,
			subString: "Chrome",
			identity: "Chrome"
		},
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari",
			versionSearch: "Version"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			   string: navigator.userAgent,
			   subString: "iPhone",
			   identity: "iPhone/iPod"
	    },
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

var scriptLogger = {
	
	URL : $$config.scriptlogurl,
	
	errorHandler : function(msg,url,line){
		var sendmsg = msg + " (line:" + line + ")";
		this.report("jserror", sendmsg, url);
	},
	
	report : function(type,msg,url){
		try{
			//user identity
			var userinfo = "";
			if($$user && $$user.isLogin){
				userinfo = $$user.id;
			}else{
				userinfo = "[guest]";
			}
			msg = msg + " (user:" + userinfo + ")";
			var agent = BrowserDetect.browser + " " + BrowserDetect.version + " on " + BrowserDetect.OS;
			var reportUrl = this.URL + "&t=" + this.encoding(new Date().getTime()) + "&type=" + this.encoding(type) + "&msg=" + this.encoding(msg) + "&url=" + this.encoding(url) + "&agent=" + this.encoding(agent);
			
			//head 에 붙을경우 reportUrl 이 올바르지 않은 javascript 인경우 recursive 하게 error 가 발생할수 있음.
			/*
			var head = document.getElementsByTagName("head")[0];
		    var node = document.createElement('script');
		    this.log(reportUrl);
		    node.setAttribute('src', reportUrl);
		    head.appendChild(node);
		    */
			
			//오류가 나지 않는 Image 객체로 변경
			var img = new Image();
			img.src = reportUrl;
		    
		}catch(err){
			this.log(err);
		}
	},
	
	encoding : function(s){
		return encodeURIComponent(s);
	},
	
	log : function(e){
		try{
			console.log(e);
		}catch(err){};
	},
	
	toString : function(){
		return "webreporter";
	}
}

window.onerror = function(msg,url,line){
	scriptLogger.errorHandler(msg,url,line);
}

if($){	

	
	//jQuery AJAX Timeout 을 5초로 설정 
	$.ajaxSetup({
		timeout : 5000		
	});
	 
	//jQuery AJAX 가 오류발생시 핸들링
	$(document).ajaxError(function(event,x,option,err){
		//console.log(arguments);
		var type = "ajaxerror";
		var data = "";
		var url = option.url;
		if(url.toLowerCase().indexOf("http://")==-1){
			//console.log(window.location.hostname);
			url = window.location.protocol + "//" + window.location.host + url;
		}
		//alert(x.readyState);
		if(!x.readyState){
			data = 'Request Time out.';
		}else if(x.readyState==1){
			data = 'Request Time out.';
		}else if(x.status==0){
			data = 'You are offline!!\n Please Check Your Network.';
		}else if(x.status==404){
			data = 'Requested URL not found.';			
		}else if(x.status==500){
			data = 'Internel Server Error.';//- [' + x.responseText + ']';
			var text = x.responseText;
			var posi = text.indexOf("<pre>");
			if(posi>=0)text = text.substring(posi+5);
			posi = text.indexOf("\n");
			if(posi>=0)text = text.substring(0,posi);
			data += "(exception:" + text + ")";			
		}else {
			if(x.status==200){
				data = 'Parsing JSON failed.';
			}else{
				data = 'Unknow Error.\n'+x.responseText;
			}
		}		
		url = url + " (caller:" + window.location.href + ")"; 
		scriptLogger.report(type,data,url);		
	});
	
}
