/**
 * @fileoverview 总配置文件
 * @author 关峰 guanfeng@ceopen.cn
 * @function 1：语言包
 * @function 2：版本号
 * @function 3：JS根文件夹
 * @function 4：cookie操作
 * @function 5：错误处理
 * @function 6：日志
 * @function 7：异常收集器
 * @function 8: 预加载文件
 * @function 9: 异常信息采集
 * @function 10: include
 * @function 11: firebug控制台调试
 */

/**
 * 分析网址
 */
/*
var url=location.href;
var paraStart=url.indexOf("?");
*/
/**
 * 语言包
 * @description如果有多语言需求则语言包应在外部引用，如果只是想统一消息就应直接写在这个文件中
 */
JTKlang = {
    e_000_001 : "异常发生时间",
    e_000_002 : "用户浏览器",
	e_000_003 : "错误提示信息",
	e_000_004 : "错误网址",
	e_000_005 : "错误行数",
	e_000_006 : "自动收集异常",
	e_000_007 : "手动收集异常",
	e_000_008 : "参数请用依赖JTK.root的路径",
	l_000_001 : "计时开始:",
	l_000_002 : "计时结束:",
	l_000_003 : "用时:",
	l_000_004 : "毫秒"
};

/**
 * 总控制对象
 * @function 1：版本号
 * @function 2：框架存放位置控置
 * @function 3：返回异常信息
 * @function 4：打印异常信息
 * @function 5：发送异常信息
 * @function 6：日志记录功能 分为“debug”、“info”、“warn”、“error”4种类型
 * @function 7：预载图片
 * @function 8：引用JS文件方法
 * @function 9：利用firebug控制台显示调试信息(因为是firefox特有的方法，所以封装了一下这样好避免ie报错)
 * @example: 打印前端框架 版本号var version = JTK.version;
 * @example: 打印前端框架根目录 版本号var root = JTK.root;
 */
