state = new Object();
state.Provider = function(){
    this.state = {};

    this.decodeValue = function(cookie){
        var re = /^(a|n|d|b|s|o)\:(.*)$/;
        var matches = re.exec(unescape(cookie));
        if(!matches || !matches[1]) return; // non state cookie
        var type = matches[1];
        var v = matches[2];
        switch(type){
            case "n":
                return parseFloat(v);
            case "d":
                return new Date(Date.parse(v));
            case "b":
                return (v == "1");
            case "a":
                var all = [];
                var values = v.split("^");
                for(var i = 0, len = values.length; i < len; i++){
                    all.push(this.decodeValue(values[i]));
                }
                return all;
           case "o":
                var all = {};
                var values = v.split("^");
                for(var i = 0, len = values.length; i < len; i++){
                    var kv = values[i].split("=");
                    all[kv[0]] = this.decodeValue(kv[1]);
                }
                return all;
           default:
                return v;
        }
    };
	this.isDate = function(v){
			return v && typeof v.getFullYear == 'function';
		};
	this.isArray = function(v){
			return v && typeof v.length == 'number' && typeof v.splice == 'function';
		};
    this.encodeValue = function(v){
        var enc;
        if(typeof v == "number"){
            enc = "n:" + v;
        }else if(typeof v == "boolean"){
            enc = "b:" + (v ? "1" : "0");
        }else if(this.isDate(v)){
            enc = "d:" + v.toGMTString();
        }else if(this.isArray(v)){
            var flat = "";
            for(var i = 0, len = v.length; i < len; i++){
                flat += this.encodeValue(v[i]);
                if(i != len-1) flat += "^";
            }
            enc = "a:" + flat;
        }else if(typeof v == "object"){
            var flat = "";
            for(var key in v){
                if(typeof v[key] != "function" && v[key] !== undefined){
                    flat += key + "=" + this.encodeValue(v[key]) + "^";
                }
            }
            enc = "o:" + flat.substring(0, flat.length-1);
        }else{
            enc = "s:" + v;
        }
        return escape(enc);        
    };

    this.get = function(name, defaultValue){
        return typeof this.state[name] == "undefined" ?
            defaultValue : this.state[name];
    };

    // private
    this.set = function(name, value){
        if(typeof value == "undefined" || value === null){
            this.clear(name);
            return;
        }
        this.setCookie(name, value);
        this.state[name] = value;
    };

    // private
    this.clear = function(name){
        this.clearCookie(name);
        delete this.state[name];
    };

    // private
    this.readCookies = function(){
        var cookies = {};
        var c = document.cookie + ";";
        var re = /\s?(.*?)=(.*?);/g;
    	var matches;
    	while((matches = re.exec(c)) != null){
            var name = matches[1];
            var value = matches[2];
            if(name && name.substring(0,3) == "TA_"){
                cookies[name.substr(3)] = this.decodeValue(value);
            }
        }
        return cookies;
    };

    // private
    this.setCookie = function(name, value){
        document.cookie = "TA_"+ name + "=" + this.encodeValue(value) +
           ((this.expires == null) ? "" : ("; expires=" + this.expires.toGMTString())) +
           ((this.path == null) ? "" : ("; path=" + this.path)) +
           ((this.domain == null) ? "" : ("; domain=" + this.domain)) +
           ((this.secure == true) ? "; secure" : "");
    };

    // private
    this.clearCookie = function(name){
        document.cookie = "TA_" + name + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" +
           ((this.path == null) ? "" : ("; path=" + this.path)) +
           ((this.domain == null) ? "" : ("; domain=" + this.domain)) +
           ((this.secure == true) ? "; secure" : "");
    }

    this.path = "/";
    this.expires = new Date(new Date().getTime()+(1000*60*60*24*7)); //7 days
    this.domain = null;
    this.secure = false;
    this.state = this.readCookies();
};

state.Manager = function(){
    var provider = new state.Provider();
    provider.expires = null;

    return {
        setProvider : function(stateProvider){
            provider = stateProvider;
        },

        get : function(key, defaultValue){
            return provider.get(key, defaultValue);
        },
         set : function(key, value){
            provider.set(key, value);
        },
        clear : function(key){
            provider.clear(key);
        },
        getProvider : function(){
            return provider;
        }
    };
}();
/////////////////////////////////////////////////////////////
	function setcookie(value)
	{
		state.Manager.set("UID",value);
	}
	function clearcookie()
	{
		state.Manager.clear("UID");
	}
	function getcookie()
	{
		return state.Manager.get("UID");
	}

	function getElement(id)
	{
		return document.getElementById(id);
	}
