/**
 * 名字空间
 * @type {}
 */
if(!this.Shark){
	Shark={};
}

/**
 * 调试
 * @param {} mesg
 * @param {} dialog
 */
function debug(mesg,dialog){
		var callerName = debug.caller ;
		Shark.Debug(mesg,dialog,Shark.Constant.level.DEBUG) ;
};
/**
 * 信息
 * @param {} mesg
 * @param {} dialog
 */
function info(mesg,dialog){
		var callerName = debug.caller ;
		Shark.Debug(mesg,dialog,Shark.Constant.level.INFO) ;
};
/**
 * 警告
 * @param {} mesg
 * @param {} dialog
 */
function warning(mesg,dialog){
		var callerName = debug.caller ;
		Shark.Debug(mesg,dialog,Shark.Constant.level.WARNING) ;
};
/**
 * 错误
 * @param {} mesg
 * @param {} dialog
 */
function error(mesg,dialog){
		var callerName = debug.caller ;
		Shark.Debug(mesg,dialog,Shark.Constant.level.ERROR) ;
};


/**
 * JavaScript实现面向对象类库
 */
Shark.Core = {
    _copyFunction: function(f) {
        var fCopy;
        eval("fCopy = " + f.toString() + ";");
        return fCopy;
    }, 
    _createFunction: function() {
        return function() { };
    },
    extend: function() {
        var baseClass = arguments.length == 1 ? null : arguments[0];
        var definition = arguments.length == 1 ? arguments[0] : arguments[1];
        
        if (baseClass) {
            if (typeof(baseClass) != "function") {
                throw new Error("Base class is not a function, cannot derive.");
            }
        }
        if (!definition) {
            throw new Error("Object definition not provided.");
        }
        
        var constructorClass;
        if (definition.$construct) {
            constructorClass = definition.$construct;
            
            delete definition.$construct;
        } else {
            if (baseClass) {
                constructorClass = Shark.Core._copyFunction(baseClass);
            } else {
                constructorClass = Shark.Core._createFunction();
            }
        }
        constructorClass.$virtual = {};
        constructorClass.$super = baseClass;

        if (baseClass) {
            var prototypeClass = Shark.Core._createFunction();
            prototypeClass.prototype = baseClass.prototype;                    
            constructorClass.prototype = new prototypeClass();
        }            
        constructorClass.prototype.constructor = constructorClass;
        if (definition.$abstract) {
            constructorClass.$abstract = {};
            if (baseClass && baseClass.$abstract) {
                for (var x in baseClass.$abstract) {
                    constructorClass.$abstract[x] = baseClass.$abstract[x];
                }
            }
            if (definition.$abstract instanceof Object) {
                for (var x in definition.$abstract) {
                    constructorClass.$abstract[x] = true;
                    constructorClass.$virtual[x] = true;
                }
            }            
            delete definition.$abstract;
        }       
        if (baseClass) {
            for (var name in baseClass.$virtual) {
                constructorClass.$virtual[name] = baseClass.$virtual[name];
            }
        }
        if (definition.$virtual) {
            Shark.Core._inherit(constructorClass.prototype, definition.$virtual, constructorClass.$virtual);
            for (var name in definition.$virtual) {
                constructorClass.$virtual[name] = true;
            }
            delete definition.$virtual;
        }
        if (definition.hasOwnProperty("toString")) {
            constructorClass.prototype.toString = definition.toString;
        }
        if (definition.hasOwnProperty("valueOf")) {
            constructorClass.prototype.valueOf = definition.valueOf;
        }
        delete definition.toString;
        delete definition.valueOf;
        if (definition.$include) {
            var mixins = definition.$include.reverse();
            Shark.Core._processMixins(constructorClass, mixins);   
            delete definition.$include;
        }
        var loadMethod = null;
        if (definition.$load) {
            loadMethod = definition.$load;
            delete definition.$load;
        }
        if (definition.$static) {
            Shark.Core._inherit(constructorClass, definition.$static);
            delete definition.$static;
        }
        if (definition.$private) {
			Shark.Core._inherit(constructorClass.prototype, definition.$private); 
			delete definition.$private;
        }
        
        Shark.Core._inherit(constructorClass.prototype, definition, constructorClass.$virtual);
        if (!constructorClass.$abstract) {
            this._verifyAbstractImpl(constructorClass);
        }
        if (loadMethod) {
            loadMethod.call(constructorClass);
        }
        return constructorClass;
    },
    get: function(object, path) {
        for (var i = 0; i < path.length; ++i) {
            object = object[path[i]];
            if (!object) {
                return null;
            }
        }
        return object;
    },
    _isVirtual: function(virtualProperties, propertyName) {
        switch (propertyName) {
        case "toString":
        case "valueOf":
            return true;
        }
        return virtualProperties[propertyName];
    },
    _inherit: function(destination, source, virtualProperties) {
        for (var name in source) {
            if (virtualProperties && destination[name] && !this._isVirtual(virtualProperties, name)) {
                throw new Error("Cannot override non-virtual property \"" + name + "\".");
            } else {
                destination[name] = source[name];
            }
        }
    },
    method: function(instance, method) {
        return function() {
            return method.apply(instance, arguments);
        };
    },
    _processMixins: function(destination, mixins) {
        for (var i = 0; i < mixins.length; ++i) {
            for (var mixinProperty in mixins[i]) {
                if (destination.prototype[mixinProperty]) {
                    continue;
                }
                destination.prototype[mixinProperty] = mixins[i][mixinProperty];
            }
        }
    },
    set: function(object, path, value) {
        var parentObject = null;
        for (var i = 0; i < path.length - 1; ++i) {
            parentObject = object; 
            object = object[path[i]];
            if (!object) {
                object = {};
                parentObject[path[i]] = object;
            }
        }
        object[path[path.length - 1]] = value;
    },
    _verifyAbstractImpl: function(constructorClass) {
         var baseClass = constructorClass.$super;
         if (!baseClass || !baseClass.$abstract || baseClass.$abstract === true) {
             return;
         }
         
         for (var x in baseClass.$abstract) {
             if (!constructorClass.prototype[x]) {
                 throw new Error("Concrete class does not provide implementation of abstract method \"" + x + "\".");
             }
         }
    },
    
    getEvent:function (){
        if(document.all)
			return window.event;        
        func=Shark.Core.getEvent.caller;            
        while(func!=null){    
            var arg0=func.arguments[0];
			if(arg0){
                if((arg0.constructor==Event || arg0.constructor ==MouseEvent)
                     || (typeof(arg0)=="object" && arg0.preventDefault && arg0.stopPropagation)){    
                     return arg0;
                }
             }
             func=func.caller;
          }
         return null;
 	},
    /**
     * 添加事件()
     * @param {} eventSource Dom 节点
     * @param {} eventType 事件类型(click,mousemove...),注意去掉所有html事件全部去掉"on"
     * @param {} eventListener 事件句柄
     */
    addEventListener:function(eventSource, eventType, eventListener){
    	if (eventSource.addEventListener) {
            eventSource.addEventListener(eventType, eventListener, false);
        } else if (eventSource.attachEvent) {
            eventSource.attachEvent("on" + eventType, eventListener);
        }
    },

	addOnEnterListener:function(eventSource,eventListener){    
		this.addEventListener(eventSource,"keypress",
	    		function(){
	    			var  event =Shark.Environment.browserType==Shark.Constant.Environment.Browser_FIREFOX ? arguments[0]:window.event;
	    			if(event.keyCode == 13){
	    				eventListener(event);
	    			}
	    		});
	    }
};
//对象池
Shark.ObjectPool = Shark.Core.extend({ 	
	$static: {
        _instance: null, 
        _ObjectFactory : null,
		_idlePool : [],
		_activePool: [] ,
		GetInstance:function(){
			if(Shark.ObjectPool._instance == null){
				Shark.ObjectPool._instance  = new Shark.ObjectPool();
			}
			return Shark.ObjectPool._instance;
		}
    },
   /**
    * 单例模式,只能创建一个对象
    * @param {} PoolFactory
    */
    $construct: function() {
 		if( Shark.ObjectPool._instance != null){
 			throw Error("不能多次构建对象池");
 		}
    },
    isEmptyPool:function(){
    	return Shark.ObjectPool._ObjectFactory == null ;
    },
	SetObjectFactory :function(ObjectFactory){
		Shark.ObjectPool._ObjectFactory =new ObjectFactory;     
	},
	BorrowObject:function(){
		var object = null;
		var idlePool = Shark.ObjectPool._idlePool;
		var factory = Shark.ObjectPool._ObjectFactory;
		if (idlePool.length > 0) {
			object = idlePool.pop();
		}else {
			object = factory.makeObject();
		}
		if (object != null) {
			Shark.ObjectPool._activePool.push(object);
			if (factory.activateObject) {
				factory.activateObject(object);
			}
		}
		return object;
	},
	ReturnObject : function(object) {
		function indexOf(array, object) {
			for (var i = 0; i < array.length; i++) {
				if (array[i] == object) return i;
			}
			return -1;
		};
		if (object != null) {
			var activePool = Shark.ObjectPool._activePool;
			var factory = Shark.ObjectPool._ObjectFactory;		
			var i = indexOf(activePool, object);
			if (i < 0) return;	
			if (factory.passivateObject) {
				factory.passivateObject(object);
			}	
			activePool.splice(i, 1);
			Shark.ObjectPool._idlePool.push(object);
		}
	},
	toString :function(){
		return "Object Pool";
	}
	
});
Shark.ObjectPool.PoolFactory = Shark.Core.extend({	
 	$abstract: {
		makeObject: function() {}, // 创建一个新的对象。(必须声明)
		activateObject: function(object) {}, // 当一个对象被借出时触发的方法。(可选)
		passivateObject: function(object) {}, // 当一个对象被归还时触发的方法。(可选)
		destroyObject: function(object) {} // 销毁一个对象。(可选) 
 	}	
});

