/*
$Id: ajax.js 2633 2007-12-20 02:45:11Z langwan $
*/
//var 100 = 100; //初始的请求已经接受，客户应当继续发送请求的其余部分。
//var 101 = 101; //服务器将遵从客户的请求转换到另外一种协议。
//var 200 = 200; //一切正常，对get和post请求的应答文档跟在后面。
//var 201 = 201; //服务器已经创建了文档，location头给出了它的url。
//var 202 = 202; //已经接受请求，但处理尚未完成。
//var 203 = 203; //文档已经正常地返回，但一些应答头可能不正确，因为使用的是文档的拷贝。
//var 204 = 204; //没有新文档，浏览器应该继续显示原来的文档。如果用户定期地刷新页面，而servlet可以确定用户文档足够新，这个状态代码是很有用的。
/*
没有全部定义完整，只定义了使用中的
*/
var XMLHTTP_READYSTATE_UNLOAD = 0; //未初始化
var XMLHTTP_READYSTATE_READING = 1; //
var XMLHTTP_READYSTATE_READED = 2; //
var XMLHTTP_READYSTATE_EXCHANING = 3; //
var XMLHTTP_READYSTATE_FINISHED = 4; //

var ajaxarr = new Array();//note 每个URL只允许生成一个AJAX对象，防止重复点击。
var ajaxstackarr = new Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);//note ajax 对象时间占位堆栈。预置位10个，应该足够用了。
var attackevasive = 1;//note 防止刷新是否打开
var ajsetarr = new Array();

//构造AJAX类
function ajax_cls(recvtype) {

	for(var _stackindex = 0; _stackindex < ajaxstackarr.length && ajaxstackarr[_stackindex] != 0; _stackindex++);//note 查询空闲的时间位
	ajaxstackarr[_stackindex] = 1;//note 表示该任务占位

	var aj = new Object();

	aj._recvtype = recvtype ? recvtype : 'XML';

	aj._resulthandle = null;
	aj._sendstring = '';
	aj.targeturl = '';
	aj._stackindex = 0;
	aj._stackindex = _stackindex;

	//note 默认为 XML 方式
	aj.setrecvtype = function(recvtype) {
		aj._recvtype = recvtype;
	}

	aj._create = function() {
		var request = false;
		if(window.XMLHttpRequest) {
			request = new XMLHttpRequest();
			if(request.overrideMimeType) {
				request.overrideMimeType('text/xml');
			}
		} else if(window.ActiveXObject) {
			var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.7.0', 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
			for(var i=0; i<versions.length; i++) {
				try {
					request = new ActiveXObject(versions[i]);
					if(request) {
						return request;
					}
				} catch(e) {
					continue;
				}
			}
		}
		return request;
	}

	aj._xmlhttp_request = aj._create();


	//note private
	aj._processhandle = function() {
		var XMLHTTP_READYSTATE_FINISHED = 4;
		if(aj._xmlhttp_request.readyState == XMLHTTP_READYSTATE_FINISHED && aj._xmlhttp_request.status == 200) {
			if(ajaxarr.length > 0 ) {
				for(k in ajaxarr) {
					if(ajaxarr[k] == aj.targeturl) {
						ajaxarr[k] = null;
					}
				}
			}
			if(aj._recvtype == 'HTML') {
				aj._resulthandle(aj._xmlhttp_request.responseText, aj);
			} else if(aj._recvtype == 'XML') {
				if(aj._xmlhttp_request.responseXML.lastChild != null) {
					aj._resulthandle(aj._xmlhttp_request.responseXML.lastChild.firstChild.nodeValue, aj);
				}
			}
			ajaxstackarr[aj._stackindex] = 0;//note 清空标志位，使其它对象有时间段可以被申请
		}
	}

	//note public
	aj.get = function(targeturl, resulthandle) {
		if(in_array(targeturl, ajaxarr)) {
			return false;
		} else {
			ajaxarr.push(targeturl);
		}
		aj.targeturl = targeturl;
		aj._xmlhttp_request.onreadystatechange = aj._processhandle;
		aj._resulthandle = resulthandle;
		var delay = attackevasive & 1 ? (aj._stackindex + 1) * 1001 : 100;
		if(window.XMLHttpRequest) {
			setTimeout(function(){
			aj._xmlhttp_request.open('GET', aj.targeturl);
			aj._xmlhttp_request.send(null);}, delay);
		} else {
			setTimeout(function(){
			aj._xmlhttp_request.open("GET", aj.targeturl, true);
			aj._xmlhttp_request.send();}, delay);
		}

	}
	//note public
	aj.post = function(targeturl, sendstring, _resulthandle) {
		if(in_array(targeturl, ajaxarr)) {
			return false;
		} else {
			ajaxarr.push(targeturl);
		}
		aj.targeturl = targeturl;
		aj._sendstring = sendstring;
		aj._xmlhttp_request.onreadystatechange = aj._processhandle;
		aj._resulthandle = _resulthandle;
		aj._xmlhttp_request.open('POST', targeturl);
		aj._xmlhttp_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		aj._xmlhttp_request.send(aj._sendstring);
	}
	return aj;
}

