Home  >  Plugins  >  Plugins Repository  >  Pre 9.0 SP1 Blog Plugin  >  Comments
Comment Listing Header
Tuesday, May 22, 2007 By:
<?xml version="1.0" encoding="<X-FC-ITEM DATA[Charset]>"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!--^Blog/Comments x205 H=<X-FC-REQUEST-TIME HEADER> LS=<X-FC-REQUEST-TIME LOGIN.START> L=<X-FC-REQUEST-TIME LOGIN> OS=<X-FC-REQUEST-TIME OPEN.START> O=<X-FC-REQUEST-TIME OPEN> T=<X-FC-REQUEST-TIME>--><!--#if expr="<X-FC-FIELD 13625 LENGTH>"--><!--#set var="SKIN" value="?Plugin=<X-FC-FIELD 13625 MLSTRING>"--><!--#else--><!--#set var="SKIN" value=""--><!--#endif-->
<html><!--#if expr="<X-FC-SERVER VERSION> < 10537"--><!--#set var="MAXDATA" value="255"--><!--#else--><!--#set var="MAXDATA" value="1023"--><!--#endif--><!--#set var="CAPTIONSTRING" value="<X-FC-FIELD LANG.142.5 STRING>"--><!--#set var="PREFIX" expr="@split($CAPTIONSTRING,"^0")"--><!--#set var="CAPTIONSTRING" value="${PREFIX}${CAPTIONSTRING}"-->
<head>
<title><X-FC-ITEM DATA[Title]></title>
<link rel="alternate" type="application/rss+xml" title="<X-FC-ITEM DATA[Title]>" href="<X-FC-OBJURL ABSOLUTE>?Plugin=RSS&amp;Documents"/>
<meta http-equiv="Content-Type" content="text/html; charset=<X-FC-ITEM DATA[Charset]>"/>
<link rel="icon" href="/favicon.ico" type="image/x-icon"/>
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"/>
<script type="text/javascript">
<!--
var path="<X-FC-OBJURL>";
var L="<X-FC-LOGIN>";
var XA=false;<!--#rem
gRA(s,a)                getResponseArgument(string,argument)
-->
function gRA(s,a){
var as=s.indexOf(a+"=");
var ae=-1;
if(as!=-1){
        if(s.charAt(as+a.length+1)=='"'){
                ++as;
                ae=s.indexOf('"',as+a.length+1);
        }else
                ae=s.indexOf(";",as+a.length+1);
}
if(ae!=-1)
        return s.substring(as+a.length+1,ae);
else
        return null;
}
function dL(){
document.forms["CF"].elements["Body"].value="";<!--#set var="ONLOAD" value="dL"-->
var LFE=document.forms["LOGINFORM"].elements;
LFE["userid"].value="";
LFE["password"].value="";<!--#if expr="$ENABLEAUTHSAVING"-->
LFE["savepw"].checked=false;
lc();<!--#endif--><!--#if expr="<X-FC-USER AUTH> == 0"-->
var RO=new ARO();
if(RO!=null)
        RO.CB=GACB;
if(RO==null||!RO.G("/Login<X-FC-OBJURL>","Plugin=Blog&Templates=Comments&Upper=1&Lower=1&AJAX=1"))
        XA=true;<!--#endif-->
}<!--#rem
GACB    GetAuthCallback
-->
function GACB(RO){
var a=0;
var n="";
var p=0;
var t=RO.obj.responseText;
a=gRA(t,"auth");
if(a!=null){
        XA=false;
        a=parseInt(a);
        if(a){
                n=gRA(t,"name");
                p=parseInt(gRA(t,"post"));
                L=gRA(t,"login");
                dSL(n,p);
        }
}
}<!--#rem
RDL     ReDoLogin
-->
function RDL(){
var RO=new ARO();
var U=path;
var CFT=document.<!--#if expr="<X-FC-BROWSER NAME.MSIE>"-->all["CommentForm"]<!--#else-->getElementById("CommentForm")<!--#endif-->;
var LFT=document.<!--#if expr="<X-FC-BROWSER NAME.MSIE>"-->all["LoginForm"]<!--#else-->getElementById("LoginForm")<!--#endif-->;
var LF=document.forms["LOGINFORM"];
if(path.substr(0,6).toUpperCase()=="/LOGIN")
        path=path.substr(path.indexOf("/",1),path.length);
if(LFT==null||CFT==null||RO==null||!RO.G("/Login/Logout","Plugin=Blog&Templates=Comments&AJAX=1")){
        self.location.replace("/Login/Logout?Plugin=Blog&Templates=Comments&URL="+path+"&ThreadID=<X-FC-URL-PARAMETER ThreadID>&POST=1");
        L="/";
        XA=true;
}else{
        LF.elements["userid"].value="";
        LF.elements["password"].value="";
        LF.elements["savedpw"].value=0;<!--#if expr="$ENABLEAUTHSAVING"-->
        LF.elements["savepw"].checked=false;<!--#endif-->
        CFT.style.display="none";
        LFT.style.display="block";      
        XA=false;
}
return false;
}<!--#rem
dPC(F)          doPostComment(form)
-->
function dPC(F){
var RO=null;
var fs=null;
var si=0;
if(F.elements["Body"].value.length==0)
        return false;
if(F.action.substr(0,7).toUpperCase()=="HTTP://"||F.action.substr(0,8).toUpperCase()=="HTTPS://")
        si=F.action.indexOf("/",8);
if(F.action.substr(si,L.length).toUpperCase()!=L.toUpperCase())
        F.action=(si>0?F.action.substr(0,si):"")+L+F.action.substr(si+1,F.action.length);
if(!XA)
        RO=new ARO();
if(RO!=null){
        var v=escape(F.elements["Body"].value);
        if(v.length < 1024){
                RO.CB=CCB;
                fs="Body="+escape(F.elements["Body"].value);
        }else{<!--#if expr="<X-FC-USER AUTH> == 0"-->
                F.action+="&XA=1";<!--#endif-->
                RO=null;
        }
}
if(RO==null||!RO.PF(F.action,fs))
        return true;
F.elements["Post"].disabled=true;
return false;
}<!--#rem
CCB(RO) CommentCallback(RequestObject)
-->
function CCB(RO){
self.location.reload();
}<!--#rem
dLI(F)          doLogIn(Form)
-->
function dLI(F){
var I=document.images["CHALIMG"];
var rj=Math.random()*Math.random()*2147483647;
I.onload=pL;
I.src="/__Challenge?RJ="+rj;
return false;
}
function pL(){
var F=document.forms["LOGINFORM"];
var c=gRA(document.cookie+";","fcchallenge");
if(c!=null){
        var RO=null;
        var fs="";
        F.elements["challenge"].value=c;<!--#if expr="$ENABLEAUTHSAVING"-->
        if(F.elements["savepw"].checked)
                sc(F);<!--#endif-->
        DP(F);
        if(!XA)
                RO=new ARO();
        if(RO!=null){
                RO.CB=LCB;
                fs="userid="+escape(F.elements["userid"].value)+"&challenge="+escape(F.elements["challenge"].value)+"&sha1="+escape(F.elements["sha1"].value)+"&savedpw="+escape(F.elements["savedpw"].value)+"&origurl="+escape(F.elements["origurl"].value+"&Upper=1&Lower=1&AJAX=1");
        }
        if(RO==null||!RO.PF(F.action,fs)){
                F.submit();
        }<!--#if expr="$ENABLEAUTHSAVING"-->
        if(sp!=null&&!F.elements["savepw"].checked)
                cc(F);<!--#endif-->
}else
        self.location=F.action;
}<!--#rem
LCB(RO) LoginCallback(RequestObject)
-->
function LCB(RO){
var t=RO.obj.responseText;
var a=gRA(t,"auth");
if(a!=null&&parseInt(a)){
        L=gRA(t,"login");
        dSL(gRA(t,"name"),parseInt(gRA(t,"post")));
}else{
        alert(gRA(t,"err"));
}
}<!--#rem
dSL(n,p)                doSuccesfulLogin(name,postpermission)
--><!--#set var="WELCOMESTRING" value="<X-FC-FIELD LANG.7546.5 STRING>"--><!--#set var="WRONGUSERSTRING" value="<X-FC-FIELD LANG.7546.6 STRING>"--><!--#set var="NOPOST" value="<X-FC-FIELD LANG.7547.5 STRING>"-->
function dSL(n,p){
if(p){
        var CFT=document.<!--#if expr="<X-FC-BROWSER NAME.MSIE>"-->all["CommentForm"]<!--#else-->getElementById("CommentForm")<!--#endif-->;
        var LFT=document.<!--#if expr="<X-FC-BROWSER NAME.MSIE>"-->all["LoginForm"]<!--#else-->getElementById("LoginForm")<!--#endif-->;
        var WS=document.<!--#if expr="<X-FC-BROWSER NAME.MSIE>"-->all["WS"]<!--#else-->getElementById("WS")<!--#endif-->;
        var WUS=document.<!--#if expr="<X-FC-BROWSER NAME.MSIE>"-->all["WUS"]<!--#else-->getElementById("WUS")<!--#endif-->;
        try{
                WS.innerHTML =<!--#set var="WORK" value="$WELCOMESTRING"-->"<!--#echo expr="@split($WORK,"^1")"-->"+n+"<!--#echo var="WORK"-->";
                WUS.innerHTML=<!--#set var="WORK" value="$WRONGUSERSTRING"-->"<!--#echo expr="@split($WORK,"^1")"-->"+n+"<!--#echo var="WORK"-->";
                LFT.style.display="none";
                CFT.style.display="block";
        }catch(e){}
}else{
        alert("<!--#echo expr="@split($NOPOST,"^1")"-->"+n+"<!--#echo var="NOPOST"-->");
        RDL();
}
}<!--#rem
ARO     AsyncRequestObject
A cross-browser XMLHTTPRequest object