Shark.Scheduler = {
	_runable:null,
    _threadHandle: null,
    _time:0,
    add: function(runnable) {
        if (Shark.Scheduler._threadHandle != null) {
            window.clearTimeout(Shark.Scheduler._threadHandle);
        }
        
        Shark.Scheduler._threadHandle = null;
        Shark.Scheduler._runable=runnable;
        Shark.Scheduler._time=runnable.lazy();
        Shark.Scheduler._start();
    },
    _execute: function() {
    	Shark.Scheduler._runable.run();
    },
    _start: function(nextExecution) {
        Shark.Scheduler._threadHandle = window.setTimeout(Shark.Scheduler._execute,Shark.Scheduler._time );
    }   
};
Shark.Scheduler.Runnable = Shark.Core.extend({$abstract: {run: function() { },lazy:function(){}}});
Shark.Scheduler.MethodRunnable = Shark.Core.extend(Shark.Scheduler.Runnable,{$construct: function(f) {this.f = f;},$virtual: {lazy:function(){return 0},run: function() {this.f();}}});

Shark.HttpFactory =  Shark.Core.extend(Shark.ObjectPool.PoolFactory ,{
	$abstract:true,
	makeObject: function() {
		if (window.XMLHttpRequest) {
            return  new XMLHttpRequest();
        } else if (window.ActiveXObject) {    
            return new ActiveXObject("Microsoft.XMLHTTP");
        } else {
            throw "Connect failed: Cannot create XMLHttpRequest.";
        }
	},
	passivateObject: function(xhr) {
		xhr.onreadystatechange = {};
		xhr.abort();
	}
});