/////////////////////////////////////////////////////////////    
    var CAPICOM_STORE_OPEN_READ_ONLY = 0;
	var CAPICOM_CURRENT_USER_STORE = 2;
	var CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
    var CAPICOM_CERTIFICATE_FIND_ISSUER_NAME = 2;
	var CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY = 6;
	var CAPICOM_CERTIFICATE_FIND_TIME_VALID = 9;
	var CAPICOM_CERTIFICATE_FIND_KEY_USAGE = 12;
	var CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE = 0x00000080;
	var CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0;
	var CAPICOM_INFO_SUBJECT_SIMPLE_NAME = 0;
	var CAPICOM_ENCODE_BASE64 = 0;
	var CAPICOM_E_CANCELLED = -2138568446;
	var CERT_KEY_SPEC_PROP_ID = 6;
	var CAPICOM_HASH_ALGORITHM_SHA1 = 0;
	var CAPICOM_SMART_CARD_USER_STORE = 4;

    var CAPICOM_ENCODE_ANY = -1;
    var CAPICOM_ENCODE_BASE64 = 0;
    var CAPICOM_ENCODE_BINARY = 1;
    var CAPICOM_VERIFY_SIGNATURE_ONLY = 0;
    var CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE = 1;

    var CAPICOM_ENCRYPTION_ALGORITHM_RC2 = 0
    var CAPICOM_ENCRYPTION_ALGORITHM_RC4 = 1
    var CAPICOM_ENCRYPTION_ALGORITHM_DES = 2
    var CAPICOM_ENCRYPTION_ALGORITHM_3DES = 3
    var CAPICOM_ENCRYPTION_ALGORITHM_AES = 4 // v2.0 
    var CAPICOM_ENCRYPTION_KEY_LENGTH_MAXIMUM        = 0
    var CAPICOM_ENCRYPTION_KEY_LENGTH_40_BITS        = 1
    var CAPICOM_ENCRYPTION_KEY_LENGTH_56_BITS        = 2
    var CAPICOM_ENCRYPTION_KEY_LENGTH_128_BITS       = 3

    function GetCertificate(who)
    {
		var MyStore = new ActiveXObject("CAPICOM.Store");
		try {
		//	MyStore.Open(CAPICOM_SMART_CARD_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY);
            MyStore.Open(CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY);
            var FilteredCertificates = MyStore.Certificates
                .Find(CAPICOM_CERTIFICATE_FIND_KEY_USAGE,CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE)
                .Find(CAPICOM_CERTIFICATE_FIND_TIME_VALID)
                .Find(CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY,CERT_KEY_SPEC_PROP_ID)
                .Find(CAPICOM_CERTIFICATE_FIND_ISSUER_NAME,"sinopec");

            if(FilteredCertificates.Count==0){	
               return null;
            }else if(FilteredCertificates.Count==1){
                return FilteredCertificates.Item(1);
            }else
            {
                alert('数字证书不唯一，请重新选择');
                return FilteredCertificates.Select();
            }
		} catch (e) {
			if (e.number != CAPICOM_E_CANCELLED) {
				alert("An error occurred while opening your personal certificate store, aborting");
				return false;
			}
            alert(e + " " + e.number);
            return false;
		}
    };
	function GetUPN(crt)
	{
		if (crt!=null)
		{
			var exts = crt.Extensions();
			for(i=1; i<exts.Count; i++)
			{
				var ext = exts.Item(i);
				if (ext.OID.Value=='2.5.29.17') //证书备用名称
				{
					//alert(ext.OID.FriendlyName + " " + ext.OID.Value + " " + ext.OID.Name );
					var re = new RegExp("(.+)=(.+)","ig");
					var arr = re.exec(ext.EncodedData.Format(false));            //Search the string.
					return RegExp.$2;
				}
			}
		}
		return null;
	};

	function FilterCertificates() {
		
		var MyStore = new ActiveXObject("CAPICOM.Store");
		var FilteredCertificates = new ActiveXObject("CAPICOM.Certificates");
		try {
			MyStore.Open(CAPICOM_SMART_CARD_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY);
		} catch (e) {
			if (e.number != CAPICOM_E_CANCELLED) {
				alert("An error occurred while opening your personal certificate store, aborting");
				return false;
			}
            alert(e + " " + e.number);
            return false;
		}
		
		var FilteredCertificates = MyStore.Certificates
				.Find(CAPICOM_CERTIFICATE_FIND_KEY_USAGE,CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE)
				.Find(CAPICOM_CERTIFICATE_FIND_TIME_VALID)
				.Find(CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY,CERT_KEY_SPEC_PROP_ID)
                .Find(CAPICOM_CERTIFICATE_FIND_ISSUER_NAME,"SINOPEC")
                ;
		if(FilteredCertificates.Count==0){	
		   window.open("","_self");
           top.opener=null;
           top.close();
           return;
		}
        //alert(FilteredCertificates.Item(1).IssuerName);
        //FilteredCertificates.Select()
		MyStore = null;
		FilteredCertificates = null;
        //alert('数字证书存在');
		return FilteredCertificates;
	}

    function SignData(crt,content)
    {
        var Signer = new ActiveXObject("CAPICOM.Signer")
	    Signer.Certificate = crt
	    var SignedData = new ActiveXObject("CAPICOM.SignedData")
	    SignedData.Content = content
        
        var Result = SignedData.Sign(Signer,false,CAPICOM_ENCODE_BASE64)
	    return Result;
    }

    function VerifyData(signedData)
    {
        var verifyData = new ActiveXObject("CAPICOM.SignedData")
        verifyData.Verify(signedData,false,CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE);
        return verifyData.Content;
    }

    function EnvEData(crt,dat)
    {
        var enveData = new ActiveXObject("CAPICOM.EnvelopedData")
        enveData.Recipients.Add(crt)
        enveData.Content = dat
        enveData.Algorithm.Name = CAPICOM_ENCRYPTION_ALGORITHM_3DES
        enveData.Algorithm.KeyLength  = CAPICOM_ENCRYPTION_KEY_LENGTH_MAXIMUM

        return  enveData.Encrypt(CAPICOM_ENCODE_BASE64);
    }
    function EnvDData(dat)
    {
        var enveData = new ActiveXObject("CAPICOM.EnvelopedData")
        enveData.Decrypt(dat);
		//alert(enveData.Content);
        return enveData.Content;
    }

    ////////////////////////////////////////
    /*
function perform_test()
{
	var i = 0;
	var b = new Date();

	for (i=0; i<1000; i++)
	{
		FilterCertificates();
	}
	var e = new Date();
	alert((e.getTime()-b.getTime())+" 微妙");
};

	//定时器，时间为毫秒
	timerID = setInterval("FilterCertificates()",1000);
	alert('aaa');

	var crt = GetCertificate();
	var upn = GetUPN(crt);
	var sig = SignData(crt,upn);
	alert(VerifyData(sig));
	document.getElementById("ctx").innerText=sig;

	var env = EnvEData(crt,upn);
	alert(EnvDData(env))
*/
function UrlDecode(str){ 
    var ret=""; 
    for(var i=0;i<str.length;i++)
    { 
        var chr = str.charAt(i); 
        if(chr == "+")
        { 
            ret+=" "; 
        }
        else if(chr=="%")
        { 
            var asc = str.substring(i+1,i+3); 
            if(parseInt("0x"+asc)>0x7f)
            { 
                ret+=asc2str(parseInt("0x"+asc+str.substring(i+4,i+6))); 
                i+=5; 
            }
            else
            { 
                ret+=asc2str(parseInt("0x"+asc)); 
                i+=2; 
            } 
        }
        else
        { 
            ret+= chr; 
        } 
    } 
    return ret; 
} 


