use a javascript layer instead of a browser popup (popup blockers), really generalize...
authorivan <ivan>
Sun, 20 Feb 2005 08:44:40 +0000 (08:44 +0000)
committerivan <ivan>
Sun, 20 Feb 2005 08:44:40 +0000 (08:44 +0000)
CREDITS
FS/FS/UI/Web.pm
httemplate/edit/rate.cgi
httemplate/elements/jsrsServer.html [new file with mode: 0644]
httemplate/elements/overlibmws.js [new file with mode: 0644]
httemplate/elements/progress-init.html [new file with mode: 0644]
httemplate/elements/progress-popup.html [new file with mode: 0644]
httemplate/misc/progress.html [deleted file]

diff --git a/CREDITS b/CREDITS
index 02dd9a8..048fbf5 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -145,5 +145,10 @@ JSRS-LICENSE file).
 Contains the QLIB JavaScript library <http://qlib.quazzle.com/> by 
 Quazzle.com, Serge Dolgov, licensed under the terms of the GNU GPL.
 
 Contains the QLIB JavaScript library <http://qlib.quazzle.com/> by 
 Quazzle.com, Serge Dolgov, licensed under the terms of the GNU GPL.
 
+Contains the overlibmws DHTML Popup Library <http://www.macridesweb.com/oltest/>
+by Foteos Macrides (derived from overLIB <http://www.bosrup.com/web/overlib/>
+by Erik Bosrup), licensed under the terms of the Artistic license
+<http://www.macridesweb.com/oltest/license.html>.
+
 Everything else is my (Ivan Kohler <ivan@420.am>) fault.
 
 Everything else is my (Ivan Kohler <ivan@420.am>) fault.
 
index 646804d..d5c7168 100644 (file)
@@ -9,14 +9,17 @@ package FS::UI::Web;
 
 package FS::UI::Web::JSRPC;
 
 
 package FS::UI::Web::JSRPC;
 
+use strict;
 use vars qw(@ISA $DEBUG);
 use Storable qw(nfreeze);
 use MIME::Base64;
 use JavaScript::RPC::Server::CGI;
 use FS::UID;
 use vars qw(@ISA $DEBUG);
 use Storable qw(nfreeze);
 use MIME::Base64;
 use JavaScript::RPC::Server::CGI;
 use FS::UID;
+use FS::Record qw(qsearchs);
+use FS::queue;
 
 @ISA = qw( JavaScript::RPC::Server::CGI );
 
 @ISA = qw( JavaScript::RPC::Server::CGI );
-$DEBUG = 1;
+$DEBUG = 0;
 
 sub new {
         my $class = shift;
 
 sub new {
         my $class = shift;
@@ -59,6 +62,32 @@ sub start_job {
   
 }
 
   
 }
 
+sub job_status {
+  my( $self, $jobnum ) = @_; #$url ???
+
+  sleep 5; #could use something better...
+
+  my $job;
+  if ( $jobnum =~ /^(\d+)$/ ) {
+    $job = qsearchs('queue', { 'jobnum' => $jobnum } );
+  } else {
+    die "FS::UI::Web::job_status: illegal jobnum $jobnum\n";
+  }
+
+  my @return;
+  if ( $job && $job->status ne 'failed' ) {
+    @return = ( 'progress', $job->statustext );
+  } elsif ( !$job ) { #handle job gone case : job sucessful
+                      # so close popup, redirect parent window...
+    @return = ( 'complete' );
+  } else {
+    @return = ( 'error', $job ? $job->statustext : $jobnum );
+  }
+
+  join("\n",@return);
+
+}
+
 sub get_new_query {
   FS::UID::cgi();
 }
 sub get_new_query {
   FS::UID::cgi();
 }
index 1c5d61d..ce56768 100644 (file)
@@ -32,42 +32,13 @@ END
     ))
 %>
 
     ))
 %>
 
-<!-- <FORM ACTION="<%=$p1%>rate.cgi" NAME="OneTrueForm" METHOD=POST onSubmit="document.OneTrueForm.submit.disabled=true"> -->
-
-<SCRIPT TYPE="text/javascript" SRC="../elements/jsrsClient.js"></SCRIPT>
-<SCRIPT TYPE="text/javascript">
-function process () {
-  document.OneTrueForm.submit.disabled=true;
-
-  var Hash = new Array();
-  var x = 0;
-  var fieldName;
-  for (var i = 0; i<document.OneTrueForm.elements.length; i++) {
-    fieldName = document.OneTrueForm.elements[i].name;
-    if (    (fieldName.indexOf('rate') > -1)
-         || (fieldName.indexOf('min_') > -1) 
-         || (fieldName.indexOf('sec_') > -1) 
-       )
-    {
-        Hash[x++] = fieldName;
-        Hash[x++] = document.OneTrueForm.elements[i].value;
-    }
-  }
-
-  jsrsPOST = true;
-  //jsrsExecute( 'process/rate.cgi', myCallback, 'process_rate', Hash );
-  jsrsExecute( 'process/rate.cgi', myCallback, 'start_job', Hash );
-
-}
-
-function myCallback( jobnum ) {
-  var progressWindow = window.open('../../misc/progress.html?jobnum=' + jobnum + ';url=<%=$p%>browse/rate.cgi', 'progressWindow', 'toolbar=no,location=no,directories=no,scrollbars=no,menubar=no,status=no,width=420,height=128');
-  progressWindow.opener = self;
-  //progressWindow.opener = document;
-}
-
-</SCRIPT>
-
+<%= include('/elements/progress-init.html',
+              'OneTrueForm',
+              [ 'rate', 'min_', 'sec_' ],
+              'process/rate.cgi',
+              $p.'browse/rate.cgi',
+           )
+%>
 <FORM NAME="OneTrueForm">
 <INPUT TYPE="hidden" NAME="ratenum" VALUE="<%= $rate->ratenum %>">
 
 <FORM NAME="OneTrueForm">
 <INPUT TYPE="hidden" NAME="ratenum" VALUE="<%= $rate->ratenum %>">
 
@@ -124,9 +95,6 @@ Rate plan
 <BR><INPUT NAME="submit" TYPE="button" VALUE="<%= 
   $rate->ratenum ? "Apply changes" : "Add rate plan"
 %>" onClick="document.OneTrueForm.submit.disabled=true; process();">
 <BR><INPUT NAME="submit" TYPE="button" VALUE="<%= 
   $rate->ratenum ? "Apply changes" : "Add rate plan"
 %>" onClick="document.OneTrueForm.submit.disabled=true; process();">
-Please make sure to allow popups from this site in order to view the progress window.
-<!-- Please be patient, <%= $rate->ratenum ? 'editing' : 'adding' %>
-a rate plan can take a few minutes... -->
 
     </FORM>
   </BODY>
 
     </FORM>
   </BODY>