Shark.Core.HttpConnection=Shark.Core.extend({
    _url: null,
    _contentType: null,
    _method: null,
    _messageObject: null,
     _listener: null,
    _disposed: false,
    _xmlHttpRequest: null,
    _responseType:null, 
    _objPool: [],
	$load: function(){
		var pool =Shark.ObjectPool.GetInstance(); // 创建对象池
		pool.SetObjectFactory(Shark.HttpFactory);
	},    

	/**
	 *	远程链接服务,通信格式使用Json对象
	 *	 
	 * @param {Object} connect Json对象
	 * 	url 地址
	 *  parameter 传递数据(JavaScript对象)
	 *  listener 回调函数
	 *  contentType 数据流类型(默认使用form表单)
	 *  method 提交方法(默认使用POST提交) 
	 *  
	 */
    $construct: function( connect /*url, method, messageObject, contentType*/) {
    	if (connect != null){   	
	        this._url = connect.url;
	       	var s = this._url.split("?") ; 
	        if(s.length >0){
	        	this._url = s[0];
	        }
			
	        this._messageObject = JSON.stringify( connect.parameter);
	        this._listener = connect.listener ;
	        
	        this._contentType = (connect.contentType ==undefined ?"application/x-www-form-urlencoded; charset=UTF-8" : connect.contentType);
	        this._method = (connect.method ==undefined ? "POST" : connect.method );
	    	//this._responseType = (connect.responseType ==undefined ? "JSON" : connect.responseType.toUpperCase());    
    	}
    	debug(this._messageObject);
    },
    
    
    /**
     * 
     * @param {String} url 地址
     * @param {String} message 发送数据内容
     * @param {Function} callback 回调函数处理(有一个输入参数)
     * @param {String} method Get 和Post 默认值 POST
     * @param {String} contentType 发送类型 默认值form表单
     */
    setConnectParameter:function (url,parameter ,listener ,method, contentType){
    	this._url = url;
    	var s = this._url.split("?") ; 
	        if(s.length >0){
	        	this._url = s[0];
	        }
        this._messageObject = JSON.stringify( parameter);
        this._listener =listener ;
        
        this._contentType = (contentType ==undefined ?"application/x-www-form-urlencoded; charset=UTF-8" : contentType);
        this._method = (method ==undefined ? "POST" : method );
    },
     
    /**
     * Executes the HTTP connection.
     * This method will return before the HTTP connection has received a response.
     */
    connect: function() {
        var usingActiveXObject = false;
        //this._xmlHttpRequest =this._getInstance();
       
        var pool  =  Shark.ObjectPool.GetInstance();
		this._xmlHttpRequest =pool.BorrowObject()
		
		
        var instance = this;
        this._xmlHttpRequest.onreadystatechange = function() { 
            if (!instance) {
                return;
            }
            try {
                instance._processReadyStateChange();
            }finally {
                if (instance._disposed) {
                    instance = null;
                }
            }
        };
		if (this._url.indexOf("?") > 0){
			this._url += "&timeStamp=" + new  Date().getTime();
        }else{
			this._url += "?timeStamp=" + new  Date().getTime();
		}
        this._xmlHttpRequest.open(this._method, this._url, true);
        //if (this._contentType && (usingActiveXObject || this._xmlHttpRequest.setRequestHeader)) {
        	this._xmlHttpRequest.setRequestHeader("Content-Type", this._contentType);
        //}
        this._xmlHttpRequest.send(this._messageObject ? this._messageObject : null);
    },
    
    dispose: function() {
    	Shark.ObjectPool.GetInstance().ReturnObject(this._xmlHttpRequest);
    	//this._xmlHttpRequest.abort();
        this._listener = null;
        this._messageObject = null;
        this._xmlHttpRequest = null;
        this._disposed = true;
    },
    /**
     * 
     * @return {Integer}
     */
    getStatus: function() {
        return this._xmlHttpRequest ? this._xmlHttpRequest.status : null;
    },
    /**
     * 
     * @return {String} 返回获取的结果
     */
    getResponseText: function() {
        return this._xmlHttpRequest ? this._xmlHttpRequest.responseText : null;
    },
    /**
     * 
     * @return {Object} 返回获取的结果
     */
    getResponseJson: function() {
    	var jsontext =this._xmlHttpRequest ? this._xmlHttpRequest.responseText : null; 
    	if(jsontext == null){
    		return null;
    	
    	}else{
    		try{
    		var obj =eval("("+jsontext+")");
    		 	obj.toString=function(){
    		 		return jsontext ;
    		 	}
    		 }catch(e){
    		 	error(jsontext);
    		 	throw new Error("无法把json字符串反序列化为JavaScript");
    		 }
        	return obj ;
    	}
    },
    /**
     * 
     * @return {Dom} 返回XML dom数对象
     */
    getResponseXml: function() {
        return this._xmlHttpRequest ? this._xmlHttpRequest.responseXML : null;
    },
    
    _processReadyStateChange: function() {
        if (this._disposed) {
            return;
        }
        if (this._xmlHttpRequest.readyState == 4) {
            var responseEvent;
            try {
                var valid = this._xmlHttpRequest.status == 0 ||  
                        (this._xmlHttpRequest.status >= 200 && this._xmlHttpRequest.status <= 299);
                responseEvent = {type: "response", source: this, valid: valid};                
            } catch (ex) {
                responseEvent = {type: "response", source: this, valid: false, exception: ex};
            }
            this._listener(responseEvent);
            this.dispose();
        }
    }
});



