/**
 * @author yanwei
 * @date 2007-8-9
 * @version 1.0
 * @fileoverview 消息提示组件
 * 主要包括：警告框，询问框，可自定义窗口大小，同时窗口大小自适应，可设定点击确定或取消（或关闭）后执行的函数。

 */

var promptSkin="bluebar";
promptSkin = "../../js/" + promptSkin;
var rootEl=document.documentElement||document.body;
var style = document.createElement('link');
style.href = promptSkin+"/style/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.8;	//遮罩透明度

	this._bgAlphaColor="#888888";
	this._insName=name||"(new ymPrompt())";
	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，防止出现错误或意外
	this._okBtn="<div style='border:0px solid #000; float:left; width:100%; height:25px;_height:0px;_height:0px;background:#BBD4F6;'><a onclick='javascript:tempPrompt.doOK()' id='okBtn' style='cursor:pointer' class='btnStyle' > 确 定 </a></div>";
	this._cancelBtn="<a onclick='javascript:tempPrompt.doCancel()' id='cancelBtn' style='cursor:pointer' class='btnStyle'> 取 消 </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);
};

//询问窗口，暂未实现

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);
};

//切换皮肤
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($obj("promptWinContainer"),"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(document,"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 过滤非字符串标题，转换换行符
	
	//第一次需要创建一个容器

	//总容器的样式
	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' 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='30' id='winBtnLineLeft' width=100></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(obj, type, fn ) {
	if (obj.addEventListener)  
     obj.addEventListener( type, fn, false );  
  else if (obj.attachEvent) {  
     obj["e"+type+fn] = fn;  
     obj.attachEvent( "on"+type, function() { obj["e"+type+fn](); } );  
  }  
};

//弹出消息框时监听键盘事件
addEvent(document,"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||"消息提示框");
}

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||"信息确认框");
}

function msg(boxtitle,boxtype,boxwidth,msg,url){
	var ie = (navigator.appName.indexOf('Microsoft') != -1) ? true : false;
	if(ie)
	{
		if (document.readyState != "complete")
			setTimeout("msg('"+boxtitle+"','"+boxtype+"','"+boxwidth+"','"+msg+"','"+url+"')",500);
		else
		{
			//setTimeout('Alert("'+msg+'",'+ null+','+ null+',"'+ boxtitle+'","window.location.href=\''+url+'\'","window.location.href=\''+url+'\'");',100);
			setTimeout('Alert("'+msg+'",'+ null+','+ null+',"'+ boxtitle+'","window.location.href=\''+url+'\'",";");',100);
		}
	}
	else
	{
		//setTimeout('Alert("'+msg+'",'+ null+','+ null+',"'+ boxtitle+'","window.location.href=\''+url+'\'","window.location.href=\''+url+'\'");',100);
		setTimeout('Alert("'+msg+'",'+ null+','+ null+',"'+ boxtitle+'","window.location.href=\''+url+'\'",";");',100);
	}
}

function msg2(boxtitle,boxtype,boxwidth,msg,url){
	var ie = (navigator.appName.indexOf('Microsoft') != -1) ? true : false;
	if(ie)
	{
		if (document.readyState != "complete")
			setTimeout("msg2('"+boxtitle+"','"+boxtype+"','"+boxwidth+"','"+msg+"','"+url+"')",500);
		else
		{
			if(url)
				setTimeout('Alert("'+msg+'",'+ null+','+ null+',"'+ boxtitle+'","window.parent.parent.location.href=\''+url+'\'",";");',100);
			else
				setTimeout('Alert("'+msg+'",'+ null+','+ null+',"'+ boxtitle+'",";",";");',100);
		}
	}
	else
	{
		if(url)
			setTimeout('Alert("'+msg+'",'+ null+','+ null+',"'+ boxtitle+'","window.parent.parent.location.href=\''+url+'\'",";");',100);
		else
			setTimeout('Alert("'+msg+'",'+ null+','+ null+',"'+ boxtitle+'",";",";");',100);
	}
}