var evalscripts = new Array();
function _evalscript(s) {
	if(s.indexOf('<script') == -1) return s;
	var p = /<script[^\>]*?src=\"([^\>]*?)\"[^\>]*?(reload=\"1\")?(?:charset=\"([\w\-]+?)\")?><\/script>/ig;
	var arr = new Array();
	while(arr = p.exec(s)) _appendscript(arr[1], '', arr[2], arr[3]);
	p = /<script (?!src)[^\>]*?( reload=\"1\")?>([^\x00]+?)<\/script>/ig;
	while(arr = p.exec(s)) _appendscript('', arr[2], arr[1]);
	return s;
}

function _appendscript(src, text, reload, charset) {
	var id = hash(src + text);
	if(!reload && in_array(id, evalscripts)) return;
	if(reload && $(id)) {
		$(id).parentNode.removeChild($(id));
	}

	evalscripts.push(id);
	var scriptNode = document.createElement("script");
	scriptNode.type = "text/javascript";
	scriptNode.id = id;
	scriptNode.charset = charset;
	try {
		if(src) {
			scriptNode.src = src;
		} else if(text){
			scriptNode.text = text;
		}
		$('supevbox').appendChild(scriptNode);
	} catch(e) {}
}

function _stripscript(s) {
	s = unescape(s);
	return s.replace(/<script.*?>.*?<\/script>/ig, '');
}

/*
 *@ url: 需求请求的 url
 *@ id : 显示的 id
 *@ _waiting: 等待的 id，默认为显示的 id，如果 _waiting 为空字符串，则不显示 loading...， 如果为 null，则在 showid 区域显示
 *@ linkid: 是哪个链接触发的该 ajax 请求，该对象的属性(如 ajaxdisplay)保存了一些 ajax 请求过程需要的数据。
 *@ recall:　回调函数
*/
function aj_load(url, oshowid, force, loading) {



	force = empty(force) ? false : force;
	if(force == false && in_array(url, ajsetarr)) {
		return false;
	} else {
		ajsetarr.push(url);
	}

	var x = new ajax_cls();
	var oshow = $(oshowid);
	var autogoto = 0;

	loading = empty(loading) ? 'loading...' : loading;
	oshow.innerHTML = '<span class="info"><img src="'+jsenv['THEME_PATH']+'res/loading.gif"> ' + loading + '</span>';

	x.oshow = oshow;

	if(url.substr(strlen(url) - 1) == '#') {
		url = url.substr(0, strlen(url) - 1);
		autogoto = 1;
	}

	var url = url + '&inajax=1&ajaxtarget=' + oshow.id;

	x.get(url, function(s, x) {
		if(_ajaxshow(s)) {
			return;
		}
		_evalscript(s);
		s = _stripscript(s);
		_sinnerHTML(x.oshow, s);
		_ajaxupdateevents(x.oshow);
		if(autogoto) {
			scroll(0, x.oshow.offsetTop);
		}
	});
}

function aj_send(url) {
	var x = new ajax_cls();
	x.get(url, function(s, x){
		if(_ajaxshow(s)) {
			return;
		}
		_evalscript(s);
		s = _stripscript(s);
	});
}

/**
* 设置Tab
*/
function aj_settab(cur, tabs_label, e) {
	if(isset(e)) {
		doane(e);
	}

	ocur = $(cur);
	ocur_btn = $(cur+'_btn');

	eval('var tabs='+tabs_label);

	var l = tabs.length;

	for(i = 0;  i < l; i++) {
		$(tabs[i]+'_btn').className="sep";
		$(tabs[i]).style.display = 'none';
	}

	ocur.style.display = '';
	ocur_btn.className = 'purple';
	ocur_btn.blur();


	aj_load(ocur_btn.href, cur);

}

function aj_list(e, obj) {
	doane(e);

	var ajaxd = obj.getAttribute('ajax');
	var url = obj.href + '&inajax=1';
	var tmpdiv = obj.id + '_ajax';
	if(ajaxd == 0) {
		aj_get(url, $(tmpdiv), $(tmpdiv));
		obj.setAttribute('ajax', 1);
	} else {
		hide($(tmpdiv), 'auto');
	}
}

/*
var ajaxpostHandle = Array();
//note id 为 menuid

function aj_form(formid, showid, waiting, insert) {
	waiting = empty(waiting) ? showid : waiting;
	show_waiting($(showid), true, waiting);
	insert = empty(insert) ? 0 : insert;
	if(ajaxpostHandle != 0) {
		return false;
	}

	var ajaxframeid = 'ajaxframe';
	var ajaxframe = $(ajaxframeid);

	//note 避免重复创建iframe，判断IFRAME对象是否存在
	if(ajaxframe == null) {
		if (browser.name == 'ie' && browser.name != 'opera') {
			ajaxframe = $c("<iframe name='" + ajaxframeid + "' id='" + ajaxframeid + "'></iframe>");
		} else {
			ajaxframe = $c("iframe");
			ajaxframe.name = ajaxframeid;
			ajaxframe.id = ajaxframeid;
		}
		//ajaxframe.id = ajaxframeid;
		ajaxframe.style.display = 'none';
		$('supevbox').appendChild(ajaxframe);

	}
	$(formid).target = ajaxframeid;
	ajaxpostHandle = [showid, ajaxframeid, formid, $(formid).target, waiting, insert];
	if(ajaxframe.attachEvent) {
		ajaxframe.detachEvent ('onload', aj_form_response);
		ajaxframe.attachEvent('onload', aj_form_response);
	} else {
		document.removeEventListener('load', aj_form_response, true);
		ajaxframe.addEventListener('load', aj_form_response, false);
	}

	$(formid).submit();
}



function aj_form_response() {
	show_waiting($(ajaxpostHandle[0]), false, ajaxpostHandle[4]);

	if(browser.name == 'ie') {
		var s = $(ajaxpostHandle[1]).contentWindow.document.XMLDocument.text;
	} else {
		var s = $(ajaxpostHandle[1]).contentWindow.document.documentElement.textContent;
	}

	if(_ajaxshow(s)) {
		return;
	}
	_evalscript(s);
	s = _stripscript(s);

	if(ajaxpostHandle[5] == 1) {
		$(ajaxpostHandle[0]).innerHTML = s + $(ajaxpostHandle[0]).innerHTML;
	} else {
		$(ajaxpostHandle[0]).innerHTML = s;
	}

	setMenuPosition($(ajaxpostHandle[0]).ctrlid, 0);
	setTimeout("hideMenu()", 3000);

	if($(ajaxpostHandle[2])) {
		$(ajaxpostHandle[2]).target = ajaxpostHandle[3];
	}
	ajaxpostHandle = 0;
}
*/
/**
 * ajax菜单
 * e: 事件
 * ctrlid: 控件ID
 * timeout: 超时设置
 * callback: 回调函数
 * cache: 是否缓存
 * lifetime: 菜单持续时间
 * ismenu: 是否菜单
 * divclass: 样式表
 * optionclass: 样式表
*/

function aj_menu(e, ctrlid, timeout, callback, cache, lifetime, divclass, optionclass) {
	//判断菜单
	if(jsmenu['active'][0] && jsmenu['active'][0].ctrlkey == ctrlid) {
		doane(e);
		return;

	//判断浏览器兼容性
	} else if(browser.name == 'ie' && browser.version < 7 && document.readyState.toLowerCase() != 'complete') {
		return;

	}

	//show_waiting($(ctrlid), true);

	cache = empty(cache) ? 0 : cache;

	var div = $(ctrlid + '_menu');

	if(cache && div) {
		//show_waiting($(ctrlid), false);
		showMenu(ctrlid, true, 0, lifetime, timeout);
		if(callback) setTimeout(callback + '(' + ctrlid + ')', timeout);
		doane(e);
	} else {
		//如果不存在创建菜单
		var x = new ajax_cls();
		x.ctrlid = ctrlid;
		x.divclass = empty(divclass) ? 'popupmenu_popup' : divclass;
		if(empty(div)) {
			div = $c('div');
			div.ctrlid = x.ctrlid;
			div.id = ctrlid + '_menu';
			div.style.display = 'none';
			div.className = x.divclass;
			$('supevbox').appendChild(div);
		}
		var href = isset($(x.ctrlid).href) ? $(x.ctrlid).href : $(x.ctrlid).attributes['href'].value;
		x.div = div;
		x.cache = cache;

		x.optionclass = empty(optionclass) ? 'popupmenu_option' : optionclass;
		x.timeout = empty(timeout) ? 3000 : timeout;
		x.callback = empty(callback) ? '' : callback;
		x.lifetime = empty(lifetime) ? (x.timeout > 0 ? 0 : 3) : lifetime;

		x.get(href + '&inajax=1&ajaxmenuid='+x.ctrlid+'_menu',function(s, x) {
			//_evalscript(s);
			//s = _stripscript(s);
			if(_ajaxshow(s)) {
				return;
			}
			_evalscript(s);
			s = _stripscript(s);

			if(x.div) {
				x.div.innerHTML = '<div class="' + x.optionclass + '">' + s + '</div>';
			}

			showMenu(x.ctrlid, true, 0, x.lifetime, x.timeout);
			if(x.callback) {
				setTimeout(x.callback + '("' + x.ctrlid + '")', x.timeout);
			}
			if(!x.cache && x.lifetime != 3 && x.div.id) {
				setTimeout('$(\'supevbox\').removeChild($(\'' + x.div.id + '\'))', x.timeout);
			}

			//show_waiting($(x.ctrlid), false);
		});

		doane(e);
	}
}


function _sinnerHTML(oshow, s) {
	if(oshow.tagName != 'TBODY') {
		oshow.innerHTML = s;
	} else {
		while(oshow.firstChild) {
			oshow.firstChild.parentNode.removeChild(oshow.firstChild);
		}
		var div1 = $c('DIV');
		div1.id = oshow.id+'_div';
		div1.innerHTML = '<table><tbody id="'+oshow.id+'_tbody">'+s+'</tbody></table>';
		$('supevbox').appendChild(div1);
		var trs = div1.getElementsByTagName('TR');
		var l = trs.length;
		for(var i=0; i<l; i++) {
			oshow.appendChild(trs[0]);
		}
		var inputs = div1.getElementsByTagName('INPUT');
		var l = inputs.length;
		for(var i=0; i<l; i++) {
			oshow.appendChild(inputs[0]);
		}
		div1.parentNode.removeChild(div1);
	}
}

function _ajaxupdateevents(obj, tagName) {
	tagName = tagName ? tagName : 'A';
	var objs = obj.getElementsByTagName(tagName);
	for(k in objs) {
		var o = objs[k];
		_ajaxupdateevent(o);
	}
}

function _ajaxupdateevent(o) {
	if(typeof o == 'object' && o.getAttribute) {
		if(o.getAttribute('ajaxtarget')) {
			if(!o.id) {
				o.id = ('id' + Math.random() * 10).replace(/\./i, '');	//note 该标签唯一标识
			}
			var ajaxevent = o.getAttribute('ajaxevent') ? o.getAttribute('ajaxevent') : 'click';//note 默认为 click 事件
			var ajaxurl = o.getAttribute('ajaxurl') ? o.getAttribute('ajaxurl') : o.href;//note 默认为 click 事件
			_attachEvent(o, ajaxevent, newfunction('aj_load', ajaxurl, o.getAttribute('ajaxtarget'), o.getAttribute('ajaxwaitid'), o.getAttribute('ajaxloading'), o.getAttribute('ajaxdisplay')));
			if(o.getAttribute('ajaxfunc')) {
				o.getAttribute('ajaxfunc').match(/(\w+)\((.+?)\)/);
				_attachEvent(o, ajaxevent, newfunction(RegExp.$1, RegExp.$2));
			}
		}
	}
}

function _ajaxshow(s) {
	if(s.indexOf('ajaxshow()') != -1) {
		//ajaxshow();
		return true;
	}
	return false;
}



function getform(formName) {
	returnString = "";
	formElements = $(formName).elements;

	var first = true;

	for (var i=0; i< formElements.length; i++) {

		var e = formElements[i];
		if(e.name == null || e.name==""){
			continue;
		}
		if(e.type == "radio"){
			if(e.checked){//判断单选按钮是否被选中
				if(first == true){
					first = false;
					returnString += escape(e.name) + "=" + escape(e.value);
				}else{
					returnString += "&" + escape(e.name) + "=" + escape(e.value);
				}
			}
		}else{
			if(first == true){
				first = false;
				returnString += escape(e.name) + "=" + escape(e.value);
			}else{
				returnString += "&" + escape(e.name) + "=" + escape(e.value);
			}
		}
	}
	return returnString;
}

function aj_submit(formid, outid, insert, except, loading) {
	var x = new ajax_cls();
	var param = getform(formid);
	insert = empty(insert) ? 0 : insert;
	except = empty(except) ? '' : except;
	loading = empty(loading) ? false : true;
	x.outid = outid;
	if(loading == true) {
		loading = "<span class='info'><img src='"+jsenv['THEME_PATH']+"res/loading.gif'>loading...</span>";
	}
	var tmpinnerHTML = $(x.outid).innerHTML;
	if(isset(except)) {
		if(tmpinnerHTML.indexOf(except) != -1) {
			tmpinnerHTML = '';
		}
	}
	if(loading == true) {
		if(insert != 0) {
			$(x.outid).innerHTML = loading + tmpinnerHTML;
		} else {
			$(x.outid).innerHTML = loading;
		}
	}
	x.post($(formid).action, param, function(s, x) {
		if(!_ajaxshow(s)) {
			setMenuPosition($(x.outid).ctrlid, 0);
			setTimeout("hideMenu()", 3000);
			_evalscript(s);
			s = _stripscript(s);
			if(insert != 0) {
				$(x.outid).innerHTML = s + tmpinnerHTML;
			} else {
				$(x.outid).innerHTML = s;
			}
			_ajaxupdateevents($(x.outid));
		} else {
			_evalscript(s);
			//$(x.outid).innerHTML = $(x.outid).innerHTML;
		}
	});

	return false;
}