/**
 * ymPrompt.js Ï¢Ê¾
 * @author netman8410@163.com
 */

var ymPrompt={
    version:'2.01',
    pubDate:'2008-07-21',
	show:function(args){this.initCallCfg=args}
};

//ÊµÖ¶Ì³
ymPrompt.apply = function(o, c, defaults){
	if(defaults){
        ymPrompt.apply(o, defaults);
    }
    if (o && c && typeof c == 'object') {
        for (var p in c) {
            o[p] = c[p]
        }
    }
    return o;
};

(function(){
	var d=document,db=d.body,y=ymPrompt;
	//ÎªÔªØ°Â¼Äº
    var addEvent=function(env,fn,obj){
    	obj=obj||d;	//Ä¬document
    	isIE?obj.attachEvent('on'+env,fn):obj.addEventListener(env,fn,false);
    };
	//Ð¶
	var browser=function(s){return navigator.userAgent.toLowerCase().indexOf(s)!=-1}; 
	var isOpera=browser('opera'),isIE=browser('msie')!=-1&&(d.all&&!isOpera);
	//È´Ò³
	if(!db||(typeof db!='object')){
		return addEvent('load',arguments.callee,window);
	}
	//html DoctypeÈ¡htmlÚµã£¬Ô¼Ý·xhtmlÒ³
	var rootEl=d.compatMode=='CSS1Compat'?d.documentElement:db;	//Ôª

    //Ãº,cÎªÔªØ»
    var c={},$=function(id){
		var cc=c[id];
		return cc&&cc.parentNode?cc:c[id]=d.getElementById(id)
	};
    var $height=function(obj){return parseInt(obj.style.height)||obj.offsetHeight};    //È¡ÔªØ¸ß¶
    //ÎªÔªcssobj:ÒªcssÄ¶css:cssÄ±,append:×·Ó»Ç¸Ç£Ä¬Ï¸
    var addCSS=function(obj,css,append){
    	!append?(isOpera?obj.setAttribute('style',css):obj.style.cssText=css):(isOpera?obj.setAttribute('style',obj.getAttribute('style')+css):obj.style.cssText+=css);
    }
    
    //Ï¢Ê±Â¼
    var btnIndex=0,listenKeydown=function(){
    	//Þµòµ¯³Î²
    	if(!btnCache||!$('promptWinContainer')||$('promptWinContainer').style.display=='none') return true;
    	var ev=window.event||arguments[0],l=btnCache.length;
		if(l==1){	//Ò»Å¥Í²é·³
			$(btnCache[0].id).focus();
		}else{
			var forward=function(){return $(btnCache[++btnIndex<l?btnIndex:(btnIndex=0)].id)};//Ò»Å¥
			var backward=function(){return $(btnCache[--btnIndex<0?(btnIndex=l-1):btnIndex].id)}//Ç°Ò»Å¥
    		//tab/Ò·Ð»
    		if(ev.keyCode==9||ev.keyCode==39){forward().focus()}
    		if(ev.keyCode==37){backward().focus()}
		}
    	if(ev.keyCode==13)return true;	//Ø³
    	//Ð¼Ì²Ë¢Âµ
    	try{
    		ev.keyCode=0;
    		ev.cancelBubble=true;
    		ev.returnValue=false;
    	}catch(e){
    		try{	//2007-11-13 IEevent.keycode=0Ö´Ð³×ªË´í£¬Ê±try..catch
    			ev.stopPropagation();
    			ev.preventDefault();
    		}catch(e){}
    	}
    }
    
    //Å¥Â¼id
	var btnCache,seed=0;
	//É°Å¥Äº
	var mkBtn=function(txt,sign,id){
		id=id||'ymPrompt_btn_'+seed++;
		return {
			id:id,
			html:"<input type='button' id='"+id+"' onclick='ymPrompt.doHandler(\""+sign+"\")' style='cursor:pointer' class='btnStyle' value='"+txt+"' />"
		};
	}
    var okBtn=mkBtn(' OK ','ok'), cancelBtn=mkBtn(' Cancel  ','cancel');
	//É°Å¥Ïµhtml
	var useBtn=function(btn){
		if(!btn) return btnCache=null;
		if(!(btn instanceof Array))btn=[btn];
		btnCache=btn;
		var html=[];
		for(var i=0;i<btn.length;i++){
			html.push(btn[i].html);
		}
		return html.join('&nbsp;&nbsp;');
	}
    //Ã¿Í¼ÒªÄ°Å¥
    var btnMap={alert:okBtn,succeed:okBtn,error:okBtn,confirm:[okBtn,cancelBtn]};

    //Ê¼
    var init=function(){
        showMask();	//Ê¾
        createWin();
    } 
    //
    var destory=function(){
        hiddenMask();	//Ø±
	    $('promptWinContainer').style.display='none';	//
    }
    //Ö²
    var showMask=function(){
	    //Ò»ÒªÒ»É°
	    if(!$('maskLevel')){
    		var shieldStyle='position:absolute;top:0px;left:0px;width:0;height:0;background:'+y.maskAlphaColor+';text-align:center;z-index:10000;filter:alpha(opacity='+(y.maskAlpha*100)+');opacity:'+y.maskAlpha;
    		try{	//IE
    			db.appendChild(d.createElement("<div id='maskLevel' style=\'"+shieldStyle+"\'></div>"));
    			db.appendChild(d.createElement("<iframe id='maskIframe'></iframe>"));
    		}catch(e){
    			var promptShield=d.createElement('div');
    			promptShield.id='maskLevel';
    			promptShield.setAttribute('style',shieldStyle);
    			db.appendChild(promptShield);
    			promptShield=null;
    		}
    	}
    	//É°Ä¸ß¿í£¬ÎªÒ³Ý¿Ü±ä»¯Ã¿ÎµÓ¦Ã¸Â¿
    	$('maskLevel').style.display='none';	//Ê¾Ø±ÚºÒ³Ä¸ß¿
    	//Ê¹scrollTopscrollWidthÐ¶Ç·Ð¹×¼È·Òªonscroll,Ò»scrollTopscrollLeftÊ¹scrollWidth/Height
    	$('maskLevel').style.width=(rootEl.scrollLeft==0?rootEl.clientWidth:rootEl.scrollWidth)+"px";
    	$('maskLevel').style.height=(rootEl.scrollTop==0?rootEl.clientHeight:rootEl.scrollHeight)+"px";
    
    	//2007-11-15 IframeÖ£IEÂ²Å»Iframe
    	var maskIframe=$('maskIframe');
    	if(maskIframe){
    		addCSS(maskIframe,$('maskLevel').style.cssText+';z-index:9999;filter:alpha(opacity=0);opacity:0');
    		maskIframe.style.display='';
    	}
    	//Ê¾É°
    	$('maskLevel').style.display='';		
    	//Ö¹Ò³ÎºÎ²
    	db.onselectstart = function(){return false};
    	db.oncontextmenu = function(){return false};
    };

    //Ö²
    var hiddenMask=function(){
    	$('maskLevel').style.display='none';
    	if($('maskIframe')){$('maskIframe').style.display='none'};
    	db.onselectstart = function(){return true};
    	db.oncontextmenu = function(){return true};
    };
    //Ê¼Ï¶
    var setDrag=function(){
        var event=window.event||arguments[0];
        setDrag.startDrag=true;
    	setDrag.startX=event.x||event.pageX;
    	setDrag.startY=event.y||event.pageY;
    	setDrag.containX=$("promptWinContainer").offsetLeft;
    	setDrag.containY=$("promptWinContainer").offsetTop;
    };
    addEvent("mousemove",function(){
		if(setDrag.startDrag){
			var event=window.event||arguments[0];
			try{
				$("promptWinContainer").style.left=(setDrag.containX+(event.x||event.pageX)-setDrag.startX)+"px";
				$("promptWinContainer").style.top=(setDrag.containY+(event.y||event.pageY)-setDrag.startY)+"px";
			}catch(e){}
		}
	});
    //È¡Ï¶
    addEvent("mouseup",function(){setDrag.startDrag=false});
    
    //
    var createWin=function(){
    	//Ò»ÒªÒ»
    	//Ê½
    	outerStyle='position:absolute;left:'+((rootEl.clientWidth-y.width)/2+rootEl.scrollLeft)+'px;width:'+y.width+'px;top:'+((rootEl.clientHeight-y.height)/2+rootEl.scrollTop)+'px;height:'+y.height+'px;z-index:10001';
    	if(!$('promptWinContainer')){
    		//
    		var title_div="<div style=\'cursor:move;width:100%;overflow:hidden\' id=\'titleContainer\'><div style=\'float:left\' id=\'titleText\'>&nbsp;</div><div style=\'float:right\' id=\'titleCtrl\'><div class='ymPrompt_close' onclick='ymPrompt.doHandler(\"close\")'>&nbsp;</div></div></div>";
    		//
    		var content_div="<table cellpadding=0 cellspacing=0 border=0 align=center width='100%' height=100% id='promptContentTable'><tr><td id='winMiddleLeft' width='3'>&nbsp;</td><td id='winMiddleCenter'>&nbsp;</td><td id='winMiddleRight' width='3'>&nbsp;</td></tr>";
    		//Å¥
            content_div+="<tr><td height='30' id='winBtnLineLeft'>&nbsp;</td><td align='center' id='winBtnLineCenter'>&nbsp;</td><td id='winBtnLineRight'>&nbsp;</td></tr>";
    		//Â²
            content_div+="<tr><td id='winBottomLeft' width='3'></td><td id='winBottomCenter'></td><td id='winBottomRight' width='3'></td></tr></table>";
    		//
            var outContainer=d.createElement('div');
    		outContainer.id='promptWinContainer';
    		outContainer.innerHTML=title_div+content_div;
    		db.appendChild(outContainer);
			addEvent('mousedown',setDrag,$('titleContainer'));
			//Ô­Ê¼ß¶
			y.cacheH=[$height($('promptContentTable')),$height($('winMiddleCenter'))];
			//Ó¼Â¼
			addEvent("keydown",listenKeydown);	//Ì°Â¼
			function resizeMask(){if($("maskLevel")&&$("maskLevel").style.display!="none")showMask()}	//Â¼Ö´Ð¡
    		addEvent("resize",resizeMask,window);
    		addEvent("scroll",resizeMask,window);
    	}
		
    	//
    	$('titleText').innerHTML=y.title;	//
    	$('winMiddleCenter').innerHTML=y.message;	//
		$('winMiddleCenter').className="ymPrompt_"+y.winType;	//Í¼
    	$('winBtnLineCenter').innerHTML=useBtn(btnMap[y.winType]);	//Â°Å¥
    	
		$('promptContentTable').style.height=y.cacheH[0];
		$("winMiddleCenter").style.height=y.cacheH[1];
    	//Ê¾Ï¢
    	addCSS($('promptWinContainer'),outerStyle);	//Ð¶Î»Ï¢
		//è¶¨Ä¸ß¶
		$('promptContentTable').style.height=(y.height-$('titleContainer').offsetHeight)+'px';
		
		//Ä¸ß¶,xhtmlÒ³
		var contentHeight=$height($("promptContentTable"))-$height($("winBottomLeft"));
		if($("winBtnLineLeft")){contentHeight-=$height($("winBtnLineLeft"))}
		$("winMiddleCenter").style.height=contentHeight+"px";
    	$('promptWinContainer').style.display='';	//Ê¾

    	if(btnCache)$(btnCache[btnIndex=0].id).focus();	//È·Å¥È¡
    };
	//Ä¬
	y.defaultCfg={
		maskAlphaColor:'#000',    //Í¸É«
        maskAlpha:0.1,    //Í¸
        title: '', //Ï¢
        message: '', //Ï¢Å¥
        width: 300, //
        height: 185, //
		handler: function(){}    //ØµÂ¼
	}
	var execFn=function(hd){
		return function(){
			destory();
			try{eval(this['handler']).call(window,hd)}catch(e){}
		}
	}
    y.apply(y, {
		winType: 'alert', //Ï¢Í£alertsucceederrorconfirmÖ£Ä¬Îªalert
        show:function(args){    //Ê¾Ï¢
			//Ö§Ö²ë·½Ê½:(1)JSONÊ½ (2)
			var a=Array.prototype.slice.call(args,0),cfg=['message','width','height','title','handler','maskAlphaColor','maskAlpha'],obj={};
			if(typeof a[0]!='object'){
				for(var i=0,l=a.length;i<l;i++){
					if(a[i]){obj[cfg[i]]=a[i]}
				}
			}else{
				obj=a[0];
			}
			this.apply(this,obj,this.defaultCfg);	//È»Ô­Ä¬
            init();
        },
        doHandler:function(sign){
			destory();
			try{eval(this['handler']).call(window,sign)}catch(e){}
		}
    },y.defaultCfg);
	
	if(y.initCallCfg){
		y.show(y.initCallCfg);
	}
})();

//Ï¢Í¬
ymPrompt.apply(ymPrompt,{
    alert:function(){
        ymPrompt.winType='alert';
        ymPrompt.show(arguments);
    },
    succeedInfo:function(){
        ymPrompt.winType='succeed';
        ymPrompt.show(arguments);
    },
    errorInfo:function() {
        ymPrompt.winType='error';
        ymPrompt.show(arguments);
    },
    confirmInfo:function() {
        ymPrompt.winType='confirm';
        ymPrompt.show(arguments); 
    }
});
