/**
 * @fileoverview 消息提示组件
 * 主要包括：警告框，询问框，可自定义窗口大小，同时窗口大小自适应，可设定点击确定或取消（或关闭）后执行的函数。
 */
//获取对象
function $obj(id){
	return document.getElementById(id);
}
//获取对象的高度
function $height(obj){
	return parseInt(obj.style.height)||obj.offsetHeight;
}
//2007-9-14 判断文件路径，js自动获取并设定css路径
var __alert_jsPath=document.scripts[document.scripts.length-1].src.substring(0,document.scripts[document.scripts.length-1].src.lastIndexOf("/")+1);
var __alert_skin;	//保存用户设定皮肤
function alert(name){
	this._bgAlpha=0.3;	//遮罩透明度
	this._bgAlphaColor="#000000";
	this._insName=name||"(new alert())";
	this._ok=0;	//点击了确定返回1，默认为0
	this._icon=null;	//消息类型的图标
	this._startDrag=false;
	//高宽
	this._width=280;
	this._height=150;
	//点击确定或取消分别执行的函数
	this._okFunc=null;
	this._cancelFunc=null;
	//确定取消按钮,如果当前的doOK不能执行则还原doOK或doCancel，防止出现错误或意外
	//修改按钮类型为input（原来为a），便于控制且兼容性较好 2007-8-29
	this._okBtn="<input type='button' onclick='javascript:tempPrompt.doOK()' id='okBtn' style='cursor:pointer' class='btnStyle' value=' 确 定 ' />";
	this._cancelBtn="<input type='button'onclick='javascript:tempPrompt.doCancel()' id='cancelBtn' style='cursor:pointer' class='btnStyle' value=' 取 消 ' />";
	//设定button类型，0什么都不显示，1为确定，2为取消，3为两者都显示
	this.setBtnByType=["",this._okBtn,this._cancelBtn,this._okBtn+"&nbsp;&nbsp;"+this._cancelBtn];

	this._path=__alert_jsPath||""; //2007-9-14 根据js路径计算出css路径
	this._promptSkin=this._path+(__alert_skin||"alert");	//用户设定皮肤或默认皮肤
	this._rootEl=document.documentElement||document.body;	//根元素
	//页面的实际宽高
	this._docWidth=0;
	this._docHeight=0;
	this._addStyle();	//向页面添加样式表
}
//添加样式表
alert.prototype._addStyle=function(){
	if($obj("promptCss")) return true;	//只添加一次
	var __style = document.createElement('link');
	__style.href = this._promptSkin+"/style/alert.css";
	__style.id="promptCss";
	__style.rel = "stylesheet";
	__style.type = "text/css";
	document.getElementsByTagName('HEAD')[0].appendChild(__style);
}
//设定消息框的宽度
alert.prototype.setWidth=function(w){
	if(/\d/.test(w)&&w>=this._width){this._width=w;}
};
//设定消息框的高度
alert.prototype.setHeight=function(h){
	if(/\d/.test(h)&&h>=this._height){this._height=h;}
};
//设定点击确定或取消时执行的函数的名称，tp=1：点击确定时执行，tp=2：点击取消或关闭执行
alert.prototype.setFunc=function(func,tp){
	if(tp==1){
		this._okFunc=func;
	}
	if(tp==2){
		this._cancelFunc=func;
	}
};
//设定图标类型，提示，询问，错误，确认。。
alert.prototype.setIco=function(icon){
	this._icon=icon;
};
//弹出窗口
alert.prototype.alert=function(message,title){
	this._init();
	this._createWin(title||"警告提示框",message,1);
};

//询问窗口，暂未实现
alert.prototype.prompt=function(msg,defaultValue){
	this._init();
	this._return=prompt(msg,defaultValue,3);
};

//确认窗口
alert.prototype.confirm=function(message,title){
	this._init();
	this._createWin(title||"信息确认框",message,3);
};

