﻿/*
满足了登录按钮|回车键事件触发登录，表名字段名传入后加密确保了安全，密码存放加密，让登录无憾。
    Copyright (c) 2007-2008 ehai-kang
    $Date: 2008-07-19 19:30:06$
    本版本说明：
    1.版本号：1.0.0
    2.支持多浏览器 用jquery实现
    3.支持cs/bs融合
    4.需要结合ehai框架使用
    
参数说明
  var inoption={
        type:0,//[可选] 类型 0：传入字符串形成布局  1:默认样式1 2：默认样式2.......
        curHTML:'',//[可选] 当前显示的布局html串  用户名name="uid" 密码name="pid" 验证码name="val"
        arrID:['txtUserName','txtPwd','txtimg','valImg','btval','btlogin','txtwhere'],//[可选，当type:0,必选][用户名文本框id,密码文本框id,验证码文本框id,显示验证码图片id,换验证码按钮id,登录按钮id,其他条件文本框(放置其他where后的字段=条件)]            
        strField:'',//[必选]< @用户表名%16用户名字段名%16密码字段名%16权限字段名@ >  实例 '< @[adminUser]%16[Username]%16[password]%16[rValue]@ >'          
        callback:null,//[可选]登录成功后执行的函数
        valpath:'../',//[可选]html页面相对于根目录的路径
        valsrc:'vallidatno.aspx',//[可选]
        isReqval:1//[可选]是否需要验证码 1需要 0不需
    };
注意事项
    1.当type:0,curHTML和arrID必须传；type其他值时会选用控件自身的对应类型的登录布局
    2。外部可通过下拉列表框改变登录的表来改变登录的方式 的表 
        可通过$('#div1').attr("strfield",value);其中value是新的参数 strField
    3。可以根据项目需要，选用是否验证码，对应参数isReqval，同时注意 config配置文件中的是否验证码设置
    4. 如果需要加其他where条件 则需要添加arrID参数的第6个值文本框id，并在外部给该id 设置值
使用示例
1.初始化
      $(document).ready(function(){
            var str='用户名密码验证码布局'
            $("#div1").login({type:0,curHTML:str,callback:loginback,arrID:['txtUserName','txtPwd','txtimg','valImg','btval','btlogin'],strField:'< @[adminUser]%16[Username]%16[password]%16[rValue]@ >'});
      });    
    
*/
(function($){ 
    $.fn.login = function(options) {
        this.each(function(){
            var inoption={
                type:0,//类型 0：传入字符串形成布局  1:默认样式1 2：默认样式2.......
                curHTML:'',//当前显示的布局html串 用户名name="uid" 密码name="pid" 验证码name="val"
                arrID:['txtUserName','txtPwd','txtimg','valImg','btval','btlogin','txtwhere'],//[用户名文本框id,密码文本框id,验证码文本框id,显示验证码图片id,换验证码按钮id,登录按钮id,其他条件文本框]            
                strField:'',//< @用户表名%16用户名字段名%16密码字段名%16权限字段名@ >  '< @[adminUser]%16[Username]%16[password]%16[rValue]@ >'          
                callback:null,//登录成功后执行的函数
                valpath:'',//html页面相对于根目录的路径
                valsrc:'validateno.aspx',
                isrelive:0,//是否存在复活按钮
                relivedata:['btrelive','ssofrm','initclientcallback'],//存在复活按钮时[按钮id,iframeid,回调函数名]
                ssoreq:0,//0【默认】走系统消息；其他为sso的走自己的form，1其他服务器 12为sso服务器
                posttype:1,//提交方式 0ajax 1form+iframe
                posturl:'default.aspx',//action 其他值可以是https://域名/default.aspx  sso:https://域名/ehaisso.aspx?ssoserver=1&ssoreq=11
//                callbackurl:'ehailogin.html',//form 提交后转向的相对路径 文件js处理登录后信息
                isReqval:1//是否需要验证码 1需要 0不需                
            };
            if(options) {
                $.extend(inoption, options);
                inoption.valsrc=inoption.valpath+inoption.valsrc;
                if(inoption.type==1){//固定布局1
                    inoption.curHTML='<div><ul style="list-style-type:none;">'
                        +'<li class="loginli1">用户名：<input class="logininput1" name="uid" maxLength=50 id="txtUserName" /><font color="#FF0000">*</font></li>'
                        +'<li class="loginli1"> 密&nbsp;&nbsp;&nbsp;&nbsp;码：<input class="logininput1" type="password" value="" id="txtPwd" name="pid" /><font color="#FF0000">*</font></li>'
                        +'<li style="padding-left:60px;"> <input src="'+inoption.valsrc+'" name="valImg" type="image" id="valImg" alt="验证码" disabled="disabled" /></li>'
                        +'<li style="padding-left:60px;"><a id="btval" href="#" style="color: gray">看不清,换一张</a> </li>'
                        +'<li class="loginli1">验证码： <input  class="logininput1"  id="txtimg"  maxLength="5" style="text-transform: uppercase;" name="val" /> <font color="#FF0000">*</font></li>'
                        +'<li style="padding-left:60px;"><input id="btlogin" type="button" class="btn" value="登录" /> '
                        +(inoption.isrelive?'<input style="margin-left:20px;" type="button" id="btrelive" class="btn" value="复活" />':'')
                        +'</li></ul></div>';
                }
                if(inoption.type==2){//固定布局2
                    inoption.curHTML='<div><ul style="list-style-type:none;">'
                        +'<li class="loginli2">用户名：<input class="logininput2" maxLength=50 id="txtUserName" name="uid" /><font color="#FF0000">*</font>'
                        +'<label style="margin-left:10px;"> 密&nbsp;&nbsp;&nbsp;&nbsp;码：<input class="logininput2" type="password" value="" id="txtPwd" name="pid" /><font color="#FF0000">*</font></label>'
                        +'<label style="margin-left:10px;">验证码： <input  class="logininput2" style="width:50px;text-transform: uppercase;"  id="txtimg"  maxLength="5"  name="val" /> <font color="#FF0000">*</font></label>'
                        +'<label style="margin-left:0px;"> <input src="'+inoption.valsrc+'" name="valImg" type="image" id="valImg" alt="验证码" style="margin-bottom:0px;" disabled="disabled" /></label>'
                        +'<label style="margin-left:5px;"><a id="btval" href="#" style="COLOR: gray">换一张</a> </label>'
                        +'<label style="margin-left:20px;"><input id="btlogin" type="button" class="btn" value="登录" /></label>'
                        +(inoption.isrelive?'<input style="margin-left:20px;" type="button" id="btrelive" class="btn" value="复活" />':'')
                        +'</li></ul></div>';
                }
            }
            var cid=this.id;
            var getcsSrc=function(){
                if(location.protocol == "file:"){
                    $.getparent().csbsData.csDataDownData(inoption.valsrc,3,function(obj){
                        var r=Math.random();
                        $('#'+inoption.arrID[3])[0].src=inoption.valsrc+"?id="+r;
                    });
                    return true;
                }
                return false;
            };
            var changevalNo=function(){
                if(inoption.arrID[2]&&inoption.isReqval){
                    $('#'+inoption.arrID[2])[0].value="";
                    if(!getcsSrc()){
                        var r=Math.random();
                        $('#'+inoption.arrID[3])[0].src=inoption.valsrc+"?id="+r;
                    }
                }
            };
            var logincallback=function(re){
                if(re.error){
                    alert(re.error);
                    changevalNo();
                    return;
                }
                if(re.wrong){
                    alert(re.wrong);
                    changevalNo();
                    return;
                }
                if(inoption.callback!=null)
                    inoption.callback(re);
            };
            var initHtml=function(){
                if(inoption.ssoreq&&inoption.posttype==1&&location.protocol != "file:"){    
                    if(!inoption.type&&!inoption.curHTML){
                        inoption.curHTML=$('#'+cid)[0].innerHTML;
                    }
                    inoption.curHTML='<form id="formlogin'+cid+'" action="'+inoption.posturl+'" method="post" enctype="application/x-www-form-urlencoded" target="frmlogin'+cid+'">'
                        +inoption.curHTML
                        +'<input id="msg'+cid+'" name="msgs" type="password" value="" style="display:none;" />'
                        +'<input id="lang'+cid+'" name="lang" value="zh" type="password" style="display:none;" />'
                        +'<input id="ssoreq'+cid+'" name="ssoreq" value="'+inoption.ssoreq+'" type="password" style="display:none;" />'
//                        +'<input id="back'+cid+'" name="callbackurl" value="ehailogin.html" type="password" style="display:none;" />'
                        +'</form><iframe name="frmlogin'+cid+'" id="frmlogin'+cid+'" style="width:0px;height:0px;display:none;"></iframe>';
                }
                if(inoption.curHTML){
                    $('#'+cid)[0].innerHTML=inoption.curHTML;
                    if(!inoption.type)
                        changevalNo();
                }
                getcsSrc();
                if(!inoption.isReqval){//不需验证码
                    if(inoption.arrID[2]&&$('#'+inoption.arrID[2])[0]){
                        $('#'+inoption.arrID[2])[0].parentNode.style.display="none";
                    }
                    if(inoption.arrID[3]&&$('#'+inoption.arrID[3])[0]){
                        $('#'+inoption.arrID[3])[0].parentNode.style.display="none";
                    }
                    if(inoption.arrID[4]&&$('#'+inoption.arrID[4])[0]){
                        $('#'+inoption.arrID[4])[0].parentNode.style.display="none";
                    }
                }
                if(inoption.arrID[4]&&$('#'+inoption.arrID[4])[0]&&inoption.isReqval){
                    $('#'+inoption.arrID[4])[0].onclick=function(){//换验证码按钮
                        changevalNo();
                    }
                }
                if(inoption.isrelive&&$('#'+inoption.relivedata[0])[0]){
                    $('#'+inoption.relivedata[0])[0].onclick=function(){
                        $('#'+inoption.relivedata[1])[0].src='ehaisso.aspx?ssoreq=5&jfun='+inoption.relivedata[2];    
                    }
                }
                if($('#'+inoption.arrID[5])[0]){
                    var loginevent=function(){
                        var userName=$.trim($('#'+inoption.arrID[0]).val());
                        var pwd=$('#'+inoption.arrID[1]).val();
                        var code=(inoption.isReqval)?$('#'+inoption.arrID[2])[0].value.toUpperCase():'';
                        if(userName=="")
                        {
                            alert("用户名不能为空！");
                            $('#'+inoption.arrID[0])[0].focus();
                            return;
                        }
                        if(pwd=="")
                        {
                            alert("密码不能为空！");
                            $('#'+inoption.arrID[1])[0].focus();
                            return;
                        }
                        if(code==""&&inoption.isReqval)
                        {
                            alert("验证码不能为空！");
                            $('#'+inoption.arrID[2])[0].focus();
                            return;
                        }
                        var strf=($('#'+cid).attr("strfield"))?$('#'+cid).attr("strfield"):inoption.strField;
                        userName=userName.replace('-','');
                        pwd=pwd.replace('-','');
                        if(inoption.ssoreq&&inoption.posttype==1&&location.protocol != "file:"){ 
//                            var st = window.RunState=="debug" ? jQuery.fw.Config["Environment"]["DebugChar"] : "";
//                            var strmv=st+'formlogin'+cid+decodeURIComponent('%16Login%16'+strf+"%16"+userName+"%16"+pwd+"%16"+code);
                            $('#msg'+cid).val('formlogin'+cid);
                            if(window.jQuery.$GetDefLang)
                                $('#lang'+cid).val(jQuery.$GetDefLang());
                            $.SSOSendLogin({id:'formlogin'+cid,type:'Login',
                                callback:function(re){//登录回调按钮                               
                                   logincallback(re);
                                }
                            });
                            return;
                        }
                        if(inoption.arrID.length>5&&($('#'+inoption.arrID[6])[0])){
                            code=code+"%16"+$('#'+inoption.arrID[6]).val();
                        }
                        $.SendMessage({type:"Login",reqtype:'post',posttype:inoption.posttype,
                        pm :strf+"%16"+userName+"%16"+pwd+"%16"+code,
                        callback:function(re){
                            logincallback(re);
                        }},true);
                    }
                    $('#'+inoption.arrID[5])[0].onclick=function(){//登录按钮
                        loginevent();
                    }
                    $('#'+cid)[0].onkeydown=function(e){
                        if((window.event&&window.event.keyCode==13)||(e&&e.keyCode==13))
                            loginevent();
                    };
                }
            }
            initHtml();
        });
    };
})(jQuery);
/*
功能：sso服务器登录处理
*/
jQuery.SSOSendLogin=jQuery.fn.SSOSendLogin=function(msg){
    var t1=jQuery.SSOMsgRegisterDB;
    if(typeof(msg)!="object")return this;
    if(!msg.type)return this;
    msg=t1.Register(msg);
    $('#'+msg.id)[0].submit();
    return this;
};
/*
功能：sso服务器登录处理返回
*/
jQuery.SSOdataAnalyze =function(strRe)
{
    var re;
    try{
        if(window.$.parseJSON)
            re=$.parseJSON(strRe);
        else
            eval('re='+strRe);
    }catch(e){
        re=null;
    }
    if(window.jQuery.decodeObject){
        jQuery.decodeObject(re);
    }else if(typeof(re)=="object"){
        jQuery.SSOdecodeObject(re);
    }
    if(!re)
    {
        alert('系统错误，请重试！');
        return;
    }
    var tm=jQuery.SSOMsgRegisterDB.GetMsg(re["id"]);
    if(!tm)return;
    try{
        tm.callback(re["ct"],tm);
    }catch(e){}
    jQuery.SSOMsgRegisterDB.Unregister(tm.id);
};
/*
功能：sso登录消息注册
没有框架js的扩展
*/
jQuery.SSOMsgRegisterDB={//小消息注册信息表
    db:{},
    defMsg : 
    {
        type : null,//消息类型，如："DBSelect"：类型为对数据库操作，针对各种类型，默认为不用系统回调
        callback : null//消息的自定义回调函数，非系统回调函数函数格式必须是function callback(re){},其中re为获得的后台数据
    },
    Register:function(msg)//返回注册后消息
    {
        if(typeof(msg)!="object")return null;
        msg=jQuery.extend(jQuery.extend({},this.defMsg),msg);
        this.db[msg.id]=msg;
        return msg;//消息注册成功
    },
    Unregister:function(id)
    {
        delete this.db[id];
        return this;
    },
    GetMsg : function(id)
    {
        return this.db[id];
    }
};
jQuery.SSOdecodeObject=function(obj)
{
    if(typeof(obj)!="object")return obj;
    for(var key in obj)
    {
        var kv=obj[key];
        try{
            kv=decodeURIComponent(kv);
        }catch(e){        
        }
        if(typeof(obj[key])=="object")jQuery.SSOdecodeObject(obj[key]);
    }
};
//var ssologin=function(username,pwd,cid){
//    var arrurl=[];//    var arrurl=[['http://localhost:801','<~_2119~>'],['http://localhost:805','<~_2119~>']];
//    var url=window.location.protocol+"//"+window.location.host;
//    var aurl=url;
//    for(var i=0;i<arrurl.length;i++){
//        if(arrurl[i][0]!=url){
//            aurl=arrurl[i][0];  
//            var strf= arrurl[i][1];  
//            cid=cid+i; 
//            var st = window.RunState=="debug" ? jQuery.fw.Config["Environment"]["DebugChar"] : "";
//            var strHtml=strf+"%16"+username+"%16"+pwd+"%16";
//            var htmlvalue=st+("login"+cid+"<~_2120~>")+(strHtml);
//            htmlvalue=htmlvalue.replace(/%16|%17|%18/g,function(c){return decodeURIComponent(c);});
//            if($("#edivlogin"+cid)[0])
//                 $("div").remove("#edivlogin"+cid);
//            var arrstr=[];
//            arrstr.push('<div id="edivlogin'+cid+'" style="width: 0px;height: 0px;display:none;">');
//            arrstr.push('<form id="form'+cid+'" action="'+aurl+'/default.aspx" method="post" enctype="application/x-www-form-urlencoded" target="formFrame'+cid+'">');
//            arrstr.push('<input id="Password'+cid+'" name="msgs" type="password" value="'+htmlvalue+'" style="display:none;" />');
//            arrstr.push('<input id="lang'+cid+'" name="lang" value="'+jQuery.$GetDefLang()+'" type="password" style="display:none;" />');
//            arrstr.push('</form>');
//            arrstr.push('<iframe name="formFrame'+cid+'" id="formFrame'+cid+'" style="width: 0px;height: 0px;display:none;"></iframe>');
//            arrstr.push('</div>');
//            $(document.body).append(arrstr.join(''));      
//            $('#form'+cid)[0].submit();
//        }
//    }
//};
