var $class = [];
/**
   *   ??? 
 * @param 
 */
function $import(className, nocache){
	var base, src = "jsbase.js", baseScript = document.getElementById("jsbase"), path, clazz, shortName;
	if(className === "" || className === undefined){
		alert("className can not be empty!");
		return;
	}
	if(className.indexOf(".") > -1){
		if($class[className]){
			return;
		}
		base = baseScript.src.replace(src, "");
		path = className.replace(/\./g, "/");
	}else{
		if($class[className]){
			$execute(className, $class[className]);
			return;
		}
		base = "";
		path = className;
	}
	path += ".js";
	path = base + path;
	if(!nocache){
		clazz = $getClassFile(path);
		$class[className] = clazz;
	}
	$execute(className, clazz, path, nocache);
}
/**
   *   ????????????
 * @param file
 * @return
 */
function $getClassFile(file){
	var http = window.ActiveXObject ? new ActiveXObject("MSXML2.XMLHTTP") : new XMLHttpRequest();
	http.open("GET", file, false);
	http.setRequestHeader("pragma","no-cache");
 	http.setRequestHeader("Cache-Control","no-cache, must-revalidate");
 	http.setRequestHeader("If-Modified-Since","0");
	try{
		http.send(null);
	}catch(e){
		alert("get class file [" + file + "] error.\n" + e.message);
	}
	return http.responseText;
}
/**
   *   ?????????????
 * @param className
 * @param clazz
 * @param path
 */
function $execute(className, clazz, path, nocache){
	try{
		if(nocache === true){
			document.write("\n<"+"script src=\"" + path + "\"></"+"script>");
			return;
		}
		eval(clazz);
		if(className.indexOf(".") > -1){
			funcName = className.substr(className.lastIndexOf(".") + 1);
		}else if(className.indexOf("/") > -1){
			funcName = className.substr(className.lastIndexOf("/") + 1);
		}else {
			funcName = className;
		}
		window[funcName] = eval(funcName);
	}catch(e){
		if(e.name.indexOf("SyntaxError") > -1){
			alert("class [" + className + "] may be not executable.\n" + e.name + ":" + e.message);
		}else if(e.name.indexOf("ReferenceError") > -1){
			document.write("\n<"+"script src=\"" + path + "\"></"+"script>");
		}else{
			alert("load class [" + path + "] failed.\n" + e.name + ":" + e.message);
		}
	}
}

/*if(navigator.userAgent.indexOf("Safari") > -1){
	$navigator = "Safari";
}else */
if(navigator.userAgent.indexOf("KHTML") > -1){
	$navigator = "KHTML";
}else if(navigator.userAgent.indexOf("Opera/9") > -1){
	$navigator = "Opera9";
}else if(navigator.userAgent.indexOf("Opera") > -1){
	$navigator = "Opera";
}else if(navigator.userAgent.indexOf("Gecko") > -1){
	$navigator = "Gecko";
}else{
	$navigator = "MSIE";
}

switch($navigator){
	/*case "Safari" :
	$import("net.sf.iafw.js.patch.Gecko", true);
	break;*/
	case "KHTML" : 
	$import("net.sf.iafw.js.xml.xpath", true);
	$import("net.sf.iafw.js.patch.KHTML", true);
	break;
	case "Opera9" :
	$import("net.sf.iafw.js.patch.Opera", true);
	break;
	case "Opera" :
	$import("net.sf.iafw.js.xml.xpath", true);
	$import("net.sf.iafw.js.patch.OperaLow", true);
	break;
	case "Gecko" :
	$import("net.sf.iafw.js.patch.Gecko", true);
	break;
	default : 
	break;
}

$import("net.sf.iafw.js.lang.IObject");