/** * 
 * * @version 1.0
 * @fileoverview 消息提示组件
 * 主要包括：警告框，询问框，可自定义窗口大小，同时窗口大小自适应，可设定点击确定或取消（或关闭）后执行的函数。
 */

var promptSkin="/08";
var rootEl=document.documentElement||document.body;
var style = document.createElement('link');
style.href = promptSkin+"/css/ymPrompt.css";
style.id="promptCss";
style.rel = "stylesheet";
style.type = "text/css";
document.getElementsByTagName('HEAD')[0].appendChild(style);
//获取对象
function $obj(id){
	return document.getElementById(id);
}
//获取对象的高度
function $height(obj){
	return parseInt(obj.style.height)||obj.offsetHeight;
}
function ymPrompt(name){
	this._bgAlpha=0.1;	//遮罩透明度
	this._bgAlphaColor="#000000";
	this._insName=name||"(new ymPrompt())";
	this._ok=0;	//点击了确定返回1，默认为0
	this._icon=null;	//消息类型的图标
	this._startDrag=false;
	//高宽
	this._width=380;
	this._height=200;
	//点击确定或取消分别执行的函数
	this._okFunc=null;
	this._cancelFunc=null;
	//确定取消按钮,如果当前的doOK不能执行则还原doOK或doCancel，防止出现错误或意外
	this._okBtn="<a onclick='javascript:tempPrompt.doOK()' id='okBtn' style='cursor:pointer' class='btnStyle'> "+queding+"</a>";
	this._cancelBtn="<a onclick='javascript:tempPrompt.doCancel()' id='cancelBtn' style='cursor:pointer' class='btnStyle'> "+quxiao+"</a>";
	//设定button类型，0什么都不显示，1为确定，2为取消，3为两者都显示
	this.setBtnByType=["",this._okBtn,this._cancelBtn,this._okBtn+""+this._cancelBtn];
}
//设定消息框的宽度
ymPrompt.prototype.setWidth=function(w){
	if(/\d/.test(w)&&w>=this._width){this._width=w;}
};
//设定消息框的高度
ymPrompt.prototype.setHeight=function(h){
	if(/\d/.test(h)&&h>=this._height){this._height=h;}
};
//设定点击确定或取消时执行的函数的名称，tp=1：点击确定时执行，tp=2：点击取消或关闭执行
ymPrompt.prototype.setFunc=function(func,tp){
	if(tp==1){
		this._okFunc=func;
	}
	if(tp==2){
		this._cancelFunc=func;
	}
};
//设定图标类型，提示，询问，错误，确认。。
ymPrompt.prototype.setIco=function(icon){
	this._icon=icon;
};
//弹出窗口
ymPrompt.prototype.alert=function(message,title){
	this._init();
	//this._createWin(title||"警告提示框",message,1);
	this._createWin(title||"",message,1);
};

//询问窗口，暂未实现
ymPrompt.prototype.prompt=function(msg,defaultValue){
	this._init();
	this._return=prompt(msg,defaultValue,3);
};

//确认窗口
ymPrompt.prototype.confirm=function(message,title){
	this._init();
	//this._createWin(title||"信息确认框",message,3);
	this._createWin(title||"",message,3);
};

//切换皮肤
ymPrompt.prototype.changeSkin=function(value){
	var tempPromptSkin=promptSkin.substring(0,promptSkin.lastIndexOf("/")+1)+value;
	var reg=new RegExp(promptSkin,"ig");
	try{
		$obj("promptWinContainer").innerHTML=$obj("promptWinContainer").innerHTML.replace(reg,tempPromptSkin)
	}catch(e){}
	$obj("promptCss").href=tempPromptSkin+"/style/ymPrompt.css";
	promptSkin=tempPromptSkin;
};

//弹出前的初始化
ymPrompt.prototype._init=function(){
	this._showMask();	//显示背景层
	this._toggleComponet(0);	//隐藏select
};
//关闭弹出框后的处理
ymPrompt.prototype._destory=function(){
	this._removeMask();	//隐藏背景层
	$obj("promptWinContainer").style.display="none";	//隐藏容器
	this._toggleComponet(1);		//显示select
};