//切换皮肤
alert.prototype.changeSkin=function(value){
	var tempPromptSkin=this._promptSkin.substring(0,this._promptSkin.lastIndexOf("/")+1)+value;
	var reg=new RegExp(this._promptSkin,"ig");
	try{
		$obj("promptWinContainer").innerHTML=$obj("promptWinContainer").innerHTML.replace(reg,tempPromptSkin)
	}catch(e){}
	$obj("promptCss").href=tempPromptSkin+"/style/alert.css";
	this._promptSkin=tempPromptSkin;
};

//弹出前的初始化
alert.prototype._init=function(){
	this._showMask();	//显示背景层
	this._toggleComponet(0);	//隐藏select
};
//关闭弹出框后的处理
alert.prototype._destory=function(){
	this._removeMask();	//隐藏背景层
	$obj("promptWinContainer").style.display="none";	//隐藏容器
	this._toggleComponet(1);		//显示select
};

//显示或隐藏select控件，0为隐藏，其他为显示（默认）
alert.prototype._toggleComponet=function(t,doc){
	var tempT=t;
	t=(t==0?"hidden":"visible");
	doc=doc||document;
	//2007-08-13 防止访问域外的iframe时出现拒绝访问的错误而导致程序终止
	try{
		var sels=doc.getElementsByTagName("select");
		for(var i=sels.length;i>0;i--){
			//保存其原隐藏显示属性
			if(!sels[i-1].getAttribute("oldVisible")){
				sels[i-1].setAttribute("oldVisible",sels[i-1].currentStyle.visibility);
			}
			//如果原来是隐藏则直接隐藏，如果是显示则判断原来的显隐状态并显示
			sels[i-1].style.visibility=(t=="hidden"?"hidden":(sels[i-1].getAttribute("oldVisible")||t));
		}
		var iframes=doc.frames;
		//递归判断
		for(var i=iframes.length;i>0;i--){
			this._toggleComponet(tempT,iframes[i-1].document);
		}
	}catch(e){}
};

/**
 * 拖动部分代码
 */
alert.prototype._setDrag=function(event){
	this._startDrag=true;
	this._startX=event.x||event.pageX;
	this._startY=event.y||event.pageY;
	this._containX=$obj("promptWinContainer").offsetLeft;
	this._containY=$obj("promptWinContainer").offsetTop;
	$obj("promptWinContainer").style.left=this._containX+"px";
	$obj("promptWinContainer").style.top=this._containY+"px";
	//由于弹出框居中使用了css hacks，所以在设定了其绝对的left和top后，之前的margin属性要清空。
	$obj("promptWinContainer").style.margin="0px";
	var insName=this._insName;
	var _self=this;
	//拖动
	addEvent("mousemove",function(){
		var event=window.event||arguments[0];	//修改获取event方法 2007-8-29
		if(_self._startDrag){
			//使用try用于防止拖出页面时出现的意外错误
			try{	
				$obj("promptWinContainer").style.left=(_self._containX+(event.x||event.pageX)-_self._startX)+"px";
				$obj("promptWinContainer").style.top=(_self._containY+(event.y||event.pageY)-_self._startY)+"px";
				//及时调整蒙板的高宽
				var tempVar1=parseInt($obj("promptWinContainer").style.left)<parseInt(_self._docWidth)-parseInt($obj("promptWinContainer").style.width);
				var tempVar2=parseInt($obj("promptWinContainer").style.top)<parseInt(_self._docHeight)-parseInt($obj("promptWinContainer").style.height);
				//回到页面内部则还原蒙板原宽高,否则动态扩大蒙板的宽高
				rootEl=_self._rootEl;
				if(tempVar1){
					$obj("promptShield").style.width=_self._docWidth;
				}else{
					$obj("promptShield").style.width=((rootEl.clientWidth>rootEl.scrollWidth)?rootEl.clientWidth:rootEl.scrollWidth)+"px";
				}
				if(tempVar2){
					$obj("promptShield").style.height=_self._docHeight;
				}else{
					$obj("promptShield").style.height=((rootEl.clientHeight>rootEl.scrollHeight)?rootEl.clientHeight:rootEl.scrollHeight)+"px";
				}
			}catch(e){}
		}
	});
	//取消拖动
	addEvent("mouseup",function(){eval(insName+"._startDrag=false")});
};
//创建窗体
/**
 * 
 * @param {Object} title 标题
 * @param {Object} content 内容
 * @param {Object} btnType 按钮类型，确定为1，取消为2，两者都有为3，都无为0
 */
