From aa5a2787fffbf3e108ed87736b6b3558558194b3 Mon Sep 17 00:00:00 2001 From: rob_k Date: Mon, 11 Jun 2007 03:39:45 +0000 Subject: [PATCH] Update for web client --- serverApps/src/web/Background.gif | Bin 2301 -> 0 bytes serverApps/src/web/Logo.gif | Bin 3372 -> 6545 bytes serverApps/src/web/LogoSmall.gif | Bin 1017 -> 766 bytes serverApps/src/web/calendar.html | 157 ++ serverApps/src/web/css/calendar-blue.css | 232 +++ serverApps/src/web/{ => css}/menu.css | 55 +- serverApps/src/web/css/mktree.css | 23 + serverApps/src/web/css/popup.css | 49 + serverApps/src/web/{ => css}/standard.css | 38 +- serverApps/src/web/css/table.css | 134 ++ serverApps/src/web/css/theme.css | 236 +++ serverApps/src/web/css/window.css | 184 ++ serverApps/src/web/del/Background.gif | Bin 0 -> 1083 bytes serverApps/src/web/del/Compiere.gif_del | Bin 0 -> 389 bytes serverApps/src/web/del/Favorite16.gif | Bin 0 -> 25214 bytes serverApps/src/web/del/PopupWindow.js_del | 469 +++++ serverApps/src/web/del/favicon.ico_del | Bin 0 -> 1406 bytes serverApps/src/web/del/sortable.gif_del | Bin 0 -> 68 bytes .../src/web/{xxx.html => del/xxx.html_del} | 0 .../src/web/{xxx1.html => del/xxx1.html_del} | 2 +- serverApps/src/web/favicon.ico | Bin 4286 -> 0 bytes serverApps/src/web/images/01_ascending.gif | Bin 0 -> 71 bytes serverApps/src/web/images/01_descending.gif | Bin 0 -> 71 bytes serverApps/src/web/images/01_unsorted.gif | Bin 0 -> 63 bytes serverApps/src/web/images/AD10030.bak.gif | Bin 61457 -> 0 bytes serverApps/src/web/images/AttachmentD16.gif | Bin 0 -> 334 bytes serverApps/src/web/images/ComPiere150x50.gif | Bin 0 -> 1227 bytes serverApps/src/web/images/ComPiereCom.jpg | Bin 0 -> 2621 bytes serverApps/src/web/images/Compiere.jpg | Bin 0 -> 1056 bytes serverApps/src/web/images/Compiere120x60.gif | Bin 0 -> 1857 bytes serverApps/src/web/images/Favorite16.gif | Bin 0 -> 220 bytes serverApps/src/web/images/FirstD16.gif | Bin 0 -> 92 bytes serverApps/src/web/images/HistoryD16.gif | Bin 0 -> 362 bytes .../web/images/ImageFactory$FolderIcon.class | Bin 0 -> 1383 bytes .../images/ImageFactory$FolderIcon16.class | Bin 0 -> 2187 bytes .../web/images/ImageFactory$HomeIcon.class | Bin 0 -> 1789 bytes serverApps/src/web/images/ImageFactory.class | Bin 0 -> 1856 bytes serverApps/src/web/images/ImageFactory.java | 212 ++ serverApps/src/web/images/Java_anim.bak.gif | Bin 5856 -> 0 bytes serverApps/src/web/images/Java_logo.gif | Bin 5076 -> 0 bytes serverApps/src/web/images/LastD16.gif | Bin 0 -> 112 bytes serverApps/src/web/images/Menu16.gif | Bin 0 -> 400 bytes serverApps/src/web/images/Multi16.gif | Bin 482 -> 345 bytes serverApps/src/web/images/NextD16.gif | Bin 0 -> 185 bytes serverApps/src/web/images/PreviousD16.gif | Bin 0 -> 184 bytes serverApps/src/web/images/Zoom10.gif | Bin 0 -> 182 bytes serverApps/src/web/images/active-bg.gif | Bin 0 -> 89 bytes serverApps/src/web/images/dark-bg.gif | Bin 0 -> 85 bytes serverApps/src/web/images/hover-bg.gif | Bin 0 -> 89 bytes serverApps/src/web/images/menuarrow.gif | Bin 0 -> 49 bytes serverApps/src/web/images/normal-bg.gif | Bin 0 -> 110 bytes serverApps/src/web/images/rowhover-bg.gif | Bin 0 -> 110 bytes serverApps/src/web/images/status-bg.gif | Bin 0 -> 116 bytes .../src/web/images/tab-left-selected.gif | Bin 0 -> 1754 bytes serverApps/src/web/images/tab-left.gif | Bin 0 -> 1334 bytes .../src/web/images/tab-right-selected.gif | Bin 0 -> 5256 bytes serverApps/src/web/images/tab-right.gif | Bin 0 -> 3998 bytes serverApps/src/web/images/title-bg.gif | Bin 0 -> 116 bytes serverApps/src/web/images/today-bg.gif | Bin 0 -> 1122 bytes serverApps/src/web/index.html | 30 +- serverApps/src/web/js/calendar-setup.js | 200 ++ serverApps/src/web/js/calendar.js | 1806 +++++++++++++++++ serverApps/src/web/{ => js}/menu.js | 2 +- serverApps/src/web/js/mktree.js | 168 ++ serverApps/src/web/{ => js}/standard.js | 5 +- serverApps/src/web/js/table.js | 1006 +++++++++ serverApps/src/web/js/window.js | 361 ++++ serverApps/src/web/lang/calendar-en.js | 127 ++ serverApps/src/web/menu.html | 4 +- serverApps/src/web/popup.css | 35 - serverApps/src/web/popup.html | 2 +- serverApps/src/web/window.css | 76 - serverApps/src/web/window.html | 6 +- serverApps/src/web/window.js | 232 --- .../web/window_files/colorschememapping.xml | 2 + serverApps/src/web/window_files/filelist.xml | 6 + .../src/web/window_files/themedata.thmx | Bin 0 -> 3081 bytes serverApps/src/web/wstore.js | 2 +- 78 files changed, 5463 insertions(+), 398 deletions(-) delete mode 100644 serverApps/src/web/Background.gif create mode 100644 serverApps/src/web/calendar.html create mode 100644 serverApps/src/web/css/calendar-blue.css rename serverApps/src/web/{ => css}/menu.css (51%) create mode 100644 serverApps/src/web/css/mktree.css create mode 100644 serverApps/src/web/css/popup.css rename serverApps/src/web/{ => css}/standard.css (73%) create mode 100644 serverApps/src/web/css/table.css create mode 100644 serverApps/src/web/css/theme.css create mode 100644 serverApps/src/web/css/window.css create mode 100644 serverApps/src/web/del/Background.gif create mode 100644 serverApps/src/web/del/Compiere.gif_del create mode 100644 serverApps/src/web/del/Favorite16.gif create mode 100644 serverApps/src/web/del/PopupWindow.js_del create mode 100644 serverApps/src/web/del/favicon.ico_del create mode 100644 serverApps/src/web/del/sortable.gif_del rename serverApps/src/web/{xxx.html => del/xxx.html_del} (100%) rename serverApps/src/web/{xxx1.html => del/xxx1.html_del} (77%) delete mode 100644 serverApps/src/web/favicon.ico create mode 100644 serverApps/src/web/images/01_ascending.gif create mode 100644 serverApps/src/web/images/01_descending.gif create mode 100644 serverApps/src/web/images/01_unsorted.gif delete mode 100755 serverApps/src/web/images/AD10030.bak.gif create mode 100644 serverApps/src/web/images/AttachmentD16.gif create mode 100644 serverApps/src/web/images/ComPiere150x50.gif create mode 100644 serverApps/src/web/images/ComPiereCom.jpg create mode 100644 serverApps/src/web/images/Compiere.jpg create mode 100644 serverApps/src/web/images/Compiere120x60.gif create mode 100644 serverApps/src/web/images/Favorite16.gif create mode 100644 serverApps/src/web/images/FirstD16.gif create mode 100644 serverApps/src/web/images/HistoryD16.gif create mode 100644 serverApps/src/web/images/ImageFactory$FolderIcon.class create mode 100644 serverApps/src/web/images/ImageFactory$FolderIcon16.class create mode 100644 serverApps/src/web/images/ImageFactory$HomeIcon.class create mode 100644 serverApps/src/web/images/ImageFactory.class create mode 100644 serverApps/src/web/images/ImageFactory.java delete mode 100755 serverApps/src/web/images/Java_anim.bak.gif delete mode 100644 serverApps/src/web/images/Java_logo.gif create mode 100644 serverApps/src/web/images/LastD16.gif create mode 100644 serverApps/src/web/images/Menu16.gif create mode 100644 serverApps/src/web/images/NextD16.gif create mode 100644 serverApps/src/web/images/PreviousD16.gif create mode 100644 serverApps/src/web/images/Zoom10.gif create mode 100644 serverApps/src/web/images/active-bg.gif create mode 100644 serverApps/src/web/images/dark-bg.gif create mode 100644 serverApps/src/web/images/hover-bg.gif create mode 100644 serverApps/src/web/images/menuarrow.gif create mode 100644 serverApps/src/web/images/normal-bg.gif create mode 100644 serverApps/src/web/images/rowhover-bg.gif create mode 100644 serverApps/src/web/images/status-bg.gif create mode 100644 serverApps/src/web/images/tab-left-selected.gif create mode 100644 serverApps/src/web/images/tab-left.gif create mode 100644 serverApps/src/web/images/tab-right-selected.gif create mode 100644 serverApps/src/web/images/tab-right.gif create mode 100644 serverApps/src/web/images/title-bg.gif create mode 100644 serverApps/src/web/images/today-bg.gif create mode 100644 serverApps/src/web/js/calendar-setup.js create mode 100644 serverApps/src/web/js/calendar.js rename serverApps/src/web/{ => js}/menu.js (93%) create mode 100644 serverApps/src/web/js/mktree.js rename serverApps/src/web/{ => js}/standard.js (95%) create mode 100644 serverApps/src/web/js/table.js create mode 100644 serverApps/src/web/js/window.js create mode 100644 serverApps/src/web/lang/calendar-en.js delete mode 100644 serverApps/src/web/popup.css delete mode 100644 serverApps/src/web/window.css delete mode 100644 serverApps/src/web/window.js create mode 100644 serverApps/src/web/window_files/colorschememapping.xml create mode 100644 serverApps/src/web/window_files/filelist.xml create mode 100644 serverApps/src/web/window_files/themedata.thmx diff --git a/serverApps/src/web/Background.gif b/serverApps/src/web/Background.gif deleted file mode 100644 index 11988728edc48c6e0f92dfe0d47d2ae5a717e4d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2301 zcmcgu`!^Ge8=p;7jP_Mix4yqVinEVtYV;k)lS-@oBK=ks|!=X}odoX>fFdY(9YJ1qF1%0U1C0LIy% z9VIG|uw%cBq-OOuH%mmu>k<|XI0Og+ zF|vbla**Six0jP~0Koo7IP?YQaN+z&M2Q+fjkmO*J*y~Pod5vh4uJOq9bCW#ADN!_ zuGnAYbigmQGF6mpbK(w?4 z+%huE?P604$MMTa8$FiPE%x|`k#7b?E=d#jFM!y`306#?1gkE#KYw{DRtGNV{59T5 z-eE`EbKjzVg?ybtogv(E`b1V^UVu_!QbvY7s+0RksjhG$Hy+Jd==MaBmya&min^Jr z_tOR${kf*zZ}#q6P4eHrstfh*=hDn7hy1wty&G@tP?{@rpFa{!V$#p%Ko&3q|C*9oeyosHd9_}aJ z>0E!9P;Go=I~QCI%b-+_UCus_-m(hXZ+|=7Tq=9FnQ~DW#xdcFWYjNU&*;>Y}$u7Bao*Fm=dOSry0!VgW0~rjzbG#n@MHfl+mYIGFc> zS3?-3(J#^aGz5Jb?G?us{Y6bY1n(6ONk2`0r6JHTGQiHL*RB*f@S_JJN|9P+xK^Xe zHby4vFp`KXL zOeV|rpXPhPxR&d2WHzPp#A1WgW50ojO#QEqeWFv7ZDpL8`WtX(_%Nu63 zvH;~l)sHvZjL4{&ru4Olcb^$sSTU(&)B#mr`eN=5IBpbXl0T@i2mVxBZ{h}ABk)UO z%jF?mwXyGs{ccxAwZ%0Bw2p*L6Xj0@m?rR6w*l54?fx|^c=)3;c1eG(*I%(y#}p6` zaKmuKksjj-%R_?p>RMf<4RY4guh##FYdIe-7q6B@EYE=Xo^ zkWs&l=FDQ75NhHYz*A@A5+sH*g0V=RNsOfBEUY75{>D8W3p>|XUOX}S1?;nCzWjG} zEAUL&sT#auL*TjVx4&RSz06QDdW(v#SH5!gukXJ?rc;=!=h5}$_)%BIjQCVuG{oNl zU2hJzR7!j*wGE=;|KfW;4cR^(WREsOz(@Q0nPyM&qfkZAV+yleRZ?$0*=dtj6v4af zmj9yU%|hS>R919xWG!N}+O2)Lnz`BsMd9h?)|@V~PpxskTR_L%;{&gm_NBX7efBXM z1}o!)K;)Zxh#h}Pen3M_se77-Q zLt%Rwv9+pG8yrD02sDHXazP$}#N6Sq?wG3N5o^v$zV`F$s)8jD^q6qd#lM_{=WjSn5oqejjy~(J0i62$|HrAwc)XY$oo7EmpEX|uF%_+;>HN%^kuc~7GL0jIx70zul5VObKE-c2Ikau=GSD7<`kX@K-4P48 zW$RvA-t`a7C-q60d6Ee{`)h8CyyNKCI%9;Vmd4WhbQD+s-Y} zoaNgiX^jV@fg^q{I9OTCR-<~_#+1nC113qCHr(uz-9IP4=Dn{Ppron>w9!DmUrF6p zlZh95+JSkU%ANaOogu?M7RAGV)2#G#XxY$2EAzK)jnY3nn_@AX zoPaf#2Ji{7ms%${eT7bSp$@32><&>h1UQgaq~#=e%o>bh-zLZ%-T>*@>mK+33X>U= zpHoe&QA4Z`6}WL@L)e0~6vYxnS-YH(YyZrqGhhD!4DKcdHZXm^F`RA3UkD6NGgpa5aRwD=I48_jIj$ zt5Iif88vZ2=%C^-Y25g8Vq7N0{KU!Wi=G>Z#|0OA9Xs`?J6_=DvTAlKyDeK5VH5Ws zIywZ2K>dMXajSjtnt`GmSa!ag5MQqfcgU=)0s;yxJz19Yb>{K~ptJf@~ diff --git a/serverApps/src/web/Logo.gif b/serverApps/src/web/Logo.gif index f3e3c9368219408ec01943c3936b8e5e93855372..761db55b58411ca94edb6bac541deaba2ea363c4 100644 GIT binary patch delta 6528 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