/**
 * js调试
 * @param {String} mesg    调试信息
 * @param {boolean} dialog true 表示使用alert显示
 */
Shark.Debug = function(mesg,dialog,level){
	if(Shark.Constant.debug){
		if(dialog ==true){
			Shark.Debug.ConsoleWrite.consoleElement = null;
			Shark.Debug.ConsoleWrite.useAlertDialog=true;
			Shark.Debug.ConsoleWrite.consoleWrite(mesg);
			var node = document.getElementById("__debug__") ;
			if(node!= undefined){
				node.parentNode.removeChild(node);
			}
		}else{
			var debugConsole = document.getElementById("__debugConsole__") ; 
			if(debugConsole == null){
				var debug = document.createElement("div");
				debug.setAttribute("id","__debug__");
				debug.setAttribute("align","left");
				debug.style.cssText="border:solid 0px #FF6600;margin:20px; padding:10px;";
				var fieldset = document.createElement("fieldset");
				var legend  = document.createElement("legend");
				legend.appendChild(document.createTextNode("Debug Window")) ;
				fieldset.appendChild(legend);
				debugConsole = document.createElement("div");
				debugConsole.setAttribute("id","__debugConsole__");
				debugConsole.style.cssText ="width:100%;height:300px;overflow-x:hidden;overflow-y:scroll;color:#000000;font-size:14px";
				fieldset.appendChild(Shark.Debug.LevelConsole.createLevelConsole());
				fieldset.appendChild(debugConsole);			
				debug.appendChild(fieldset);
				document.body.appendChild(debug);
			}
			Shark.Debug.ConsoleWrite.consoleElement = debugConsole;
			if(level != undefined){
				Shark.Debug.ConsoleWrite.consoleWrite(mesg,level);
			}else{
				Shark.Debug.ConsoleWrite.consoleWrite(mesg,Shark.Constant.level.DEBUG);
			}
		}
	}
};
Shark.Debug.LevelConsole={
		clickLevel:function(domInput){
			var level = domInput.value;
			if(domInput.checked){
				Shark.Debug.ConsoleWrite.addShow(level)
			}else{
				Shark.Debug.ConsoleWrite.delShow(level)
			}
		},
		createLevelConsole: function(){
			var levelConsole = document.createElement("div");
				var html="" ;
				html +="<a href='#' onclick='Shark.Debug.ConsoleWrite.clearConsole()' >Clear</a>&nbsp;&nbsp;&nbsp;&nbsp;" ;
				html +="<input value='"+Shark.Constant.level.DEBUG+"'  type='checkbox' "+
				( Shark.Debug.ConsoleWrite.isShow(Shark.Constant.level.DEBUG) ? "checked='checked'" : "")
				+" onclick='Shark.Debug.LevelConsole.clickLevel(this)'/>DEBUG&nbsp;&nbsp;";
				html +="<input value='"+Shark.Constant.level.INFO+"' type='checkbox' "+
				( Shark.Debug.ConsoleWrite.isShow(Shark.Constant.level.INFO) ? "checked='checked'" : "")
				+" onclick='Shark.Debug.LevelConsole.clickLevel(this)'/>INFO&nbsp;&nbsp;";
				html +="<input value='"+Shark.Constant.level.WARNING+"'type='checkbox'"+
				( Shark.Debug.ConsoleWrite.isShow(Shark.Constant.level.WARNING) ? "checked='checked'" : "")
				+" onclick='Shark.Debug.LevelConsole.clickLevel(this)' />WARNING&nbsp;&nbsp;";
				html +="<input value='"+Shark.Constant.level.ERROR+"'type='checkbox' "+
				( Shark.Debug.ConsoleWrite.isShow(Shark.Constant.level.ERROR) ? "checked='checked'" : "")
				+" onclick='Shark.Debug.LevelConsole.clickLevel(this)'/>ERROR&nbsp;&nbsp;"
				html+="<hr />" ;
				levelConsole.innerHTML =html;
			return 	levelConsole;
		}
}