alert.prototype._createWin=function(title,content,btnType){
	title=typeof(title)=="string"?title:"";	//2007-8-10 过滤非字符串标题
	content=typeof(content)=="string"?content.replace(/\n/g,"<br>"):"";	//2007-8-10 过滤非字符串标题，转换换行符
	
	//第一次需要创建一个容器
	//总容器的样式
	outerStyle="position:absolute;top:50%;left:50%;margin-left:"+(-this._width/2+this._rootEl.scrollLeft)+"px;width:"+this._width+"px;margin-top:"+(-this._height/2+this._rootEl.scrollTop)+"px;height:"+this._height+"px;z-index:10001";
	if(!$obj("promptWinContainer")){
		//标题容器层
		var title_div="<div style=\"cursor:move;width:100%;overflow:hidden\" onmousedown='"+this._insName+"._setDrag(event)' id=\"titleContainer\"><div style=\"float:left\" id=\"titleText\">&nbsp;</div><div style=\"float:right\" id=\"titleCtrl\"><img src='"+this._promptSkin+"/images/close.gif' border='0' valign='absmiddle' style='cursor:pointer' onclick='tempPrompt.doCancel()' /></div></div>";
		//内容容器层
		var content_div="<div style='width:100%;overflow:visible' id='promptContent'><table cellpadding=0 cellspacing=0 border=0 style='margin:0px;padding:0px' align=center width='100%' height='100%' id='promptContentTable'><tr><td id='winMiddleLeft' width='3'></td><td id='winMiddleCenter' style='background:url("+this._promptSkin+"/images/"+this._icon+") no-repeat 20px 50%'>&nbsp;</td><td id='winMiddleRight' width='3'></td></tr>";
		if(btnType){	//显示的按钮的类型
			content_div+="<tr><td height='30' id='winBtnLineLeft'></td><td align='center' id='winBtnLineCenter'>&nbsp;</td><td id='winBtnLineRight'></td></tr>";
		}
		content_div+="<tr><td id='winBottomLeft' height='3'></td><td id='winBottomCenter'></td><td id='winBottomRight'></td></tr></table></div>";
		var outContainer=document.createElement("div");
		outContainer.setAttribute("style",outerStyle);
		outContainer.id="promptWinContainer";
		outContainer.innerHTML=title_div+content_div;
		document.body.appendChild(outContainer);

		//设定内容区的高度
		$obj("promptContent").style.height=(this._height-$obj("titleContainer").offsetHeight)+"px";
		//内容区的高度,对于xhtml页面必须有下面三行
		var contentHeight=$height($obj("promptContent"))-$height($obj("winBottomLeft"));
		if($obj("winBtnLineLeft")){contentHeight-=$height($obj("winBtnLineLeft"))}
		$obj("winMiddleCenter").style.height=contentHeight+"px";
	}
	//传入标题和内容
	$obj("titleText").innerHTML=title;	//标题
	$obj("winMiddleCenter").innerHTML=content;	//内容
	$obj("winBtnLineCenter").innerHTML=this.setBtnByType[btnType];	//更新按钮类型
	$obj("winMiddleCenter").style.backgroundImage="url("+this._promptSkin+"/images/"+this._icon+")";	//图标类型
	
	//显示消息容器
	$obj("promptWinContainer").style.cssText=outerStyle;	//居中定位消息框
	$obj("promptWinContainer").style.display="";	//显示容器
};
//显示遮罩层
alert.prototype._showMask=function(){
	//第一次需要创建一个蒙板层
	if(!$obj("promptShield")){
		var shieldStyle="position:absolute;top:0px;left:0px;width:0;height:0;background:"+this._bgAlphaColor+";text-align:center;z-index:10000;filter:alpha(opacity="+(this._bgAlpha*100)+");opacity:"+this._bgAlpha+";";
		try{
			document.body.appendChild(document.createElement("<div id='promptShield' style=\""+shieldStyle+"\"></div>"));
		}catch(e){
			var promptShield=document.createElement("div");
			promptShield.id="promptShield";
			promptShield.setAttribute("style",shieldStyle);
			document.body.appendChild(promptShield);
		}
	}
	
	//计算蒙板的高宽，因为页面内容可能变化，所以每次弹出都应该更新宽高 2007-9-2
	var rootEl=this._rootEl;
	this._docHeight=((rootEl.clientHeight>rootEl.scrollHeight)?rootEl.clientHeight:rootEl.scrollHeight)+"px";
	this._docWidth=((rootEl.clientWidth>rootEl.scrollWidth)?rootEl.clientWidth:rootEl.scrollWidth)+"px";
	$obj("promptShield").style.width=this._docWidth;
	$obj("promptShield").style.height=this._docHeight;
	//显示蒙板
	$obj("promptShield").style.display="";			

	//禁止对页面的任何操作
	document.body.onselectstart = function(){return false};
	document.body.oncontextmenu = function(){return false};
};

