// 为 mootools 的 Element 增加 show() 和 hide() 方法
Element.extend({
	visible: function() {
		return this.style.display != 'none';
	},

	toggle: function() {
		this.visible() ? this.hide() : this.show();
	},

	hide: function(element) {
		this.style.display = 'none';
	},

	show: function(element) {
		this.style.display = '';
	}
});

// 解析出字符串中的 <script> .... </script> 代码，并执行解析出来的 JavaScript
var $eval = function(str){
	var script, scripts;
	scripts = [];
	var regexp = /<script[^>]*>([\s\S]*?)<\/script>/gi;
	while (script = regexp.exec(str)) scripts.push(script[1]);
	scripts = scripts.join('\n');
	if (scripts) (window.execScript) ? window.execScript(scripts) : window.setTimeout(scripts, 0);
}

/**
 * iAction 为客户端动作对象，将常用的 JavaScript 代码封装成 action。
 * 可通过传递 JSON 格式的动作参数给相应方法，执行动作。
 * 如：iaction.forward({url: 'http://www.phpjobs.cn'});
 *
 * @author Nio Xiao
 */
var iAction = {
	id_notice: 'notice', //存放提示信息的 DOM 元素 id
	id_modal: 'modal_window', //Modal 窗口的 DOM id
	id_modal_cover: 'modal_cover', //Modal 窗口的背景屏蔽 div 的 DOM id

	/**
	 * 弹出对话框。
	 * action.content：对话框中的内容。
	 */
	alert: function(action){
		var content = action.content;
		alert(content);	
	},
	
	/**
	 * 刷新当前页面。
	 */
	refresh: function(action){
		window.location.reload();
	},
	
	/**
	 * 跳转到其它页面。
	 * action.url：跳转的目标页面 URL。
	 */
	forward: function(action){
		window.location.href = action.url || null;
	},
	
	/**
	 * 执行 JavaScript 代码。
	 * action.js：想要执行的 JavaScript 代码。
	 */
	js: function(action){
		eval(action.js || null);
	},
	
	/**
	 * 更新 DOM 中某个元素的 HTML 内容。
	 * action.id     ：需要更新的元素 id；
	 * action.html   ：想要放入更新元素中的新的 HTML 内容，可包含 JavaScript；
	 * action.animate：是否使用动态效果。
	 */
	update: function(action){
		var obj  = $(action.id);
		var html = action.html;
		if (!obj) throw '未找到 action 中 id 所指的 DOM 元素，请确定 id 是否正确。';
		if (action.animate) { //是否使用动态效果
			var fx = new Fx.Style(obj, 'opacity', {duration:500}).set(0);
			obj.empty().setHTML(html);
			fx.start(0, 1);
		} else {
			obj.empty().setHTML(html);
		}
		$eval(html); //执行 HTML 里边包含的 JavaScript 代码
	},
	
	/**
	 * 替换 DOM 中某个元素的 HTML 内容。
	 * action.id     ：需要替换的元素 id；
	 * action.html   ：用于替换的 HTML 内容，可包含 JavaScript；
	 * action.animate：是否使用动态效果。
	 */
	replace: function(action){
		var html = action.html;

		var el_old = $(action.id);
		if (!el_old) throw '未找到 action 中 id 所指的 DOM 元素，请确定 id 是否正确。';
		
		// 如果只有一个元素，则使用此元素作为最顶层，否则外层封装一个 div
		var el_new = new Element('div');
		el_new.setHTML(html);
		var children = el_new.getChildren();
		if (children.length == 1) el_new = children[0];
		
		if (action.animate) { //是否使用动态效果
			var fx = new Fx.Style(el_new, 'opacity', {duration: 1000}).set(0);
			el_old.replaceWith(el_new);
			fx.start(0, 1);
		} else {
			el_old.replaceWith(el_new);
		}		
		$eval(html); //执行 HTML 里边包含的 JavaScript 代码
	},
		
	/**
	 * 显示提示信息，并在显示之后自动隐去消失。
	 * action.content：提示信息的内容。
	 */
	notice: function(action){
		var el = null;
		
		if (!(el = $(this.id_notice))) {
			el = new Element('div', {'id': this.id_notice});
			el.injectInside($E('body'));
		}
		el.empty().setHTML(action.content);
		new Fx.Style(el, 'opacity').set(1);
		el.show();
		setTimeout(function(){ new Fx.Style(el, 'opacity', {duration: 2000}).set(1).start(1, 0); }, 3000);
	},
	
	show: function(action){
		var el = null;
		
		if (!(el = $(this.id_notice))) {
			el = new Element('div', {'id': this.id_notice});
			el.injectInside($E('body'));
		}
		el.empty().setHTML(action.content);
		new Fx.Style(el, 'opacity').set(1);
		el.show();
		//setTimeout(function(){ new Fx.Style(el, 'opacity', {duration: 2000}).set(0).start(1, 0); }, 300000);
	},
		

	/**
	 * 显示 modal 窗口。
	 * command.title：窗口的标题；
	 * command.width：窗口的宽度；
	 * command.html ：窗口中显示的内容。
	 */
	showModal: function(action){		
		var el = null;
		var html = action.html;
		
		//首先关闭已有窗口（如果存在的话）
		this.closeModal();
		
		//隐藏一些无法覆盖的元素，如 flash、select 选择框等
		$$('object').hide();
		$$('embed').hide();
		$$('select').hide();
	
		if (!(el = $(this.id_modal))) {
			el = new Element('div', {'id': this.id_modal});
			el.hide();
			el.injectInside($E('body'));
		}
		var body = 	'<div id="modal_header">' +
						'<div id="modal_title">' + action.title + '</div>' +
						'<div id="modal_close_button" onclick="iAction.closeModal();">&nbsp;</div>' +
					'</div>' + 
					'<div id="modal_body">' + html + '</div>' +
					'<div id="modal_footer">' + '<!--<span class="tip">按“ESC”键可快捷关闭窗口</span>-->' + '</div>';
		el.empty().setHTML(body);
		el.show();
		el.addClass('xbox');
		el.setStyles({
			'z-index': '3102',
			'width': action.width || '655px',
			'position': 'absolute',
			'background-color': 'white'
		});
				
		var width = document.body.offsetWidth;
		var height = document.body.offsetHeight;
		var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
		var left = (width - el.offsetWidth)/2 + 'px';
		var top = $defined(action.top) ? (scrollTop + parseInt(action.top)) : (scrollTop + 100) + 'px';
		
		el.setStyles({
			'left': left,
			'top': top
		});
		
		var scrollHeight = document.body.scrollHeight || document.documentElement.scrollHeight;
		var cover = new Element('div', {'id': this.id_modal_cover});
		cover.setStyles({
			'background': 'black',
			'opacity': '.50',
			'width': '100%',
			'height': scrollHeight,
			'position': 'absolute',
			'top': '0px',
			'left': '0px',
			'z-index': '3000'
		});
		cover.injectInside($E('body'));

		$$('body').addEvent('keypress', function(event){
			event = new Event(event);
			if (event.key == 'esc') {
				//if (confirm('确实想要关闭窗口？')) {
					this.closeModal();				
				//}			
			}	
		}.bind(this));
		
		$eval(html); //执行 HTML 里边包含的 JavaScript 代码
	},
	
	/**
	 * 关闭 modal 窗口。
	 */
	closeModal: function(){	
		if (!$(this.id_modal)) return;
		$(this.id_modal).hide();
		if ($(this.id_modal_cover)) $(this.id_modal_cover).remove();
		//恢复之前无法覆盖的 DOM 元素
		$$('object').show();
		$$('embed').show();
		$$('select').show();
		$$('body').removeEvents('keypress');		
	}
	
}