////////////////////////////////////////////////
var env ="";
var index=-1;
try{
env = window.top.location.search;
}catch(e){

}
index=env.indexOf("pki=");

if (env!=null && env!="" && env!="undefined" && index!=-1)
{
var aa=env.substr(index+4);

	 aa = aa.replace(/%3D/g,'=');
	 aa= aa.replace(/%0D%0A/g,'\r\n');
	//aa= decodeURI(aa);
   try{ var who = EnvDData(aa);
   }catch(e)
	{
		alert("UKEY被移动");
		alert('请插入 KEY,然后重新访问系统decode');
		  window.open('','_self');
top.open('','_self');
           top.opener=null;
           top.close();
	}
    setcookie(who);
	//alert(who+aa);
}
else
{
	var cwho = getcookie();
	if((cwho!="undefined" && cwho!=null && cwho!="")){

	try{
	var crt = GetCertificate();
	var upn = GetUPN(crt);
	//var cwho = getcookie();
	if (cwho!="undefined" && upn!=cwho)
	{
		alert('请插入 KEY,然后重新访问系统normal');
		   window.open('','_self');
           top.opener=null;
	top.open('','_self');
           top.close();
	}
	}catch(e)
	{
		alert("UKEY被移动");
		alert('请插入 KEY,然后重新访问系统exception');
	window.open('','_self');
           top.opener=null;
	top.open('','_self');
           top.close();
	}
	}
}