//移除遮罩层
alert.prototype._removeMask=function(){
	//隐藏蒙板
	$obj("promptShield").style.display="none";
	document.body.onselectstart = function(){return true};
	document.body.oncontextmenu = function(){return true};
};
//点击确定
alert.prototype.doOK=function(){
	this._ok=1;
	this._destory();
	//点击确定时执行的函数
	if(this._okFunc){
		if(typeof this._okFunc=="function"){
			this._okFunc();
		}else{
			eval(this._okFunc+"()");
		}
	}
};
//点击取消
alert.prototype.doCancel=function(){
	this._ok=0;
	this._destory();
	//点击取消或关闭时执行的函数
	if(this._cancelFunc){
		if(typeof this._cancelFunc=="function"){
			this._cancelFunc();
		}else{
			eval(this._cancelFunc+"()");
		}
	}
};
//绑定事件的函数
function addEvent(env,fn){
	var ua=navigator.userAgent.toLowerCase(); 
	var opera=ua.indexOf("opera")!=-1; 
	var ie=ua.indexOf("msie")!=-1&&(document.all&&!opera); 
	if(ie){
		document.attachEvent("on"+env,fn);
	}else{
		document.addEventListener(env,fn,false);
	}
};

//弹出消息框时监听键盘事件
addEvent("keydown",function(){
	//无弹出框或弹出框隐藏则不屏蔽操作
	if(!$obj("promptWinContainer")||$obj("promptWinContainer").style.display=="none") return true;
	$obj("okBtn").focus();	//使确定按钮获取焦点 2007-8-29
	var event=window.event||arguments[0];
	//点击回车关闭提示框
	if(event.keyCode==13){
		tempPrompt.doOK();
		return false;
	}
	//屏蔽tab键和空格键
	if(event.keyCode==9||event.keyCode==32){
		return false;
	}
});

/**
 * 提供简易的操作接口
 */
var tempPrompt;
//各消息框的相同操作
function initPromptInfo(width,height,func1,func2){
	tempPrompt=tempPrompt||new alert("tempPrompt");
	tempPrompt.setWidth(width);
	tempPrompt.setHeight(height);
	tempPrompt.setFunc(func1,1);
	tempPrompt.setFunc(func2,2);
}
function Alert(message, width, height, title,func1,func2) {
	initPromptInfo(width,height,func1,func2);
	tempPrompt.setIco("info.gif");
	tempPrompt.alert(message,title||"消息提示框");
}

function SucceedInfo(message, width, height, title,func1,func2) {
	initPromptInfo(width,height,func1,func2);
	tempPrompt.setIco("right.gif");
	tempPrompt.alert(message,title||"成功信息框");
}

function ErrorInfo(errorMessage, width, height, title,func1,func2) {
	initPromptInfo(width,height,func1,func2);
	tempPrompt.setIco("err.gif");
	tempPrompt.alert(errorMessage,title||"错误信息框");
}

function ConfirmInfo(message, width, height, title,func1,func2) {
	initPromptInfo(width,height,func1,func2);
	tempPrompt.setIco("ask.gif");
	tempPrompt.confirm(message,title||"信息确认框");
}