(function(){
		var zk = window.zk || {};
		window.zk = zk;
		zk.extend = function( abstractObj, extendObj ) {
			if ( !! abstractObj && !! extendObj && zk.isFunction(abstractObj) && typeof extendObj === "object" ){
				for ( var prototype in extendObj ){
					abstractObj.prototype[prototype] = extendObj[prototype];
				}
			}else if (  !! abstractObj && !! extendObj && typeof abstractObj === "object" && typeof extendObj === "object"  ){
				for ( var prototype in extendObj ){
					abstractObj[prototype] = extendObj[prototype];
				}
			}
			return abstractObj;
		};
		zk.createFun = function(){
			return function( params ){
				if ( !! this.initialize ) {
					this.initialize( params );
				}
			}
		};
		zk.isArray = function( obj ){
			return Object.prototype.toString.call(obj) === "[object Array]";
		};
		zk.isFunction = function( obj ){
			return Object.prototype.toString.call(obj) === "[object Function]";
		};
		zk.getElements = function( selector, context ){
			var regx_id = /^\s*#([a-zA-Z_]\w*)\s*$/;
			var regx_eles = /^\s*([a-zA-Z_]\w*)\s*/;

			context = context || document;
			selector = selector || document;

			if ( typeof selector === "object" ) return selector;

			if ( typeof selector === "string" )
			{
				var match = regx_id.exec( selector );
				if ( match ){
					return context.getElementById( match[1] );
				}
				match = regx_eles.exec( selector );
				if ( match ){
					return context.getElementsByTagName( match[1] );
				}
			}
			return null;
		};
		zk.cookie = zk.extend(
			{},
			{
				set:function (name,value,days,path,domain) {
			        if (days) {
			            var date = new Date();
			            date.setTime(date.getTime()+(days*24*60*60*1000));
			            var expires = "; expires="+date.toGMTString();
			        }
			        else var expires = "";
				    if(path==undefined || path ==null || path==""){path="/";}
			        document.cookie = name+"="+value+expires+";path="+path + (domain == null ? "" : ";domain=" + domain);
			    },
			    get:function (name) {
			        var nameEQ = name + "=";
			        var ca = document.cookie.split(';');
			        for(var i=0;i < ca.length;i++) {
			            var c = ca[i];
			            while (c.charAt(0)==' ') c = c.substring(1,c.length);
			            if (c.indexOf(nameEQ) == 0){
			                return c.substring(nameEQ.length,c.length);
			            }
			        }
			        return null;
			    }
			}
		);
		zk.script = zk.extend(
			{},{
				add : function(src, id, charset){
					var script = document.createElement("script");
				    script.setAttribute( "type", "text/javascript" );
				    script.setAttribute( "charset", charset || "utf-8" );
				    script.setAttribute( "src", src );
				    if ( id ) { script.id = id; }
				    document.body.appendChild(script);
				    return script;
				},
				remove : function(id){
					var obj = (typeof id == "string") ? zk.$D("#" + id) : id;
					if(obj && obj.parentNode){
						obj.parentNode.removeChild(obj);
					}
				}
			}
		);
		zk.className = zk.extend({},{
			add : function( src, name ) {
				if ( typeof name !== "string" || name.indexOf(" ") > 0 ) {
					var nameList = typeof name !== "string" ? name : name.split( /\s+/ );
					for( var i = 0, l = nameList.length; i < l; i++ ) {
						this.add( src, nameList[i] );
					}
				} else {
					var class_name = src.className;
					if ( this.has( src, name ) === -1 ) {
						src.className += ! class_name ? name : " " + name;
					}
				}
			},
			remove : function( src, name ) {
				if ( typeof name !== "string" ) {
					for( var i = 0, l = name.length; i < l; i++ ) {
						this.remove( src, name[i] );
					}
				} else {
				    var _classes = name.split( /\s+/ );
                    var i,l, _name;
                    if ( _classes ) {
                        for( i = 0, l = _classes.length; i < l; i++ ) {
                            _name = _classes[i];
        					do {
        						var _has = this.has( src, _name );
        						if ( _has !== -1 ) {
        							var _ary = src.className.split( /\s+/ );
        							_ary.splice( _has, 1 );
        							src.className = _ary.join(" ");
        						}
        					}while( _has !== -1 );
                        }
                    }
				}
			},
			replace : function( src, name, name1 ) {
				var class_name = src.className;
				if ( class_name ) {
					var ary = class_name.split( /\s+/ );
					for( var i = 0, l = ary.length; i < l; i++ ) {
						if( ary[i] === name ) {
							ary[i] = name1;
						}
					}
					src.className = ary.join(" ");
				}
				alert( src.className );
			},
			has : function( src, name ) {
				var class_name = src.className;
				if ( class_name ) {
					var ary = class_name.split( /\s+/ );
					for( var i = 0, l = ary.length; i < l; i++ ) {
						if( ary[i] === name ) {
							return i;
						}
					}
				}
				return -1;
			}
		});
		zk.cssLink = zk.extend({},zk.script);
		zk.cssLink.add = function( href, id ) {
			this.remove( id );
			var link = document.createElement( "link" );
			link.rel = "stylesheet";
			link.type = "text/css";
			link.href = href;
			zk.$D( "head", document )[0].appendChild( link );
			link.id = id;
		};
		zk.ajax = function(url, method, data, fun, funerr, funstate) {
		      var xmlHttp = null;
			if(window.ActiveXObject){
	            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
	        }else if(window.XMLHttpRequest){
	            xmlHttp = new XMLHttpRequest();
	        }
			var _data = {
				getJson : function(){
					var retVal = null;
					eval("retVal = " + xmlHttp.responseText);
					return retVal;
				},
				getText : function(){
					return xmlHttp.responseText;
				}
			};
			var onstate = function(){
				var _this = this;
				return function(){
					if( funstate ) {
						funstate( xmlHttp.readyState );
					}
					if(xmlHttp.readyState === 4 && xmlHttp.status === 200 ){
						if(fun){
							fun( _data );
						}
					}
					if(xmlHttp.readyState === 4 && xmlHttp.status !== 200 ){
						if(funerr){
							funerr(xmlHttp.status);
						}
					}
				}
			};
			if ( xmlHttp ) {
				xmlHttp.onreadystatechange = onstate();
				xmlHttp.open(method, url);
				if(method == "post"){
					xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
				}
	            xmlHttp.send(data);
			}
            
            this.abort = function() {
                try{
                    xmlHttp.abort();
                } catch( e ) {
                    
                }
            };
		};
		zk.events = zk.extend(
			{},
			{
				eregx : /^(?:on)?(mouseover|mouseout|mousedown|mouseup|mousemove|click|load|change|focus|blur|submit)/,
				attach : function( obj, eventName, eventHandle )
				{
					if ( !! obj )
					{
						var regx = zk.$E.eregx;
						var eventMatchs = eventName.match( regx );
						if ( !! eventMatchs && zk.isFunction( eventHandle ) )
						{
							if ( !! obj.attachEvent )
							{
								var _eventName = eventMatchs[0];
								obj.attachEvent( _eventName, eventHandle );
								return true;
							}
							else if ( !! obj.addEventListener )
							{
								var _eventName = eventMatchs[1];
								obj.addEventListener( _eventName, eventHandle, false );
								return true;
							}
						}
					}
					return false;
				},
				detach : function( obj, eventName, eventHandle )
				{
					if ( !! obj )
					{
						var regx = zk.$E.eregx;
						var eventMatchs = eventName.match( regx );
						if ( !! eventMatchs && zk.isFunction( eventHandle ) )
						{
							if ( !! obj.detachEvent )
							{
								var _eventName = eventMatchs[0];
								obj.detachEvent( _eventName, eventHandle );
								return true;
							}
							else if ( !! obj.removeEventListener )
							{
								var _eventName = eventMatchs[1];
								obj.removeEventListener( _eventName, eventHandle, false );
								return true;
							}
						}
					}
					return false;
				},
				cancelBubble : function( e ){
					if( !! e ){
						if(e.stopPropagation)
							e.stopPropagation();
						else
							e.cancelBubble = true;
					}
				},
				cancel : function( e )
				{
					if ( !! e )
					{
						if ( !! window.event )
						{
							e.returnValue = false;
							return true;
						}
						else if( !! e.preventDefault )
						{
							e.preventDefault();
							return true;
						}
					}
					return false;
				}
			}
		);
		zk.$D = zk.getElements;
		zk.$E = zk.events;
		if ( zk.init ) {
			zk.init();
		}
	})();