D6 zZI{IFBq3!kTJO_>Z9k=W#zj%$dzR3c=Z$w;zXS6d^4 z7zx0Ih?}t<=GECQNnHWB2HNfmT$5EHGLJ)1@3e7Tjwna&1FDl<@1p*F=@)gjtMDGx zd%fq#_9SMpuv5Buqs`~3h?_4oOU^+yzf18}zp0FSo9aN^5rEA~kZa52%1*+$%D7v- z)maLD7Gbw}@C;B24*`dNB+B*&&hu8kl-8&n$NM3wV<0;Mn`SvJvgGMBCYCa;Ng20o z6vciOi7kYbVzI?ksfiHJ!& z63{D3$PL{B%t$-Cu8bQBJQVHg+M3Yk4{)oJFC_`dvj^~O6r-tsq9aVKVam9^h;mkb z)<8CBd0w%_!0_a^r^L7f`O2cC8*vw4rZR3KvgFQ1yfudcTLUQLp7K`TSo`A?Vnr(m zNHq8rW!%lcQ%FE{6Xg7VTBhx&w9M!frXt~hK8f;mk(cgnWJQ{dtX4x<7JMCtsL$K*IdF)#dRkfq zZ}o@DxHAdc->V|g^kY(*U#*OL!CM^)8a7HtC?vbPGoV|$UFZQLK(ubv+->@+5SRu0btJ7penF$;iC4|<5xB4GQG{2rb#rTw*x4Mb45Dp|g?<Y}GetMFD&M$WE$Tw~MMDehLT zMV`lym7hblQgZ5TmjC^tSV+E?uL`<)tjUET> zB+MXRu|7h~k-pyQ4;sB;lzFi|k}H)r$$X4t%YNTm{aT~X8M#b!mbBz_2a;v(K6m2 z`3lX-ne@4cw`@A_K#qCw1%c;8R-7W-A821x=^fR1ad~Ie4@6RI4niCh8z7Tmex4W0DJSgLKC%i(g?yYWf)8+q>&S+wllyn+O1t}@X zpj42Ok_<`(DJjXIRFIOA3`zwlDaoKzkdl%NN(Ct?$)Hq_l9CMm2j4^+=EnGibpQYW M07*qoM6N<$g26#tmH+?% diff --git a/serverApps/src/web/LogoSmall.gif b/serverApps/src/web/LogoSmall.gif index cfd4d027069d14997e8df11cd9c6bb8f5799707a..61c2440736e275bde6d663418e4c7e5f0440b0ca 100644 GIT binary patch delta 725 zcmV;`0xJFa2mS>iiBL{Q4GJ0x0000DNk~Le0000m0000A2nGNE0P^GAOpzfse*%z6 zL_t(Ijm^|uh?Yed2H@*kHwc6JCZ(iU!iY*LDlj_<>L7!nlZs%D$|KE%Y~Oz9=O~MQ zt;ST^%D{C+cff-pi9(7ZI*4i`Tudm+q9inI%sNP_{W^GO;bTz(*`Vj-otgK3?z!i= zpP5c~WTJ~FuneEz5!{GJ(ZdgTe-kg26sOH`geDK7Q&Rl%Wby~_3U0wLX*cZ8Jc`cN%8g2ccF?VtiIoJc_q*TK#t_uEx(L#V`AEhA>@He>@PHya<NuduBiFlZfosHC_qH2Fz9jANJ0lP{~{@2I$gn6GWcf91F{H2Hcwg$FBUZ=KJ?{W!bwY{Tl%zED`xMk zf^}&ze62fomlP*Mf0MW1Ra}lGxK3-k zzE`R@i>rrD9lsHp{6)=MjVtT=xYog?+Sa=rKhEMCtC(Xr3)c)_EoLs__jNvr_4r6@ z-^C@x(JFEaZo@a&h(p@@v$jw02Y9V-{v5vU8}GxdCB@BJw|15k-^aCDXEs;-(aQTv z&AkT?)V(+0k4~>QE4x_#O@t<2iYY8CDIT6H-hqFI{J-NLgwfvmfL*X;00000NkvXX Hu0mjfq%2^>1e*=q2 zL_t(YiRIQ?s8&@F2k_rH3R0H1g`~o?=t2-BWo2lV*G$YP=wV}FAy_X$?$9n6We=$s zwko&ize_< zS$_`#-o%Ke^_wv=hO)h=f9f0YTy_$E#afJNvfqbmVkqA)s(LIIKIY}X7vL2Q z@t)Gjtj*YSa}pNDP;SJ=qN=aLt+*V0F*}BGS+<{r6;iu2=sfhv@5>JJZ7_yoe+=dH zjB!QQP0UY&h91)}e<`ZES5ejTGe}zu<=fIpz*Onx7@7G5f0XeLO)%dd0s27ZCuM#~ zQPth@`=yyT-#EK6{}h7`+xHEe(1fYU$9uEQm3iH;znXwmMOE*V2G$)|j~lY?5ge4} z#$$L5!(%A790^D&+drc**iuyWI@~X{;);echH^Jvk}6>df1Z&B_s$r~{YSuiQcB1y zsihX<`WVWOThWG34qMQcH{F4CQh$CX_0S{?i=o_?o!Kmv?rNzwx8n1R)1I;RG-2<} zvfWLx?OAp(e}5nizrJ`1qw=ltQT7L>;JzGKA88PGX59wqkQxcwfy=O5`j`1i8q``k zI~!~MdCFJgD0{dwhVr4mW6v)8q4>Ab|2_e~1G=p`-i?lFV*mgE07*qoM6N<$f_7BU AnE(I) diff --git a/serverApps/src/web/calendar.html b/serverApps/src/web/calendar.html new file mode 100644 index 0000000000..a9a378934e --- /dev/null +++ b/serverApps/src/web/calendar.html @@ -0,0 +1,157 @@ + + + + +Select Date, Please. + + + + + + +
+ + + + +
+ + + +
+ + + diff --git a/serverApps/src/web/css/calendar-blue.css b/serverApps/src/web/css/calendar-blue.css new file mode 100644 index 0000000000..b7c9cde0b0 --- /dev/null +++ b/serverApps/src/web/css/calendar-blue.css @@ -0,0 +1,232 @@ +/* The main calendar widget. DIV containing a table. */ + +div.calendar { position: relative; } + +.calendar, .calendar table { + border: 1px solid #556; + font-size: 11px; + color: #000; + cursor: default; + background: #eef; + font-family: tahoma,verdana,sans-serif; +} + +/* Header part -- contains navigation buttons and day names. */ + +.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; /* They are the navigation buttons */ + padding: 2px; /* Make the buttons seem like they're pressing */ +} + +.calendar .nav { + background: #778 url(/adempiere/images/menuarrow.gif) no-repeat 100% 100%; +} + +.calendar thead .title { /* This holds the current "month, year" */ + font-weight: bold; /* Pressing it will take you to the current date */ + text-align: center; + background: #fff; + color: #000; + padding: 2px; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ + background: #778; + color: #fff; +} + +.calendar thead .daynames { /* Row containing the day names */ + background: #bdf; +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #556; + padding: 2px; + text-align: center; + color: #000; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #a66; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + background-color: #aaf; + color: #000; + border: 1px solid #04f; + padding: 1px; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + background-color: #77c; + padding: 2px 0px 0px 2px; +} + +/* The body part -- contains all the days in month. */ + +.calendar tbody .day { /* Cells containing month days dates */ + width: 2em; + color: #456; + text-align: right; + padding: 2px 4px 2px 2px; +} +.calendar tbody .day.othermonth { + font-size: 80%; + color: #bbb; +} +.calendar tbody .day.othermonth.oweekend { + color: #fbb; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #000; + background: #bdf; +} + +.calendar tbody .rowhilite td { + background: #def; +} + +.calendar tbody .rowhilite td.wn { + background: #eef; +} + +.calendar tbody td.hilite { /* Hovered cells */ + background: #def; + padding: 1px 3px 1px 1px; + border: 1px solid #bbb; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + background: #cde; + padding: 2px 2px 0px 2px; +} + +.calendar tbody td.selected { /* Cell showing today date */ + font-weight: bold; + border: 1px solid #000; + padding: 1px 3px 1px 1px; + background: #fff; + color: #000; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #a66; +} + +.calendar tbody td.today { /* Cell showing selected date */ + font-weight: bold; + color: #00f; +} + +.calendar tbody .disabled { color: #999; } + +.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */ + visibility: hidden; +} + +.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */ + display: none; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ + text-align: center; + background: #556; + color: #fff; +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + background: #fff; + color: #445; + border-top: 1px solid #556; + padding: 1px; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + background: #aaf; + border: 1px solid #04f; + color: #000; + padding: 1px; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + background: #77c; + padding: 2px 0px 0px 2px; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.calendar .combo { + position: absolute; + display: none; + top: 0px; + left: 0px; + width: 4em; + cursor: default; + border: 1px solid #655; + background: #def; + color: #000; + font-size: 90%; + z-index: 100; +} + +.calendar .combo .label, +.calendar .combo .label-IEfix { + text-align: center; + padding: 1px; +} + +.calendar .combo .label-IEfix { + width: 4em; +} + +.calendar .combo .hilite { + background: #acf; +} + +.calendar .combo .active { + border-top: 1px solid #46a; + border-bottom: 1px solid #46a; + background: #eef; + font-weight: bold; +} + +.calendar td.time { + border-top: 1px solid #000; + padding: 1px 0px; + text-align: center; + background-color: #f4f0e8; +} + +.calendar td.time .hour, +.calendar td.time .minute, +.calendar td.time .ampm { + padding: 0px 3px 0px 4px; + border: 1px solid #889; + font-weight: bold; + background-color: #fff; +} + +.calendar td.time .ampm { + text-align: center; +} + +.calendar td.time .colon { + padding: 0px 2px 0px 3px; + font-weight: bold; +} + +.calendar td.time span.hilite { + border-color: #000; + background-color: #667; + color: #fff; +} + +.calendar td.time span.active { + border-color: #f00; + background-color: #000; + color: #0f0; +} diff --git a/serverApps/src/web/menu.css b/serverApps/src/web/css/menu.css similarity index 51% rename from serverApps/src/web/menu.css rename to serverApps/src/web/css/menu.css index bd0950ae11..6080dde5c5 100644 --- a/serverApps/src/web/menu.css +++ b/serverApps/src/web/css/menu.css @@ -1,53 +1,54 @@ -/* Adempiere (c) JJanke Modified by moyses */ +/* Compiere (c) Jorg Janke */ /* $Id: menu.css,v 1.1 2006/04/21 18:03:35 jjanke Exp $ */ body { - background-color: #fbf8f1; + /* Manu #F4FCFF; */ + background-color: #FFFFFF; color: #000000; - font-size: 12px; -} - -cite { - display: block; font-size: 10px; - padding-bottom: 0px; - padding-top: 0px; } -li { - font-weight: normal; - font-size: 12px; - margin-left: 0px; - padding-left: 5px; - cursor: pointer; +li{ + margin-left:10px; + padding-left:5px; +} + +ul{ + padding: 0; + margin: 0 0 0 5px; + text-indent: -10px; } td { - font-size: 12px; -} - -ul { - margin-left:15px; + font-size: 10px; } .menuTable { border-left: none; border-right: none; - margin: 0px; - padding: 2px; + margin: 0px 0px 0px 0px; + padding: 0px 0px 0px 0px; } .menuHeader { - border-top: none; + background-color : #C9D9F5; + padding:10px 10px 10px 10px; + border-bottom: 0px solid #000000; } .menuCenter { - border-bottom: 1px solid #000000; - border-top: 1px solid #000000; + width: 100%; + background-color : #FFFFFF; + border: none; + padding:0px 0px 0px 15px; + border-top: 1px solid #003FAF; + border-bottom: 1px solid #003FAF; + margin: 0px 0px 0px 0px; } .menuFooter { - border-bottom: none; + background-color : #C9D9F5; + padding:5px 5px 5px 5px; } @@ -73,6 +74,6 @@ ul { .menuSummary { font-weight: bold; /* Menu Closed */ - list-style-image: url(images/mClosed.gif); + list-style-image: url(/adempiere/images/mClosed.gif); list-style-type: square; } diff --git a/serverApps/src/web/css/mktree.css b/serverApps/src/web/css/mktree.css new file mode 100644 index 0000000000..c1dfc1b5ea --- /dev/null +++ b/serverApps/src/web/css/mktree.css @@ -0,0 +1,23 @@ +/* Put this inside a @media qualifier so Netscape 4 ignores it */ +@media screen, print { + /* Turn off list bullets */ + ul.mktree li { list-style: none; } + /* Control how "spaced out" the tree is */ + ul.mktree, ul.mktree ul , ul.mktree li { margin-left:10px; padding:0px; } + /* Provide space for our own "bullet" inside the LI */ + ul.mktree li .bullet { padding-left: 15px; } + /* Show "bullets" in the links, depending on the class of the LI that the link's in */ + ul.mktree li.liOpen .bullet { cursor: pointer; background: url(minus.gif) center left no-repeat; } + ul.mktree li.liClosed .bullet { cursor: pointer; background: url(plus.gif) center left no-repeat; } + ul.mktree li.liBullet .bullet { cursor: default; background: url(bullet.gif) center left no-repeat; } + /* Sublists are visible or not based on class of parent LI */ + ul.mktree li.liOpen ul { display: block; } + ul.mktree li.liClosed ul { display: none; } + + /* Format menu items differently depending on what level of the tree they are in */ + /* Uncomment this if you want your fonts to decrease in size the deeper they are in the tree */ +/* + ul.mktree li ul li { font-size: 90% } +*/ + +} diff --git a/serverApps/src/web/css/popup.css b/serverApps/src/web/css/popup.css new file mode 100644 index 0000000000..9681278685 --- /dev/null +++ b/serverApps/src/web/css/popup.css @@ -0,0 +1,49 @@ +/* Compiere HTML UI (c) Jorg Janke */ +/* $Id: popup.css,v 1.1 2006/04/21 18:03:35 jjanke Exp $ */ +h1 { + color: #003FAF; + font-size: 16px !important; + margin-bottom: 10px; + margin-top: 0; +} + +th { + font-size: 10px; + background-color: #D7E2F8; + font-weight: bold; + color: black; +} + +td { + font-size: 10px; + color: black; +} + + +.Cerror{ + background: #FF4A4A; +} + +.Cmandatory{ + background: #9DFFFF; +} + +.popupTable { + border-left: none; + border-right: none; + margin: 0px; + padding: 2px; +} + +.popupHeader { + border-top: none; +} + +.popupCenter { + border-bottom: 1px solid #000000; + border-top: 1px solid #000000; +} + +.popupFooter { + border-bottom: none; +} diff --git a/serverApps/src/web/standard.css b/serverApps/src/web/css/standard.css similarity index 73% rename from serverApps/src/web/standard.css rename to serverApps/src/web/css/standard.css index fb6a0ca3b9..fffcf90039 100644 --- a/serverApps/src/web/standard.css +++ b/serverApps/src/web/css/standard.css @@ -1,4 +1,4 @@ -/* Adempiere HTML UI (c) Jorg Janke */ +/* Compiere HTML UI (c) Jorg Janke */ /* $Id: standard.css,v 1.1 2006/04/21 18:03:35 jjanke Exp $ */ a { @@ -11,14 +11,24 @@ a:hover { } body { - font-family: arial, helvetica, sans-serif; - font-size: 12px; - margin-left: 0; - margin-top: 0; + margin-top:0px; + margin-right:0px; + margin-left:0px; + margin-bottom:0px; + padding-top: 0px; + padding-right: 0px; + padding-left: 0px; + padding-bottom: 0px; + font-family: Arial, verdana; + font-size: 8pt; + font-weight: normal; + COLOR: #000000; + background-color : white; +; } h1 { - color: #FF0000; + color: #003FAF; font-size: 16px !important; margin-bottom: 10px; margin-top: 0; @@ -61,9 +71,19 @@ hr { padding-top: 0; } -th { - background-color: #E6E6FA; - text-align: left; + +th { + font-size: 10px; + background-color: #C9D9F5; + font-weight: bold; + color: black; + border: 0px; +} + +td { + font-size: 10px; + color: black; + border: 0px; } p { diff --git a/serverApps/src/web/css/table.css b/serverApps/src/web/css/table.css new file mode 100644 index 0000000000..a21a4b8c14 --- /dev/null +++ b/serverApps/src/web/css/table.css @@ -0,0 +1,134 @@ + +/* Striping */ +tr.alternate { + background-color:#E3ECFC;; +} + +/* Sorting */ +th.table-sortable { + cursor:pointer; + background-image:url("/adempiere/images/01_unsorted.gif"); + background-position:center left; + background-repeat:no-repeat; + padding-left:12px; +} +th.table-sorted-asc { + background-image:url("/adempiere/images/01_ascending.gif"); + background-position:center left; + background-repeat:no-repeat; +} +th.table-sorted-desc { + background-image:url("/adempiere/images/01_descending.gif"); + background-position:center left; + background-repeat:no-repeat; +} +th.table-filtered { + background-image:url("/adempiere/filter.gif"); + background-position:center left; + background-repeat:no-repeat; +} +select.table-autofilter { + font-size:smaller; +} + +/* Examples which stray from the default */ +table.altstripe tr.alternate2 { + background-color:#ccffff; +} + +/* Sort Icon Styles */ +table.sort01 th.table-sortable { background-image:url("01_unsorted.gif"); } +table.sort01 th.table-sorted-asc { background-image:url("01_ascending.gif"); } +table.sort01 th.table-sorted-desc { background-image:url("01_descending.gif"); } + +table.sort02 th.table-sortable { background-image:none; padding-left:16px; } +table.sort02 th.table-sorted-asc { background-image:url("02_ascending.gif"); } +table.sort02 th.table-sorted-desc { background-image:url("02_descending.gif"); } + +table.sort03 th.table-sortable { background-image:none; } +table.sort03 th.table-sorted-asc { background-image:url("03_ascending.gif"); } +table.sort03 th.table-sorted-desc { background-image:url("03_descending.gif"); } + +table.sort04 th.table-sortable { background-image:none; } +table.sort04 th.table-sorted-asc { background-image:url("04_ascending.gif"); } +table.sort04 th.table-sorted-desc { background-image:url("04_descending.gif"); } + +table.sort05 th.table-sortable { background-image:url("05_unsorted.gif"); padding-left:16px;} +table.sort05 th.table-sorted-asc { background-image:url("05_ascending.gif"); } +table.sort05 th.table-sorted-desc { background-image:url("05_descending.gif"); } + +table.sort06 th.table-sortable { background-image:none; padding-left:16px;} +table.sort06 th.table-sorted-asc { background-image:url("06_ascending.gif"); } +table.sort06 th.table-sorted-desc { background-image:url("06_descending.gif"); } + +table.sort07 th.table-sortable { background-image:none; } +table.sort07 th.table-sorted-asc { background-image:url("07_ascending.gif"); } +table.sort07 th.table-sorted-desc { background-image:url("07_descending.gif"); } + +table.sort08 th.table-sortable { background-image:none; } +table.sort08 th.table-sorted-asc { background-image:url("08_ascending.gif"); } +table.sort08 th.table-sorted-desc { background-image:url("08_descending.gif"); } + +table.sort09 th.table-sortable { background-image:none; padding-left:30px;} +table.sort09 th.table-sorted-asc { background-image:url("09_ascending.gif"); } +table.sort09 th.table-sorted-desc { background-image:url("09_descending.gif"); } + +table.sort10 th.table-sortable { background-image:url("10_unsorted.gif"); } +table.sort10 th.table-sorted-asc { background-image:url("10_ascending.gif"); } +table.sort10 th.table-sorted-desc { background-image:url("10_descending.gif"); } + +table.sort11 th.table-sortable { background-image:url("11_unsorted.gif");padding-left:24px; } +table.sort11 th.table-sorted-asc { background-image:url("11_ascending.gif"); } +table.sort11 th.table-sorted-desc { background-image:url("11_descending.gif"); } + +table.sort12 th.table-sortable { background-image:none; } +table.sort12 th.table-sorted-asc { background-image:url("12_ascending.gif"); } +table.sort12 th.table-sorted-desc { background-image:url("12_descending.gif"); } + +table.sort13 th.table-sortable { background-image:none; } +table.sort13 th.table-sorted-asc { background-image:url("13_ascending.gif"); } +table.sort13 th.table-sorted-desc { background-image:url("13_descending.gif"); } + +table.sort14 th.table-sortable { background-image:none; } +table.sort14 th.table-sorted-asc { background-image:url("14_ascending.gif"); } +table.sort14 th.table-sorted-desc { background-image:url("14_descending.gif"); } + +table.sort15 th.table-sortable { background-image:none; } +table.sort15 th.table-sorted-asc { background-image:url("15_ascending.gif"); } +table.sort15 th.table-sorted-desc { background-image:url("15_descending.gif"); } + +table.sort16 th.table-sortable { background-image:none; } +table.sort16 th.table-sorted-asc { background-image:url("16_ascending.gif"); } +table.sort16 th.table-sorted-desc { background-image:url("16_descending.gif"); } + +table.sort17 th.table-sortable { background-image:none; } +table.sort17 th.table-sorted-asc { background-image:url("17_ascending.gif"); } +table.sort17 th.table-sorted-desc { background-image:url("17_descending.gif"); } + +table.sort18 th.table-sortable { background-image:url("18_unsorted.gif"); } +table.sort18 th.table-sorted-asc { background-image:url("18_ascending.gif"); } +table.sort18 th.table-sorted-desc { background-image:url("18_descending.gif"); } + +table.sort19 th.table-sortable { background-image:url("19_unsorted.gif");padding-left:24px; } +table.sort19 th.table-sorted-asc { background-image:url("19_ascending.gif"); } +table.sort19 th.table-sorted-desc { background-image:url("19_descending.gif"); } + +/* Icons box */ +.iconset { + margin:5px; + border:1px solid #cccccc; + border-color:#cccccc #666666 #666666 #cccccc; + text-align:center; + cursor:pointer; + width:100px; +} +.iconset img { + margin:3px; +} + +/* Documentation */ +tr.doc_section { + font-weight:bold; + text-align:center; + background-color:#dddddd; +} \ No newline at end of file diff --git a/serverApps/src/web/css/theme.css b/serverApps/src/web/css/theme.css new file mode 100644 index 0000000000..5e9c8b90dd --- /dev/null +++ b/serverApps/src/web/css/theme.css @@ -0,0 +1,236 @@ +/* Distributed as part of The Coolest DHTML Calendar + Author: Mihai Bazon, www.bazon.net/mishoo + Copyright Dynarch.com 2005, www.dynarch.com +*/ + +/* The main calendar widget. DIV containing a table. */ + +div.calendar { position: relative; } + +.calendar, .calendar table { + border: 1px solid #bdb2bf; + font-size: 11px; + color: #000; + cursor: default; + background: url("/adempiere/images/normal-bg.gif"); + font-family: "trebuchet ms",verdana,tahoma,sans-serif; +} + +.calendar { + border-color: #797979; +} + +/* Header part -- contains navigation buttons and day names. */ + +.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; /* They are the navigation buttons */ + padding: 2px; /* Make the buttons seem like they're pressing */ + background: url("/adempiere/images/title-bg.gif") repeat-x 0 100%; color: #000; + font-weight: bold; +} + +.calendar .nav { + font-family: verdana,tahoma,sans-serif; +} + +.calendar .nav div { + background: transparent url("/adempiere/images/menuarrow.gif") no-repeat 100% 100%; +} + +.calendar thead tr { background: url("/adempiere/images/title-bg.gif") repeat-x 0 100%; color: #000; } + +.calendar thead .title { /* This holds the current "month, year" */ + font-weight: bold; /* Pressing it will take you to the current date */ + text-align: center; + padding: 2px; + background: url("/adempiere/images/title-bg.gif") repeat-x 0 100%; color: #000; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #797979; + padding: 2px; + text-align: center; + color: #000; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #c44; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + background: url("/adempiere/images/hover-bg.gif"); + border-bottom: 1px solid #797979; + padding: 2px 2px 1px 2px; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + background: url("/adempiere/images/active-bg.gif"); color: #fff; + padding: 3px 1px 0px 3px; + border-bottom: 1px solid #797979; +} + +.calendar thead .daynames { /* Row containing the day names */ + background: url("/adempiere/images/dark-bg.gif"); +} + +/* The body part -- contains all the days in month. */ + +.calendar tbody .day { /* Cells containing month days dates */ + font-family: verdana,tahoma,sans-serif; + width: 2em; + color: #000; + text-align: right; + padding: 2px 4px 2px 2px; +} +.calendar tbody .day.othermonth { + font-size: 80%; + color: #999; +} +.calendar tbody .day.othermonth.oweekend { + color: #f99; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #797979; + background: url("/adempiere/images/dark-bg.gif"); +} + +.calendar tbody .rowhilite td, +.calendar tbody .rowhilite td.wn { + background: url("/adempiere/images/rowhover-bg.gif"); +} + +.calendar tbody td.today { font-weight: bold; /* background: url("/adempiere/images/today-bg.gif") no-repeat 70% 50%; */ } + +.calendar tbody td.hilite { /* Hovered cells */ + background: url("/adempiere/images/hover-bg.gif"); + padding: 1px 3px 1px 1px; + border: 1px solid #bbb; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + padding: 2px 2px 0px 2px; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #c44; +} + +.calendar tbody td.selected { /* Cell showing selected date */ + font-weight: bold; + border: 1px solid #797979; + padding: 1px 3px 1px 1px; + background: url("/adempiere/images/active-bg.gif"); color: #fff; +} + +.calendar tbody .disabled { color: #999; } + +.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */ + visibility: hidden; +} + +.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */ + display: none; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ + text-align: center; + background: #565; + color: #fff; +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + padding: 2px; + background: url("/adempiere/images/status-bg.gif") repeat-x 0 0; color: #000; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + background: #afa; + border: 1px solid #084; + color: #000; + padding: 1px; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + background: #7c7; + padding: 2px 0px 0px 2px; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.calendar .combo { + position: absolute; + display: none; + top: 0px; + left: 0px; + width: 4em; + cursor: default; + border-width: 0 1px 1px 1px; + border-style: solid; + border-color: #797979; + background: url("/adempiere/images/normal-bg.gif"); color: #000; + z-index: 100; + font-size: 90%; +} + +.calendar .combo .label, +.calendar .combo .label-IEfix { + text-align: center; + padding: 1px; +} + +.calendar .combo .label-IEfix { + width: 4em; +} + +.calendar .combo .hilite { + background: url("/adempiere/images/hover-bg.gif"); color: #000; +} + +.calendar .combo .active { + background: url("/adempiere/images/active-bg.gif"); color: #fff; + font-weight: bold; +} + +.calendar td.time { + border-top: 1px solid #797979; + padding: 1px 0px; + text-align: center; + background: url("/adempiere/images/dark-bg.gif"); +} + +.calendar td.time .hour, +.calendar td.time .minute, +.calendar td.time .ampm { + padding: 0px 5px 0px 6px; + font-weight: bold; + background: url("/adempiere/images/normal-bg.gif"); color: #000; +} + +.calendar td.time .hour, +.calendar td.time .minute { + font-family: monospace; +} + +.calendar td.time .ampm { + text-align: center; +} + +.calendar td.time .colon { + padding: 0px 2px 0px 3px; + font-weight: bold; +} + +.calendar td.time span.hilite { + background: url("/adempiere/images/hover-bg.gif"); color: #000; +} + +.calendar td.time span.active { + background: url("/adempiere/images/active-bg.gif"); color: #fff; +} diff --git a/serverApps/src/web/css/window.css b/serverApps/src/web/css/window.css new file mode 100644 index 0000000000..c8d9eb1823 --- /dev/null +++ b/serverApps/src/web/css/window.css @@ -0,0 +1,184 @@ +/* Compiere HTML UI (c) Jorg Janke */ +/* $Id: window.css,v 1.1 2006/04/21 18:03:35 jjanke Exp $ */ + + +body { + /* Manu #F4FCFF; */ + background-color: #FFFFFF; + color: #000000; + font-size: 10px; +} + +input { + background-color: #FFFFFF; + font-size: 8pt; + font-family: verdana, arial; + border: solid gray 1px; +} + +textarea { + background: #FFFFFF; + font-size: 8pt; + font-family: verdana, arial; + border: solid gray 1px; +} + +select { + background: #FFFFFF; + font-size: 8pt; + font-family: verdana, arial; + border-bottom-style: groove; + border-bottom-color: Gray; + border-bottom-width: thin; + border-left-color: Gray; + border-left-style: groove; + border-left-width: thin; + border-right-color: Gray; + border-right-style: groove; + border-right-width: thin; + border-top-color: Gray; + border-top-style: groove; + border-top-width: thin; + } + +td { + font-size: 10px; +} + +.loginbtn { + width: 75px; + cursor:pointer; + margin-top:5px; + border:outset 2px #ccc; + background:url(/adempiere/images/Ok16.gif) no-repeat left; + background-color:#ffffff; +} + +.cancelbtn { + width: 75px; + cursor:pointer; + margin-top:5px; + border:outset 2px #ccc; + background:url(/adempiere/images/Cancel16.gif) no-repeat left; + background-color:#ffffff; +} +.submitbtn { + cursor:pointer; + margin-top:5px; + border:outset 2px #ccc; + background:url(/adempiere/images/Ok16.gif) no-repeat left; + background-color:#ffffff; +} +.closebtn { + cursor:pointer; + margin-top:5px; + border:outset 2px #ccc; + background:url(/adempiere/images/Cancel16.gif) no-repeat left; + background-color:#ffffff; +} +.processbtn { + cursor:pointer; + margin-top:5px; + border:outset 2px #ccc; + background:url(/adempiere/images/Process16.gif) no-repeat left; + background-color:#ffffff; + +} +.resetbtn { + cursor:pointer; + margin-top:5px; + border:outset 2px #ccc; + background:url(/adempiere/images/Ignore16.gif) no-repeat left; + background-color:#ffffff; + +} + +.Cerror { + background: #FF4A4A; +} + +.Cmandatory { + background: #fdf5dd; +} + +#tab { + float:left; + /*background:url(/adempiere/images/tab-left-selected.gif) no-repeat left top;*/ + margin:0; + font-size: 11px; + padding:0px 0px 0px 9px; + text-decoration:none; +} + +#tab span { + float:left; + display:block; + /*background:url(/adempiere/images/tab-right-selected.gif) no-repeat right top;*/ + padding:5px 9px 5px 0px; + font-size: 11px; + font-weight:bold; + color:black; +} + +#tab a:hover span { + color: red; +} + +#tabSelected { + float:left; + /*background:url(/adempiere/images/tab-left.gif) no-repeat left top;*/ + margin:0; + font-size: 11px; + padding:0px 0px 0px 9px; + color: red; +} + +#tabSelected span { + float:left; + display:block; + /*background:url(/adempiere/images/tab-right.gif) no-repeat right top;*/ + padding:5px 9px 5px 0px; + font-size: 11px; + font-weight:bold; + color: red; +} + + +td.toolbar { + border : 0px solid #000000; + padding:5px 5px 5px 5px; + background-color : #85A6E3; + border-top: 1px solid #003FAF; + border-bottom: 1px solid #003FAF; + text-align: left; + text-indent : 0; +} + + + +.windowHeader { + background-color : #C9D9F5; + padding:5px 5px 0px 5px; + border-bottom: 0px solid #000000; + +} + +.windowCenter { + background-color : #FFFFFF; + border: 0px solid #000000; + padding:5px 5px 0px 0px; +} + +.centerTable { + width: 100%; + background-color : #E3ECFC; + border: none; + padding:5px 5px 5px 5px; + border-top: 1px solid #003FAF; + border-bottom: 1px solid #003FAF; + margin: 0px 0px 0px 0px; +} +.windowFooter { + border-bottom: 1px solid #000000; +} + diff --git a/serverApps/src/web/del/Background.gif b/serverApps/src/web/del/Background.gif new file mode 100644 index 0000000000000000000000000000000000000000..19a5fae503d5e96a2046fd366b01407461675ef7 GIT binary patch literal 1083 zcmV-B1jPGCNk%w1VbTD|0FeLy|NsB@_y7I@0ssI2A^8LZ6afDKEC2ui0MY=+00092 zgpaAq?GK}zwAzca-n{z{hT=$;=82~2%C_zc$MQ_q_KoNI&iDQg3<`(DqVb4KDwoWr z^9hYgr_`$Tip^@b+^+Wv4vWX+GBIFII|6LB`fX^-;cB^^Ubf%y;`^QtHW%jx7}$0o zSm>3QsQA=~(0J&mLm#PZ6hl=<*61#>v zODk9^iW{OAK|I*&D*Bns$}GHL+yJWFs~K(m45DkjdQ1#S3a*^}u^p*O&1oCH&Q4wq z+)UV7x_*7`{BA;@j_=$pFWbE5^7ygegnQmxVPrNd9ZP){7tAzh^B+2y6e~7l01)9Ipulzp6i5>s!JEGX zy3rXlr39t+%=tmOG^$hxy0&R$M=@;8tvNY*6=|`jJF+3^NqqTJEh)Bb)kU4z(kVf@ z8vac4m-XIQz7}ddeH%F1;3jx~7^ZfV=tQ|p{th{eCL%A0^H5qbdIRZP%=i*Q&E%O% zY8o$xmOQH2u4UDRDZ}Cn7G}xSv!`5JtWC1U%o1V8OqiwXPZ3n9wv<;oH}KER_YPCY zvU5@0fR}5r>fJ+7rrw~B<7quPc-s!$Zijp>dUw&^8&1z)S*uCisO_i!ukRmw#hB$6 zY0bd58Xb5wR+xMHg@a9A)hLqIbk-GUOh^2o2O1uYF{qMh93BJVfgFAXM@@sFh~Zi% zZDd?;9#-hxae$Rq;)}@;IH4md{@7uQ?#R|3f8p`LV3Iw8h2tDL-X-9SaRKS%NG?4{ zud)QJ7hhDARnW4J1--X{tFUj%e~!)|Q1Zg`%8!A(*9+ zRsFZ;dR=xmVw;hP=o4ps{)Qo>)d{C3l7`Z_n|5TD$z-Fpbhzk=P;z?T8+6h6N znrEeEIy#n?wb_H;ky57G=W~q0r;V*Ct_otOLUF^Kuclu5AFx>ek-(`Lr^>adtG!Bl zEUd{A_av*=QJcnBi)orGVH~hXXrRrCJ5{h;33@KN>y}DvsP5(hZ-n!@5bnG8zL4)O z-0s^!zi9%Duey>ET(H3)A-sZ&1OCf!Ujh#s@hKDAS+T_v8=G;!0@vGdt@(l+vMjkO zT(ZZY-kI`klU>~MxG$p|v&u6=T(ihC=bZ3lJo7uz&oL}1^w1m^jdapVFU@q*PCpHG z)KX7Pb=6j1jdj*qZ_RbrUVjaC*kX@OcG+g1jdt2X-_V)kJocS*=|G&Qe|Ni~|f#ClA|NQ*_ z{r&$N8~N_gDkYStj(2>U^uJvG&#EF$6-AtZyUZ`;$pV(xRq{Gz8 z>M)@|N6hlzVs#E3PIh*N^h8d69yTU!UWN<-=4NG%VotUxtPK2Y>;X)?6<%#D0{qO3 z3)z{OnAz=kO;(pEvjlST#PP6Cu35w0&&kBc%ejo%&rzU~i-)m`-7SkjK$U}+k7+go zZ^D|zw!Ev@_4rsA7*A)fJIvv&!@#b>&&0va;(ng>G7k&aBOZot2X0Kb?7%al66nM3 sw1kf4Xu|_b0v;@NVKh@#P&H9~EG{I%DzIdtVZw>ylQo#bTNoIu0m+nboB#j- literal 0 HcmV?d00001 diff --git a/serverApps/src/web/del/Favorite16.gif b/serverApps/src/web/del/Favorite16.gif new file mode 100644 index 0000000000000000000000000000000000000000..36336f746e925df7b848d18de2d32a0e9d177a41 GIT binary patch literal 25214 zcmeHPy^kB$5r5>}kvvJq<=zRFS(y$JSfv07FkDHU)1;7H2x$zdxu^r^KqqN$Xn-+9@?o)p;j3;o%0?(NflDRHC?ql zl23nKc`@eF+t)AcqFu1nlh4LXd%u>OO&g5Ik7@(WwD-DfBNbFOS01?vkWSxKh+-^4AqMa%fjz*>-|I7xNid~(`$Nx*HQML|C~?oo;4hbQh3bZR)2 ztDhbBNmaYmKJK?jr1&=F9MjGp`1N}MY`?H_GXt_nl>G$iTr~-MV z8qRs$YrAA?@V(b=wChAw%4wXFda~ubC51uPb^PSZbGE|r8+FAP6p;p7%rJ3Bz3>?Z zeut(Zx`|(5{3N=Gs|dq=&<*^CqLcMJ6JG@MO~G$e_JaI3G45!obQ||o0z3f7JX6J- zCkegnD(9I-d2HNO-uTqu-MdrM2l7ECt5+EO#V&lL)$kr+#IA)Jy_Yr~?VBONE8|gD zpGt*u467JX3rB$fMr(|ZDfNT}8eqFk8u-|RSH{?k1QX>3CQ}(6Ay6)(TqY(ZTa{}{ zjYdiMfS@`x=F&h%!43w+9#tSpz@?GOwvUu*(a?0_)_Z4MgZZa@!X$rocGhxF`~BYV z6ax?RqXcoMMWa#^o{$UZ4@FJMMw@qh#xT;GhC8$9EiVf z3OnT+Jf#G$@OTq+unZxfrxAeX&LY6$x<$}g5?*a}EP~KpkhzT;ps<$!($71{OClZt zrz#dt$YK5DBV3VPc0FYUuFlY{qFsK-g)0cs&xvmL-F<}k6VDq^m@$@JP?#|Y zRwLk_f2CTSC{A|(j{&s4rBuDtca*4`~ zJuQLAF75B{qc8E}7PmYMq1$L)jAhZA*ro8R|sF3qFZ{Fk#jD{vSL`;uQKAld(dguTQA+HnJrS0u)_D5&2Z>yEZyZ{rS6(~nQ zbRvf$l?s--It#)pm&aYh1P+?nD>%b((21clldL%8*-CPqjDYNyCb4;5C1vBh3Y*>+ zRM|YQlJYBTvxslvDtx&Qx`EB}Dk)z;oX)d01)JwpQl?v7Cec2%1b6@l_o>0a0TS;~ zlYOcmisX_+Ac?>#B0&4eS-Z*EeBJ;?YnaWa9UJY}Xty@ahuM7EV$lXGO2ceEbFsoe znx|6wL2WvZPrC$tg-v;m1NVq|{P9&imuM}&v%?Gd`FvWu zl2yXI{HC=xX&?`XI*ZS%W|pG$GA%qw{>BYnC<}!ortx`|OSNc$D<#sv3tOQ?@o81c zYf@g2N=cT*^Z6X-^<2X>#YVh$;Pdnc!Menc2<7LjQ{=py&eb_ho~fH>>B)I|5UK>5 zYX>J*I6cefF;@bCpj7$*S?hpMeh(Y3-88ZXdxWe!4QRW$bb61GKHm9`PF`f3e)j_J zF7M;rT?C|JC+~MYQQL$9};Rz;`=%J_YcBj$+XJ)F$+$ z#DAU}u5w%*i}|7J;ae>q@XZ(c$uy9DM0ovuDe?d6pXJ43PHTdBu%5n@_%H2pb@5+a z%*A&T$9pe{|7N_+^6KLs9dpz6v@-t!4&NkW99jf)9nx$qzJxvlKSG$=g%bZS6ML$&n)qYejeR%6s``xRBOI+$ ze-@_S3x0DE zTciFGB`>}cj*?0I=N7>cE6!UP^tkEys2J*WU0(DN*6Dg)uN&1C_&pffk0Gl6ENe@* ztLJs!meu(o`>&rP>2cHZdTgWe`aXVHoq9X!ZGqnwqHi-q^`B*JCH_y274H*&y6keA-46dfoNNq#Z>Hooadq^EH{xjW4@#$;Da+ZQtZS|+26N6SsX?zltA%wpGzNNn4d3xfuFMcHW!-zn5NV5^Y+b#J)f1v+;kq@F74u8g1 z3V_Qb7xf4(ql4;oHCRT6Sy%KdqC;c}dj=3KS_jsrhP+vy%G2Y4xhS&kIFEc_9ayg+ z&xvFN#BV8MelmC?9a0~2>dz#n%Tj$Rn>^Ovg--H=6XphAPM4*+)P^RH^pXzDJ7Im& hLUNefLOtC6BmFwhtjkjCxrXBuGK>CpRsY@U{{X|BUuysW literal 0 HcmV?d00001 diff --git a/serverApps/src/web/del/PopupWindow.js_del b/serverApps/src/web/del/PopupWindow.js_del new file mode 100644 index 0000000000..8c02016140 --- /dev/null +++ b/serverApps/src/web/del/PopupWindow.js_del @@ -0,0 +1,469 @@ +// =================================================================== +// Author: Matt Kruse +// WWW: http://www.mattkruse.com/ +// +// NOTICE: You may use this code for any purpose, commercial or +// private, without any further permission from the author. You may +// remove this notice from your final code if you wish, however it is +// appreciated by the author if at least my web site address is kept. +// +// You may *NOT* re-distribute this code in any way except through its +// use. That means, you can include it in your product, or your web +// site, or any other form where the code is actually being used. You +// may not put the plain javascript up on your site for download or +// include it in your javascript libraries for download. +// If you wish to share this code with others, please just point them +// to the URL instead. +// Please DO NOT link directly to my .js files from your site. Copy +// the files to your server and use them there. Thank you. +// =================================================================== + + +/* SOURCE FILE: AnchorPosition.js */ + +/* +AnchorPosition.js +Author: Matt Kruse +Last modified: 10/11/02 + +DESCRIPTION: These functions find the position of an tag in a document, +so other elements can be positioned relative to it. + +COMPATABILITY: Netscape 4.x,6.x,Mozilla, IE 5.x,6.x on Windows. Some small +positioning errors - usually with Window positioning - occur on the +Macintosh platform. + +FUNCTIONS: +getAnchorPosition(anchorname) + Returns an Object() having .x and .y properties of the pixel coordinates + of the upper-left corner of the anchor. Position is relative to the PAGE. + +getAnchorWindowPosition(anchorname) + Returns an Object() having .x and .y properties of the pixel coordinates + of the upper-left corner of the anchor, relative to the WHOLE SCREEN. + +NOTES: + +1) For popping up separate browser windows, use getAnchorWindowPosition. + Otherwise, use getAnchorPosition + +2) Your anchor tag MUST contain both NAME and ID attributes which are the + same. For example: + + +3) There must be at least a space between for IE5.5 to see the + anchor tag correctly. Do not do with no space. +*/ + +// getAnchorPosition(anchorname) +// This function returns an object having .x and .y properties which are the coordinates +// of the named anchor, relative to the page. +function getAnchorPosition(anchorname) { + // This function will return an Object with x and y properties + var useWindow=false; + var coordinates=new Object(); + var x=0,y=0; + // Browser capability sniffing + var use_gebi=false, use_css=false, use_layers=false; + if (document.getElementById) { use_gebi=true; } + else if (document.all) { use_css=true; } + else if (document.layers) { use_layers=true; } + // Logic to find position + if (use_gebi && document.all) { + x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]); + y=AnchorPosition_getPageOffsetTop(document.all[anchorname]); + } + else if (use_gebi) { + var o=document.getElementById(anchorname); + x=AnchorPosition_getPageOffsetLeft(o); + y=AnchorPosition_getPageOffsetTop(o); + } + else if (use_css) { + x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]); + y=AnchorPosition_getPageOffsetTop(document.all[anchorname]); + } + else if (use_layers) { + var found=0; + for (var i=0; i tags may cause errors. + +USAGE: +// Create an object for a WINDOW popup +var win = new PopupWindow(); + +// Create an object for a DIV window using the DIV named 'mydiv' +var win = new PopupWindow('mydiv'); + +// Set the window to automatically hide itself when the user clicks +// anywhere else on the page except the popup +win.autoHide(); + +// Show the window relative to the anchor name passed in +win.showPopup(anchorname); + +// Hide the popup +win.hidePopup(); + +// Set the size of the popup window (only applies to WINDOW popups +win.setSize(width,height); + +// Populate the contents of the popup window that will be shown. If you +// change the contents while it is displayed, you will need to refresh() +win.populate(string); + +// set the URL of the window, rather than populating its contents +// manually +win.setUrl("http://www.site.com/"); + +// Refresh the contents of the popup +win.refresh(); + +// Specify how many pixels to the right of the anchor the popup will appear +win.offsetX = 50; + +// Specify how many pixels below the anchor the popup will appear +win.offsetY = 100; + +NOTES: +1) Requires the functions in AnchorPosition.js + +2) Your anchor tag MUST contain both NAME and ID attributes which are the + same. For example: + + +3) There must be at least a space between for IE5.5 to see the + anchor tag correctly. Do not do with no space. + +4) When a PopupWindow object is created, a handler for 'onmouseup' is + attached to any event handler you may have already defined. Do NOT define + an event handler for 'onmouseup' after you define a PopupWindow object or + the autoHide() will not work correctly. +*/ + +// Set the position of the popup window based on the anchor +function PopupWindow_getXYPosition(anchorname) { + var coordinates; + if (this.type == "WINDOW") { + coordinates = getAnchorWindowPosition(anchorname); + } + else { + coordinates = getAnchorPosition(anchorname); + } + this.x = coordinates.x; + this.y = coordinates.y; + } +// Set width/height of DIV/popup window +function PopupWindow_setSize(width,height) { + this.width = width; + this.height = height; + } +// Fill the window with contents +function PopupWindow_populate(contents) { + this.contents = contents; + this.populated = false; + } +// Set the URL to go to +function PopupWindow_setUrl(url) { + this.url = url; + } +// Set the window popup properties +function PopupWindow_setWindowProperties(props) { + this.windowProperties = props; + } +// Refresh the displayed contents of the popup +function PopupWindow_refresh() { + if (this.divName != null) { + // refresh the DIV object + if (this.use_gebi) { + document.getElementById(this.divName).innerHTML = this.contents; + } + else if (this.use_css) { + document.all[this.divName].innerHTML = this.contents; + } + else if (this.use_layers) { + var d = document.layers[this.divName]; + d.document.open(); + d.document.writeln(this.contents); + d.document.close(); + } + } + else { + if (this.popupWindow != null && !this.popupWindow.closed) { + if (this.url!="") { + this.popupWindow.location.href=this.url; + } + else { + this.popupWindow.document.open(); + this.popupWindow.document.writeln(this.contents); + this.popupWindow.document.close(); + } + this.popupWindow.focus(); + } + } + } +// Position and show the popup, relative to an anchor object +function PopupWindow_showPopup(anchorname) { + this.getXYPosition(anchorname); + this.x += this.offsetX; + this.y += this.offsetY; + if (!this.populated && (this.contents != "")) { + this.populated = true; + this.refresh(); + } + if (this.divName != null) { + // Show the DIV object + if (this.use_gebi) { + document.getElementById(this.divName).style.left = this.x + "px"; + document.getElementById(this.divName).style.top = this.y + "px"; + document.getElementById(this.divName).style.visibility = "visible"; + } + else if (this.use_css) { + document.all[this.divName].style.left = this.x; + document.all[this.divName].style.top = this.y; + document.all[this.divName].style.visibility = "visible"; + } + else if (this.use_layers) { + document.layers[this.divName].left = this.x; + document.layers[this.divName].top = this.y; + document.layers[this.divName].visibility = "visible"; + } + } + else { + if (this.popupWindow == null || this.popupWindow.closed) { + // If the popup window will go off-screen, move it so it doesn't + if (this.x<0) { this.x=0; } + if (this.y<0) { this.y=0; } + if (screen && screen.availHeight) { + if ((this.y + this.height) > screen.availHeight) { + this.y = screen.availHeight - this.height; + } + } + if (screen && screen.availWidth) { + if ((this.x + this.width) > screen.availWidth) { + this.x = screen.availWidth - this.width; + } + } + var avoidAboutBlank = window.opera || ( document.layers && !navigator.mimeTypes['*'] ) || navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled ); + this.popupWindow = window.open(avoidAboutBlank?"":"about:blank","window_"+anchorname,this.windowProperties+",width="+this.width+",height="+this.height+",screenX="+this.x+",left="+this.x+",screenY="+this.y+",top="+this.y+""); + } + this.refresh(); + } + } +// Hide the popup +function PopupWindow_hidePopup() { + if (this.divName != null) { + if (this.use_gebi) { + document.getElementById(this.divName).style.visibility = "hidden"; + } + else if (this.use_css) { + document.all[this.divName].style.visibility = "hidden"; + } + else if (this.use_layers) { + document.layers[this.divName].visibility = "hidden"; + } + } + else { + if (this.popupWindow && !this.popupWindow.closed) { + this.popupWindow.close(); + this.popupWindow = null; + } + } + } +// Pass an event and return whether or not it was the popup DIV that was clicked +function PopupWindow_isClicked(e) { + if (this.divName != null) { + if (this.use_layers) { + var clickX = e.pageX; + var clickY = e.pageY; + var t = document.layers[this.divName]; + if ((clickX > t.left) && (clickX < t.left+t.clip.width) && (clickY > t.top) && (clickY < t.top+t.clip.height)) { + return true; + } + else { return false; } + } + else if (document.all) { // Need to hard-code this to trap IE for error-handling + var t = window.event.srcElement; + while (t.parentElement != null) { + if (t.id==this.divName) { + return true; + } + t = t.parentElement; + } + return false; + } + else if (this.use_gebi && e) { + var t = e.originalTarget; + while (t.parentNode != null) { + if (t.id==this.divName) { + return true; + } + t = t.parentNode; + } + return false; + } + return false; + } + return false; + } + +// Check an onMouseDown event to see if we should hide +function PopupWindow_hideIfNotClicked(e) { + if (this.autoHideEnabled && !this.isClicked(e)) { + this.hidePopup(); + } + } +// Call this to make the DIV disable automatically when mouse is clicked outside it +function PopupWindow_autoHide() { + this.autoHideEnabled = true; + } +// This global function checks all PopupWindow objects onmouseup to see if they should be hidden +function PopupWindow_hidePopupWindows(e) { + for (var i=0; i0) { + this.type="DIV"; + this.divName = arguments[0]; + } + else { + this.type="WINDOW"; + } + this.use_gebi = false; + this.use_css = false; + this.use_layers = false; + if (document.getElementById) { this.use_gebi = true; } + else if (document.all) { this.use_css = true; } + else if (document.layers) { this.use_layers = true; } + else { this.type = "WINDOW"; } + this.offsetX = 0; + this.offsetY = 0; + // Method mappings + this.getXYPosition = PopupWindow_getXYPosition; + this.populate = PopupWindow_populate; + this.setUrl = PopupWindow_setUrl; + this.setWindowProperties = PopupWindow_setWindowProperties; + this.refresh = PopupWindow_refresh; + this.showPopup = PopupWindow_showPopup; + this.hidePopup = PopupWindow_hidePopup; + this.setSize = PopupWindow_setSize; + this.isClicked = PopupWindow_isClicked; + this.autoHide = PopupWindow_autoHide; + this.hideIfNotClicked = PopupWindow_hideIfNotClicked; + } diff --git a/serverApps/src/web/del/favicon.ico_del b/serverApps/src/web/del/favicon.ico_del new file mode 100644 index 0000000000000000000000000000000000000000..3e01ab70e52bd129da357812c6a86bdb7b74e3ac GIT binary patch literal 1406 zcmeH{J#NB45QV=byAT5wNJz9!ncfHR5x50#3m?HXRgS# z(t0gzHqvY+jYd(^MmvFa0{?LWu5;J?mJb&G#>AxSdo>YkfzPKTzu$2l3x5yggrT28yMlzAyIS-pEmS09XHv*@La-60k2Pn cH`sr`yXA)rzAE_K!uJAxa@&p*gXOXI2&K6{X#fBK literal 0 HcmV?d00001 diff --git a/serverApps/src/web/del/sortable.gif_del b/serverApps/src/web/del/sortable.gif_del new file mode 100644 index 0000000000000000000000000000000000000000..5975c36f91a261a4f4e6807612c36a3e3d221390 GIT binary patch literal 68 zcmZ?wbhEHb`1$y=Q6Ae)&MUG6Yl^3 literal 0 HcmV?d00001 diff --git a/serverApps/src/web/xxx.html b/serverApps/src/web/del/xxx.html_del similarity index 100% rename from serverApps/src/web/xxx.html rename to serverApps/src/web/del/xxx.html_del diff --git a/serverApps/src/web/xxx1.html b/serverApps/src/web/del/xxx1.html_del similarity index 77% rename from serverApps/src/web/xxx1.html rename to serverApps/src/web/del/xxx1.html_del index cc1dafd977..1bbd193bc3 100644 --- a/serverApps/src/web/xxx1.html +++ b/serverApps/src/web/del/xxx1.html_del @@ -15,7 +15,7 @@ alert ('function');

- + diff --git a/serverApps/src/web/favicon.ico b/serverApps/src/web/favicon.ico deleted file mode 100644 index 14c3ee6ebd599bfc8a5b055443b3114adf0b6b08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmbtWYfP2d75xwgGuE_|n08{u>1g`MOgr^Q)7DIDUx`i3w3*swl6Gn{9Xpv?Q)6PP zrI6I2D8Ax*d?HeLDau1YMYwRe7vwE+fs4HEN_>v`YxjlO~& zKYsisF@E0J*%{p4-tOSjf8)lDJG9Z8H*d=N__wdCt1FupMo#aO%koE$9=$#?G7`jR z;H_J?{s(I5(xo%%LJ@QBhe_Qvg~V zs;{sAa(Q`q*0pQb(9+Uk;*u{LQ+bdt+n8h6W{+u(xJ~8Z_xs`Tc(T|(%UGX*Q#FW< zjSVO$DA-n1R5V5&X8lxLVTl)O5%M?DG$w0lp*8yqM{%)v=*gUpUA=ns5ZBF{iht?S zrEfZ&&VFidFcgE<+nB;)J))tZ0piD;g7q_J>;XLq-5~I zg$v)?xN+k+g;lFo1#&Fb?RG0qll0XZ*08~=t*tfRtE#G`B`PZ`$F0nrhN8>SsHv_t zoWzlRYhn=xJ9kNg<@4FsjKze5Kb!E#!+jKiITs)7NeM%a<>Il9`!ld}+S0rM2{xAK|ht z&G*8>LR`6W1^M~;kY0|I!^k-L7dSJ|q98vHib34OQ#_=nVvvr?hw`NLr%#{$v+#)% zkdcv*P7Y?B@TIr7OJn&_oWd0*Yt+n>?^0(HvLio6e)10F#D~I>5Qgle1ITlvoB84) zJrsk@LHP1@{`~pm;Nai@atTUJP3^Yv6|;@4m=%w3wMID*HL zY+UK6d={l_L2l%SC_W#7ikv7kHF(XqzKdT&Lp|%H)Nr>sC>QcA4H@(Oty{Owr4I9$ zi>DVaUNl(3mFD6i?5ZjcuDKFWkQjoz=rzbs_&cf!&LZdN@8LZ05vs2wF|RGOR$~+Q z2k}ttNI!AV->O~KpYRbL9{$>yGiT;Dx$; zSc>dJzeRD%zlr}l8&u&_P)Xm>Q`quB`!j5Igk6RDdf7T%P*avV$e}dZLRI}e} zf1A2rHv4^OYOFIH6q9tw&dx?!S{m5%kJqhR_eJVH=hUfFeQ|MdNJ>fqdjUC)EM$K6 zKJrih12x5IX!MrBU++OvO(7aQPUJ;>1ZU(Q;XbtnCCUFnYollU4D9OaM0+du;)ZIp z_&@Ju>7cq6c6xd`5)%^<6&2O9bLY-E?2%a~Po6B~yEqwLoH<#j^Hz@U8`4#=wfekh zZK^`?Io3kdhbV|$i=xC$C{Nph8g~rp%QI*f;qw-uy{*OMMY&MDs{dH)20JDu28RwE z%3r^Jy}5ryM@NSqK73f5kdTmIYEONtwc5KsKTo?*5cfCaMXrLs+KHkw8&DX}-b?x? zuBLB6wKEbvj|1Hue)RDCx9l|E^+e)+$aA8$7jDndwnr(_jaSJ*@G^BC3-r2=)2tu-bukbDR{n``*erZIijJk6JO(q6T%-ac{S1j53?VwW#p zKJC4qvCk(5&ygcXbUqk-@t20uKzhozbXUA~>~{Pb*LTfR?5aJpS932_-R<4Gw{pXV z4fE}or+YFFZ?P7-RVUgnbQe$@@@Ln9Fs94D##JYZUGv3Tv2%X|eRhS0hQ2i&=F~Cv z#}d}bb#YMM+EXp6{?z|2mkV51 zxnswU_jt#6X(sto*1~cz$+p4~=BZ@3PKceo_A~ zIxi(9#p3=HL|e!+;~m!YNgnQFmq@>|fg)AS?i|EIhHSpAK8r u8?ph*`cj)^&5^k+D{zVh@Le`(yzSY1t(D1-e2!Vxrv}3v2n@erkpBzBG36`( diff --git a/serverApps/src/web/images/01_ascending.gif b/serverApps/src/web/images/01_ascending.gif new file mode 100644 index 0000000000000000000000000000000000000000..095ffe8eb79d460c3d1b8f03afdb6e0e57ef4aa9 GIT binary patch literal 71 zcmZ?wbhEHb(avD}yxv(O495 literal 0 HcmV?d00001 diff --git a/serverApps/src/web/images/01_descending.gif b/serverApps/src/web/images/01_descending.gif new file mode 100644 index 0000000000000000000000000000000000000000..2f3b6965340895e8e9862efd68bfbd99e4434357 GIT binary patch literal 71 zcmZ?wbhEHb4R@jgi3`07vl?XaE2J literal 0 HcmV?d00001 diff --git a/serverApps/src/web/images/AD10030.bak.gif b/serverApps/src/web/images/AD10030.bak.gif deleted file mode 100755 index 5bc543107bd5192404ba9b07eac10e6e7b0d116f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61457 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 diff --git a/serverApps/src/web/images/AttachmentD16.gif b/serverApps/src/web/images/AttachmentD16.gif new file mode 100644 index 0000000000000000000000000000000000000000..c94f74df34213dd5f4458bce7efe910dc4c30d26 GIT binary patch literal 334 zcmZ?wbhEHb6krfw_`tw$;J|@R3=E1tSr{3BKnFyCWEeR9Gk`@v0;s^Dfq{{U1zF4i s#34$A14$cD7b649K#DM-+YWRc+&!v54#cZ)Atc8GnGHZcvoKf#04DMdA^-pY literal 0 HcmV?d00001 diff --git a/serverApps/src/web/images/ComPiere150x50.gif b/serverApps/src/web/images/ComPiere150x50.gif new file mode 100644 index 0000000000000000000000000000000000000000..e73710d0263eb5cbda34de9ed100e5d2f89141d9 GIT binary patch literal 1227 zcmV;+1T_0cNk%w1VU_?g0J8u9|NsC0@9+QL-~Y_a|G&Tgudn}^ng5TE|9^k~W@i6S zPyatZ|1&fHA0Ph@5B~rFA^8LW2LJ#7EC2ui0G0qU000F45XecZy*TU5yZ>M)j$~<` zXsWJk>%MR-&vb3yc&_h!@BcvHAi;P%7K0!qKxj4t$`@f_tUer29|55#TCIzNAc_)D ztB&*IuoE2A-*`2VC5sFWGyNL?x!5};0y zujy0^wx|TK`b)uV!70+dXf-3uFJ}X6N>fGP=__Lj__dkRLFNQn6%>|0U{h+!$quFE zh)h6lIkH)|xA5Eu-_W!-iKnKneyR5ltdf%dVifFj#XbWZ5Z6f(2;i4f+URB@#( z8Gx8uR={Be2Xr%8O6pX_ATqDCWJsKHQJKIZQDOO^HG(LmWCD88u|xwwNkB!T4bG9M zV}5Cc`yJQC#TT{AR!GTP*?zrSit8Tg(+~A1boW#s!HRL`9-c8 zT)3f21f-GxpAL-ChlqJ}LIoBR7+_)lC22U6K~-)IP-tPO%xV~96le#l1*lLkV22*` z##_fFo z8qjOeE)B$Nn6zZlatK8ZSo$1zxg(^s09f$Ulp8kwd=z>EqibyhzY`FEOvo@0g_f0N z5HMZ<&iZHq?zgahI4}DYaE6FKBy~**>RypR6Gv+$DiDu4cKiko3aTg&Z`?aQ2W@xl p`}W{JKF9)XhHrib1;jWDqP(8({`>I9FaP}X*Khy*_`47R06SY744?o2 literal 0 HcmV?d00001 diff --git a/serverApps/src/web/images/ComPiereCom.jpg b/serverApps/src/web/images/ComPiereCom.jpg new file mode 100644 index 0000000000000000000000000000000000000000..02006d980a82975f76d87787f0b1fdbcc756fb2d GIT binary patch literal 2621 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 r0q>4ST``HLsiv literal 0 HcmV?d00001 diff --git a/serverApps/src/web/images/Compiere.jpg b/serverApps/src/web/images/Compiere.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b3d7fd7d04aa01ce906f144abf2d01f6d2e2d3a GIT binary patch literal 1056 zcmex=i3*BJ!6k`h{6D}T z$icwRV8F~M$iO7X$SlbC{|JL50|OH?BLfm(VFik?1EsVD7#NwES(q4D*rC!)jLa;o zfZ*fYHObv$ZY@ciXlRbOoB;M*>> zT2D&Tt1kFu*#qb8)?IUUc%E3!nfm<1a{tvi`lmlAUrDVDyddTfa))NUY7MHt`{x6Oy6SGUSH3%a-p2s^IxsW z8;lKAgO{>To4|ZQbTiX}`By$3*kj)R##Ua*$vtgB+pEdE3*PQNJ*iu4_LI7;+b`cz z*FN4WF-7)~=#v>smIu0O@7R==pZA|3kx6{xi{8*QW5tVEvjt?foR)ki&7}5eQIp03 zCW)@typ(M&uYP{_EI!cQ(^WWa(uB_E43pyVWc~YHq%3M2h{l@{{Woy@Ea(-Di z_u7_r^~=07v;}{)biNHcaq{@S#Qa}1!k=@to%B2Tci*eYT1hd1bMOD@-YiolRN-kkS(=R`5T<&q{b`0|h^)~hfel?a=Rqtl=E?RMMc4gMYPZ5RRH>C93y1`Jq^tSX9 z&+6%x@n=@^um)Ew=AU~e^2@XB%krYOU-5XKcvN!Ho2pHd1m*jldM$YOsktNTh0?Yc zwm*80y^&pgU$$Fi|LsEtjq8%N|G1j0&`^pVOrV2`Z#g_2jLZZXG}c^B?% z;kTB&EF@aP$Xqh#c*XSxt{bJg#LZsaa+6{Dy2iKToVZz3P|$>6cjol6^h^31$`&8^ z@;>U)%gafgy>{iNT{-+Xcd)ECxv147xFSvL)afmYOa3$D3AZxbxw&xj=a-WMmaNqH Q6d2mexmULTQ^o(A03NiB(*OVf literal 0 HcmV?d00001 diff --git a/serverApps/src/web/images/Compiere120x60.gif b/serverApps/src/web/images/Compiere120x60.gif new file mode 100644 index 0000000000000000000000000000000000000000..49345ea09853d49c6ea1544b071ee94f43083a8f GIT binary patch literal 1857 zcmZ9JYg|$X1I7<t1#mUObECG>O)6h)Q zW!~4ci(p#mx(Inmof*q4yGnG?-fFYG&DGX^XYTiYd!KL5^Z)WZzb8B*j1!o#7gz^O z0suDsKfS>wCa|$FY;e$Me0J-W8SCpCTd>{Tm{!}@cfYT%PpiG9)oQWYT1=y9YP!+T zFo? zHO64X#Kd6E&RlLO20>gd7bB5YtSG_&z|YT*!N`YU7=ln+TNwmF03Zeys$vW9|Hb$S z;w*tcfc+2nXA?lg^mV9!?W`GY%^i`hX)w0!+ITKSJ9Rd(qz%4k(s3;5hH-gk{t^$} zxP-JndISDR{qV=sUnXvP0wl@7;)E}G0G(CBgCt-e9dS~t0Vi5Ch>&VfSH7%j54&0| zMk=Db5myuq(VRYd^814TS`bR}^xjI*>8g01Dot)k)1`kGA*VutA&F<8({AC4cL*DlTCnQdW$t}8hQYdjl3b7e2y_?RbHv{8(#%vXKGvDu5boVu?}PK%KJ1U> zh!HD;PMR3$=m1--WxW^MuSWuyBd@G7F1rkue6nj^#j|iUo*&uyM=Q;mPZ7R%$bH*- z){pi`@ZvDOBDRc2EXl6WNbQe@K3!$^ugY_RzO{H`tvJ}QM#f-&-?Xq zUS+N^D{3N%`;={Aa@n5a$LQ{Wyt?d*LY zOC#6&pO6l+frOO?!3BU~LHC{n#AW3Voxgfq9U@NB6;&K6X9&0OrNOKun?0N3_;I^Y zBH`G^$$Kg|&%jFyn9hQ~UNP`oX-6sVWV!jV*2JeuqD#GPRMAAgh}`^Tq<%aIr*HX8 zR+A?p{*v4rpX)ie0|d{xhw)Ph7j}nj^RAgA?PTqmWBCUp5@)t7ZK7@p?a+ly2C%us z06+gp@BLb#llS9I@JWs;Imilknk-wDH|bBcHoH>HyTB9ijaL0G$*Al8_Ei3(Y@Y8x zbHz74`B`Y0*Q*3MK1))XjweQJ20W7Y_~QYv;i@Gj`2vM@hI!wUz8`frXXS-$txKrp z2mH40;dbf~@$WG=AVSS<2Mwfv(m+GuGHw3hIBL&;M}k{$3%X!wheGWHA5dOKXt<@Crq)0zPYnc!Z54 zox#dW1Q*zh&TKc}czo?;=%NfUK=U@U`#NHC(Ebn4r(yob=Y8;i)$FwHDs`C&>bK^s zlMjHiKf>z>Z!b3xuxBl4HUi`t4VBR&$wqzQn--W5jS`$) zaF(3mU_1&bS)}xW@k~8sJF3JUn=ByrMoZjY!Xi>I(W3kCU2tacjbg1jobEw^}b zmzCHRxKd~LC@3ZqJ{*S0YFPfV*C-F6H&Bvt^!8@xn~b86M{1-+va5q^P7VI~$=BB{ z*EAAW)6LXk6R^w~Yr?_q47;hBwX8W?wXJ)jbw|&27mkf&>-}?cWT!{h^!M zu=u6?z;Y4JMmC3Ixyui7bin{v4zNh?NUPi%tgX>O+kuKAyB-D8Yn~1zHz}YjVChaI z$gXGQ5k7m`iX8#skWTPdiegcDIOxLcBz>w>5EDNrXWq#yc7FmEWuZ5j1w&lRX61*H z2vwZxuS9%ZrrjK!FgpmS0))*FM-YV@2EZf-ynm-xWLlb0@fTYu(lOS0mHL(F$8eUG z`$kku#Yvu?Ws?Hma=BAMymMyThRfuuln1&KOLw`2A424^piIRE=`!0#ie#>yQ*_D*m!uGm?-DZfGXiRK@Uf{yL~MCwAb=H94&I{g=8=A?wJ U)yo#Q1D(s@>FVdQ&MBb@0Dj(8T>t<8 literal 0 HcmV?d00001 diff --git a/serverApps/src/web/images/FirstD16.gif b/serverApps/src/web/images/FirstD16.gif new file mode 100644 index 0000000000000000000000000000000000000000..f4f8e0dea15efd602aec0ef2c3fac0e9d89d58e1 GIT binary patch literal 92 zcmZ?wbhEHb6krfwn8*MEXU_beIrGf_|Nj+#vM{nUFf-_YL_zWlOuBRWSDv2Bu(*ev rrExRc*H`ByC!6Yti5aC&vy(fZrOm$hM9k4j>jO3UMI7yIObpflJ(wPU literal 0 HcmV?d00001 diff --git a/serverApps/src/web/images/HistoryD16.gif b/serverApps/src/web/images/HistoryD16.gif new file mode 100644 index 0000000000000000000000000000000000000000..cb0ae1eb27b96c73ace17d722358cc3735563272 GIT binary patch literal 362 zcmZ?wbhEHb6krfwxXJ(mn>OCAu3q~8KSN(%-~a#r&z$)&d)5J7Ufv0P+dqB!w0!xM zy?dYZ^lV+W^!(w&FQ-jC(onx@?V77IXP()LPzdgI3bO`C4Dw{Pw3+jZ>N zm#I_tZQXLOt#!?u*+)*D{BY*X|0z9t!B$b9Q2fcl$j-pZpaU`*-xkWyov0jKrqA8X^NWQa3UWUJywSsSw>=X%p+37h9jLhpdFe@yq iklDCFXnG4%`y5_&&S;kw@1s63hgq{upK@_zum%8=!FO)} literal 0 HcmV?d00001 diff --git a/serverApps/src/web/images/ImageFactory$FolderIcon.class b/serverApps/src/web/images/ImageFactory$FolderIcon.class new file mode 100644 index 0000000000000000000000000000000000000000..d8d38ed4dedcfba6abd766e0d9141e0f69b9e9d8 GIT binary patch literal 1383 zcmeHHO>fgc5Ph4ZO=1G2f$|MnB!t>atO&$`BBUrHB2vU9B@)MtJvd8kueII=`WHBG z;m06>1b2QEV%&fd2^X3>2hV!!H*epp=I!?%pT7d=;*LN!Cp#zG%d*_hZQ#G9sjm|i zQSJ|mWuO9Q?D4&Ui9@o(z@&8ufd^}sbsyDH71(^DQ|+D#RCo6#0=2#gNnq=Znkzq6 zY2-h%*4R24qVn-&YAHAIoI)9xB-62S+N3hGW*SqHKbBteU`8^eAXb(^nFyb-El@HO7=kUunM$CCQ$K2SzYA6KGxh!=WM3YavINQ z!hL~8L~cCOuic54h5~p0?iaR813LnjxULt5y6}>UpOcPeOyP~qkqu~|3$fd)*6$R( z3bcl4O12-XJSWzC|7?=$xXIkh%L5V>)cEoNs{CwV69RR9d&s%q)%$|xtM<81xbTg$ z3br^F7+@P0Ikpxk&f1)DH@M94PlhWc4DU-BuCBrGp@gA=YpkS#>$t(I$7(9Lh1>9c E0;l_u&;S4c literal 0 HcmV?d00001 diff --git a/serverApps/src/web/images/ImageFactory$FolderIcon16.class b/serverApps/src/web/images/ImageFactory$FolderIcon16.class new file mode 100644 index 0000000000000000000000000000000000000000..ff01f6fb43fec82174960e319591fce6a2d268f9 GIT binary patch literal 2187 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 diff --git a/serverApps/src/web/images/Java_logo.gif b/serverApps/src/web/images/Java_logo.gif deleted file mode 100644 index 69fce04656ce44cf29aa16c2a69fa15c29175b35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5076 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 E0j1d{t^fc4 literal 0 HcmV?d00001 diff --git a/serverApps/src/web/images/Menu16.gif b/serverApps/src/web/images/Menu16.gif new file mode 100644 index 0000000000000000000000000000000000000000..725ca3fbb0a42d43ae93cd09c5faab7ebb1dd244 GIT binary patch literal 400 zcmV;B0dM|^P)u4#2+hQX>w}((DMemLWW^P0VrB?iy+N(aSvKZhQ0LnKqzhZbW6J<&t?_-o11zQB;o*_~nnnJkptYua z6#g(3ZL;6MyKB=9b%~U1m~s((DsLWKe(SpkodiM2qkI%nUZ2Gn)9FIA9XL<$eV?G@ z5$s*K#vt1nsCvDgbL|w1MS@ai-x$+!5XW(^dVQ@H&T0ilmiGZj(-fYbQ0n8l`};fc z`91)Wq~7|6VTgVS2UX>|avDX^R-@6#XKB`JjOnq~3L%8G)`~CU0zgWc2_dpvE|+Mn uPed~Z)qG`hQ2^!(&^oTPK;jOmi+TrD#(M@W#^lZb0000(~_hCBkt*5h(~oqM|`cM?=E_ zxC{s2E?fi&ZUC0z!b*biCWgkg{4*5TQ6eLRq2Ng)?au0Z^LBv$77ea$j{uB+$=@pg z^??ObdzP7S>#2h zEXyqsAtDkHp*Xd{1OUuj5K&v)o;^?p9mo$apguL zalwTf58!1yfOqjAB)kC)E>NL|R;uSzdpa)8^l0iQ!G)d7%zvKAUTfCuy$Al=G{1W= z3vB!ne{6w`rRDjW>H(S0->zm)M= zwU-(Ka=BqZ+})R$nw&-wrMnxZr)H7h_O`^xv%`K!N@te550a1sbk=vX??5GJA8cgO zbIIWGU1U83NPlTSXA3Y?yaxm-RGV0W+oTq7grXSq~;duD0t>2>nS+qr`aa%B?Wloe`uq8<F?DSKc2q*x}zy9+FI%3*IygU-NJHv8HfNnAT=PnSXiwU6#7&I<}@x?^~_;U zzT%AaiTgi0N_Z^NX<=~K;H@IzpcuF?!K9(@VYXwfgVJH99)^hy43noGc=)1?fx#L8 DiMm9R literal 0 HcmV?d00001 diff --git a/serverApps/src/web/images/active-bg.gif b/serverApps/src/web/images/active-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..d608c54698e081a3deae0f1b9b827484deaeacce GIT binary patch literal 89 zcmZ?wbhEHb3xI7cXAAbm`*d3l}e6x_tTajT<-q|NpP}lZBCift^8z p0SG{98JMLwcHQ}C;N`q}uj=cwv(saC#4b@4SZ=W5%`PM literal 0 HcmV?d00001 diff --git a/serverApps/src/web/images/hover-bg.gif b/serverApps/src/web/images/hover-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..fbf94fc2c1891ff891f2d3c3208cf431c35a4628 GIT binary patch literal 89 zcmZ?wbhEHb-E$->CMz|NrfPt>_6 zHL)Z$MWH;iBts!2BUQoO(>H)Y2dIbvWC#PZ6vwVR9}T>mSMODQeRg(w%#PS4t~~0B LE8grwc6hbmm72G|20~mA|fBfXM6TVG$_ z(9pnQu^Jm2*=%-GQ&V$ub4yDLhr?-YZRK*gZEbBl9#0?;w70i+baZrfb_#{UckkYH zb#--jcfWuC{=lp-l@*;%x4OEzwzjsuzP_=sq1WpT2E*p&=GNBM_V)J9&W_P& z{I|#d_zx98>P^7_a1rqNu9o3pmTu>NONaG;VFkB$KG#RVxfAR>f?^Aj;;(dMBZ5fW>mq7M&c1_j zlforXNEjmEXB9UE90J{oN!rkgg41*M9K59gP7dSfZE=0$bR6MwVkUQGsbN_cIK9p8u(=-A(~?Y>9trn8WAi z%3U+hPIWo>M8CdnoLN9TayX!TL+YH^_WE`IY;9u637UnScTA12>h|TXb^VryLPlN@ zacLBzNi08X=W2zFv`czFm9}|GBBx!5#URu6o`oQ3`(hxBbf+9)MJ6hYkdW^6S~8L9 z&D*GW2TF!9U{Px|+snbS{i{_X8idYhd&Rg^Gv!L#gcPRX@0()5j)=VYnc zGa85Yb4@t}CtkAY;d%XEakQ9AOI(^cl11m+-~2voX&Jq@xHX7i=FLxJPR4t?R?zH>gAJ+nkX%JUcRe+=u;~ z?97BGkxe^(!lYaf==k=QJ;Nzhxsi}K$Ncl;WMx5c{838I15UE)x86{L>RC~b-iC3R z%$|Ey*~6Z#rnv-Y>bj-u`9>wDN!_rrvpLHjhLIL|VwbI@_AeuwmxTvy9rd&r0oq^^)IXXmDUrhfJVA$ V_>8+`8%0?TC^s=yu_*u$@DJ3Yh+F^w literal 0 HcmV?d00001 diff --git a/serverApps/src/web/images/tab-left.gif b/serverApps/src/web/images/tab-left.gif new file mode 100644 index 0000000000000000000000000000000000000000..e695a2b497321fcfffc669007ce845cd159bb600 GIT binary patch literal 1334 zcmZ?wbhEHb5|5Cr_O^b^7$_GiT16J$v@txpU{wpTBV7 z!o`ahFI~EH`SRr}SFT*WdiC11YuB$|zj5Qn&6_uG-MV%A_U$`&?%ch5_ujpG_wV0- z@ZiD2hYue;di415<0ns^Jbn7~*|TTQpFe-`;>F9CFJHZS_4@VeH*em&ef##^yLa#3 zzyI*z!^e*wKYjZ2`Sa&5U%q_(`t{qlZ{NRv|MBC;&!0bk{rdI$_wPS{{`~#>_us#N z|Ns97hsP)}fsQYJbj1|OT; zc%>_H6Fy9EI@T-GQ25})heTFhS(~yq7Zxh(a7)|N{CEMhp-n)q=nn_e65|QH$_XC? zoKj8*D7jconeec=Lr~eZPbSd%u=^Wjk4Y*I1De<-D0@!Ph}^W~FsHQh6obq|dpbW# zyUwtvoOJOdo3MG0Nu!V|mx#voLYe=KMoVo(wPXTb1Q;Fds{Sq;^dTXLm3x{_=&Br# zi;F#{YJa=AJ)Yn1kGO)^@1GA^L>bslIC61CCEj-FQ(W1lie5Zy zSDf@DvDMxoF{w>+orXY{Rv*XW?#MG5i`xw6btw0my}I$J*Z$WGnP75!~OqmiN_A+Hg$h4J9r+YQcTs9*s%JbRG{31#9 zS$XR+m(3|VG*f+E={L(~^Gg1`OrPB(=JjG>j#^dvf(|{a=ZhPhtX3?l@_UuBL^*BM zOQ7mkFPAT9(|WaH$+WCjD_1OA^=j3cZLeOf-f&D>>-Cx~*Ro!(-SKSI>vem+y?VX= Q0Gsxk4M*-t2{2d#0H)~5NB{r; literal 0 HcmV?d00001 diff --git a/serverApps/src/web/images/tab-right-selected.gif b/serverApps/src/web/images/tab-right-selected.gif new file mode 100644 index 0000000000000000000000000000000000000000..4fbfcc5254f0976a2cb1e659f3e506ac9d312aec GIT binary patch literal 5256 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 UgHETziu@z4>w`D=IRT3Q11OUV2mk;8 literal 0 HcmV?d00001 diff --git a/serverApps/src/web/images/tab-right.gif b/serverApps/src/web/images/tab-right.gif new file mode 100644 index 0000000000000000000000000000000000000000..b5da01b8fb8db74e243a4b8512aa8ac475f8fb96 GIT binary patch literal 3998 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 I#Q_ih4-rh$ga7~l literal 0 HcmV?d00001 diff --git a/serverApps/src/web/images/title-bg.gif b/serverApps/src/web/images/title-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..6a541b3bc1e4bbee3268e8a5b431e2c7e067b3b9 GIT binary patch literal 116 zcmZ?wbhEHbWMmLyc+AI8Sy_4e_U#7`9z1*Y?D_NOFJ8QO`}Xa-ckkZ6fB*UO=PzHr zeEwc6hbmm72G|20~mA|fBtHB8VX&K*sP!FEoV37-@-w z0R<@%0vdJ3g^a|I?Pj7#(uKh`L|Finie4=6J7+yFJ!?;2&hK|#eqYx=!aJTkdGdK~ zpXAvT*|;uzpq}wF^XC|f7Hy%(3T3cCne7xg0NE&VQse^UpvX;;2at=R3KMyuTq^;2 zC|Y8oD$05(`vPTsz*a#S0tVY?u&+|C9=JNny<&2Wlxxu0Hl1B<&bOHJt%U0!T(_BC zgSodcw-fkw;8z2`7Wg+!zQf>qKnNTBb`ZKuVKa!`hOo;JcIVTBAiY~i59ZSeL+aC| z!@BeVWcDfiw+cT5^1&QG406AoIcj8%=$U~We@)9obve2q{HDt%A^V9eOz8`!W#PUo z{Glyegxu${_yBUTjF`%Z|48DTBtDfyM6y>wiIePzB&H=%lq8Adt`lWUQ^v6JD^_ko zVMxpW0>xpRzl-zJT46#fEanU@Jl2Z$aN#etkRrv0xcG#WQfd*YMOH0xfG5?`f?CQG zRZvSM70ars5}YAe!5FKgv{(qnpg$pmfIbJN473Ck12uqBc&`6pfd*o?R4~A_FpDaG zf^k#kwtL0q(ctCQJ>$_C|68Xo9Y5B%<>HN|rPXUc)#iLZ4#(@;I^sWF!BdIIrn4`- z_ReJJ%ebfY&*2}GiP+Mnwl{8s9^RRq>F%t|b=gjA`^L{W-2=&FGRjoj?dL}ulChUN ztGti>UrgEp&DJF~TgO`%XJ0rw;D5cjZkdINhI+^4JxpY(BDmw(Y^2$Dw;%8S`6J8C z+7+J0mD495S)75uciVQyzK?~28yvw)3bIF5-kaz;!0dbQmF@mI-kmt>7+F`d+N zt#PY&(k@T!8mH}j>(;M_TI-IV)AU=8{=a)`lc$<@jm#z)SE${(>{g=Z!tz!BW;gbH Q9Q54|91Yd -Adempiere ERP+CRM Reach Client +ADempiere ERP+CRM Reach Client + + - + - - - - - - + + + diff --git a/serverApps/src/web/js/calendar-setup.js b/serverApps/src/web/js/calendar-setup.js new file mode 100644 index 0000000000..f2b4854308 --- /dev/null +++ b/serverApps/src/web/js/calendar-setup.js @@ -0,0 +1,200 @@ +/* Copyright Mihai Bazon, 2002, 2003 | http://dynarch.com/mishoo/ + * --------------------------------------------------------------------------- + * + * The DHTML Calendar + * + * Details and latest version at: + * http://dynarch.com/mishoo/calendar.epl + * + * This script is distributed under the GNU Lesser General Public License. + * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html + * + * This file defines helper functions for setting up the calendar. They are + * intended to help non-programmers get a working calendar on their site + * quickly. This script should not be seen as part of the calendar. It just + * shows you what one can do with the calendar, while in the same time + * providing a quick and simple method for setting it up. If you need + * exhaustive customization of the calendar creation process feel free to + * modify this code to suit your needs (this is recommended and much better + * than modifying calendar.js itself). + */ + +// $Id: calendar-setup.js,v 1.25 2005/03/07 09:51:33 mishoo Exp $ + +/** + * This function "patches" an input field (or other element) to use a calendar + * widget for date selection. + * + * The "params" is a single object that can have the following properties: + * + * prop. name | description + * ------------------------------------------------------------------------------------------------- + * inputField | the ID of an input field to store the date + * displayArea | the ID of a DIV or other element to show the date + * button | ID of a button or other element that will trigger the calendar + * eventName | event that will trigger the calendar, without the "on" prefix (default: "click") + * ifFormat | date format that will be stored in the input field + * daFormat | the date format that will be used to display the date in displayArea + * singleClick | (true/false) wether the calendar is in single click mode or not (default: true) + * firstDay | numeric: 0 to 6. "0" means display Sunday first, "1" means display Monday first, etc. + * align | alignment (default: "Br"); if you don't know what's this see the calendar documentation + * range | array with 2 elements. Default: [1900, 2999] -- the range of years available + * weekNumbers | (true/false) if it's true (default) the calendar will display week numbers + * flat | null or element ID; if not null the calendar will be a flat calendar having the parent with the given ID + * flatCallback | function that receives a JS Date object and returns an URL to point the browser to (for flat calendar) + * disableFunc | function that receives a JS Date object and should return true if that date has to be disabled in the calendar + * onSelect | function that gets called when a date is selected. You don't _have_ to supply this (the default is generally okay) + * onClose | function that gets called when the calendar is closed. [default] + * onUpdate | function that gets called after the date is updated in the input field. Receives a reference to the calendar. + * date | the date that the calendar will be initially displayed to + * showsTime | default: false; if true the calendar will include a time selector + * timeFormat | the time format; can be "12" or "24", default is "12" + * electric | if true (default) then given fields/date areas are updated for each move; otherwise they're updated only on close + * step | configures the step of the years in drop-down boxes; default: 2 + * position | configures the calendar absolute position; default: null + * cache | if "true" (but default: "false") it will reuse the same calendar object, where possible + * showOthers | if "true" (but default: "false") it will show days from other months too + * + * None of them is required, they all have default values. However, if you + * pass none of "inputField", "displayArea" or "button" you'll get a warning + * saying "nothing to setup". + */ +Calendar.setup = function (params) { + function param_default(pname, def) { if (typeof params[pname] == "undefined") { params[pname] = def; } }; + + param_default("inputField", null); + param_default("displayArea", null); + param_default("button", null); + param_default("eventName", "click"); + param_default("ifFormat", "%Y/%m/%d"); + param_default("daFormat", "%Y/%m/%d"); + param_default("singleClick", true); + param_default("disableFunc", null); + param_default("dateStatusFunc", params["disableFunc"]); // takes precedence if both are defined + param_default("dateText", null); + param_default("firstDay", null); + param_default("align", "Br"); + param_default("range", [1900, 2999]); + param_default("weekNumbers", true); + param_default("flat", null); + param_default("flatCallback", null); + param_default("onSelect", null); + param_default("onClose", null); + param_default("onUpdate", null); + param_default("date", null); + param_default("showsTime", false); + param_default("timeFormat", "24"); + param_default("electric", true); + param_default("step", 2); + param_default("position", null); + param_default("cache", false); + param_default("showOthers", false); + param_default("multiple", null); + + var tmp = ["inputField", "displayArea", "button"]; + for (var i in tmp) { + if (typeof params[tmp[i]] == "string") { + params[tmp[i]] = document.getElementById(params[tmp[i]]); + } + } + if (!(params.flat || params.multiple || params.inputField || params.displayArea || params.button)) { + alert("Calendar.setup:\n Nothing to setup (no fields found). Please check your code"); + return false; + } + + function onSelect(cal) { + var p = cal.params; + var update = (cal.dateClicked || p.electric); + if (update && p.inputField) { + p.inputField.value = cal.date.print(p.ifFormat); + if (typeof p.inputField.onchange == "function") + p.inputField.onchange(); + } + if (update && p.displayArea) + p.displayArea.innerHTML = cal.date.print(p.daFormat); + if (update && typeof p.onUpdate == "function") + p.onUpdate(cal); + if (update && p.flat) { + if (typeof p.flatCallback == "function") + p.flatCallback(cal); + } + if (update && p.singleClick && cal.dateClicked) + cal.callCloseHandler(); + }; + + if (params.flat != null) { + if (typeof params.flat == "string") + params.flat = document.getElementById(params.flat); + if (!params.flat) { + alert("Calendar.setup:\n Flat specified but can't find parent."); + return false; + } + var cal = new Calendar(params.firstDay, params.date, params.onSelect || onSelect); + cal.showsOtherMonths = params.showOthers; + cal.showsTime = params.showsTime; + cal.time24 = (params.timeFormat == "24"); + cal.params = params; + cal.weekNumbers = params.weekNumbers; + cal.setRange(params.range[0], params.range[1]); + cal.setDateStatusHandler(params.dateStatusFunc); + cal.getDateText = params.dateText; + if (params.ifFormat) { + cal.setDateFormat(params.ifFormat); + } + if (params.inputField && typeof params.inputField.value == "string") { + cal.parseDate(params.inputField.value); + } + cal.create(params.flat); + cal.show(); + return false; + } + + var triggerEl = params.button || params.displayArea || params.inputField; + triggerEl["on" + params.eventName] = function() { + var dateEl = params.inputField || params.displayArea; + var dateFmt = params.inputField ? params.ifFormat : params.daFormat; + var mustCreate = false; + var cal = window.calendar; + if (dateEl) + params.date = Date.parseDate(dateEl.value || dateEl.innerHTML, dateFmt); + if (!(cal && params.cache)) { + window.calendar = cal = new Calendar(params.firstDay, + params.date, + params.onSelect || onSelect, + params.onClose || function(cal) { cal.hide(); }); + cal.showsTime = params.showsTime; + cal.time24 = (params.timeFormat == "24"); + cal.weekNumbers = params.weekNumbers; + mustCreate = true; + } else { + if (params.date) + cal.setDate(params.date); + cal.hide(); + } + if (params.multiple) { + cal.multiple = {}; + for (var i = params.multiple.length; --i >= 0;) { + var d = params.multiple[i]; + var ds = d.print("%Y%m%d"); + cal.multiple[ds] = d; + } + } + cal.showsOtherMonths = params.showOthers; + cal.yearStep = params.step; + cal.setRange(params.range[0], params.range[1]); + cal.params = params; + cal.setDateStatusHandler(params.dateStatusFunc); + cal.getDateText = params.dateText; + cal.setDateFormat(dateFmt); + if (mustCreate) + cal.create(); + cal.refresh(); + if (!params.position) + cal.showAtElement(params.button || params.displayArea || params.inputField, params.align); + else + cal.showAt(params.position[0], params.position[1]); + return false; + }; + + return cal; +}; diff --git a/serverApps/src/web/js/calendar.js b/serverApps/src/web/js/calendar.js new file mode 100644 index 0000000000..9088e0e897 --- /dev/null +++ b/serverApps/src/web/js/calendar.js @@ -0,0 +1,1806 @@ +/* Copyright Mihai Bazon, 2002-2005 | www.bazon.net/mishoo + * ----------------------------------------------------------- + * + * The DHTML Calendar, version 1.0 "It is happening again" + * + * Details and latest version at: + * www.dynarch.com/projects/calendar + * + * This script is developed by Dynarch.com. Visit us at www.dynarch.com. + * + * This script is distributed under the GNU Lesser General Public License. + * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html + */ + +// $Id: calendar.js,v 1.51 2005/03/07 16:44:31 mishoo Exp $ + +/** The Calendar object constructor. */ +Calendar = function (firstDayOfWeek, dateStr, onSelected, onClose) { + // member variables + this.activeDiv = null; + this.currentDateEl = null; + this.getDateStatus = null; + this.getDateToolTip = null; + this.getDateText = null; + this.timeout = null; + this.onSelected = onSelected || null; + this.onClose = onClose || null; + this.dragging = false; + this.hidden = false; + this.minYear = 1970; + this.maxYear = 2050; + this.dateFormat = Calendar._TT["DEF_DATE_FORMAT"]; + this.ttDateFormat = Calendar._TT["TT_DATE_FORMAT"]; + this.isPopup = true; + this.weekNumbers = true; + this.firstDayOfWeek = typeof firstDayOfWeek == "number" ? firstDayOfWeek : Calendar._FD; // 0 for Sunday, 1 for Monday, etc. + this.showsOtherMonths = false; + this.dateStr = dateStr; + this.ar_days = null; + this.showsTime = false; + this.time24 = true; + this.yearStep = 2; + this.hiliteToday = true; + this.multiple = null; + // HTML elements + this.table = null; + this.element = null; + this.tbody = null; + this.firstdayname = null; + // Combo boxes + this.monthsCombo = null; + this.yearsCombo = null; + this.hilitedMonth = null; + this.activeMonth = null; + this.hilitedYear = null; + this.activeYear = null; + // Information + this.dateClicked = false; + + // one-time initializations + if (typeof Calendar._SDN == "undefined") { + // table of short day names + if (typeof Calendar._SDN_len == "undefined") + Calendar._SDN_len = 3; + var ar = new Array(); + for (var i = 8; i > 0;) { + ar[--i] = Calendar._DN[i].substr(0, Calendar._SDN_len); + } + Calendar._SDN = ar; + // table of short month names + if (typeof Calendar._SMN_len == "undefined") + Calendar._SMN_len = 3; + ar = new Array(); + for (var i = 12; i > 0;) { + ar[--i] = Calendar._MN[i].substr(0, Calendar._SMN_len); + } + Calendar._SMN = ar; + } +}; + +// ** constants + +/// "static", needed for event handlers. +Calendar._C = null; + +/// detect a special case of "web browser" +Calendar.is_ie = ( /msie/i.test(navigator.userAgent) && + !/opera/i.test(navigator.userAgent) ); + +Calendar.is_ie5 = ( Calendar.is_ie && /msie 5\.0/i.test(navigator.userAgent) ); + +/// detect Opera browser +Calendar.is_opera = /opera/i.test(navigator.userAgent); + +/// detect KHTML-based browsers +Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent); + +// BEGIN: UTILITY FUNCTIONS; beware that these might be moved into a separate +// library, at some point. + +Calendar.getAbsolutePos = function(el) { + var SL = 0, ST = 0; + var is_div = /^div$/i.test(el.tagName); + if (is_div && el.scrollLeft) + SL = el.scrollLeft; + if (is_div && el.scrollTop) + ST = el.scrollTop; + var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST }; + if (el.offsetParent) { + var tmp = this.getAbsolutePos(el.offsetParent); + r.x += tmp.x; + r.y += tmp.y; + } + return r; +}; + +Calendar.isRelated = function (el, evt) { + var related = evt.relatedTarget; + if (!related) { + var type = evt.type; + if (type == "mouseover") { + related = evt.fromElement; + } else if (type == "mouseout") { + related = evt.toElement; + } + } + while (related) { + if (related == el) { + return true; + } + related = related.parentNode; + } + return false; +}; + +Calendar.removeClass = function(el, className) { + if (!(el && el.className)) { + return; + } + var cls = el.className.split(" "); + var ar = new Array(); + for (var i = cls.length; i > 0;) { + if (cls[--i] != className) { + ar[ar.length] = cls[i]; + } + } + el.className = ar.join(" "); +}; + +Calendar.addClass = function(el, className) { + Calendar.removeClass(el, className); + el.className += " " + className; +}; + +// FIXME: the following 2 functions totally suck, are useless and should be replaced immediately. +Calendar.getElement = function(ev) { + var f = Calendar.is_ie ? window.event.srcElement : ev.currentTarget; + while (f.nodeType != 1 || /^div$/i.test(f.tagName)) + f = f.parentNode; + return f; +}; + +Calendar.getTargetElement = function(ev) { + var f = Calendar.is_ie ? window.event.srcElement : ev.target; + while (f.nodeType != 1) + f = f.parentNode; + return f; +}; + +Calendar.stopEvent = function(ev) { + ev || (ev = window.event); + if (Calendar.is_ie) { + ev.cancelBubble = true; + ev.returnValue = false; + } else { + ev.preventDefault(); + ev.stopPropagation(); + } + return false; +}; + +Calendar.addEvent = function(el, evname, func) { + if (el.attachEvent) { // IE + el.attachEvent("on" + evname, func); + } else if (el.addEventListener) { // Gecko / W3C + el.addEventListener(evname, func, true); + } else { + el["on" + evname] = func; + } +}; + +Calendar.removeEvent = function(el, evname, func) { + if (el.detachEvent) { // IE + el.detachEvent("on" + evname, func); + } else if (el.removeEventListener) { // Gecko / W3C + el.removeEventListener(evname, func, true); + } else { + el["on" + evname] = null; + } +}; + +Calendar.createElement = function(type, parent) { + var el = null; + if (document.createElementNS) { + // use the XHTML namespace; IE won't normally get here unless + // _they_ "fix" the DOM2 implementation. + el = document.createElementNS("http://www.w3.org/1999/xhtml", type); + } else { + el = document.createElement(type); + } + if (typeof parent != "undefined") { + parent.appendChild(el); + } + return el; +}; + +// END: UTILITY FUNCTIONS + +// BEGIN: CALENDAR STATIC FUNCTIONS + +/** Internal -- adds a set of events to make some element behave like a button. */ +Calendar._add_evs = function(el) { + with (Calendar) { + addEvent(el, "mouseover", dayMouseOver); + addEvent(el, "mousedown", dayMouseDown); + addEvent(el, "mouseout", dayMouseOut); + if (is_ie) { + addEvent(el, "dblclick", dayMouseDblClick); + el.setAttribute("unselectable", true); + } + } +}; + +Calendar.findMonth = function(el) { + if (typeof el.month != "undefined") { + return el; + } else if (typeof el.parentNode.month != "undefined") { + return el.parentNode; + } + return null; +}; + +Calendar.findYear = function(el) { + if (typeof el.year != "undefined") { + return el; + } else if (typeof el.parentNode.year != "undefined") { + return el.parentNode; + } + return null; +}; + +Calendar.showMonthsCombo = function () { + var cal = Calendar._C; + if (!cal) { + return false; + } + var cal = cal; + var cd = cal.activeDiv; + var mc = cal.monthsCombo; + if (cal.hilitedMonth) { + Calendar.removeClass(cal.hilitedMonth, "hilite"); + } + if (cal.activeMonth) { + Calendar.removeClass(cal.activeMonth, "active"); + } + var mon = cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()]; + Calendar.addClass(mon, "active"); + cal.activeMonth = mon; + var s = mc.style; + s.display = "block"; + if (cd.navtype < 0) + s.left = cd.offsetLeft + "px"; + else { + var mcw = mc.offsetWidth; + if (typeof mcw == "undefined") + // Konqueror brain-dead techniques + mcw = 50; + s.left = (cd.offsetLeft + cd.offsetWidth - mcw) + "px"; + } + s.top = (cd.offsetTop + cd.offsetHeight) + "px"; +}; + +Calendar.showYearsCombo = function (fwd) { + var cal = Calendar._C; + if (!cal) { + return false; + } + var cal = cal; + var cd = cal.activeDiv; + var yc = cal.yearsCombo; + if (cal.hilitedYear) { + Calendar.removeClass(cal.hilitedYear, "hilite"); + } + if (cal.activeYear) { + Calendar.removeClass(cal.activeYear, "active"); + } + cal.activeYear = null; + var Y = cal.date.getFullYear() + (fwd ? 1 : -1); + var yr = yc.firstChild; + var show = false; + for (var i = 12; i > 0; --i) { + if (Y >= cal.minYear && Y <= cal.maxYear) { + yr.innerHTML = Y; + yr.year = Y; + yr.style.display = "block"; + show = true; + } else { + yr.style.display = "none"; + } + yr = yr.nextSibling; + Y += fwd ? cal.yearStep : -cal.yearStep; + } + if (show) { + var s = yc.style; + s.display = "block"; + if (cd.navtype < 0) + s.left = cd.offsetLeft + "px"; + else { + var ycw = yc.offsetWidth; + if (typeof ycw == "undefined") + // Konqueror brain-dead techniques + ycw = 50; + s.left = (cd.offsetLeft + cd.offsetWidth - ycw) + "px"; + } + s.top = (cd.offsetTop + cd.offsetHeight) + "px"; + } +}; + +// event handlers + +Calendar.tableMouseUp = function(ev) { + var cal = Calendar._C; + if (!cal) { + return false; + } + if (cal.timeout) { + clearTimeout(cal.timeout); + } + var el = cal.activeDiv; + if (!el) { + return false; + } + var target = Calendar.getTargetElement(ev); + ev || (ev = window.event); + Calendar.removeClass(el, "active"); + if (target == el || target.parentNode == el) { + Calendar.cellClick(el, ev); + } + var mon = Calendar.findMonth(target); + var date = null; + if (mon) { + date = new Date(cal.date); + if (mon.month != date.getMonth()) { + date.setMonth(mon.month); + cal.setDate(date); + cal.dateClicked = false; + cal.callHandler(); + } + } else { + var year = Calendar.findYear(target); + if (year) { + date = new Date(cal.date); + if (year.year != date.getFullYear()) { + date.setFullYear(year.year); + cal.setDate(date); + cal.dateClicked = false; + cal.callHandler(); + } + } + } + with (Calendar) { + removeEvent(document, "mouseup", tableMouseUp); + removeEvent(document, "mouseover", tableMouseOver); + removeEvent(document, "mousemove", tableMouseOver); + cal._hideCombos(); + _C = null; + return stopEvent(ev); + } +}; + +Calendar.tableMouseOver = function (ev) { + var cal = Calendar._C; + if (!cal) { + return; + } + var el = cal.activeDiv; + var target = Calendar.getTargetElement(ev); + if (target == el || target.parentNode == el) { + Calendar.addClass(el, "hilite active"); + Calendar.addClass(el.parentNode, "rowhilite"); + } else { + if (typeof el.navtype == "undefined" || (el.navtype != 50 && (el.navtype == 0 || Math.abs(el.navtype) > 2))) + Calendar.removeClass(el, "active"); + Calendar.removeClass(el, "hilite"); + Calendar.removeClass(el.parentNode, "rowhilite"); + } + ev || (ev = window.event); + if (el.navtype == 50 && target != el) { + var pos = Calendar.getAbsolutePos(el); + var w = el.offsetWidth; + var x = ev.clientX; + var dx; + var decrease = true; + if (x > pos.x + w) { + dx = x - pos.x - w; + decrease = false; + } else + dx = pos.x - x; + + if (dx < 0) dx = 0; + var range = el._range; + var current = el._current; + var count = Math.floor(dx / 10) % range.length; + for (var i = range.length; --i >= 0;) + if (range[i] == current) + break; + while (count-- > 0) + if (decrease) { + if (--i < 0) + i = range.length - 1; + } else if ( ++i >= range.length ) + i = 0; + var newval = range[i]; + el.innerHTML = newval; + + cal.onUpdateTime(); + } + var mon = Calendar.findMonth(target); + if (mon) { + if (mon.month != cal.date.getMonth()) { + if (cal.hilitedMonth) { + Calendar.removeClass(cal.hilitedMonth, "hilite"); + } + Calendar.addClass(mon, "hilite"); + cal.hilitedMonth = mon; + } else if (cal.hilitedMonth) { + Calendar.removeClass(cal.hilitedMonth, "hilite"); + } + } else { + if (cal.hilitedMonth) { + Calendar.removeClass(cal.hilitedMonth, "hilite"); + } + var year = Calendar.findYear(target); + if (year) { + if (year.year != cal.date.getFullYear()) { + if (cal.hilitedYear) { + Calendar.removeClass(cal.hilitedYear, "hilite"); + } + Calendar.addClass(year, "hilite"); + cal.hilitedYear = year; + } else if (cal.hilitedYear) { + Calendar.removeClass(cal.hilitedYear, "hilite"); + } + } else if (cal.hilitedYear) { + Calendar.removeClass(cal.hilitedYear, "hilite"); + } + } + return Calendar.stopEvent(ev); +}; + +Calendar.tableMouseDown = function (ev) { + if (Calendar.getTargetElement(ev) == Calendar.getElement(ev)) { + return Calendar.stopEvent(ev); + } +}; + +Calendar.calDragIt = function (ev) { + var cal = Calendar._C; + if (!(cal && cal.dragging)) { + return false; + } + var posX; + var posY; + if (Calendar.is_ie) { + posY = window.event.clientY + document.body.scrollTop; + posX = window.event.clientX + document.body.scrollLeft; + } else { + posX = ev.pageX; + posY = ev.pageY; + } + cal.hideShowCovered(); + var st = cal.element.style; + st.left = (posX - cal.xOffs) + "px"; + st.top = (posY - cal.yOffs) + "px"; + return Calendar.stopEvent(ev); +}; + +Calendar.calDragEnd = function (ev) { + var cal = Calendar._C; + if (!cal) { + return false; + } + cal.dragging = false; + with (Calendar) { + removeEvent(document, "mousemove", calDragIt); + removeEvent(document, "mouseup", calDragEnd); + tableMouseUp(ev); + } + cal.hideShowCovered(); +}; + +Calendar.dayMouseDown = function(ev) { + var el = Calendar.getElement(ev); + if (el.disabled) { + return false; + } + var cal = el.calendar; + cal.activeDiv = el; + Calendar._C = cal; + if (el.navtype != 300) with (Calendar) { + if (el.navtype == 50) { + el._current = el.innerHTML; + addEvent(document, "mousemove", tableMouseOver); + } else + addEvent(document, Calendar.is_ie5 ? "mousemove" : "mouseover", tableMouseOver); + addClass(el, "hilite active"); + addEvent(document, "mouseup", tableMouseUp); + } else if (cal.isPopup) { + cal._dragStart(ev); + } + if (el.navtype == -1 || el.navtype == 1) { + if (cal.timeout) clearTimeout(cal.timeout); + cal.timeout = setTimeout("Calendar.showMonthsCombo()", 250); + } else if (el.navtype == -2 || el.navtype == 2) { + if (cal.timeout) clearTimeout(cal.timeout); + cal.timeout = setTimeout((el.navtype > 0) ? "Calendar.showYearsCombo(true)" : "Calendar.showYearsCombo(false)", 250); + } else { + cal.timeout = null; + } + return Calendar.stopEvent(ev); +}; + +Calendar.dayMouseDblClick = function(ev) { + Calendar.cellClick(Calendar.getElement(ev), ev || window.event); + if (Calendar.is_ie) { + document.selection.empty(); + } +}; + +Calendar.dayMouseOver = function(ev) { + var el = Calendar.getElement(ev); + if (Calendar.isRelated(el, ev) || Calendar._C || el.disabled) { + return false; + } + if (el.ttip) { + if (el.ttip.substr(0, 1) == "_") { + el.ttip = el.caldate.print(el.calendar.ttDateFormat) + el.ttip.substr(1); + } + el.calendar.tooltips.innerHTML = el.ttip; + } + if (el.navtype != 300) { + Calendar.addClass(el, "hilite"); + if (el.caldate) { + Calendar.addClass(el.parentNode, "rowhilite"); + } + } + return Calendar.stopEvent(ev); +}; + +Calendar.dayMouseOut = function(ev) { + with (Calendar) { + var el = getElement(ev); + if (isRelated(el, ev) || _C || el.disabled) + return false; + removeClass(el, "hilite"); + if (el.caldate) + removeClass(el.parentNode, "rowhilite"); + if (el.calendar) + el.calendar.tooltips.innerHTML = _TT["SEL_DATE"]; + return stopEvent(ev); + } +}; + +/** + * A generic "click" handler :) handles all types of buttons defined in this + * calendar. + */ +Calendar.cellClick = function(el, ev) { + var cal = el.calendar; + var closing = false; + var newdate = false; + var date = null; + if (typeof el.navtype == "undefined") { + if (cal.currentDateEl) { + Calendar.removeClass(cal.currentDateEl, "selected"); + Calendar.addClass(el, "selected"); + closing = (cal.currentDateEl == el); + if (!closing) { + cal.currentDateEl = el; + } + } + cal.date.setDateOnly(el.caldate); + date = cal.date; + var other_month = !(cal.dateClicked = !el.otherMonth); + if (!other_month && !cal.currentDateEl) + cal._toggleMultipleDate(new Date(date)); + else + newdate = !el.disabled; + // a date was clicked + if (other_month) + cal._init(cal.firstDayOfWeek, date); + } else { + if (el.navtype == 200) { + Calendar.removeClass(el, "hilite"); + cal.callCloseHandler(); + return; + } + date = new Date(cal.date); + if (el.navtype == 0) + date.setDateOnly(new Date()); // TODAY + // unless "today" was clicked, we assume no date was clicked so + // the selected handler will know not to close the calenar when + // in single-click mode. + // cal.dateClicked = (el.navtype == 0); + cal.dateClicked = false; + var year = date.getFullYear(); + var mon = date.getMonth(); + function setMonth(m) { + var day = date.getDate(); + var max = date.getMonthDays(m); + if (day > max) { + date.setDate(max); + } + date.setMonth(m); + }; + switch (el.navtype) { + case 400: + Calendar.removeClass(el, "hilite"); + var text = Calendar._TT["ABOUT"]; + if (typeof text != "undefined") { + text += cal.showsTime ? Calendar._TT["ABOUT_TIME"] : ""; + } else { + // FIXME: this should be removed as soon as lang files get updated! + text = "Help and about box text is not translated into this language.\n" + + "If you know this language and you feel generous please update\n" + + "the corresponding file in \"lang\" subdir to match calendar-en.js\n" + + "and send it back to <mihai_bazon@yahoo.com> to get it into the distribution ;-)\n\n" + + "Thank you!\n" + + "http://dynarch.com/mishoo/calendar.epl\n"; + } + alert(text); + return; + case -2: + if (year > cal.minYear) { + date.setFullYear(year - 1); + } + break; + case -1: + if (mon > 0) { + setMonth(mon - 1); + } else if (year-- > cal.minYear) { + date.setFullYear(year); + setMonth(11); + } + break; + case 1: + if (mon < 11) { + setMonth(mon + 1); + } else if (year < cal.maxYear) { + date.setFullYear(year + 1); + setMonth(0); + } + break; + case 2: + if (year < cal.maxYear) { + date.setFullYear(year + 1); + } + break; + case 100: + cal.setFirstDayOfWeek(el.fdow); + return; + case 50: + var range = el._range; + var current = el.innerHTML; + for (var i = range.length; --i >= 0;) + if (range[i] == current) + break; + if (ev && ev.shiftKey) { + if (--i < 0) + i = range.length - 1; + } else if ( ++i >= range.length ) + i = 0; + var newval = range[i]; + el.innerHTML = newval; + cal.onUpdateTime(); + return; + case 0: + // TODAY will bring us here + if ((typeof cal.getDateStatus == "function") && + cal.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate())) { + return false; + } + break; + } + if (!date.equalsTo(cal.date)) { + cal.setDate(date); + newdate = true; + } else if (el.navtype == 0) + newdate = closing = true; + } + if (newdate) { + ev && cal.callHandler(); + } + if (closing) { + Calendar.removeClass(el, "hilite"); + ev && cal.callCloseHandler(); + } +}; + +// END: CALENDAR STATIC FUNCTIONS + +// BEGIN: CALENDAR OBJECT FUNCTIONS + +/** + * This function creates the calendar inside the given parent. If _par is + * null than it creates a popup calendar inside the BODY element. If _par is + * an element, be it BODY, then it creates a non-popup calendar (still + * hidden). Some properties need to be set before calling this function. + */ +Calendar.prototype.create = function (_par) { + var parent = null; + if (! _par) { + // default parent is the document body, in which case we create + // a popup calendar. + parent = document.getElementsByTagName("body")[0]; + this.isPopup = true; + } else { + parent = _par; + this.isPopup = false; + } + this.date = this.dateStr ? new Date(this.dateStr) : new Date(); + + var table = Calendar.createElement("table"); + this.table = table; + table.cellSpacing = 0; + table.cellPadding = 0; + table.calendar = this; + Calendar.addEvent(table, "mousedown", Calendar.tableMouseDown); + + var div = Calendar.createElement("div"); + this.element = div; + div.className = "calendar"; + if (this.isPopup) { + div.style.position = "absolute"; + div.style.display = "none"; + } + div.appendChild(table); + + var thead = Calendar.createElement("thead", table); + var cell = null; + var row = null; + + var cal = this; + var hh = function (text, cs, navtype) { + cell = Calendar.createElement("td", row); + cell.colSpan = cs; + cell.className = "button"; + if (navtype != 0 && Math.abs(navtype) <= 2) + cell.className += " nav"; + Calendar._add_evs(cell); + cell.calendar = cal; + cell.navtype = navtype; + cell.innerHTML = "<div unselectable='on'>" + text + "</div>"; + return cell; + }; + + row = Calendar.createElement("tr", thead); + var title_length = 6; + (this.isPopup) && --title_length; + (this.weekNumbers) && ++title_length; + + hh("?", 1, 400).ttip = Calendar._TT["INFO"]; + this.title = hh("", title_length, 300); + this.title.className = "title"; + if (this.isPopup) { + this.title.ttip = Calendar._TT["DRAG_TO_MOVE"]; + this.title.style.cursor = "move"; + hh("&#x00d7;", 1, 200).ttip = Calendar._TT["CLOSE"]; + } + + row = Calendar.createElement("tr", thead); + row.className = "headrow"; + + this._nav_py = hh("&#x00ab;", 1, -2); + this._nav_py.ttip = Calendar._TT["PREV_YEAR"]; + + this._nav_pm = hh("&#x2039;", 1, -1); + this._nav_pm.ttip = Calendar._TT["PREV_MONTH"]; + + this._nav_now = hh(Calendar._TT["TODAY"], this.weekNumbers ? 4 : 3, 0); + this._nav_now.ttip = Calendar._TT["GO_TODAY"]; + + this._nav_nm = hh("&#x203a;", 1, 1); + this._nav_nm.ttip = Calendar._TT["NEXT_MONTH"]; + + this._nav_ny = hh("&#x00bb;", 1, 2); + this._nav_ny.ttip = Calendar._TT["NEXT_YEAR"]; + + // day names + row = Calendar.createElement("tr", thead); + row.className = "daynames"; + if (this.weekNumbers) { + cell = Calendar.createElement("td", row); + cell.className = "name wn"; + cell.innerHTML = Calendar._TT["WK"]; + } + for (var i = 7; i > 0; --i) { + cell = Calendar.createElement("td", row); + if (!i) { + cell.navtype = 100; + cell.calendar = this; + Calendar._add_evs(cell); + } + } + this.firstdayname = (this.weekNumbers) ? row.firstChild.nextSibling : row.firstChild; + this._displayWeekdays(); + + var tbody = Calendar.createElement("tbody", table); + this.tbody = tbody; + + for (i = 6; i > 0; --i) { + row = Calendar.createElement("tr", tbody); + if (this.weekNumbers) { + cell = Calendar.createElement("td", row); + } + for (var j = 7; j > 0; --j) { + cell = Calendar.createElement("td", row); + cell.calendar = this; + Calendar._add_evs(cell); + } + } + + if (this.showsTime) { + row = Calendar.createElement("tr", tbody); + row.className = "time"; + + cell = Calendar.createElement("td", row); + cell.className = "time"; + cell.colSpan = 2; + cell.innerHTML = Calendar._TT["TIME"] || "&nbsp;"; + + cell = Calendar.createElement("td", row); + cell.className = "time"; + cell.colSpan = this.weekNumbers ? 4 : 3; + + (function(){ + function makeTimePart(className, init, range_start, range_end) { + var part = Calendar.createElement("span", cell); + part.className = className; + part.innerHTML = init; + part.calendar = cal; + part.ttip = Calendar._TT["TIME_PART"]; + part.navtype = 50; + part._range = []; + if (typeof range_start != "number") + part._range = range_start; + else { + for (var i = range_start; i <= range_end; ++i) { + var txt; + if (i < 10 && range_end >= 10) txt = '0' + i; + else txt = '' + i; + part._range[part._range.length] = txt; + } + } + Calendar._add_evs(part); + return part; + }; + var hrs = cal.date.getHours(); + var mins = cal.date.getMinutes(); + var t12 = !cal.time24; + var pm = (hrs > 12); + if (t12 && pm) hrs -= 12; + var H = makeTimePart("hour", hrs, t12 ? 1 : 0, t12 ? 12 : 23); + var span = Calendar.createElement("span", cell); + span.innerHTML = ":"; + span.className = "colon"; + var M = makeTimePart("minute", mins, 0, 59); + var AP = null; + cell = Calendar.createElement("td", row); + cell.className = "time"; + cell.colSpan = 2; + if (t12) + AP = makeTimePart("ampm", pm ? "pm" : "am", ["am", "pm"]); + else + cell.innerHTML = "&nbsp;"; + + cal.onSetTime = function() { + var pm, hrs = this.date.getHours(), + mins = this.date.getMinutes(); + if (t12) { + pm = (hrs >= 12); + if (pm) hrs -= 12; + if (hrs == 0) hrs = 12; + AP.innerHTML = pm ? "pm" : "am"; + } + H.innerHTML = (hrs < 10) ? ("0" + hrs) : hrs; + M.innerHTML = (mins < 10) ? ("0" + mins) : mins; + }; + + cal.onUpdateTime = function() { + var date = this.date; + var h = parseInt(H.innerHTML, 10); + if (t12) { + if (/pm/i.test(AP.innerHTML) && h < 12) + h += 12; + else if (/am/i.test(AP.innerHTML) && h == 12) + h = 0; + } + var d = date.getDate(); + var m = date.getMonth(); + var y = date.getFullYear(); + date.setHours(h); + date.setMinutes(parseInt(M.innerHTML, 10)); + date.setFullYear(y); + date.setMonth(m); + date.setDate(d); + this.dateClicked = false; + this.callHandler(); + }; + })(); + } else { + this.onSetTime = this.onUpdateTime = function() {}; + } + + var tfoot = Calendar.createElement("tfoot", table); + + row = Calendar.createElement("tr", tfoot); + row.className = "footrow"; + + cell = hh(Calendar._TT["SEL_DATE"], this.weekNumbers ? 8 : 7, 300); + cell.className = "ttip"; + if (this.isPopup) { + cell.ttip = Calendar._TT["DRAG_TO_MOVE"]; + cell.style.cursor = "move"; + } + this.tooltips = cell; + + div = Calendar.createElement("div", this.element); + this.monthsCombo = div; + div.className = "combo"; + for (i = 0; i < Calendar._MN.length; ++i) { + var mn = Calendar.createElement("div"); + mn.className = Calendar.is_ie ? "label-IEfix" : "label"; + mn.month = i; + mn.innerHTML = Calendar._SMN[i]; + div.appendChild(mn); + } + + div = Calendar.createElement("div", this.element); + this.yearsCombo = div; + div.className = "combo"; + for (i = 12; i > 0; --i) { + var yr = Calendar.createElement("div"); + yr.className = Calendar.is_ie ? "label-IEfix" : "label"; + div.appendChild(yr); + } + + this._init(this.firstDayOfWeek, this.date); + parent.appendChild(this.element); +}; + +/** keyboard navigation, only for popup calendars */ +Calendar._keyEvent = function(ev) { + var cal = window._dynarch_popupCalendar; + if (!cal || cal.multiple) + return false; + (Calendar.is_ie) && (ev = window.event); + var act = (Calendar.is_ie || ev.type == "keypress"), + K = ev.keyCode; + if (ev.ctrlKey) { + switch (K) { + case 37: // KEY left + act && Calendar.cellClick(cal._nav_pm); + break; + case 38: // KEY up + act && Calendar.cellClick(cal._nav_py); + break; + case 39: // KEY right + act && Calendar.cellClick(cal._nav_nm); + break; + case 40: // KEY down + act && Calendar.cellClick(cal._nav_ny); + break; + default: + return false; + } + } else switch (K) { + case 32: // KEY space (now) + Calendar.cellClick(cal._nav_now); + break; + case 27: // KEY esc + act && cal.callCloseHandler(); + break; + case 37: // KEY left + case 38: // KEY up + case 39: // KEY right + case 40: // KEY down + if (act) { + var prev, x, y, ne, el, step; + prev = K == 37 || K == 38; + step = (K == 37 || K == 39) ? 1 : 7; + function setVars() { + el = cal.currentDateEl; + var p = el.pos; + x = p & 15; + y = p >> 4; + ne = cal.ar_days[y][x]; + };setVars(); + function prevMonth() { + var date = new Date(cal.date); + date.setDate(date.getDate() - step); + cal.setDate(date); + }; + function nextMonth() { + var date = new Date(cal.date); + date.setDate(date.getDate() + step); + cal.setDate(date); + }; + while (1) { + switch (K) { + case 37: // KEY left + if (--x >= 0) + ne = cal.ar_days[y][x]; + else { + x = 6; + K = 38; + continue; + } + break; + case 38: // KEY up + if (--y >= 0) + ne = cal.ar_days[y][x]; + else { + prevMonth(); + setVars(); + } + break; + case 39: // KEY right + if (++x < 7) + ne = cal.ar_days[y][x]; + else { + x = 0; + K = 40; + continue; + } + break; + case 40: // KEY down + if (++y < cal.ar_days.length) + ne = cal.ar_days[y][x]; + else { + nextMonth(); + setVars(); + } + break; + } + break; + } + if (ne) { + if (!ne.disabled) + Calendar.cellClick(ne); + else if (prev) + prevMonth(); + else + nextMonth(); + } + } + break; + case 13: // KEY enter + if (act) + Calendar.cellClick(cal.currentDateEl, ev); + break; + default: + return false; + } + return Calendar.stopEvent(ev); +}; + +/** + * (RE)Initializes the calendar to the given date and firstDayOfWeek + */ +Calendar.prototype._init = function (firstDayOfWeek, date) { + var today = new Date(), + TY = today.getFullYear(), + TM = today.getMonth(), + TD = today.getDate(); + this.table.style.visibility = "hidden"; + var year = date.getFullYear(); + if (year < this.minYear) { + year = this.minYear; + date.setFullYear(year); + } else if (year > this.maxYear) { + year = this.maxYear; + date.setFullYear(year); + } + this.firstDayOfWeek = firstDayOfWeek; + this.date = new Date(date); + var month = date.getMonth(); + var mday = date.getDate(); + var no_days = date.getMonthDays(); + + // calendar voodoo for computing the first day that would actually be + // displayed in the calendar, even if it's from the previous month. + // WARNING: this is magic. ;-) + date.setDate(1); + var day1 = (date.getDay() - this.firstDayOfWeek) % 7; + if (day1 < 0) + day1 += 7; + date.setDate(-day1); + date.setDate(date.getDate() + 1); + + var row = this.tbody.firstChild; + var MN = Calendar._SMN[month]; + var ar_days = this.ar_days = new Array(); + var weekend = Calendar._TT["WEEKEND"]; + var dates = this.multiple ? (this.datesCells = {}) : null; + for (var i = 0; i < 6; ++i, row = row.nextSibling) { + var cell = row.firstChild; + if (this.weekNumbers) { + cell.className = "day wn"; + cell.innerHTML = date.getWeekNumber(); + cell = cell.nextSibling; + } + row.className = "daysrow"; + var hasdays = false, iday, dpos = ar_days[i] = []; + for (var j = 0; j < 7; ++j, cell = cell.nextSibling, date.setDate(iday + 1)) { + iday = date.getDate(); + var wday = date.getDay(); + cell.className = "day"; + cell.pos = i << 4 | j; + dpos[j] = cell; + var current_month = (date.getMonth() == month); + if (!current_month) { + if (this.showsOtherMonths) { + cell.className += " othermonth"; + cell.otherMonth = true; + } else { + cell.className = "emptycell"; + cell.innerHTML = "&nbsp;"; + cell.disabled = true; + continue; + } + } else { + cell.otherMonth = false; + hasdays = true; + } + cell.disabled = false; + cell.innerHTML = this.getDateText ? this.getDateText(date, iday) : iday; + if (dates) + dates[date.print("%Y%m%d")] = cell; + if (this.getDateStatus) { + var status = this.getDateStatus(date, year, month, iday); + if (this.getDateToolTip) { + var toolTip = this.getDateToolTip(date, year, month, iday); + if (toolTip) + cell.title = toolTip; + } + if (status === true) { + cell.className += " disabled"; + cell.disabled = true; + } else { + if (/disabled/i.test(status)) + cell.disabled = true; + cell.className += " " + status; + } + } + if (!cell.disabled) { + cell.caldate = new Date(date); + cell.ttip = "_"; + if (!this.multiple && current_month + && iday == mday && this.hiliteToday) { + cell.className += " selected"; + this.currentDateEl = cell; + } + if (date.getFullYear() == TY && + date.getMonth() == TM && + iday == TD) { + cell.className += " today"; + cell.ttip += Calendar._TT["PART_TODAY"]; + } + if (weekend.indexOf(wday.toString()) != -1) + cell.className += cell.otherMonth ? " oweekend" : " weekend"; + } + } + if (!(hasdays || this.showsOtherMonths)) + row.className = "emptyrow"; + } + this.title.innerHTML = Calendar._MN[month] + ", " + year; + this.onSetTime(); + this.table.style.visibility = "visible"; + this._initMultipleDates(); + // PROFILE + // this.tooltips.innerHTML = "Generated in " + ((new Date()) - today) + " ms"; +}; + +Calendar.prototype._initMultipleDates = function() { + if (this.multiple) { + for (var i in this.multiple) { + var cell = this.datesCells[i]; + var d = this.multiple[i]; + if (!d) + continue; + if (cell) + cell.className += " selected"; + } + } +}; + +Calendar.prototype._toggleMultipleDate = function(date) { + if (this.multiple) { + var ds = date.print("%Y%m%d"); + var cell = this.datesCells[ds]; + if (cell) { + var d = this.multiple[ds]; + if (!d) { + Calendar.addClass(cell, "selected"); + this.multiple[ds] = date; + } else { + Calendar.removeClass(cell, "selected"); + delete this.multiple[ds]; + } + } + } +}; + +Calendar.prototype.setDateToolTipHandler = function (unaryFunction) { + this.getDateToolTip = unaryFunction; +}; + +/** + * Calls _init function above for going to a certain date (but only if the + * date is different than the currently selected one). + */ +Calendar.prototype.setDate = function (date) { + if (!date.equalsTo(this.date)) { + this._init(this.firstDayOfWeek, date); + } +}; + +/** + * Refreshes the calendar. Useful if the "disabledHandler" function is + * dynamic, meaning that the list of disabled date can change at runtime. + * Just * call this function if you think that the list of disabled dates + * should * change. + */ +Calendar.prototype.refresh = function () { + this._init(this.firstDayOfWeek, this.date); +}; + +/** Modifies the "firstDayOfWeek" parameter (pass 0 for Synday, 1 for Monday, etc.). */ +Calendar.prototype.setFirstDayOfWeek = function (firstDayOfWeek) { + this._init(firstDayOfWeek, this.date); + this._displayWeekdays(); +}; + +/** + * Allows customization of what dates are enabled. The "unaryFunction" + * parameter must be a function object that receives the date (as a JS Date + * object) and returns a boolean value. If the returned value is true then + * the passed date will be marked as disabled. + */ +Calendar.prototype.setDateStatusHandler = Calendar.prototype.setDisabledHandler = function (unaryFunction) { + this.getDateStatus = unaryFunction; +}; + +/** Customization of allowed year range for the calendar. */ +Calendar.prototype.setRange = function (a, z) { + this.minYear = a; + this.maxYear = z; +}; + +/** Calls the first user handler (selectedHandler). */ +Calendar.prototype.callHandler = function () { + if (this.onSelected) { + this.onSelected(this, this.date.print(this.dateFormat)); + } +}; + +/** Calls the second user handler (closeHandler). */ +Calendar.prototype.callCloseHandler = function () { + if (this.onClose) { + this.onClose(this); + } + this.hideShowCovered(); +}; + +/** Removes the calendar object from the DOM tree and destroys it. */ +Calendar.prototype.destroy = function () { + var el = this.element.parentNode; + el.removeChild(this.element); + Calendar._C = null; + window._dynarch_popupCalendar = null; +}; + +/** + * Moves the calendar element to a different section in the DOM tree (changes + * its parent). + */ +Calendar.prototype.reparent = function (new_parent) { + var el = this.element; + el.parentNode.removeChild(el); + new_parent.appendChild(el); +}; + +// This gets called when the user presses a mouse button anywhere in the +// document, if the calendar is shown. If the click was outside the open +// calendar this function closes it. +Calendar._checkCalendar = function(ev) { + var calendar = window._dynarch_popupCalendar; + if (!calendar) { + return false; + } + var el = Calendar.is_ie ? Calendar.getElement(ev) : Calendar.getTargetElement(ev); + for (; el != null && el != calendar.element; el = el.parentNode); + if (el == null) { + // calls closeHandler which should hide the calendar. + window._dynarch_popupCalendar.callCloseHandler(); + return Calendar.stopEvent(ev); + } +}; + +/** Shows the calendar. */ +Calendar.prototype.show = function () { + var rows = this.table.getElementsByTagName("tr"); + for (var i = rows.length; i > 0;) { + var row = rows[--i]; + Calendar.removeClass(row, "rowhilite"); + var cells = row.getElementsByTagName("td"); + for (var j = cells.length; j > 0;) { + var cell = cells[--j]; + Calendar.removeClass(cell, "hilite"); + Calendar.removeClass(cell, "active"); + } + } + this.element.style.display = "block"; + this.hidden = false; + if (this.isPopup) { + window._dynarch_popupCalendar = this; + Calendar.addEvent(document, "keydown", Calendar._keyEvent); + Calendar.addEvent(document, "keypress", Calendar._keyEvent); + Calendar.addEvent(document, "mousedown", Calendar._checkCalendar); + } + this.hideShowCovered(); +}; + +/** + * Hides the calendar. Also removes any "hilite" from the class of any TD + * element. + */ +Calendar.prototype.hide = function () { + if (this.isPopup) { + Calendar.removeEvent(document, "keydown", Calendar._keyEvent); + Calendar.removeEvent(document, "keypress", Calendar._keyEvent); + Calendar.removeEvent(document, "mousedown", Calendar._checkCalendar); + } + this.element.style.display = "none"; + this.hidden = true; + this.hideShowCovered(); +}; + +/** + * Shows the calendar at a given absolute position (beware that, depending on + * the calendar element style -- position property -- this might be relative + * to the parent's containing rectangle). + */ +Calendar.prototype.showAt = function (x, y) { + var s = this.element.style; + s.left = x + "px"; + s.top = y + "px"; + this.show(); +}; + +/** Shows the calendar near a given element. */ +Calendar.prototype.showAtElement = function (el, opts) { + var self = this; + var p = Calendar.getAbsolutePos(el); + if (!opts || typeof opts != "string") { + this.showAt(p.x, p.y + el.offsetHeight); + return true; + } + function fixPosition(box) { + if (box.x < 0) + box.x = 0; + if (box.y < 0) + box.y = 0; + var cp = document.createElement("div"); + var s = cp.style; + s.position = "absolute"; + s.right = s.bottom = s.width = s.height = "0px"; + document.body.appendChild(cp); + var br = Calendar.getAbsolutePos(cp); + document.body.removeChild(cp); + if (Calendar.is_ie) { + br.y += document.body.scrollTop; + br.x += document.body.scrollLeft; + } else { + br.y += window.scrollY; + br.x += window.scrollX; + } + var tmp = box.x + box.width - br.x; + if (tmp > 0) box.x -= tmp; + tmp = box.y + box.height - br.y; + if (tmp > 0) box.y -= tmp; + }; + this.element.style.display = "block"; + Calendar.continuation_for_the_fucking_khtml_browser = function() { + var w = self.element.offsetWidth; + var h = self.element.offsetHeight; + self.element.style.display = "none"; + var valign = opts.substr(0, 1); + var halign = "l"; + if (opts.length > 1) { + halign = opts.substr(1, 1); + } + // vertical alignment + switch (valign) { + case "T": p.y -= h; break; + case "B": p.y += el.offsetHeight; break; + case "C": p.y += (el.offsetHeight - h) / 2; break; + case "t": p.y += el.offsetHeight - h; break; + case "b": break; // already there + } + // horizontal alignment + switch (halign) { + case "L": p.x -= w; break; + case "R": p.x += el.offsetWidth; break; + case "C": p.x += (el.offsetWidth - w) / 2; break; + case "l": p.x += el.offsetWidth - w; break; + case "r": break; // already there + } + p.width = w; + p.height = h + 40; + self.monthsCombo.style.display = "none"; + fixPosition(p); + self.showAt(p.x, p.y); + }; + if (Calendar.is_khtml) + setTimeout("Calendar.continuation_for_the_fucking_khtml_browser()", 10); + else + Calendar.continuation_for_the_fucking_khtml_browser(); +}; + +/** Customizes the date format. */ +Calendar.prototype.setDateFormat = function (str) { + this.dateFormat = str; +}; + +/** Customizes the tooltip date format. */ +Calendar.prototype.setTtDateFormat = function (str) { + this.ttDateFormat = str; +}; + +/** + * Tries to identify the date represented in a string. If successful it also + * calls this.setDate which moves the calendar to the given date. + */ +Calendar.prototype.parseDate = function(str, fmt) { + if (!fmt) + fmt = this.dateFormat; + this.setDate(Date.parseDate(str, fmt)); +}; + +Calendar.prototype.hideShowCovered = function () { + if (!Calendar.is_ie && !Calendar.is_opera) + return; + function getVisib(obj){ + var value = obj.style.visibility; + if (!value) { + if (document.defaultView && typeof (document.defaultView.getComputedStyle) == "function") { // Gecko, W3C + if (!Calendar.is_khtml) + value = document.defaultView. + getComputedStyle(obj, "").getPropertyValue("visibility"); + else + value = ''; + } else if (obj.currentStyle) { // IE + value = obj.currentStyle.visibility; + } else + value = ''; + } + return value; + }; + + var tags = new Array("applet", "iframe", "select"); + var el = this.element; + + var p = Calendar.getAbsolutePos(el); + var EX1 = p.x; + var EX2 = el.offsetWidth + EX1; + var EY1 = p.y; + var EY2 = el.offsetHeight + EY1; + + for (var k = tags.length; k > 0; ) { + var ar = document.getElementsByTagName(tags[--k]); + var cc = null; + + for (var i = ar.length; i > 0;) { + cc = ar[--i]; + + p = Calendar.getAbsolutePos(cc); + var CX1 = p.x; + var CX2 = cc.offsetWidth + CX1; + var CY1 = p.y; + var CY2 = cc.offsetHeight + CY1; + + if (this.hidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) { + if (!cc.__msh_save_visibility) { + cc.__msh_save_visibility = getVisib(cc); + } + cc.style.visibility = cc.__msh_save_visibility; + } else { + if (!cc.__msh_save_visibility) { + cc.__msh_save_visibility = getVisib(cc); + } + cc.style.visibility = "hidden"; + } + } + } +}; + +/** Internal function; it displays the bar with the names of the weekday. */ +Calendar.prototype._displayWeekdays = function () { + var fdow = this.firstDayOfWeek; + var cell = this.firstdayname; + var weekend = Calendar._TT["WEEKEND"]; + for (var i = 0; i < 7; ++i) { + cell.className = "day name"; + var realday = (i + fdow) % 7; + if (i) { + cell.ttip = Calendar._TT["DAY_FIRST"].replace("%s", Calendar._DN[realday]); + cell.navtype = 100; + cell.calendar = this; + cell.fdow = realday; + Calendar._add_evs(cell); + } + if (weekend.indexOf(realday.toString()) != -1) { + Calendar.addClass(cell, "weekend"); + } + cell.innerHTML = Calendar._SDN[(i + fdow) % 7]; + cell = cell.nextSibling; + } +}; + +/** Internal function. Hides all combo boxes that might be displayed. */ +Calendar.prototype._hideCombos = function () { + this.monthsCombo.style.display = "none"; + this.yearsCombo.style.display = "none"; +}; + +/** Internal function. Starts dragging the element. */ +Calendar.prototype._dragStart = function (ev) { + if (this.dragging) { + return; + } + this.dragging = true; + var posX; + var posY; + if (Calendar.is_ie) { + posY = window.event.clientY + document.body.scrollTop; + posX = window.event.clientX + document.body.scrollLeft; + } else { + posY = ev.clientY + window.scrollY; + posX = ev.clientX + window.scrollX; + } + var st = this.element.style; + this.xOffs = posX - parseInt(st.left); + this.yOffs = posY - parseInt(st.top); + with (Calendar) { + addEvent(document, "mousemove", calDragIt); + addEvent(document, "mouseup", calDragEnd); + } +}; + +// BEGIN: DATE OBJECT PATCHES + +/** Adds the number of days array to the Date object. */ +Date._MD = new Array(31,28,31,30,31,30,31,31,30,31,30,31); + +/** Constants used for time computations */ +Date.SECOND = 1000 /* milliseconds */; +Date.MINUTE = 60 * Date.SECOND; +Date.HOUR = 60 * Date.MINUTE; +Date.DAY = 24 * Date.HOUR; +Date.WEEK = 7 * Date.DAY; + +Date.parseDate = function(str, fmt) { + var today = new Date(); + var y = 0; + var m = -1; + var d = 0; + var a = str.split(/\W+/); + var b = fmt.match(/%./g); + var i = 0, j = 0; + var hr = 0; + var min = 0; + for (i = 0; i < a.length; ++i) { + if (!a[i]) + continue; + switch (b[i]) { + case "%d": + case "%e": + d = parseInt(a[i], 10); + break; + + case "%m": + m = parseInt(a[i], 10) - 1; + break; + + case "%Y": + case "%y": + y = parseInt(a[i], 10); + (y < 100) && (y += (y > 29) ? 1900 : 2000); + break; + + case "%b": + case "%B": + for (j = 0; j < 12; ++j) { + if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { m = j; break; } + } + break; + + case "%H": + case "%I": + case "%k": + case "%l": + hr = parseInt(a[i], 10); + break; + + case "%P": + case "%p": + if (/pm/i.test(a[i]) && hr < 12) + hr += 12; + else if (/am/i.test(a[i]) && hr >= 12) + hr -= 12; + break; + + case "%M": + min = parseInt(a[i], 10); + break; + } + } + if (isNaN(y)) y = today.getFullYear(); + if (isNaN(m)) m = today.getMonth(); + if (isNaN(d)) d = today.getDate(); + if (isNaN(hr)) hr = today.getHours(); + if (isNaN(min)) min = today.getMinutes(); + if (y != 0 && m != -1 && d != 0) + return new Date(y, m, d, hr, min, 0); + y = 0; m = -1; d = 0; + for (i = 0; i < a.length; ++i) { + if (a[i].search(/[a-zA-Z]+/) != -1) { + var t = -1; + for (j = 0; j < 12; ++j) { + if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; } + } + if (t != -1) { + if (m != -1) { + d = m+1; + } + m = t; + } + } else if (parseInt(a[i], 10) <= 12 && m == -1) { + m = a[i]-1; + } else if (parseInt(a[i], 10) > 31 && y == 0) { + y = parseInt(a[i], 10); + (y < 100) && (y += (y > 29) ? 1900 : 2000); + } else if (d == 0) { + d = a[i]; + } + } + if (y == 0) + y = today.getFullYear(); + if (m != -1 && d != 0) + return new Date(y, m, d, hr, min, 0); + return today; +}; + +/** Returns the number of days in the current month */ +Date.prototype.getMonthDays = function(month) { + var year = this.getFullYear(); + if (typeof month == "undefined") { + month = this.getMonth(); + } + if (((0 == (year%4)) && ( (0 != (year%100)) || (0 == (year%400)))) && month == 1) { + return 29; + } else { + return Date._MD[month]; + } +}; + +/** Returns the number of day in the year. */ +Date.prototype.getDayOfYear = function() { + var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0); + var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0); + var time = now - then; + return Math.floor(time / Date.DAY); +}; + +/** Returns the number of the week in year, as defined in ISO 8601. */ +Date.prototype.getWeekNumber = function() { + var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0); + var DoW = d.getDay(); + d.setDate(d.getDate() - (DoW + 6) % 7 + 3); // Nearest Thu + var ms = d.valueOf(); // GMT + d.setMonth(0); + d.setDate(4); // Thu in Week 1 + return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1; +}; + +/** Checks date and time equality */ +Date.prototype.equalsTo = function(date) { + return ((this.getFullYear() == date.getFullYear()) && + (this.getMonth() == date.getMonth()) && + (this.getDate() == date.getDate()) && + (this.getHours() == date.getHours()) && + (this.getMinutes() == date.getMinutes())); +}; + +/** Set only the year, month, date parts (keep existing time) */ +Date.prototype.setDateOnly = function(date) { + var tmp = new Date(date); + this.setDate(1); + this.setFullYear(tmp.getFullYear()); + this.setMonth(tmp.getMonth()); + this.setDate(tmp.getDate()); +}; + +/** Prints the date in a string according to the given format. */ +Date.prototype.print = function (str) { + var m = this.getMonth(); + var d = this.getDate(); + var y = this.getFullYear(); + var wn = this.getWeekNumber(); + var w = this.getDay(); + var s = {}; + var hr = this.getHours(); + var pm = (hr >= 12); + var ir = (pm) ? (hr - 12) : hr; + var dy = this.getDayOfYear(); + if (ir == 0) + ir = 12; + var min = this.getMinutes(); + var sec = this.getSeconds(); + s["%a"] = Calendar._SDN[w]; // abbreviated weekday name [FIXME: I18N] + s["%A"] = Calendar._DN[w]; // full weekday name + s["%b"] = Calendar._SMN[m]; // abbreviated month name [FIXME: I18N] + s["%B"] = Calendar._MN[m]; // full month name + // FIXME: %c : preferred date and time representation for the current locale + s["%C"] = 1 + Math.floor(y / 100); // the century number + s["%d"] = (d < 10) ? ("0" + d) : d; // the day of the month (range 01 to 31) + s["%e"] = d; // the day of the month (range 1 to 31) + // FIXME: %D : american date style: %m/%d/%y + // FIXME: %E, %F, %G, %g, %h (man strftime) + s["%H"] = (hr < 10) ? ("0" + hr) : hr; // hour, range 00 to 23 (24h format) + s["%I"] = (ir < 10) ? ("0" + ir) : ir; // hour, range 01 to 12 (12h format) + s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; // day of the year (range 001 to 366) + s["%k"] = hr; // hour, range 0 to 23 (24h format) + s["%l"] = ir; // hour, range 1 to 12 (12h format) + s["%m"] = (m < 9) ? ("0" + (1+m)) : (1+m); // month, range 01 to 12 + s["%M"] = (min < 10) ? ("0" + min) : min; // minute, range 00 to 59 + s["%n"] = "\n"; // a newline character + s["%p"] = pm ? "PM" : "AM"; + s["%P"] = pm ? "pm" : "am"; + // FIXME: %r : the time in am/pm notation %I:%M:%S %p + // FIXME: %R : the time in 24-hour notation %H:%M + s["%s"] = Math.floor(this.getTime() / 1000); + s["%S"] = (sec < 10) ? ("0" + sec) : sec; // seconds, range 00 to 59 + s["%t"] = "\t"; // a tab character + // FIXME: %T : the time in 24-hour notation (%H:%M:%S) + s["%U"] = s["%W"] = s["%V"] = (wn < 10) ? ("0" + wn) : wn; + s["%u"] = w + 1; // the day of the week (range 1 to 7, 1 = MON) + s["%w"] = w; // the day of the week (range 0 to 6, 0 = SUN) + // FIXME: %x : preferred date representation for the current locale without the time + // FIXME: %X : preferred time representation for the current locale without the date + s["%y"] = ('' + y).substr(2, 2); // year without the century (range 00 to 99) + s["%Y"] = y; // year with the century + s["%%"] = "%"; // a literal '%' character + + var re = /%./g; + if (!Calendar.is_ie5 && !Calendar.is_khtml) + return str.replace(re, function (par) { return s[par] || par; }); + + var a = str.match(re); + for (var i = 0; i < a.length; i++) { + var tmp = s[a[i]]; + if (tmp) { + re = new RegExp(a[i], 'g'); + str = str.replace(re, tmp); + } + } + + return str; +}; + +Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear; +Date.prototype.setFullYear = function(y) { + var d = new Date(this); + d.__msh_oldSetFullYear(y); + if (d.getMonth() != this.getMonth()) + this.setDate(28); + this.__msh_oldSetFullYear(y); +}; + +// END: DATE OBJECT PATCHES + + +// global object that remembers the calendar +window._dynarch_popupCalendar = null; diff --git a/serverApps/src/web/menu.js b/serverApps/src/web/js/menu.js similarity index 93% rename from serverApps/src/web/menu.js rename to serverApps/src/web/js/menu.js index f2a02edc35..1b1f9c7d82 100644 --- a/serverApps/src/web/menu.js +++ b/serverApps/src/web/js/menu.js @@ -1,7 +1,7 @@ var isIE = (navigator.userAgent.indexOf("MSIE") != -1); /**************************************************************************** - * Adempiere (c) Jorg Janke - All rights reseverd + * Compiere (c) Jorg Janke - All rights reseverd * $Id: menu.js,v 1.1 2006/04/21 18:03:35 jjanke Exp $ * * Menu - show/hide sub-menues - tested in IE 6 end Mozila 1.7 diff --git a/serverApps/src/web/js/mktree.js b/serverApps/src/web/js/mktree.js new file mode 100644 index 0000000000..c3730416b1 --- /dev/null +++ b/serverApps/src/web/js/mktree.js @@ -0,0 +1,168 @@ +/** + * Copyright (c)2005-2007 Matt Kruse (javascripttoolbox.com) + * + * Dual licensed under the MIT and GPL licenses. + * This basically means you can use this code however you want for + * free, but don't claim to have written it yourself! + * Donations always accepted: http://www.JavascriptToolbox.com/donate/ + * + * Please do not link to the .js files on javascripttoolbox.com from + * your site. Copy the files locally to your server instead. + * + */ +/* +This code is inspired by and extended from Stuart Langridge's aqlist code: + http://www.kryogenix.org/code/browser/aqlists/ + Stuart Langridge, November 2002 + sil@kryogenix.org + Inspired by Aaron's labels.js (http://youngpup.net/demos/labels/) + and Dave Lindquist's menuDropDown.js (http://www.gazingus.org/dhtml/?id=109) +*/ + +// Automatically attach a listener to the window onload, to convert the trees +addEvent(window,"load",convertTrees); + +// Utility function to add an event listener +function addEvent(o,e,f){ + if (o.addEventListener){ o.addEventListener(e,f,false); return true; } + else if (o.attachEvent){ return o.attachEvent("on"+e,f); } + else { return false; } +} + +// utility function to set a global variable if it is not already set +function setDefault(name,val) { + if (typeof(window[name])=="undefined" || window[name]==null) { + window[name]=val; + } +} + +// Full expands a tree with a given ID +function expandTree(treeId) { + var ul = document.getElementById(treeId); + if (ul == null) { return false; } + expandCollapseList(ul,nodeOpenClass); +} + +// Fully collapses a tree with a given ID +function collapseTree(treeId) { + var ul = document.getElementById(treeId); + if (ul == null) { return false; } + expandCollapseList(ul,nodeClosedClass); +} + +// Expands enough nodes to expose an LI with a given ID +function expandToItem(treeId,itemId) { + var ul = document.getElementById(treeId); + if (ul == null) { return false; } + var ret = expandCollapseList(ul,nodeOpenClass,itemId); + if (ret) { + var o = document.getElementById(itemId); + if (o.scrollIntoView) { + o.scrollIntoView(false); + } + } +} + +// Performs 3 functions: +// a) Expand all nodes +// b) Collapse all nodes +// c) Expand all nodes to reach a certain ID +function expandCollapseList(ul,cName,itemId) { + if (!ul.childNodes || ul.childNodes.length==0) { return false; } + // Iterate LIs + for (var itemi=0;itemi<ul.childNodes.length;itemi++) { + var item = ul.childNodes[itemi]; + if (itemId!=null && item.id==itemId) { return true; } + if (item.nodeName == "LI") { + // Iterate things in this LI + var subLists = false; + for (var sitemi=0;sitemi<item.childNodes.length;sitemi++) { + var sitem = item.childNodes[sitemi]; + if (sitem.nodeName=="UL") { + subLists = true; + var ret = expandCollapseList(sitem,cName,itemId); + if (itemId!=null && ret) { + item.className=cName; + return true; + } + } + } + if (subLists && itemId==null) { + item.className = cName; + } + } + } +} + +// Search the document for UL elements with the correct CLASS name, then process them +function convertTrees() { + setDefault("treeClass","mktree"); + setDefault("nodeClosedClass","liClosed"); + setDefault("nodeOpenClass","liOpen"); + setDefault("nodeBulletClass","liBullet"); + setDefault("nodeLinkClass","bullet"); + setDefault("preProcessTrees",true); + if (preProcessTrees) { + if (!document.createElement) { return; } // Without createElement, we can't do anything + var uls = document.getElementsByTagName("ul"); + if (uls==null) { return; } + var uls_length = uls.length; + for (var uli=0;uli<uls_length;uli++) { + var ul=uls[uli]; + if (ul.nodeName=="UL" && ul.className==treeClass) { + processList(ul); + } + } + } +} + +function treeNodeOnclick() { + this.parentNode.className = (this.parentNode.className==nodeOpenClass) ? nodeClosedClass : nodeOpenClass; + return false; +} +function retFalse() { + return false; +} +// Process a UL tag and all its children, to convert to a tree +function processList(ul) { + if (!ul.childNodes || ul.childNodes.length==0) { return; } + // Iterate LIs + var childNodesLength = ul.childNodes.length; + for (var itemi=0;itemi<childNodesLength;itemi++) { + var item = ul.childNodes[itemi]; + if (item.nodeName == "LI") { + // Iterate things in this LI + var subLists = false; + var itemChildNodesLength = item.childNodes.length; + for (var sitemi=0;sitemi<itemChildNodesLength;sitemi++) { + var sitem = item.childNodes[sitemi]; + if (sitem.nodeName=="UL") { + subLists = true; + processList(sitem); + } + } + var s= document.createElement("SPAN"); + var t= '\u00A0'; // &nbsp; + s.className = nodeLinkClass; + if (subLists) { + // This LI has UL's in it, so it's a +/- node + if (item.className==null || item.className=="") { + item.className = nodeClosedClass; + } + // If it's just text, make the text work as the link also + if (item.firstChild.nodeName=="#text") { + t = t+item.firstChild.nodeValue; + item.removeChild(item.firstChild); + } + s.onclick = treeNodeOnclick; + } + else { + // No sublists, so it's just a bullet node + item.className = nodeBulletClass; + s.onclick = retFalse; + } + s.appendChild(document.createTextNode(t)); + item.insertBefore(s,item.firstChild); + } + } +} diff --git a/serverApps/src/web/standard.js b/serverApps/src/web/js/standard.js similarity index 95% rename from serverApps/src/web/standard.js rename to serverApps/src/web/js/standard.js index dabad7e3ee..8246691718 100644 --- a/serverApps/src/web/standard.js +++ b/serverApps/src/web/js/standard.js @@ -1,5 +1,5 @@ /**************************************************************************** - * Adempiere (c) Jorg Janke - All rights reseverd + * Compiere (c) Jorg Janke - All rights reseverd * $Id: standard.js,v 1.1 2006/04/21 18:03:35 jjanke Exp $ * * General Header Script shared by Web UI and WebStore @@ -214,6 +214,7 @@ function showLoadingWindow (base) // function showLoadingMenu(base) { + parent.resizeFrame('5,*'); var d = parent.WMenu.document; d.open(); // Content @@ -226,7 +227,7 @@ function showLoadingMenu(base) d.write('info += "</h1>"; tickNo++; setOuterHTML(getElementById(\'ticker\'), info); }'); d.write('setInterval("tick();", 1500); </script>'); // Fini - d.close(); + d.close(); return true; // follow the link } // showLoadingMenu diff --git a/serverApps/src/web/js/table.js b/serverApps/src/web/js/table.js new file mode 100644 index 0000000000..d97d49b0cb --- /dev/null +++ b/serverApps/src/web/js/table.js @@ -0,0 +1,1006 @@ +/** + * Copyright (c)2005-2007 Matt Kruse (javascripttoolbox.com) + * + * Dual licensed under the MIT and GPL licenses. + * This basically means you can use this code however you want for + * free, but don't claim to have written it yourself! + * Donations always accepted: http://www.JavascriptToolbox.com/donate/ + * + * Please do not link to the .js files on javascripttoolbox.com from + * your site. Copy the files locally to your server instead. + * + */ +/** + * Table.js + * Functions for interactive Tables + * + * Copyright (c) 2007 Matt Kruse (javascripttoolbox.com) + * Dual licensed under the MIT and GPL licenses. + * + * @version 0.981 + * + * @history 0.981 2007-03-19 Added Sort.numeric_comma, additional date parsing formats + * @history 0.980 2007-03-18 Release new BETA release pending some testing. Todo: Additional docs, examples, plus jQuery plugin. + * @history 0.959 2007-03-05 Added more "auto" functionality, couple bug fixes + * @history 0.958 2007-02-28 Added auto functionality based on class names + * @history 0.957 2007-02-21 Speed increases, more code cleanup, added Auto Sort functionality + * @history 0.956 2007-02-16 Cleaned up the code and added Auto Filter functionality. + * @history 0.950 2006-11-15 First BETA release. + * + * @todo Add more date format parsers + * @todo Add style classes to colgroup tags after sorting/filtering in case the user wants to highlight the whole column + * @todo Correct for colspans in data rows (this may slow it down) + * @todo Fix for IE losing form control values after sort? + */ + +/** + * Sort Functions + */ +var Sort = (function(){ + var sort = {}; + // Default alpha-numeric sort + // -------------------------- + sort.alphanumeric = function(a,b) { + return (a==b)?0:(a<b)?-1:1; + }; + sort['default'] = sort.alphanumeric; // IE chokes on sort.default + + // This conversion is generalized to work for either a decimal separator of , or . + sort.numeric_converter = function(separator) { + return function(val) { + if (typeof(val)=="string") { + val = parseFloat(val.replace(/^[^\d\.]*([\d., ]+).*/g,"$1").replace(new RegExp("[^\\\d"+separator+"]","g"),'').replace(/,/,'.')) || 0; + } + return val || 0; + }; + }; + + // Numeric Sort + // ------------ + sort.numeric = function(a,b) { + return sort.numeric.convert(a)-sort.numeric.convert(b); + }; + sort.numeric.convert = sort.numeric_converter("."); + + // Numeric Sort - comma decimal separator + // -------------------------------------- + sort.numeric_comma = function(a,b) { + return sort.numeric_comma.convert(a)-sort.numeric_comma.convert(b); + }; + sort.numeric_comma.convert = sort.numeric_converter(","); + + // Case-insensitive Sort + // --------------------- + sort.ignorecase = function(a,b) { + return sort.alphanumeric(sort.ignorecase.convert(a),sort.ignorecase.convert(b)); + }; + sort.ignorecase.convert = function(val) { + if (val==null) { return ""; } + return (""+val).toLowerCase(); + }; + + // Currency Sort + // ------------- + sort.currency = sort.numeric; // Just treat it as numeric! + sort.currency_comma = sort.numeric_comma; + + // Date sort + // --------- + sort.date = function(a,b) { + return sort.numeric(sort.date.convert(a),sort.date.convert(b)); + }; + // Convert 2-digit years to 4 + sort.date.fixYear=function(yr) { + yr = +yr; + if (yr<50) { yr += 2000; } + else if (yr<100) { yr += 1900; } + return yr; + }; + sort.date.formats = [ + // YY[YY]-MM-DD + { re:/(\d{2,4})-(\d{1,2})-(\d{1,2})/ , f:function(x){ return (new Date(sort.date.fixYear(x[1]),+x[2],+x[3])).getTime(); } } + // MM/DD/YY[YY] or MM-DD-YY[YY] + ,{ re:/(\d{1,2})[\/-](\d{1,2})[\/-](\d{2,4})/ , f:function(x){ return (new Date(sort.date.fixYear(x[3]),+x[1],+x[2])).getTime(); } } + // Any catch-all format that new Date() can handle. This is not reliable except for long formats, for example: 31 Jan 2000 01:23:45 GMT + ,{ re:/(.*\d{4}.*\d+:\d+\d+.*)/, f:function(x){ var d=new Date(x[1]); if(d){return d.getTime();} } } + ]; + sort.date.convert = function(val) { + var m,v, f = sort.date.formats; + for (var i=0,L=f.length; i<L; i++) { + if (m=val.match(f[i].re)) { + v=f[i].f(m); + if (typeof(v)!="undefined") { return v; } + } + } + return 9999999999999; // So non-parsed dates will be last, not first + }; + + return sort; +})(); + +/** + * The main Table namespace + */ +var Table = (function(){ + + /** + * Determine if a reference is defined + */ + function def(o) {return (typeof o!="undefined");}; + + /** + * Determine if an object or class string contains a given class. + */ + function hasClass(o,name) { + return new RegExp("(^|\\s)"+name+"(\\s|$)").test(o.className); + }; + + /** + * Add a class to an object + */ + function addClass(o,name) { + var c = o.className || ""; + if (def(c) && !hasClass(o,name)) { + o.className += (c?" ":"") + name; + } + }; + + /** + * Remove a class from an object + */ + function removeClass(o,name) { + var c = o.className || ""; + o.className = c.replace(new RegExp("(^|\\s)"+name+"(\\s|$)"),"$1"); + }; + + /** + * For classes that match a given substring, return the rest + */ + function classValue(o,prefix) { + var c = o.className; + if (c.match(new RegExp("(^|\\s)"+prefix+"([^ ]+)"))) { + return RegExp.$2; + } + return null; + }; + + /** + * Return true if an object is hidden. + * This uses the "russian doll" technique to unwrap itself to the most efficient + * function after the first pass. This avoids repeated feature detection that + * would always fall into the same block of code. + */ + function isHidden(o) { + if (window.getComputedStyle) { + var cs = window.getComputedStyle; + return (isHidden = function(o) { + return 'none'==cs(o,null).getPropertyValue('display'); + })(o); + } + else if (window.currentStyle) { + return(isHidden = function(o) { + return 'none'==o.currentStyle['display']; + })(o); + } + return (isHidden = function(o) { + return 'none'==o.style['display']; + })(o); + }; + + /** + * Get a parent element by tag name, or the original element if it is of the tag type + */ + function getParent(o,a,b) { + if (o!=null && o.nodeName) { + if (o.nodeName==a || (b && o.nodeName==b)) { + return o; + } + while (o=o.parentNode) { + if (o.nodeName && (o.nodeName==a || (b && o.nodeName==b))) { + return o; + } + } + } + return null; + }; + + /** + * Utility function to copy properties from one object to another + */ + function copy(o1,o2) { + for (var i=2;i<arguments.length; i++) { + var a = arguments[i]; + if (def(o1[a])) { + o2[a] = o1[a]; + } + } + } + + // The table object itself + var table = { + //Class names used in the code + AutoStripeClassName:"table-autostripe", + StripeClassNamePrefix:"table-stripeclass:", + + AutoSortClassName:"table-autosort", + AutoSortColumnPrefix:"table-autosort:", + AutoSortTitle:"Click to sort", + SortedAscendingClassName:"table-sorted-asc", + SortedDescendingClassName:"table-sorted-desc", + SortableClassName:"table-sortable", + SortableColumnPrefix:"table-sortable:", + NoSortClassName:"table-nosort", + + AutoFilterClassName:"table-autofilter", + FilteredClassName:"table-filtered", + FilterableClassName:"table-filterable", + FilteredRowcountPrefix:"table-filtered-rowcount:", + RowcountPrefix:"table-rowcount:", + FilterAllLabel:"Filter: All", + + AutoPageSizePrefix:"table-autopage:", + AutoPageJumpPrefix:"table-page:", + PageNumberPrefix:"table-page-number:", + PageCountPrefix:"table-page-count:" + }; + + /** + * A place to store misc table information, rather than in the table objects themselves + */ + table.tabledata = {}; + + /** + * Resolve a table given an element reference, and make sure it has a unique ID + */ + table.uniqueId=1; + table.resolve = function(o,args) { + if (o!=null && o.nodeName && o.nodeName!="TABLE") { + o = getParent(o,"TABLE"); + } + if (o==null) { return null; } + if (!o.id) { + var id = null; + do { var id = "TABLE_"+(table.uniqueId++); } + while (document.getElementById(id)!=null); + o.id = id; + } + this.tabledata[o.id] = this.tabledata[o.id] || {}; + if (args) { + copy(args,this.tabledata[o.id],"stripeclass","ignorehiddenrows","useinnertext","sorttype","col","desc","page","pagesize"); + } + return o; + }; + + + /** + * Run a function against each cell in a table header or footer, usually + * to add or remove css classes based on sorting, filtering, etc. + */ + table.processTableCells = function(t, type, func, arg) { + t = this.resolve(t); + if (t==null) { return; } + if (type!="TFOOT") { + this.processCells(t.tHead, func, arg); + } + if (type!="THEAD") { + this.processCells(t.tFoot, func, arg); + } + }; + + /** + * Internal method used to process an arbitrary collection of cells. + * Referenced by processTableCells. + * It's done this way to avoid getElementsByTagName() which would also return nested table cells. + */ + table.processCells = function(section,func,arg) { + if (section!=null) { + if (section.rows && section.rows.length && section.rows.length>0) { + var rows = section.rows; + for (var j=0,L2=rows.length; j<L2; j++) { + var row = rows[j]; + if (row.cells && row.cells.length && row.cells.length>0) { + var cells = row.cells; + for (var k=0,L3=cells.length; k<L3; k++) { + var cellsK = cells[k]; + func.call(this,cellsK,arg); + } + } + } + } + } + }; + + /** + * Get the cellIndex value for a cell. This is only needed because of a Safari + * bug that causes cellIndex to exist but always be 0. + * Rather than feature-detecting each time it is called, the function will + * re-write itself the first time it is called. + */ + table.getCellIndex = function(td) { + var tr = td.parentNode; + var cells = tr.cells; + if (cells && cells.length) { + if (cells.length>1 && cells[cells.length-1].cellIndex>0) { + // Define the new function, overwrite the one we're running now, and then run the new one + (this.getCellIndex = function(td) { + return td.cellIndex; + })(td); + } + // Safari will always go through this slower block every time. Oh well. + for (var i=0,L=cells.length; i<L; i++) { + if (tr.cells[i]==td) { + return i; + } + } + } + return 0; + }; + + /** + * A map of node names and how to convert them into their "value" for sorting, filtering, etc. + * These are put here so it is extensible. + */ + table.nodeValue = { + 'INPUT':function(node) { + if (def(node.value) && node.type && ((node.type!="checkbox" && node.type!="radio") || node.checked)) { + return node.value; + } + return ""; + }, + 'SELECT':function(node) { + if (node.selectedIndex>=0 && node.options) { + // Sort select elements by the visible text + return node.options[node.selectedIndex].text; + } + return ""; + }, + 'IMG':function(node) { + return node.name || ""; + } + }; + + /** + * Get the text value of a cell. Only use innerText if explicitly told to, because + * otherwise we want to be able to handle sorting on inputs and other types + */ + table.getCellValue = function(td,useInnerText) { + if (useInnerText && def(td.innerText)) { + return td.innerText; + } + if (!td.childNodes) { + return ""; + } + var childNodes=td.childNodes; + var ret = ""; + for (var i=0,L=childNodes.length; i<L; i++) { + var node = childNodes[i]; + var type = node.nodeType; + // In order to get realistic sort results, we need to treat some elements in a special way. + // These behaviors are defined in the nodeValue() object, keyed by node name + if (type==1) { + var nname = node.nodeName; + if (this.nodeValue[nname]) { + ret += this.nodeValue[nname](node); + } + else { + ret += this.getCellValue(node); + } + } + else if (type==3) { + if (def(node.innerText)) { + ret += node.innerText; + } + else if (def(node.nodeValue)) { + ret += node.nodeValue; + } + } + } + return ret; + }; + + /** + * Consider colspan and rowspan values in table header cells to calculate the actual cellIndex + * of a given cell. This is necessary because if the first cell in row 0 has a rowspan of 2, + * then the first cell in row 1 will have a cellIndex of 0 rather than 1, even though it really + * starts in the second column rather than the first. + * See: http://www.javascripttoolbox.com/temp/table_cellindex.html + */ + table.tableHeaderIndexes = {}; + table.getActualCellIndex = function(tableCellObj) { + if (!def(tableCellObj.cellIndex)) { return null; } + var tableObj = getParent(tableCellObj,"TABLE"); + var cellCoordinates = tableCellObj.parentNode.rowIndex+"-"+this.getCellIndex(tableCellObj); + + // If it has already been computed, return the answer from the lookup table + if (def(this.tableHeaderIndexes[tableObj.id])) { + return this.tableHeaderIndexes[tableObj.id][cellCoordinates]; + } + + var matrix = []; + this.tableHeaderIndexes[tableObj.id] = {}; + var thead = getParent(tableCellObj,"THEAD"); + var trs = thead.getElementsByTagName('TR'); + + // Loop thru every tr and every cell in the tr, building up a 2-d array "grid" that gets + // populated with an "x" for each space that a cell takes up. If the first cell is colspan + // 2, it will fill in values [0] and [1] in the first array, so that the second cell will + // find the first empty cell in the first row (which will be [2]) and know that this is + // where it sits, rather than its internal .cellIndex value of [1]. + for (var i=0; i<trs.length; i++) { + var cells = trs[i].cells; + for (var j=0; j<cells.length; j++) { + var c = cells[j]; + var rowIndex = c.parentNode.rowIndex; + var cellId = rowIndex+"-"+this.getCellIndex(c); + var rowSpan = c.rowSpan || 1; + var colSpan = c.colSpan || 1; + var firstAvailCol; + if(!def(matrix[rowIndex])) { + matrix[rowIndex] = []; + } + var m = matrix[rowIndex]; + // Find first available column in the first row + for (var k=0; k<m.length+1; k++) { + if (!def(m[k])) { + firstAvailCol = k; + break; + } + } + this.tableHeaderIndexes[tableObj.id][cellId] = firstAvailCol; + for (var k=rowIndex; k<rowIndex+rowSpan; k++) { + if(!def(matrix[k])) { + matrix[k] = []; + } + var matrixrow = matrix[k]; + for (var l=firstAvailCol; l<firstAvailCol+colSpan; l++) { + matrixrow[l] = "x"; + } + } + } + } + // Store the map so future lookups are fast. + return this.tableHeaderIndexes[tableObj.id][cellCoordinates]; + }; + + /** + * Sort all rows in each TBODY (tbodies are sorted independent of each other) + */ + table.sort = function(o,args) { + var t, tdata, sortconvert=null; + // Allow for a simple passing of sort type as second parameter + if (typeof(args)=="function") { + args={sorttype:args}; + } + args = args || {}; + + // If no col is specified, deduce it from the object sent in + if (!def(args.col)) { + args.col = this.getActualCellIndex(o) || 0; + } + // If no sort type is specified, default to the default sort + args.sorttype = args.sorttype || Sort['default']; + + // Resolve the table + t = this.resolve(o,args); + tdata = this.tabledata[t.id]; + + // If we are sorting on the same column as last time, flip the sort direction + if (def(tdata.lastcol) && tdata.lastcol==tdata.col && def(tdata.lastdesc)) { + tdata.desc = !tdata.lastdesc; + } + else { + tdata.desc = !!args.desc; + } + + // Store the last sorted column so clicking again will reverse the sort order + tdata.lastcol=tdata.col; + tdata.lastdesc=!!tdata.desc; + + // If a sort conversion function exists, pre-convert cell values and then use a plain alphanumeric sort + var sorttype = tdata.sorttype; + if (typeof(sorttype.convert)=="function") { + sortconvert=tdata.sorttype.convert; + sorttype=Sort.alphanumeric; + } + + // Loop through all THEADs and remove sorted class names, then re-add them for the col + // that is being sorted + this.processTableCells(t,"THEAD", + function(cell) { + if (hasClass(cell,this.SortableClassName)) { + removeClass(cell,this.SortedAscendingClassName); + removeClass(cell,this.SortedDescendingClassName); + // If the computed colIndex of the cell equals the sorted colIndex, flag it as sorted + if (tdata.col==table.getActualCellIndex(cell) && (classValue(cell,table.SortableClassName))) { + addClass(cell,tdata.desc?this.SortedAscendingClassName:this.SortedDescendingClassName); + } + } + } + ); + + // Sort each tbody independently + var bodies = t.tBodies; + if (bodies==null || bodies.length==0) { return; } + + // Define a new sort function to be called to consider descending or not + var newSortFunc = (tdata.desc)? + function(a,b){return sorttype(b[0],a[0]);} + :function(a,b){return sorttype(a[0],b[0]);}; + + var useinnertext=!!tdata.useinnertext; + var col = tdata.col; + + for (var i=0,L=bodies.length; i<L; i++) { + var tb = bodies[i], tbrows = tb.rows, rows = []; + + // Allow tbodies to request that they not be sorted + if(!hasClass(tb,table.NoSortClassName)) { + // Create a separate array which will store the converted values and refs to the + // actual rows. This is the array that will be sorted. + var cRow, cRowIndex=0; + if (cRow=tbrows[cRowIndex]){ + // Funky loop style because it's considerably faster in IE + do { + if (rowCells = cRow.cells) { + var cellValue = (col<rowCells.length)?this.getCellValue(rowCells[col],useinnertext):null; + if (sortconvert) cellValue = sortconvert(cellValue); + rows[cRowIndex] = [cellValue,tbrows[cRowIndex]]; + } + } while (cRow=tbrows[++cRowIndex]) + } + + // Do the actual sorting + rows.sort(newSortFunc); + + // Move the rows to the correctly sorted order. Appending an existing DOM object just moves it! + cRowIndex=0; + var displayedCount=0; + var f=[removeClass,addClass]; + if (cRow=rows[cRowIndex]){ + do { + tb.appendChild(cRow[1]); + } while (cRow=rows[++cRowIndex]) + } + } + } + + // If paging is enabled on the table, then we need to re-page because the order of rows has changed! + if (tdata.pagesize) { + this.page(t); // This will internally do the striping + } + else { + // Re-stripe if a class name was supplied + if (tdata.stripeclass) { + this.stripe(t,tdata.stripeclass,!!tdata.ignorehiddenrows); + } + } + }; + + /** + * Apply a filter to rows in a table and hide those that do not match. + */ + table.filter = function(o,filters,args) { + var cell; + args = args || {}; + + var t = this.resolve(o,args); + var tdata = this.tabledata[t.id]; + + // If new filters were passed in, apply them to the table's list of filters + if (!filters) { + // If a null or blank value was sent in for 'filters' then that means reset the table to no filters + tdata.filters = null; + } + else { + // Allow for passing a select list in as the filter, since this is common design + if (filters.nodeName=="SELECT" && filters.type=="select-one" && filters.selectedIndex>-1) { + filters={ 'filter':filters.options[filters.selectedIndex].value }; + } + // Also allow for a regular input + if (filters.nodeName=="INPUT" && filters.type=="text") { + filters={ 'filter':"/^"+filters.value+"/" }; + } + // Force filters to be an array + if (typeof(filters)=="object" && !filters.length) { + filters = [filters]; + } + + // Convert regular expression strings to RegExp objects and function strings to function objects + for (var i=0,L=filters.length; i<L; i++) { + var filter = filters[i]; + if (typeof(filter.filter)=="string") { + // If a filter string is like "/expr/" then turn it into a Regex + if (filter.filter.match(/^\/(.*)\/$/)) { + filter.filter = new RegExp(RegExp.$1); + filter.filter.regex=true; + } + // If filter string is like "function (x) { ... }" then turn it into a function + else if (filter.filter.match(/^function\s*\(([^\)]*)\)\s*\{(.*)}\s*$/)) { + filter.filter = Function(RegExp.$1,RegExp.$2); + } + } + // If some non-table object was passed in rather than a 'col' value, resolve it + // and assign it's column index to the filter if it doesn't have one. This way, + // passing in a cell reference or a select object etc instead of a table object + // will automatically set the correct column to filter. + if (filter && !def(filter.col) && (cell=getParent(o,"TD","TH"))) { + filter.col = this.getCellIndex(cell); + } + + // Apply the passed-in filters to the existing list of filters for the table, removing those that have a filter of null or "" + if ((!filter || !filter.filter) && tdata.filters) { + delete tdata.filters[filter.col]; + } + else { + tdata.filters = tdata.filters || {}; + tdata.filters[filter.col] = filter.filter; + } + } + // If no more filters are left, then make sure to empty out the filters object + for (var j in tdata.filters) { var keep = true; } + if (!keep) { + tdata.filters = null; + } + } + // Everything's been setup, so now scrape the table rows + return table.scrape(o); + }; + + /** + * "Page" a table by showing only a subset of the rows + */ + table.page = function(t,page,args) { + args = args || {}; + if (def(page)) { args.page = page; } + return table.scrape(t,args); + }; + + /** + * Jump forward or back any number of pages + */ + table.pageJump = function(t,count,args) { + t = this.resolve(t,args); + return this.page(t,(table.tabledata[t.id].page||0)+count,args); + }; + + /** + * Go to the next page of a paged table + */ + table.pageNext = function(t,args) { + return this.pageJump(t,1,args); + }; + + /** + * Go to the previous page of a paged table + */ + table.pagePrevious = function(t,args) { + return this.pageJump(t,-1,args); + }; + + /** + * Scrape a table to either hide or show each row based on filters and paging + */ + table.scrape = function(o,args) { + var col,cell,filterList,filterReset=false,filter; + var page,pagesize,pagestart,pageend; + var unfilteredrows=[],unfilteredrowcount=0,totalrows=0; + var t,tdata,row,hideRow; + args = args || {}; + + // Resolve the table object + t = this.resolve(o,args); + tdata = this.tabledata[t.id]; + + // Setup for Paging + var page = tdata.page; + if (def(page)) { + // Don't let the page go before the beginning + if (page<0) { tdata.page=page=0; } + pagesize = tdata.pagesize || 25; // 25=arbitrary default + pagestart = page*pagesize+1; + pageend = pagestart + pagesize - 1; + } + + // Scrape each row of each tbody + var bodies = t.tBodies; + + if (bodies==null || bodies.length==0) { return; } + for (var i=0,L=bodies.length; i<L; i++) { + var tb = bodies[i]; + for (var j=0,L2=tb.rows.length; j<L2; j++) { + row = tb.rows[j]; + hideRow = false; + + // Test if filters will hide the row + if (tdata.filters && row.cells) { + var cells = row.cells; + var cellsLength = cells.length; + // Test each filter + for (col in tdata.filters) { + if (!hideRow) { + filter = tdata.filters[col]; + if (filter && col<cellsLength) { + var val1 = this.getCellValue(cells[col]); + var val2 = val1.replace(/\n/g, ""); + var val = val2.replace(/^\s+|\s+$/g,""); + + if (filter.regex && val.search) { + hideRow=(val.search(filter)<0); + } + else if (typeof(filter)=="function") { + hideRow=!filter(val,cells[col]); + } + else { + hideRow = (val!=filter); + } + } + } + } + } + + // Keep track of the total rows scanned and the total runs _not_ filtered out + totalrows++; + if (!hideRow) { + unfilteredrowcount++; + if (def(page)) { + // Temporarily keep an array of unfiltered rows in case the page we're on goes past + // the last page and we need to back up. Don't want to filter again! + unfilteredrows.push(row); + if (unfilteredrowcount<pagestart || unfilteredrowcount>pageend) { + hideRow = true; + } + } + } + + row.style.display = hideRow?"none":""; + } + } + + if (def(page)) { + // Check to see if filtering has put us past the requested page index. If it has, + // then go back to the last page and show it. + if (pagestart>=unfilteredrowcount) { + pagestart = unfilteredrowcount-(unfilteredrowcount%pagesize); + tdata.page = page = pagestart/pagesize; + for (var i=pagestart,L=unfilteredrows.length; i<L; i++) { + unfilteredrows[i].style.display=""; + } + } + } + + // Loop through all THEADs and add/remove filtered class names + this.processTableCells(t,"THEAD", + function(c) { + ((tdata.filters && def(tdata.filters[table.getCellIndex(c)]) && hasClass(c,table.FilterableClassName))?addClass:removeClass)(c,table.FilteredClassName); + } + ); + + // Stripe the table if necessary + if (tdata.stripeclass) { + this.stripe(t); + } + + // Calculate some values to be returned for info and updating purposes + var pagecount = Math.floor(unfilteredrowcount/pagesize)+1; + if (def(page)) { + // Update the page number/total containers if they exist + if (tdata.container_number) { + tdata.container_number.innerHTML = page+1; + } + if (tdata.container_count) { + tdata.container_count.innerHTML = pagecount; + } + } + + // Update the row count containers if they exist + if (tdata.container_filtered_count) { + tdata.container_filtered_count.innerHTML = unfilteredrowcount; + } + if (tdata.container_all_count) { + tdata.container_all_count.innerHTML = totalrows; + } + return { 'data':tdata, 'unfilteredcount':unfilteredrowcount, 'total':totalrows, 'pagecount':pagecount, 'page':page, 'pagesize':pagesize }; + }; + + /** + * Shade alternate rows, aka Stripe the table. + */ + table.stripe = function(t,className,args) { + args = args || {}; + args.stripeclass = className; + + t = this.resolve(t,args); + var tdata = this.tabledata[t.id]; + + var bodies = t.tBodies; + if (bodies==null || bodies.length==0) { + return; + } + + className = tdata.stripeclass; + // Cache a shorter, quicker reference to either the remove or add class methods + var f=[removeClass,addClass]; + for (var i=0,L=bodies.length; i<L; i++) { + var tb = bodies[i], tbrows = tb.rows, cRowIndex=0, cRow, displayedCount=0; + if (cRow=tbrows[cRowIndex]){ + // The ignorehiddenrows test is pulled out of the loop for a slight speed increase. + // Makes a bigger difference in FF than in IE. + // In this case, speed always wins over brevity! + if (tdata.ignoreHiddenRows) { + do { + f[displayedCount++%2](cRow,className); + } while (cRow=tbrows[++cRowIndex]) + } + else { + do { + if (!isHidden(cRow)) { + f[displayedCount++%2](cRow,className); + } + } while (cRow=tbrows[++cRowIndex]) + } + } + } + }; + + /** + * Build up a list of unique values in a table column + */ + table.getUniqueColValues = function(t,col) { + var values={}, bodies = this.resolve(t).tBodies; + for (var i=0,L=bodies.length; i<L; i++) { + var tbody = bodies[i]; + for (var r=0,L2=tbody.rows.length; r<L2; r++) { + values[this.getCellValue(tbody.rows[r].cells[col])] = true; + } + } + var valArray = []; + for (var val in values) { + valArray.push(val); + } + return valArray.sort(); + }; + + /** + * Scan the document on load and add sorting, filtering, paging etc ability automatically + * based on existence of class names on the table and cells. + */ + table.auto = function(args) { + var cells = [], tables = document.getElementsByTagName("TABLE"); + var val,tdata; + if (tables!=null) { + for (var i=0,L=tables.length; i<L; i++) { + var t = table.resolve(tables[i]); + tdata = table.tabledata[t.id]; + if (val=classValue(t,table.StripeClassNamePrefix)) { + tdata.stripeclass=val; + } + // Do auto-filter if necessary + if (hasClass(t,table.AutoFilterClassName)) { + table.autofilter(t); + } + // Do auto-page if necessary + if (val = classValue(t,table.AutoPageSizePrefix)) { + table.autopage(t,{'pagesize':+val}); + } + // Do auto-sort if necessary + if ((val = classValue(t,table.AutoSortColumnPrefix)) || (hasClass(t,table.AutoSortClassName))) { + table.autosort(t,{'col':(val==null)?null:+val}); + } + // Do auto-stripe if necessary + if (tdata.stripeclass && hasClass(t,table.AutoStripeClassName)) { + table.stripe(t); + } + } + } + }; + + /** + * Add sorting functionality to a table header cell + */ + table.autosort = function(t,args) { + t = this.resolve(t,args); + var tdata = this.tabledata[t.id]; + this.processTableCells(t, "THEAD", function(c) { + var type = classValue(c,table.SortableColumnPrefix); + if (type!=null) { + type = type || "default"; + c.title =c.title || table.AutoSortTitle; + addClass(c,table.SortableClassName); + c.onclick = Function("","Table.sort(this,{'sorttype':Sort['"+type+"']})"); + // If we are going to auto sort on a column, we need to keep track of what kind of sort it will be + if (args.col!=null) { + if (args.col==table.getActualCellIndex(c)) { + tdata.sorttype=Sort['"+type+"']; + } + } + } + } ); + if (args.col!=null) { + table.sort(t,args); + } + }; + + /** + * Add paging functionality to a table + */ + table.autopage = function(t,args) { + t = this.resolve(t,args); + var tdata = this.tabledata[t.id]; + if (tdata.pagesize) { + this.processTableCells(t, "THEAD,TFOOT", function(c) { + var type = classValue(c,table.AutoPageJumpPrefix); + if (type=="next") { type = 1; } + else if (type=="previous") { type = -1; } + if (type!=null) { + c.onclick = Function("","Table.pageJump(this,"+type+")"); + } + } ); + if (val = classValue(t,table.PageNumberPrefix)) { + tdata.container_number = document.getElementById(val); + } + if (val = classValue(t,table.PageCountPrefix)) { + tdata.container_count = document.getElementById(val); + } + return table.page(t,0,args); + } + }; + + /** + * A util function to cancel bubbling of clicks on filter dropdowns + */ + table.cancelBubble = function(e) { + e = e || window.event; + if (typeof(e.stopPropagation)=="function") { e.stopPropagation(); } + if (def(e.cancelBubble)) { e.cancelBubble = true; } + }; + + /** + * Auto-filter a table + */ + table.autofilter = function(t,args) { + args = args || {}; + t = this.resolve(t,args); + var tdata = this.tabledata[t.id],val; + table.processTableCells(t, "THEAD", function(cell) { + if (hasClass(cell,table.FilterableClassName)) { + var cellIndex = table.getCellIndex(cell); + var colValues = table.getUniqueColValues(t,cellIndex); + if (colValues.length>0) { + if (typeof(args.insert)=="function") { + func.insert(cell,colValues); + } + else { + var sel = '<select onchange="Table.filter(this,this)" onclick="Table.cancelBubble(event)" class="'+table.AutoFilterClassName+'"><option value="">'+table.FilterAllLabel+'</option>'; + for (var i=0; i<colValues.length; i++) { + sel += '<option value="'+colValues[i]+'">'+colValues[i]+'</option>'; + } + sel += '</select>'; + cell.innerHTML += "<br>"+sel; + } + } + } + }); + if (val = classValue(t,table.FilteredRowcountPrefix)) { + tdata.container_filtered_count = document.getElementById(val); + } + if (val = classValue(t,table.RowcountPrefix)) { + tdata.container_all_count = document.getElementById(val); + } + }; + + /** + * Attach the auto event so it happens on load. + * use jQuery's ready() function if available + */ + if (typeof(jQuery)!="undefined") { + jQuery(table.auto); + } + else if (window.addEventListener) { + window.addEventListener( "load", table.auto, false ); + } + else if (window.attachEvent) { + window.attachEvent( "onload", table.auto ); + } + + return table; +})(); diff --git a/serverApps/src/web/js/window.js b/serverApps/src/web/js/window.js new file mode 100644 index 0000000000..b6471ff73c --- /dev/null +++ b/serverApps/src/web/js/window.js @@ -0,0 +1,361 @@ +/**************************************************************************** + * Compiere (c) Jorg Janke - All rights reseverd + * $Id: window.js,v 1.1 2006/04/21 18:03:35 jjanke Exp $ + * + * Web UI Window Utilities + ***************************************************************************/ + +/**************************************************************************** + * Text constants + */ +var deleteText = "ConfirmDelete"; + + +/**************************************************************************** + * Field Update + ***************************************************************************/ +function fieldUpdate(e) +{ + if (!top.WCmd) // no cmd frame + return; + + if (!e) e = window.event; + // alert('FieldUpdate ' + e.name + '=' + e.value); + + // update info and submit + top.WCmd.document.fieldUpdate.formName.value = e.form.name; //e.document.forms[0].name; + top.WCmd.document.fieldUpdate.fieldName.value = e.name; + top.WCmd.document.fieldUpdate.fieldValue.value = e.value; + top.WCmd.document.fieldUpdate.submit(); +} // fieldUpdate + +/** + * Create Initial Command Window + */ +function createWCmd() +{ + if (!top.WCmd) // no cmd frame + return; + // write to the command window. + var d = top.WCmd.document; + d.open(); + d.writeln('<form name="fieldUpdate" method="post" action="/adempiere/WFieldUpdate">'); + d.writeln('<input type="hidden" name="formName" value="x">'); + d.writeln('<input type="hidden" name="fieldName" value="x">'); + d.writeln('<input type="hidden" name="fieldValue" value="x">'); + d.writeln('</form>'); + d.close(); +} // createWCmd +// Execute it +createWCmd(); + + +/**************************************************************************** + * Dynamic Display + * - for form: WForm + * - changing field should have onChange="dynDisplay" to trigger evaluation + * - changed field should have document.WForm.field.displayLogic='expression' + */ +function dynDisplay() +{ + var el = document.WForm.elements; + var info = "dynDisplay:"; + // for all fields + for (var i = 0; i < el.length; i++) + { + // do we have displayLogic ? + var dLogic = el[i].displayLogic; + if (typeof dLogic == "string" && dLogic.length > 0) + { + fieldName = el[i].name; + if (evaluate(dLogic)) + { + show(fieldName+"L"); + show(fieldName+"F"); + show(fieldName+"B"); + info += " show:" + fieldName; + } + else + { + hide(fieldName+"L"); + hide(fieldName+"F"); + hide(fieldName+"B"); + info += " hide:" + fieldName; + } + } // we have displayLogic + } // for all fields + window.status = info; +} // dynDisplay + +/** + * Evaluate Display Logic + * >> |& << + */ +function evaluate (dLogic) +{ + var pos1 = dLogic.indexOf('&'); + var pos2 = dLogic.indexOf('|'); + + // only a tuple + if (pos1 == pos2) + { + return evaluateTuple(dLogic); + } + + // and: & + else if (pos1 > pos2) + { + tuples = dLogic.split('&'); + return evaluateTuple(tuples[0]) && evaluate(dLogic.substring(pos1+1)); + } + + // or: | + else + { + tuples = dLogic.split('|'); + return evaluateTuple(tuples[0]) || evaluate(dLogic.substring(pos2+1)); + } +} // evaluate + +/** + * evaluate tuple 'x = y' or x ^ y or x ! y + * >> =!^ << + */ +function evaluateTuple(myValue) +{ + // Equals + var tuples = myValue.split('='); + if (tuples.length == 2) + return getRealValue(tuples[0]) == getRealValue(tuples[1]); + // Not Equals + tuples = myValue.split('^'); + if (tuples.length == 2) + return getRealValue(tuples[0]) != getRealValue(tuples[1]); + tuples = myValue.split('!'); + if (tuples.length == 2) + return getRealValue(tuples[0]) != getRealValue(tuples[1]); + // + alert ('Error: evaluateTuple="' + myValue + '" invalid.'); + return false; +} // evaluateTuple + +/** + * get (variable) value + */ +function getRealValue (myValue) +{ + var pos1 = myValue.indexOf('@'); + var pos2 = myValue.indexOf('@', pos1+1); + + // Constant - remove blanks an '" + if (pos1 == pos2) + return myValue.replace(/['" ]/g, ""); + + // Variable + var variable = myValue.substring(pos1+1, pos2); + for (var i = 0; i < document.WForm.elements.length; i++) + { + if (document.WForm.elements[i].name == variable) + return document.WForm.elements[i].value; + } + // Nothing found + return ""; +} // getRealValue + + +/**************************************************************************** + * Open PopUp with Attachment Info + */ +function popUp(URL) { +day = new Date(); +id = day.getTime(); +eval("page" + id + " = window.open(URL, '" + id + "', 'toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=1,width=600,height=300,left = 212,top = 234');"); +} + +function startPopup (targetCmd) +{ + var url = targetCmd; + return popUp(url); +} // startPopup + +/** + * Close PopUp + */ +function closePopup () +{ + parent.document.getElementById("framesetWindow").rows="0,*"; + return true; // do submit page +} // closePopUp +/** + * Lookup - get FormName and ColumnName and submit to WLookup + */ +function startLookup (columnName, processid) +{ + var url = "WLookup?ColumnName=" + columnName+"&AD_Process_ID="+processid; + return popUp(url); +} // startLookup +/** + * Lookup - get FormName and ColumnName and submit to WLookup + */ +function startZoom (TableID, RecordID) +{ + var url = "WWindow?AD_Table_ID=" + TableID+"&AD_Record_ID="+RecordID; + parent.WWindow.location = '/adempiere/' + url; + return false; // do not submit page + +} // startZoom +/** + * Account - get FormName and ColumnName and submit to WAccount + */ +function startAccount (columnName) +{ + var url = "WAccount?ColumnName=" + columnName; + return popUp(url); +} // startAccount + +/** + * Location - get FormName and ColumnName and submit to WLocation + */ +function startLocation (columnName) +{ + var url = "WLocation?ColumnName=" + columnName; + return popUp(url); +} // startLocation + +/**************************************************************************** + * Field Updated - submit + */ +function startUpdate (column) +{ + column.form.ChangedColumn.value=column.name; + column.form.submit(); +} // startUpdate + +/**************************************************************************** + * Lookup Field Updated - submit + */ +function startLookUpdate(column, name1, value1, name2, value2) +{ + + window.close(); + opener.document.getElementById(name1).value =value1; + opener.document.getElementById(name2).value =value2; +} // startUpdate + + +/**************************************************************************** + * Process Button + */ +function startButton (processID, windowID, recordID, tableID, columnName) +{ + var url = "WProcess?AD_Process_ID=" + processID + "&AD_Window_ID="+windowID+ + "&AD_Record_ID="+recordID+"&AD_Table_ID="+tableID+"&columnName="+columnName; + return popUp(url); + +} // startButton + +/**************************************************************************** + * Process Toolbar Button + */ +function SubmitForm(pValue, pAction, pType) +{ +Form = document.forms[0]; +if (pType=='toolbar') + { + document.WForm.PCommand.value= pValue; + if (pAction == 'reset') + Form.reset(); + else if (pValue== 'Delete'){ + if(confirm('Do you want to delete the record?')){ + Form.submit(); + } + } + else + Form.submit(); + } +if (pType=='tab') + { + document.WForm.PTab.value= pValue; + Form.submit(); + } +} +/**************************************************************************** + * Process Calendar + */ + +var oldLink = null; +// code to change the active stylesheet +function setActiveStyleSheet(link, title) { + var i, a, main; + for(i=0; (a = document.getElementsByTagName("link")[i]); i++) { + if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) { + a.disabled = true; + if(a.getAttribute("title") == title) a.disabled = false; + } + } + if (oldLink) oldLink.style.fontWeight = 'normal'; + oldLink = link; + link.style.fontWeight = 'bold'; + return false; +} + +// This function gets called when the end-user clicks on some date. +function selected(cal, date) { + cal.sel.value = date; // just update the date in the input field. + if (cal.dateClicked && (cal.sel.id == "sel1" || cal.sel.id == "sel3")) + // if we add this call we close the calendar on single-click. + // just to exemplify both cases, we are using this only for the 1st + // and the 3rd field, while 2nd and 4th will still require double-click. + cal.callCloseHandler(); +} + +// And this gets called when the end-user clicks on the _selected_ date, +// or clicks on the "Close" button. It just hides the calendar without +// destroying it. +function closeHandler(cal) { + cal.hide(); // hide the calendar +// cal.destroy(); + _dynarch_popupCalendar = null; +} + +// This function shows the calendar under the element having the given id. +// It takes care of catching "mousedown" signals on document and hiding the +// calendar if the click was outside. +function showCalendar(id, format, showsTime, showsOtherMonths) { + var el = document.getElementById(id); + if (_dynarch_popupCalendar != null) { + // we already have some calendar created + _dynarch_popupCalendar.hide(); // so we hide it first. + } else { + // first-time call, create the calendar. + var cal = new Calendar(1, null, selected, closeHandler); + // uncomment the following line to hide the week numbers + // cal.weekNumbers = false; + + if (typeof showsTime == "string") { + cal.showsTime = true; + cal.time24 = (showsTime == "24"); + } + if (showsOtherMonths) { + cal.showsOtherMonths = true; + } + _dynarch_popupCalendar = cal; // remember it in the global var + cal.setRange(1900, 2070); // min/max year allowed. + cal.create(); + } + _dynarch_popupCalendar.setDateFormat(format); // set the specified date format + _dynarch_popupCalendar.parseDate(el.value); // try to parse the text in field + _dynarch_popupCalendar.sel = el; // inform it what input field we use + + // the reference element that we pass to showAtElement is the button that + // triggers the calendar. In this example we align the calendar bottom-right + // to the button. + _dynarch_popupCalendar.showAtElement(el, "Br"); // show the calendar + + return false; +} + +var MINUTE = 60 * 1000; +var HOUR = 60 * MINUTE; +var DAY = 24 * HOUR; +var WEEK = 7 * DAY; \ No newline at end of file diff --git a/serverApps/src/web/lang/calendar-en.js b/serverApps/src/web/lang/calendar-en.js new file mode 100644 index 0000000000..0dbde793d8 --- /dev/null +++ b/serverApps/src/web/lang/calendar-en.js @@ -0,0 +1,127 @@ +// ** I18N + +// Calendar EN language +// Author: Mihai Bazon, <mihai_bazon@yahoo.com> +// Encoding: any +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday"); + +// Please note that the following array of short day names (and the same goes +// for short month names, _SMN) isn't absolutely necessary. We give it here +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun"); + +// First day of the week. "0" means display Sunday first, "1" means display +// Monday first, etc. +Calendar._FD = 0; + +// full month names +Calendar._MN = new Array +("January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December"); + +// short month names +Calendar._SMN = new Array +("Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "About the calendar"; + +Calendar._TT["ABOUT"] = +"DHTML Date/Time Selector\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"For latest version visit: http://www.dynarch.com/projects/calendar/\n" + +"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." + +"\n\n" + +"Date selection:\n" + +"- Use the \xab, \xbb buttons to select year\n" + +"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" + +"- Hold mouse button on any of the above buttons for faster selection."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Time selection:\n" + +"- Click on any of the time parts to increase it\n" + +"- or Shift-click to decrease it\n" + +"- or click and drag for faster selection."; + +Calendar._TT["PREV_YEAR"] = "Prev. year (hold for menu)"; +Calendar._TT["PREV_MONTH"] = "Prev. month (hold for menu)"; +Calendar._TT["GO_TODAY"] = "Go Today"; +Calendar._TT["NEXT_MONTH"] = "Next month (hold for menu)"; +Calendar._TT["NEXT_YEAR"] = "Next year (hold for menu)"; +Calendar._TT["SEL_DATE"] = "Select date"; +Calendar._TT["DRAG_TO_MOVE"] = "Drag to move"; +Calendar._TT["PART_TODAY"] = " (today)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "Display %s first"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Close"; +Calendar._TT["TODAY"] = "Today"; +Calendar._TT["TIME_PART"] = "(Shift-)Click or drag to change value"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; + +Calendar._TT["WK"] = "wk"; +Calendar._TT["TIME"] = "Time:"; diff --git a/serverApps/src/web/menu.html b/serverApps/src/web/menu.html index 2ba1ae9ecc..585e8648d5 100644 --- a/serverApps/src/web/menu.html +++ b/serverApps/src/web/menu.html @@ -3,8 +3,8 @@ <title>Menu</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <base target="WWindow"> -<link href="standard.css" rel="stylesheet" type="text/css"> -<link href="menu.css" rel="stylesheet" type="text/css"> +<link href="/css/standard.css" rel="stylesheet" type="text/css"> +<link href="/css/menu.css" rel="stylesheet" type="text/css"> </head> <body> </body> diff --git a/serverApps/src/web/popup.css b/serverApps/src/web/popup.css deleted file mode 100644 index 759eaf3e9b..0000000000 --- a/serverApps/src/web/popup.css +++ /dev/null @@ -1,35 +0,0 @@ -/* Adempiere HTML UI (c) Jorg Janke */ -/* $Id: popup.css,v 1.1 2006/04/21 18:03:35 jjanke Exp $ */ - -body { - background-color: #fbf8f1; - color: #000000; -} - -.Cerror{ - background: #dcf1cb; -} - -.Cmandatory{ - background: #e9eef5; -} - -.popupTable { - border-left: none; - border-right: none; - margin: 0px; - padding: 2px; -} - -.popupHeader { - border-top: none; -} - -.popupCenter { - border-bottom: 1px solid #000000; - border-top: 1px solid #000000; -} - -.popupFooter { - border-bottom: none; -} diff --git a/serverApps/src/web/popup.html b/serverApps/src/web/popup.html index 19fb626619..ecd97c2f7a 100644 --- a/serverApps/src/web/popup.html +++ b/serverApps/src/web/popup.html @@ -2,7 +2,7 @@ <title>Popup</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <base target="window"> -<link href="standard.css" rel="stylesheet" type="text/css"> +<link href="/css/standard.css" rel="stylesheet" type="text/css"> </head> <body> </body> diff --git a/serverApps/src/web/window.css b/serverApps/src/web/window.css deleted file mode 100644 index 6561fe1e73..0000000000 --- a/serverApps/src/web/window.css +++ /dev/null @@ -1,76 +0,0 @@ -/* Adempiere HTML UI (c) Jorg Janke */ -/* $Id: window.css,v 1.1 2006/04/21 18:03:35 jjanke Exp $ */ - - -body { - /* Manu #F4FCFF; */ - background-color: #fbf8f1; - color: #000000; - font-size: 12px; -} - -big { - cursor: pointer; /* used for tab */ -} - -td { - font-size: 12px; -} - -.Cerror { - background: #dcf1cb; -} - -.Cmandatory { - background: #e9eef5; -} - -#imgButton { - border-style: outset; -} - -#imgButtonPressed { - border-style: inset; -} - -#tab { - background: #E6E6FA; /* Window Tabs */ - border-style: outset; - color: #0000CC; - cursor: pointer; - margin-right: 5px; - margin-top: 20px; - padding-left: 5px; - padding-right: 5px; -} - -#tabSelected { - background: #E6E6FA; /* Selected Window Tabs */ - border-style: inset; - color: #000066; - cursor: pointer; - margin-right: 5px; - margin-top: 20px; - padding-left: 5px; - padding-right: 5px; -} - -.windowTable { - margin: 0px; - padding: 2px; - border-left: none; - border-right: none; -} - -.windowHeader { - border-top: none; -} - -.windowCenter { - border-bottom: 1px solid #000000; - border-top: 1px solid #000000; -} - -.windowFooter { - border-bottom: none; -} diff --git a/serverApps/src/web/window.html b/serverApps/src/web/window.html index d5f57894d9..5f95d46d60 100644 --- a/serverApps/src/web/window.html +++ b/serverApps/src/web/window.html @@ -1,9 +1,9 @@ <html> <head> -<title>Adempiere Window - Performs compliance test</title> +<title>Compiere Window - Performs compliance test</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<link href="standard.css" rel="stylesheet" type="text/css"> -<link href="window.css" rel="stylesheet" type="text/css"> +<link href="/css/standard.css" rel="stylesheet" type="text/css"> +<link href="/css/window.css" rel="stylesheet" type="text/css"> </head> <body> <p><img src="Logo.gif"></p> diff --git a/serverApps/src/web/window.js b/serverApps/src/web/window.js deleted file mode 100644 index 7ced822ed0..0000000000 --- a/serverApps/src/web/window.js +++ /dev/null @@ -1,232 +0,0 @@ -/**************************************************************************** - * Adempiere (c) Jorg Janke - All rights reseverd - * $Id: window.js,v 1.1 2006/04/21 18:03:35 jjanke Exp $ - * - * Web UI Window Utilities - ***************************************************************************/ - -/**************************************************************************** - * Text constants - */ -var deleteText = "ConfirmDelete"; - - -/**************************************************************************** - * Field Update - ***************************************************************************/ -function fieldUpdate(e) -{ - if (!top.WCmd) // no cmd frame - return; - - if (!e) e = window.event; - // alert('FieldUpdate ' + e.name + '=' + e.value); - - // update info and submit - top.WCmd.document.fieldUpdate.formName.value = e.form.name; //e.document.forms[0].name; - top.WCmd.document.fieldUpdate.fieldName.value = e.name; - top.WCmd.document.fieldUpdate.fieldValue.value = e.value; - top.WCmd.document.fieldUpdate.submit(); -} // fieldUpdate - -/** - * Create Initial Command Window - */ -function createWCmd() -{ - if (!top.WCmd) // no cmd frame - return; - // write to the command window. - var d = top.WCmd.document; - d.open(); - d.writeln('<form name="fieldUpdate" method="post" action="/adempiere/WFieldUpdate">'); - d.writeln('<input type="hidden" name="formName" value="x">'); - d.writeln('<input type="hidden" name="fieldName" value="x">'); - d.writeln('<input type="hidden" name="fieldValue" value="x">'); - d.writeln('</form>'); - d.close(); -} // createWCmd -// Execute it -createWCmd(); - - -/**************************************************************************** - * Dynamic Display - * - for form: WForm - * - changing field should have onChange="dynDisplay" to trigger evaluation - * - changed field should have document.WForm.field.displayLogic='expression' - */ -function dynDisplay() -{ - var el = document.WForm.elements; - var info = "dynDisplay:"; - // for all fields - for (var i = 0; i < el.length; i++) - { - // do we have displayLogic ? - var dLogic = el[i].displayLogic; - if (typeof dLogic == "string" && dLogic.length > 0) - { - fieldName = el[i].name; - if (evaluate(dLogic)) - { - show(fieldName+"L"); - show(fieldName+"F"); - show(fieldName+"B"); - info += " show:" + fieldName; - } - else - { - hide(fieldName+"L"); - hide(fieldName+"F"); - hide(fieldName+"B"); - info += " hide:" + fieldName; - } - } // we have displayLogic - } // for all fields - window.status = info; -} // dynDisplay - -/** - * Evaluate Display Logic - * >> |& << - */ -function evaluate (dLogic) -{ - var pos1 = dLogic.indexOf('&'); - var pos2 = dLogic.indexOf('|'); - - // only a tuple - if (pos1 == pos2) - { - return evaluateTuple(dLogic); - } - - // and: & - else if (pos1 > pos2) - { - tuples = dLogic.split('&'); - return evaluateTuple(tuples[0]) && evaluate(dLogic.substring(pos1+1)); - } - - // or: | - else - { - tuples = dLogic.split('|'); - return evaluateTuple(tuples[0]) || evaluate(dLogic.substring(pos2+1)); - } -} // evaluate - -/** - * evaluate tuple 'x = y' or x ^ y or x ! y - * >> =!^ << - */ -function evaluateTuple(myValue) -{ - // Equals - var tuples = myValue.split('='); - if (tuples.length == 2) - return getRealValue(tuples[0]) == getRealValue(tuples[1]); - // Not Equals - tuples = myValue.split('^'); - if (tuples.length == 2) - return getRealValue(tuples[0]) != getRealValue(tuples[1]); - tuples = myValue.split('!'); - if (tuples.length == 2) - return getRealValue(tuples[0]) != getRealValue(tuples[1]); - // - alert ('Error: evaluateTuple="' + myValue + '" invalid.'); - return false; -} // evaluateTuple - -/** - * get (variable) value - */ -function getRealValue (myValue) -{ - var pos1 = myValue.indexOf('@'); - var pos2 = myValue.indexOf('@', pos1+1); - - // Constant - remove blanks an '" - if (pos1 == pos2) - return myValue.replace(/['" ]/g, ""); - - // Variable - var variable = myValue.substring(pos1+1, pos2); - for (var i = 0; i < document.WForm.elements.length; i++) - { - if (document.WForm.elements[i].name == variable) - return document.WForm.elements[i].value; - } - // Nothing found - return ""; -} // getRealValue - - -/**************************************************************************** - * Open PopUp with Attachment Info - */ -function startPopup (targetCmd) -{ - parent.document.getElementById("framesetWindow").rows="300,*"; - parent.WPopUp.location = '/adempiere/' + targetCmd; - return false; // do not submit page -} // startPopup - -/** - * Close PopUp - */ -function closePopup () -{ - parent.document.getElementById("framesetWindow").rows="0,*"; - return true; // do submit page -} // closePopUp - -/** - * Lookup - get FormName and ColumnName and submit to WLookup - */ -function startLookup (columnName) -{ - var url = "WLookup?ColumnName=" + columnName; -// alert (url); - return startPopup(url); -} // startLookup - -/** - * Account - get FormName and ColumnName and submit to WAccount - */ -function startAccount (columnName) -{ - var url = "WAccount?ColumnName=" + columnName; -// alert (url); - return startPopup(url); -} // startAccount - -/** - * Location - get FormName and ColumnName and submit to WLocation - */ -function startLocation (columnName) -{ - var url = "WLocation?ColumnName=" + columnName; -// alert (url); - return startPopup(url); -} // startLocation - - -/**************************************************************************** - * Field Updated - submit - */ -function startUpdate (column) -{ - column.form.ChangedColumn.value=column.name; - column.form.submit(); -} // startUpdate - -/**************************************************************************** - * Process Button - */ -function startButton (column) -{ - column.form.ChangedColumn.value=column.name; - column.form.submit(); -} // startButton diff --git a/serverApps/src/web/window_files/colorschememapping.xml b/serverApps/src/web/window_files/colorschememapping.xml new file mode 100644 index 0000000000..b200daa38c --- /dev/null +++ b/serverApps/src/web/window_files/colorschememapping.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<a:clrMap xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" bg1="lt1" tx1="dk1" bg2="lt2" tx2="dk2" accent1="accent1" accent2="accent2" accent3="accent3" accent4="accent4" accent5="accent5" accent6="accent6" hlink="hlink" folHlink="folHlink"/> \ No newline at end of file diff --git a/serverApps/src/web/window_files/filelist.xml b/serverApps/src/web/window_files/filelist.xml new file mode 100644 index 0000000000..b9e1fd1f11 --- /dev/null +++ b/serverApps/src/web/window_files/filelist.xml @@ -0,0 +1,6 @@ +<xml xmlns:o="urn:schemas-microsoft-com:office:office"> + <o:MainFile HRef="../window.html"/> + <o:File HRef="themedata.thmx"/> + <o:File HRef="colorschememapping.xml"/> + <o:File HRef="filelist.xml"/> +</xml> \ No newline at end of file diff --git a/serverApps/src/web/window_files/themedata.thmx b/serverApps/src/web/window_files/themedata.thmx new file mode 100644 index 0000000000000000000000000000000000000000..55426d8ec49dad686011cc06b7f893ca0b452780 GIT binary patch literal 3081 zcmaKu2{hDu8^<U6PPW8QvW=a{Qb{tdb(n0CCEH+J`z}WIWn9<Dl4U}Jtb>vzV;eNc zHi#Li>_U`MmXLS4_dRc2Z}0p6o!|05zu)sc&-0w;oaX~Iq^98p&;b|#0Dv$c2HDE> zm2v`70RUW--A3ETI}qj_c*{J@7ZzYA7wY9%oj%~vt-ztP6aOui*huzo0hN-6G5R40 znK5?0#YeIpX>rPo{WBr!&CnJG*+3Bvr{Uaii<-2BA~wE^E%Q|id-r%3#6o%1=l%DR zIFghilsZ<T`ZHsOJ&AN<={>iCWbQ-r)dKa)d>Ni;A|<crMZ@3-VDu9IC9clMtBK2v zp!a`#>Cr=f>>&p2Nil;-MYm)7<Q0&;bw!)|dn}?+Im}j7y-JQZF=HHEvodvH1$vLj z6{VTRVW)+SNN)I**i+;o8l?_fhcB9I@^9&E$n4dPx~ucHcY1^mWv5Mlm&*wF_5z2J z<CDAB^u%$w1FLxg0603L20;Ijs?y1_x1E#}sZeg2Df=ydm}h{z-1jvuZG@5{mc$S7 zZLy<>>to$~V!`sIC~f&-1Yizy$NikZw7|P*lU_O|979~mhn)(IZ#5}<bD3|?^5#|2 zb<b;S4!F++YjoU+>5nfd6JxLm^-U-apKiF-3LP!JJftX4s@JHH#mSyDWzuR|bIoP6 zpJU8GXIj}w^iEm2-!0OaoPyJ{Dn{d9cuh&F4mD}z{YUlP3WEhE_&c>SOFA^(s+mUc zMW+Yl@(X5dsB&243n5}d^WNm)F9ZEOESoo$5+IT?fs`5O4)cP^|Fl9Jy&c_P{@;s( zWe~#DeU{_u9O6L;YD(1^2hwqRJWzw%256)CwR(%j3a3d+3$d!hGu#vThOE{yXnIy8 zY)CGtX){8mOrZRw9`Kor=Ugw(@@gnw|C3a%8U4P1>j;qvR6Mrf_1Vb==?UQvGOz8Q zih5|I=-yZv-;tcxc_%H-M5Xp?=d&BI^VxI&08{_~;Qf{Jir?K{w>I&aR^jeoCx@I3 z^l_F5=BE!rk{{*ELIire6NTW(*<>i@>X<%4;N?QpiS8E1L>{tNqN7bTFS&GIdFrC4 zAhEVi*Yxf)EBm`DWF+>ADCge7{*lm`iYn6kUKT-4VM&vh_J{sM+M*xBu4dG2ycXJ) z$A;-ip=okH#yx41On=jmx-)}Ak}SYZF%F1xB){pDOas!r>=O2FEBj?heFyJBoj-V5 zk-m}~y9_G?Pxw<y8#|;T<Z|XLU*8-4v<ed<G~=_1|GWlWZSvjQoo-G=`dn`Dcslx^ zRFv5ij7rdHay!bTGc94U{S!yGDIPpsm0Q^K#4m`k)-5IHW?kcx8lT9i7EdkTI?qs~ zuekztM*u5rLyMqx@DL)s`_j^OTWbVR_aXM7W%l`@-|k@F^ux2SZu=DkH%(Swu#HIm z_8dKkH7*<Xggv&x(7Buu2-t0S>ERqOg%?0QQ+>OcI_%nnTbpI=o4@gP^H3T)k&vQV zlr*~Nz=jok`N8c4b6-yVhQTg>C&}Y<L_&-^2xC~!w*{6(Ht@|XVAuhyE>@#76>tLr zIT7@JK2#Jm$+CG7UwZn|;=ohkA!hwsMDvC=b~BdKip4u?dporSnmWDg1%jHptGjdE z3-p>duMJmvq2rb;<U0=6M|#f`YZgRqeHuMA5o%31`r0kgac~fJfn&@~d^knE@L+qr zKc)7{;UP|!XA=^w3)@8zz?l3+hK(&gZY4`UF$odBcAjpA@lVJh(M&abo+0gF0TTFm zNYXVo1gL(or(ss`#8NR+D8hf_WGF{+GKL2of+3%H?>~Ie*8HZU?v_+;n3{f<$Fh?t zVZ%AX>KQJDtGA;~pD9R*-B9<VHyEh6!)MIRrhkolEZ`st#kBF>bd4Nz?`w?V70VSl z9YG^$$oUcxi9FYoMmS4kuH`Drw_wluaQYy%s<GQCz!tqera`H=Gn~sgA1@YwfH%^C z^Ep|pk<?Y?27P$*U6`$j)MlU_pKe=}o^``=HUMF0JcEZml6u`f@bFOzH&V!av^82? zUZiPPOSQ}IX1pL#RLWTsMbClZ+wilXomuiuSP9vrHs)>FXA}DqXHrYo1Yb!~X6DdP zI{ES*wDLX^aD4H@bH!q4niq?$t$G60?)<x6p7bw`yz>xpM&)_Oeej-L+$HNkoGs1g zjoPO+p?B9$GHmUozP0N|-0*KZis-k?9C4F<QvZ?(c4LRNQBp<LzqL+V$c#Ye@w|@} zp69~24<;sRwGE@$^!=O+L_!DGT4I@LRend!u8CA)wBpR%>)sWJb3Xqg5On>y7;t^i zSIjFlQQU6I+0pC_pQi@OYU5KUTkXo+fh`oJh=aJZ6{;8WKxV54Eo)rBS{o!sOVYLb zxi+tpTn+AbW1*)b)N1)zcqilNXtbuOEbZgBp1QKqa}DYhZFujzc_m9=KDB!8^jwt7 zm9g6+`{mx~%wFVE#wc>dX8M)I`%Vp<P1)l6bgzczOU~m6RKZVo-t-uT(Tuc~Y;A)t zJ}yC{Wwdm?YA0;HZ};`Wrv<umd4(3ZTjhdA60I3dX}5E#teZewGnSNm8vUQW5-sn( z5Z|zm?lKnCi#NBi`b|Z7(43b_W)xk0FaS|_rz7bga(JP{$~x9zmsA3{)KVk1p!m^Z zYO3_4*QNcuEYmC3!7P|rhEy_m-PyN;&4MUV#91S5q(hYVO?!y-diZJ{EoQg3{d{&^ z%@rP3?_Xu6JmSKv8fM$)@Wx<1+B@s9z|wFnQh$%xv=m4<QnL6QNu^3F9lagJPHLtS zxnJv*#?0eaehm&jY>y(~U$7<dHmAhH8KjzxRE}uXUmST2Tl0%!=Q_)_;Yl>{hk80O zC=HOI_*Y|L%aLt4!@ICJBXCwvRs~Nun2k|jjla2aCzxG_W9?y{3#@b2m{7Q103(84 zK#bLA(EO(BZ7THNR)>4Vl|W0Aj^o6|ZFz7t*<#~%{pFeP0pv=ub^b(OJylLtV~l0? zcCBQWdecptN6X6g-pgIlr`}#jz+;3B=Gy63HS3P9&nfN0uKAQ}x3f3!;1lT}EM0V% zuXnvJqvTM*zBH*Bf=}=z`qtyF*o?-T?bf$^%WO6^96e>HtPc>z&ZmZQ2ZsBfr6>ox zI`&Qmdp@YZ*GrgjClL0u2x^3gF{wL2^Tpw_E3(Zqg$iO21-z<Q^n)+JoXb&*O~9eC z)DB9Y`fuJ~9Yqy3Qf>q&O<LkuC;OW{{%XlTHRFG?2!yFifje#|CWOJqXS{_YUHo+t z5&MEVZt()Eil*rG^$pe<83wsT$M#$}?%w@=F6Z-a6x}QN87{77`Q_ogn%DolYRYSz zJax&X&LQScAJq*Ww{$}gL|oJqB&V3;&n97zfhHo&_o8aliqk9?&lNw^>cbKBc7hN^ zAM;N{JQHnm;s~DroX&>k9n~MI@h7{<pW(Ipc3mrADxMaEAq>un<X0NeJhy3S>6!UY z=qIRT0soszDbIfTenF{F!+#1Kr?nr}(v*Du#BRq8kJHZ&Lv9Kq|3pE56VXrUKdy8f uMSdua{z~aDFgdPqya;}1<TL)$oBvZ1P(xY@5di?Slwn7SKAY+L-@gDBi%oL? literal 0 HcmV?d00001 diff --git a/serverApps/src/web/wstore.js b/serverApps/src/web/wstore.js index 0142b6c654..37314fc26c 100644 --- a/serverApps/src/web/wstore.js +++ b/serverApps/src/web/wstore.js @@ -1,5 +1,5 @@ /**************************************************************************** - * Adempiere (c) Jorg Janke - All rights reseverd + * Compiere (c) Jorg Janke - All rights reseverd * $Id: wstore.js,v 1.5 2006/05/23 22:39:03 mdeaelfweald Exp $ * * Web Store Scripts