JTK = {
	//版本号变量
	version : "1.0",
	//静态文件存放域名
	staticUrl : "/Resources/javascripts/JSToolkit-0.7.1/",
	baseUrl : "/",
    cookie : "",
	//异常信息
    error : '',
	//窗口组件
	widgets : {},
	//异常分析器
    errAnalyzer : function(){
        var err = JTK.error;
        if (err != '') {
            var errMsg = 
			err.title + "\n" + JTKlang.e_000_001 +"：" +
            err.date + "\n" + JTKlang.e_000_002 +"：" +
            err.browser + "\n" + JTKlang.e_000_003 +"：" +
            err.error + "\n" + JTKlang.e_000_004 +"：" +
            err.url + "\n" + JTKlang.e_000_005 +"：" +
            err.line;
            switch (JTKconfig.errAnalyzerMode) {
                case "alert":
                    //alert(errMsg);
                    break;
                case "msgbox":
                    //alert("消息框方法显示异常信息");
                    break;
                case "inBox":
                    //alert("在页面某一位置显示异常信息");
                    break;
				case "send":
					JTK.sendErr();
            }
        }
    },
	//发送异常信息
	//····此方法暂时还未实现
	sendErr :function(){
		if(JTKconfig.sendErr){
			//alert(JTKconfig.errorSendUrl);
		}
		return true;
	},
	//日志记录
	logMessage :[],
	//利用firebug控制台显示调试信息
	console :function(consoleInfo){
		var consoleStr = '';
			if(typeof(consoleInfo) == "object"){
				for(i in consoleInfo){
						consoleStr = consoleStr + "key: " + i + "  value: " + consoleInfo[i] + "\r\n";
					}
			}else{
				consoleStr = consoleInfo;
		}
		if(JTKconfig.console){
			if($.browser.mozilla && typeof(console.log) == 'function'){
				console.log(consoleStr);
			}else{
				$("#console").append(consoleStr + "<br>");
			}
		}else{
			return false;
		}
	},
	log :{
		//····日志管理方法（根据需求定制）
		sendLog :function(){
			if(JTKconfig.sendLog){
				var logStr = '';
				for(var i=0;i<JTK.logMessage.length;i++){
					logStr+=JTK.logMessage[i];
				}
			}
			return logStr;
		},
		//类型为“debug”的日志
		debug : function(message){
			message = "debug:" + message;
			JTK.logMessage.push(message);
		},
		//类型为“info”的日志
		info : function(message){
			message = "info:" + message;
			JTK.logMessage.push(message);
		},
		//类型为“warn”的日志
		warn : function(message){
			 message = "warn:" + message;
			 JTK.logMessage.push(message);
		},
		//类型为“error”的日志 
		error : function(message){
			 message = "error:" + message;
			 JTK.logMessage.push(message);
		},
		//开始计时
		timekeeperStart : function(message){
			var d = new Date();
			JTK.timekeeperStartTime = d;
			message = "timekeeper:" + JTKlang.l_000_001 + ' ' + message;
			JTK.logMessage.push(message);
		},
		//结束计时并返回时间
		timekeeperStop : function(message){
			var d = new Date();
			JTK.timekeeperStoptTime = d;
			var useTime = JTK.timekeeperStoptTime - JTK.timekeeperStartTime;
			message = "timekeeper:" + JTKlang.l_000_002 + ' ' + message + JTKlang.l_000_003 + useTime + JTKlang.l_000_004;
			JTK.logMessage.push(message);
			return useTime;
		}
	},
	//手动收集异常
	recordErr : function(e){
		var errorOb = {
			title : JTKlang.e_000_007,
			date : new Date(),
			browser : navigator.userAgent,
			error : "number:" + e.number + "\n" +
					  "name:" + e.name + "\n" +
					  "message" + e.message + "\n" +
					  "description" + e.description + "\n" +
					  "stack" + e.stack + "\n",
			url : e.fileName,
        	line : e.lineNumber	  
		}
		JTK.error = errorOb;
		JTKconfig.errorControlFunction();
		return errorOb;
	},
	/**
	 * 预载图片
	 * @param {Str} urlBig : 大图片存放路径
	 * @argument{Str} urlSmall : 小图存放路径
	 * @argument{Str} imgElement : 图片元素（比如$(".myimg")[]或document.getElementById('img')）
	 */
	preloadImages : function(urlBig,urlSmall,imgElement){
		var img = new Image();  
	   	img.src = urlBig;  
	  	imgElement.src=urlSmall; 
	   	if (img.complete) { //图片已经缓存
	   		imgElement.src=img.src;  
			return;  
		}  
		img.onload = function () {
			imgElement.src=img.src;  
		}; 
	},
	/**
	 * 引用JS文件
	 * @param {Str} dir : JS存放路径
	 * @param useRoot{Boolean} useRoot : 是否以框架根目录为引入文件根目录
	 */
	include : function(dir, useRoot){
			if(arguments[1] == null){
				useRoot = true;
			}
			dir = dir.toString();
			try{
				if(!dir.search(dir)){
					throw new Error("e-000-0008", JTKlang.e_000_008);
				}
			}catch (e){
				JTK.recordErr(e);
			}
			if(useRoot == true){
				document.write('<script type="text/javascript" src="' + JTK.root + dir + '"></script>');
			}else{
				document.write('<script type="text/javascript" src="' + dir + '"></script>');
			}
	},
	/**
	 * OOtools
	 */
	Class : {
		create: function() {
			return function() { this.initialize.apply(this, arguments); }
		},
		Extend : function(destination, source) {
			for (var property in source) {
				destination[property] = source[property];
			}
		},
		Bind :  function(object, fun) {
			return function() {
				return fun.apply(object, arguments);
			}
		},
		/**
		 * 将有参数的函数封装为无参数的函数,不仅对全局函数适用，作为对象方法存在的函数同样适用。
		 * @param {Object} obj 表示事件处理程序所在的对象
		 * @param {Object} strFunc 表示事件处理程序的名称
		 * @除此以外，程序中还利用arguments对象处理第二个参数以后的隐式参数，即未定义形参的参数，并在调用事件处理程序时将这些参数传递进去。
		 * @例如 
		 * someObject.eventHandler=function(_arg1,_arg2){
		 *		//事件处理代码
		 * } 
		 * 应该调用
		 * createFunction(someObject,"eventHandler",arg1,arg2); 
		 * Demo
		 */
		createFunction : function(obj, strFunc) {
			var args = [];
            if (!obj){
				obj = window;
			}  
            for (var i = 2; i < arguments.length; i++){
				args.push(arguments[i]);
			} 
            return function(){
                obj[strFunc].apply(obj, args);
        	}	
		}
	}
};
//框架根目录
JTK.root = JTK.staticUrl + "scripts/";

/**
 * 开关
 */
JTKconfig = {
	//自动收集异常控制开关 ture为开 false为关
    errorControl : true,
	//处理自动收集异常方法
	errorControlFunction : JTK.errAnalyzer,
	//如果监测到异常是否报告给浏览器错误控制台 true为报告 false为屏蔽
	errorTellBrowser : true,
	//打印异常方式 alert、msgbox(自定义锁屏对话框)、inBox(在某一容器中打印比如div中)
	errAnalyzerMode : "alert",
	//异常处理服务地址
	errorSendUrl : "http://",
	//发送异常信息
	sendErr : false,
	//是否发送日志
	sendLog : false,
	//统一开启活关闭控制台
	console : true,
	//设置自动刷新时间
	refreshInterval : 3600
}

/**
 * 自动收集异常信息
 */
if (JTKconfig.errorControl == true) {
    window.onerror = function(msg, url, line){
        var errorOb = {
            title: JTKlang.e_000_006,
            date: new Date(),
            browser: navigator.userAgent,
            error: msg,
            url: url,
            line: line
        }
        JTK.error = errorOb;
        JTKconfig.errorControlFunction();
		if(JTKconfig.errorTellBrowser){
			return false;
		}else{
			return true;
		}
    }
}

/**
 * 页面关闭前
 */

window.onbeforeunload = function(){
	//发送日志信息
	if(JTKconfig.sendLog){
		var logStr = JTK.log.sendLog();
		//alert(logStr);
	}
}