Properties:
CB      Callback                Function to be called when the request completes or times out.  Parameter is the ARO object itself.

Public Methods:
G(u,p)  GET(url,params) Send or queue an HTTP "GET" request to the server using the given URL and the specified paramters
PF(F)   POSTForm(Form)  Send or queue an HTTP "POST" to the server using the data from the HTML form in the argument (the URL used is the form action)

Private methods:
dG      doGet
dPF     doPostForm

Private static methods:
RSCH    ReadyStateChangeHandler
dQ      deQueue
-->
function ARO(){
this.CB=null;<!--#if expr="<X-FC-BROWSER NAME.MSIE>"-->
try{
        this.obj=new ActiveXObject("Msxml2.XMLHTTP");
}catch (e){
         try{
                 this.obj=new ActiveXObject("Microsoft.XMLHTTP");
        }catch(e){
                this.obj=null;
        }
}<!--#else-->
try{
        this.obj=new XMLHttpRequest();
        this.obj.overrideMimeType("text/xml");
}catch(e){
        this.obj=null;
}<!--#endif-->
if(this.obj!=null)
        return this;
return null;
}<!--#rem
Static member:
CRO     CurrentRequestObject
RQ      RequestQueue
Because the browser developers are just too dumb to implement object oriented code or parallel requests properly.-->
var CRO=null;
var RQ=new Array();<!--#rem
dQ      deQueue
Since the browsers seem to be able to process only one request at a time, if one a new request is made while another is in progress it is queued
for later processing.  This function deQueues and dispatches any pending requests in the order they were requested.
-->
function dQ(){
while(CRO==null&&RQ.length){
        CRO=RQ[0][0];
        if(RQ[0][1]=="PF")
                CRO.dPF(RQ[0][2],RQ[0][3]);
        else if(RQ[0][1]=="G")
                CRO.dG(RQ[0][2],RQ[0][3])
        else
                CRO=null;
        for(var i=0;i<RQ.length-1;i++)
                RQ[i]=RQ[i+1];
        --RQ.length;
}
}<!--#rem
RSCH()  ReadyStateChangeHandler()
-->
ARO.prototype.RSCH=function(){
if(CRO.obj!=null&&CRO.obj.readyState==4){
        var RO=CRO;
        CRO=null;
        if(RO.CB!=null)
                RO.CB(RO);
        if(RQ.length)
                dQ();
}
}<!--#rem
G(u,p)          GET(url,params)
-->
ARO.prototype.G=function(u,p){
if(this.obj==null||u==null||u=="")
        return false;
if(CRO!=null||RQ.length>0){
        RQ[RQ.length]=new Array(this,"G",u,p);
        return true;
}
CRO=this;
return this.dG(u,p);
}<!--#rem
dG(u,p) doGet(url, params)
-->
ARO.prototype.dG=function(u,p){
try{
        this.obj.open("GET",u+(p&&p.length?"?"+p:""),true);
        this.obj.onreadystatechange=this.RSCH;
        this.obj.send(null);
        return true;
}catch(e){
        CRO=null;
        return false;
}
}<!--#rem
PF(a,d)         POSTForm(Action,Data)
-->
ARO.prototype.PF=function(a,d){
if(d==null||d==""||a==null||a=="")
        return false;
if(CRO!=null||RQ.length>0){
        RQ[RQ.length]=new Array(this,"PF",a,d);
        return true;
}
CRO=this;
return this.dPF(a,d);
}<!--#rem
dPF(u,fs)       doPostForm(URL, FormString)
-->
ARO.prototype.dPF=function(u,fs){
try{
        this.obj.open("POST",u,true);
        this.obj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        this.obj.onreadystatechange=this.RSCH;
        this.obj.send(fs);
        return true;
}catch(e){
        CRO=null;
        return false;
}
}
var HD=new String("0123456789abcdef");<!--#rem
The following functions are necessary since various browser developers have failed to implement arithmetic operations on unsigned 32-bit numbers correctly
AND(a,b)        == a&b
OR(a,b) == a|b
XOR(a,b)        == a^b
NOT(a)          == ~a
ADD(a,b)        == a+b
LS(a,s) == a<<s
RS(a,s) == a>>s
-->
function AND(a,b){
var hb=(a>=0x80000000)&&(b>=0x80000000);
var r=0;
if(a>=0x80000000)a-=0x80000000;
if(b>=0x80000000)b-=0x80000000;
r=a&b;
if(hb)
r+=0x80000000;
return r;
}
function OR(a,b){
var hb=(a>=0x80000000)||(b>=0x80000000);
var r=0;
if(a>=0x80000000)a-=0x80000000;
if(b>=0x80000000)b-=0x80000000;
r=a|b;
if(hb)
r+=0x80000000;
return r;
}
function XOR(a,b){
var hb=((a>=0x80000000)&&(b<0x80000000))||((a<0x80000000)&&(b>=0x80000000));
var r=0;
if(a>=0x80000000)a-=0x80000000;
if(b>=0x80000000)b-=0x80000000;
r=a^b;
if(hb)
r+=0x80000000;
return r;
}
function NOT(a){
var b=0x80000000;
var n=0;
while(b>=1){
if(a>=b)
        a-=b;
else
        n+=b;
b=b/2;
}
return n;
}
function ADD(a,b){
var n=0;
if(a>=0x80000000){
++n;
a-=0x80000000;
}
if(b>=0x80000000){
++n;
b-=0x80000000;
}
a+=b;
if(n==1){
        if(a>=0x80000000)
                a-=0x80000000;
        else
                a+=0x80000000;
}
return a;
}
function LS(a,s){
for(var i=0;i<s;i++){
if(a>=0x80000000)
        a-=0x80000000;
a=a*2;
}
return a;
}
function RS(a,s){
for(var i=0;i<s;i++){
if(a%2)
        a-=1;
a=a/2;
}
return a;
}<!--#rem
function H1
converts the high nibble of the byte c into a hex character
-->
function HEX1(c){return HD.substr((c>>4)&0x0F,1);}<!--#rem
function H2
converts the low nibble of byte c into a hex character
-->
function HEX2(c){return HD.substr(c&0x0F,1);}<!--#rem
SHA1 State variables
-->
var PD=new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
var H=new Array();
var B=new Array();
var KV=new Array();
KV[0]=0x5A827999;
KV[1]=0x6ED9EBA1;
KV[2]=0x8F1BBCDC;
KV[3]=0xCA62C1D6;
var TL=0;
var BL=0;
function K(n){
return KV[Math.floor(n / 20)];
}
function S(v,n){
return OR(LS(v,n),RS(v,32-n));
}
function f(n,B,C,D){
switch(Math.floor(n/20)){
case 0:return OR(AND(B,C),AND(NOT(B),D));
case 2:return OR(OR(AND(B,C),AND(B,D)),AND(C,D));
default:return XOR(XOR(B,C),D);
}
}<!--#rem
EC(I,L,O)       Encode (Input, Length, Output)
Encodes input (UINT4) into output (unsigned char). Assumes len is a multiple of 4.
-->
function EC(I,L,O){
var i, j;
for(i=0,j=0;j<L;i++,j+=4){
        O[j]=AND(RS(I[i],24),0xFF);
        O[j+1]=AND(RS(I[i],16),0xFF);
        O[j+2]=AND(RS(I[i],8),0xFF);
        O[j+3]=AND(I[i],0xFF);
}
}<!--#rem
DC(I,L,O)       Decode(Input, Length, Output)
Decodes input (unsigned char) into output (UINT4). Assumes len is a multiple of 4.
-->
function DC(I,L,O){
var i, j;
for (i=0,j=0;j<L;i++,j+=4){
        O[i]=0;
        O[i]=ADD(O[i],LS(I[j],24));
        O[i]=ADD(O[i],LS(I[j+1],16));
        O[i]=ADD(O[i],LS(I[j+2],8));
        O[i]=ADD(O[i],I[j+3]);
}
}<!--#rem
TF(bl)  Transform(block)
SHA1 basic transformation. Transforms state based on block.
-->
function TF(bl){
var a,b,c,d,e,t;
var W=new Array();
var i;
DC(bl,64,W);
for(i=16;i<80;i++){
        W[i]=S(XOR(XOR(XOR(W[i-3],W[i-8]),W[i-14]),W[i-16]),1);
}
a=H[0];b=H[1];c=H[2];d=H[3];e=H[4];
for(i=0;i<80;i++){
        t=ADD(ADD(ADD(ADD(S(a,5),f(i,b,c,d)),e),W[i]),K(i));
        e=AND(d,0xFFFFFFFF);
        d=AND(c,0xFFFFFFFF);
        c=AND(S(b,30),0xFFFFFFFF);
        b=AND(a,0xFFFFFFFF);
        a=AND(t,0xFFFFFFFF);
}
H[0]=ADD(H[0],a);
H[1]=ADD(H[1],b);
H[2]=ADD(H[2],c);
H[3]=ADD(H[3],d);
H[4]=ADD(H[4],e);
}<!--#rem
CA(d, di, s, si, l)     CopyArray (Destination, Destination Index, Source, Source Index, Length)
-->
function CA(d,di,s,si,L){
for(i=0;i<L;i++)
        d[di+i]=s[si+i];
}<!--#rem
UD(I,L)         Update (Input, Length)
SHA1 block update operation. Continues an SHA1 message-digest operation, processing another message block, and updating the context.
-->
function UD(I,L){
var i=0;
TL+=L;
if(BL){
        if(64-BL>L)
                i=L;
        else    
                i=64-BL;
        CA(B,BL,I,0,i);
        BL+=i;
        if(BL<64)
                return;
        TF(B);
        BL=0;
}
while(L-i>=64){
        CA(B,0,I,i,64);
        i+=64;
        TF(B);
}
CA(B,0,I,i,L-i);
BL=L-i;
}<!--#rem
F()     Final ()
SHA1 finalization. Ends an SHA1 message-digest operation, writing the the message digest and zeroizing the context.
-->
function F(){
var D=new Array();
var R="";
B[BL++]=0x80
if(BL<56)
        CA(B,BL,PD,0,59-BL);
else{
        if(BL<64)
                CA(B,BL,PD,0,64-BL);
        TF(B);
        CA(B,0,PD,0,58);
}
B[59]=AND(RS(AND(TL,0xE0000000),29),0xFF);
TL=LS(TL,3);
B[60]=AND(RS(TL,24),0xFF);
B[61]=AND(RS(TL,16),0xFF);
B[62]=AND(RS(TL,8),0xFF);
B[63]=AND(TL,0xFF);
TF(B);<!--#rem
Store state in digest-->
EC(H,20,D);
for(i=0;i<20;i++){
        R+=String(HEX1(D[i]));
        R+=String(HEX2(D[i]));
}
return R;
}<!--#rem
SHA1(C,P)       SHA1(challenge, password)
computes the SHA-1 digest of the given password
-->
function SHA1(C,P){
var c=new Array()
var p=new Array();
var u;
var s,d;<!--#rem
Transfer challenge string to challenge byte array as UTF-8-->
for (s=0,d=0;s<C.length;s++){
        u=C.charCodeAt(s);
        if(u<0x80){
                c[d++]=u;
        }else if(u<0x0800){
                c[d++]=OR(RS(u,6),0xC0);
                c[d++]=OR(AND(u,0x0000003F),0x80);
        }else if(u<0x00010000){
                c[d++]=OR(RS(u,12),0xE0);
                c[d++]=OR(AND(RS(u,6),0x0000003F),0x80);
                c[d++]=OR(AND(u,0x0000003F),0x80);
        }else if(u<0x00200000){
                c[d++]=OR(RS(u,18),0xF0);
                c[d++]=OR(AND(RS(u,12),0x0000003F),0x80);
                c[d++]=OR(AND(RS(u,6),0x0000003F),0x80);
                c[d++]=OR(AND(u,0x0000003F),0x80);
        }
}<!--#rem
Transfer password string to password byte array as UTF-8-->
for (s=0,d=0;s<P.length;s++){
        u=P.charCodeAt(s);
        if(u<0x80){
                p[d++]=u;
        }else if(u<0x0800){
                p[d++]=OR(RS(u,6),0xC0);
                p[d++]=OR(AND(u,0x0000003F),0x80);
        }else if(u<0x00010000){
                p[d++]=OR(RS(u,12),0xE0);
                p[d++]=OR(AND(RS(u,6),0x0000003F),0x80);
                p[d++]=OR(AND(u,0x0000003F),0x80);
        }else if(u<0x00200000){
                p[d++]=OR(RS(u,18),0xF0);
                p[d++]=OR(AND(RS(u,12),0x0000003F),0x80);
                p[d++]=OR(AND(RS(u,6),0x0000003F),0x80);
                p[d++]=OR(AND(u,0x0000003F),0x80);
        }
}<!--#rem
Load magic initialization constants.-->
H[0]=0x67452301;
H[1]=0xEFCDAB89;
H[2]=0x98BADCFE;
H[3]=0x10325476;
H[4]=0xC3D2E1F0;
TL=0;
BL=0;
UD(c,c.length);
UD(p,p.length);
return F();
}<!--#rem
DP(F)   DigestPassword(Form)
Determines if an SHA1 digest can be computed for the target HTML form, and if so computes it.
-->
function DP(F){
var p=self.sp;
var E=F.elements;
if(p==null)
        p=E["password"].value.toUpperCase();
else
        E["savedpw"].value="1";
if (E["userid"].length==0)
        return false;
E["sha1"].value=SHA1(E["challenge"].value,p);
E["password"].value="";
return true;
}
var sp=null;<!--#if expr="$ENABLEAUTHSAVING"--><!--#rem
lc      LoadCredentials
checks for cookie saved credentials and pre-fills the login form with them
-->
function lc(){
var C=document.cookie;
var t=null;
var s=C.indexOf("fc1=");
var e;
var c;
if(s!=-1){
        var D=new Date();
        D.setTime(D.getTime() + 7776000000);
        s+=4;
        e=C.indexOf(';',s);
        if(e==-1)
                e=C.length;
        t=C.substring(s,e)
        if(t.length){
                document.cookie="fc1="+t+";path=/;expires="+D.toGMTString();
                document.forms["LOGINFORM"].elements["userid"].value=du(t);
                s=C.indexOf("fc2=");
                if(s!=-1){
                        s+=4;
                        e=C.indexOf(';',s);
                        if(e==-1)
                                e=C.length;
                        t=C.substring(s,e);
                        if(t.length){
                                document.cookie="fc2="+t+";path=/;expires="+D.toGMTString();
                                self.sp=t;
                                document.forms["LOGINFORM"].elements["savepw"].checked=true;
                                document.forms["LOGINFORM"].elements["password"].value="************";
                        }
                }
        }
}
}<!--#rem
sc      SaveCredentials
Saves the current contents of the form in a cookie.  May pop up a warning dialog if attempt to save pw.