Shark.Debug.ConsoleWrite = { 
    consoleElement: null,
    useAlertDialog: false,
    _levels : [{"name": "DEBUG", "level": 1},
			   {"name": "INFO", "level": 2},
			   {"name": "WARNING", "level": 3},
			   {"name": "ERROR", "level": 4},
			   {"name": "CRITICAL", "level": 5}
			],
	_showLeve:[false,true,true,true,true],
    consoleWrite: function(text ,level) {
        if (Shark.Debug.ConsoleWrite.consoleElement) {
	    	if( !this.isShow(level)){
	    		return ;
	    	}
            var entryElement = document.createElement("div");
            var current_time  =  new Date();
		    var strDate = "[ "+ current_time.getYear()+ "-";
		    strDate +=  current_time.getMonth()+ "-";
		    strDate +=  current_time.getDate()    + " ";
		    strDate +=  current_time.getHours()   + ":";
		    strDate +=  current_time.getMinutes() + ":";
		    var sec =current_time.getSeconds();
		    sec =  sec < 10 ? "0" + sec : sec;
		    strDate +=sec ;
		    strDate+=" ]    " ;
		    var timeF =  document.createElement("font");
		    timeF.setAttribute("color","#009933");
		    timeF.appendChild(document.createTextNode( strDate ));
		    entryElement.appendChild(timeF);
		    
		    entryElement.appendChild(this._debugLevel(level));
            entryElement.appendChild(document.createTextNode( text));
            if (Shark.Debug.ConsoleWrite.consoleElement.childNodes.length == 0) {
                Shark.Debug.ConsoleWrite.consoleElement.appendChild(entryElement);
            } else {
            	Shark.Debug.ConsoleWrite.consoleElement.appendChild(entryElement);
            	Shark.Debug.ConsoleWrite.consoleElement.scrollTop = Shark.Debug.ConsoleWrite.consoleElement.scrollHeight; 
            }
        } else if (Shark.Debug.ConsoleWrite.useAlertDialog) {
            alert("DEBUG:" + text);
        }
    },
    
    _debugLevel :function (level){
    	var levelF =  document.createElement("font");
    	switch ( level){
    		case Shark.Constant.level.DEBUG:
    		break;
			case Shark.Constant.level.INFO :
				levelF.setAttribute("color","#009933");
				break;
			case Shark.Constant.level.WARNING :
				 levelF.setAttribute("color","#CCFF33");
				break;
			case Shark.Constant.level.ERROR :
				levelF.setAttribute("color","#CC0000");
			break;
    	}
    		levelF.appendChild(document.createTextNode( this._levels[(level-1)].name+"  "));
    		return levelF;
    },
    /**
     * 添加一个显示级别
     * @param {} show
     */
    addShow :function( show){
    	this._showLeve[show]= true;
    },
    
    /**
     * 删除一个显示级别
     * @param {} show
     */
    delShow:function( show){
    	this._showLeve[show]= false;
    },
    
    /**
     * 判断当前级别是否显示
     * @param {} show
     * @return {Boolean} true 显示  false 不显示
     */
    isShow :function(show){
    	if( this._showLeve[show] == undefined || this._showLeve[show] ==false){
			return false;
		}else{
			return true;
		}
    },
    /**
     * 清除控制台
     */
    clearConsole :function(){
    	var de = document.getElementById("__debugConsole__") ;
		while (de.firstChild) {
			de.removeChild(de.firstChild);
		}
    },
    toString: function(object) {
        var s = "";
        for (var x in object) {
            if (typeof object[x] != "function") { 
                s += x + ":" + object[x] + "\n";
            }
        }
        return s;
    }
};


/**
 * 客户端环境主要检测浏览器的类型(IE 和 火狐)
 */
Shark.Environment = Shark.Core.extend({
	$construct: function() {
        this.browser = this._detectBrowser();
    },
	$static: {
		isStorageEnable:true, 
		browserType:null ,
		browserName: null,
		/**
		 * 
		 * @return {} 检测操作系统类型(Win 2000 和 WinXP 其它返回-1)
		 */
		_detectOS:function (){
		    var sUserAgent = navigator.userAgent;
		    var isWin = (navigator.platform == "Win32") || (navigator.platform == "Windows");
		    if(isWin){
			    var isWin2K = sUserAgent.indexOf("Windows NT 5.0") > -1 || sUserAgent.indexOf("Windows 2000") > -1;
			    if(isWin2K) return Shark.Constant.Environment.OS_Win2000;
			    var isWinXP = sUserAgent.indexOf("Windows NT 5.1") > -1 || sUserAgent.indexOf("Windows XP") > -1;
			    if(isWinXP) return Shark.Constant.Environment.OS_WinXP;
			    var isWin2003 = sUserAgent.indexOf("Windows NT 5.2") > -1 || sUserAgent.indexOf("Windows 2003") > -1;
		    	if(isWin2003) return Shark.Constant.Environment.OS_None;
		    	var isVista = sUserAgent.indexOf("Windows NT 6.0") > -1 || sUserAgent.indexOf("Windows Vista") > -1;
		    	if(isVista) return Shark.Constant.Environment.OS_WinVista;
		    }
	    	return Shark.Constant.Environment.OS_None;
		},
		/**
		 * 
		 * @return {} 
		 */
	 	_detectBrowser: function (){
	 		var browser_Agent = navigator.userAgent;
	         if(browser_Agent.indexOf("MSIE") > 0 ){
	 		 	return Shark.Constant.Environment.Browser_MSIE ;
			 }else if( browser_Agent.indexOf("Firefox") >0 ){
			 	return Shark.Constant.Environment.Browser_FIREFOX ;
			 }
			 
	 	}
 	},
 	
 	$load: function() {
        this.browserType =  this._detectBrowser();
        switch(this.browserType ){
        	case	Shark.Constant.Environment.Browser_MSIE :
        		this.browserName="MSIE" ;
        		break;
        	case	Shark.Constant.Environment.Browser_FIREFOX :
        		this.browserName="FIREFOX" ;
        		break;	
        }
        if (document.cookie == null) {
        	this.isStorageEnable=false;
        }else{
        	this.isStorageEnable=true;
        }
    }
});