//显示或隐藏select控件，0为隐藏，其他为显示（默认）
ymPrompt.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){}
};

//创建标题
ymPrompt.prototype._createTitle=function(title){
	var strTitle="<div style=\"cursor:move;width:100%;overflow:hidden\" onmousedown='"+this._insName+"._setDrag()' id=\"titleContainer\"><div style=\"float:left\" id=\"titleText\">"+title+"</div><div style=\"float:right\" id=\"titleCtrl\"><img src='"+promptSkin+"/images/close.gif' border='0' valign='absmiddle' style='cursor:pointer' onclick='"+this._insName+".doCancel()' /></div></div>";
	return strTitle;
};
/**
 * 拖动部分代码
 */
ymPrompt.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(event){
		var event=event||window.event;
		if(_self._startDrag){
			$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";
		}
	});
	//取消拖动
	addEvent("mouseup",function(){eval(insName+"._startDrag=false")});
};

//创建窗体
/**
 * 
 * @param {Object} title 标题
 * @param {Object} content 内容
 * @param {Object} btnType 按钮类型，确定为1，取消为2，两者都有为3，都无为0
 */
ymPrompt.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 过滤非字符串标题，转换换行符
	
	//第一次需要创建一个容器
	//总容器的样式
	
	if( navigator.userAgent.indexOf("Firefox") >= 1){
		outerStyle="position:absolute;top:50%;left:50%;margin-left:"+(-this._width/2+rootEl.scrollLeft)+"px;width:"+this._width+"px;margin-top:"+(-this._height/2+rootEl.scrollTop)+"px;height:"+this._height+"px;z-index:10001";
	}else{
		outerStyle="position:absolute;top:50%;left:50%;margin-left:"+(-this._width/2+rootEl.scrollLeft)+"px;width:"+this._width+"px;margin-top:"+(-this._height/2+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='"+promptSkin+"/images/close.gif' border='0' width='20' 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("+promptSkin+"/images/"+this._icon+") no-repeat 20px 50%'>&nbsp;</td><td id='winMiddleRight' width='3'></td></tr>";
		if(btnType){	//显示的按钮的类型
			content_div+="<tr><td height='70' 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("+promptSkin+"/images/"+this._icon+")";	//图标类型
	
	//显示消息容器
	$obj("promptWinContainer").style.cssText=outerStyle;	//居中定位消息框
	$obj("promptWinContainer").style.display="";	//显示容器
};
//显示遮罩层
ymPrompt.prototype._showMask=function(){
	//第一次需要创建一个蒙板层
	if(!$obj("promptShield")){
		var docHeight=((rootEl.clientHeight>rootEl.scrollHeight)?rootEl.clientHeight:rootEl.scrollHeight)+"px";
		var docWidth=((rootEl.clientWidth>rootEl.scrollWidth)?rootEl.clientWidth:rootEl.scrollWidth)+"px";
		var shieldStyle="position:absolute;top:0px;left:0px;width:"+docWidth+";height:"+docHeight+";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);
		}
	}
	//显示蒙板
	$obj("promptShield").style.display="";

	//禁止对页面的任何操作
	document.body.onselectstart = function(){return false};
	document.body.oncontextmenu = function(){return false};
};

//移除遮罩层
ymPrompt.prototype._removeMask=function(){
	//隐藏蒙板
	$obj("promptShield").style.display="none";
	document.body.onselectstart = function(){return true};
	document.body.oncontextmenu = function(){return true};
};
//点击确定
ymPrompt.prototype.doOK=function(){
	this._ok=1;
	this._destory();
	//点击确定时执行的函数
	if(this._okFunc){
		if(typeof this._okFunc=="function"){
			this._okFunc();
		}else{
			eval(this._okFunc+"()");
		}
	}
};
//点击取消
ymPrompt.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;
	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 ymPrompt("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||"消息提示框");
	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||"成功信息框");
	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||"错误信息框");
	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||"信息确认框");
	tempPrompt.confirm(message,title||"");
}