diff --git a/httemplate/elements/jsrsServer.html b/httemplate/elements/jsrsServer.html
new file mode 100644 (file)
index 0000000..d6d5370
--- /dev/null
@@ -0,0 +1,4 @@
+<%
+my $server = new FS::UI::Web::JSRPC;
+$server->process;
+%>
diff --git a/httemplate/elements/overlibmws.js b/httemplate/elements/overlibmws.js
new file mode 100644 (file)
index 0000000..fba1105
--- /dev/null
@@ -0,0 +1,709 @@
+/*\r
+ Do not remove or change this notice.\r
+ overlibmws.js core module - Copyright Foteos Macrides 2002-2005. All rights reserved.\r
+   Initial: August 18, 2002 - Last Revised: February 10, 2005\r
+ This module is subject to the same terms of usage as for Erik Bosrup's overLIB,\r
+ though only a minority of the code and API now correspond with Erik's version.\r
+ See the overlibmws Change History and Command Reference via:\r
+\r
+       http://www.macridesweb.com/oltest/\r
+\r
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html\r
+ Give credit on sites that use overlibmws and submit changes so others can use them as well.\r
+ You can get Erik's version via: http://www.bosrup.com/web/overlib/\r
+*/\r
+\r
+// PRE-INIT -- Ignore these lines, configuration is below.\r
+var OLloaded=0,pmCnt=1,pMtr=new Array(),OLv,OLudf,OLrefXY;\r
+var OLpct=new Array("83%","67%","83%","100%","117%","150%","200%","267%");\r
+var OLbubblePI=0,OLcrossframePI=0,OLdebugPI=0,OLdraggablePI=0,OLexclusivePI=0,OLfilterPI=0;\r
+var OLfunctionPI=0,OLhidePI=0,OLiframePI=0,OLovertwoPI=0,OLscrollPI=0,OLshadowPI=0;\r
+if(typeof OLgateOK=='undefined')var OLgateOK=1;\r
+OLregCmds(\r
+ 'inarray,caparray,caption,sticky,nofollow,background,noclose,mouseoff,offdelay,right,left,'\r
++'center,offsetx,offsety,fgcolor,bgcolor,cgcolor,textcolor,capcolor,closecolor,width,wrap,'\r
++'wrapmax,height,border,base,status,autostatus,autostatuscap,snapx,snapy,fixx,fixy,relx,rely,'\r
++'midx,midy,ref,refc,refp,refx,refy,fgbackground,bgbackground,cgbackground,padx,pady,fullhtml,'\r
++'below,above,vcenter,capicon,textfont,captionfont,closefont,textsize,captionsize,closesize,'\r
++'timeout,delay,hauto,vauto,nojustx,nojusty,closetext,closeclick,closetitle,fgclass,bgclass,'\r
++'cgclass,capbelow,textpadding,textfontclass,captionpadding,captionfontclass,closefontclass,'\r
++'label,donothing');\r
+\r
+function OLud(v){return eval('typeof ol_'+v+'=="undefined"')?1:0;}\r
+\r
+// DEFAULT CONFIGURATION -- See overlibConfig.txt for descriptions.\r
+if(OLud('fgcolor'))var ol_fgcolor="#CCCCFF";\r
+if(OLud('bgcolor'))var ol_bgcolor="#333399";\r
+if(OLud('cgcolor'))var ol_cgcolor="#333399";\r
+if(OLud('textcolor'))var ol_textcolor="#000000";\r
+if(OLud('capcolor'))var ol_capcolor="#FFFFFF";\r
+if(OLud('closecolor'))var ol_closecolor="#EEEEFF";\r
+if(OLud('textfont'))var ol_textfont="Verdana,Arial,Helvetica";\r
+if(OLud('captionfont'))var ol_captionfont="Verdana,Arial,Helvetica";\r
+if(OLud('closefont'))var ol_closefont="Verdana,Arial,Helvetica";\r
+if(OLud('textsize'))var ol_textsize=1;\r
+if(OLud('captionsize'))var ol_captionsize=1;\r
+if(OLud('closesize'))var ol_closesize=1;\r
+if(OLud('fgclass'))var ol_fgclass="";\r
+if(OLud('bgclass'))var ol_bgclass="";\r
+if(OLud('cgclass'))var ol_cgclass="";\r
+if(OLud('textpadding'))var ol_textpadding=2;\r
+if(OLud('textfontclass'))var ol_textfontclass="";\r
+if(OLud('captionpadding'))var ol_captionpadding=2;\r
+if(OLud('captionfontclass'))var ol_captionfontclass="";\r
+if(OLud('closefontclass'))var ol_closefontclass="";\r
+if(OLud('close'))var ol_close="Close";\r
+if(OLud('closeclick'))var ol_closeclick=0;\r
+if(OLud('closetitle'))var ol_closetitle="Click to Close";\r
+if(OLud('text'))var ol_text="Default Text";\r
+if(OLud('cap'))var ol_cap="";\r
+if(OLud('capbelow'))var ol_capbelow=0;\r
+if(OLud('background'))var ol_background="";\r
+if(OLud('width'))var ol_width=200;\r
+if(OLud('wrap'))var ol_wrap=0;\r
+if(OLud('wrapmax'))var ol_wrapmax=0;\r
+if(OLud('height'))var ol_height= -1;\r
+if(OLud('border'))var ol_border=1;\r
+if(OLud('base'))var ol_base=0;\r
+if(OLud('offsetx'))var ol_offsetx=10;\r
+if(OLud('offsety'))var ol_offsety=10;\r
+if(OLud('sticky'))var ol_sticky=0;\r
+if(OLud('nofollow'))var ol_nofollow=0;\r
+if(OLud('noclose'))var ol_noclose=0;\r
+if(OLud('mouseoff'))var ol_mouseoff=0;\r
+if(OLud('offdelay'))var ol_offdelay=300;\r
+if(OLud('hpos'))var ol_hpos=RIGHT;\r
+if(OLud('vpos'))var ol_vpos=BELOW;\r
+if(OLud('status'))var ol_status="";\r
+if(OLud('autostatus'))var ol_autostatus=0;\r
+if(OLud('snapx'))var ol_snapx=0;\r
+if(OLud('snapy'))var ol_snapy=0;\r
+if(OLud('fixx'))var ol_fixx= -1;\r
+if(OLud('fixy'))var ol_fixy= -1;\r
+if(OLud('relx'))var ol_relx=null;\r
+if(OLud('rely'))var ol_rely=null;\r
+if(OLud('midx'))var ol_midx=null;\r
+if(OLud('midy'))var ol_midy=null;\r
+if(OLud('ref'))var ol_ref="";\r
+if(OLud('refc'))var ol_refc='UL';\r
+if(OLud('refp'))var ol_refp='UL';\r
+if(OLud('refx'))var ol_refx=0;\r
+if(OLud('refy'))var ol_refy=0;\r
+if(OLud('fgbackground'))var ol_fgbackground="";\r
+if(OLud('bgbackground'))var ol_bgbackground="";\r
+if(OLud('cgbackground'))var ol_cgbackground="";\r
+if(OLud('padxl'))var ol_padxl=1;\r
+if(OLud('padxr'))var ol_padxr=1;\r
+if(OLud('padyt'))var ol_padyt=1;\r
+if(OLud('padyb'))var ol_padyb=1;\r
+if(OLud('fullhtml'))var ol_fullhtml=0;\r
+if(OLud('capicon'))var ol_capicon="";\r
+if(OLud('frame'))var ol_frame=self;\r
+if(OLud('timeout'))var ol_timeout=0;\r
+if(OLud('delay'))var ol_delay=0;\r
+if(OLud('hauto'))var ol_hauto=0;\r
+if(OLud('vauto'))var ol_vauto=0;\r
+if(OLud('nojustx'))var ol_nojustx=0;\r
+if(OLud('nojusty'))var ol_nojusty=0;\r
+if(OLud('label'))var ol_label="";\r
+// ARRAY CONFIGURATION - See overlibConfig.txt for descriptions.\r
+if(OLud('texts'))var ol_texts=new Array("Text 0","Text 1");\r
+if(OLud('caps'))var ol_caps=new Array("Caption 0","Caption 1");\r
+// END CONFIGURATION -- Don't change anything below, all configuration is above.\r
+\r
+// INIT -- Runtime variables.\r
+var o3_text="",o3_cap="",o3_sticky=0,o3_nofollow=0,o3_background="",o3_noclose=0,o3_mouseoff=0;\r
+var o3_offdelay=300,o3_hpos=RIGHT,o3_offsetx=10,o3_offsety=10,o3_fgcolor="",o3_bgcolor="";\r
+var o3_cgcolor="",o3_textcolor="",o3_capcolor="",o3_closecolor="",o3_width=200,o3_wrap=0;\r
+var o3_wrapmax=0,o3_height= -1,o3_border=1,o3_base=0,o3_status="",o3_autostatus=0,o3_snapx=0;\r
+var o3_snapy=0,o3_fixx= -1,o3_fixy= -1,o3_relx=null,o3_rely=null,o3_midx=null,o3_midy=null;\r
+var o3_ref="",o3_refc='UL',o3_refp='UL',o3_refx=0,o3_refy=0,o3_fgbackground="";\r
+var o3_bgbackground="",o3_cgbackground="",o3_padxl=0,o3_padxr=0,o3_padyt=0,o3_padyb=0;\r
+var o3_fullhtml=0,o3_vpos=BELOW,o3_capicon="",o3_textfont="Verdana,Arial,Helvetica";\r
+var o3_captionfont="Verdana,Arial,Helvetica",o3_closefont="Verdana,Arial,Helvetica";\r
+var o3_textsize=1,o3_captionsize=1,o3_closesize=1,o3_frame=self,o3_timeout=0,o3_delay=0;\r
+var o3_hauto=0,o3_vauto=0,o3_nojustx=0,o3_nojusty=0,o3_close="Close",o3_closeclick=0;\r
+var o3_closetitle="",o3_fgclass="",o3_bgclass="",o3_cgclass="",o3_textpadding=2;\r
+var o3_textfontclass="",o3_captionpadding=2,o3_captionfontclass="",o3_closefontclass="";\r
+var o3_capbelow=0,o3_label="",CSSOFF=DONOTHING,CSSCLASS=DONOTHING;\r
+var OLx=0,OLy=0,OLshowingsticky=0,OLallowmove=0,OLremovecounter=0;\r
+var OLdelayid=0,OLtimerid=0,OLshowid=0,OLndt=0;\r
+var over=null,OLfnRef="",OLhover=0;\r
+var OLua=navigator.userAgent.toLowerCase();\r
+var OLns4=(navigator.appName=='Netscape'&&parseInt(navigator.appVersion)==4);\r
+var OLns6=(document.getElementById)?1:0;\r
+var OLie4=(document.all)?1:0;\r
+var OLgek=(OLv=OLua.match(/gecko\/(\d{8})/i))?parseInt(OLv[1]):0;\r
+var OLmac=(OLua.indexOf('mac')>=0)?1:0;\r
+var OLsaf=(OLua.indexOf('safari')>=0)?1:0;\r
+var OLkon=(OLua.indexOf('konqueror')>=0)?1:0;\r
+var OLkht=(OLsaf||OLkon)?1:0;\r
+var OLopr=(OLua.indexOf('opera')>=0)?1:0;\r
+var OLop7=(OLopr&&document.createTextNode)?1:0;\r
+if(OLopr){OLns4=OLns6=0;if(!OLop7)OLie4=0;}\r
+var OLieM=((OLie4&&OLmac)&&!(OLkht||OLopr))?1:0;\r
+var OLie5=0,OLie55=0;if(OLie4&&!OLop7){\r
+if((OLv=OLua.match(/msie (\d\.\d+)\.*/i))&&(OLv=parseFloat(OLv[1]))>=5.0){\r
+OLie5=1;OLns6=0;if(OLv>=5.5)OLie55=1;}if(OLns6)OLie4=0;}\r
+if(OLns4)window.onresize=function(){location.reload();}\r
+var OLchkMh=1,OLdw;\r
+if(OLns4||OLie4||OLns6)OLmh();\r
+else{overlib=nd=cClick=OLpageDefaults=no_overlib;}\r
+\r
+/*\r
+ PUBLIC FUNCTIONS\r
+*/\r
+// Loads defaults then args into runtime variables.\r
+function overlib(){\r
+if(!(OLloaded&&OLgateOK))return;\r
+if((OLexclusivePI)&&OLisExclusive(overlib.arguments))return true;\r
+if(OLchkMh)OLmh();\r
+if(OLndt&&!OLtimerid)OLndt=0;if(over)cClick();\r
+OLloadP1or2();OLload('close,closeclick,closetitle,noclose,mouseoff,offdelay,sticky,'\r
++'closecolor,closefont,closesize,closefontclass,frame,label');OLfnRef="";OLhover=0;\r
+OLsetRunTimeVar();\r
+OLparseTokens('o3_',overlib.arguments);\r
+if(!(over=OLmkLyr()))return false;\r
+if(OLbubblePI)OLchkForBubbleEffect();\r
+if(OLdebugPI)OLsetDebugCanShow();\r
+if(OLshadowPI)OLinitShadow();\r
+if(OLiframePI)OLinitIfs();\r
+if(OLfilterPI)OLinitFilterLyr();\r
+if(OLexclusivePI&&o3_exclusive&&o3_exclusivestatus!="")o3_status=o3_exclusivestatus;\r
+else if(o3_autostatus==2&&o3_cap!="")o3_status=o3_cap;\r
+else if(o3_autostatus==1&&o3_text!="")o3_status=o3_text;\r
+if(o3_delay==0){return OLmain();\r
+}else{OLdelayid=setTimeout("OLmain()",o3_delay);\r
+if(o3_status!=""){self.status=o3_status;return true;}\r
+else if(!(OLop7&&event&&event.type=='mouseover'))return false;}\r
+}\r
+\r
+// Clears popups if appropriate\r
+function nd(time){\r
+if(!(OLloaded&&OLgateOK))return;\r
+if((OLexclusivePI)&&OLisExclusive())return true;\r
+if(time&&over&&!o3_delay){if(OLtimerid>0)clearTimeout(OLtimerid);\r
+OLtimerid=(OLhover&&o3_frame==self&&!OLcursorOff())?0:\r
+setTimeout("cClick()",(o3_timeout=OLndt=time));\r
+}else{if(OLremovecounter>=1)OLshowingsticky=0;if(!OLshowingsticky){\r
+OLallowmove=0;if(over)OLhideObject(over);}else{OLremovecounter++;}}\r
+return true;\r
+}\r
+\r
+// Close function for stickies\r
+function cClick(){\r
+if(OLloaded&&OLgateOK){OLhover=0;if(over)OLhideObject(over);OLshowingsticky=0;}\r
+return false;\r
+}\r
+\r
+// Sets page-specific defaults.\r
+function OLpageDefaults(){\r
+OLparseTokens('ol_',OLpageDefaults.arguments);\r
+}\r
+\r
+// For unsupported browsers.\r
+function no_overlib(){return false;}\r
+\r
+/*\r
+ OVERLIB MAIN FUNCTION SET\r
+*/\r
+function OLmain(){\r
+o3_delay=0;\r
+if(o3_frame==self){if(o3_noclose)OLoptMOUSEOFF(0);else if(o3_mouseoff)OLoptMOUSEOFF(1);}\r
+OLdoLyr();\r
+OLallowmove=0;if(o3_timeout>0){\r
+if(OLtimerid>0)clearTimeout(OLtimerid);OLtimerid=setTimeout("cClick()",o3_timeout);}\r
+if(o3_ref){OLrefXY=OLgetRefXY(o3_ref);if(OLrefXY[0]==null){o3_ref="";o3_midx=0;o3_midy=0;}}\r
+OLdisp(o3_status);\r
+if(OLdraggablePI)OLcheckDrag();\r
+if(o3_status!="")return true;else if(!(OLop7&&event&&event.type=='mouseover'))return false;\r
+}\r
+\r
+// Loads defaults for primaries or secondaries\r
+function OLloadP1or2(){\r
+OLload('text,cap,capbelow,textpadding,captionpadding,border,base,status,autostatus,nofollow,'\r
++'width,wrap,wrapmax,height,hpos,vpos,offsetx,offsety,snapx,snapy,relx,rely,midx,midy,ref,'\r
++'refc,refp,refx,refy,fixx,fixy,nojustx,nojusty,hauto,vauto,timeout,delay,fgcolor,bgcolor,'\r
++'cgcolor,textcolor,capcolor,textfont,captionfont,textsize,captionsize,fgbackground,'\r
++'bgbackground,cgbackground,capicon,background,padxl,padxr,padyt,padyb,fullhtml,fgclass,'\r
++'bgclass,cgclass,textfontclass,captionfontclass');\r
+}\r
+function OLload(c){var i,m=c.split(',');for(i=0;i<m.length;i++)eval('o3_'+m[i]+'=ol_'+m[i]);}\r
+\r
+// Chooses LGF \r
+function OLdoLGF(){\r
+return (o3_background!=''||o3_fullhtml)?OLcontentBackground(o3_text,o3_background,o3_fullhtml):\r
+(o3_cap=="")?OLcontentSimple(o3_text):\r
+(o3_sticky)?OLcontentCaption(o3_text,o3_cap,o3_close):OLcontentCaption(o3_text,o3_cap,'');\r
+}\r
+\r
+// Makes Layer\r
+function OLmkLyr(id,f,z){\r
+id=(id||'overDiv');f=(f||o3_frame);z=(z||1000);var fd=f.document,d=OLgetRefById(id,fd);\r
+if(!d){if(OLns4)d=fd.layers[id]=new Layer(1024,f);else if(OLie4&&!document.getElementById){\r
+fd.body.insertAdjacentHTML('BeforeEnd','<div id="'+id+'"></div>');d=fd.all[id];\r
+}else{d=fd.createElement('div');if(d){d.id=id;fd.body.appendChild(d);}}if(!d)return null;\r
+if(OLns4)d.zIndex=z;else{var o=d.style;o.position='absolute';o.visibility='hidden';o.zIndex=z;}}\r
+return d;\r
+}\r
+\r
+// Creates and writes layer content\r
+function OLdoLyr(){\r
+if(o3_background==''&&!o3_fullhtml){\r
+if(o3_fgbackground!='')o3_fgbackground=' background="'+o3_fgbackground+'"';\r
+if(o3_bgbackground!='')o3_bgbackground=' background="'+o3_bgbackground+'"';\r
+if(o3_cgbackground!='')o3_cgbackground=' background="'+o3_cgbackground+'"';\r
+if(o3_fgcolor!='')o3_fgcolor=' bgcolor="'+o3_fgcolor+'"';\r
+if(o3_bgcolor!='')o3_bgcolor=' bgcolor="'+o3_bgcolor+'"';\r
+if(o3_cgcolor!='')o3_cgcolor=' bgcolor="'+o3_cgcolor+'"';\r
+if(o3_height>0)o3_height=' height="'+o3_height+'"';else o3_height='';}\r
+if(!OLns4)OLrepositionTo(over,(OLns6?20:0),0);var lyrHtml=OLdoLGF();\r
+if(o3_sticky){if(OLtimerid>0){clearTimeout(OLtimerid);OLtimerid=0;}\r
+OLshowingsticky=1;OLremovecounter=0;}\r
+if(o3_wrap&&!o3_fullhtml){OLlayerWrite(lyrHtml);\r
+o3_width=(OLns4?over.clip.width:over.offsetWidth);\r
+if(OLns4&&o3_wrapmax<1)o3_wrapmax=o3_frame.innerWidth-40;\r
+o3_wrap=0;if(o3_wrapmax>0&&o3_width>o3_wrapmax)o3_width=o3_wrapmax;lyrHtml=OLdoLGF();}\r
+OLlayerWrite(lyrHtml);o3_width=(OLns4?over.clip.width:over.offsetWidth);\r
+if(OLbubblePI)OLgenerateBubble(lyrHtml);\r
+}\r
+\r
+/*\r
+ LAYER GENERATION FUNCTIONS\r
+*/\r
+// Makes simple table without caption\r
+function OLcontentSimple(txt){\r
+var t=OLbgLGF()+OLfgLGF(txt)+OLbaseLGF();\r
+OLsetBackground('');return t;\r
+}\r
+\r
+// Makes table with caption and optional close link\r
+function OLcontentCaption(txt,title,close){\r
+var closing='',closeevent='onmouseover',caption,t;\r
+if(o3_closeclick==1)closeevent=(o3_closetitle?'title="'+o3_closetitle+'" ':'')+'onclick';\r
+if(o3_capicon!='')o3_capicon='<img src="'+o3_capicon+'" /> ';\r
+if(close!=''){closing='<td align="right"><a href="javascript:return '+OLfnRef+'cClick();" '\r
++closeevent+'="return '+OLfnRef+'cClick();"'+(o3_closefontclass?' class="'+o3_closefontclass\r
++'">':'>'+OLlgfUtil(0,'','span',o3_closecolor,o3_closefont,o3_closesize))+close\r
++(o3_closefontclass?'':OLlgfUtil(1,'','span'))+'</a></td>';}\r
+caption='<table'+OLwd(0)+' border="0" cellpadding="'+o3_captionpadding+'" cellspacing="0"'\r
++(o3_cgclass?' class="'+o3_cgclass+'"':o3_cgcolor+o3_cgbackground)+'><tr><td'+OLwd(0)\r
++(o3_cgclass?' class="'+o3_cgclass+'">':'>')+(o3_captionfontclass?'<div class="'\r
++o3_captionfontclass+'">':'<strong>'\r
++OLlgfUtil(0,'','div',o3_capcolor,o3_captionfont,o3_captionsize))+o3_capicon+title\r
++OLlgfUtil(1,'','div')+(o3_captionfontclass?'':'</strong>')+'</td>'+closing+'</tr></table>';\r
+t=OLbgLGF()+(o3_capbelow?OLfgLGF(txt)+caption:caption+OLfgLGF(txt))+OLbaseLGF();\r
+OLsetBackground('');return t;\r
+}\r
+\r
+// For BACKGROUND and FULLHTML commands\r
+function OLcontentBackground(txt, image, hasfullhtml){\r
+var t;if(hasfullhtml){t=txt;}else{t='<table'+OLwd(1)\r
++' border="0" cellpadding="0" cellspacing="0" '+'height="'+o3_height\r
++'"><tr><td colspan="3" height="'+o3_padyt+'"></td></tr><tr><td width="'\r
++o3_padxl+'"></td><td valign="top"'+OLwd(2)+'>'\r
++OLlgfUtil(0,o3_textfontclass,'div',o3_textcolor,o3_textfont,o3_textsize)+txt+\r
+OLlgfUtil(1,'','div')+'</td><td width="'+o3_padxr+'"></td></tr><tr><td colspan="3" height="'\r
++o3_padyb+'"></td></tr></table>';}\r
+OLsetBackground(image);return t;\r
+}\r
+\r
+// LGF utilities\r
+function OLbgLGF(){\r
+return '<table'+OLwd(1)+o3_height+' border="0" cellpadding="'+o3_border+'" cellspacing="0"'\r
++(o3_bgclass?' class="'+o3_bgclass+'"':o3_bgcolor+o3_bgbackground)+'><tr><td>';\r
+}\r
+function OLfgLGF(t){\r
+return '<table'+OLwd(0)+o3_height+' border="0" cellpadding="'+o3_textpadding\r
++'" cellspacing="0"'+(o3_fgclass?' class="'+o3_fgclass+'"':o3_fgcolor+o3_fgbackground)\r
++'><tr><td valign="top"'+(o3_fgclass?' class="'+o3_fgclass+'"':'')+'>'\r
++OLlgfUtil(0,o3_textfontclass,'div',o3_textcolor,o3_textfont,o3_textsize)+t\r
++OLlgfUtil(1,'','div')+'</td></tr></table>';\r
+}\r
+function OLlgfUtil(end,tfc,ele,col,fac,siz){\r
+if(end)return ('</'+(OLns4?'font':ele)+'>');else return (tfc?'<div class="'+tfc+'">':\r
+('<'+(OLns4?'font color="'+col+'" face="'+OLquoteMultiNameFonts(fac)+'" size="'+siz:ele\r
++' style="color:'+col+';font-family:'+OLquoteMultiNameFonts(fac)+';font-size:'+siz+';'\r
++(ele=='span'?'text-decoration:underline;':''))+'">'));\r
+}\r
+function OLquoteMultiNameFonts(f){\r
+var i,v,pM=f.split(',');\r
+for(i=0;i<pM.length;i++){v=pM[i];v=v.replace(/^\s+/,'').replace(/\s+$/,'');\r
+if(/\s/.test(v) && !/['"]/.test(v)){v="\'"+v+"\'";pM[i]=v;}}\r
+return pM.join();\r
+}\r
+function OLbaseLGF(){\r
+return ((o3_base>0&&!o3_wrap)?('<table width="100%" border="0" cellpadding="0" cellspacing="0"'\r
++(o3_bgclass?' class="'+o3_bgclass+'"':'')+'><tr><td height="'+o3_base\r
++'"></td></tr></table>'):'')+'</td></tr></table>';\r
+}\r
+function OLwd(a){\r
+return(o3_wrap?'':' width="'+(!a?'100%':(a==1?o3_width:(o3_width-o3_padxl-o3_padxr)))+'"');\r
+}\r
+\r
+// Loads image into the div.\r
+function OLsetBackground(i){\r
+if(i==''){if(OLns4)over.background.src=null;\r
+else{if(OLns6)over.style.width='';over.style.backgroundImage='none';}\r
+}else{if(OLns4)over.background.src=i;\r
+else{if(OLns6)over.style.width=o3_width+'px';over.style.backgroundImage='url('+i+')';}}\r
+}\r
+\r
+/*\r
+ HANDLING FUNCTIONS\r
+*/\r
+// Displays layer\r
+function OLdisp(s){\r
+if(OLallowmove==0){if(OLshadowPI)OLdispShadow();if(OLiframePI)OLdispIfs();OLplaceLayer();\r
+if(OLndt)OLshowObject(over);else OLshowid=setTimeout("OLshowObject(over)",1);\r
+OLallowmove=(o3_sticky||o3_nofollow)?0:1;}OLndt=0;if(s!="")self.status=s;\r
+}\r
+\r
+// Decides placement of layer.\r
+function OLplaceLayer(){\r
+var snp,X,Y,pgLeft,pgTop,pWd=o3_width,pHt,iWd=100,iHt=100,SB=0,LM=0,CX=0,TM=0,BM=0,CY=0;\r
+var o=OLfd(),nsb=(OLgek>=20010505&&!o3_frame.scrollbars.visible)?1:0;\r
+if(!OLkht&&o&&o.clientWidth)iWd=o.clientWidth;\r
+else if(o3_frame.innerWidth){SB=Math.ceil(1.4*(o3_frame.outerWidth-o3_frame.innerWidth));\r
+if(SB>20)SB=20;iWd=o3_frame.innerWidth;}\r
+pgLeft=(OLie4)?o.scrollLeft:o3_frame.pageXOffset;\r
+if(OLie55&&OLfilterPI&&o3_filtershadow)SB=CX=5;else\r
+if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowx){SB+=((o3_shadowx>0)?o3_shadowx:0);\r
+LM=((o3_shadowx<0)?Math.abs(o3_shadowx):0);CX=Math.abs(o3_shadowx);}\r
+if(o3_ref!=""||o3_fixx> -1||o3_relx!=null||o3_midx!=null){\r
+if(o3_ref!=""){\r
+X=OLrefXY[0];if(OLie55&&OLfilterPI&&o3_filtershadow){if(o3_refp=='UR'||o3_refp=='LR')X -= 5;}\r
+else if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowx){  \r
+if(o3_shadowx<0&&(o3_refp=='UL'||o3_refp=='LL'))X += o3_shadowx;\r
+else if(o3_shadowx>0&&(o3_refp=='UR'||o3_refp=='LR'))X -= o3_shadowx;}\r
+}else{if(o3_midx!=null){\r
+X=parseInt(pgLeft+((iWd-pWd-SB-LM)/2)+o3_midx);\r
+}else{if(o3_relx!=null){\r
+if(o3_relx>=0)X=pgLeft+o3_relx+LM;else X=pgLeft+o3_relx+iWd-pWd-SB;\r
+}else{\r
+X=o3_fixx+LM;}}}\r
+}else{\r
+if(o3_hauto){\r
+if(o3_hpos==LEFT&&OLx-pgLeft<iWd/2&&OLx-pWd-o3_offsetx<pgLeft+LM)o3_hpos=RIGHT;else\r
+if(o3_hpos==RIGHT&&OLx-pgLeft>iWd/2&&OLx+pWd+o3_offsetx>pgLeft+iWd-SB)o3_hpos=LEFT;}\r
+X=(o3_hpos==CENTER)?parseInt(OLx-((pWd+CX)/2)+o3_offsetx):\r
+(o3_hpos==LEFT)?OLx-o3_offsetx-pWd:OLx+o3_offsetx;\r
+if(o3_snapx>1){\r
+snp=X % o3_snapx;\r
+if(o3_hpos==LEFT){X=X-(o3_snapx+snp);}else{X=X+(o3_snapx-snp);}}}\r
+if(!o3_nojustx&&X+pWd>pgLeft+iWd-SB)\r
+X=iWd+pgLeft-pWd-SB;if(!o3_nojustx&&X-LM<pgLeft)X=pgLeft+LM;\r
+pgTop=OLie4?o.scrollTop:o3_frame.pageYOffset;\r
+if(!OLkht&&!nsb&&o&&o.clientHeight)iHt=o.clientHeight;\r
+else if(o3_frame.innerHeight)iHt=o3_frame.innerHeight;\r
+if(OLbubblePI&&o3_bubble)pHt=OLbubbleHt;else pHt=OLns4?over.clip.height:over.offsetHeight;\r
+if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowy){TM=(o3_shadowy<0)?Math.abs(o3_shadowy):0;\r
+if(OLie55&&OLfilterPI&&o3_filtershadow)BM=CY=5;else\r
+BM=(o3_shadowy>0)?o3_shadowy:0;CY=Math.abs(o3_shadowy);}\r
+if(o3_ref!=""||o3_fixy> -1||o3_rely!=null||o3_midy!=null){\r
+if(o3_ref!=""){\r
+Y=OLrefXY[1];if(OLie55&&OLfilterPI&&o3_filtershadow){if(o3_refp=='LL'||o3_refp=='LR')Y -= 5;}\r
+else if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowy){\r
+if(o3_shadowy<0&&(o3_refp=='UL'||o3_refp=='UR'))Y+=o3_shadowy;else\r
+if(o3_shadowy>0&&(o3_refp=='LL'||o3_refp=='LR'))Y-=o3_shadowy;}\r
+}else{if(o3_midy!=null){\r
+Y=parseInt(pgTop+((iHt-pHt-CY)/2)+o3_midy);\r
+}else{if(o3_rely!=null){\r
+if(o3_rely>=0)Y=pgTop+o3_rely+TM;else Y=pgTop+o3_rely+iHt-pHt-BM;}else{\r
+Y=o3_fixy+TM;}}}\r
+}else{\r
+if(o3_vauto){\r
+if(o3_vpos==ABOVE&&OLy-pgTop<iHt/2&&OLy-pHt-o3_offsety<pgTop)o3_vpos=BELOW;else\r
+if(o3_vpos==BELOW&&OLy-pgTop>iHt/2&&OLy+pHt+o3_offsety+((OLns4||OLkht)?17:0)>pgTop+iHt-BM)\r
+o3_vpos=ABOVE;}Y=(o3_vpos==VCENTER)?parseInt(OLy-((pHt+CY)/2)+o3_offsety):\r
+(o3_vpos==ABOVE)?OLy-(pHt+o3_offsety+BM):OLy+o3_offsety+TM;\r
+if(o3_snapy>1){\r
+snp=Y % o3_snapy;\r
+if(pHt>0&&o3_vpos==ABOVE){Y=Y-(o3_snapy+snp);}else{Y=Y+(o3_snapy-snp);}}}\r
+if(!o3_nojusty&&Y+pHt+BM>pgTop+iHt)Y=pgTop+iHt-pHt-BM;if(!o3_nojusty&&Y-TM<pgTop)Y=pgTop+TM;\r
+OLrepositionTo(over,X,Y);\r
+if(OLshadowPI)OLrepositionShadow(X,Y);if(OLiframePI)OLrepositionIfs(X,Y);\r
+if(OLns6&&o3_frame.innerHeight){iHt=o3_frame.innerHeight;OLrepositionTo(over,X,Y);}\r
+if(OLscrollPI)OLchkScroll(X-pgLeft,Y-pgTop);\r
+}\r
+\r
+// Chooses body or documentElement\r
+function OLfd(f){\r
+var fd=((f)?f:o3_frame).document,fdc=fd.compatMode,fdd=fd.documentElement;\r
+return (!OLop7&&fdc&&fdc!='BackCompat'&&fdd&&fdd.clientWidth)?fd.documentElement:fd.body;\r
+}\r
+\r
+// Gets location of REFerence object\r
+function OLgetRefXY(r){\r
+var mn=r,mr=OLgetRef(mn),o,of,rXY;\r
+if(!mr)return [null,null];\r
+o=mr;rXY=[o3_refx,o3_refy];\r
+if(OLns4){if(typeof mr.length!='undefined'&&mr.length>1){\r
+o=mr[0];rXY[0]+=mr[0].x+mr[1].pageX;rXY[1]+=mr[0].y+mr[1].pageY;\r
+}else{if((mr.toString().indexOf('Image')!= -1)||(mr.toString().indexOf('Anchor')!= -1)){\r
+rXY[0]+=mr.x;rXY[1]+=mr.y;}else{rXY[0]+=mr.pageX;rXY[1]+=mr.pageY;}}\r
+}else{rXY[0]+=OLpageLoc(mr,'Left');rXY[1]+=OLpageLoc(mr,'Top');}\r
+of=OLgetRefOffsets(o);rXY[0]+=of[0];rXY[1]+=of[1];\r
+return rXY;\r
+}\r
+function OLgetRef(l){var r=OLgetRefById(l);return (r)?r:OLgetRefByName(l);}\r
+\r
+// Seeks REFerence by id\r
+function OLgetRefById(l,d){\r
+var r="",j;l=(l||'overDiv');d=(d||o3_frame.document);\r
+if(OLie4&&d.all){return d.all[l];}else if(d.getElementById){return d.getElementById(l);\r
+}else if(d.layers&&d.layers.length>0){if(d.layers[l])return d.layers[l];\r
+for(j=0;j<d.layers.length;j++){r=OLgetRefById(l,d.layers[j].document);if(r)return r;}}\r
+return null;\r
+}\r
+\r
+// Seeks REFerence by name (for img and a)\r
+function OLgetRefByName(l,d){\r
+var r=null,j;d=(d||o3_frame.document);\r
+if(typeof d.images[l]!='undefined'&&d.images[l]){return d.images[l];\r
+}else if(typeof d.anchors[l]!='undefined'&&d.anchors[l]){return d.anchors[l];\r
+}else if(d.layers&&d.layers.length>0){\r
+for(j=0;j<d.layers.length;j++){r=OLgetRefByName(l,d.layers[j].document);\r
+if(r&&r.length>0)return r;else if(r)return [r,d.layers[j]];}}\r
+return null;\r
+}\r
+\r
+// Gets layer vs REFerence offsets\r
+function OLgetRefOffsets(o){\r
+var mc=o3_refc.toUpperCase(),mp=o3_refp.toUpperCase(),mW=0,mH=0,pW=0,pH=0,off=[0,0];\r
+pW=(OLbubblePI&&o3_bubble)?o3_width:OLns4?over.clip.width:over.offsetWidth;\r
+pH=(OLbubblePI&&o3_bubble)?OLbubbleHt:OLns4?over.clip.height:over.offsetHeight;\r
+if((!OLop7)&&o.toString().indexOf('Image')!= -1){mW=o.width;mH=o.height;\r
+}else if((!OLop7)&&o.toString().indexOf('Anchor')!= -1){mc=o3_refc='UL';}else{\r
+mW=(OLns4)?o.clip.width:o.offsetWidth;mH=(OLns4)?o.clip.height:o.offsetHeight;}\r
+if(mc=='UL'){off=(mp=='UR')?[-pW,0]:(mp=='LL')?[0,-pH]:(mp=='LR')?[-pW,-pH]:[0,0];\r
+}else if(mc=='UR'){off=(mp=='UR')?[mW-pW,0]:(mp=='LL')?[mW,-pH]:(mp=='LR')?[mW-pW,-pH]:[mW,0];\r
+}else if(mc=='LL'){off=(mp=='UR')?[-pW,mH]:(mp=='LL')?[0,mH-pH]:(mp=='LR')?[-pW,mH-pH]:[0,mH];\r
+}else if(mc=='LR'){off=(mp=='UR')?[mW-pW,mH]:(mp=='LL')?[mW,mH-pH]:(mp=='LR')?[mW-pW,mH-pH]:\r
+[mW,mH];}\r
+return off;\r
+}\r
+\r
+// Gets x or y location of object\r
+function OLpageLoc(o,t){\r
+var l=0;while(o.offsetParent&&o.offsetParent.tagName.toLowerCase()!='html'){\r
+l+=o['offset'+t];o=o.offsetParent;}l+=o['offset'+t];\r
+return l;\r
+} \r
+\r
+// Moves layer\r
+function OLmouseMove(e){\r
+var e=(e||event);\r
+OLx=(e.pageX||e.clientX+OLfd().scrollLeft);OLy=(e.pageY||e.clientY+OLfd().scrollTop);\r
+if((OLallowmove&&over)&&(o3_frame==self||over==OLgetRefById())){\r
+OLplaceLayer();if(OLhidePI)OLhideUtil(0,1,1,0,0,0);}\r
+if(OLhover&&over&&o3_frame==self&&OLcursorOff())if(o3_offdelay<1)cClick();else\r
+{if(OLtimerid>0)clearTimeout(OLtimerid);OLtimerid=setTimeout("cClick()",o3_offdelay);}\r
+}\r
+\r
+// Capture mouse and chain other scripts.\r
+function OLmh(){\r
+var fN,f,j,k,s,mh=OLmouseMove,w=(OLns4&&window.onmousemove),re=/function[ ]*(\w*)\(/;\r
+OLdw=document;if(document.onmousemove||w){if(w)OLdw=window;f=OLdw.onmousemove.toString();\r
+fN=f.match(re);if(!fN||fN[1]=='anonymous'||fN[1]=='OLmouseMove'){OLchkMh=0;return;}\r
+if(fN[1])s=fN[1]+'(e)';else{j=f.indexOf('{');k=f.lastIndexOf('}')+1;s=f.substring(j,k);}\r
+s+=';OLmouseMove(e);';mh=new Function('e',s);}\r
+OLdw.onmousemove=mh;if(OLns4)OLdw.captureEvents(Event.MOUSEMOVE);\r
+}\r
+\r
+/*\r
+ PARSING\r
+*/\r
+function OLparseTokens(pf,ar){\r
+var i,v,md= -1,par=(pf!='ol_'),e=eval,p=OLpar,q=OLparQuo,t=OLtoggle;OLudf=(par&&!ar.length?1:0);\r
+for(i=0;i< ar.length;i++){if(md<0){if(typeof ar[i]=='number'){OLudf=(par?1:0);i--;}\r
+else{switch(pf){case 'ol_':ol_text=ar[i];break;default:o3_text=ar[i];}}md=0;\r
+}else{\r
+if(ar[i]==INARRAY){OLudf=0;e(pf+'text=ol_texts['+ar[++i]+']');continue;}\r
+if(ar[i]==CAPARRAY){e(pf+'cap=ol_caps['+ar[++i]+']');continue;}\r
+if(ar[i]==CAPTION){q(ar[++i],pf+'cap');continue;}\r
+if(Math.abs(ar[i])==STICKY){t(ar[i],pf+'sticky');continue;}\r
+if(Math.abs(ar[i])==NOFOLLOW){t(ar[i],pf+'nofollow');continue;}\r
+if(ar[i]==BACKGROUND){q(ar[++i],pf+'background');continue;}\r
+if(Math.abs(ar[i])==NOCLOSE){t(ar[i],pf+'noclose');continue;}\r
+if(Math.abs(ar[i])==MOUSEOFF){t(ar[i],pf+'mouseoff');continue;}\r
+if(ar[i]==OFFDELAY){p(ar[++i],pf+'offdelay');continue;}\r
+if(ar[i]==RIGHT||ar[i]==LEFT||ar[i]==CENTER){p(ar[i],pf+'hpos');continue;}\r
+if(ar[i]==OFFSETX){p(ar[++i],pf+'offsetx');continue;}\r
+if(ar[i]==OFFSETY){p(ar[++i],pf+'offsety');continue;}\r
+if(ar[i]==FGCOLOR){q(ar[++i],pf+'fgcolor');continue;}\r
+if(ar[i]==BGCOLOR){q(ar[++i],pf+'bgcolor');continue;}\r
+if(ar[i]==CGCOLOR){q(ar[++i],pf+'cgcolor');continue;}\r
+if(ar[i]==TEXTCOLOR){q(ar[++i],pf+'textcolor');continue;}\r
+if(ar[i]==CAPCOLOR){q(ar[++i],pf+'capcolor');continue;}\r
+if(ar[i]==CLOSECOLOR){q(ar[++i],pf+'closecolor');continue;}\r
+if(ar[i]==WIDTH){p(ar[++i],pf+'width');continue;}\r
+if(Math.abs(ar[i])==WRAP){t(ar[i],pf+'wrap');continue;}\r
+if(ar[i]==WRAPMAX){p(ar[++i],pf+'wrapmax');continue;}\r
+if(ar[i]==HEIGHT){p(ar[++i],pf+'height');continue;}\r
+if(ar[i]==BORDER){p(ar[++i],pf+'border');continue;}\r
+if(ar[i]==BASE){p(ar[++i],pf+'base');continue;}\r
+if(ar[i]==STATUS){q(ar[++i],pf+'status');continue;}\r
+if(Math.abs(ar[i])==AUTOSTATUS){v=pf+'autostatus';\r
+e(v+'=('+ar[i]+'<0)?('+v+'==2?2:0):('+v+'==1?0:1)');continue;}\r
+if(Math.abs(ar[i])==AUTOSTATUSCAP){v=pf+'autostatus';\r
+e(v+'=('+ar[i]+'<0)?('+v+'==1?1:0):('+v+'==2?0:2)');continue;}\r
+if(ar[i]==CLOSETEXT){q(ar[++i],pf+'close');continue;}\r
+if(ar[i]==SNAPX){p(ar[++i],pf+'snapx');continue;}\r
+if(ar[i]==SNAPY){p(ar[++i],pf+'snapy');continue;}\r
+if(ar[i]==FIXX){p(ar[++i],pf+'fixx');continue;}\r
+if(ar[i]==FIXY){p(ar[++i],pf+'fixy');continue;}\r
+if(ar[i]==RELX){p(ar[++i],pf+'relx');continue;}\r
+if(ar[i]==RELY){p(ar[++i],pf+'rely');continue;}\r
+if(ar[i]==MIDX){p(ar[++i],pf+'midx');continue;}\r
+if(ar[i]==MIDY){p(ar[++i],pf+'midy');continue;}\r
+if(ar[i]==REF){q(ar[++i],pf+'ref');continue;}\r
+if(ar[i]==REFC){q(ar[++i],pf+'refc');continue;}\r
+if(ar[i]==REFP){q(ar[++i],pf+'refp');continue;}\r
+if(ar[i]==REFX){p(ar[++i],pf+'refx');continue;}\r
+if(ar[i]==REFY){p(ar[++i],pf+'refy');continue;}\r
+if(ar[i]==FGBACKGROUND){q(ar[++i],pf+'fgbackground');continue;}\r
+if(ar[i]==BGBACKGROUND){q(ar[++i],pf+'bgbackground');continue;}\r
+if(ar[i]==CGBACKGROUND){q(ar[++i],pf+'cgbackground');continue;}\r
+if(ar[i]==PADX){p(ar[++i],pf+'padxl');p(ar[++i],pf+'padxr');continue;}\r
+if(ar[i]==PADY){p(ar[++i],pf+'padyt');p(ar[++i],pf+'padyb');continue;}\r
+if(Math.abs(ar[i])==FULLHTML){t(ar[i],pf+'fullhtml');continue;}\r
+if(ar[i]==BELOW||ar[i]==ABOVE||ar[i]==VCENTER){p(ar[i],pf+'vpos');continue;}\r
+if(ar[i]==CAPICON){q(ar[++i],pf+'capicon');continue;}\r
+if(ar[i]==TEXTFONT){q(ar[++i],pf+'textfont');continue;}\r
+if(ar[i]==CAPTIONFONT){q(ar[++i],pf+'captionfont');continue;}\r
+if(ar[i]==CLOSEFONT){q(ar[++i],pf+'closefont');continue;}\r
+if(ar[i]==TEXTSIZE){q(ar[++i],pf+'textsize');continue;}\r
+if(ar[i]==CAPTIONSIZE){q(ar[++i],pf+'captionsize');continue;}\r
+if(ar[i]==CLOSESIZE){q(ar[++i],pf+'closesize');continue;}\r
+if(ar[i]==TIMEOUT){p(ar[++i],pf+'timeout');continue;}\r
+if(ar[i]==DELAY){p(ar[++i],pf+'delay');continue;}\r
+if(Math.abs(ar[i])==HAUTO){t(ar[i],pf+'hauto');continue;}\r
+if(Math.abs(ar[i])==VAUTO){t(ar[i],pf+'vauto');continue;}\r
+if(Math.abs(ar[i])==NOJUSTX){t(ar[i],pf+'nojustx');continue;}\r
+if(Math.abs(ar[i])==NOJUSTY){t(ar[i],pf+'nojusty');continue;}\r
+if(Math.abs(ar[i])==CLOSECLICK){t(ar[i],pf+'closeclick');continue;}\r
+if(ar[i]==CLOSETITLE){q(ar[++i],pf+'closetitle');continue;}\r
+if(ar[i]==FGCLASS){q(ar[++i],pf+'fgclass');continue;}\r
+if(ar[i]==BGCLASS){q(ar[++i],pf+'bgclass');continue;}\r
+if(ar[i]==CGCLASS){q(ar[++i],pf+'cgclass');continue;}\r
+if(ar[i]==TEXTPADDING){p(ar[++i],pf+'textpadding');continue;}\r
+if(ar[i]==TEXTFONTCLASS){q(ar[++i],pf+'textfontclass');continue;}\r
+if(ar[i]==CAPTIONPADDING){p(ar[++i],pf+'captionpadding');continue;}\r
+if(ar[i]==CAPTIONFONTCLASS){q(ar[++i],pf+'captionfontclass');continue;}\r
+if(ar[i]==CLOSEFONTCLASS){q(ar[++i],pf+'closefontclass');continue;}\r
+if(Math.abs(ar[i])==CAPBELOW){t(ar[i],pf+'capbelow');continue;}\r
+if(ar[i]==LABEL){q(ar[++i],pf+'label');continue;}\r
+if(ar[i]==DONOTHING){continue;}\r
+i=OLparseCmdLine(pf,i,ar);}}\r
+if((OLfunctionPI)&&OLudf&&o3_function)o3_text=o3_function();\r
+if(pf=='o3_')OLfontSize();\r
+}\r
+function OLpar(a,v){eval(v+'='+a);}\r
+function OLparQuo(a,v){eval(v+"='"+OLescSglQt(a)+"'");}\r
+function OLescSglQt(s){return s.toString().replace(/'/g,"\\'");}\r
+function OLtoggle(a,v){eval(v+'=('+v+'==0&&'+a+'>=0)?1:0');}\r
+function OLhasDims(s){return /[%\-a-z]+$/.test(s);}\r
+function OLfontSize(){\r
+var i;if(OLhasDims(o3_textsize)){if(OLns4)o3_textsize="2";}else\r
+if(!OLns4){i=parseInt(o3_textsize);o3_textsize=(i>0&&i<8)?OLpct[i]:OLpct[0];}\r
+if(OLhasDims(o3_captionsize)){if(OLns4)o3_captionsize="2";}else\r
+if(!OLns4){i=parseInt(o3_captionsize);o3_captionsize=(i>0&&i<8)?OLpct[i]:OLpct[0];}\r
+if(OLhasDims(o3_closesize)){if(OLns4)o3_closesize="2";}else\r
+if(!OLns4){i=parseInt(o3_closesize);o3_closesize=(i>0&&i<8)?OLpct[i]:OLpct[0];}\r
+}\r
+\r
+/*\r
+ LAYER FUNCTIONS\r
+*/\r
+// Writes to layer\r
+function OLlayerWrite(t){\r
+t+="\n";\r
+if(OLns4){over.document.write(t);over.document.close();\r
+}else if(typeof over.innerHTML!='undefined'){if(OLieM)over.innerHTML='';over.innerHTML=t;\r
+}else{range=o3_frame.document.createRange();range.setStartAfter(over);\r
+domfrag=range.createContextualFragment(t);\r
+while(over.hasChildNodes()){over.removeChild(over.lastChild);}\r
+over.appendChild(domfrag);}\r
+}\r
+\r
+// Makes object visible\r
+function OLshowObject(o){\r
+OLshowid=0;o=(OLns4)?o:o.style;\r
+if(((OLfilterPI)&&!OLchkFilter(o))||!OLfilterPI)o.visibility="visible";\r
+if(OLshadowPI)OLshowShadow();if(OLiframePI)OLshowIfs();if(OLhidePI)OLhideUtil(1,1,0);\r
+}\r
+\r
+// Hides object\r
+function OLhideObject(o){\r
+if(OLshowid>0){clearTimeout(OLshowid);OLshowid=0;}\r
+if(OLtimerid>0)clearTimeout(OLtimerid);if(OLdelayid>0)clearTimeout(OLdelayid);\r
+OLtimerid=0;OLdelayid=0;self.status="";o3_label=ol_label;\r
+if(o3_frame!=self)o=OLgetRefById();\r
+if(o){if(o.onmouseover)o.onmouseover=null;\r
+if(OLscrollPI&&o==over)OLclearScroll();\r
+if(OLdraggablePI)OLclearDrag();\r
+if(OLfilterPI)OLcleanupFilter(o);if(OLshadowPI)OLhideShadow();\r
+var os=(OLns4)?o:o.style;os.visibility="hidden";\r
+if(OLhidePI&&o==over)OLhideUtil(0,0,1);if(OLiframePI)OLhideIfs(o);}\r
+}\r
+\r
+// Moves layer\r
+function OLrepositionTo(o,xL,yL){\r
+o=(OLns4)?o:o.style;\r
+o.left=(OLns4?xL:xL+'px');\r
+o.top=(OLns4?yL:yL+'px');\r
+}\r
+\r
+// Handle NOCLOSE-MOUSEOFF\r
+function OLoptMOUSEOFF(c){\r
+if(!c)o3_close="";\r
+over.onmouseover=function(){OLhover=1;if(OLtimerid>0){clearTimeout(OLtimerid);OLtimerid=0;}}\r
+}\r
+function OLcursorOff(){\r
+if(OLovertwoPI&&over==over2)return false;\r
+var o=(OLns4?over:over.style),pHt=OLns4?over.clip.height:over.offsetHeight;\r
+var left=parseInt(o.left),top=parseInt(o.top);\r
+var right=left+o3_width,bottom=top+((OLbubblePI&&o3_bubble)?OLbubbleHt:pHt);\r
+if(OLx<left||OLx>right||OLy<top||OLy>bottom)return true;\r
+return false;\r
+}\r
+\r
+/*\r
+ REGISTRATION\r
+*/\r
+var OLcmdLine=null,OLrunTime=null;\r
+function OLsetRunTimeVar(){\r
+if(OLrunTime&&OLrunTime.length)for(var k=0;k<OLrunTime.length;k++)OLrunTime[k]();\r
+}\r
+function OLparseCmdLine(pf,i,ar){\r
+if(OLcmdLine&&OLcmdLine.length){for(var k=0;k<OLcmdLine.length;k++){\r
+var j=OLcmdLine[k](pf,i,ar);if(j>-1){i=j;break;}}}\r
+return i;\r
+}\r
+function OLisFunc(f){\r
+var r=1;\r
+if(typeof f=='object'){for(var i=0;i<f.length;i++){\r
+if(typeof f[i]=='function')continue;r=0;break;}\r
+}else if(typeof f!='function')r=0;\r
+return r;\r
+}\r
+function OLregCmds(c){\r
+if(typeof c!='string')return;\r
+var pM=c.split(',');pMtr=pMtr.concat(pM);\r
+for(var i=0;i<pM.length;i++)eval(pM[i].toUpperCase()+'='+pmCnt++);\r
+}\r
+function OLregRunTimeFunc(f){\r
+if(OLisFunc(f)){\r
+if(!OLrunTime)OLrunTime=new Array();\r
+if(typeof f=='object')OLrunTime=OLrunTime.concat(f);\r
+else OLrunTime[OLrunTime.length++]=f;}\r
+}\r
+function OLregCmdLineFunc(f){\r
+if(OLisFunc(f)){\r
+if(!OLcmdLine)OLcmdLine=new Array();\r
+if(typeof f=='object')OLcmdLine=OLcmdLine.concat(f);\r
+else OLcmdLine[OLcmdLine.length++]=f;}\r
+}\r
+\r
+OLloaded=1;\r
diff --git a/httemplate/elements/progress-init.html b/httemplate/elements/progress-init.html
new file mode 100644 (file)
index 0000000..7edb831
--- /dev/null
@@ -0,0 +1,45 @@
+<% my( $formname, $fields, $action, $success_url ) = @_; %>
+
+<SCRIPT TYPE="text/javascript" SRC="../elements/jsrsClient.js"></SCRIPT>
+<SCRIPT TYPE="text/javascript" SRC="../elements/overlibmws.js"></SCRIPT>
+<SCRIPT TYPE="text/javascript">
+function OLiframeContent(src, width, height, name) {
+  return ('<iframe src="'+src+'" width="'+width+'" height="'+height+'"'
+   +(name?' name="'+name+'" id="'+name+'"':'')+' scrolling="no">'
+   +'<div>[iframe not supported]</div></iframe>');
+}
+
+function process () {
+
+  document.OneTrueForm.submit.disabled=true;
+
+  overlib( 'Submitting job to server...', WIDTH, 420, HEIGHT, 128, CAPTION, 'Please wait...', STICKY, AUTOSTATUSCAP, CLOSETEXT, '', CLOSECLICK, MIDX, 0, MIDY, 0 );
+
+  var Hash = new Array();
+  var x = 0;
+  var fieldName;
+  for (var i = 0; i<document.OneTrueForm.elements.length; i++) {
+    fieldName = document.OneTrueForm.elements[i].name;
+//            (fieldName.indexOf('rate') > -1)
+//         || (fieldName.indexOf('min_') > -1) 
+//        || (fieldName.indexOf('sec_') > -1) 
+    if ( <%= join(' || ', map { "(fieldName.indexOf('$_') > -1)" } @$fields ) %>
+       )
+    {
+        Hash[x++] = fieldName;
+        Hash[x++] = document.OneTrueForm.elements[i].value;
+    }
+  }
+
+  jsrsPOST = true;
+  jsrsExecute( '<%= $action %>', myCallback, 'start_job', Hash );
+
+}
+
+function myCallback( jobnum ) {
+
+  overlib( OLiframeContent('<%=$p%>elements/progress-popup.html?jobnum=' + jobnum + ';url=<%=$success_url%>' , 420, 128, 'progress_popup'), CAPTION, 'Please wait...', STICKY, AUTOSTATUSCAP, CLOSETEXT, '', CLOSECLICK, MIDX, 0, MIDY, 0 );
+
+}
+
+</SCRIPT>
diff --git a/httemplate/elements/progress-popup.html b/httemplate/elements/progress-popup.html
new file mode 100644 (file)
index 0000000..0881a96
--- /dev/null
@@ -0,0 +1,74 @@
+<%
+  my( $jobnum ) = $cgi->param('jobnum');
+  my( $url ) = $cgi->param('url');
+%>
+<HTML>
+  <HEAD>
+    <TITLE></TITLE>
+  </HEAD>
+  <BODY BGCOLOR="#ccccff" onLoad="refreshStatus()">
+
+<SCRIPT TYPE="text/javascript" SRC="../elements/jsrsClient.js"></SCRIPT>
+<SCRIPT TYPE="text/javascript" src="../elements/qlib/control.js"></SCRIPT>
+<SCRIPT TYPE="text/javascript" src="../elements/qlib/imagelist.js"></SCRIPT>
+<SCRIPT TYPE="text/javascript" src="../elements/qlib/progress.js"></SCRIPT>
+<SCRIPT TYPE="text/javascript">
+function refreshStatus () {
+  jsrsExecute( '<%=$p%>elements/jsrsServer.html', updateStatus, 'job_status', '<%= $jobnum %>' );
+}
+function updateStatus( status_statustext ) {
+  var Array = status_statustext.split("\n");
+  var status = Array[0];
+  var statustext = Array[1];
+  //if ( status == 'progress' ) {
+  //IE workaround, no i have no idea why
+  if ( status.indexOf('progress') > -1 ) {
+    document.getElementById("progress_percent").innerHTML = statustext + '%';
+    bar1.set(statustext);
+    bar1.update;
+    jsrsExecute( '<%=$p%>elements/jsrsServer.html', updateStatus, 'job_status', '<%= $jobnum %>' );
+  } else if ( status.indexOf('complete') > -1 ) {
+    window.top.location.href = '<%= $url %>';
+  } else if ( status.indexOf('error') > -1 ) {
+    document.getElementById("progress_message").innerHTML = '<FONT SIZE="+1" COLOR="#FF0000">Error: ' + statustext + '</FONT>';
+    document.getElementById("progress_bar").innerHTML = '';
+    document.getElementById("progress_percent").innerHTML = '<INPUT TYPE="button" VALUE="OK" onClick="parent.nd(1);">';
+    document.getElementById("progress_jobnum").innerHTML = '';
+    parent.document.OneTrueForm.submit.disabled=false;
+  } else {
+    alert('XXX unknown status returned from server: ' + status);
+  }
+  
+}
+</SCRIPT>
+
+    <TABLE>
+      <TR>
+        <TD ALIGN="center" ID="progress_message">
+          Server processing job...
+        </TD>
+      </TR><TR>
+        <TD ALIGN="center" ID="progress_bar">
+          <SCRIPT TYPE="text/javascript">
+            // Create imagelist
+            SEGS = new QImageList(4, 23, "../images/progressbar-empty.png", "../images/progressbar-full.png");
+            // Create bars
+            bar1 = new QProgress(null, "bar1", SEGS, 100);
+            // bar1.set(0);
+            // bar1.update;
+          </SCRIPT>
+        </TD>
+      </TR><TR>
+        <TD ALIGN="center">
+          <DIV ID="progress_percent">%</DIV>
+        </TD>
+      </TR><TR>
+        <TD ALIGN="center" ID="progress_jobnum">
+          (progress of job #<%= $jobnum %>)
+        </TD>
+      </TR>
+    </TABLE>
+
+  </BODY>
+</HTML>
+
diff --git a/httemplate/misc/progress.html b/httemplate/misc/progress.html
deleted file mode 100644 (file)
index cbff08b..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-<%
-  my( $jobnum ) = $cgi->param('jobnum');
-  my( $url ) = $cgi->param('url');
-  my $job = '';
-  if ( $jobnum =~ /^(\d+)$/ ) {
-    $job = qsearchs('queue', { 'jobnum' => $jobnum } );
-  }
-  if ( $job && $job->status ne 'failed' ) {
-%>
-
-<HTML>
-  <HEAD>
-    <TITLE>
-      Please wait...
-    </TITLE>
-    <META HTTP-Equiv="Cache-Control" Content="no-cache">
-    <META HTTP-Equiv="Pragma" Content="no-cache">
-    <META HTTP-Equiv="Expires" Content="0"> 
-
-    <!-- could do more JSRS magic and avoid refreshing... but works for now -->
-    <META HTTP-Equiv="Refresh" Content="5">
-  </HEAD>
-  <BODY BGCOLOR="#e8e8e8">
-    <P ALIGN="center">Please wait...
-    <script TYPE="text/javascript" src="../elements/qlib/control.js"></script>
-    <script TYPE="text/javascript" src="../elements/qlib/imagelist.js"></script>
-    <script TYPE="text/javascript" src="../elements/qlib/progress.js"></script>
-    <P ALIGN="center">
-    <script TYPE="text/javascript">
-      // Create imagelist
-      SEGS = new QImageList(4, 23, "../images/progressbar-empty.png", "../images/progressbar-full.png");
-
-      // Create bars
-      bar1 = new QProgress(null, "bar1", SEGS, 100);
-      bar1.set(<%= $job->statustext %>);
-      // bar1.update;
-    </script>
-    <BR><%= $job->statustext %>%
-    <P ALIGN="center">(progress of job #<%= $jobnum %>)
-  </BODY>
-</HTML>
-
-<%
-  } elsif ( !$job ) { #handle job gone case : job sucessful
-                      # so close popup, redirect parent window...
-    #eidiot("write success handler (jobnum $jobnum)");
-%>
-
-<HTML>
-  <HEAD>
-    <TITLE>
-      Operation successful
-    </TITLE>
-    <META HTTP-Equiv="Cache-Control" Content="no-cache">
-    <META HTTP-Equiv="Pragma" Content="no-cache">
-    <META HTTP-Equiv="Expires" Content="0"> 
-
-  </HEAD>
-  <BODY BGCOLOR="#e8e8e8">
-    <SCRIPT TYPE="text/javascript">
-      top.opener.window.location.href = '<%= $cgi->param('url') %>';
-      window.close();
-    </SCRIPT>
-  </BODY>
-</HTML>
-
-<%
-  } else {
-%>
-
-  <HEAD>
-    <TITLE>
-      Error
-    </TITLE>
-    <META HTTP-Equiv="Cache-Control" Content="no-cache">
-    <META HTTP-Equiv="Pragma" Content="no-cache">
-    <META HTTP-Equiv="Expires" Content="0"> 
-  </HEAD>
-  <BODY BGCOLOR="#e8e8e8">
-    <P ALIGN="center"><FONT COLOR="#ff0000">Error: <%= $job ? $job->statustext : $jobnum %></FONT>
-    <P ALIGN="center"><INPUT TYPE="button" onClick="top.opener.document.OneTrueForm.submit.disabled=false; window.close();" VALUE="OK">
-  </BODY>
-</HTML>
-
-<% } %>
-
-
-