-->
function sc(F){
var u=F.elements["userid"].value;
var p=F.elements["password"].value;
if(sp==null&&u.length){
        var D=new Date();
        D.setTime(D.getTime() + 7776000000);
        if(p.length){
                document.cookie="fc1="+eu(u)+";path=/;expires="+D.toGMTString();
                document.cookie="fc2="+SHA1(u.toUpperCase(),p.toUpperCase())+";path=/;expires="+D.toGMTString();
        }else{  
                document.cookie="fc1="+eu(u)+";path=/;expires="+D.toGMTString();
                document.cookie="fc2=;path=/;expires="+D.toGMTString();
        }
}
}<!--#rem
cc      ClearCredentials
Clears any cookie saved credentials
-->
function cc(F){
var D=new Date();
D.setTime(D.getTime() + 7776000000);
F.elements["userid"].value="";
F.elements["password"].value="";
document.cookie="fc1=;path=/;expires="+D.toGMTString();
document.cookie="fc2=;path=/;expires="+D.toGMTString();
}<!--#rem
eu      EncodeUserID
Extremely simple scramble algorithm to provide minimal obfuscation for saved userid cookies.  Note that this is effectively security by obscurity and will only serve to discourage rank amateurs.
-->
function eu(p){
var pa=new Array();
var sa=new Array();
var oa="";
var s="<X-FC-SERVER NAME>";
var i=0;
var cs=0;
for(i=0;i<13;i++){
        sa[i]=s.charCodeAt(i%s.length);
        if(cs==0)
                sa[i]=sa[i]%256;
}
pa[0]=p.length;
for(i=0;i<p.length;i++) {
        pa[i+1]=p.charCodeAt(i);
        if(pa[i+1]>255)
                cs=1;
}
for(i=p.length;i<13;i++)
        pa[i+1]=Math.floor(Math.random()*(cs==1?65535:255));
for(i=0;i<13;i++){
        if(i%2){
                pa[i]=pa[i]+sa[i];
                if(cs)
                        pa[i]=pa[i]%65536;
                else
                        pa[i]=pa[i]%256;
        }else{
                pa[i]=pa[i]-sa[i];
                if(pa[i]<0 && cs)
                        pa[i]+=65536;
                else if(pa[i]<0)
                        pa[i]+=256;
        }
}
if(cs){
for(i=0;i<13;i++)
        oa+=HD.charAt(AND(RS(AND(pa[(i+2)%13],0x00F0),4),0x000F));
for(i=0;i<13;i++)
        oa+=HD.charAt(AND(RS(AND(pa[(i+11)%13],0xF000),12),0x000F));
for(i=0;i<13;i++)
        oa+=HD.charAt(AND(RS(AND(pa[(i+5)%13],0x0F00),8),0x000F));
for(i=0;i<13;i++)
        oa+=HD.charAt(AND(pa[(i+1)%13],0x000F));
}else{
for(i=0;i<13;i++)
        oa+=HD.charAt(AND(pa[(i+7)%13],0x0F));
for(i=0;i<13;i++)
        oa+=HD.charAt(AND(RS(AND(pa[(i+4)%13],0xF0),4),0x0F));
}
return oa;
}<!--#rem
du      DecodeUserID
Decodes a userID encoded using EncodeUserID
-->
function du(e){
var pa=new Array();
var sa=new Array();
var cs=(e.length==52?1:0);
var s="<X-FC-SERVER NAME>";
var i=0;
var p="";
for(i=0;i<13;i++){
        sa[i]=s.charCodeAt(i%s.length);
        if(cs==0)
                sa[i]=sa[i]%256;
}
for(i=0;i<13;i++)
        pa[i]=0;
if(cs){
for(i=0;i<13;i++)
        pa[(i+2)%13]+=(0x0010*parseInt(e.charAt(i),16));
for(i=13;i<26;i++)
        pa[(i+11)%13]+=(0x1000*parseInt(e.charAt(i),16));
for(i=26;i<39;i++)
        pa[(i+5)%13]+=(0x0100*parseInt(e.charAt(i),16));
for(i=39;i<52;i++)
        pa[(i+1)%13]+=(parseInt(e.charAt(i),16));
}else{
for(i=0;i<13;i++)
        pa[(i+7)%13]+=(parseInt(e.charAt(i),16));
for(i=13;i<26;i++)
        pa[(i+4)%13]+=(0x10*parseInt(e.charAt(i),16));
}
for(i=0;i<13;i++)
        pa[i]+=(cs==1?65536:256);
for(i=0;i<13;i++){
        if(i%2)
                pa[i]=pa[i]-sa[i];
        else
                pa[i]=pa[i]+sa[i];
}
for(i=0;i<13;i++)
        pa[i]=pa[i]%(cs?65536:256);
for(i=1;i<(pa[0]+1);i++)
        p+=String.fromCharCode(pa[i]);
return p;
}<!--#endif-->
//-->
</script>
<!--#include virtual="/.Templates/WebStyle.inc${SKIN}"-->
<!--#include virtual="/.Templates/WebHeader.inc${SKIN}"--><!--#set var="ARTICLENDX" value="-1"--><!--#set var="NUMCOMMENTS" value="0"--><!--#set var="INDEX" value="-1"--><!--#while expr="++$INDEX < <X-FC-NUMITEMS>"--><!--#if expr="<X-FC-LIST-ITEM `$INDEX` EXISTS>"--><!--#if expr="<X-FC-LIST-ITEM `$INDEX` COLUMN[Status] Unapproved> == 0 && <X-FC-LIST-ITEM `$INDEX` COLUMN[Status] Deleted> == 0 && `<X-FC-LIST-ITEM `$INDEX` COLUMN[ThreadID] HEX>` == `<X-FC-URL-PARAMETER ThreadID>`"--><!--#if expr="<X-FC-LIST-ITEM `$INDEX` COLUMN[ObjType] IsDoc>"--><!--#set var="ARTICLENDX" value="$INDEX"--><!--#elif expr="<X-FC-LIST-ITEM `$INDEX` COLUMN[ObjType] IsMsg>"--><!--#set var="NUMCOMMENTS" expr="$NUMCOMMENTS + 1"--><!--#endif--><!--#endif--><!--#endif--><!--#endwhile-->
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
        <td><img src="/Icons/0" alt="" width="10" height="1" border="0"/></td>  
        <td width="100%"><table width="100%" cellpadding="0" cellspacing="0" border="0">
        <tr>
                <td><img src="/Icons/0" alt="" width="1" height="5" border="0"/></td>
        </tr><!--#if expr="$ARTICLENDX != -1"-->
        <tr>
                <td><a class="SubTitleB" href="<X-FC-OBJURL>?Plugin=Blog&amp;Documents=1&amp;OpenArticleURL=<X-FC-LIST-ITEM-URI `$ARTICLENDX` RELATIVE>"><X-FC-LIST-ITEM `$ARTICLENDX` COLUMN[Subject]></a></td>
        </tr>
        <tr>
                <td><img src="/Icons/0" alt="" width="1" height="3" border="0"/></td>
        </tr>   
        <tr>
                <td bgcolor="#BBBBBB"><img src="/Icons/0" alt="" width="1" height="1" border="0"/></td>
        </tr>
        <tr>
                <td><img src="/Icons/0" alt="" width="1" height="3" border="0"/></td>
        </tr>   
        <tr>
                <td><table width="100%" cellpadding="0" cellspacing="0" border="0">
                <tr>
                        <td class="DocInfo" nowrap="nowrap"><!--#if expr="<X-FC-LIST-ITEM `$ARTICLENDX` COLUMN[1001] EXISTS>"--><X-FC-LIST-ITEM `$ARTICLENDX` COLUMN[1001] LONGTIME><!--#else--><X-FC-LIST-ITEM `$ARTICLENDX` COLUMN[DATE] LONGTIME><!--#endif--></td>
                        <td class="DocInfo" align="right" nowrap="nowrap"><X-FC-FIELD LANG.7546.1 STRING> <X-FC-LIST-ITEM `$ARTICLENDX` COLUMN[8082] HTML></td>
                </tr>
                </table></td>
        </tr><!--#if expr="<X-FC-LIST-ITEM `$ARTICLENDX` COLUMN[8063] EXISTS>"-->
        <tr>
                <td><img src="/Icons/0" alt="" width="1" height="15" border="0"/></td>
        </tr>
        <tr>
                <td class="gt"><!--#echo expr="@substr(`<X-FC-LIST-ITEM `$ARTICLENDX` COLUMN[8063]>`,0,250)"--></td>
        </tr><!--#endif--><!--#endif ARTICLENDX != -1-->
        <tr>
                <td><img src="/Icons/0" alt="" width="1" height="30" border="0"/></td>
        </tr>
        <tr>
                <td class="BlogHColor"><img src="/Icons/0" alt="" width="1" height="3" border="0"/></td>
        </tr>
        <tr>
                <td class="BlogHColor"><table cellpadding="0" cellspacing="0" border="0">
                <tr>
                        <td class="BlogHInfo">&nbsp;</td>
                        <td class="BlogHInfo"><!--#set var="COMMENTSSTR" value="<X-FC-FIELD LANG.7547.6 STRING>"--><!--#echo expr="@split($COMMENTSSTR, "^1")"--><!--#echo var="NUMCOMMENTS"--><!--#echo var="COMMENTSSTR"--></td>
                </tr>
                </table></td>
        </tr>
        <tr>
                <td class="BlogHColor"><img src="/Icons/0" alt="" width="1" height="3" border="0"/></td>
        </tr>
        <tr>
                <td><img src="/Icons/0" alt="" width="1" height="20" border="0"/></td>
        </tr>


Top of Page