if (!this.JSON) {
    JSON = function () {
        function f(n) {
            return n < 10 ? '0' + n : n;
        }
        Date.prototype.toJSON = function () {
            return this.getUTCFullYear()   + '-' +
                 f(this.getUTCMonth() + 1) + '-' +
                 f(this.getUTCDate())      + 'T' +
                 f(this.getUTCHours())     + ':' +
                 f(this.getUTCMinutes())   + ':' +
                 f(this.getUTCSeconds())   + 'Z';
        };
        var escapeable = /["\\\x00-\x1f\x7f-\x9f]/g,
            gap,
            indent,
            meta = {
                '\b': '\\b',
                '\t': '\\t',
                '\n': '\\n',
                '\f': '\\f',
                '\r': '\\r',
                '"' : '\\"',
                '\\': '\\\\'
            },
            rep;
        function quote(string) {
            return escapeable.test(string) ?
                '"' + string.replace(escapeable, function (a) {
                    var c = meta[a];
                    if (typeof c === 'string') {
                        return c;
                    }
                    c = a.charCodeAt();
                    return '\\u00' + Math.floor(c / 16).toString(16) +
                                               (c % 16).toString(16);
                }) + '"' :
                '"' + string + '"';
        }
        function str(key, holder) {
            var i, 
                k, 
                v, 
                length,
                mind = gap,
                partial,
                value = holder[key];
            if (value && typeof value === 'object' &&
                    typeof value.toJSON === 'function') {
                value = value.toJSON(key);
            }
            if (typeof rep === 'function') {
                value = rep.call(holder, key, value);
            }
            switch (typeof value) {
            case 'string':
                return quote(value);
            case 'number':
                return isFinite(value) ? String(value) : 'null';
            case 'boolean':
            case 'null':
              return String(value);
            case 'object':
                if (!value) {
                    return 'null';
                }
             gap += indent;
                partial = [];
               if (typeof value.length === 'number' &&
                        !(value.propertyIsEnumerable('length'))) {
                  length = value.length;
                    for (i = 0; i < length; i += 1) {
                        partial[i] = str(i, value) || 'null';
                    }
                    v = partial.length === 0 ? '[]' :
                        gap ? '[\n' + gap + partial.join(',\n' + gap) +
                                  '\n' + mind + ']' :
                              '[' + partial.join(',') + ']';
                    gap = mind;
                    return v;
                }
              if (typeof rep === 'object') {
                    length = rep.length;
                    for (i = 0; i < length; i += 1) {
                        k = rep[i];
                        if (typeof k === 'string') {
                            v = str(k, value, rep);
                            if (v) {
                                partial.push(quote(k) + (gap ? ': ' : ':') + v);
                            }
                        }
                    }
                } else {
                   for (k in value) {
                        v = str(k, value, rep);
                        if (v) {
                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
                        }
                    }
                }
             v = partial.length === 0 ? '{}' :
                    gap ? '{\n' + gap + partial.join(',\n' + gap) +
                              '\n' + mind + '}' :
                          '{' + partial.join(',') + '}';
                gap = mind;
                return v;
            }
        }
       return {
            stringify: function (value, replacer, space) {
            	
              var i;
                gap = '';
                indent = '';
                if (space) {
                	
                    if (typeof space === 'number') {
                        for (i = 0; i < space; i += 1) {
                            indent += ' ';
                        }
                   } else if (typeof space === 'string') {
                        indent = space;
                    }
                }
               if (!replacer) {
                    rep = function (key, value) {
                        if (!Object.hasOwnProperty.call(this, key)) {
                            return undefined;
                        }
                        return value;
                    };
               } else if (typeof replacer === 'function' ||
                        (typeof replacer === 'object' &&
                         typeof replacer.length === 'number')) {
                    rep = replacer;
                } else {
                    throw new Error('JSON.stringify');
                }
              return str('', {'': value});
            },
            parse: function (text, reviver) {
               var j;
                function walk(holder, key) {
                  var k, v, value = holder[key];
                    if (value && typeof value === 'object') {
                        for (k in value) {
                            if (Object.hasOwnProperty.call(value, k)) {
                                v = walk(value, k);
                                if (v !== undefined) {
                                    value[k] = v;
                                } else {
                                    delete value[k];
                                }
                            }
                        }
                    }
                    return reviver.call(holder, key, value);
                }
                if (/^[\],:{}\s]*$/.test(text.replace(/\\["\\\/bfnrtu]/g, '@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
                    j = eval('(' + text + ')');
                    return typeof reviver === 'function' ?
                        walk({'': j}, '') : j;
                }
               throw new SyntaxError('JSON.parse');
            },
            quote: quote
        };
    }();
};


Shark.StorageData = Shark.Core.extend({
	
	/**
	 * 获得Cookie解码后的值
	 * @param {} offset
	 * @return {}
	 */
    getCookieVal : function(offset) {//获得Cookie解码后的值
        var endstr = document.cookie.indexOf (";", offset);
        if(-1 == endstr) {
            endstr = document.cookie.length;
        }
        return (unescape(document.cookie.substring(offset, endstr)));
    },
    
    /**
     * 设定Cookie值
     * @param {String} name 键
     * @param {String} value 值
     */
    setCookie : function(name, value) { //
        var expdate = new Date();
        var argv = arguments;
        var argc = arguments.length;
        var expires = ((argc > 2) ? argv[2] : null);
        var path = ((argc > 3) ? argv[3] : null);
        var domain = ((argc > 4) ? argv[4] : null);
        var secure = ((argc > 5) ? argv[5] : false);
        expdate.setTime(expdate.getTime()+31536000000);
        var temp = name + "=" + escape (value)+"; expires="+ expdate.toGMTString();
		document.cookie = temp;	
			
    },
    delCookie : function(name) { //删除Cookie
        var exp = new Date();
        exp.setTime(exp.getTime() - 4800000);
        var cval = this.getCookie(name);
        document.cookie = name + "=" + cval + "; expires="+ exp.toGMTString()+";domain="+Shark.Constant.Domain.domain;
    },
    /**
     * 获得Cookie的原始值
     * @param {String} name
     * @return {}
     */
    getCookie : function(name) { //获得Cookie的原始值
        var arg = name + "=";
        var nameLen = arg.length;
        var cookieLen = document.cookie.length;
        var step = 0;
        while (step < cookieLen){
            var end = step + nameLen;
            if (document.cookie.substring(step, end) == arg) {
                return this.getCookieVal(end);
            }
            step = document.cookie.indexOf(" ", step) + 1;
            if (0 == step) break;
        }
        return (null);
    }
});
StringBuffer = Shark.Core.extend({_string : null,$construct: function(){this._string= new Array();},append:function(str){this._string.push(str);},toString:function(){return this._string.join("");},toJoin:function(j){return this._string.join(j);}});

StringUtils={ltrim:function(s){return s.replace(/(^\s*)/g, "");},rtrim:function(s){return s.replace(/(\s*$)/g, "");},trim:function (s){return s.replace(/(^\s*)|(\s*$)/g, "");}}	
Shark.ready=(function(){var e=[],t,s,n,i,o,d=document,w=window,r='readyState',c='onreadystatechange',x=function(){n=1;clearInterval(t);while(i=e.shift())i();if(s)s[c]=''};return function(f){if(n)return f();if(!e[0]){d.addEventListener&&d.addEventListener("DOMContentLoaded",x,false);/*@cc_on@*//*@if(@_win32)d.write("<script id=__ie_onload defer src=//0><\/scr"+"ipt>");s=d.getElementById("__ie_onload");s[c]=function(){s[r]=="complete"&&x()};/*@end@*/if(/WebKit/i.test(navigator.userAgent))t=setInterval(function(){/loaded|complete/.test(d[r])&&x()},10);o=w.onload;w.onload=function(){x();o&&o()}}e.push(f)}})();
Shark.$=function(element){
	return document.getElementById(element);
}
Shark.$$=function(element){
	return document.getElementById(element).value;
}
Shark.inner=function(element){
	return document.getElementById(element).innerHTML;
}

Shark.copyClip=function(meintext){
	if (window.clipboardData){
		window.clipboardData.setData("Text", meintext);
	}else if (window.netscape){ 
		try{
			netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
	   		var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
	   		if (!clip) return;
	   		var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
	   		if (!trans) return;
			trans.addDataFlavor('text/unicode');
	   		var str = new Object();
	   		var len = new Object();
	   		var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
			var copytext=meintext;
	   		str.data=copytext;
			trans.setTransferData("text/unicode",str,copytext.length*2);
	   		var clipid=Components.interfaces.nsIClipboard;
	   		if (!clip) return false;
	   		clip.setData(trans,null,clipid.kGlobalClipboard);

   		}catch (e){
   			if(Shark.Environment.browserType==Shark.Constant.Environment.Browser_FIREFOX){
				alert("Firefrox浏览器安全限制，不允许访问剪贴板。\n\n"+
					"如果需访问剪贴板请按照如下步骤修改Firefrox限制：\n"+
					"  1.  在Firefox地址栏中输入:  about:config \n"+
					"  2.  找到signed.applets.codebase_principal_support，将值设置为true \n")
			}
			return "";
   		}
   }
   
    var theEvent = window.event || arguments.callee.caller.arguments[0];
   //	debug("X="+theEvent.clientX+"    Y="+theEvent.clientY)

	var tool = new Tooltip(100);
	var top =0;
	if(Shark.Environment.browserType==Shark.Constant.Environment.Browser_FIREFOX){
		top =  window.pageYOffset;
	}else{
		top = document.documentElement.scrollTop;
	}
	var showtext = "<span  style=\"color:#FF0000;font-weight:bold\">已复制到剪贴板</span>"
	tool.show(showtext,theEvent.clientX,theEvent.clientY+20 +top)
   		
}
Shark.addBookmark=function(title,url){
	if (window.sidebar) {
			window.sidebar.addPanel(title, url,"");
	} else if( document.all ) {
			window.external.AddFavorite( url, title);
	} else if( window.opera && window.print ) {
		return true;
	}
}


Shark.request={
	QueryString : function(val) {
		var uri = window.location.href.split ("?");
		if(uri.length==2){
			uri = uri[1];
			var re = new RegExp("" +val+ "\=([^\&\?]*)", "ig");
			var temp=uri.match(re);
			return temp?(temp[0].substr(val.length+1)):null;	
		}else{	
			return null;
		}
	}
}

Shark.RemoveAllChild = function(element){
		var de = null;
		var type =  typeof element;	
		if(type =="string"){
			de = document.getElementById(element) ; 	
		}else{
			de = element;
		}
		while (de.firstChild) {
			de.removeChild(de.firstChild);
		}
    },


Shark.Validate={
	UserName:function(email,func ){
		var conn =new Shark.Core.HttpConnection(
			{
				"url":Shark.Constant.Servlet.AJAXSERVICE,
				"parameter":{
  	  				"cmd":  Shark.Constant.AjaxService.CMD_VALIDATE,
					"field":Shark.Constant.Validate.FIELD_EMAIL,
					"value":email
				},
				"listener":function(result){
					func(result.source.getResponseJson().result);
				}	
			}	
		);
		conn.connect();
	}
};
function AddFavorite(sURL, sTitle){
try {
 	window.external.addFavorite(sURL, sTitle);
}
catch (e){
 try{
 window.sidebar.addPanel(sTitle, sURL, "");
}catch (e){
alert("加入收藏失败，请使用Ctrl+D进行添加");
}
}
}
function SetHome(obj,vrl){
try{
	obj.style.behavior='url(#default#homepage)';obj.setHomePage(vrl);
}
catch(e){
if(window.netscape) {
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
}
catch (e) {
alert("此操作被浏览器拒绝！\n请在浏览器地址栏输入“about:config”并回车\n然后将 [signed.applets.codebase_principal_support]的值设置为'true',双击即可。");
}
var prefs = Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefBranch);
prefs.setCharPref('browser.startup.homepage',vrl);
}
}
}

function _userLogOut_ (){
var url= Shark.Constant.Domain.www;
var conn =new Shark.Core.HttpConnection({"url":Shark.Constant.Servlet.AJAXSERVICE,"parameter":{"cmd": Shark.Constant.AjaxService.CMD_USER_LOGOUT},
"listener":function(result){
var res = result.source.getResponseJson();
var errorCode = res.errorCode;
if(errorCode ==0){
var storage = new Shark.StorageData();
storage.delCookie("nick");
storage.delCookie("userName");
document.location.href = url;
}
}});
conn.connect();
}

function tofocus(tagName){
		setTimeout(function(){
			document.getElementById(tagName).focus();
		},40);
}

/*
 * 乐语API
 */
function shortURL(l){ if(l==null)return '';l=encodeURIComponent(l);if(l.length > 500) l=l.substring(0,500);return l;}
function opendoyoo(t) {
/*
	var url = "http://chat.doyoo.net/WebModule/chat/p.do?c=17589";
	//if(	t!= null &&  t.length != 0 )
	//	url +="&g=" + t;
	if(	t!= null &&  t.length != 0 )
		url +="&n=" + t;
	else 
		url +="&g=" + 5204;
	var datastor = new Shark.StorageData(); 
	var sid = datastor.getCookie("DOYOO_VISITOR_ID");
	var cid = datastor.getCookie("DOYOO_USER_ID");
	var refer = datastor.getCookie("DOYOO_VISITOR_REFER");
	var loc = document.location.href;
	if(sid!=null)		url +="&v=" + sid;
	if(cid !=null)	url +="&u=" + cid;
	if(refer) url +="&refer="+shortURL(refer);
	if(loc) url +="&loc="+shortURL(loc);
	try{	url=url+"&r=" ;}catch(e){}
	var param = "height=460,width=690,directories=no," + "location=no,menubar=no," + "resizeable=no,status=no,toolbar=no,top=100,left=200";
	var acceptWin = window.open(url,"", param);
	*/
	looyu1(t);
}

/**
http://chat10.looyu.com/chat/chat/p.do?md=1&c=17589&f=38270&site=0&ct=7&refer=&loc=
lyid 为乐语客服ID
lyid 为空 由乐语自动分配客服
lyid 不为空指定乐语客服
例如:
	自动分配客服: looyu3()
	指定客服:looyu3('testcase1')
*/

//乐语客服组
function looyu1(lyid) {
	var v=rnd_str(32);//模拟乐语的MD5字串
	var u=rnd_str(32)//模拟乐语的MD5字串
	var url ='http://chat.looyu.com/chat/chat/p.do?md=1&c=17589&v='+v+'&u='+u+'&f=38270&site=0&ct=3&refer=&loc=';
	var param = "height=460,width=785,directories=no,location=no,menubar=no,resizeable=no,status=no,toolbar=no,top=100,left=200";
	window.open(url, "", param);	
	
	//在Google Analytics中记录乐语的点击事件
	var pageTracker = _gaq._createAsyncTracker('UA-7072431-1');
	pageTracker._trackEvent('looyu', 'open', 'looyu1');
}

//乐语寄售交易员组
function looyu2(lyid) {
	looyu(20836,38269,lyid);
}

//乐语游戏推广员组
function looyu3(lyid) {
	looyu(20378,38268,lyid);
}

//乐语工作室组
function looyu4(lyid) {
	looyu(20903,53679,lyid);
}

/**
 * 
 * @param {Object} groupid 乐语组ID,从乐语客户端获取
 * @param {Object} skin		乐语聊天对话框ID,从乐语客户端获取
 * @param {Object} lyid		指定客服乐语ID,从乐语客户端获取
 */
function looyu(groupid,skin,lyid) {
	var url ='http://chat.looyu.com/chat/chat/p.do?g='+groupid+'&md=2&c=17589&f='+skin+'&site=0&ct=2&refer=&loc=';
	
	if(lyid!=null){
		url='http://chat.looyu.com/chat/chat/p.do?n='+lyid+'&md=2&c=17589&f='+skin+'&site=0&ct=3&refer=&loc=';
	}
	var param = "height=460,width=785,directories=no,location=no,menubar=no,resizeable=no,status=no,toolbar=no,top=100,left=200";
	window.open(url,"", param);	
}
//生成随机字符串(模拟乐语MD5签名)
function rnd_str(len){ 
	var seed_array="a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9"; 
	var array= seed_array.split(" "); 
	var seedary="" 
	for (i=0;i<len;i++){ 	
		seedary+=array[Math.round(Math.random( )*(array.length-1))] 
	} 
	return seedary; 
}